ZGlmZiAtLWdpdCBhL01ha2VmaWxlLmFtIGIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M0ZDVjNwotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzcgQEAKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYmpwZWcubGEKKworSERSUyA9IGpjaHVmZi5oIGpkY3QuaCBqZGh1ZmYuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKKwlqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmgganNpbWQuaCBqc2ltZGRjdC5oCisKK2xpYmpwZWdfbGFfU09VUkNFUyA9ICQoSERSUykgamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIFwKKwlqY2RjdG1nci5jIGpjaHVmZi5jIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIFwKKwlqY29tYXBpLmMgamNwYXJhbS5jIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIFwKKwlqZGFwaW1pbi5jIGpkYXBpc3RkLmMgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIFwKKwlqZGRjdG1nci5jIGpkaHVmZi5jIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBcCisJamRtZXJnZS5jIGpkcGh1ZmYuYyBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIFwKKwlqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBcCisJamlkY3RyZWQuYyBqcXVhbnQxLmMganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYyBqbWVtbm9icy5jIFwKKwlqc2ltZC5jCisKK2lmIFdJVEhfU0lNRAorCitCVUlMVF9TT1VSQ0VTID0gc2ltZC9qc2ltZGNmZy5pbmMKKworRVhUUkFfRElTVCA9IG5hc21fbHQuc2gKKworbGlianBlZ19sYV9TT1VSQ0VTICs9IHNpbWQvanNpbWQuaCBzaW1kL2pzaW1kY2ZnLmluYy5oIFwKKwlzaW1kL2pzaW1kZXh0LmluYyBzaW1kL2pjb2xzYW1wLmluYyBzaW1kL2pkY3QuaW5jIFwKKwlzaW1kL2pzaW1kY3B1LmFzbSBcCisJc2ltZC9qY2NvbG1teC5hc20gc2ltZC9qZGNvbG1teC5hc20gXAorCXNpbWQvamNzYW1tbXguYXNtIHNpbWQvamRzYW1tbXguYXNtIHNpbWQvamRtZXJtbXguYXNtIFwKKwlzaW1kL2pjcW50bW14LmFzbSBzaW1kL2pmbW14ZnN0LmFzbSBzaW1kL2pmbW14aW50LmFzbSBcCisJc2ltZC9qaW1teHJlZC5hc20gc2ltZC9qaW1teGludC5hc20gc2ltZC9qaW1teGZzdC5hc20KKworZW5kaWYKKworLmFzbS5sbzoKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlIC0tdGFnIE5BU00gLi9uYXNtX2x0LnNoICQoTkFTTSkgJChOQUZMQUdTKSAkPCAtbyAkQAorCitzaW1kL2pzaW1kY2ZnLmluYzogc2ltZC9qc2ltZGNmZy5pbmMuaCBqcGVnbGliLmggamNvbmZpZy5oIGptb3JlY2ZnLmgKKwkkKENQUCkgJDwgfCBncmVwIF5bXDslXSB8IHNlZCAncyVfY3BwX3Byb3RlY3Rpb25fJSUnID4gJEAKKwpkaWZmIC0tZ2l0IGEvUkVBRE1FX1RpZ2VyVk5DLnR4dCBiL1JFQURNRV9UaWdlclZOQy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczMDcwYQotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRV9UaWdlclZOQy50eHQKQEAgLTAsMCArMSw1IEBACitUaGlzIGRpcmVjdG9yeSBpbmNsdWRlcyBhIGNvcHkgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBKUEVHCitsaWJyYXJ5IChzZWUgdGhlIFJFQURNRSBmaWxlIGZvciBtb3JlIGluZm9ybWF0aW9uKS4gTm90IGFsbCB0aGUgZmlsZXMKK2Zyb20gdGhlIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbiBoYXZlIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgVGlnZXJWTkMKK2NvZGViYXNlLiBUbyBvYnRhaW4gdGhlIG9yaWdpbmFsIGxpYnJhcnksIHBsZWFzZSBzZWUgdGhlIFJFQURNRSBmaWxlLAorc2VjdGlvbiAiQVJDSElWRSBMT0NBVElPTlMiLgpkaWZmIC0tZ2l0IGEvYWNpbmNsdWRlLm00IGIvYWNpbmNsdWRlLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNTA3OTkKLS0tIC9kZXYvbnVsbAorKysgYi9hY2luY2x1ZGUubTQKQEAgLTAsMCArMSw5OSBAQAorIyBBQ19QUk9HX05BU00KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgdGhhdCBOQVNNIGV4aXN0cyBhbmQgZGV0ZXJtaW5lIGZsYWdzCitBQ19ERUZVTihbQUNfUFJPR19OQVNNXSxbCisKK0FDX0NIRUNLX1BST0dTKE5BU00sIFtuYXNtIG5hc213XSkKK3Rlc3QgLXogIiROQVNNIiAmJiBBQ19NU0dfRVJST1IoW25vIG5hc20gKE5ldHdpZGUgQXNzZW1ibGVyKSBmb3VuZF0pCisKK0FDX01TR19DSEVDS0lORyhbZm9yIG9iamVjdCBmaWxlIGZvcm1hdCBvZiBob3N0IHN5c3RlbV0pCitjYXNlICIkaG9zdF9vcyIgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgaW50ZXJpeCopCisgICAgb2JqZm10PSdXaW4zMi1DT0ZGJworICA7OworICBtc2Rvc2RqZ3BwKiB8IGdvMzIqKQorICAgIG9iamZtdD0nQ09GRicKKyAgOzsKKyAgb3MyLWVteCopCQkJIyBub3QgdGVzdGVkCisgICAgb2JqZm10PSdNU09NRicJCSMgb2JqCisgIDs7CisgIGxpbnV4KmNvZmYqIHwgbGludXgqb2xkbGQqKQorICAgIG9iamZtdD0nQ09GRicJCSMgPz8/CisgIDs7CisgIGxpbnV4KmFvdXQqKQorICAgIG9iamZtdD0nYS5vdXQnCisgIDs7CisgIGxpbnV4KikKKyAgICBvYmpmbXQ9J0VMRicKKyAgOzsKKyAgZnJlZWJzZCogfCBuZXRic2QqIHwgb3BlbmJzZCopCisgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIG9iamZtdD0nQlNELWEub3V0JworICAgIGVsc2UKKyAgICAgIG9iamZtdD0nRUxGJworICAgIGZpCisgIDs7CisgIHNvbGFyaXMqIHwgc3Vub3MqIHwgc3lzdiogfCBzY28qKQorICAgIG9iamZtdD0nRUxGJworICA7OworICBkYXJ3aW4qIHwgcmhhcHNvZHkqIHwgbmV4dHN0ZXAqIHwgb3BlbnN0ZXAqIHwgbWFjb3MqKQorICAgIG9iamZtdD0nTWFjaC1PJworICA7OworICAqKQorICAgIG9iamZtdD0nRUxGID8nCisgIDs7Citlc2FjCisKK0FDX01TR19SRVNVTFQoWyRvYmpmbXRdKQoraWYgdGVzdCAiJG9iamZtdCIgPSAnRUxGID8nOyB0aGVuCisgIG9iamZtdD0nRUxGJworICBBQ19NU0dfV0FSTihbdW5leHBlY3RlZCBob3N0IHN5c3RlbS4gYXNzdW1lZCB0aGF0IHRoZSBmb3JtYXQgaXMgJG9iamZtdC5dKQorZmkKKworQUNfTVNHX0NIRUNLSU5HKFtmb3Igb2JqZWN0IGZpbGUgZm9ybWF0IHNwZWNpZmllciAoTkFGTEFHUykgXSkKK2Nhc2UgIiRvYmpmbXQiIGluCisgIE1TT01GKSAgICAgIE5BRkxBR1M9Jy1mb2JqIC1ET0JKMzInOzsKKyAgV2luMzItQ09GRikgTkFGTEFHUz0nLWZ3aW4zMiAtRFdJTjMyJzs7CisgIENPRkYpICAgICAgIE5BRkxBR1M9Jy1mY29mZiAtRENPRkYnOzsKKyAgYS5vdXQpICAgICAgTkFGTEFHUz0nLWZhb3V0IC1EQU9VVCc7OworICBCU0QtYS5vdXQpICBOQUZMQUdTPSctZmFvdXRiIC1EQU9VVCc7OworICBFTEYpICAgICAgICBOQUZMQUdTPSctZmVsZiAtREVMRic7OworICBSREYpICAgICAgICBOQUZMQUdTPSctZnJkZiAtRFJERic7OworICBNYWNoLU8pICAgICBOQUZMQUdTPSctZm1hY2hvIC1ETUFDSE8nOzsKK2VzYWMKK0FDX01TR19SRVNVTFQoWyROQUZMQUdTXSkKK0FDX1NVQlNUKFtOQUZMQUdTXSkKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBhc3NlbWJsZXIgKCROQVNNICROQUZMQUdTKSB3b3Jrc10pCitjYXQgPiBjb25mdGVzdC5hc20gPDxFT0YKK1slbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSIKKyAgICAgICAgc2VjdGlvbiAudGV4dAorICAgICAgICBiaXRzICAgIDMyCisgICAgICAgIGdsb2JhbCAgX21haW4sbWFpbgorX21haW46CittYWluOiAgIHhvciAgICAgZWF4LGVheAorICAgICAgICByZXQKK11FT0YKK3RyeV9uYXNtPSckTkFTTSAkTkFGTEFHUyAtbyBjb25mdGVzdC5vIGNvbmZ0ZXN0LmFzbScKK2lmIEFDX1RSWV9FVkFMKHRyeV9uYXNtKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0Lm87IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCh5ZXMpCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQworICBjYXQgY29uZnRlc3QuYXNtID4mQUNfRkRfQ0MKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBBQ19NU0dfUkVTVUxUKG5vKQorICBBQ19NU0dfRVJST1IoW2luc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGFzc2VtYmxlciBjYW5ub3QgY3JlYXRlIG9iamVjdCBmaWxlcy5dKQorZmkKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBsaW5rZXIgYWNjZXB0cyBhc3NlbWJsZXIgb3V0cHV0XSkKK3RyeV9uYXNtPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkTERGTEFHUyBjb25mdGVzdC5vICRMSUJTIDE+JkFDX0ZEX0NDJworaWYgQUNfVFJZX0VWQUwodHJ5X25hc20pICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBBQ19NU0dfUkVTVUxUKHllcykKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBBQ19NU0dfUkVTVUxUKG5vKQorICBBQ19NU0dfRVJST1IoW2NvbmZpZ3VyYXRpb24gcHJvYmxlbTogbWF5YmUgb2JqZWN0IGZpbGUgZm9ybWF0IG1pc21hdGNoLl0pCitmaQorCitdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC5tNCBiL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZTk4NmIuLjAwMDAwMDAKLS0tIGEvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDM2NTUgKzAsMCBAQAotIyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuOC41IC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLSMgbGlidG9vbC5tNCAtIENvbmZpZ3VyZSBsaWJ0b29sIGZvciB0aGUgaG9zdCBzeXN0ZW0uIC0qLVNoZWxsLXNjcmlwdC0qLQotCi0jIHNlcmlhbCA0NiBBQ19QUk9HX0xJQlRPT0wKLQotQUNfREVGVU4oW0FDX1BST0dfTElCVE9PTF0sCi1bQUNfUkVRVUlSRShbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi1BQ19TVUJTVChMSUJUT09MKWRubAotCi0jIFByZXZlbnQgbXVsdGlwbGUgZXhwYW5zaW9uCi1kZWZpbmUoW0FDX1BST0dfTElCVE9PTF0sIFtdKQotXSkKLQotQUNfREVGVU4oW0FDX0xJQlRPT0xfU0VUVVBdLAotW0FDX1BSRVJFUSgyLjEzKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NIQVJFRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU1RBVElDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xEX1JFTE9BRF9GTEFHXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbTFRfQUNfUFJPR19TRURdKWRubAotCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAotQUNfUkVRVUlSRShbQUNfREVQTElCU19DSEVDS19NRVRIT0RdKWRubAotQUNfUkVRVUlSRShbQUNfT0JKRVhUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VYRUVYVF0pZG5sCi1kbmwKLQotX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0gKLSMgT25seSBwZXJmb3JtIHRoZSBjaGVjayBmb3IgZmlsZSwgaWYgdGhlIGNoZWNrIG1ldGhvZCByZXF1aXJlcyBpdAotY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLWZpbGVfbWFnaWMqKQotICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCi0gICAgQUNfUEFUSF9NQUdJQwotICBmaQotICA7OwotZXNhYwotCi1BQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQotQUNfQ0hFQ0tfVE9PTChTVFJJUCwgc3RyaXAsIDopCi0KLWlmZGVmKFtBQ19QUk9WSURFX0FDX0xJQlRPT0xfRExPUEVOXSwgZW5hYmxlX2Rsb3Blbj15ZXMsIGVuYWJsZV9kbG9wZW49bm8pCi1pZmRlZihbQUNfUFJPVklERV9BQ19MSUJUT09MX1dJTjMyX0RMTF0sCi1lbmFibGVfd2luMzJfZGxsPXllcywgZW5hYmxlX3dpbjMyX2RsbD1ubykKLQotQUNfQVJHX0VOQUJMRShsaWJ0b29sLWxvY2ssCi0gIFsgIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGF2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcyldKQotdGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiAhPSB4bm8gJiYgZW5hYmxlX2xpYnRvb2xfbG9jaz15ZXMKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgJGhvc3QgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAotICAgIFtBQ19MQU5HX1NBVkUKLSAgICAgQUNfTEFOR19DCi0gICAgIEFDX1RSWV9MSU5LKFtdLFtdLFtsdF9jdl9jY19uZWVkc19iZWxmPXllc10sW2x0X2N2X2NjX25lZWRzX2JlbGY9bm9dKQotICAgICBBQ19MQU5HX1JFU1RPUkVdKQotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi1pZmRlZihbQUNfUFJPVklERV9BQ19MSUJUT09MX1dJTjMyX0RMTF0sCi1bKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqKQotICBBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQotICBBQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCi0gIEFDX0NIRUNLX1RPT0woT0JKRFVNUCwgb2JqZHVtcCwgZmFsc2UpCi0KLSAgIyByZWNlbnQgY3lnd2luIGFuZCBtaW5ndyBzeXN0ZW1zIHN1cHBseSBhIHN0dWIgRGxsTWFpbiB3aGljaCB0aGUgdXNlcgotICAjIGNhbiBvdmVycmlkZSwgYnV0IG9uIG9sZGVyIHN5c3RlbXMgd2UgaGF2ZSB0byBzdXBwbHkgb25lCi0gIEFDX0NBQ0hFX0NIRUNLKFtpZiBsaWJ0b29sIHNob3VsZCBzdXBwbHkgRGxsTWFpbiBmdW5jdGlvbl0sIGx0X2N2X25lZWRfZGxsbWFpbiwKLSAgICBbQUNfVFJZX0xJTksoW10sCi0gICAgICBbZXh0ZXJuIGludCBfX2F0dHJpYnV0ZV9fKChfX3N0ZGNhbGxfXykpIERsbE1haW4odm9pZCosIGludCwgdm9pZCopOwotICAgICAgRGxsTWFpbiAoMCwgMCwgMCk7XSwKLSAgICAgIFtsdF9jdl9uZWVkX2RsbG1haW49bm9dLFtsdF9jdl9uZWVkX2RsbG1haW49eWVzXSldKQotCi0gIGNhc2UgJGhvc3QvJENDIGluCi0gICotKi1jeWd3aW4qL2djYyotbW5vLWN5Z3dpbip8Ki0qLW1pbmd3KikKLSAgICAjIG9sZCBtaW5ndyBzeXN0ZW1zIHJlcXVpcmUgIi1kbGwiIHRvIGxpbmsgYSBETEwsIHdoaWxlIG1vcmUgcmVjZW50IG9uZXMKLSAgICAjIHJlcXVpcmUgIi1tZGxsIgotICAgIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICAgIENGTEFHUz0iJENGTEFHUyAtbWRsbCIKLSAgICBBQ19DQUNIRV9DSEVDSyhbaG93IHRvIGxpbmsgRExMc10sIGx0X2N2X2NjX2RsbF9zd2l0Y2gsCi0gICAgICBbQUNfVFJZX0xJTksoW10sIFtdLCBbbHRfY3ZfY2NfZGxsX3N3aXRjaD0tbWRsbF0sW2x0X2N2X2NjX2RsbF9zd2l0Y2g9LWRsbF0pXSkKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIgOzsKLSAgKi0qLWN5Z3dpbiogfCAqLSotcHczMiopCi0gICAgIyBjeWd3aW4gc3lzdGVtcyBuZWVkIHRvIHBhc3MgLS1kbGwgdG8gdGhlIGxpbmtlciwgYW5kIG5vdCBsaW5rCi0gICAgIyBjcnQubyB3aGljaCB3aWxsIHJlcXVpcmUgYSBXaW5NYWluQDE2IGRlZmluaXRpb24uCi0gICAgbHRfY3ZfY2NfZGxsX3N3aXRjaD0iLVdsLC0tZGxsIC1ub3N0YXJ0ZmlsZXMiIDs7Ci0gIGVzYWMKLSAgOzsKLSAgXSkKLWVzYWMKLQotX0xUX0FDX0xUQ09ORklHX0hBQ0sKLQotXSkKLQotIyBBQ19MSUJUT09MX0hFQURFUl9BU1NFUlQKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbQUNfTElCVE9PTF9IRUFERVJfQVNTRVJUXSwKLVtBQ19DQUNIRV9DSEVDSyhbd2hldGhlciAkQ0Mgc3VwcG9ydHMgYXNzZXJ0IHdpdGhvdXQgYmFja2xpbmtpbmddLAotICAgIFtsdF9jdl9mdW5jX2Fzc2VydF93b3Jrc10sCi0gICAgW2Nhc2UgJGhvc3QgaW4KLSAgICAqLSotc29sYXJpcyopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllczsgdGhlbgotICAgICAgICBjYXNlIGAkQ0MgLS12ZXJzaW9uIDI+L2Rldi9udWxsYCBpbgotICAgICAgICBbWzEyXV0uKikgbHRfY3ZfZnVuY19hc3NlcnRfd29ya3M9bm8gOzsKLSAgICAgICAgKikgICAgICAgIGx0X2N2X2Z1bmNfYXNzZXJ0X3dvcmtzPXllcyA7OwotICAgICAgICBlc2FjCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjXSkKLQotaWYgdGVzdCAieCRsdF9jdl9mdW5jX2Fzc2VydF93b3JrcyIgPSB4eWVzOyB0aGVuCi0gIEFDX0NIRUNLX0hFQURFUlMoYXNzZXJ0LmgpCi1maQotXSkjIEFDX0xJQlRPT0xfSEVBREVSX0FTU0VSVAotCi0jIF9MVF9BQ19DSEVDS19ETEZDTgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW19MVF9BQ19DSEVDS19ETEZDTl0sCi1bQUNfQ0hFQ0tfSEVBREVSUyhkbGZjbi5oKQotXSkjIF9MVF9BQ19DSEVDS19ETEZDTgotCi0jIEFDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEVdLAotW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSkKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKQotQUNfUkVRVUlSRShbQUNfT0JKRVhUXSkKLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1BQ19NU0dfQ0hFQ0tJTkcoW2NvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dF0pCi1BQ19DQUNIRV9WQUwoW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGVdLCBbZG5sCi0KLSMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyBbVGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KV0KLQotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotc3ltY29kZT0nW1tCQ0RFR1JTVF1dJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLXN5bXBhdD0nXChbW19BLVphLXpdXVtbX0EtWmEtejAtOV1dKlwpJwotCi0jIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi1zeW14ZnJtPSdcMSBcMlwzIFwzJwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1sdF9jdl9nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIHN5bWJvbCBuYW1lIGFuZCBzeW1ib2wgYWRkcmVzcwotbHRfY3ZfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW1teIF1dKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSBcKFtbXiBdXSpcKSBcKFtbXiBdXSpcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICRob3N0X29zIGluCi1haXgqKQotICBzeW1jb2RlPSdbW0JDRFRdXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgc3ltY29kZT0nW1tBQkNER0lTVFddXScKLSAgOzsKLWhwdXgqKSAjIEl0cyBsaW5rZXIgZGlzdGluZ3Vpc2hlcyBkYXRhIGZyb20gY29kZSBzeW1ib2xzCi0gIGx0X2N2X2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14kc3ltY29kZSogLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gIGx0X2N2X2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcKFtbXiBdXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwoW1teIF1dKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKLSAgOzsKLWlyaXgqIHwgbm9uc3RvcHV4KikKLSAgc3ltY29kZT0nW1tCQ0RFR1JTVF1dJwotICA7Owotb3NmKikKLSAgc3ltY29kZT0nW1tCQ0RFR1FSU1RdXScKLSAgOzsKLXNvbGFyaXMqIHwgc3lzdjUqKQotICBzeW1jb2RlPSdbW0JEVF1dJwotICA7Owotc3lzdjQpCi0gIHN5bWNvZGU9J1tbREZOU1RVXV0nCi0gIDs7Ci1lc2FjCi0KLSMgSGFuZGxlIENSTEYgaW4gbWluZ3cgdG9vbCBjaGFpbgotb3B0X2NyPQotY2FzZSAkaG9zdF9vcyBpbgotbWluZ3cqKQotICBvcHRfY3I9YGVjaG8gJ3hcezAsMVx9JyB8IHRyIHggJ1wwMTUnYCAjIG9wdGlvbiBjciBpbiByZWdleHAKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1pZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLSAgc3ltY29kZT0nW1tBQkNER0lTVFddXScKLWZpCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgotbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKltbIAldXVwoJHN5bWNvZGUkc3ltY29kZSpcKVtbIAldXVtbIAldXSpcKCRhY19zeW1wcmZ4XCkkc3ltcGF0JG9wdF9jciQvJHN5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIHBpcGVfd29ya3M9bm8KLSAgcm0gLWYgY29uZnRlc3QqCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQotRU9GCi0KLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBubGlzdD1jb25mdGVzdC5ubQotICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJG5saXN0KSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KLQltdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJG5saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC4kYWNfZXh0Ci0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGx0X2N2X2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiID4+IGNvbmZ0ZXN0LiRhY19leHQnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC4kYWNfZXh0Ci0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHIgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyIGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0ciBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbW11dID0KLXsKLUVPRgotCSAgc2VkICJzL14kc3ltY29kZSRzeW1jb2RlKiBcKC4qXCkgXCguKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC8iIDwgIiRubGlzdCIgPj4gY29uZnRlc3QuJGFjX2V4dAotCSAgY2F0IDw8XEVPRiA+PiBjb25mdGVzdC4kYWNfZXh0Ci0gIHswLCAobHRfcHRyKSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRzdG0uJGFjX29iamV4dAotCSAgc2F2ZV9MSUJTPSIkTElCUyIKLQkgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotCSAgICBwaXBlX3dvcmtzPXllcwotCSAgZmkKLQkgIExJQlM9IiRzYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JkFDX0ZEX0NDCi0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mQUNfRkRfQ0MKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IHJ1biAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBQ19GRF9DQwotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLSAgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqIGNvbmZ0c3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBicmVhawotICBlbHNlCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KLSAgZmkKLWRvbmUKLV0pCi1nbG9iYWxfc3ltYm9sX3BpcGU9IiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIgotaWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gIGdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9Ci0gIGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9Ci1lbHNlCi0gIGdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9IiRsdF9jdl9nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIgotICBnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSIkbHRfY3ZfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyIKLWZpCi1pZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlJGdsb2JhbF9zeW1ib2xfdG9fY2RlYyRnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIjsKLXRoZW4KLSAgQUNfTVNHX1JFU1VMVChmYWlsZWQpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQob2spCi1maQotXSkgIyBBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEUKLQotIyBfTFRfQUNfTElCVE9PTF9TWVNfUEFUSF9TRVBBUkFUT1IKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0xUX0FDX0xJQlRPT0xfU1lTX1BBVEhfU0VQQVJBVE9SXSwKLVsjIEZpbmQgdGhlIGNvcnJlY3QgUEFUSCBzZXBhcmF0b3IuICBVc3VhbGx5IHRoaXMgaXMgYDonLCBidXQKLSMgREpHUFAgdXNlcyBgOycgbGlrZSBET1MuCi1pZiB0ZXN0ICJYJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBYc2V0OyB0aGVuCi0gIFVOQU1FPSR7VU5BTUUtYHVuYW1lIDI+L2Rldi9udWxsYH0KLSAgY2FzZSBYJFVOQU1FIGluCi0gICAgKi1ET1MpIGx0X2N2X3N5c19wYXRoX3NlcGFyYXRvcj0nOycgOzsKLSAgICAqKSAgICAgbHRfY3Zfc3lzX3BhdGhfc2VwYXJhdG9yPSc6JyA7OwotICBlc2FjCi0gIFBBVEhfU0VQQVJBVE9SPSRsdF9jdl9zeXNfcGF0aF9zZXBhcmF0b3IKLWZpCi1dKSMgX0xUX0FDX0xJQlRPT0xfU1lTX1BBVEhfU0VQQVJBVE9SCi0KLSMgX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0gKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQWRkIHNvbWUgY29kZSB0byB0aGUgc3RhcnQgb2YgdGhlIGdlbmVyYXRlZCBjb25maWd1cmUgc2NyaXB0IHdoaWNoCi0jIHdpbGwgZmluZCBhbiBlY2hvIGNvbW1hbmQgd2hpY2ggZG9lc24ndCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi1BQ19ERUZVTihbX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0hdLAotW2lmZGVmKFtBQ19ESVZFUlNJT05fTk9USUNFXSwgW0FDX0RJVkVSVF9QVVNIKEFDX0RJVkVSU0lPTl9OT1RJQ0UpXSwKLQkJCSAgICAgIFtBQ19ESVZFUlRfUFVTSChOT1RJQ0UpXSkKLV9MVF9BQ19MSUJUT09MX1NZU19QQVRIX1NFUEFSQVRPUgotCi0jIENoZWNrIHRoYXQgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCi1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotCi1jYXNlIFgkRUNITyBpbgotWCotLWZhbGxiYWNrLWVjaG8pCi0gICMgUmVtb3ZlIG9uZSBsZXZlbCBvZiBxdW90YXRpb24gKHdoaWNoIHdhcyByZXF1aXJlZCBmb3IgTWFrZSkuCi0gIEVDSE89YGVjaG8gIiRFQ0hPIiB8IHNlZCAncyxcXFxcXFskXVxcWyRdMCwnWyRdMCcsJ2AKLSAgOzsKLWVzYWMKLQotZWNobz0ke0VDSE8tZWNob30KLWlmIHRlc3QgIlhbJF0xIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgc2hpZnQKLWVsaWYgdGVzdCAiWFskXTEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIEF2b2lkIGlubGluZSBkb2N1bWVudCBoZXJlLCBpdCBtYXkgYmUgbGVmdCBvdmVyCi0gIDoKLWVsaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnOyB0aGVuCi0gICMgWWlwcGVlLCAkZWNobyB3b3JrcyEKLSAgOgotZWxzZQotICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCi0gIGV4ZWMgJFNIRUxMICJbJF0wIiAtLW5vLXJlZXhlYyAkezErIlskXUAifQotZmkKLQotaWYgdGVzdCAiWFskXTEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobwotICBzaGlmdAotICBjYXQgPDxFT0YKLSQqCi1FT0YKLSAgZXhpdCAwCi1maQotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotaWYgdGVzdCAiWCR7Q0RQQVRIK3NldH0iID0gWHNldDsgdGhlbiBDRFBBVEg9OjsgZXhwb3J0IENEUEFUSDsgZmkKLQotaWYgdGVzdCAteiAiJEVDSE8iOyB0aGVuCi1pZiB0ZXN0ICJYJHtlY2hvX3Rlc3Rfc3RyaW5nK3NldH0iICE9IFhzZXQ7IHRoZW4KLSMgZmluZCBhIHN0cmluZyBhcyBsYXJnZSBhcyBwb3NzaWJsZSwgYXMgbG9uZyBhcyB0aGUgc2hlbGwgY2FuIGNvcGUgd2l0aCBpdAotICBmb3IgY21kIGluICdzZWQgNTBxICJbJF0wIicgJ3NlZCAyMHEgIlskXTAiJyAnc2VkIDEwcSAiWyRdMCInICdzZWQgMnEgIlskXTAiJyAnZWNobyB0ZXN0JzsgZG8KLSAgICAjIGV4cGVjdGVkIHNpemVzOiBsZXNzIHRoYW4gMktiLCAxS2IsIDUxMiBieXRlcywgMTYgYnl0ZXMsIC4uLgotICAgIGlmIChlY2hvX3Rlc3Rfc3RyaW5nPSJgZXZhbCAkY21kYCIpIDI+L2Rldi9udWxsICYmCi0gICAgICAgZWNob190ZXN0X3N0cmluZz0iYGV2YWwgJGNtZGAiICYmCi0gICAgICAgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGwKLSAgICB0aGVuCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLWZpCi0KLWlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gIDoKLWVsc2UKLSAgIyBUaGUgU29sYXJpcywgQUlYLCBhbmQgRGlnaXRhbCBVbml4IGRlZmF1bHQgZWNobyBwcm9ncmFtcyB1bnF1b3RlCi0gICMgYmFja3NsYXNoZXMuICBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKLSAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKLSAgIwotICAjIFNvLCBmaXJzdCB3ZSBsb29rIGZvciBhIHdvcmtpbmcgZWNobyBpbiB0aGUgdXNlcidzIFBBVEguCi0KLSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgZm9yIGRpciBpbiAkUEFUSCAvdXNyL3VjYjsgZG8KLSAgICBpZiAodGVzdCAtZiAkZGlyL2VjaG8gfHwgdGVzdCAtZiAkZGlyL2VjaG8kYWNfZXhlZXh0KSAmJgotICAgICAgIHRlc3QgIlhgKCRkaXIvZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLSAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGRpci9lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAgICAgZWNobz0iJGRpci9lY2hvIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJHNhdmVfaWZzIgotCi0gIGlmIHRlc3QgIlgkZWNobyIgPSBYZWNobzsgdGhlbgotICAgICMgV2UgZGlkbid0IGZpbmQgYSBiZXR0ZXIgZWNobywgc28gbG9vayBmb3IgYWx0ZXJuYXRpdmVzLgotICAgIGlmIHRlc3QgIlhgKHByaW50IC1yICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YChwcmludCAtciAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLSAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgICAgICMgVGhpcyBzaGVsbCBoYXMgYSBidWlsdGluIHByaW50IC1yIHRoYXQgZG9lcyB0aGUgdHJpY2suCi0gICAgICBlY2hvPSdwcmludCAtcicKLSAgICBlbGlmICh0ZXN0IC1mIC9iaW4va3NoIHx8IHRlc3QgLWYgL2Jpbi9rc2gkYWNfZXhlZXh0KSAmJgotCSB0ZXN0ICJYJENPTkZJR19TSEVMTCIgIT0gWC9iaW4va3NoOyB0aGVuCi0gICAgICAjIElmIHdlIGhhdmUga3NoLCB0cnkgcnVubmluZyBjb25maWd1cmUgYWdhaW4gd2l0aCBpdC4KLSAgICAgIE9SSUdJTkFMX0NPTkZJR19TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotICAgICAgZXhwb3J0IE9SSUdJTkFMX0NPTkZJR19TSEVMTAotICAgICAgQ09ORklHX1NIRUxMPS9iaW4va3NoCi0gICAgICBleHBvcnQgQ09ORklHX1NIRUxMCi0gICAgICBleGVjICRDT05GSUdfU0hFTEwgIlskXTAiIC0tbm8tcmVleGVjICR7MSsiWyRdQCJ9Ci0gICAgZWxzZQotICAgICAgIyBUcnkgdXNpbmcgcHJpbnRmLgotICAgICAgZWNobz0ncHJpbnRmICVzXG4nCi0gICAgICBpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLQkgZWNob190ZXN0aW5nX3N0cmluZz1gKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotCSB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQkjIENvb2wsIHByaW50ZiB3b3JrcwotCToKLSAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKLQkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKLQkgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCUNPTkZJR19TSEVMTD0kT1JJR0lOQUxfQ09ORklHX1NIRUxMCi0JZXhwb3J0IENPTkZJR19TSEVMTAotCVNIRUxMPSIkQ09ORklHX1NIRUxMIgotCWV4cG9ydCBTSEVMTAotCWVjaG89IiRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iCi0gICAgICBlbGlmIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgICYmCi0JICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCi0JICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLQkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQllY2hvPSIkQ09ORklHX1NIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvIgotICAgICAgZWxzZQotCSMgbWF5YmUgd2l0aCBhIHNtYWxsZXIgc3RyaW5nLi4uCi0JcHJldj06Ci0KLQlmb3IgY21kIGluICdlY2hvIHRlc3QnICdzZWQgMnEgIlskXTAiJyAnc2VkIDEwcSAiWyRdMCInICdzZWQgMjBxICJbJF0wIicgJ3NlZCA1MHEgIlskXTAiJzsgZG8KLQkgIGlmICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlhgZXZhbCAkY21kYCIpIDI+L2Rldi9udWxsCi0JICB0aGVuCi0JICAgIGJyZWFrCi0JICBmaQotCSAgcHJldj0iJGNtZCIKLQlkb25lCi0KLQlpZiB0ZXN0ICIkcHJldiIgIT0gJ3NlZCA1MHEgIlskXTAiJzsgdGhlbgotCSAgZWNob190ZXN0X3N0cmluZz1gZXZhbCAkcHJldmAKLQkgIGV4cG9ydCBlY2hvX3Rlc3Rfc3RyaW5nCi0JICBleGVjICR7T1JJR0lOQUxfQ09ORklHX1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fSAiWyRdMCIgJHsxKyJbJF1AIn0KLQllbHNlCi0JICAjIE9vcHMuICBXZSBsb3N0IGNvbXBsZXRlbHksIHNvIGp1c3Qgc3RpY2sgd2l0aCBlY2hvLgotCSAgZWNobz1lY2hvCi0JZmkKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLWZpCi1maQotCi0jIENvcHkgZWNobyBhbmQgcXVvdGUgdGhlIGNvcHkgc3VpdGFibHkgZm9yIHBhc3NpbmcgdG8gbGlidG9vbCBmcm9tCi0jIHRoZSBNYWtlZmlsZSwgaW5zdGVhZCBvZiBxdW90aW5nIHRoZSBvcmlnaW5hbCwgd2hpY2ggaXMgdXNlZCBsYXRlci4KLUVDSE89JGVjaG8KLWlmIHRlc3QgIlgkRUNITyIgPSAiWCRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iOyB0aGVuCi0gICBFQ0hPPSIkQ09ORklHX1NIRUxMIFxcXCRcWyRdMCAtLWZhbGxiYWNrLWVjaG8iCi1maQotCi1BQ19TVUJTVChFQ0hPKQotQUNfRElWRVJUX1BPUAotXSkjIF9MVF9BQ19QUk9HX0VDSE9fQkFDS1NMQVNICi0KLSMgX0xUX0FDX1RSWV9ETE9QRU5fU0VMRiAoQUNUSU9OLUlGLVRSVUUsIEFDVElPTi1JRi1UUlVFLVctVVNDT1JFLAotIyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDVElPTi1JRi1GQUxTRSwgQUNUSU9OLUlGLUNST1NTLUNPTVBJTElORykKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0xUX0FDX1RSWV9ETE9QRU5fU0VMRl0sCi1baWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICBbJDRdCi1lbHNlCi0gIEFDX1JFUVVJUkUoW19MVF9BQ19DSEVDS19ETEZDTl0pZG5sCi0gIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKLSAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotWyNsaW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZiBIQVZFX0RMRkNOX0gKLSNpbmNsdWRlIDxkbGZjbi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgUlRMRF9HTE9CQUwKLSMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKLSNlbHNlCi0jICBpZmRlZiBETF9HTE9CQUwKLSMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKLSMgIGVsc2UKLSMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKLSAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KLSNpZm5kZWYgTFRfRExMQVpZX09SX05PVwotIyAgaWZkZWYgUlRMRF9MQVpZCi0jICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKLSMgIGVsc2UKLSMgICAgaWZkZWYgRExfTEFaWQotIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCi0jICAgIGVsc2UKLSMgICAgICBpZmRlZiBSVExEX05PVwotIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKLSMgICAgICBlbHNlCi0jICAgICAgICBpZmRlZiBETF9OT1cKLSMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCi0jICAgICAgICBlbHNlCi0jICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKLSMgICAgICAgIGVuZGlmCi0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KTsKLSNlbmRpZgotCi12b2lkIGZub3JkKCkgeyBpbnQgaT00Mjt9Ci1pbnQgbWFpbiAoKQotewotICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKLSAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247Ci0KLSAgaWYgKHNlbGYpCi0gICAgewotICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7Ci0gICAgICBlbHNlIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOwotICAgICAgLyogZGxjbG9zZSAoc2VsZik7ICovCi0gICAgfQotCi0gICAgZXhpdCAoc3RhdHVzKTsKLX1dCi1FT0YKLSAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAyPi9kZXYvbnVsbDsgdGhlbgotICAgICguL2NvbmZ0ZXN0OyBleGl0OyApIDI+L2Rldi9udWxsCi0gICAgbHRfc3RhdHVzPSQ/Ci0gICAgY2FzZSB4JGx0X3N0YXR1cyBpbgotICAgICAgeCRsdF9kbG5vX3VzY29yZSkgJDEgOzsKLSAgICAgIHgkbHRfZGxuZWVkX3VzY29yZSkgJDIgOzsKLSAgICAgIHgkbHRfdW5rbm93bnx4KikgJDMgOzsKLSAgICBlc2FjCi0gIGVsc2UgOgotICAgICMgY29tcGlsYXRpb24gZmFpbGVkCi0gICAgJDMKLSAgZmkKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1dKSMgX0xUX0FDX1RSWV9ETE9QRU5fU0VMRgotCi0jIEFDX0xJQlRPT0xfRExPUEVOX1NFTEYKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOX1NFTEZdLAotW2lmIHRlc3QgIngkZW5hYmxlX2Rsb3BlbiIgIT0geHllczsgdGhlbgotICBlbmFibGVfZGxvcGVuPXVua25vd24KLSAgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24KLSAgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duCi1lbHNlCi0gIGx0X2N2X2Rsb3Blbj1ubwotICBsdF9jdl9kbG9wZW5fbGlicz0KLQotICBjYXNlICRob3N0X29zIGluCi0gIGJlb3MqKQotICAgIGx0X2N2X2Rsb3Blbj0ibG9hZF9hZGRfb24iCi0gICAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0gICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCi0gICAgOzsKLQotICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKLSAgICBsdF9jdl9kbG9wZW5fbGlicz0KLSAgIDs7Ci0KLSAgKikKLSAgICBBQ19DSEVDS19GVU5DKFtzaGxfbG9hZF0sCi0gICAgICAgICAgW2x0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiXSwKLSAgICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtzaGxfbG9hZF0sCi0gICAgICAgICAgICBbbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1kbGQiXSwKLQlbQUNfQ0hFQ0tfRlVOQyhbZGxvcGVuXSwKLQkgICAgICBbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iXSwKLQkgIFtBQ19DSEVDS19MSUIoW2RsXSwgW2Rsb3Blbl0sCi0JICAgICAgICBbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIl0sCi0JICAgIFtBQ19DSEVDS19MSUIoW3N2bGRdLCBbZGxvcGVuXSwKLQkgICAgICAgICAgW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxzdmxkIl0sCi0JICAgICAgW0FDX0NIRUNLX0xJQihbZGxkXSwgW2RsZF9saW5rXSwKLQkgICAgICAgICAgICBbbHRfY3ZfZGxvcGVuPSJkbGRfbGluayIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1kbGQiXSkKLQkgICAgICBdKQotCSAgICBdKQotCSAgXSkKLQldKQotICAgICAgXSkKLSAgICA7OwotICBlc2FjCi0KLSAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgotICAgIGVuYWJsZV9kbG9wZW49eWVzCi0gIGVsc2UKLSAgICBlbmFibGVfZGxvcGVuPW5vCi0gIGZpCi0KLSAgY2FzZSAkbHRfY3ZfZGxvcGVuIGluCi0gIGRsb3BlbikKLSAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCi0gICAgQUNfUkVRVUlSRShbX0xUX0FDX0NIRUNLX0RMRkNOXSlkbmwKLSAgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9kbGZjbl9oIiA9IHh5ZXMgJiYgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtREhBVkVfRExGQ05fSCIKLQotICAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCi0gICAgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgotCi0gICAgc2F2ZV9MSUJTPSIkTElCUyIKLSAgICBMSUJTPSIkbHRfY3ZfZGxvcGVuX2xpYnMgJExJQlMiCi0KLSAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGZdLAotCSAgbHRfY3ZfZGxvcGVuX3NlbGYsIFtkbmwKLQkgIF9MVF9BQ19UUllfRExPUEVOX1NFTEYoCi0JICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcywgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzLAotCSAgICBsdF9jdl9kbG9wZW5fc2VsZj1ubywgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MpCi0gICAgXSkKLQotICAgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuX3NlbGYiID0geHllczsgdGhlbgotICAgICAgTERGTEFHUz0iJExERkxBR1MgJGxpbmtfc3RhdGljX2ZsYWciCi0gICAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGZdLAotICAgIAkgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYywgW2RubAotCSAgX0xUX0FDX1RSWV9ETE9QRU5fU0VMRigKLQkgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcywgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcywKLQkgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vLCAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzKQotICAgICAgXSkKLSAgICBmaQotCi0gICAgQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIgotICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCi0gICAgTElCUz0iJHNhdmVfTElCUyIKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGYgaW4KLSAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7Ci0gICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7Ci0gIGVzYWMKLQotICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgaW4KLSAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKLSAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7Ci0gIGVzYWMKLWZpCi1dKSMgQUNfTElCVE9PTF9ETE9QRU5fU0VMRgotCi1BQ19ERUZVTihbX0xUX0FDX0xUQ09ORklHX0hBQ0tdLAotW0FDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRV0pZG5sCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0nc2VkIC1lIHMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0ncy9cKFtbXFwiXFxgJFxcXFxdXVwpL1xcXDEvZycKLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCi1kb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbW1xcIlxcYFxcXFxdXVwpL1xcXDEvZycKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKLSMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KLWRlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCi0KLSMgQ29uc3RhbnRzOgotcm09InJtIC1mIgotCi0jIEdsb2JhbCB2YXJpYWJsZXM6Ci1kZWZhdWx0X29maWxlPWxpYnRvb2wKLWNhbl9idWlsZF9zaGFyZWQ9eWVzCi0KLSMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNJFZDLAotIyB3aGljaCBuZWVkcyAnLmxpYicpLgotbGliZXh0PWEKLWx0bWFpbj0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotb2ZpbGU9IiRkZWZhdWx0X29maWxlIgotd2l0aF9nbnVfbGQ9IiRsdF9jdl9wcm9nX2dudV9sZCIKLW5lZWRfbG9ja3M9IiRlbmFibGVfbGlidG9vbF9sb2NrIgotCi1vbGRfQ0M9IiRDQyIKLW9sZF9DRkxBR1M9IiRDRkxBR1MiCi0KLSMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIHZhcmlvdXMgdmFyaWFibGVzCi10ZXN0IC16ICIkQVIiICYmIEFSPWFyCi10ZXN0IC16ICIkQVJfRkxBR1MiICYmIEFSX0ZMQUdTPWNydQotdGVzdCAteiAiJEFTIiAmJiBBUz1hcwotdGVzdCAteiAiJENDIiAmJiBDQz1jYwotdGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAotdGVzdCAteiAiJExEIiAmJiBMRD1sZAotdGVzdCAteiAiJExOX1MiICYmIExOX1M9ImxuIC1zIgotdGVzdCAteiAiJE1BR0lDX0NNRCIgJiYgTUFHSUNfQ01EPWZpbGUKLXRlc3QgLXogIiROTSIgJiYgTk09bm0KLXRlc3QgLXogIiRPQkpEVU1QIiAmJiBPQkpEVU1QPW9iamR1bXAKLXRlc3QgLXogIiRSQU5MSUIiICYmIFJBTkxJQj06Ci10ZXN0IC16ICIkU1RSSVAiICYmIFNUUklQPToKLXRlc3QgLXogIiRhY19vYmpleHQiICYmIGFjX29iamV4dD1vCi0KLWlmIHRlc3QgeCIkaG9zdCIgIT0geCIkYnVpbGQiOyB0aGVuCi0gIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCi1lbHNlCi0gIGFjX3Rvb2xfcHJlZml4PQotZmkKLQotIyBUcmFuc2Zvcm0gbGludXgqIHRvICotKi1saW51eC1nbnUqLCB0byBzdXBwb3J0IG9sZCBjb25maWd1cmUgc2NyaXB0cy4KLWNhc2UgJGhvc3Rfb3MgaW4KLWxpbnV4LWdudSopIDs7Ci1saW51eCopIGhvc3Q9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoLiotLiotbGludXhcKVwoLipcKSQvXDEtZ251XDIvJ2AKLWVzYWMKLQotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQotICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgotICBpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KLSAgICBDT0xMRUNUX05BTUVTPQotICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLSMgRGV0ZXJtaW5lIGNvbW1hbmRzIHRvIGNyZWF0ZSBvbGQtc3R5bGUgc3RhdGljIGFyY2hpdmVzLgotb2xkX2FyY2hpdmVfY21kcz0nJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCi1vbGRfcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNjQ0ICRvbGRsaWInCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPQotCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBjYXNlICRob3N0X29zIGluCi0gIG9wZW5ic2QqKQotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSJcJFJBTkxJQiAtdCBcJG9sZGxpYn4kb2xkX3Bvc3RpbnN0YWxsX2NtZHMiCi0gICAgOzsKLSAgKikKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iXCRSQU5MSUIgXCRvbGRsaWJ+JG9sZF9wb3N0aW5zdGFsbF9jbWRzIgotICAgIDs7Ci0gIGVzYWMKLSAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCi1maQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotc2V0IGR1bW15ICRDQwotY29tcGlsZXI9IlskXTIiCi0KLUFDX01TR19DSEVDS0lORyhbZm9yIG9iamRpcl0pCi1ybSAtZiAubGlicyAyPi9kZXYvbnVsbAotbWtkaXIgLmxpYnMgMj4vZGV2L251bGwKLWlmIHRlc3QgLWQgLmxpYnM7IHRoZW4KLSAgb2JqZGlyPS5saWJzCi1lbHNlCi0gICMgTVMtRE9TIGRvZXMgbm90IGFsbG93IGZpbGVuYW1lcyB0aGF0IGJlZ2luIHdpdGggYSBkb3QuCi0gIG9iamRpcj1fbGlicwotZmkKLXJtZGlyIC5saWJzIDI+L2Rldi9udWxsCi1BQ19NU0dfUkVTVUxUKCRvYmpkaXIpCi0KLQotQUNfQVJHX1dJVEgocGljLAotWyAgLS13aXRoLXBpYyAgICAgICAgICAgICAgdHJ5IHRvIHVzZSBvbmx5IFBJQy9ub24tUElDIG9iamVjdHMgW2RlZmF1bHQ9dXNlIGJvdGhdXSwKLXBpY19tb2RlPSIkd2l0aHZhbCIsIHBpY19tb2RlPWRlZmF1bHQpCi10ZXN0IC16ICIkcGljX21vZGUiICYmIHBpY19tb2RlPWRlZmF1bHQKLQotIyBXZSBhc3N1bWUgaGVyZSB0aGF0IHRoZSB2YWx1ZSBmb3IgbHRfY3ZfcHJvZ19jY19waWMgd2lsbCBub3QgYmUgY2FjaGVkCi0jIGluIGlzb2xhdGlvbiwgYW5kIHRoYXQgc2VlaW5nIGl0IHNldCAoZnJvbSB0aGUgY2FjaGUpIGluZGljYXRlcyB0aGF0Ci0jIHRoZSBhc3NvY2lhdGVkIHZhbHVlcyBhcmUgc2V0IChpbiB0aGUgY2FjaGUpIGNvcnJlY3RseSB0b28uCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDXSkKLUFDX0NBQ0hFX1ZBTChsdF9jdl9wcm9nX2NjX3BpYywKLVsgbHRfY3ZfcHJvZ19jY19waWM9Ci0gIGx0X2N2X3Byb2dfY2Nfc2hsaWI9Ci0gIGx0X2N2X3Byb2dfY2Nfd2w9Ci0gIGx0X2N2X3Byb2dfY2Nfc3RhdGljPQotICBsdF9jdl9wcm9nX2NjX25vX2J1aWx0aW49Ci0gIGx0X2N2X3Byb2dfY2NfY2FuX2J1aWxkX3NoYXJlZD0kY2FuX2J1aWxkX3NoYXJlZAotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgbHRfY3ZfcHJvZ19jY193bD0nLVdsLCcKLSAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLXN0YXRpYycKLQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgqKQotICAgICAgIyBCZWxvdyB0aGVyZSBpcyBhIGRpcnR5IGhhY2sgdG8gZm9yY2Ugbm9ybWFsIHN0YXRpYyBsaW5raW5nIHdpdGggLWxkbAotICAgICAgIyBUaGUgcHJvYmxlbSBpcyBiZWNhdXNlIGxpYmRsIGR5bmFtaWNhbGx5IGxpbmtlZCB3aXRoIGJvdGggbGliYyBhbmQKLSAgICAgICMgbGliQyAoQUlYIEMrKyBsaWJyYXJ5KSwgd2hpY2ggb2J2aW91c2x5IGRvZXNuJ3QgaW5jbHVkZWQgaW4gbGlicmFyaWVzCi0gICAgICAjIGxpc3QgYnkgZ2NjLiBUaGlzIGNhdXNlIHVuZGVmaW5lZCBzeW1ib2xzIHdpdGggLXN0YXRpYyBmbGFncy4KLSAgICAgICMgVGhpcyBoYWNrIGFsbG93cyBDIHByb2dyYW1zIHRvIGJlIGxpbmtlZCB3aXRoICItc3RhdGljIC1sZGwiLCBidXQKLSAgICAgICMgbm90IHN1cmUgYWJvdXQgQysrIHByb2dyYW1zLgotICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9IiRsdF9jdl9wcm9nX2NjX3N0YXRpYyAke2x0X2N2X3Byb2dfY2Nfd2x9LWxDIgotICAgICAgOzsKLSAgICBhbWlnYW9zKikKLSAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKLSAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAotICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KLSAgICAgIGx0X2N2X3Byb2dfY2NfcGljPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCi0gICAgICA7OwotICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgotICAgICAgOzsKLSAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQotICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1mbm8tY29tbW9uJwotICAgICAgOzsKLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBvczIqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgIGx0X2N2X3Byb2dfY2NfcGljPSctRERMTF9FWFBPUlQnCi0gICAgICA7OwotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLQkgbHRfY3ZfcHJvZ19jY19waWM9LUtjb25mb3JtX3BpYwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGx0X2N2X3Byb2dfY2NfcGljPSctZlBJQycKLSAgICAgIDs7Ci0gICAgZXNhYwotICBlbHNlCi0gICAgIyBQT1JUTUUgQ2hlY2sgZm9yIFBJQyBmbGFncyBmb3IgdGhlIHN5c3RlbSBjb21waWxlci4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4MyogfCBhaXg0KiB8IGFpeDUqKQotICAgICAgbHRfY3ZfcHJvZ19jY193bD0nLVdsLCcKLSAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICBlbHNlCi0JbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X2N2X3Byb2dfY2Nfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KLSAgICAgIGx0X2N2X3Byb2dfY2Nfd2w9Jy1XbCwnCi0gICAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0iJHtsdF9jdl9wcm9nX2NjX3dsfS1hICR7bHRfY3ZfcHJvZ19jY193bH1hcmNoaXZlIgotICAgICAgbHRfY3ZfcHJvZ19jY19waWM9JytaJwotICAgICAgOzsKLQotICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gICAgICBsdF9jdl9wcm9nX2NjX3dsPSctV2wsJwotICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1ub25fc2hhcmVkJwotICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgotICAgICAgOzsKLQotICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IG9zMiopCi0gICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCi0gICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgotICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1ERExMX0VYUE9SVCcKLSAgICAgIDs7Ci0KLSAgICBuZXdzb3M2KQotICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1LUElDJwotICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgotICAgICAgbHRfY3ZfcHJvZ19jY193bD0nLVdsLCcKLSAgICAgIGx0X2N2X3Byb2dfY2Nfc3RhdGljPSctbm9uX3NoYXJlZCcKLSAgICAgIDs7Ci0KLSAgICBzY28zLjJ2NSopCi0gICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLUtwaWMnCi0gICAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLWRuJwotICAgICAgbHRfY3ZfcHJvZ19jY19zaGxpYj0nLWJlbGYnCi0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLUtQSUMnCi0gICAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICBsdF9jdl9wcm9nX2NjX3dsPSctV2wsJwotICAgICAgOzsKLQotICAgIHN1bm9zNCopCi0gICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLVBJQycKLSAgICAgIGx0X2N2X3Byb2dfY2Nfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIGx0X2N2X3Byb2dfY2Nfd2w9Jy1Rb3B0aW9uIGxkICcKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCi0gICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLUtQSUMnCi0gICAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICBsdF9jdl9wcm9nX2NjX3dsPSctV2wsJwotICAgICAgOzsKLQotICAgIHV0czQqKQotICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1waWMnCi0gICAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotCWx0X2N2X3Byb2dfY2NfcGljPSctS2NvbmZvcm1fcGljJwotCWx0X2N2X3Byb2dfY2Nfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGx0X2N2X3Byb2dfY2NfY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi1dKQotaWYgdGVzdCAteiAiJGx0X2N2X3Byb2dfY2NfcGljIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKFtub25lXSkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChbJGx0X2N2X3Byb2dfY2NfcGljXSkKLQotICAjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcGljX2ZsYWcgYWN0dWFsbHkgd29ya3MuCi0gIEFDX01TR19DSEVDS0lORyhbaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9jdl9wcm9nX2NjX3BpYyB3b3Jrc10pCi0gIEFDX0NBQ0hFX1ZBTChsdF9jdl9wcm9nX2NjX3BpY193b3JrcywgW2RubAotICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICAgIENGTEFHUz0iJENGTEFHUyAkbHRfY3ZfcHJvZ19jY19waWMgLURQSUMiCi0gICAgQUNfVFJZX0NPTVBJTEUoW10sIFtdLCBbZG5sCi0gICAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLQkjIE9uIEhQLVVYLCBib3RoIENDIGFuZCBHQ0Mgb25seSB3YXJuIHRoYXQgUElDIGlzIHN1cHBvcnRlZC4uLiB0aGVuCi0JIyB0aGV5IGNyZWF0ZSBub24tUElDIG9iamVjdHMuICBTbywgaWYgdGhlcmUgd2VyZSBhbnkgd2FybmluZ3MsIHdlCi0JIyBhc3N1bWUgdGhhdCBQSUMgaXMgbm90IHN1cHBvcnRlZC4KLQlpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotCSAgbHRfY3ZfcHJvZ19jY19waWNfd29ya3M9bm8KLQllbHNlCi0JICBsdF9jdl9wcm9nX2NjX3BpY193b3Jrcz15ZXMKLQlmaQotCTs7Ci0gICAgICAqKQotCWx0X2N2X3Byb2dfY2NfcGljX3dvcmtzPXllcwotCTs7Ci0gICAgICBlc2FjCi0gICAgXSwgW2RubAotICAgICAgbHRfY3ZfcHJvZ19jY19waWNfd29ya3M9bm8KLSAgICBdKQotICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotICBdKQotCi0gIGlmIHRlc3QgIlgkbHRfY3ZfcHJvZ19jY19waWNfd29ya3MiID0gWG5vOyB0aGVuCi0gICAgbHRfY3ZfcHJvZ19jY19waWM9Ci0gICAgbHRfY3ZfcHJvZ19jY19jYW5fYnVpbGRfc2hhcmVkPW5vCi0gIGVsc2UKLSAgICBsdF9jdl9wcm9nX2NjX3BpYz0iICRsdF9jdl9wcm9nX2NjX3BpYyIKLSAgZmkKLQotICBBQ19NU0dfUkVTVUxUKFskbHRfY3ZfcHJvZ19jY19waWNfd29ya3NdKQotZmkKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgc2hhcmVkIGxpYnJhcnkgY29tcGlsYXRpb24gZmxhZ3MuCi1pZiB0ZXN0IC1uICIkbHRfY3ZfcHJvZ19jY19zaGxpYiI7IHRoZW4KLSAgQUNfTVNHX1dBUk4oW1xgJENDJyByZXF1aXJlcyBcYCRsdF9jdl9wcm9nX2NjX3NobGliJyB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKLSAgaWYgZWNobyAiJG9sZF9DQyAkb2xkX0NGTEFHUyAiIHwgZWdyZXAgLWUgIltbIAldXSRsdF9jdl9wcm9nX2NjX3NobGliW1sgCV1dIiA+L2Rldi9udWxsOyB0aGVuIDoKLSAgZWxzZQotICAgQUNfTVNHX1dBUk4oW2FkZCBcYCRsdF9jdl9wcm9nX2NjX3NobGliJyB0byB0aGUgQ0Mgb3IgQ0ZMQUdTIGVudiB2YXJpYWJsZSBhbmQgcmVjb25maWd1cmVdKQotICAgIGx0X2N2X3Byb2dfY2NfY2FuX2J1aWxkX3NoYXJlZD1ubwotICBmaQotZmkKLQotQUNfTVNHX0NIRUNLSU5HKFtpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X2N2X3Byb2dfY2Nfc3RhdGljIHdvcmtzXSkKLUFDX0NBQ0hFX1ZBTChbbHRfY3ZfcHJvZ19jY19zdGF0aWNfd29ya3NdLCBbZG5sCi0gIGx0X2N2X3Byb2dfY2Nfc3RhdGljX3dvcmtzPW5vCi0gIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCi0gIExERkxBR1M9IiRMREZMQUdTICRsdF9jdl9wcm9nX2NjX3N0YXRpYyIKLSAgQUNfVFJZX0xJTksoW10sIFtdLCBbbHRfY3ZfcHJvZ19jY19zdGF0aWNfd29ya3M9eWVzXSkKLSAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLV0pCi0KLSMgQmVsdCAqYW5kKiBicmFjZXMgdG8gc3RvcCBteSB0cm91c2VycyBmYWxsaW5nIGRvd246Ci10ZXN0ICJYJGx0X2N2X3Byb2dfY2Nfc3RhdGljX3dvcmtzIiA9IFhubyAmJiBsdF9jdl9wcm9nX2NjX3N0YXRpYz0KLUFDX01TR19SRVNVTFQoWyRsdF9jdl9wcm9nX2NjX3N0YXRpY193b3Jrc10pCi0KLXBpY19mbGFnPSIkbHRfY3ZfcHJvZ19jY19waWMiCi1zcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3M9IiRsdF9jdl9wcm9nX2NjX3NobGliIgotd2w9IiRsdF9jdl9wcm9nX2NjX3dsIgotbGlua19zdGF0aWNfZmxhZz0iJGx0X2N2X3Byb2dfY2Nfc3RhdGljIgotbm9fYnVpbHRpbl9mbGFnPSIkbHRfY3ZfcHJvZ19jY19ub19idWlsdGluIgotY2FuX2J1aWxkX3NoYXJlZD0iJGx0X2N2X3Byb2dfY2NfY2FuX2J1aWxkX3NoYXJlZCIKLQotCi0jIENoZWNrIHRvIHNlZSBpZiBvcHRpb25zIC1vIGFuZCAtYyBhcmUgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyCi1BQ19NU0dfQ0hFQ0tJTkcoW2lmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHRdKQotQUNfQ0FDSEVfVkFMKFtsdF9jdl9jb21waWxlcl9jX29dLCBbCi0kcm0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKLW1rZGlyIGNvbmZ0ZXN0Ci1jZCBjb25mdGVzdAotZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC4kYWNfZXh0Ci1ta2RpciBvdXQKLSMgQWNjb3JkaW5nIHRvIFRvbSBUcm9tZXksIElhbiBMYW5jZSBUYXlsb3IgcmVwb3J0ZWQgdGhlcmUgYXJlIEMgY29tcGlsZXJzCi0jIHRoYXQgd2lsbCBjcmVhdGUgdGVtcG9yYXJ5IGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSByZWdhcmRsZXNzIG9mCi0jIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiAgVGh1cywgbWFraW5nIENXRCByZWFkLW9ubHkgd2lsbCBjYXVzZSB0aGlzIHRlc3QKLSMgdG8gZmFpbCwgZW5hYmxpbmcgbG9ja2luZyBvciBhdCBsZWFzdCB3YXJuaW5nIHRoZSB1c2VyIG5vdCB0byBkbyBwYXJhbGxlbAotIyBidWlsZHMuCi1jaG1vZCAtdyAuCi1zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0iJENGTEFHUyAtbyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQiCi1jb21waWxlcl9jX289bm8KLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6X19vbGluZV9fOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPm91dC9jb25mdGVzdC5lcnI7IH0gJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQ7IHRoZW4KLSAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gIGlmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0LmVycjsgdGhlbgotICAgIGx0X2N2X2NvbXBpbGVyX2Nfbz1ubwotICBlbHNlCi0gICAgbHRfY3ZfY29tcGlsZXJfY19vPXllcwotICBmaQotZWxzZQotICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgotICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciAxPiZBQ19GRF9DQwotICBsdF9jdl9jb21waWxlcl9jX289bm8KLWZpCi1DRkxBR1M9IiRzYXZlX0NGTEFHUyIKLWNobW9kIHUrdyAuCi0kcm0gY29uZnRlc3QqIG91dC8qCi1ybWRpciBvdXQKLWNkIC4uCi1ybWRpciBjb25mdGVzdAotJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCi1dKQotY29tcGlsZXJfY19vPSRsdF9jdl9jb21waWxlcl9jX28KLUFDX01TR19SRVNVTFQoWyRjb21waWxlcl9jX29dKQotCi1pZiB0ZXN0IHgiJGNvbXBpbGVyX2NfbyIgPSB4InllcyI7IHRoZW4KLSAgIyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIHdyaXRlIHRvIGEgLmxvCi0gIEFDX01TR19DSEVDS0lORyhbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUubG9dKQotICBBQ19DQUNIRV9WQUwoW2x0X2N2X2NvbXBpbGVyX29fbG9dLCBbCi0gIGx0X2N2X2NvbXBpbGVyX29fbG89bm8KLSAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYyAtbyBjb25mdGVzdC5sbyIKLSAgc2F2ZV9vYmpleHQ9IiRhY19vYmpleHQiCi0gIGFjX29iamV4dD1sbwotICBBQ19UUllfQ09NUElMRShbXSwgW2ludCBzb21lX3ZhcmlhYmxlID0gMDtdLCBbZG5sCi0gICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICAgbHRfY3ZfY29tcGlsZXJfb19sbz1ubwotICAgIGVsc2UKLSAgICAgIGx0X2N2X2NvbXBpbGVyX29fbG89eWVzCi0gICAgZmkKLSAgXSkKLSAgYWNfb2JqZXh0PSIkc2F2ZV9vYmpleHQiCi0gIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotICBdKQotICBjb21waWxlcl9vX2xvPSRsdF9jdl9jb21waWxlcl9vX2xvCi0gIEFDX01TR19SRVNVTFQoWyRjb21waWxlcl9vX2xvXSkKLWVsc2UKLSAgY29tcGlsZXJfb19sbz1ubwotZmkKLQotIyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIGRvIGhhcmQgbGlua3MgdG8gbG9jayBzb21lIGZpbGVzIGlmIG5lZWRlZAotaGFyZF9saW5rcz0ibm90dGVzdGVkIgotaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KLSAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCi0gIEFDX01TR19DSEVDS0lORyhbaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzXSkKLSAgaGFyZF9saW5rcz15ZXMKLSAgJHJtIGNvbmZ0ZXN0KgotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICB0b3VjaCBjb25mdGVzdC5hCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgQUNfTVNHX1JFU1VMVChbJGhhcmRfbGlua3NdKQotICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgotICAgIEFDX01TR19XQVJOKFtcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlXSkKLSAgICBuZWVkX2xvY2tzPXdhcm4KLSAgZmkKLWVsc2UKLSAgbmVlZF9sb2Nrcz1ubwotZmkKLQotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIGFyZSBzdXBwb3J0ZWQgYnkgY29tcGlsZXIKLSAgQUNfTVNHX0NIRUNLSU5HKFtpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9uc10pCi0gIGVjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuJGFjX2V4dAotICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMgLWMgY29uZnRlc3QuJGFjX2V4dCIKLSAgY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCi0gIEFDX1RSWV9DT01QSUxFKFtdLCBbaW50IHNvbWVfdmFyaWFibGUgPSAwO10sIFtkbmwKLSAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICBjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KLSAgICBlbHNlCi0gICAgICBjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9eWVzCi0gICAgZmkKLSAgXSkKLSAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCi0gIEFDX01TR19SRVNVTFQoWyRjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnNdKQotCi0gIGlmIHRlc3QgIiRjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0gInllcyI7IHRoZW4KLSAgICBub19idWlsdGluX2ZsYWc9JyAtZm5vLWJ1aWx0aW4gLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucycKLSAgZWxzZQotICAgIG5vX2J1aWx0aW5fZmxhZz0nIC1mbm8tYnVpbHRpbicKLSAgZmkKLWZpCi0KLSMgU2VlIGlmIHRoZSBsaW5rZXIgc3VwcG9ydHMgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQotCi1hbGxvd191bmRlZmluZWRfZmxhZz0KLW5vX3VuZGVmaW5lZF9mbGFnPQotbmVlZF9saWJfcHJlZml4PXVua25vd24KLW5lZWRfdmVyc2lvbj11bmtub3duCi0jIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KLSMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cwotYXJjaGl2ZV9jbWRzPQotYXJjaGl2ZV9leHBzeW1fY21kcz0KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9Ci1vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQotdGhyZWFkX3NhZmVfZmxhZ19zcGVjPQotaGFyZGNvZGVfaW50b19saWJzPW5vCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPQotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KLWhhcmRjb2RlX2RpcmVjdD1ubwotaGFyZGNvZGVfbWludXNfTD1ubwotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAotcnVucGF0aF92YXI9Ci1saW5rX2FsbF9kZXBsaWJzPXVua25vd24KLWFsd2F5c19leHBvcnRfc3ltYm9scz1ubwotZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCBzZWQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0jIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCi0jIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAotaW5jbHVkZV9leHBzeW1zPQotIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGVncmVwIHJlZ3VsYXIgZXhwcmVzc2lvbiBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKLSMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKLSMgZW5kIG9mIGxpbmUuICBFeGFtcGxlOiBgYXxiY3wuKmQuKicgd2lsbCBleGNsdWRlIHRoZSBzeW1ib2xzIGBhJyBhbmQgYGJjJywKLSMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgotZXhjbHVkZV9leHBzeW1zPSJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0jIEFsdGhvdWdoIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhIHZhbGlkIHN5bWJvbCBDIG5hbWUsIG1vc3QgYS5vdXQKLSMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgotIyB0aGUgc3ltYm9sIGlzIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gIFNpbmNlIHBvcnRhYmxlIGNvZGUgY2Fubm90Ci0jIHJlbHkgb24gdGhpcyBzeW1ib2wgbmFtZSwgaXQncyBwcm9iYWJseSBmaW5lIHRvIG5ldmVyIGluY2x1ZGUgaXQgaW4KLSMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCi1leHRyYWN0X2V4cHN5bXNfY21kcz0KLQotY2FzZSAkaG9zdF9vcyBpbgotY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCi0gICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCi0gIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgotICAgIHdpdGhfZ251X2xkPW5vCi0gIGZpCi0gIDs7Ci1vcGVuYnNkKikKLSAgd2l0aF9nbnVfbGQ9bm8KLSAgOzsKLWVzYWMKLQotbGRfc2hsaWJzPXllcwotaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQotICB3bGFyYz0nJHt3bH0nCi0KLSAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgYWl4MyogfCBhaXg0KiB8IGFpeDUqKQotICAgICMgT24gQUlYLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgotICAgICMgTm90ZTpDaGVjayBHTlUgbGlua2VyIG9uIEFJWCA1LUlBNjQgd2hlbi9pZiBpdCBiZWNvbWVzIGF2YWlsYWJsZS4KLSAgICBsZF9zaGxpYnM9bm8KLSAgICBjYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCi0qKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KLSoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQotKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHlvdXIgUEFUSAotKioqIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotRU9GCi0gICAgOzsKLQotICBhbWlnYW9zKikKLSAgICBhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0KLSAgICAjIFNhbXVlbCBBLiBGYWx2byBJSSA8a2M1dGphQGRvbHBoaW4ub3BlbnByb2plY3RzLm5ldD4gcmVwb3J0cwotICAgICMgdGhhdCB0aGUgc2VtYW50aWNzIG9mIGR5bmFtaWMgbGlicmFyaWVzIG9uIEFtaWdhT1MsIGF0IGxlYXN0IHVwCi0gICAgIyB0byB2ZXJzaW9uIDQsIGlzIHRvIHNoYXJlIGRhdGEgYW1vbmcgbXVsdGlwbGUgcHJvZ3JhbXMgbGlua2VkCi0gICAgIyB3aXRoIHRoZSBzYW1lIGR5bmFtaWMgbGlicmFyeS4gIFNpbmNlIHRoaXMgZG9lc24ndCBtYXRjaCB0aGUKLSAgICAjIGJlaGF2aW9yIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gb3RoZXIgcGxhdGZvcm1zLCB3ZSBjYW4gdXNlCi0gICAgIyB0aGVtLgotICAgIGxkX3NobGlicz1ubwotICAgIDs7Ci0KLSAgYmVvcyopCi0gICAgaWYgJExEIC0taGVscCAyPiYxIHwgZWdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICAgICMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKLSAgICAgICMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgIGVsc2UKLSAgICAgIGxkX3NobGlicz1ubwotICAgIGZpCi0gICAgOzsKLQotICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcwotICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcwotCi0gICAgZXh0cmFjdF9leHBzeW1zX2NtZHM9J3Rlc3QgLWYgJG91dHB1dF9vYmpkaXIvaW1wZ2VuLmMgfHwgXAotICAgICAgc2VkIC1lICIvXiMgXC9cKiBpbXBnZW5cLmMgc3RhcnRzIGhlcmUgXCpcLy8sL14jIFwvXCogaW1wZ2VuLmMgZW5kcyBoZXJlIFwqXC8vIHsgcy9eIyAvLztzL14jICokLy87IHA7IH0iIC1lIGQgPCAkJycwID4gJG91dHB1dF9vYmpkaXIvaW1wZ2VuLmN+Ci0gICAgICB0ZXN0IC1mICRvdXRwdXRfb2JqZGlyL2ltcGdlbi5leGUgfHwgKGNkICRvdXRwdXRfb2JqZGlyICYmIFwKLSAgICAgIGlmIHRlc3QgIngkSE9TVF9DQyIgIT0gIngiIDsgdGhlbiAkSE9TVF9DQyAtbyBpbXBnZW4gaW1wZ2VuLmMgOyBcCi0gICAgICBlbHNlICRDQyAtbyBpbXBnZW4gaW1wZ2VuLmMgOyBmaSl+Ci0gICAgICAkb3V0cHV0X29iamRpci9pbXBnZW4gJGRpci8kc29yb290ID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWYnCi0KLSAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0nJERMTFRPT0wgLS1hcz0kQVMgLS1kbGxuYW1lICRzb25hbWUgLS1kZWYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWYgLS1vdXRwdXQtbGliICRvdXRwdXRfb2JqZGlyLyRuZXdsaWInCi0KLSAgICAjIGN5Z3dpbiBhbmQgbWluZ3cgZGxscyBoYXZlIGRpZmZlcmVudCBlbnRyeSBwb2ludHMgYW5kIHNldHMgb2Ygc3ltYm9scwotICAgICMgdG8gZXhjbHVkZS4KLSAgICAjIEZJWE1FOiB3aGF0IGFib3V0IHZhbHVlcyBmb3IgTVNWQz8KLSAgICBkbGxfZW50cnk9X19jeWd3aW5fZGxsX2VudHJ5QDEyCi0gICAgZGxsX2V4Y2x1ZGVfc3ltYm9scz1EbGxNYWluQDEyLF9jeWd3aW5fZGxsX2VudHJ5QDEyLF9jeWd3aW5fbm9uY3lnd2luX2RsbF9lbnRyeUAxMn4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgbWluZ3cqKQotICAgICAgIyBtaW5ndyB2YWx1ZXMKLSAgICAgIGRsbF9lbnRyeT1fRGxsTWFpbkNSVFN0YXJ0dXBAMTIKLSAgICAgIGRsbF9leGNsdWRlX3N5bWJvbHM9RGxsTWFpbkAxMixEbGxNYWluQ1JUU3RhcnR1cEAxMixEbGxFbnRyeVBvaW50QDEyfgotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIG1pbmd3IGFuZCBjeWd3aW4gZGlmZmVyLCBhbmQgaXQncyBzaW1wbGVzdCB0byBqdXN0IGV4Y2x1ZGUgdGhlIHVuaW9uCi0gICAgIyBvZiB0aGUgdHdvIHN5bWJvbCBzZXRzLgotICAgIGRsbF9leGNsdWRlX3N5bWJvbHM9RGxsTWFpbkAxMixfY3lnd2luX2RsbF9lbnRyeUAxMixfY3lnd2luX25vbmN5Z3dpbl9kbGxfZW50cnlAMTIsRGxsTWFpbkNSVFN0YXJ0dXBAMTIsRGxsRW50cnlQb2ludEAxMgotCi0gICAgIyByZWNlbnQgY3lnd2luIGFuZCBtaW5ndyBzeXN0ZW1zIHN1cHBseSBhIHN0dWIgRGxsTWFpbiB3aGljaCB0aGUgdXNlcgotICAgICMgY2FuIG92ZXJyaWRlLCBidXQgb24gb2xkZXIgc3lzdGVtcyB3ZSBoYXZlIHRvIHN1cHBseSBvbmUgKGluIGx0ZGxsLmMpCi0gICAgaWYgdGVzdCAieCRsdF9jdl9uZWVkX2RsbG1haW4iID0gInh5ZXMiOyB0aGVuCi0gICAgICBsdGRsbF9vYmo9JyRvdXRwdXRfb2JqZGlyLyRzb25hbWUtbHRkbGwuJyIkYWNfb2JqZXh0ICIKLSAgICAgIGx0ZGxsX2NtZHM9J3Rlc3QgLWYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1sdGRsbC5jIHx8IHNlZCAtZSAiL14jIFwvXCogbHRkbGxcLmMgc3RhcnRzIGhlcmUgXCpcLy8sL14jIFwvXCogbHRkbGwuYyBlbmRzIGhlcmUgXCpcLy8geyBzL14jIC8vOyBwOyB9IiAtZSBkIDwgJCcnMCA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtbHRkbGwuY34KLQl0ZXN0IC1mICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtbHRkbGwuJGFjX29iamV4dCB8fCAoY2QgJG91dHB1dF9vYmpkaXIgJiYgJENDIC1jICRzb25hbWUtbHRkbGwuYyl+JwotICAgIGVsc2UKLSAgICAgIGx0ZGxsX29iaj0KLSAgICAgIGx0ZGxsX2NtZHM9Ci0gICAgZmkKLQotICAgICMgRXh0cmFjdCB0aGUgc3ltYm9sIGV4cG9ydCBsaXN0IGZyb20gYW4gYC0tZXhwb3J0LWFsbCcgZGVmIGZpbGUsCi0gICAgIyB0aGVuIHJlZ2VuZXJhdGUgdGhlIGRlZiBmaWxlIGZyb20gdGhlIHN5bWJvbCBleHBvcnQgbGlzdCwgc28gdGhhdAotICAgICMgdGhlIGNvbXBpbGVkIGRsbCBvbmx5IGV4cG9ydHMgdGhlIHN5bWJvbCBleHBvcnQgbGlzdC4KLSAgICAjIEJlIGNhcmVmdWwgbm90IHRvIHN0cmlwIHRoZSBEQVRBIHRhZyBsZWZ0IGJlIG5ld2VyIGRsbHRvb2xzLgotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHM9IiRsdGRsbF9jbWRzIicKLSAgICAgICRETExUT09MIC0tZXhwb3J0LWFsbCAtLWV4Y2x1ZGUtc3ltYm9scyAnJGRsbF9leGNsdWRlX3N5bWJvbHMnIC0tb3V0cHV0LWRlZiAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZiAnJGx0ZGxsX29iaickbGlib2JqcyAkY29udmVuaWVuY2V+Ci0gICAgICBzZWQgLWUgIjEsL0VYUE9SVFMvZCIgLWUgInMvIEAgW1swLTldXSovLyIgLWUgInMvICo7LiokLy8iIDwgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWYgPiAkZXhwb3J0X3N5bWJvbHMnCi0KLSAgICAjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCi0gICAgIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzLgotICAgICMgSWYgREFUQSB0YWdzIGZyb20gYSByZWNlbnQgZGxsdG9vbCBhcmUgcHJlc2VudCwgaG9ub3VyIHRoZW0hCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kcz0naWYgdGVzdCAieGBzZWQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgotCWNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZjsKLSAgICAgIGVsc2UKLQllY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZjsKLQlfbHRfaGludD0xOwotCWNhdCAkZXhwb3J0X3N5bWJvbHMgfCB3aGlsZSByZWFkIHN5bWJvbDsgZG8KLQkgc2V0IGR1bW15IFwkc3ltYm9sOwotCSBjYXNlIFxbJF0jIGluCi0JICAgMikgZWNobyAiICAgXFskXTIgQCBcJF9sdF9oaW50IDsgIiA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZjs7Ci0JICAgNCkgZWNobyAiICAgXFskXTIgXFskXTMgXFskXTQgOyAiID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmOyBfbHRfaGludD1gZXhwciBcJF9sdF9oaW50IC0gMWA7OwotCSAgICopIGVjaG8gIiAgICAgXFskXTIgQCBcJF9sdF9oaW50IFxbJF0zIDsgIiA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZjs7Ci0JIGVzYWM7Ci0JIF9sdF9oaW50PWBleHByIDEgKyBcJF9sdF9oaW50YDsKLQlkb25lOwotICAgICAgZml+Ci0gICAgICAnIiRsdGRsbF9jbWRzIicKLSAgICAgICRDQyAtV2wsLS1iYXNlLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1iYXNlICckbHRfY3ZfY2NfZGxsX3N3aXRjaCcgLVdsLC1lLCckZGxsX2VudHJ5JyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICckbHRkbGxfb2JqJyRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34KLSAgICAgICRETExUT09MIC0tYXM9JEFTIC0tZGxsbmFtZSAkc29uYW1lIC0tZXhjbHVkZS1zeW1ib2xzICckZGxsX2V4Y2x1ZGVfc3ltYm9scycgLS1kZWYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWYgLS1iYXNlLWZpbGUgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1iYXNlIC0tb3V0cHV0LWV4cCAkb3V0cHV0X29iamRpci8kc29uYW1lLWV4cH4KLSAgICAgICRDQyAtV2wsLS1iYXNlLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1iYXNlICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZXhwICckbHRfY3ZfY2NfZGxsX3N3aXRjaCcgLVdsLC1lLCckZGxsX2VudHJ5JyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICckbHRkbGxfb2JqJyRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34KLSAgICAgICRETExUT09MIC0tYXM9JEFTIC0tZGxsbmFtZSAkc29uYW1lIC0tZXhjbHVkZS1zeW1ib2xzICckZGxsX2V4Y2x1ZGVfc3ltYm9scycgLS1kZWYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWYgLS1iYXNlLWZpbGUgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1iYXNlIC0tb3V0cHV0LWV4cCAkb3V0cHV0X29iamRpci8kc29uYW1lLWV4cCAtLW91dHB1dC1saWIgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGxsLmF+Ci0gICAgICAkQ0MgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1leHAgJyRsdF9jdl9jY19kbGxfc3dpdGNoJyAtV2wsLWUsJyRkbGxfZW50cnknIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJyRsdGRsbF9vYmonJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgIDs7Ci0KLSAgbmV0YnNkKikKLSAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCi0gICAgICB3bGFyYz0KLSAgICBlbHNlCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkIC1ub2RlZmF1bHRsaWJzICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgLW5vZGVmYXVsdGxpYnMgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgZmkKLSAgICA7OwotCi0gIHNvbGFyaXMqIHwgc3lzdjUqKQotICAgIGlmICRMRCAtdiAyPiYxIHwgZWdyZXAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgbGRfc2hsaWJzPW5vCi0gICAgICBjYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogVGhlIHJlbGVhc2VzIDIuOC4qIG9mIHRoZSBHTlUgbGlua2VyIGNhbm5vdCByZWxpYWJseQotKioqIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAotKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQotKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi45LjEgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKLSoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCi0qKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotRU9GCi0gICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCBlZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgbGRfc2hsaWJzPW5vCi0gICAgZmkKLSAgICA7OwotCi0gIHN1bm9zNCopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgIHdsYXJjPQotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICAqKQotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICBmaQotICAgIDs7Ci0gIGVzYWMKLQotICBpZiB0ZXN0ICIkbGRfc2hsaWJzIiA9IHllczsgdGhlbgotICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICAgIyBkbGx0b29sIGRvZXNuJ3QgdW5kZXJzdGFuZCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgotICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Ci0gICAgICA7OwotICAgICopCi0gICAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBlZ3JlcCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KLQl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKLSAgICAgIGVsc2UKLQl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLWVsc2UKLSAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQotICBjYXNlICRob3N0X29zIGluCi0gIGFpeDMqKQotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcwotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRMRCAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLWJFOiRleHBvcnRfc3ltYm9scyAtVDUxMiAtSDUxMiAtYk06U1JFfiRBUiAkQVJfRkxBR1MgJGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lJwotICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCi0gICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0gICAgICAjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKLSAgICAgICMgYnJva2VuIGNvbGxlY3QyLgotICAgICAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCi0gICAgZmkKLSAgICA7OwotCi0gIGFpeDQqIHwgYWl4NSopCi0gICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICAgICMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKLSAgICAgICMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgotICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotICAgICAgZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKLSAgICAgIG5vX2VudHJ5X2ZsYWc9IiIKLSAgICBlbHNlCi0gICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0KLSAgICAgICMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAotICAgICAgIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCi0gICAgICAjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgotICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMjNdXXxhaXg0LltbMjNdXS4qfGFpeDUqKQotCWZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbwotCSAgY2FzZSAkbGRfZmxhZyBpbgotCSAgKi1icnRsKikKLQkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKLQkgICAgYnJlYWsKLQkgIDs7Ci0JICBlc2FjCi0JZG9uZQotICAgICAgZXNhYwotCi0gICAgICBleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JwotICAgICAgbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JwotICAgIGZpCi0KLSAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCi0gICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5Ci0gICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KLSAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAotICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgotCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGFyY2hpdmVfY21kcz0nJwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JzonCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzAxMl1dfGFpeDQuW1swMTJdXS4qKQotCWNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKLQlpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCi0JICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCi0JdGhlbgotCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCi0JICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0JZWxzZQotCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgotCSAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCi0JICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCi0JICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAotCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCi0JICBoYXJkY29kZV9taW51c19MPXllcwotCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KLQlmaQotICAgICAgZXNhYwotCi0gICAgICBzaGFyZWRfZmxhZz0nLXNoYXJlZCcKLSAgICBlbHNlCi0gICAgICAjIG5vdCB1c2luZyBnY2MKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0Jc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCi0gICAgICBlbHNlCi0JaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKLQllbHNlCi0JICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJwotCWZpCi0gICAgICBmaQotICAgIGZpCi0KLSAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgY2FuIGRvIHN0cmFuZ2UgdGhpbmdzLCBzbyBpdCBpcyBiZXR0ZXIgdG8KLSAgICAjIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KLSAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCi0gICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0gICAgICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKLSAgICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSctYmVyb2snCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ibGlicGF0aDokbGliZGlyOi91c3IvbGliOi9saWInCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGVjaG8gIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRub19lbnRyeV9mbGFnIFwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCi0gICAgZWxzZQotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKLQlhbGxvd191bmRlZmluZWRfZmxhZz0iLXogbm9kZWZzIgotCWFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS1oJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRub19lbnRyeV9mbGFnIFwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKLSAgICAgIGVsc2UKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ibm9saWJwYXRoICR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6L3Vzci9saWI6L2xpYicKLQkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAotCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQlhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0tYmVyb2snCi0JIyBUaGlzIGlzIGEgYml0IHN0cmFuZ2UsIGJ1dCBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMKLQkjIGl0J3Mgc2hhcmVkIGxpYnJhcmllcy4KLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JG5vX2VudHJ5X2ZsYWcgXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIicgfiRBUiAtY3JsbyAkb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb2JqZGlyLyRzb25hbWUnCi0gICAgICBmaQotICAgIGZpCi0gICAgOzsKLQotICBhbWlnYW9zKikKLSAgICBhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgotICAgIGxkX3NobGlicz1ubwotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCi0gICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScgJwotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KLSAgICBsaWJleHQ9bGliCi0gICAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgotICAgIGFyY2hpdmVfY21kcz0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGBlY2hvICIkZGVwbGlicyIgfCBzZWQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKLSAgICAjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J3RydWUnCi0gICAgIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KLSAgICBvbGRfYXJjaGl2ZV9jbWRzPSdsaWIgL09VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCi0gICAgZml4X3NyY2ZpbGVfcGF0aD0nYGN5Z3BhdGggLXcgIiRzcmNmaWxlImAnCi0gICAgOzsKLQotICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgIGNhc2UgIiRob3N0X29zIiBpbgotICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuW1swMTJdXSkKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSctdW5kZWZpbmVkIHN1cHByZXNzJwotICAgICAgOzsKLSAgICAqKSAjIERhcndpbiAxLjMgb24KLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSctZmxhdF9uYW1lc3BhY2UgLXVuZGVmaW5lZCBzdXBwcmVzcycKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgICMgRklYTUU6IFJlbHlpbmcgb24gcG9zaXh5ICQoKSB3aWxsIGNhdXNlIHByb2JsZW1zIGZvcgotICAgICMgICAgICAgIGNyb3NzLWNvbXBpbGF0aW9uLCBidXQgdW5mb3J0dW5hdGVseSB0aGUgZWNobyB0ZXN0cyBkbyBub3QKLSAgICAjICAgICAgICB5ZXQgZGV0ZWN0IHpzaCBlY2hvJ3MgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuICBBbHNvIHpzaCBtYW5nbGVzCi0gICAgIwkgICAgIGAiJyBxdW90ZXMgaWYgd2UgcHV0IHRoZW0gaW4gaGVyZS4uLiBzbyBkb24ndCEKLSAgICBhcmNoaXZlX2NtZHM9JyRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vICR7bGlifS1tYXN0ZXIubyAkbGlib2JqcyAmJiAkQ0MgJCh0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC1idW5kbGUgfHwgZWNobyAtZHluYW1pY2xpYikgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJHtsaWJ9LW1hc3Rlci5vICRkZXBsaWJzJGxpbmtlcl9mbGFncyAkKHRlc3QgLiRtb2R1bGUgIT0gLnllcyAmJiBlY2hvIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZyknCi0gICAgIyBXZSBuZWVkIHRvIGFkZCAnXycgdG8gdGhlIHN5bWJvbHMgaW4gJGV4cG9ydF9zeW1ib2xzIGZpcnN0Ci0gICAgI2FyY2hpdmVfZXhwc3ltX2NtZHM9IiRhcmNoaXZlX2NtZHMiJyAmJiBzdHJpcCAtcyAkZXhwb3J0X3N5bWJvbHMnCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nLWFsbF9sb2FkICRjb252ZW5pZW5jZScKLSAgICA7OwotCi0gIGZyZWVic2QxKikKLSAgICBsZF9zaGxpYnM9bm8KLSAgICA7OwotCi0gICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgotICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KLSAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCi0gICMgZXh0cmEgc3BhY2UpLgotICBmcmVlYnNkMi4yKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCi0gIGZyZWVic2QyKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgIyBGcmVlQlNEIDMgYW5kIGdyZWF0ZXIgdXNlcyBnY2MgLXNoYXJlZCB0byBkbyBzaGFyZWQgbGlicmFyaWVzLgotICBmcmVlYnNkKikKLSAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGhwdXg5KikgYXJjaGl2ZV9jbWRzPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicgOzsKLSAgICAqKSBhcmNoaXZlX2NtZHM9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnIDs7Ci0gICAgZXNhYwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsIGJ1dCBhcyB0aGUgZGVmYXVsdAotCQkJICMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJwotICAgIDs7Ci0KLSAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgZWxzZQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLXJwYXRoICRsaWJkaXInCi0gICAgZmkKLSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLSAgICBsaW5rX2FsbF9kZXBsaWJzPXllcwotICAgIDs7Ci0KLSAgbmV0YnNkKikKLSAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAjIGEub3V0Ci0gICAgZWxzZQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAgICAgIyBFTEYKLSAgICBmaQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgbmV3c29zNikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIG9wZW5ic2QqKQotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0gICAgZWxzZQotICAgICAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gICAgICBvcGVuYnNkW1swMV1dLiogfCBvcGVuYnNkMi5bWzAtN11dIHwgb3BlbmJzZDIuW1swLTddXS4qKQotCWFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgICAgIDs7Ci0gICAgICAqKQotICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICAgIDs7Ci0KLSAgb3MyKikKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgIGFyY2hpdmVfY21kcz0nJGVjaG8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gRVhQT1JUUyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZW14ZXhwICRsaWJvYmpzID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J2VteGltcCAtbyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5hICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICA7OwotCi0gIG9zZjMqKQotICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotICAgIGVsc2UKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgZmkKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgOzsKLQotICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKLSAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIGVsc2UKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiLWV4cG9ydGVkX3N5bWJvbCAiID4+ICRsaWIuZXhwOyBlY2hvICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgotICAgICAgJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaW5wdXQgJGxpYi5leHAgJGxpbmtlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifiRybSAkbGliLmV4cCcKLQotICAgICAgI0JvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5Ci0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctcnBhdGggJGxpYmRpcicKLSAgICBmaQotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgIDs7Ci0KLSAgc2NvMy4ydjUqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgIGhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmV4cG9ydCcKLSAgICA7OwotCi0gIHNvbGFyaXMqKQotICAgICMgZ2NjIC0tdmVyc2lvbiA8IDMuMCB3aXRob3V0IGJpbnV0aWxzIGNhbm5vdCBjcmVhdGUgc2VsZiBjb250YWluZWQKLSAgICAjIHNoYXJlZCBsaWJyYXJpZXMgcmVsaWFibHksIHJlcXVpcmluZyBsaWJnY2MuYSB0byByZXNvbHZlIHNvbWUgb2YKLSAgICAjIHRoZSBvYmplY3Qgc3ltYm9scyBnZW5lcmF0ZWQgaW4gc29tZSBjYXNlcy4gIExpYnJhcmllcyB0aGF0IHVzZQotICAgICMgYXNzZXJ0IG5lZWQgbGliZ2NjLmEgdG8gcmVzb2x2ZSBfX2VwcmludGYsIGZvciBleGFtcGxlLiAgTGlua2luZwotICAgICMgYSBjb3B5IG9mIGxpYmdjYy5hIGludG8gZXZlcnkgc2hhcmVkIGxpYnJhcnkgdG8gZ3VhcmFudGVlIHJlc29sdmluZwotICAgICMgc3VjaCBzeW1ib2xzIGNhdXNlcyBvdGhlciBwcm9ibGVtczogIEFjY29yZGluZyB0byBUaW0gVmFuIEhvbGRlcgotICAgICMgPHRpbS52YW4uaG9sZGVyQHBhbmRvcmEuYmU+LCBDKysgbGlicmFyaWVzIGVuZCB1cCB3aXRoIGEgc2VwYXJhdGUKLSAgICAjICh0byB0aGUgYXBwbGljYXRpb24pIGV4Y2VwdGlvbiBzdGFjayBmb3Igb25lIHRoaW5nLgotICAgIG5vX3VuZGVmaW5lZF9mbGFnPScgLXogZGVmcycKLSAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgICAgY2FzZSBgJENDIC0tdmVyc2lvbiAyPi9kZXYvbnVsbGAgaW4KLSAgICAgIFtbMTJdXS4qKQotCWNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBSZWxlYXNlcyBvZiBHQ0MgZWFybGllciB0aGFuIHZlcnNpb24gMy4wIGNhbm5vdCByZWxpYWJseQotKioqIGNyZWF0ZSBzZWxmIGNvbnRhaW5lZCBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcywgd2l0aG91dAotKioqIGludHJvZHVjaW5nIGEgZGVwZW5kZW5jeSBvbiBsaWJnY2MuYS4gIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcKLSoqKiAtbm8tdW5kZWZpbmVkIHN1cHBvcnQsIHdoaWNoIHdpbGwgYXQgbGVhc3QgYWxsb3cgeW91IHRvIGJ1aWxkIHNoYXJlZAotKioqIGxpYnJhcmllcy4gIEhvd2V2ZXIsIHlvdSBtYXkgZmluZCB0aGF0IHdoZW4geW91IGxpbmsgc3VjaCBsaWJyYXJpZXMKLSoqKiBpbnRvIGFuIGFwcGxpY2F0aW9uIHdpdGhvdXQgdXNpbmcgR0NDLCB5b3UgaGF2ZSB0byBtYW51YWxseSBhZGQKLSoqKiBcYGdjYyAtLXByaW50LWxpYmdjYy1maWxlLW5hbWVcYCB0byB0aGUgbGluayBjb21tYW5kLiAgV2UgdXJnZSB5b3UgdG8KLSoqKiB1cGdyYWRlIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBHQ0MuICBBbm90aGVyIG9wdGlvbiBpcyB0byByZWJ1aWxkIHlvdXIKLSoqKiBjdXJyZW50IEdDQyB0byB1c2UgdGhlIEdOVSBsaW5rZXIgZnJvbSBHTlUgYmludXRpbHMgMi45LjEgb3IgbmV3ZXIuCi0KLUVPRgotICAgICAgICBub191bmRlZmluZWRfZmxhZz0KLQk7OwotICAgICAgZXNhYwotICAgIGZpCi0gICAgIyAkQ0MgLXNoYXJlZCB3aXRob3V0IEdOVSBsZCB3aWxsIG5vdCBjcmVhdGUgYSBsaWJyYXJ5IGZyb20gQysrCi0gICAgIyBvYmplY3QgZmlsZXMgYW5kIGEgc3RhdGljIGxpYnN0ZGMrKywgYmV0dGVyIGF2b2lkIGl0IGJ5IG5vdwotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIHNvbGFyaXMyLltbMC01XV0gfCBzb2xhcmlzMi5bWzAtNV1dLiopIDs7Ci0gICAgKikgIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKLSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JyA7OwotICAgIGVzYWMKLSAgICBsaW5rX2FsbF9kZXBsaWJzPXllcwotICAgIDs7Ci0KLSAgc3Vub3M0KikKLSAgICBpZiB0ZXN0ICJ4JGhvc3RfdmVuZG9yIiA9IHhzZXF1ZW50OyB0aGVuCi0gICAgICAjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCi0gICAgICAjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1HICR7d2x9LWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICBlbHNlCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgZmkKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgc3lzdjQpCi0gICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLSAgICAgIHNuaSkKLSAgICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/Ci0gICAgICAgIDs7Ci0gICAgICBzaWVtZW5zKQotICAgICAgICAjIyBMRCBpcyBsZCBpdCBtYWtlcyBhIFBMQU1MSUIKLSAgICAgICAgIyMgQ0MganVzdCBtYWtlcyBhIEdyb3NzTW9kdWxlLgotICAgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICAgIHJlbG9hZF9jbWRzPSckQ0MgLXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKLSAgICAgICAgaGFyZGNvZGVfZGlyZWN0PW5vCi0gICAgICAgIDs7Ci0gICAgICBtb3Rvcm9sYSkKLSAgICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICAgIGhhcmRjb2RlX2RpcmVjdD1ubyAjTW90b3JvbGEgbWFudWFsIHNheXMgeWVzLCBidXQgbXkgdGVzdHMgc2F5IHRoZXkgbGllCi0gICAgICAgIDs7Ci0gICAgZXNhYwotICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBzeXN2NC4zKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSctQmV4cG9ydCcKLSAgICA7OwotCi0gIHN5c3Y1KikKLSAgICBub191bmRlZmluZWRfZmxhZz0nIC16IHRleHQnCi0gICAgIyAkQ0MgLXNoYXJlZCB3aXRob3V0IEdOVSBsZCB3aWxsIG5vdCBjcmVhdGUgYSBsaWJyYXJ5IGZyb20gQysrCi0gICAgIyBvYmplY3QgZmlsZXMgYW5kIGEgc3RhdGljIGxpYnN0ZGMrKywgYmV0dGVyIGF2b2lkIGl0IGJ5IG5vdwotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Ci0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLSAgICA7OwotCi0gIHV0czQqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBkZ3V4KikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgc3lzdjQqTVAqKQotICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICAgIGhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcwotICAgICAgbGRfc2hsaWJzPXllcwotICAgIGZpCi0gICAgOzsKLQotICBzeXN2NC4ydXcyKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9bm8KLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCi0gICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICA7OwotCi0gIHN5c3Y1dXc3KiB8IHVuaXh3YXJlNyopCi0gICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyR7d2x9LXogJHt3bH10ZXh0JwotICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgIGVsc2UKLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1HICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgIGZpCi0gICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gICopCi0gICAgbGRfc2hsaWJzPW5vCi0gICAgOzsKLSAgZXNhYwotZmkKLUFDX01TR19SRVNVTFQoWyRsZF9zaGxpYnNdKQotdGVzdCAiJGxkX3NobGlicyIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLSMgQ2hlY2sgaGFyZGNvZGluZyBhdHRyaWJ1dGVzLgotQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zXSkKLWhhcmRjb2RlX2FjdGlvbj0KLWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIiB8fCBcCi0gICB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0KLSAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0YW50IGRpcmVjdG9yaWVzLgotICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSBubyAmJgotICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCi0gICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKLSAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQotICAgICAjIyB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgIT0gbm8gJiYKLSAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vOyB0aGVuCi0gICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KLSAgICBoYXJkY29kZV9hY3Rpb249cmVsaW5rCi0gIGVsc2UKLSAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgotICAgIGhhcmRjb2RlX2FjdGlvbj1pbW1lZGlhdGUKLSAgZmkKLWVsc2UKLSAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKLSAgIyBkaXJlY3Rvcmllcy4KLSAgaGFyZGNvZGVfYWN0aW9uPXVuc3VwcG9ydGVkCi1maQotQUNfTVNHX1JFU1VMVChbJGhhcmRjb2RlX2FjdGlvbl0pCi0KLXN0cmlwbGliPQotb2xkX3N0cmlwbGliPQotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGVdKQotaWYgdGVzdCAtbiAiJFNUUklQIiAmJiAkU1RSSVAgLVYgMj4mMSB8IGdyZXAgIkdOVSBzdHJpcCIgPi9kZXYvbnVsbDsgdGhlbgotICB0ZXN0IC16ICIkb2xkX3N0cmlwbGliIiAmJiBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLWRlYnVnIgotICB0ZXN0IC16ICIkc3RyaXBsaWIiICYmIHN0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC11bm5lZWRlZCIKLSAgQUNfTVNHX1JFU1VMVChbeWVzXSkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChbbm9dKQotZmkKLQotcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwotdGVzdCAteiAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAmJiBkZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCi0KLSMgUE9SVE1FIEZpbGwgaW4geW91ciBsZC5zbyBjaGFyYWN0ZXJpc3RpY3MKLUFDX01TR19DSEVDS0lORyhbZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzXSkKLWxpYnJhcnlfbmFtZXNfc3BlYz0KLWxpYm5hbWVfc3BlYz0nbGliJG5hbWUnCi1zb25hbWVfc3BlYz0KLXBvc3RpbnN0YWxsX2NtZHM9Ci1wb3N0dW5pbnN0YWxsX2NtZHM9Ci1maW5pc2hfY21kcz0KLWZpbmlzaF9ldmFsPQotc2hsaWJwYXRoX3Zhcj0KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD11bmtub3duCi12ZXJzaW9uX3R5cGU9bm9uZQotZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIiCi1zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJGxpYm5hbWUuYScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0KLSAgIyBBSVggaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICA7OwotCi1haXg0KiB8IGFpeDUqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0gICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0Ci0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJGxpYm5hbWUuc28nCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZWxzZQotICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKLSAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCi0gICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bwotICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCi0gICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXg0IHwgYWl4NC5bWzAxXV0gfCBhaXg0LltbMDFdXS4qKQotCWlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCi0JICAgICBlY2hvICcgeWVzICcKLQkgICAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgZ3JlcCB5ZXMgPiAvZGV2L251bGw7IHRoZW4KLQkgIDoKLQllbHNlCi0JICBjYW5fYnVpbGRfc2hhcmVkPW5vCi0JZmkKLQk7OwotICAgIGVzYWMKLSAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuCi0gICAgIyBub3QgaGFyZGNvZGUgY29ycmVjdCBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4KLSAgICAjIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8gY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuCi0gICAgIyBiZSB1c2VmdWwgaW4gZnV0dXJlLgotICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCi0gICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAotICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gICAgZWxzZQotICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKLSAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCi0gICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gICAgZmkKLSAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgZmkKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1hbWlnYW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKLSAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KLSAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ1wnJ3MlXi4qL1woW1teL11dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgIihjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hKSI7IChjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hKSB8fCBleGl0IDE7IGRvbmUnCi0gIDs7Ci0KLWJlb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0uc28nCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLSAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKLSAgOzsKLQotYnNkaTQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi0gIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0tcmR5bmFtaWMKLSAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKLSAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93Ci0gICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcwotICA7OwotCi1jeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gIHZlcnNpb25fdHlwZT13aW5kb3dzCi0gIG5lZWRfdmVyc2lvbj1ubwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgY2FzZSAkR0NDLCRob3N0X29zIGluCi0gIHllcyxjeWd3aW4qKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCi0gICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgc2VkIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9LmRsbCcKLSAgICBwb3N0aW5zdGFsbF9jbWRzPSdkbHBhdGg9YGJhc2ggMj4mMSAtYyAnXCcnLiAkZGlyLyR7ZmlsZX1pO2VjaG8gXCRkbG5hbWUnXCcnYH4KLSAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KLSAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgotICAgICAgJGluc3RhbGxfcHJvZyAubGlicy8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZScKLSAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWBiYXNoIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KLSAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+Ci0gICAgICAgJHJtIFwkZGxwYXRoJwotICAgIDs7Ci0gIHllcyxtaW5ndyopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8IHNlZCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fS5kbGwnCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgc2VkIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLzsvIC9nIiAtZSAicyw9LywvLGciYAotICAgIDs7Ci0gIHllcyxwdzMyKikKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCBzZWQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9LmRsbCcKLSAgICA7OwotICAqKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCBzZWQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0uZGxsICRsaWJuYW1lLmxpYicKLSAgICA7OwotICBlc2FjCi0gIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCi0gICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgotICBzaGxpYnBhdGhfdmFyPVBBVEgKLSAgOzsKLQotZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCi0gIHZlcnNpb25fdHlwZT1kYXJ3aW4KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICAjIEZJWE1FOiBSZWx5aW5nIG9uIHBvc2l4eSAkKCkgd2lsbCBjYXVzZSBwcm9ibGVtcyBmb3IKLSAgIyAgICAgICAgY3Jvc3MtY29tcGlsYXRpb24sIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoZSBlY2hvIHRlc3RzIGRvIG5vdAotICAjICAgICAgICB5ZXQgZGV0ZWN0IHpzaCBlY2hvJ3MgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3ZlcnN1ZmZpeH0uJCh0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIHNvIHx8IGVjaG8gZHlsaWIpICR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0uJCh0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIHNvIHx8IGVjaG8gZHlsaWIpICR7bGlibmFtZX0uJCh0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIHNvIHx8IGVjaG8gZHlsaWIpJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfS4kKHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gc28gfHwgZWNobyBkeWxpYiknCi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1mcmVlYnNkMSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLWZyZWVic2QqKQotICBvYmpmb3JtYXQ9YHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0ICYmIC91c3IvYmluL29iamZvcm1hdCB8fCBlY2hvIGFvdXRgCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKLSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0gICAgZnJlZWJzZC1lbGYqKQotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJGxpYm5hbWUuc28nCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBmcmVlYnNkLSopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAkbGlibmFtZS5zbyR2ZXJzdWZmaXgnCi0gICAgICBuZWVkX3ZlcnNpb249eWVzCi0gICAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgZnJlZWJzZDIqKQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICA7OwotICAqKQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHttYWpvcn0gJHtsaWJuYW1lfS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCi0gICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbCR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wkbWFqb3IgJGxpYm5hbWUuc2wnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbCRtYWpvcicKLSAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJwotICA7OwotCi1pcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICBjYXNlICRob3N0X29zIGluCi0gICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OwotICAgICopICAgICAgICAgIHZlcnNpb25fdHlwZT1pcml4IDs7Ci0gIGVzYWMKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvICRsaWJuYW1lLnNvJwotICBjYXNlICRob3N0X29zIGluCi0gIGlyaXg1KiB8IG5vbnN0b3B1eCopCi0gICAgbGlic3VmZj0gc2hsaWJzdWZmPQotICAgIDs7Ci0gICopCi0gICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAotICAgICotMzJ8KiItMzIgIikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OwotICAgICotbjMyfCoiLW4zMiAiKSBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKLSAgICAqLTY0fCoiLTY0ICIpIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7Ci0gICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKLSAgOzsKLQotIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgotbGludXgtZ251b2xkbGQqIHwgbGludXgtZ251YW91dCogfCBsaW51eC1nbnVjb2ZmKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgtZ251KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgotICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKLSAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotCi0gICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgotICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCi0gICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAotICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAotICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKLSAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCi0KLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nIChtdWx0aWxpYiBMaW51eCB4ODZfNjQgaGFjaykuCi0gIGxpYnN1ZmY9Ci0gIGNhc2UgIiRob3N0X2NwdSIgaW4KLSAgeDg2XzY0KnxzMzkweCopCi0gICAgZWNobyAnWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICAgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCi0gICAgICAqNjQtYml0KikKLSAgICAgICAgbGlic3VmZj02NAotICAgICAgICA7OwotICAgICAgZXNhYwotICAgIGZpCi0gICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgIDs7Ci0gICopCi0gICAgOzsKLSAgZXNhYwotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiR7bGlic3VmZn0gL3Vzci9saWIke2xpYnN1ZmZ9IgotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIke2xpYnN1ZmZ9IC91c3IvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCi0gIDs7Ci0KLW5ldGJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9LnNvJHZlcnN1ZmZpeCcKLSAgICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKLSAgZWxzZQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvICR7bGlibmFtZX0uc28nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJwotICBmaQotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotbmV3c29zNikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLW9wZW5ic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLSAgICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgICBvcGVuYnNkMi5bWzg5XV0gfCBvcGVuYnNkMi5bWzg5XV0uKikKLSAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgICAgOzsKLSAgICAqKQotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGZpCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0uc28kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1vczIqKQotICBsaWJuYW1lX3NwZWM9JyRuYW1lJwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwgJGxpYm5hbWUuYScKLSAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgOzsKLQotb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICB2ZXJzaW9uX3R5cGU9b3NmCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1zY28zLjJ2NSopCi0gIHZlcnNpb25fdHlwZT1vc2YKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotc29sYXJpcyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJwotICA7OwotCi1zdW5vczQqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfS5zbyR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICBmaQotICBuZWVkX3ZlcnNpb249eWVzCi0gIDs7Ci0KLXN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0gICAgc25pKQotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJwotICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICAgIDs7Ci0gICAgc2llbWVucykKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBtb3Rvcm9sYSkKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgbmVlZF92ZXJzaW9uPW5vCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCi0gICAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXV0czQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotZGd1eCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLXN5c3Y0Kk1QKikKLSAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotICAgIHZlcnNpb25fdHlwZT1saW51eAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuc28uJHZlcnN1ZmZpeCAkbGlibmFtZS5zby4kbWFqb3IgJGxpYm5hbWUuc28nCi0gICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lLnNvLiRtYWpvcicKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBmaQotICA7OwotCi0qKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotZXNhYwotQUNfTVNHX1JFU1VMVChbJGR5bmFtaWNfbGlua2VyXSkKLXRlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLSMgUmVwb3J0IHRoZSBmaW5hbCBjb25zZXF1ZW5jZXMuCi1BQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCi1BQ19NU0dfUkVTVUxUKFskY2FuX2J1aWxkX3NoYXJlZF0pCi0KLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKLXRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubwotCi0jIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKLSMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4MyopCi0gIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgotICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKLSAgZmkKLSAgOzsKLQotYWl4NCopCi0gIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KLSAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICBmaQotICA7OwotZXNhYwotQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zaGFyZWRdKQotCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCi0jIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcwotQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zdGF0aWNdKQotCi1pZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAotICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcwotZmkKLQotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IlBBVEggJHNobGlicGF0aF92YXIgJHJ1bnBhdGhfdmFyIgotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayBHQ0NfRVhFQ19QUkVGSVggQ09NUElMRVJfUEFUSCBMSUJSQVJZX1BBVEgiCi1maQotCi1BQ19MSUJUT09MX0RMT1BFTl9TRUxGCi0KLWlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICBjYXNlICRhcmNoaXZlX2NtZHMgaW4KLSAgKid+JyopCi0gICAgIyBGSVhNRTogd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpLWNvbW1hbmQgc2VxdWVuY2VzLgotICAgIDs7Ci0gICckQ0MgJyopCi0gICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQotICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYwotICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgotICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluXSkKLSAgICBBQ19DQUNIRV9WQUwoW2x0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjXSwKLSAgICBbJHJtIGNvbmZ0ZXN0KgotICAgIGVjaG8gJ3N0YXRpYyBpbnQgZHVtbXk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgICBzb25hbWU9Y29uZnRlc3QKLSAgICAgIGxpYj1jb25mdGVzdAotICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICAgICBkZXBsaWJzPQotICAgICAgd2w9JGx0X2N2X3Byb2dfY2Nfd2wKLSAgICAgIGNvbXBpbGVyX2ZsYWdzPS12Ci0gICAgICBsaW5rZXJfZmxhZ3M9LXYKLSAgICAgIHZlcnN0cmluZz0KLSAgICAgIG91dHB1dF9vYmpkaXI9LgotICAgICAgbGlibmFtZT1jb25mdGVzdAotICAgICAgc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPQotICAgICAgaWYgQUNfVFJZX0VWQUwoYXJjaGl2ZV9jbWRzIDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpCi0gICAgICB0aGVuCi0JbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KLSAgICAgIGVsc2UKLQlsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKLSAgICAgIGZpCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0kc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZwotICAgIGVsc2UKLSAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgIGZpCi0gICAgJHJtIGNvbmZ0ZXN0Kl0pCi0gICAgQUNfTVNHX1JFU1VMVChbJGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjXSkKLSAgICA7OwotICBlc2FjCi1maQotbmVlZF9sYz0ke2x0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjLXllc30KLQotIyBUaGUgc2Vjb25kIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKLSMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCi0jIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKLSMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgotaWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KLSAgOgotZWxzZQotICAjIElmIHRoZXJlIGlzIG5vIE1ha2VmaWxlIHlldCwgd2UgcmVseSBvbiBhIG1ha2UgcnVsZSB0byBleGVjdXRlCi0gICMgYGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrJyB0byByZXJ1biB0aGVzZSB0ZXN0cyBhbmQgY3JlYXRlIHRoZQotICAjIGxpYnRvb2wgc2NyaXB0IHRoZW4uCi0gIHRlc3QgLWYgTWFrZWZpbGUgJiYgbWFrZSAiJGx0bWFpbiIKLWZpCi0KLWlmIHRlc3QgLWYgIiRsdG1haW4iOyB0aGVuCi0gIHRyYXAgIiRybSBcIiR7b2ZpbGV9VFwiOyBleGl0IDEiIDEgMiAxNQotICAkcm0gLWYgIiR7b2ZpbGV9VCIKLQotICBlY2hvIGNyZWF0aW5nICRvZmlsZQotCi0gICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMgd2hpbGUgYmVpbmcKLSAgIyBjYXJlZnVsIG5vdCB0byBvdmVycXVvdGUgdGhlIEFDX1NVQlNUZWQgdmFsdWVzLiAgV2UgdGFrZSBjb3BpZXMgb2YgdGhlCi0gICMgdmFyaWFibGVzIGFuZCBxdW90ZSB0aGUgY29waWVzIGZvciBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdC4KLSAgZm9yIHZhciBpbiBlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIFNFRCBcCi0gICAgQVIgQVJfRkxBR1MgQ0MgTEQgTE5fUyBOTSBTSEVMTCBcCi0gICAgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgd2wgXAotICAgIHBpY19mbGFnIGxpbmtfc3RhdGljX2ZsYWcgbm9fYnVpbHRpbl9mbGFnIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyBcCi0gICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIGxpYm5hbWVfc3BlYyBcCi0gICAgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIFwKLSAgICBSQU5MSUIgb2xkX2FyY2hpdmVfY21kcyBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIG9sZF9wb3N0aW5zdGFsbF9jbWRzIFwKLSAgICBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIGFyY2hpdmVfY21kcyBhcmNoaXZlX2V4cHN5bV9jbWRzIHBvc3RpbnN0YWxsX2NtZHMgXAotICAgIHBvc3R1bmluc3RhbGxfY21kcyBleHRyYWN0X2V4cHN5bXNfY21kcyBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyBcCi0gICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGV4cG9ydF9zeW1ib2xzX2NtZHMgXAotICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kIGFsbG93X3VuZGVmaW5lZF9mbGFnIG5vX3VuZGVmaW5lZF9mbGFnIFwKLSAgICBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBnbG9iYWxfc3ltYm9sX3BpcGUgZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCi0gICAgZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yICBcCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKLSAgICBjb21waWxlcl9jX28gY29tcGlsZXJfb19sbyBuZWVkX2xvY2tzIGV4Y2x1ZGVfZXhwc3ltcyBpbmNsdWRlX2V4cHN5bXM7IGRvCi0KLSAgICBjYXNlICR2YXIgaW4KLSAgICByZWxvYWRfY21kcyB8IG9sZF9hcmNoaXZlX2NtZHMgfCBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIHwgXAotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBleHBvcnRfc3ltYm9sc19jbWRzIHwgYXJjaGl2ZV9jbWRzIHwgYXJjaGl2ZV9leHBzeW1fY21kcyB8IFwKLSAgICBleHRyYWN0X2V4cHN5bXNfY21kcyB8IG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIHwgXAotICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgZmluaXNoX2NtZHMgfCBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKLSAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgICopCi0gICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIGNhdCA8PF9fRU9GX18gPiAiJHtvZmlsZX1UIgotIyEgJFNIRUxMCi0KLSMgYCRlY2hvICIkb2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QKQotIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCi0jCi0jIENvcHlyaWdodCAoQykgMTk5Ni0yMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBPcmlnaW5hbGx5IGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgQSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQuCi1TRUQ9JGx0X1NFRAotCi0jIFNlZCB0aGF0IGhlbHBzIHVzIGF2b2lkIGFjY2lkZW50YWxseSB0cmlnZ2VyaW5nIGVjaG8oMSkgb3B0aW9ucyBsaWtlIC1uLgotWHNlZD0iJHtTRUR9IC1lIHMvXlgvLyIKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLWlmIHRlc3QgIlhcJHtDRFBBVEgrc2V0fSIgPSBYc2V0OyB0aGVuIENEUEFUSD06OyBleHBvcnQgQ0RQQVRIOyBmaQotCi0jICMjIyBCRUdJTiBMSUJUT09MIENPTkZJRwotCi0jIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0KLSMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KLVNIRUxMPSRsdF9TSEVMTAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgotYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRuZWVkX2xjCi0KLSMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgotZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCi0KLSMgVGhlIGhvc3Qgc3lzdGVtLgotaG9zdF9hbGlhcz0kaG9zdF9hbGlhcwotaG9zdD0kaG9zdAotCi0jIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KLWVjaG89JGx0X2VjaG8KLQotIyBUaGUgYXJjaGl2ZXIuCi1BUj0kbHRfQVIKLUFSX0ZMQUdTPSRsdF9BUl9GTEFHUwotCi0jIFRoZSBkZWZhdWx0IEMgY29tcGlsZXIuCi1DQz0kbHRfQ0MKLQotIyBJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBDIGNvbXBpbGVyPwotd2l0aF9nY2M9JEdDQwotCi0jIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCi1MRD0kbHRfTEQKLQotIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgotTE5fUz0kbHRfTE5fUwotCi0jIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KLU5NPSRsdF9OTQotCi0jIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCi1TVFJJUD0kU1RSSVAKLQotIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgotTUFHSUNfQ01EPSRNQUdJQ19DTUQKLQotIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCi1ETExUT09MPSIkRExMVE9PTCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KLU9CSkRVTVA9IiRPQkpEVU1QIgotCi0jIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCi1BUz0iJEFTIgotCi0jIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KLW9iamRpcj0kb2JqZGlyCi0KLSMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KLXJlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZwotcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCi0KLSMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KLXdsPSRsdF93bAotCi0jIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KLW9iamV4dD0iJGFjX29iamV4dCIKLQotIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCi1saWJleHQ9IiRsaWJleHQiCi0KLSMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgotZXhlZXh0PSIkZXhlZXh0IgotCi0jIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KLXBpY19mbGFnPSRsdF9waWNfZmxhZwotcGljX21vZGU9JHBpY19tb2RlCi0KLSMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPwotY29tcGlsZXJfY19vPSRsdF9jb21waWxlcl9jX28KLQotIyBDYW4gd2Ugd3JpdGUgZGlyZWN0bHkgdG8gYSAubG8gPwotY29tcGlsZXJfb19sbz0kbHRfY29tcGlsZXJfb19sbwotCi0jIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uID8KLW5lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKLQotIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPwotbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKLQotIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPwotbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KLQotIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKLQotIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgotbGlua19zdGF0aWNfZmxhZz0kbHRfbGlua19zdGF0aWNfZmxhZwotCi0jIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCi1ub19idWlsdGluX2ZsYWc9JGx0X25vX2J1aWx0aW5fZmxhZwotCi0jIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCi1leHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KLXRocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjCi0KLSMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCi12ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQotCi0jIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgotbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKLQotIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgotIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgotbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKLQotIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KLXNvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCi1SQU5MSUI9JGx0X1JBTkxJQgotb2xkX2FyY2hpdmVfY21kcz0kbHRfb2xkX2FyY2hpdmVfY21kcwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKLQotIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCi1hcmNoaXZlX2NtZHM9JGx0X2FyY2hpdmVfY21kcwotYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kcwotcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcwotcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCi1vbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgotc3RyaXBsaWI9JGx0X3N0cmlwbGliCi0KLSMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCi1kZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKLQotIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCi1maWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKLQotIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KLWFsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZwotCi0jIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCi1ub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWcKLQotIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCi1maW5pc2hfY21kcz0kbHRfZmluaXNoX2NtZHMKLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgotZmluaXNoX2V2YWw9JGx0X2ZpbmlzaF9ldmFsCi0KLSMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KLWdsb2JhbF9zeW1ib2xfcGlwZT0kbHRfZ2xvYmFsX3N5bWJvbF9waXBlCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgotZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcwotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KLXJ1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCi1zaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCi0KLSMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPwotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKLQotIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KLWhhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uCi0KLSMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KLWhhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCi0KLSMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgotIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYwotCi0jIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcgotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUuc28gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3QKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0wKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bwotIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXIKLQotIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKLSMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgotCi0jIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KLWxpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnMKLQotIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0KLSMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYwotCi0jIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCi1maXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aCIKLQotIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgotYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRhbHdheXNfZXhwb3J0X3N5bWJvbHMKLQotIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgotZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kcwotCi0jIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1leHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKLQotIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgotZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXMKLQotIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCi1pbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltcwotCi0jICMjIyBFTkQgTElCVE9PTCBDT05GSUcKLQotX19FT0ZfXwotCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgYWl4MyopCi0gICAgY2F0IDw8XEVPRiA+PiAiJHtvZmlsZX1UIgotCi0jIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKLSMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcwotIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgotaWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCi0gIENPTExFQ1RfTkFNRVM9Ci0gIGV4cG9ydCBDT0xMRUNUX05BTUVTCi1maQotRU9GCi0gICAgOzsKLSAgZXNhYwotCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKLSAgICBjYXQgPDwnRU9GJyA+PiAiJHtvZmlsZX1UIgotICAgICAgIyBUaGlzIGlzIGEgc291cmNlIHByb2dyYW0gdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBkbGxzIG9uIFdpbmRvd3MKLSAgICAgICMgRG9uJ3QgcmVtb3ZlIG5vciBtb2RpZnkgdGhlIHN0YXJ0aW5nIGFuZCBjbG9zaW5nIGNvbW1lbnRzCi0jIC8qIGx0ZGxsLmMgc3RhcnRzIGhlcmUgKi8KLSMgI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jICNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jICN1bmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCi0jICNpbmNsdWRlIDxzdGRpby5oPgotIwotIyAjaWZuZGVmIF9fQ1lHV0lOX18KLSMgIyAgaWZkZWYgX19DWUdXSU4zMl9fCi0jICMgICAgZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jICMgIGVuZGlmCi0jICNlbmRpZgotIwotIyAjaWZkZWYgX19jcGx1c3BsdXMKLSMgZXh0ZXJuICJDIiB7Ci0jICNlbmRpZgotIyBCT09MIEFQSUVOVFJZIERsbE1haW4gKEhJTlNUQU5DRSBoSW5zdCwgRFdPUkQgcmVhc29uLCBMUFZPSUQgcmVzZXJ2ZWQpOwotIyAjaWZkZWYgX19jcGx1c3BsdXMKLSMgfQotIyAjZW5kaWYKLSMKLSMgI2lmZGVmIF9fQ1lHV0lOX18KLSMgI2luY2x1ZGUgPGN5Z3dpbi9jeWd3aW5fZGxsLmg+Ci0jIERFQ0xBUkVfQ1lHV0lOX0RMTCggRGxsTWFpbiApOwotIyAjZW5kaWYKLSMgSElOU1RBTkNFIF9faERsbEluc3RhbmNlX2Jhc2U7Ci0jCi0jIEJPT0wgQVBJRU5UUlkKLSMgRGxsTWFpbiAoSElOU1RBTkNFIGhJbnN0LCBEV09SRCByZWFzb24sIExQVk9JRCByZXNlcnZlZCkKLSMgewotIyAgIF9faERsbEluc3RhbmNlX2Jhc2UgPSBoSW5zdDsKLSMgICByZXR1cm4gVFJVRTsKLSMgfQotIyAvKiBsdGRsbC5jIGVuZHMgaGVyZSAqLwotCSMgVGhpcyBpcyBhIHNvdXJjZSBwcm9ncmFtIHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgaW1wb3J0IGxpYnJhcmllcwotCSMgb24gV2luZG93cyBmb3IgZGxscyB3aGljaCBsYWNrIHRoZW0uIERvbid0IHJlbW92ZSBub3IgbW9kaWZ5IHRoZQotCSMgc3RhcnRpbmcgYW5kIGNsb3NpbmcgY29tbWVudHMKLSMgLyogaW1wZ2VuLmMgc3RhcnRzIGhlcmUgKi8KLSMgLyogICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBsaWJ0b29sLgotIwotIyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jICAqLwotIwotIyAjaW5jbHVkZSA8c3RkaW8uaD4JCS8qIGZvciBwcmludGYoKSAqLwotIyAjaW5jbHVkZSA8dW5pc3RkLmg+CQkvKiBmb3Igb3BlbigpLCBsc2VlaygpLCByZWFkKCkgKi8KLSMgI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiBmb3IgT19SRE9OTFksIE9fQklOQVJZICovCi0jICNpbmNsdWRlIDxzdHJpbmcuaD4JCS8qIGZvciBzdHJkdXAoKSAqLwotIwotIyAvKiBPX0JJTkFSWSBpc24ndCByZXF1aXJlZCAob3IgZXZlbiBkZWZpbmVkIHNvbWV0aW1lcykgdW5kZXIgVW5peCAqLwotIyAjaWZuZGVmIE9fQklOQVJZCi0jICNkZWZpbmUgT19CSU5BUlkgMAotIyAjZW5kaWYKLSMKLSMgc3RhdGljIHVuc2lnbmVkIGludAotIyBwZV9nZXQxNiAoZmQsIG9mZnNldCkKLSMgICAgICBpbnQgZmQ7Ci0jICAgICAgaW50IG9mZnNldDsKLSMgewotIyAgIHVuc2lnbmVkIGNoYXIgYlsyXTsKLSMgICBsc2VlayAoZmQsIG9mZnNldCwgU0VFS19TRVQpOwotIyAgIHJlYWQgKGZkLCBiLCAyKTsKLSMgICByZXR1cm4gYlswXSArIChiWzFdPDw4KTsKLSMgfQotIwotIyBzdGF0aWMgdW5zaWduZWQgaW50Ci0jIHBlX2dldDMyIChmZCwgb2Zmc2V0KQotIyAgICAgaW50IGZkOwotIyAgICAgaW50IG9mZnNldDsKLSMgewotIyAgIHVuc2lnbmVkIGNoYXIgYls0XTsKLSMgICBsc2VlayAoZmQsIG9mZnNldCwgU0VFS19TRVQpOwotIyAgIHJlYWQgKGZkLCBiLCA0KTsKLSMgICByZXR1cm4gYlswXSArIChiWzFdPDw4KSArIChiWzJdPDwxNikgKyAoYlszXTw8MjQpOwotIyB9Ci0jCi0jIHN0YXRpYyB1bnNpZ25lZCBpbnQKLSMgcGVfYXMzMiAocHRyKQotIyAgICAgIHZvaWQgKnB0cjsKLSMgewotIyAgIHVuc2lnbmVkIGNoYXIgKmIgPSBwdHI7Ci0jICAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCkgKyAoYlsyXTw8MTYpICsgKGJbM108PDI0KTsKLSMgfQotIwotIyBpbnQKLSMgbWFpbiAoYXJnYywgYXJndikKLSMgICAgIGludCBhcmdjOwotIyAgICAgY2hhciAqYXJndltdOwotIyB7Ci0jICAgICBpbnQgZGxsOwotIyAgICAgdW5zaWduZWQgbG9uZyBwZV9oZWFkZXJfb2Zmc2V0LCBvcHRoZHJfb2ZzLCBudW1fZW50cmllcywgaTsKLSMgICAgIHVuc2lnbmVkIGxvbmcgZXhwb3J0X3J2YSwgZXhwb3J0X3NpemUsIG5zZWN0aW9ucywgc2VjcHRyLCBleHBwdHI7Ci0jICAgICB1bnNpZ25lZCBsb25nIG5hbWVfcnZhcywgbmV4cDsKLSMgICAgIHVuc2lnbmVkIGNoYXIgKmV4cGRhdGEsICplcnZhOwotIyAgICAgY2hhciAqZmlsZW5hbWUsICpkbGxfbmFtZTsKLSMKLSMgICAgIGZpbGVuYW1lID0gYXJndlsxXTsKLSMKLSMgICAgIGRsbCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZfE9fQklOQVJZKTsKLSMgICAgIGlmIChkbGwgPCAxKQotIyAJcmV0dXJuIDE7Ci0jCi0jICAgICBkbGxfbmFtZSA9IGZpbGVuYW1lOwotIwotIyAgICAgZm9yIChpPTA7IGZpbGVuYW1lW2ldOyBpKyspCi0jIAlpZiAoZmlsZW5hbWVbaV0gPT0gJy8nIHx8IGZpbGVuYW1lW2ldID09ICdcXCcgIHx8IGZpbGVuYW1lW2ldID09ICc6JykKLSMgCSAgICBkbGxfbmFtZSA9IGZpbGVuYW1lICsgaSArMTsKLSMKLSMgICAgIHBlX2hlYWRlcl9vZmZzZXQgPSBwZV9nZXQzMiAoZGxsLCAweDNjKTsKLSMgICAgIG9wdGhkcl9vZnMgPSBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIwOwotIyAgICAgbnVtX2VudHJpZXMgPSBwZV9nZXQzMiAoZGxsLCBvcHRoZHJfb2ZzICsgOTIpOwotIwotIyAgICAgaWYgKG51bV9lbnRyaWVzIDwgMSkgLyogbm8gZXhwb3J0cyAqLwotIyAJcmV0dXJuIDE7Ci0jCi0jICAgICBleHBvcnRfcnZhID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDk2KTsKLSMgICAgIGV4cG9ydF9zaXplID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDEwMCk7Ci0jICAgICBuc2VjdGlvbnMgPSBwZV9nZXQxNiAoZGxsLCBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArMik7Ci0jICAgICBzZWNwdHIgPSAocGVfaGVhZGVyX29mZnNldCArIDQgKyAyMCArCi0jIAkgICAgICBwZV9nZXQxNiAoZGxsLCBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDE2KSk7Ci0jCi0jICAgICBleHBwdHIgPSAwOwotIyAgICAgZm9yIChpID0gMDsgaSA8IG5zZWN0aW9uczsgaSsrKQotIyAgICAgewotIyAJY2hhciBzbmFtZVs4XTsKLSMgCXVuc2lnbmVkIGxvbmcgc2VjcHRyMSA9IHNlY3B0ciArIDQwICogaTsKLSMgCXVuc2lnbmVkIGxvbmcgdmFkZHIgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMTIpOwotIyAJdW5zaWduZWQgbG9uZyB2c2l6ZSA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxNik7Ci0jIAl1bnNpZ25lZCBsb25nIGZwdHIgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMjApOwotIyAJbHNlZWsoZGxsLCBzZWNwdHIxLCBTRUVLX1NFVCk7Ci0jIAlyZWFkKGRsbCwgc25hbWUsIDgpOwotIyAJaWYgKHZhZGRyIDw9IGV4cG9ydF9ydmEgJiYgdmFkZHIrdnNpemUgPiBleHBvcnRfcnZhKQotIyAJewotIyAJICAgIGV4cHB0ciA9IGZwdHIgKyAoZXhwb3J0X3J2YSAtIHZhZGRyKTsKLSMgCSAgICBpZiAoZXhwb3J0X3J2YSArIGV4cG9ydF9zaXplID4gdmFkZHIgKyB2c2l6ZSkKLSMgCQlleHBvcnRfc2l6ZSA9IHZzaXplIC0gKGV4cG9ydF9ydmEgLSB2YWRkcik7Ci0jIAkgICAgYnJlYWs7Ci0jIAl9Ci0jICAgICB9Ci0jCi0jICAgICBleHBkYXRhID0gKHVuc2lnbmVkIGNoYXIqKW1hbGxvYyhleHBvcnRfc2l6ZSk7Ci0jICAgICBsc2VlayAoZGxsLCBleHBwdHIsIFNFRUtfU0VUKTsKLSMgICAgIHJlYWQgKGRsbCwgZXhwZGF0YSwgZXhwb3J0X3NpemUpOwotIyAgICAgZXJ2YSA9IGV4cGRhdGEgLSBleHBvcnRfcnZhOwotIwotIyAgICAgbmV4cCA9IHBlX2FzMzIgKGV4cGRhdGErMjQpOwotIyAgICAgbmFtZV9ydmFzID0gcGVfYXMzMiAoZXhwZGF0YSszMik7Ci0jCi0jICAgICBwcmludGYgKCJFWFBPUlRTXG4iKTsKLSMgICAgIGZvciAoaSA9IDA7IGk8bmV4cDsgaSsrKQotIyAgICAgewotIyAJdW5zaWduZWQgbG9uZyBuYW1lX3J2YSA9IHBlX2FzMzIgKGVydmErbmFtZV9ydmFzK2kqNCk7Ci0jIAlwcmludGYgKCJcdCVzIEAgJWxkIDtcbiIsIGVydmErbmFtZV9ydmEsIDErIGkpOwotIyAgICAgfQotIwotIyAgICAgcmV0dXJuIDA7Ci0jIH0KLSMgLyogaW1wZ2VuLmMgZW5kcyBoZXJlICovCi0KLUVPRgotICAgIDs7Ci0gIGVzYWMKLQotICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKLSAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgotICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQotICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPwotICBzZWQgJyRxJyAiJGx0bWFpbiIgPj4gIiR7b2ZpbGV9VCIgfHwgKHJtIC1mICIke29maWxlfVQiOyBleGl0IDEpCi0KLSAgbXYgLWYgIiR7b2ZpbGV9VCIgIiRvZmlsZSIgfHwgXAotICAgIChybSAtZiAiJG9maWxlIiAmJiBjcCAiJHtvZmlsZX1UIiAiJG9maWxlIiAmJiBybSAtZiAiJHtvZmlsZX1UIikKLSAgY2htb2QgK3ggIiRvZmlsZSIKLWZpCi0KLV0pIyBfTFRfQUNfTFRDT05GSUdfSEFDSwotCi0jIEFDX0xJQlRPT0xfRExPUEVOIC0gZW5hYmxlIGNoZWNrcyBmb3IgZGxvcGVuIHN1cHBvcnQKLUFDX0RFRlVOKFtBQ19MSUJUT09MX0RMT1BFTl0sIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pXSkKLQotIyBBQ19MSUJUT09MX1dJTjMyX0RMTCAtIGRlY2xhcmUgcGFja2FnZSBzdXBwb3J0IGZvciBidWlsZGluZyB3aW4zMiBkbGwncwotQUNfREVGVU4oW0FDX0xJQlRPT0xfV0lOMzJfRExMXSwgW0FDX0JFRk9SRShbJDBdLCBbQUNfTElCVE9PTF9TRVRVUF0pXSkKLQotIyBBQ19FTkFCTEVfU0hBUkVEIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NIQVJFRFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihbQUNfRU5BQkxFX1NIQVJFRF0sCi1bZGVmaW5lKFtBQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc2hhcmVkLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAkZW5hYmxldmFsIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX3NoYXJlZD1BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0RJU0FCTEVfU0hBUkVEIC0gc2V0IHRoZSBkZWZhdWx0IHNoYXJlZCBmbGFnIHRvIC0tZGlzYWJsZS1zaGFyZWQKLUFDX0RFRlVOKFtBQ19ESVNBQkxFX1NIQVJFRF0sCi1bQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotQUNfRU5BQkxFX1NIQVJFRChubyldKQotCi0jIEFDX0VOQUJMRV9TVEFUSUMgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU1RBVElDWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKFtBQ19FTkFCTEVfU1RBVElDXSwKLVtkZWZpbmUoW0FDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzdGF0aWMsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICRlbmFibGV2YWwgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc3RhdGljPUFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TVEFUSUMgLSBzZXQgdGhlIGRlZmF1bHQgc3RhdGljIGZsYWcgdG8gLS1kaXNhYmxlLXN0YXRpYwotQUNfREVGVU4oW0FDX0RJU0FCTEVfU1RBVElDXSwKLVtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi1BQ19FTkFCTEVfU1RBVElDKG5vKV0pCi0KLQotIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1mYXN0LWluc3RhbGwgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0sCi1bZGVmaW5lKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoZmFzdC1pbnN0YWxsLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD0+PkFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICRlbmFibGV2YWwgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfZmFzdF9pbnN0YWxsPUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9GQVNUX0lOU1RBTEwgLSBzZXQgdGhlIGRlZmF1bHQgdG8gLS1kaXNhYmxlLWZhc3QtaW5zdGFsbAotQUNfREVGVU4oW0FDX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSwKLVtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi1BQ19FTkFCTEVfRkFTVF9JTlNUQUxMKG5vKV0pCi0KLSMgQUNfTElCVE9PTF9QSUNNT0RFIC0gaW1wbGVtZW50IHRoZSAtLXdpdGgtcGljIGZsYWcKLSMgVXNhZ2U6IEFDX0xJQlRPT0xfUElDTU9ERVsoTU9ERSldCi0jICAgV2hlcmUgTU9ERSBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYGJvdGgnLgotQUNfREVGVU4oW0FDX0xJQlRPT0xfUElDTU9ERV0sCi1bQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotcGljX21vZGU9aWZlbHNlKCQjLDEsJDEsZGVmYXVsdCldKQotCi0KLSMgQUNfUEFUSF9UT09MX1BSRUZJWCAtIGZpbmQgYSBmaWxlIHByb2dyYW0gd2hpY2ggY2FuIHJlY29nbmlzZSBzaGFyZWQgbGlicmFyeQotQUNfREVGVU4oW0FDX1BBVEhfVE9PTF9QUkVGSVhdLAotW0FDX01TR19DSEVDS0lORyhbZm9yICQxXSkKLUFDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX01BR0lDX0NNRCwKLVtjYXNlICRNQUdJQ19DTUQgaW4KLSAgLyopCi0gIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikKLSAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgYWNfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCi0gIElGUz0iJHtJRlM9ICAgfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotZG5sICRhY19kdW1teSBmb3JjZXMgc3BsaXR0aW5nIG9uIGNvbnN0YW50IHVzZXItc3VwcGxpZWQgcGF0aHMuCi1kbmwgUE9TSVguMiB3b3JkIHNwbGl0dGluZyBpcyBkb25lIG9ubHkgb24gdGhlIG91dHB1dCBvZiB3b3JkIGV4cGFuc2lvbnMsCi1kbmwgbm90IGV2ZXJ5IHdvcmQuICBUaGlzIGNsb3NlcyBhIGxvbmdzdGFuZGluZyBzaCBzZWN1cml0eSBob2xlLgotICBhY19kdW1teT0iaWZlbHNlKFskMl0sICwgJFBBVEgsIFskMl0pIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kMTsgdGhlbgotICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvJDEiCi0gICAgICBpZiB0ZXN0IC1uICIkZmlsZV9tYWdpY190ZXN0X2ZpbGUiOyB0aGVuCi0JY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLQkiZmlsZV9tYWdpYyAiKikKLQkgIGZpbGVfbWFnaWNfcmVnZXg9ImBleHByIFwiJGRlcGxpYnNfY2hlY2tfbWV0aG9kXCIgOiBcImZpbGVfbWFnaWMgXCguKlwpXCJgIgotCSAgTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCi0JICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcJGZpbGVfbWFnaWNfdGVzdF9maWxlIDI+IC9kZXYvbnVsbCB8Ci0JICAgIGVncmVwICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgOgotCSAgZWxzZQotCSAgICBjYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAotKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgotKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCi0qKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKLSoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAotKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQotKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bwotKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKLQotRU9GCi0JICBmaSA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIE1BR0lDX0NNRD0iJGFjX3NhdmVfTUFHSUNfQ01EIgotICA7OwotZXNhY10pCi1NQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKLWlmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoJE1BR0lDX0NNRCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi1dKQotCi0KLSMgQUNfUEFUSF9NQUdJQyAtIGZpbmQgYSBmaWxlIHByb2dyYW0gd2hpY2ggY2FuIHJlY29nbmlzZSBhIHNoYXJlZCBsaWJyYXJ5Ci1BQ19ERUZVTihbQUNfUEFUSF9NQUdJQ10sCi1bQUNfUkVRVUlSRShbQUNfQ0hFQ0tfVE9PTF9QUkVGSVhdKWRubAotQUNfUEFUSF9UT09MX1BSRUZJWCgke2FjX3Rvb2xfcHJlZml4fWZpbGUsIC91c3IvYmluOiRQQVRIKQotaWYgdGVzdCAteiAiJGx0X2N2X3BhdGhfTUFHSUNfQ01EIjsgdGhlbgotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICAgQUNfUEFUSF9UT09MX1BSRUZJWChmaWxlLCAvdXNyL2JpbjokUEFUSCkKLSAgZWxzZQotICAgIE1BR0lDX0NNRD06Ci0gIGZpCi1maQotXSkKLQotCi0jIEFDX1BST0dfTEQgLSBmaW5kIHRoZSBwYXRoIHRvIHRoZSBHTlUgb3Igbm9uLUdOVSBsaW5rZXIKLUFDX0RFRlVOKFtBQ19QUk9HX0xEXSwKLVtBQ19BUkdfV0lUSChnbnUtbGQsCi1bICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dXSwKLXRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcywgd2l0aF9nbnVfbGQ9bm8pCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1BQ19SRVFVSVJFKFtfTFRfQUNfTElCVE9PTF9TWVNfUEFUSF9TRVBBUkFUT1JdKWRubAotYWNfcHJvZz1sZAotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgR0NDXSkKLSAgY2FzZSAkaG9zdCBpbgotICAqLSotbWluZ3cqKQotICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKLSAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7Ci0gICopCi0gICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OwotICBlc2FjCi0gIGNhc2UgJGFjX3Byb2cgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICBbW1xcL11dKiB8IFtbQS1aYS16XV06W1tcXC9dXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bW14vXV1bW14vXV0qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCi1lbHNlCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQotZmkKLUFDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX0xELAotW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgotICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmldKQotTEQ9IiRsdF9jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRMRCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi10ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQotQUNfUFJPR19MRF9HTlUKLV0pCi0KLSMgQUNfUFJPR19MRF9HTlUgLQotQUNfREVGVU4oW0FDX1BST0dfTERfR05VXSwKLVtBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBsdF9jdl9wcm9nX2dudV9sZCwKLVsjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgbHRfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpXSkKLXdpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAotXSkKLQotIyBBQ19QUk9HX0xEX1JFTE9BRF9GTEFHIC0gZmluZCByZWxvYWQgZmxhZyBmb3IgbGlua2VyCi0jICAgLS0gUE9SVE1FIFNvbWUgbGlua2VycyBtYXkgbmVlZCBhIGRpZmZlcmVudCByZWxvYWQgZmxhZy4KLUFDX0RFRlVOKFtBQ19QUk9HX0xEX1JFTE9BRF9GTEFHXSwKLVtBQ19DQUNIRV9DSEVDSyhbZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlc10sIGx0X2N2X2xkX3JlbG9hZF9mbGFnLAotW2x0X2N2X2xkX3JlbG9hZF9mbGFnPSctciddKQotcmVsb2FkX2ZsYWc9JGx0X2N2X2xkX3JlbG9hZF9mbGFnCi10ZXN0IC1uICIkcmVsb2FkX2ZsYWciICYmIHJlbG9hZF9mbGFnPSIgJHJlbG9hZF9mbGFnIgotXSkKLQotIyBBQ19ERVBMSUJTX0NIRUNLX01FVEhPRCAtIGhvdyB0byBjaGVjayBmb3IgbGlicmFyeSBkZXBlbmRlbmNpZXMKLSMgIC0tIFBPUlRNRSBmaWxsIGluIHdpdGggdGhlIGR5bmFtaWMgbGlicmFyeSBjaGFyYWN0ZXJpc3RpY3MKLUFDX0RFRlVOKFtBQ19ERVBMSUJTX0NIRUNLX01FVEhPRF0sCi1bQUNfQ0FDSEVfQ0hFQ0soW2hvdyB0byByZWNvZ25pc2UgZGVwZW5kZW50IGxpYnJhcmllc10sCi1sdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCwKLVtsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE1BR0lDX0NNRCcKLWx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPQotbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J3Vua25vd24nCi0jIE5lZWQgdG8gc2V0IHRoZSBwcmVjZWRpbmcgdmFyaWFibGUgb24gYWxsIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQKLSMgaW50ZXJsaWJyYXJ5IGRlcGVuZGVuY2llcy4KLSMgJ25vbmUnIC0tIGRlcGVuZGVuY2llcyBub3Qgc3VwcG9ydGVkLgotIyBgdW5rbm93bicgLS0gc2FtZSBhcyBub25lLCBidXQgZG9jdW1lbnRzIHRoYXQgd2UgcmVhbGx5IGRvbid0IGtub3cuCi0jICdwYXNzX2FsbCcgLS0gYWxsIGRlcGVuZGVuY2llcyBwYXNzZWQgd2l0aCBubyBjaGVja3MuCi0jICd0ZXN0X2NvbXBpbGUnIC0tIGNoZWNrIGJ5IG1ha2luZyB0ZXN0IHByb2dyYW0uCi0jICdmaWxlX21hZ2ljIFtbcmVnZXhdXScgLS0gY2hlY2sgYnkgbG9va2luZyBmb3IgZmlsZXMgaW4gbGlicmFyeSBwYXRoCi0jIHdoaWNoIHJlc3BvbmRzIHRvIHRoZSAkZmlsZV9tYWdpY19jbWQgd2l0aCBhIGdpdmVuIGVncmVwIHJlZ2V4LgotIyBJZiB5b3UgaGF2ZSBgZmlsZScgb3IgZXF1aXZhbGVudCBvbiB5b3VyIHN5c3RlbSBhbmQgeW91J3JlIG5vdCBzdXJlCi0jIHdoZXRoZXIgYHBhc3NfYWxsJyB3aWxsICphbHdheXMqIHdvcmssIHlvdSBwcm9iYWJseSB3YW50IHRoaXMgb25lLgotCi1jYXNlICRob3N0X29zIGluCi1haXg0KiB8IGFpeDUqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1iZW9zKikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotYnNkaTQqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiknCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvdXNyL2Jpbi9maWxlIC1MJwotICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vc2hsaWIvbGliYy5zbwotICA7OwotCi1jeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlaSotaTM4NiguKmFyY2hpdGVjdHVyZTogaTM4Nik/JwotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE9CSkRVTVAgLWYnCi0gIDs7Ci0KLWRhcndpbiogfCByaGFwc29keSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIE1hY2gtTyBkeW5hbWljYWxseSBsaW5rZWQgc2hhcmVkIGxpYnJhcnknCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvdXNyL2Jpbi9maWxlIC1MJwotICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgcmhhcHNvZHkqIHwgZGFyd2luMS5bWzAxMl1dKQotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL1N5c3RlbS5mcmFtZXdvcmsvVmVyc2lvbnMvKi9TeXN0ZW0gfCBoZWFkIC0xYAotICAgIDs7Ci0gICopICMgRGFyd2luIDEuMyBvbgotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPScvdXNyL2xpYi9saWJTeXN0ZW0uZHlsaWInCi0gICAgOzsKLSAgZXNhYwotICA7OwotCi1mcmVlYnNkKikKLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KLSAgICBjYXNlICRob3N0X2NwdSBpbgotICAgIGkqODYgKQotICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBPcGVuQlNEIGhlcmUgd2FzIGEgbWlzdGFrZS4KLSAgICAgICMgTGV0J3MgYWNjZXB0IGJvdGggb2YgdGhlbSB1bnRpbCB0aGlzIGlzIGNsZWFyZWQgdXAuCi0gICAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoRnJlZUJTRHxPcGVuQlNEKS9pW1szLTldXTg2IChjb21wYWN0ICk/ZGVtYW5kIHBhZ2VkIHNoYXJlZCBsaWJyYXJ5JwotICAgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICAgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zby4qYAotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICBmaQotICA7OwotCi1nbnUqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1ocHV4MTAuMjAqfGhwdXgxMSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzW1swLTldXVtbMC05XV1bWzAtOV1dfFBBLVJJU0NbWzAtOV1dLltbMC05XV0pIHNoYXJlZCBsaWJyYXJ5JwotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBpcml4NSogfCBub25zdG9wdXgqKQotICAgICMgdGhpcyB3aWxsIGJlIG92ZXJyaWRkZW4gd2l0aCBwYXNzX2FsbCwgYnV0IGxldCB1cyBrZWVwIGl0IGp1c3QgaW4gY2FzZQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiAzMi1iaXQgTVNCIGR5bmFtaWMgbGliIE1JUFMgLSB2ZXJzaW9uIDEiCi0gICAgOzsKLSAgKikKLSAgICBjYXNlICRMRCBpbgotICAgICotMzJ8KiItMzIgIikgbGlibWFnaWM9MzItYml0OzsKLSAgICAqLW4zMnwqIi1uMzIgIikgbGlibWFnaWM9TjMyOzsKLSAgICAqLTY0fCoiLTY0ICIpIGxpYm1hZ2ljPTY0LWJpdDs7Ci0gICAgKikgbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICAgIGVzYWMKLSAgICAjIHRoaXMgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGggcGFzc19hbGwsIGJ1dCBsZXQgdXMga2VlcCBpdCBqdXN0IGluIGNhc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgJHtsaWJtYWdpY30gTVNCIG1pcHMtW1sxMjM0XV0gZHluYW1pYyBsaWIgTUlQUyAtIHZlcnNpb24gMSIKLSAgICA7OwotICBlc2FjCi0gIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC9saWIke2xpYnN1ZmZ9L2xpYmMuc28qYAotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi0jIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCi1saW51eC1nbnUqKQotICBjYXNlICRob3N0X2NwdSBpbgotICBhbHBoYSogfCBocHBhKiB8IGkqODYgfCBtaXBzIHwgbWlwc2VsIHwgcG93ZXJwYyogfCBzcGFyYyogfCBpYTY0KiB8IHMzOTAqIHwgeDg2XzY0KikKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbCA7OwotICAqKQotICAgICMgZ2xpYmMgdXAgdG8gMi4xLjEgZG9lcyBub3QgcGVyZm9ybSBzb21lIHJlbG9jYXRpb25zIG9uIEFSTQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTE1dXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliICknIDs7Ci0gIGVzYWMKLSAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL2xpYi9saWJjLnNvKiAvbGliL2xpYmMtKi5zb2AKLSAgOzsKLQotbmV0YnNkKikKLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL1wuXV0rXC5zb1wuW1swLTldXStcLltbMC05XV0rJCcKLSAgZWxzZQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXC5dXStcLnNvJCcKLSAgZmkKLSAgOzsKLQotbmV3b3M2KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKGV4ZWN1dGFibGV8ZHluYW1pYyBsaWIpJwotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYm5scy5zbwotICA7OwotCi1vcGVuYnNkKikKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvLipgCi0gIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTE1dXVNCIHNoYXJlZCBvYmplY3QnCi0gIGVsc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBPcGVuQlNELiogc2hhcmVkIGxpYnJhcnknCi0gIGZpCi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgIyB0aGlzIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aXRoIHBhc3NfYWxsLCBidXQgbGV0IHVzIGtlZXAgaXQganVzdCBpbiBjYXNlCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIENPRkYgZm9ybWF0IGFscGhhIHNoYXJlZCBsaWJyYXJ5JwotICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vc2hsaWIvbGliYy5zbwotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1zY28zLjJ2NSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLXNvbGFyaXMqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vbGliL2xpYmMuc28KLSAgOzsKLQotc3lzdjV1d1tbNzhdXSogfCBzeXN2NCp1dzIqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1zeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCi0gIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0gIG1vdG9yb2xhKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKSBNW1swLTldXVtbMC05XV0qIFZlcnNpb24gW1swLTldXScKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvKmAKLSAgICA7OwotICBuY3IpCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgICA7OwotICBzZXF1ZW50KQotICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tMTV1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIgKScKLSAgICA7OwotICBzbmkpCi0gICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW0xNXV1TQiBkeW5hbWljIGxpYiIKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vbGliL2xpYmMuc28KLSAgICA7OwotICBzaWVtZW5zKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gICAgOzsKLSAgZXNhYwotICA7OwotZXNhYwotXSkKLWZpbGVfbWFnaWNfY21kPSRsdF9jdl9maWxlX21hZ2ljX2NtZAotZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kCi1dKQotCi0KLSMgQUNfUFJPR19OTSAtIGZpbmQgdGhlIHBhdGggdG8gYSBCU0QtY29tcGF0aWJsZSBuYW1lIGxpc3RlcgotQUNfREVGVU4oW0FDX1BST0dfTk1dLAotW0FDX1JFUVVJUkUoW19MVF9BQ19MSUJUT09MX1NZU19QQVRIX1NFUEFSQVRPUl0pZG5sCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBCU0QtY29tcGF0aWJsZSBubV0pCi1BQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9OTSwKLVtpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBsdF9jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICB0bXBfbm09JGFjX2Rpci8ke2FjX3Rvb2xfcHJlZml4fW5tCi0gICAgaWYgdGVzdCAtZiAkdG1wX25tIHx8IHRlc3QgLWYgJHRtcF9ubSRhY19leGVleHQgOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICAjIFRydTY0J3Mgbm0gY29tcGxhaW5zIHRoYXQgL2Rldi9udWxsIGlzIGFuIGludmFsaWQgb2JqZWN0IGZpbGUKLSAgICAgIGlmICgkdG1wX25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAnKC9kZXYvbnVsbHxJbnZhbGlkIGZpbGUgb3Igb2JqZWN0IHR5cGUpJyA+L2Rldi9udWxsOyB0aGVuCi0JbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJHRtcF9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JbHRfY3ZfcGF0aF9OTT0ke2x0X2N2X3BhdGhfTk09IiR0bXBfbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9OTSIgJiYgbHRfY3ZfcGF0aF9OTT1ubQotZmldKQotTk09IiRsdF9jdl9wYXRoX05NIgotQUNfTVNHX1JFU1VMVChbJE5NXSkKLV0pCi0KLSMgQUNfQ0hFQ0tfTElCTSAtIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKLUFDX0RFRlVOKFtBQ19DSEVDS19MSUJNXSwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1MSUJNPQotY2FzZSAkaG9zdCBpbgotKi0qLWJlb3MqIHwgKi0qLWN5Z3dpbiogfCAqLSotcHczMiopCi0gICMgVGhlc2Ugc3lzdGVtIGRvbid0IGhhdmUgbGlibQotICA7OwotKi1uY3Itc3lzdjQuMyopCi0gIEFDX0NIRUNLX0xJQihtdywgX213dmFsaWRjaGVja2wsIExJQk09Ii1sbXciKQotICBBQ19DSEVDS19MSUIobSwgbWFpbiwgTElCTT0iJExJQk0gLWxtIikKLSAgOzsKLSopCi0gIEFDX0NIRUNLX0xJQihtLCBtYWluLCBMSUJNPSItbG0iKQotICA7OwotZXNhYwotXSkKLQotIyBBQ19MSUJMVERMX0NPTlZFTklFTkNFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgY29udmVuaWVuY2UgbGlicmFyeSBhbmQgTFRETElOQ0wgdG8gdGhlIGluY2x1ZGUgZmxhZ3MgZm9yCi0jIHRoZSBsaWJsdGRsIGhlYWRlciBhbmQgYWRkcyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIHRvIHRoZQotIyBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgYW5kIExURExJTkNMIGFyZSBub3QKLSMgQUNfU1VCU1RlZCwgbm9yIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QKLSMgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgYGxpYmx0ZGwnLiAgTElCTFRETCB3aWxsIGJlIHByZWZpeGVkCi0jIHdpdGggJyR7dG9wX2J1aWxkZGlyfS8nIGFuZCBMVERMSU5DTCB3aWxsIGJlIHByZWZpeGVkIHdpdGgKLSMgJyR7dG9wX3NyY2Rpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpLiAgSWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0IGFuZCB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFuZAotIyB0b3Bfc3JjZGlyIGFwcHJvcHJpYXRlbHkgaW4gdGhlIE1ha2VmaWxlcy4KLUFDX0RFRlVOKFtBQ19MSUJMVERMX0NPTlZFTklFTkNFXSwKLVtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0gIGNhc2UgJGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlIGluCi0gIG5vKSBBQ19NU0dfRVJST1IoW3RoaXMgcGFja2FnZSBuZWVkcyBhIGNvbnZlbmllbmNlIGxpYmx0ZGxdKSA7OwotICAiIikgZW5hYmxlX2x0ZGxfY29udmVuaWVuY2U9eWVzCi0gICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UiIDs7Ci0gIGVzYWMKLSAgTElCTFRETD0nJHt0b3BfYnVpbGRkaXJ9LydpZmVsc2UoJCMsMSxbJDFdLFsnbGlibHRkbCddKS9saWJsdGRsYy5sYQotICBMVERMSU5DTD0nLUkke3RvcF9zcmNkaXJ9LydpZmVsc2UoJCMsMSxbJDFdLFsnbGlibHRkbCddKQotICAjIEZvciBiYWNrd2FyZHMgbm9uLWdldHRleHQgY29uc2lzdGVudCBjb21wYXRpYmlsaXR5Li4uCi0gIElOQ0xUREw9IiRMVERMSU5DTCIKLV0pCi0KLSMgQUNfTElCTFRETF9JTlNUQUxMQUJMRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCi0jIHRoZSBsaWJsdGRsIGluc3RhbGxhYmxlIGxpYnJhcnkgYW5kIExURExJTkNMIHRvIHRoZSBpbmNsdWRlIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBoZWFkZXIgYW5kIGFkZHMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvIHRoZSBjb25maWd1cmUKLSMgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgYW5kIExURExJTkNMIGFyZSBub3QgQUNfU1VCU1RlZCwgbm9yIGlzCi0jIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQgYW5kIGFuIGluc3RhbGxlZAotIyBsaWJsdGRsIGlzIG5vdCBmb3VuZCwgaXQgaXMgYXNzdW1lZCB0byBiZSBgbGlibHRkbCcuICBMSUJMVERMIHdpbGwKLSMgYmUgcHJlZml4ZWQgd2l0aCAnJHt0b3BfYnVpbGRkaXJ9LycgYW5kIExURExJTkNMIHdpbGwgYmUgcHJlZml4ZWQKLSMgd2l0aCAnJHt0b3Bfc3JjZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkuICBJZiB5b3VyIHBhY2thZ2UgaXMKLSMgbm90IGZsYXQgYW5kIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYW5kCi0jIHRvcF9zcmNkaXIgYXBwcm9wcmlhdGVseSBpbiB0aGUgTWFrZWZpbGVzLgotIyBJbiB0aGUgZnV0dXJlLCB0aGlzIG1hY3JvIG1heSBoYXZlIHRvIGJlIGNhbGxlZCBhZnRlciBBQ19QUk9HX0xJQlRPT0wuCi1BQ19ERUZVTihbQUNfTElCTFRETF9JTlNUQUxMQUJMRV0sCi1bQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotICBBQ19DSEVDS19MSUIobHRkbCwgbWFpbiwKLSAgW3Rlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgIT0geHllcyAmJiBlbmFibGVfbHRkbF9pbnN0YWxsPW5vXSwKLSAgW2lmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgPSB4bm87IHRoZW4KLSAgICAgQUNfTVNHX1dBUk4oW2xpYmx0ZGwgbm90IGluc3RhbGxlZCwgYnV0IGluc3RhbGxhdGlvbiBkaXNhYmxlZF0pCi0gICBlbHNlCi0gICAgIGVuYWJsZV9sdGRsX2luc3RhbGw9eWVzCi0gICBmaQotICBdKQotICBpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiID0geCJ5ZXMiOyB0aGVuCi0gICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWluc3RhbGwiCi0gICAgTElCTFRETD0nJHt0b3BfYnVpbGRkaXJ9LydpZmVsc2UoJCMsMSxbJDFdLFsnbGlibHRkbCddKS9saWJsdGRsLmxhCi0gICAgTFRETElOQ0w9Jy1JJHt0b3Bfc3JjZGlyfS8naWZlbHNlKCQjLDEsWyQxXSxbJ2xpYmx0ZGwnXSkKLSAgZWxzZQotICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsPW5vIgotICAgIExJQkxUREw9Ii1sbHRkbCIKLSAgICBMVERMSU5DTD0KLSAgZmkKLSAgIyBGb3IgYmFja3dhcmRzIG5vbi1nZXR0ZXh0IGNvbnNpc3RlbnQgY29tcGF0aWJpbGl0eS4uLgotICBJTkNMVERMPSIkTFRETElOQ0wiCi1dKQotCi0jIG9sZCBuYW1lcwotQUNfREVGVU4oW0FNX1BST0dfTElCVE9PTF0sICAgW0FDX1BST0dfTElCVE9PTF0pCi1BQ19ERUZVTihbQU1fRU5BQkxFX1NIQVJFRF0sICBbQUNfRU5BQkxFX1NIQVJFRCgkQCldKQotQUNfREVGVU4oW0FNX0VOQUJMRV9TVEFUSUNdLCAgW0FDX0VOQUJMRV9TVEFUSUMoJEApXSkKLUFDX0RFRlVOKFtBTV9ESVNBQkxFX1NIQVJFRF0sIFtBQ19ESVNBQkxFX1NIQVJFRCgkQCldKQotQUNfREVGVU4oW0FNX0RJU0FCTEVfU1RBVElDXSwgW0FDX0RJU0FCTEVfU1RBVElDKCRAKV0pCi1BQ19ERUZVTihbQU1fUFJPR19MRF0sICAgICAgICBbQUNfUFJPR19MRF0pCi1BQ19ERUZVTihbQU1fUFJPR19OTV0sICAgICAgICBbQUNfUFJPR19OTV0pCi0KLSMgVGhpcyBpcyBqdXN0IHRvIHNpbGVuY2UgYWNsb2NhbCBhYm91dCB0aGUgbWFjcm8gbm90IGJlaW5nIHVzZWQKLWlmZWxzZShbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdKQotCi0jIE5PVEU6IFRoaXMgbWFjcm8gaGFzIGJlZW4gc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW50byAgICMKLSMgIEdOVSBBdXRvY29uZiBhcyBBQ19QUk9HX1NFRC4gIFdoZW4gaXQgaXMgYXZhaWxhYmxlIGluICAgIwotIyAgYSByZWxlYXNlZCB2ZXJzaW9uIG9mIEF1dG9jb25mIHdlIHNob3VsZCByZW1vdmUgdGhpcyAgICAjCi0jICBtYWNybyBhbmQgdXNlIGl0IGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLSMgTFRfQUNfUFJPR19TRUQKLSMgLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgZm9yIGEgZnVsbHktZnVuY3Rpb25hbCBzZWQgcHJvZ3JhbSwgdGhhdCB0cnVuY2F0ZXMKLSMgYXMgZmV3IGNoYXJhY3RlcnMgYXMgcG9zc2libGUuICBQcmVmZXIgR05VIHNlZCBpZiBmb3VuZC4KLUFDX0RFRlVOKFtMVF9BQ19QUk9HX1NFRF0sCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXRdKQotQUNfQ0FDSEVfVkFMKGx0X2N2X3BhdGhfU0VELAotWyMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3Igc2VkIGFuZCBnc2VkLgotIyBUaGVuIHVzZSB0aGF0IGxpc3Qgb2Ygc2VkJ3MgYXMgb25lcyB0byB0ZXN0IGZvciB0cnVuY2F0aW9uLgotYXNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC1mIgotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfcHJvZyBpbiBzZWQgZ3NlZDsgZG8KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgICAgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB0aGVuCi0gICAgICAgIF9zZWRfbGlzdD0iJF9zZWRfbGlzdCAkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgotICAgICAgZmkKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotICAjIENyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFuZCBob29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgotJGRlYnVnIHx8Ci17Ci0gIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/OyBybSAtcmYgJHRtcCAmJiBleGl0ICRleGl0X3N0YXR1cycgMAotICB0cmFwICd7IChleGl0IDEpOyBleGl0IDE7IH0nIDEgMiAxMyAxNQotfQotCi0jIENyZWF0ZSBhIChzZWN1cmUpIHRtcCBkaXJlY3RvcnkgZm9yIHRtcCBmaWxlcy4KLTogJHtUTVBESVI9L3RtcH0KLXsKLSAgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAtcSAiJFRNUERJUi9zZWRYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYKLSAgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIKLX0gIHx8Ci17Ci0gIHRtcD0kVE1QRElSL3NlZCQkLSRSQU5ET00KLSAgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKQotfSB8fAotewotICAgZWNobyAiJG1lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAkVE1QRElSIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotfQotICBfbWF4PTAKLSAgX2NvdW50PTAKLSAgIyBBZGQgL3Vzci94cGc0L2Jpbi9zZWQgYXMgaXQgaXMgdHlwaWNhbGx5IGZvdW5kIG9uIFNvbGFyaXMKLSAgIyBhbG9uZyB3aXRoIC9iaW4vc2VkIHRoYXQgdHJ1bmNhdGVzIG91dHB1dC4KLSAgZm9yIF9zZWQgaW4gJF9zZWRfbGlzdCAvdXNyL3hwZzQvYmluL3NlZDsgZG8KLSAgICB0ZXN0ICEgLWYgJHtfc2VkfSAmJiBicmVhawotICAgIGNhdCAvZGV2L251bGwgPiAiJHRtcC9zZWQuaW4iCi0gICAgX2NvdW50PTAKLSAgICBlY2hvICR7RUNIT19OLSRhY19ufSAiMDEyMzQ1Njc4OSR7RUNIT19DLSRhY19jfSIgPiIkdG1wL3NlZC5pbiIKLSAgICAjIENoZWNrIGZvciBHTlUgc2VkIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCi0gICAgaWYgIiR7X3NlZH0iIC0tdmVyc2lvbiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlUpJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgbHRfY3ZfcGF0aF9TRUQ9JHtfc2VkfQotICAgICAgYnJlYWsKLSAgICBmaQotICAgIHdoaWxlIHRydWU7IGRvCi0gICAgICBjYXQgIiR0bXAvc2VkLmluIiAiJHRtcC9zZWQuaW4iID4iJHRtcC9zZWQudG1wIgotICAgICAgbXYgIiR0bXAvc2VkLnRtcCIgIiR0bXAvc2VkLmluIgotICAgICAgY3AgIiR0bXAvc2VkLmluIiAiJHRtcC9zZWQubmwiCi0gICAgICBlY2hvID4+IiR0bXAvc2VkLm5sIgotICAgICAgJHtfc2VkfSAtZSAncy9hJC8vJyA8ICIkdG1wL3NlZC5ubCIgPiIkdG1wL3NlZC5vdXQiIHx8IGJyZWFrCi0gICAgICBjbXAgLXMgIiR0bXAvc2VkLm91dCIgIiR0bXAvc2VkLm5sIiB8fCBicmVhawotICAgICAgIyA0MDAwMCBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCi0gICAgICB0ZXN0ICRfY291bnQgLWd0IDEwICYmIGJyZWFrCi0gICAgICBfY291bnQ9YGV4cHIgJF9jb3VudCArIDFgCi0gICAgICBpZiB0ZXN0ICRfY291bnQgLWd0ICRfbWF4OyB0aGVuCi0gICAgICAgIF9tYXg9JF9jb3VudAotICAgICAgICBsdF9jdl9wYXRoX1NFRD0kX3NlZAotICAgICAgZmkKLSAgICBkb25lCi0gIGRvbmUKLSAgcm0gLXJmICIkdG1wIgotXSkKLWlmIHRlc3QgIlgkU0VEIiAhPSAiWCI7IHRoZW4KLSAgbHRfY3ZfcGF0aF9TRUQ9JFNFRAotZWxzZQotICBTRUQ9JGx0X2N2X3BhdGhfU0VECi1maQotQUNfTVNHX1JFU1VMVChbJFNFRF0pCi1dKQotCmRpZmYgLS1naXQgYS9hbHR1aS9SRUFETUUuYWx0IGIvYWx0dWkvUkVBRE1FLmFsdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBmMzFkYi4uMDAwMDAwMAotLS0gYS9hbHR1aS9SRUFETUUuYWx0CisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotSGVyZSBpcyBhbiBhbHRlcm5hdGUgY29tbWFuZC1saW5lIHVzZXIgaW50ZXJmYWNlIGZvciB0aGUgSUpHIEpQRUcgc29mdHdhcmUuCi1JdCBpcyBkZXNpZ25lZCBmb3IgdXNlIHVuZGVyIE1TLURPUywgYW5kIG1heSBhbHNvIGJlIHVzZWZ1bCBvbiBvdGhlciBub24tVW5peAotb3BlcmF0aW5nIHN5c3RlbXMuICAoRm9yIHRoYXQgbWF0dGVyLCB0aGlzIGNvZGUgd29ya3MgZmluZSBvbiBVbml4LCBidXQgdGhlCi1zdGFuZGFyZCBjb21tYW5kLWxpbmUgc3ludGF4IGlzIGJldHRlciBvbiBVbml4IGJlY2F1c2UgaXQgaXMgcGlwZS1mcmllbmRseS4pCi0KLVdpdGggdGhpcyB1c2VyIGludGVyZmFjZSwgY2pwZWcgYW5kIGRqcGVnIGFjY2VwdCBtdWx0aXBsZSBpbnB1dCBmaWxlIG5hbWVzCi1vbiB0aGUgY29tbWFuZCBsaW5lOyBvdXRwdXQgZmlsZSBuYW1lcyBhcmUgZ2VuZXJhdGVkIGJ5IHN1YnN0aXR1dGluZwotYXBwcm9wcmlhdGUgZXh0ZW5zaW9ucy4gIFRoZSB1c2VyIGlzIHByb21wdGVkIGJlZm9yZSBhbnkgYWxyZWFkeS1leGlzdGluZwotZmlsZSB3aWxsIGJlIG92ZXJ3cml0dGVuLiAgU2VlIHVzYWdlLmFsdCBmb3IgZGV0YWlscy4KLQotRXhwYW5zaW9uIG9mIHdpbGQtY2FyZCBmaWxlIHNwZWNpZmljYXRpb25zIGlzIHVzZWZ1bCBidXQgaXMgbm90IGRpcmVjdGx5Ci1wcm92aWRlZCBieSB0aGlzIGNvZGUuICBNb3N0IERPUyBDIGNvbXBpbGVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGRvIHdpbGQtY2FyZAotZXhwYW5zaW9uICJiZWhpbmQgdGhlIHNjZW5lcyIsIGFuZCB3ZSByZWx5IG9uIHRoYXQgZmVhdHVyZS4gIE9uIG90aGVyIHN5c3RlbXMsCi10aGUgc2hlbGwgbWF5IGRvIGl0IGZvciB5b3UsIGFzIGlzIGRvbmUgb24gVW5peC4KLQotQWxzbywgYSBET1Mtc3BlY2lmaWMgcm91dGluZSBpcyBwcm92aWRlZCB0byBkZXRlcm1pbmUgYXZhaWxhYmxlIG1lbW9yeTsKLXRoaXMgbWFrZXMgdGhlIC1tYXhtZW1vcnkgc3dpdGNoIHVubmVjZXNzYXJ5IGV4Y2VwdCBpbiB1bnVzdWFsIGNhc2VzLgotSWYgeW91IGtub3cgaG93IHRvIGRldGVybWluZSBhdmFpbGFibGUgbWVtb3J5IG9uIGEgZGlmZmVyZW50IHN5c3RlbSwKLXlvdSBjYW4gZWFzaWx5IGFkZCB0aGUgbmVjZXNzYXJ5IGNvZGUuICAoQW5kIHBsZWFzZSBzZW5kIGl0IGFsb25nIHRvCi1qcGVnLWluZm9AdXVuZXQudXUubmV0IHNvIHdlIGNhbiBpbmNsdWRlIGl0IGluIGZ1dHVyZSByZWxlYXNlcyEpCi0KLQotSU5TVEFMTEFUSU9OCi09PT09PT09PT09PT0KLQotWW91IG5lZWQgdG8gaGF2ZSB0aGUgbWFpbiBJSkcgSlBFRyBkaXN0cmlidXRpb24sIHJlbGVhc2UgNiBvciBsYXRlci4KLVJlcGxhY2UgdGhlIHN0YW5kYXJkIGNqcGVnLmMgYW5kIGRqcGVnLmMgZmlsZXMgd2l0aCB0aGUgb25lcyBwcm92aWRlZCBoZXJlLgotVGhlbiBidWlsZCB0aGUgc29mdHdhcmUgYXMgZGVzY3JpYmVkIGluIHRoZSBtYWluIGRpc3RyaWJ1dGlvbidzIGluc3RhbGwuZG9jCi1maWxlLCB3aXRoIHRoZXNlIGV4Y2VwdGlvbnM6Ci0KLSogRGVmaW5lIFBST0dSRVNTX1JFUE9SVCBpbiBqY29uZmlnLmggaWYgeW91IHdhbnQgdGhlIHBlcmNlbnQtZG9uZSBkaXNwbGF5LgotKiBEZWZpbmUgTk9fT1ZFUldSSVRFX0NIRUNLIGlmIHlvdSAqZG9uJ3QqIHdhbnQgb3ZlcndyaXRlIGNvbmZpcm1hdGlvbi4KLSogWW91IG1heSBpZ25vcmUgdGhlIFVTRV9TRVRNT0RFIGFuZCBUV09fRklMRV9DT01NQU5ETElORSBzeW1ib2xzIGRpc2N1c3NlZAotICBpbiBpbnN0YWxsLmRvYzsgdGhlc2UgZmlsZXMgZG8gbm90IHVzZSB0aGVtLgotKiBBcyBnaXZlbiwgZGpwZWcuYyBkZWZhdWx0cyB0byBHSUYgb3V0cHV0IChub3QgUFBNIG91dHB1dCBhcyBpbiB0aGUgc3RhbmRhcmQKLSAgZGpwZWcuYykuICBJZiB5b3Ugd2FudCBzb21ldGhpbmcgZGlmZmVyZW50LCBtb2RpZnkgREVGQVVMVF9GTVQuCi0KLVlvdSBtYXkgYWxzbyBuZWVkIHRvIGRvIHNvbWV0aGluZyBzcGVjaWFsIHRvIGVuYWJsZSBmaWxlbmFtZSB3aWxkLWNhcmQKLWV4cGFuc2lvbiwgYXNzdW1pbmcgeW91ciBjb21waWxlciBoYXMgdGhhdCBjYXBhYmlsaXR5IGF0IGFsbC4KLQotTW9kaWZ5IHRoZSBzdGFuZGFyZCB1c2FnZS5kb2MgZmlsZSBhcyBkZXNjcmliZWQgaW4gdXNhZ2UuYWx0LiAgKElmIHlvdSB3YW50Ci10byB1c2UgdGhlIFVuaXgtc3R5bGUgbWFudWFsIHBhZ2VzIGNqcGVnLjEgYW5kIGRqcGVnLjEsIGJldHRlciBmaXggdGhlbSB0b28uKQotCi0KLUhlcmUgYXJlIHNvbWUgc3BlY2lmaWMgbm90ZXMgZm9yIHBvcHVsYXIgTVMtRE9TIGNvbXBpbGVyczoKLQotQm9ybGFuZCBDOgotICBBZGQgIi1ETVNET1MiIHRvIENGTEFHUyB0byBlbmFibGUgdXNlIG9mIHRoZSBET1MgbWVtb3J5IGRldGVybWluYXRpb24gY29kZS4KLSAgTGluayB3aXRoIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGZpbGUgV0lMREFSR1MuT0JKIHRvIGdldCB3aWxkLWNhcmQgZXhwYW5zaW9uLgotCi1NaWNyb3NvZnQgQzoKLSAgQWRkICItRE1TRE9TIiB0byBDRkxBR1MgdG8gZW5hYmxlIHVzZSBvZiB0aGUgRE9TIG1lbW9yeSBkZXRlcm1pbmF0aW9uIGNvZGUuCi0gIExpbmsgd2l0aCB0aGUgc3RhbmRhcmQgbGlicmFyeSBmaWxlIFNFVEFSR1YuT0JKIHRvIGdldCB3aWxkLWNhcmQgZXhwYW5zaW9uLgotICBJbiB0aGUgdmVyc2lvbnMgSSd2ZSB1c2VkLCB5b3UgbXVzdCBhbHNvIGFkZCAvTk9FIHRvIHRoZSBsaW5rZXIgc3dpdGNoZXMgdG8KLSAgYXZvaWQgYSBkdXBsaWNhdGUtc3ltYm9sIGVycm9yIGZyb20gaW5jbHVkaW5nIFNFVEFSR1YuCi0KLURKR1BQICh3ZSByZWNvbW1lbmQgdmVyc2lvbiAyLjAgb3IgbGF0ZXIpOgotICBBZGQgIi1ERlJFRV9NRU1fRVNUSU1BVEU9MCIgdG8gQ0ZMQUdTLiAgV2lsZC1jYXJkIGV4cGFuc2lvbiBpcyBhdXRvbWF0aWMuCi0KLQotTEVHQUwgSVNTVUVTCi09PT09PT09PT09PT0KLQotVGhpcyBzb2Z0d2FyZSBpcyBjb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi1UZXJtcyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBmcmVlIElKRyBKUEVHIHNvZnR3YXJlOwotc2VlIGl0cyBSRUFETUUgZmlsZSBmb3IgZGV0YWlscy4KLQotVGhlIGF1dGhvcnMgbWFrZSBOTyBXQVJSQU5UWSBvciByZXByZXNlbnRhdGlvbiwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwKLXdpdGggcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLCBpdHMgcXVhbGl0eSwgYWNjdXJhY3ksIG1lcmNoYW50YWJpbGl0eSwgb3IKLWZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiQVMgSVMiLCBhbmQgeW91LAotaXRzIHVzZXIsIGFzc3VtZSB0aGUgZW50aXJlIHJpc2sgYXMgdG8gaXRzIHF1YWxpdHkgYW5kIGFjY3VyYWN5LgpkaWZmIC0tZ2l0IGEvYWx0dWkvY2pwZWcuYyBiL2FsdHVpL2NqcGVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMWE0ZjguLjAwMDAwMDAKLS0tIGEvYWx0dWkvY2pwZWcuYworKysgL2Rldi9udWxsCkBAIC0xLDgxMyArMCwwIEBACi0vKgotICogYWx0ZXJuYXRlIGNqcGVnLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgotICogVGhpcyBmaWxlIGhhcyBiZWVuIG1vZGlmaWVkIGZvciBTSU1EIGV4dGVuc2lvbi4KLSAqIExhc3QgTW9kaWZpZWQgOiBKYW51YXJ5IDYsIDIwMDYKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhbiBhbHRlcm5hdGUgdXNlciBpbnRlcmZhY2UgZm9yIHRoZSBKUEVHIGNvbXByZXNzb3IuCi0gKiBPbmUgb3IgbW9yZSBpbnB1dCBmaWxlcyBhcmUgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgYW5kIG91dHB1dCBmaWxlCi0gKiBuYW1lcyBhcmUgY3JlYXRlZCBieSBzdWJzdGl0dXRpbmcgIi5qcGciIGZvciB0aGUgaW5wdXQgZmlsZSdzIGV4dGVuc2lvbi4KLSAqLwotCi0jaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLwotI2luY2x1ZGUgImp2ZXJzaW9uLmgiCQkvKiBmb3IgdmVyc2lvbiBtZXNzYWdlICovCi0KLSNpZmRlZiBVU0VfQ0NPTU1BTkQJCS8qIGNvbW1hbmQtbGluZSByZWFkZXIgZm9yIE1hY2ludG9zaCAqLwotI2lmZGVmIF9fTVdFUktTX18KLSNpbmNsdWRlIDxTSU9VWC5oPiAgICAgICAgICAgICAgLyogTWV0cm93ZXJrcyBuZWVkcyB0aGlzICovCi0jaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogLi4uIGFuZCB0aGlzICovCi0jZW5kaWYKLSNpZmRlZiBUSElOS19DCi0jaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogVGhpbmsgZGVjbGFyZXMgaXQgaGVyZSAqLwotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBQQVRIX01BWAkJLyogQU5TSSBtYXhpbXVtLXBhdGhuYW1lLWxlbmd0aCBjb25zdGFudCAqLwotI2RlZmluZSBQQVRIX01BWCAyNTYKLSNlbmRpZgotCi0KLS8qIENyZWF0ZSB0aGUgYWRkLW9uIG1lc3NhZ2Ugc3RyaW5nIHRhYmxlLiAqLwotCi0jZGVmaW5lIEpNRVNTQUdFKGNvZGUsc3RyaW5nKQlzdHJpbmcgLAotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNkanBlZ19tZXNzYWdlX3RhYmxlW10gPSB7Ci0jaW5jbHVkZSAiY2RlcnJvci5oIgotICBOVUxMCi19OwotCi0KLS8qCi0gKiBTSU1EIEV4dDogY29tcGlsZXItc3BlY2lmaWMgaGFja3MgdG8gZW5hYmxlIGZpbGVuYW1lIHdpbGQtY2FyZCBleHBhbnNpb24KLSAqLwotCi0jaWZkZWYgX01TQ19WRVIJCS8qIE1pY3Jvc29mdCBWaXN1YWwgQysrICovCi0vKiBmcm9tIHNldGFyZ3YuYyAoc2V0YXJndi5vYmopICovCi0vKiBUZXN0ZWQgdW5kZXIgVmlzdWFsIEMrKyBWNi4wLCBUb29sa2l0IDIwMDMsIGFuZCAyMDA1IEV4cHJlc3MgRWRpdGlvbiAqLwotaW50IF9fY2RlY2wgX3NldGFyZ3Yodm9pZCkgeyBpbnQgX19jZGVjbCBfX3NldGFyZ3Yodm9pZCk7IHJldHVybiBfX3NldGFyZ3YoKTsgfQotI2VuZGlmCi0jaWZkZWYgX19CT1JMQU5EQ19fCS8qIEJvcmxhbmQgQysrICovCi0vKiBmcm9tIHdpbGRhcmdzLmMgKHdpbGRhcmdzLm9iaikgKi8KLS8qIFRlc3RlZCB1bmRlciBCb3JsYW5kIEMrKyBDb21waWxlciA1LjUgKHdpbjMyKSAqLwotI2luY2x1ZGUgPHdpbGRhcmdzLmg+Ci10eXBlZGVmIHZvaWQgX1JUTEVOVFJZICgqIF9SVExFTlRSWSBfYXJndl9leHBhbmRfZm5jKShjaGFyICosIF9QRk5fQUREQVJHKTsKLV9hcmd2X2V4cGFuZF9mbmMgX2FyZ3ZfZXhwYW5kX3B0ciA9IF9leHBhbmRfd2lsZDsKLSNlbmRpZgotCi0KLS8qCi0gKiBBdXRvbWF0aWMgZGV0ZXJtaW5hdGlvbiBvZiBhdmFpbGFibGUgbWVtb3J5LgotICovCi0KLXN0YXRpYyBsb25nIGRlZmF1bHRfbWF4bWVtOwkvKiBzYXZlcyB2YWx1ZSBkZXRlcm1pbmVkIGF0IHN0YXJ0dXAsIG9yIDAgKi8KLQotI2lmbmRlZiBGUkVFX01FTV9FU1RJTUFURQkvKiBtYXkgYmUgZGVmaW5lZCBmcm9tIGNvbW1hbmQgbGluZSAqLwotCi0jaWZkZWYgTVNET1MJCQkvKiBGb3IgTVMtRE9TICh1bmxlc3MgZmxhdC1tZW1vcnkgbW9kZWwpICovCi0KLSNpbmNsdWRlIDxkb3MuaD4JCS8qIGZvciBhY2Nlc3MgdG8gaW50ZG9zKCkgY2FsbCAqLwotCi1MT0NBTChsb25nKQotdW51c2VkX2Rvc19tZW1vcnkgKHZvaWQpCi0vKiBPYnRhaW4gdG90YWwgYW1vdW50IG9mIHVuYWxsb2NhdGVkIERPUyBtZW1vcnkgKi8KLXsKLSAgdW5pb24gUkVHUyByZWdzOwotICBsb25nIG5wYXJhczsKLQotICByZWdzLmguYWggPSAweDQ4OwkJLyogRE9TIGZ1bmN0aW9uIEFsbG9jYXRlIE1lbW9yeSBCbG9jayAqLwotICByZWdzLnguYnggPSAweEZGRkY7CQkvKiBBc2sgZm9yIG1vcmUgbWVtb3J5IHRoYW4gRE9TIGNhbiBoYXZlICovCi0gICh2b2lkKSBpbnRkb3MoJnJlZ3MsICZyZWdzKTsKLSAgLyogRE9TIHdpbGwgZmFpbCBhbmQgcmV0dXJuICMgb2YgcGFyYWdyYXBocyBhY3R1YWxseSBhdmFpbGFibGUgaW4gQlguICovCi0gIG5wYXJhcyA9ICh1bnNpZ25lZCBpbnQpIHJlZ3MueC5ieDsKLSAgLyogVGltZXMgMTYgdG8gY29udmVydCB0byBieXRlcy4gKi8KLSAgcmV0dXJuIG5wYXJhcyA8PCA0OwotfQotCi0vKiBUaGUgZGVmYXVsdCBtZW1vcnkgc2V0dGluZyBpcyA5NSUgb2YgdGhlIGF2YWlsYWJsZSBzcGFjZS4gKi8KLSNkZWZpbmUgRlJFRV9NRU1fRVNUSU1BVEUgICgodW51c2VkX2Rvc19tZW1vcnkoKSAqIDk1TCkgLyAxMDBMKQotCi0jZW5kaWYgLyogTVNET1MgKi8KLQotI2lmZGVmIEFUQVJJCQkJLyogRm9yIEF0YXJpIFNUL1NURS9UVCwgUHVyZSBDIG9yIFR1cmJvIEMgKi8KLQotI2luY2x1ZGUgPGV4dC5oPgotCi0vKiBUaGUgZGVmYXVsdCBtZW1vcnkgc2V0dGluZyBpcyA5MCUgb2YgdGhlIGF2YWlsYWJsZSBzcGFjZS4gKi8KLSNkZWZpbmUgRlJFRV9NRU1fRVNUSU1BVEUgICgoKGxvbmcpIGNvcmVsZWZ0KCkgKiA5MEwpIC8gMTAwTCkKLQotI2VuZGlmIC8qIEFUQVJJICovCi0KLS8qIEFkZCBtZW1vcnktZXN0aW1hdGlvbiBwcm9jZWR1cmVzIGZvciBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcyBoZXJlLAotICogd2l0aCBhcHByb3ByaWF0ZSAjaWZkZWYncyBhcm91bmQgdGhlbS4KLSAqLwotCi0jZW5kaWYgLyogIUZSRUVfTUVNX0VTVElNQVRFICovCi0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBkZXRlcm1pbmVzIHdoYXQgZm9ybWF0IHRoZSBpbnB1dCBmaWxlIGlzLAotICogYW5kIHNlbGVjdHMgdGhlIGFwcHJvcHJpYXRlIGlucHV0LXJlYWRpbmcgbW9kdWxlLgotICoKLSAqIFRvIGRldGVybWluZSB3aGljaCBmYW1pbHkgb2YgaW5wdXQgZm9ybWF0cyB0aGUgZmlsZSBiZWxvbmdzIHRvLAotICogd2UgbWF5IGxvb2sgb25seSBhdCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZmlsZSwgc2luY2UgQyBkb2VzIG5vdAotICogZ3VhcmFudGVlIHRoYXQgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIgY2FuIGJlIHB1c2hlZCBiYWNrIHdpdGggdW5nZXRjLgotICogTG9va2luZyBhdCBhZGRpdGlvbmFsIGJ5dGVzIHdvdWxkIHJlcXVpcmUgb25lIG9mIHRoZXNlIGFwcHJvYWNoZXM6Ci0gKiAgICAgMSkgYXNzdW1lIHdlIGNhbiBmc2VlaygpIHRoZSBpbnB1dCBmaWxlIChmYWlscyBmb3IgcGlwZWQgaW5wdXQpOwotICogICAgIDIpIGFzc3VtZSB3ZSBjYW4gcHVzaCBiYWNrIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyICh3b3JrcyBpbgotICogICAgICAgIHNvbWUgQyBpbXBsZW1lbnRhdGlvbnMsIGJ1dCB1bnBvcnRhYmxlKTsKLSAqICAgICAzKSBwcm92aWRlIG91ciBvd24gYnVmZmVyaW5nIChicmVha3MgaW5wdXQgcmVhZGVycyB0aGF0IHdhbnQgdG8gdXNlCi0gKiAgICAgICAgc3RkaW8gZGlyZWN0bHksIHN1Y2ggYXMgdGhlIFJMRSBsaWJyYXJ5KTsKLSAqIG9yICA0KSBkb24ndCBwdXQgYmFjayB0aGUgZGF0YSwgYW5kIG1vZGlmeSB0aGUgaW5wdXRfaW5pdCBtZXRob2RzIHRvIGFzc3VtZQotICogICAgICAgIHRoZXkgc3RhcnQgcmVhZGluZyBhZnRlciB0aGUgc3RhcnQgb2YgZmlsZSAoYWxzbyBicmVha3MgUkxFIGxpYnJhcnkpLgotICogIzEgaXMgYXR0cmFjdGl2ZSBmb3IgTVMtRE9TIGJ1dCBpcyB1bnRlbmFibGUgb24gVW5peC4KLSAqCi0gKiBUaGUgbW9zdCBwb3J0YWJsZSBzb2x1dGlvbiBmb3IgZmlsZSB0eXBlcyB0aGF0IGNhbid0IGJlIGlkZW50aWZpZWQgYnkgdGhlaXIKLSAqIGZpcnN0IGJ5dGUgaXMgdG8gbWFrZSB0aGUgdXNlciB0ZWxsIHVzIHdoYXQgdGhleSBhcmUuICBUaGlzIGlzIGFsc28gdGhlCi0gKiBvbmx5IGFwcHJvYWNoIGZvciAicmF3IiBmaWxlIHR5cGVzIHRoYXQgY29udGFpbiBvbmx5IGFyYml0cmFyeSB2YWx1ZXMuCi0gKiBXZSBwcmVzZW50bHkgYXBwbHkgdGhpcyBtZXRob2QgZm9yIFRhcmdhIGZpbGVzLiAgTW9zdCBvZiB0aGUgdGltZSBUYXJnYQotICogZmlsZXMgc3RhcnQgd2l0aCAweDAwLCBzbyB3ZSByZWNvZ25pemUgdGhhdCBjYXNlLiAgUG90ZW50aWFsbHksIGhvd2V2ZXIsCi0gKiBhIFRhcmdhIGZpbGUgY291bGQgc3RhcnQgd2l0aCBhbnkgYnl0ZSB2YWx1ZSAoYnl0ZSAwIGlzIHRoZSBsZW5ndGggb2YgdGhlCi0gKiBzZWxkb20tdXNlZCBJRCBmaWVsZCksIHNvIHdlIHByb3ZpZGUgYSBzd2l0Y2ggdG8gZm9yY2UgVGFyZ2EgaW5wdXQgbW9kZS4KLSAqLwotCi1zdGF0aWMgYm9vbGVhbiBpc190YXJnYTsJLyogcmVjb3JkcyB1c2VyIC10YXJnYSBzd2l0Y2ggKi8KLQotCi1MT0NBTChjanBlZ19zb3VyY2VfcHRyKQotc2VsZWN0X2ZpbGVfdHlwZSAoal9jb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBpbmZpbGUpCi17Ci0gIGludCBjOwotCi0gIGlmIChpc190YXJnYSkgewotI2lmZGVmIFRBUkdBX1NVUFBPUlRFRAotICAgIHJldHVybiBqaW5pdF9yZWFkX3RhcmdhKGNpbmZvKTsKLSNlbHNlCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9UR0FfTk9UQ09NUCk7Ci0jZW5kaWYKLSAgfQotCi0gIGlmICgoYyA9IGdldGMoaW5maWxlKSkgPT0gRU9GKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU1QVFkpOwotICBpZiAodW5nZXRjKGMsIGluZmlsZSkgPT0gRU9GKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVU5HRVRDX0ZBSUxFRCk7Ci0KLSAgc3dpdGNoIChjKSB7Ci0jaWZkZWYgQk1QX1NVUFBPUlRFRAotICBjYXNlICdCJzoKLSAgICByZXR1cm4gamluaXRfcmVhZF9ibXAoY2luZm8pOwotI2VuZGlmCi0jaWZkZWYgR0lGX1NVUFBPUlRFRAotICBjYXNlICdHJzoKLSAgICByZXR1cm4gamluaXRfcmVhZF9naWYoY2luZm8pOwotI2VuZGlmCi0jaWZkZWYgUFBNX1NVUFBPUlRFRAotICBjYXNlICdQJzoKLSAgICByZXR1cm4gamluaXRfcmVhZF9wcG0oY2luZm8pOwotI2VuZGlmCi0jaWZkZWYgUkxFX1NVUFBPUlRFRAotICBjYXNlICdSJzoKLSAgICByZXR1cm4gamluaXRfcmVhZF9ybGUoY2luZm8pOwotI2VuZGlmCi0jaWZkZWYgVEFSR0FfU1VQUE9SVEVECi0gIGNhc2UgMHgwMDoKLSAgICByZXR1cm4gamluaXRfcmVhZF90YXJnYShjaW5mbyk7Ci0jZW5kaWYKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1VOS05PV05fRk9STUFUKTsKLSAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBOVUxMOwkJCS8qIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmdzICovCi19Ci0KLQotLyoKLSAqIEFyZ3VtZW50LXBhcnNpbmcgY29kZS4KLSAqIFRoZSBzd2l0Y2ggcGFyc2VyIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWZ1bCB3aXRoIERPUy1zdHlsZSBjb21tYW5kIGxpbmUKLSAqIHN5bnRheCwgaWUsIGludGVybWl4ZWQgc3dpdGNoZXMgYW5kIGZpbGUgbmFtZXMsIHdoZXJlIG9ubHkgdGhlIHN3aXRjaGVzCi0gKiB0byB0aGUgbGVmdCBvZiBhIGdpdmVuIGZpbGUgbmFtZSBhZmZlY3QgcHJvY2Vzc2luZyBvZiB0aGF0IGZpbGUuCi0gKi8KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqIHByb2duYW1lOwkvKiBwcm9ncmFtIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCi1zdGF0aWMgY2hhciAqIG91dGZpbGVuYW1lOwkvKiBmb3IgLW91dGZpbGUgc3dpdGNoICovCi0KLQotTE9DQUwodm9pZCkKLXVzYWdlICh2b2lkKQotLyogY29tcGxhaW4gYWJvdXQgYmFkIGNvbW1hbmQgbGluZSAqLwotewotICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbc3dpdGNoZXNdIGlucHV0ZmlsZShzKVxuIiwgcHJvZ25hbWUpOwotICBmcHJpbnRmKHN0ZGVyciwgIkxpc3Qgb2YgaW5wdXQgZmlsZXMgbWF5IHVzZSB3aWxkY2FyZHMgKCogYW5kID8pXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZmlsZW5hbWUgaXMgc2FtZSBhcyBpbnB1dCBmaWxlbmFtZSwgYnV0IGV4dGVuc2lvbiAuanBnXG4iKTsKLQotICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIChuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQpOlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtcXVhbGl0eSBOICAgICBDb21wcmVzc2lvbiBxdWFsaXR5ICgwLi4xMDA7IDUtOTUgaXMgdXNlZnVsIHJhbmdlKVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtZ3JheXNjYWxlICAgICBDcmVhdGUgbW9ub2Nocm9tZSBKUEVHIGZpbGVcbiIpOwotI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW9wdGltaXplICAgICAgT3B0aW1pemUgSHVmZm1hbiB0YWJsZSAoc21hbGxlciBmaWxlLCBidXQgc2xvdyBjb21wcmVzc2lvbilcbiIpOwotI2VuZGlmCi0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1wcm9ncmVzc2l2ZSAgIENyZWF0ZSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGVcbiIpOwotI2VuZGlmCi0jaWZkZWYgVEFSR0FfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtdGFyZ2EgICAgICAgICBJbnB1dCBmaWxlIGlzIFRhcmdhIGZvcm1hdCAodXN1YWxseSBub3QgbmVlZGVkKVxuIik7Ci0jZW5kaWYKLSAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3IgYWR2YW5jZWQgdXNlcnM6XG4iKTsKLSNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtZGN0IGludCAgICAgICBVc2UgaW50ZWdlciBEQ1QgbWV0aG9kJXNcbiIsCi0JICAoSkRDVF9ERUZBVUxUID09IEpEQ1RfSVNMT1cgPyAiIChkZWZhdWx0KSIgOiAiIikpOwotI2VuZGlmCi0jaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRjdCBmYXN0ICAgICAgVXNlIGZhc3QgaW50ZWdlciBEQ1QgKGxlc3MgYWNjdXJhdGUpJXNcbiIsCi0JICAoSkRDVF9ERUZBVUxUID09IEpEQ1RfSUZBU1QgPyAiIChkZWZhdWx0KSIgOiAiIikpOwotI2VuZGlmCi0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRjdCBmbG9hdCAgICAgVXNlIGZsb2F0aW5nLXBvaW50IERDVCBtZXRob2Qlc1xuIiwKLQkgIChKRENUX0RFRkFVTFQgPT0gSkRDVF9GTE9BVCA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7Ci0jZW5kaWYKLSAgZnByaW50ZihzdGRlcnIsICIgIC1yZXN0YXJ0IE4gICAgIFNldCByZXN0YXJ0IGludGVydmFsIGluIHJvd3MsIG9yIGluIGJsb2NrcyB3aXRoIEJcbiIpOwotI2lmZGVmIElOUFVUX1NNT09USElOR19TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1zbW9vdGggTiAgICAgIFNtb290aCBkaXRoZXJlZCBpbnB1dCAoTj0xLi4xMDAgaXMgc3RyZW5ndGgpXG4iKTsKLSNlbmRpZgotI2lmbmRlZiBGUkVFX01FTV9FU1RJTUFURQotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW1heG1lbW9yeSBOICAgTWF4aW11bSBtZW1vcnkgdG8gdXNlIChpbiBrYnl0ZXMpXG4iKTsKLSNlbmRpZgotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW91dGZpbGUgbmFtZSAgU3BlY2lmeSBuYW1lIGZvciBvdXRwdXQgZmlsZVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtdmVyYm9zZSAgb3IgIC1kZWJ1ZyAgIEVtaXQgZGVidWcgb3V0cHV0XG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3Igd2l6YXJkczpcbiIpOwotI2lmZGVmIENfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWFyaXRobWV0aWMgICAgVXNlIGFyaXRobWV0aWMgY29kaW5nXG4iKTsKLSNlbmRpZgotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWJhc2VsaW5lICAgICAgRm9yY2UgYmFzZWxpbmUgcXVhbnRpemF0aW9uIHRhYmxlc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtcXRhYmxlcyBmaWxlICBVc2UgcXVhbnRpemF0aW9uIHRhYmxlcyBnaXZlbiBpbiBmaWxlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1xc2xvdHMgTlssLi4uXSAgICBTZXQgY29tcG9uZW50IHF1YW50aXphdGlvbiB0YWJsZXNcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXNhbXBsZSBIeFZbLC4uLl0gIFNldCBjb21wb25lbnQgc2FtcGxpbmcgZmFjdG9yc1xuIik7Ci0jaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtc2NhbnMgZmlsZSAgICBDcmVhdGUgbXVsdGktc2NhbiBKUEVHIHBlciBzY3JpcHQgZmlsZVxuIik7Ci0jZW5kaWYKLSAgZXhpdChFWElUX0ZBSUxVUkUpOwotfQotCi0KLSNpZm5kZWYgSlNJTURfTU9ERUlORk9fTk9UX1NVUFBPUlRFRAotCi1MT0NBTCh2b2lkKQotcHJpbnRfc2ltZF9pbmZvIChGSUxFICogZmlsZSwgY2hhciAqIGxhYmVsc3RyLCB1bnNpZ25lZCBpbnQgc2ltZCkKLXsKLSAgZnByaW50ZihmaWxlLCAiJXMlcyVzJXMlcyVzXG4iLCBsYWJlbHN0ciwKLQkgIHNpbWQgJiBKU0lNRF9NTVggICA/ICIgTU1YIiAgICA6ICIiLAotCSAgc2ltZCAmIEpTSU1EXzNETk9XID8gIiAzRE5vdyEiIDogIiIsCi0JICBzaW1kICYgSlNJTURfU1NFICAgPyAiIFNTRSIgICAgOiAiIiwKLQkgIHNpbWQgJiBKU0lNRF9TU0UyICA/ICIgU1NFMiIgICA6ICIiLAotCSAgc2ltZCA9PSBKU0lNRF9OT05FID8gIiBOT05FIiAgIDogIiIpOwotfQotCi0jZW5kaWYgLyogIUpTSU1EX01PREVJTkZPX05PVF9TVVBQT1JURUQgKi8KLQotCi1MT0NBTChpbnQpCi1wYXJzZV9zd2l0Y2hlcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBhcmdjLCBjaGFyICoqYXJndiwKLQkJaW50IGxhc3RfZmlsZV9hcmdfc2VlbiwgYm9vbGVhbiBmb3JfcmVhbCkKLS8qIFBhcnNlIG9wdGlvbmFsIHN3aXRjaGVzLgotICogUmV0dXJucyBhcmd2W10gaW5kZXggb2YgZmlyc3QgZmlsZS1uYW1lIGFyZ3VtZW50ICg9PSBhcmdjIGlmIG5vbmUpLgotICogQW55IGZpbGUgbmFtZXMgd2l0aCBpbmRleGVzIDw9IGxhc3RfZmlsZV9hcmdfc2VlbiBhcmUgaWdub3JlZDsKLSAqIHRoZXkgaGF2ZSBwcmVzdW1hYmx5IGJlZW4gcHJvY2Vzc2VkIGluIGEgcHJldmlvdXMgaXRlcmF0aW9uLgotICogKFBhc3MgMCBmb3IgbGFzdF9maWxlX2FyZ19zZWVuIG9uIHRoZSBmaXJzdCBvciBvbmx5IGl0ZXJhdGlvbi4pCi0gKiBmb3JfcmVhbCBpcyBGQUxTRSBvbiB0aGUgZmlyc3QgKGR1bW15KSBwYXNzOyB3ZSBtYXkgc2tpcCBhbnkgZXhwZW5zaXZlCi0gKiBwcm9jZXNzaW5nLgotICovCi17Ci0gIGludCBhcmduOwotICBjaGFyICogYXJnOwotICBpbnQgcXVhbGl0eTsJCQkvKiAtcXVhbGl0eSBwYXJhbWV0ZXIgKi8KLSAgaW50IHFfc2NhbGVfZmFjdG9yOwkJLyogc2NhbGluZyBwZXJjZW50YWdlIGZvciAtcXRhYmxlcyAqLwotICBib29sZWFuIGZvcmNlX2Jhc2VsaW5lOwotICBib29sZWFuIHNpbXBsZV9wcm9ncmVzc2l2ZTsKLSAgY2hhciAqIHF0YWJsZWZpbGUgPSBOVUxMOwkvKiBzYXZlcyAtcXRhYmxlcyBmaWxlbmFtZSBpZiBhbnkgKi8KLSAgY2hhciAqIHFzbG90c2FyZyA9IE5VTEw7CS8qIHNhdmVzIC1xc2xvdHMgcGFybSBpZiBhbnkgKi8KLSAgY2hhciAqIHNhbXBsZWFyZyA9IE5VTEw7CS8qIHNhdmVzIC1zYW1wbGUgcGFybSBpZiBhbnkgKi8KLSAgY2hhciAqIHNjYW5zYXJnID0gTlVMTDsJLyogc2F2ZXMgLXNjYW5zIHBhcm0gaWYgYW55ICovCi0KLSAgLyogU2V0IHVwIGRlZmF1bHQgSlBFRyBwYXJhbWV0ZXJzLiAqLwotICAvKiBOb3RlIHRoYXQgZGVmYXVsdCAtcXVhbGl0eSBsZXZlbCBuZWVkIG5vdCwgYW5kIGRvZXMgbm90LAotICAgKiBtYXRjaCB0aGUgZGVmYXVsdCBzY2FsaW5nIGZvciBhbiBleHBsaWNpdCAtcXRhYmxlcyBhcmd1bWVudC4KLSAgICovCi0gIHF1YWxpdHkgPSA3NTsJCQkvKiBkZWZhdWx0IC1xdWFsaXR5IHZhbHVlICovCi0gIHFfc2NhbGVfZmFjdG9yID0gMTAwOwkJLyogZGVmYXVsdCB0byBubyBzY2FsaW5nIGZvciAtcXRhYmxlcyAqLwotICBmb3JjZV9iYXNlbGluZSA9IEZBTFNFOwkvKiBieSBkZWZhdWx0LCBhbGxvdyAxNi1iaXQgcXVhbnRpemVycyAqLwotICBzaW1wbGVfcHJvZ3Jlc3NpdmUgPSBGQUxTRTsKLSAgaXNfdGFyZ2EgPSBGQUxTRTsKLSAgb3V0ZmlsZW5hbWUgPSBOVUxMOwotICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA9IDA7Ci0gIGlmIChkZWZhdWx0X21heG1lbSA+IDApCS8qIG92ZXJyaWRlIGxpYnJhcnkncyBkZWZhdWx0IHZhbHVlICovCi0gICAgY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UgPSBkZWZhdWx0X21heG1lbTsKLQotICAvKiBTY2FuIGNvbW1hbmQgbGluZSBvcHRpb25zLCBhZGp1c3QgcGFyYW1ldGVycyAqLwotCi0gIGZvciAoYXJnbiA9IDE7IGFyZ24gPCBhcmdjOyBhcmduKyspIHsKLSAgICBhcmcgPSBhcmd2W2FyZ25dOwotICAgIGlmICgqYXJnICE9ICctJykgewotICAgICAgLyogTm90IGEgc3dpdGNoLCBtdXN0IGJlIGEgZmlsZSBuYW1lIGFyZ3VtZW50ICovCi0gICAgICBpZiAoYXJnbiA8PSBsYXN0X2ZpbGVfYXJnX3NlZW4pIHsKLQlvdXRmaWxlbmFtZSA9IE5VTEw7CS8qIC1vdXRmaWxlIGFwcGxpZXMgdG8ganVzdCBvbmUgaW5wdXQgZmlsZSAqLwotCWNvbnRpbnVlOwkJLyogaWdub3JlIHRoaXMgbmFtZSBpZiBwcmV2aW91c2x5IHByb2Nlc3NlZCAqLwotICAgICAgfQotICAgICAgYnJlYWs7CQkJLyogZWxzZSBkb25lIHBhcnNpbmcgc3dpdGNoZXMgKi8KLSAgICB9Ci0gICAgYXJnKys7CQkJLyogYWR2YW5jZSBwYXN0IHN3aXRjaCBtYXJrZXIgY2hhcmFjdGVyICovCi0KLSAgICBpZiAoa2V5bWF0Y2goYXJnLCAiYXJpdGhtZXRpYyIsIDEpKSB7Ci0gICAgICAvKiBVc2UgYXJpdGhtZXRpYyBjb2RpbmcuICovCi0jaWZkZWYgQ19BUklUSF9DT0RJTkdfU1VQUE9SVEVECi0gICAgICBjaW5mby0+YXJpdGhfY29kZSA9IFRSVUU7Ci0jZWxzZQotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIGFyaXRobWV0aWMgY29kaW5nIG5vdCBzdXBwb3J0ZWRcbiIsCi0JICAgICAgcHJvZ25hbWUpOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotI2VuZGlmCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImJhc2VsaW5lIiwgMSkpIHsKLSAgICAgIC8qIEZvcmNlIGJhc2VsaW5lLWNvbXBhdGlibGUgb3V0cHV0ICg4LWJpdCBxdWFudGl6ZXIgdmFsdWVzKS4gKi8KLSAgICAgIGZvcmNlX2Jhc2VsaW5lID0gVFJVRTsKLQotI2lmbmRlZiBKU0lNRF9NQVNLRlVOQ19OT1RfU1VQUE9SVEVECi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJub3NpbWQiICwgNCkpIHsKLSAgICAgIGpwZWdfc2ltZF9tYXNrKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKU0lNRF9OT05FLCBKU0lNRF9BTEwpOwotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibm9tbXgiICAsIDMpKSB7Ci0gICAgICBqcGVnX3NpbWRfbWFzaygoal9jb21tb25fcHRyKSBjaW5mbywgSlNJTURfTk9ORSwgSlNJTURfTU1YKTsKLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm5vM2Rub3ciLCAzKSkgewotICAgICAganBlZ19zaW1kX21hc2soKGpfY29tbW9uX3B0cikgY2luZm8sIEpTSU1EX05PTkUsIEpTSU1EXzNETk9XKTsKLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm5vc3NlIiAgLCA0KSkgewotICAgICAganBlZ19zaW1kX21hc2soKGpfY29tbW9uX3B0cikgY2luZm8sIEpTSU1EX05PTkUsIEpTSU1EX1NTRSk7Ci0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJub3NzZTIiICwgNikpIHsKLSAgICAgIGpwZWdfc2ltZF9tYXNrKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKU0lNRF9OT05FLCBKU0lNRF9TU0UyKTsKLSNlbmRpZiAvKiAhSlNJTURfTUFTS0ZVTkNfTk9UX1NVUFBPUlRFRCAqLwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJkY3QiLCAyKSkgewotICAgICAgLyogU2VsZWN0IERDVCBhbGdvcml0aG0uICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImludCIsIDEpKSB7Ci0JY2luZm8tPmRjdF9tZXRob2QgPSBKRENUX0lTTE9XOwotICAgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiZmFzdCIsIDIpKSB7Ci0JY2luZm8tPmRjdF9tZXRob2QgPSBKRENUX0lGQVNUOwotICAgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiZmxvYXQiLCAyKSkgewotCWNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9GTE9BVDsKLSAgICAgIH0gZWxzZQotCXVzYWdlKCk7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImRlYnVnIiwgMSkgfHwga2V5bWF0Y2goYXJnLCAidmVyYm9zZSIsIDEpKSB7Ci0gICAgICAvKiBFbmFibGUgZGVidWcgcHJpbnRvdXRzLiAqLwotICAgICAgLyogT24gZmlyc3QgLWQsIHByaW50IHZlcnNpb24gaWRlbnRpZmljYXRpb24gKi8KLSAgICAgIHN0YXRpYyBib29sZWFuIHByaW50ZWRfdmVyc2lvbiA9IEZBTFNFOwotCi0gICAgICBpZiAoISBwcmludGVkX3ZlcnNpb24pIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBDSlBFRywgdmVyc2lvbiAlc1xuJXNcbiIsCi0JCUpWRVJTSU9OLCBKQ09QWVJJR0hUKTsKLQlmcHJpbnRmKHN0ZGVyciwKLQkJIlxueDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5LCB2ZXJzaW9uICVzXG5cbiIsCi0JCUpQRUdfU0lNREVYVF9WRVJfU1RSKTsKLSNpZm5kZWYgSlNJTURfTU9ERUlORk9fTk9UX1NVUFBPUlRFRAotCXByaW50X3NpbWRfaW5mbyhzdGRlcnIsICJTSU1EIGluc3RydWN0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIHN5c3RlbSA6IiwKLQkJCWpwZWdfc2ltZF9zdXBwb3J0KE5VTEwpKTsKLQotCWZwcmludGYoc3RkZXJyLCAiXG4gICAgICA9PT0gU0lNRCBPcGVyYXRpb24gTW9kZXMgPT09XG4iKTsKLSNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECi0JcHJpbnRfc2ltZF9pbmZvKHN0ZGVyciwgIkFjY3VyYXRlIGludGVnZXIgRENUICAoLWRjdCBpbnQpICAgOiIsCi0JCQlqcGVnX3NpbWRfZm9yd2FyZF9kY3QoY2luZm8sIEpEQ1RfSVNMT1cpKTsKLSNlbmRpZgotI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKLQlwcmludF9zaW1kX2luZm8oc3RkZXJyLCAiRmFzdCBpbnRlZ2VyIERDVCAgICAgICgtZGN0IGZhc3QpICA6IiwKLQkJCWpwZWdfc2ltZF9mb3J3YXJkX2RjdChjaW5mbywgSkRDVF9JRkFTVCkpOwotI2VuZGlmCi0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotCXByaW50X3NpbWRfaW5mbyhzdGRlcnIsICJGbG9hdGluZy1wb2ludCBEQ1QgICAgKC1kY3QgZmxvYXQpIDoiLAotCQkJanBlZ19zaW1kX2ZvcndhcmRfZGN0KGNpbmZvLCBKRENUX0ZMT0FUKSk7Ci0jZW5kaWYKLQlwcmludF9zaW1kX2luZm8oc3RkZXJyLCAiRG93bnNhbXBsaW5nICgtc2FtcGxlIDJ4MiBvciAyeDEpICA6IiwKLQkJCWpwZWdfc2ltZF9kb3duc2FtcGxlcihjaW5mbykpOwotCXByaW50X3NpbWRfaW5mbyhzdGRlcnIsICJDb2xvcnNwYWNlIGNvbnZlcnNpb24gKFJHQi0+WUNiQ3IpIDoiLAotCQkJanBlZ19zaW1kX2NvbG9yX2NvbnZlcnRlcihjaW5mbykpOwotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSNlbmRpZiAvKiAhSlNJTURfTU9ERUlORk9fTk9UX1NVUFBPUlRFRCAqLwotCXByaW50ZWRfdmVyc2lvbiA9IFRSVUU7Ci0gICAgICB9Ci0gICAgICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCsrOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJncmF5c2NhbGUiLCAyKSB8fCBrZXltYXRjaChhcmcsICJncmV5c2NhbGUiLDIpKSB7Ci0gICAgICAvKiBGb3JjZSBhIG1vbm9jaHJvbWUgSlBFRyBmaWxlIHRvIGJlIGdlbmVyYXRlZC4gKi8KLSAgICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19HUkFZU0NBTEUpOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJtYXhtZW1vcnkiLCAzKSkgewotICAgICAgLyogTWF4aW11bSBtZW1vcnkgaW4gS2IgKG9yIE1iIHdpdGggJ20nKS4gKi8KLSAgICAgIGxvbmcgbHZhbDsKLSAgICAgIGNoYXIgY2ggPSAneCc7Ci0KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVsZCVjIiwgJmx2YWwsICZjaCkgPCAxKQotCXVzYWdlKCk7Ci0gICAgICBpZiAoY2ggPT0gJ20nIHx8IGNoID09ICdNJykKLQlsdmFsICo9IDEwMDBMOwotICAgICAgY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UgPSBsdmFsICogMTAwMEw7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm9wdGltaXplIiwgMSkgfHwga2V5bWF0Y2goYXJnLCAib3B0aW1pc2UiLCAxKSkgewotICAgICAgLyogRW5hYmxlIGVudHJvcHkgcGFybSBvcHRpbWl6YXRpb24uICovCi0jaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECi0gICAgICBjaW5mby0+b3B0aW1pemVfY29kaW5nID0gVFJVRTsKLSNlbHNlCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSwgZW50cm9weSBvcHRpbWl6YXRpb24gd2FzIG5vdCBjb21waWxlZFxuIiwKLQkgICAgICBwcm9nbmFtZSk7Ci0gICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0jZW5kaWYKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib3V0ZmlsZSIsIDQpKSB7Ci0gICAgICAvKiBTZXQgb3V0cHV0IGZpbGUgbmFtZS4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIG91dGZpbGVuYW1lID0gYXJndlthcmduXTsJLyogc2F2ZSBpdCBhd2F5IGZvciBsYXRlciB1c2UgKi8KLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicHJvZ3Jlc3NpdmUiLCAxKSkgewotICAgICAgLyogU2VsZWN0IHNpbXBsZSBwcm9ncmVzc2l2ZSBtb2RlLiAqLwotI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0gICAgICBzaW1wbGVfcHJvZ3Jlc3NpdmUgPSBUUlVFOwotICAgICAgLyogV2UgbXVzdCBwb3N0cG9uZSBleGVjdXRpb24gdW50aWwgbnVtX2NvbXBvbmVudHMgaXMga25vd24uICovCi0jZWxzZQotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIHByb2dyZXNzaXZlIG91dHB1dCB3YXMgbm90IGNvbXBpbGVkXG4iLAotCSAgICAgIHByb2duYW1lKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSNlbmRpZgotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJxdWFsaXR5IiwgMSkpIHsKLSAgICAgIC8qIFF1YWxpdHkgZmFjdG9yIChxdWFudGl6YXRpb24gdGFibGUgc2NhbGluZyBmYWN0b3IpLiAqLwotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWQiLCAmcXVhbGl0eSkgIT0gMSkKLQl1c2FnZSgpOwotICAgICAgLyogQ2hhbmdlIHNjYWxlIGZhY3RvciBpbiBjYXNlIC1xdGFibGVzIGlzIHByZXNlbnQuICovCi0gICAgICBxX3NjYWxlX2ZhY3RvciA9IGpwZWdfcXVhbGl0eV9zY2FsaW5nKHF1YWxpdHkpOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJxc2xvdHMiLCAyKSkgewotICAgICAgLyogUXVhbnRpemF0aW9uIHRhYmxlIHNsb3QgbnVtYmVycy4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIHFzbG90c2FyZyA9IGFyZ3ZbYXJnbl07Ci0gICAgICAvKiBNdXN0IGRlbGF5IHNldHRpbmcgcXNsb3RzIHVudGlsIGFmdGVyIHdlIGhhdmUgcHJvY2Vzc2VkIGFueQotICAgICAgICogY29sb3JzcGFjZS1kZXRlcm1pbmluZyBzd2l0Y2hlcywgc2luY2UganBlZ19zZXRfY29sb3JzcGFjZSBzZXRzCi0gICAgICAgKiBkZWZhdWx0IHF1YW50IHRhYmxlIG51bWJlcnMuCi0gICAgICAgKi8KLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicXRhYmxlcyIsIDIpKSB7Ci0gICAgICAvKiBRdWFudGl6YXRpb24gdGFibGVzIGZldGNoZWQgZnJvbSBmaWxlLiAqLwotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgcXRhYmxlZmlsZSA9IGFyZ3ZbYXJnbl07Ci0gICAgICAvKiBXZSBwb3N0cG9uZSBhY3R1YWxseSByZWFkaW5nIHRoZSBmaWxlIGluIGNhc2UgLXF1YWxpdHkgY29tZXMgbGF0ZXIuICovCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInJlc3RhcnQiLCAxKSkgewotICAgICAgLyogUmVzdGFydCBpbnRlcnZhbCBpbiBNQ1Ugcm93cyAob3IgaW4gTUNVcyB3aXRoICdiJykuICovCi0gICAgICBsb25nIGx2YWw7Ci0gICAgICBjaGFyIGNoID0gJ3gnOwotCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlbGQlYyIsICZsdmFsLCAmY2gpIDwgMSkKLQl1c2FnZSgpOwotICAgICAgaWYgKGx2YWwgPCAwIHx8IGx2YWwgPiA2NTUzNUwpCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChjaCA9PSAnYicgfHwgY2ggPT0gJ0InKSB7Ci0JY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgPSAodW5zaWduZWQgaW50KSBsdmFsOwotCWNpbmZvLT5yZXN0YXJ0X2luX3Jvd3MgPSAwOyAvKiBlbHNlIHByaW9yICctcmVzdGFydCBuJyBvdmVycmlkZXMgbWUgKi8KLSAgICAgIH0gZWxzZSB7Ci0JY2luZm8tPnJlc3RhcnRfaW5fcm93cyA9IChpbnQpIGx2YWw7Ci0JLyogcmVzdGFydF9pbnRlcnZhbCB3aWxsIGJlIGNvbXB1dGVkIGR1cmluZyBzdGFydHVwICovCi0gICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInNhbXBsZSIsIDIpKSB7Ci0gICAgICAvKiBTZXQgc2FtcGxpbmcgZmFjdG9ycy4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIHNhbXBsZWFyZyA9IGFyZ3ZbYXJnbl07Ci0gICAgICAvKiBNdXN0IGRlbGF5IHNldHRpbmcgc2FtcGxlIGZhY3RvcnMgdW50aWwgYWZ0ZXIgd2UgaGF2ZSBwcm9jZXNzZWQgYW55Ci0gICAgICAgKiBjb2xvcnNwYWNlLWRldGVybWluaW5nIHN3aXRjaGVzLCBzaW5jZSBqcGVnX3NldF9jb2xvcnNwYWNlIHNldHMKLSAgICAgICAqIGRlZmF1bHQgc2FtcGxpbmcgZmFjdG9ycy4KLSAgICAgICAqLwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJzY2FucyIsIDIpKSB7Ci0gICAgICAvKiBTZXQgc2NhbiBzY3JpcHQuICovCi0jaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBzY2Fuc2FyZyA9IGFyZ3ZbYXJnbl07Ci0gICAgICAvKiBXZSBtdXN0IHBvc3Rwb25lIHJlYWRpbmcgdGhlIGZpbGUgaW4gY2FzZSAtcHJvZ3Jlc3NpdmUgYXBwZWFycy4gKi8KLSNlbHNlCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSwgbXVsdGktc2NhbiBvdXRwdXQgd2FzIG5vdCBjb21waWxlZFxuIiwKLQkgICAgICBwcm9nbmFtZSk7Ci0gICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0jZW5kaWYKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAic21vb3RoIiwgMikpIHsKLSAgICAgIC8qIFNldCBpbnB1dCBzbW9vdGhpbmcgZmFjdG9yLiAqLwotICAgICAgaW50IHZhbDsKLQotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWQiLCAmdmFsKSAhPSAxKQotCXVzYWdlKCk7Ci0gICAgICBpZiAodmFsIDwgMCB8fCB2YWwgPiAxMDApCi0JdXNhZ2UoKTsKLSAgICAgIGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yID0gdmFsOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJ0YXJnYSIsIDEpKSB7Ci0gICAgICAvKiBJbnB1dCBmaWxlIGlzIFRhcmdhIGZvcm1hdC4gKi8KLSAgICAgIGlzX3RhcmdhID0gVFJVRTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICB1c2FnZSgpOwkJCS8qIGJvZ3VzIHN3aXRjaCAqLwotICAgIH0KLSAgfQotCi0gIC8qIFBvc3Qtc3dpdGNoLXNjYW5uaW5nIGNsZWFudXAgKi8KLQotICBpZiAoZm9yX3JlYWwpIHsKLQotICAgIC8qIFNldCBxdWFudGl6YXRpb24gdGFibGVzIGZvciBzZWxlY3RlZCBxdWFsaXR5LiAqLwotICAgIC8qIFNvbWUgb3IgYWxsIG1heSBiZSBvdmVycmlkZGVuIGlmIC1xdGFibGVzIGlzIHByZXNlbnQuICovCi0gICAganBlZ19zZXRfcXVhbGl0eShjaW5mbywgcXVhbGl0eSwgZm9yY2VfYmFzZWxpbmUpOwotCi0gICAgaWYgKHF0YWJsZWZpbGUgIT0gTlVMTCkJLyogcHJvY2VzcyAtcXRhYmxlcyBpZiBpdCB3YXMgcHJlc2VudCAqLwotICAgICAgaWYgKCEgcmVhZF9xdWFudF90YWJsZXMoY2luZm8sIHF0YWJsZWZpbGUsCi0JCQkgICAgICBxX3NjYWxlX2ZhY3RvciwgZm9yY2VfYmFzZWxpbmUpKQotCXVzYWdlKCk7Ci0KLSAgICBpZiAocXNsb3RzYXJnICE9IE5VTEwpCS8qIHByb2Nlc3MgLXFzbG90cyBpZiBpdCB3YXMgcHJlc2VudCAqLwotICAgICAgaWYgKCEgc2V0X3F1YW50X3Nsb3RzKGNpbmZvLCBxc2xvdHNhcmcpKQotCXVzYWdlKCk7Ci0KLSAgICBpZiAoc2FtcGxlYXJnICE9IE5VTEwpCS8qIHByb2Nlc3MgLXNhbXBsZSBpZiBpdCB3YXMgcHJlc2VudCAqLwotICAgICAgaWYgKCEgc2V0X3NhbXBsZV9mYWN0b3JzKGNpbmZvLCBzYW1wbGVhcmcpKQotCXVzYWdlKCk7Ci0KLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICAgIGlmIChzaW1wbGVfcHJvZ3Jlc3NpdmUpCS8qIHByb2Nlc3MgLXByb2dyZXNzaXZlOyAtc2NhbnMgY2FuIG92ZXJyaWRlICovCi0gICAgICBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbihjaW5mbyk7Ci0jZW5kaWYKLQotI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotICAgIGlmIChzY2Fuc2FyZyAhPSBOVUxMKQkvKiBwcm9jZXNzIC1zY2FucyBpZiBpdCB3YXMgcHJlc2VudCAqLwotICAgICAgaWYgKCEgcmVhZF9zY2FuX3NjcmlwdChjaW5mbywgc2NhbnNhcmcpKQotCXVzYWdlKCk7Ci0jZW5kaWYKLSAgfQotCi0gIHJldHVybiBhcmduOwkJCS8qIHJldHVybiBpbmRleCBvZiBuZXh0IGFyZyAoZmlsZSBuYW1lKSAqLwotfQotCi0KLS8qCi0gKiBDaGVjayBmb3Igb3ZlcndyaXRlIG9mIGFuIGV4aXN0aW5nIGZpbGU7IGNsZWFyIGl0IHdpdGggdXNlcgotICovCi0KLSNpZm5kZWYgTk9fT1ZFUldSSVRFX0NIRUNLCi0KLUxPQ0FMKGJvb2xlYW4pCi1pc193cml0ZV9vayAoY2hhciAqIG91dGZuYW1lKQotewotICBGSUxFICogb2ZpbGU7Ci0gIGludCBjaDsKLQotICBvZmlsZSA9IGZvcGVuKG91dGZuYW1lLCBSRUFEX0JJTkFSWSk7Ci0gIGlmIChvZmlsZSA9PSBOVUxMKQotICAgIHJldHVybiBUUlVFOwkJLyogbm90IHByZXNlbnQgKi8KLSAgZmNsb3NlKG9maWxlKTsJCS8qIG9vcHMsIGl0IGlzIHByZXNlbnQgKi8KLQotICBmb3IgKDs7KSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlcyBhbHJlYWR5IGV4aXN0cywgb3ZlcndyaXRlIGl0PyBbeS9uXSAiLAotCSAgICBvdXRmbmFtZSk7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgY2ggPSBnZXRjKHN0ZGluKTsKLSAgICBpZiAoY2ggIT0gJ1xuJykJCS8qIGZsdXNoIHJlc3Qgb2YgbGluZSAqLwotICAgICAgd2hpbGUgKGdldGMoc3RkaW4pICE9ICdcbicpCi0JLyogbm90aGluZyAqLzsKLQotICAgIHN3aXRjaCAoY2gpIHsKLSAgICBjYXNlICdZJzoKLSAgICBjYXNlICd5JzoKLSAgICAgIHJldHVybiBUUlVFOwotICAgIGNhc2UgJ04nOgotICAgIGNhc2UgJ24nOgotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIC8qIG90aGVyd2lzZSwgYXNrIGFnYWluICovCi0gICAgfQotICB9Ci19Ci0KLSNlbmRpZgotCi0KLS8qCi0gKiBQcm9jZXNzIGEgc2luZ2xlIGlucHV0IGZpbGUgbmFtZSwgYW5kIHJldHVybiBpdHMgaW5kZXggaW4gYXJndltdLgotICogRmlsZSBuYW1lcyBhdCBvciB0byBsZWZ0IG9mIG9sZF9maWxlX2luZGV4IGhhdmUgYmVlbiBwcm9jZXNzZWQgYWxyZWFkeS4KLSAqLwotCi1MT0NBTChpbnQpCi1wcm9jZXNzX29uZV9maWxlIChpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGludCBvbGRfZmlsZV9pbmRleCkKLXsKLSAgc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IGNpbmZvOwotICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgamVycjsKLSAgY2hhciAqaW5maWxlbmFtZTsKLSAgY2hhciB3b3JrZmlsZW5hbWVbUEFUSF9NQVhdOwotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBzdHJ1Y3QgY2RqcGVnX3Byb2dyZXNzX21nciBwcm9ncmVzczsKLSNlbmRpZgotICBpbnQgZmlsZV9pbmRleDsKLSAgY2pwZWdfc291cmNlX3B0ciBzcmNfbWdyOwotICBGSUxFICogaW5wdXRfZmlsZSA9IE5VTEw7Ci0gIEZJTEUgKiBvdXRwdXRfZmlsZSA9IE5VTEw7Ci0gIEpESU1FTlNJT04gbnVtX3NjYW5saW5lczsKLQotICAvKiBJbml0aWFsaXplIHRoZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdCB3aXRoIGRlZmF1bHQgZXJyb3IgaGFuZGxpbmcuICovCi0gIGNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZqZXJyKTsKLSAganBlZ19jcmVhdGVfY29tcHJlc3MoJmNpbmZvKTsKLSAgLyogQWRkIHNvbWUgYXBwbGljYXRpb24tc3BlY2lmaWMgZXJyb3IgbWVzc2FnZXMgKGZyb20gY2RlcnJvci5oKSAqLwotICBqZXJyLmFkZG9uX21lc3NhZ2VfdGFibGUgPSBjZGpwZWdfbWVzc2FnZV90YWJsZTsKLSAgamVyci5maXJzdF9hZGRvbl9tZXNzYWdlID0gSk1TR19GSVJTVEFERE9OQ09ERTsKLSAgamVyci5sYXN0X2FkZG9uX21lc3NhZ2UgPSBKTVNHX0xBU1RBRERPTkNPREU7Ci0KLSAgLyogTm93IHNhZmUgdG8gZW5hYmxlIHNpZ25hbCBjYXRjaGVyLiAqLwotI2lmZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKLSAgZW5hYmxlX3NpZ25hbF9jYXRjaGVyKChqX2NvbW1vbl9wdHIpICZjaW5mbyk7Ci0jZW5kaWYKLQotICAvKiBJbml0aWFsaXplIEpQRUcgcGFyYW1ldGVycy4KLSAgICogTXVjaCBvZiB0aGlzIG1heSBiZSBvdmVycmlkZGVuIGxhdGVyLgotICAgKiBJbiBwYXJ0aWN1bGFyLCB3ZSBkb24ndCB5ZXQga25vdyB0aGUgaW5wdXQgZmlsZSdzIGNvbG9yIHNwYWNlLAotICAgKiBidXQgd2UgbmVlZCB0byBwcm92aWRlIHNvbWUgdmFsdWUgZm9yIGpwZWdfc2V0X2RlZmF1bHRzKCkgdG8gd29yay4KLSAgICovCi0KLSAgY2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOyAvKiBhcmJpdHJhcnkgZ3Vlc3MgKi8KLSAganBlZ19zZXRfZGVmYXVsdHMoJmNpbmZvKTsKLQotICAvKiBTY2FuIGNvbW1hbmQgbGluZSB0byBmaW5kIG5leHQgZmlsZSBuYW1lLgotICAgKiBJdCBpcyBjb252ZW5pZW50IHRvIHVzZSBqdXN0IG9uZSBzd2l0Y2gtcGFyc2luZyByb3V0aW5lLCBidXQgdGhlIHN3aXRjaAotICAgKiB2YWx1ZXMgcmVhZCBoZXJlIGFyZSBpZ25vcmVkOyB3ZSB3aWxsIHJlc2NhbiB0aGUgc3dpdGNoZXMgYWZ0ZXIgb3BlbmluZwotICAgKiB0aGUgaW5wdXQgZmlsZS4KLSAgICovCi0KLSAgZmlsZV9pbmRleCA9IHBhcnNlX3N3aXRjaGVzKCZjaW5mbywgYXJnYywgYXJndiwgb2xkX2ZpbGVfaW5kZXgsIEZBTFNFKTsKLSAgaWYgKGZpbGVfaW5kZXggPj0gYXJnYykgewotICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG1pc3NpbmcgaW5wdXQgZmlsZSBuYW1lXG4iLCBwcm9nbmFtZSk7Ci0gICAgdXNhZ2UoKTsKLSAgfQotCi0gIC8qIE9wZW4gdGhlIGlucHV0IGZpbGUuICovCi0gIGluZmlsZW5hbWUgPSBhcmd2W2ZpbGVfaW5kZXhdOwotICBpZiAoKGlucHV0X2ZpbGUgPSBmb3BlbihpbmZpbGVuYW1lLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgaW5maWxlbmFtZSk7Ci0gICAgZ290byBmYWlsOwotICB9Ci0KLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgc3RhcnRfcHJvZ3Jlc3NfbW9uaXRvcigoal9jb21tb25fcHRyKSAmY2luZm8sICZwcm9ncmVzcyk7Ci0jZW5kaWYKLQotICAvKiBGaWd1cmUgb3V0IHRoZSBpbnB1dCBmaWxlIGZvcm1hdCwgYW5kIHNldCB1cCB0byByZWFkIGl0LiAqLwotICBzcmNfbWdyID0gc2VsZWN0X2ZpbGVfdHlwZSgmY2luZm8sIGlucHV0X2ZpbGUpOwotICBzcmNfbWdyLT5pbnB1dF9maWxlID0gaW5wdXRfZmlsZTsKLQotICAvKiBSZWFkIHRoZSBpbnB1dCBmaWxlIGhlYWRlciB0byBvYnRhaW4gZmlsZSBzaXplICYgY29sb3JzcGFjZS4gKi8KLSAgKCpzcmNfbWdyLT5zdGFydF9pbnB1dCkgKCZjaW5mbywgc3JjX21ncik7Ci0KLSAgLyogTm93IHRoYXQgd2Uga25vdyBpbnB1dCBjb2xvcnNwYWNlLCBmaXggY29sb3JzcGFjZS1kZXBlbmRlbnQgZGVmYXVsdHMgKi8KLSAganBlZ19kZWZhdWx0X2NvbG9yc3BhY2UoJmNpbmZvKTsKLQotICAvKiBBZGp1c3QgZGVmYXVsdCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGJ5IHJlLXBhcnNpbmcgdGhlIG9wdGlvbnMgKi8KLSAgZmlsZV9pbmRleCA9IHBhcnNlX3N3aXRjaGVzKCZjaW5mbywgYXJnYywgYXJndiwgb2xkX2ZpbGVfaW5kZXgsIFRSVUUpOwotCi0gIC8qIElmIHVzZXIgZGlkbid0IHN1cHBseSAtb3V0ZmlsZSBzd2l0Y2gsIHNlbGVjdCBvdXRwdXQgZmlsZSBuYW1lLiAqLwotICBpZiAob3V0ZmlsZW5hbWUgPT0gTlVMTCkgewotICAgIGludCBpOwotCi0gICAgb3V0ZmlsZW5hbWUgPSB3b3JrZmlsZW5hbWU7Ci0gICAgLyogTWFrZSBvdXRmaWxlbmFtZSBiZSBpbmZpbGVuYW1lIHdpdGggLmpwZyBzdWJzdGl0dXRlZCBmb3IgZXh0ZW5zaW9uICovCi0gICAgc3RyY3B5KG91dGZpbGVuYW1lLCBpbmZpbGVuYW1lKTsKLSAgICBmb3IgKGkgPSBzdHJsZW4ob3V0ZmlsZW5hbWUpLTE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICBzd2l0Y2ggKG91dGZpbGVuYW1lW2ldKSB7Ci0gICAgICBjYXNlICc6JzoKLSAgICAgIGNhc2UgJy8nOgotICAgICAgY2FzZSAnXFwnOgotCWkgPSAwOwkJCS8qIHN0b3Agc2Nhbm5pbmcgKi8KLQlicmVhazsKLSAgICAgIGNhc2UgJy4nOgotCW91dGZpbGVuYW1lW2ldID0gJ1wwJzsJLyogbG9wIG9mZiBleGlzdGluZyBleHRlbnNpb24gKi8KLQlpID0gMDsJCQkvKiBzdG9wIHNjYW5uaW5nICovCi0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCWJyZWFrOwkJCS8qIGtlZXAgc2Nhbm5pbmcgKi8KLSAgICAgIH0KLSAgICB9Ci0gICAgc3RyY2F0KG91dGZpbGVuYW1lLCAiLmpwZyIpOwotICB9Ci0KLSAgZnByaW50ZihzdGRlcnIsICJDb21wcmVzc2luZyAlcyA9PiAlc1xuIiwgaW5maWxlbmFtZSwgb3V0ZmlsZW5hbWUpOwotI2lmbmRlZiBOT19PVkVSV1JJVEVfQ0hFQ0sKLSAgaWYgKCEgaXNfd3JpdGVfb2sob3V0ZmlsZW5hbWUpKQotICAgIGdvdG8gZmFpbDsKLSNlbmRpZgotCi0gIC8qIE9wZW4gdGhlIG91dHB1dCBmaWxlLiAqLwotICBpZiAoKG91dHB1dF9maWxlID0gZm9wZW4ob3V0ZmlsZW5hbWUsIFdSSVRFX0JJTkFSWSkpID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBjcmVhdGUgJXNcbiIsIHByb2duYW1lLCBvdXRmaWxlbmFtZSk7Ci0gICAgZ290byBmYWlsOwotICB9Ci0KLSAgLyogU3BlY2lmeSBkYXRhIGRlc3RpbmF0aW9uIGZvciBjb21wcmVzc2lvbiAqLwotICBqcGVnX3N0ZGlvX2Rlc3QoJmNpbmZvLCBvdXRwdXRfZmlsZSk7Ci0KLSAgLyogU3RhcnQgY29tcHJlc3NvciAqLwotICBqcGVnX3N0YXJ0X2NvbXByZXNzKCZjaW5mbywgVFJVRSk7Ci0KLSAgLyogUHJvY2VzcyBkYXRhICovCi0gIHdoaWxlIChjaW5mby5uZXh0X3NjYW5saW5lIDwgY2luZm8uaW1hZ2VfaGVpZ2h0KSB7Ci0gICAgbnVtX3NjYW5saW5lcyA9ICgqc3JjX21nci0+Z2V0X3BpeGVsX3Jvd3MpICgmY2luZm8sIHNyY19tZ3IpOwotICAgICh2b2lkKSBqcGVnX3dyaXRlX3NjYW5saW5lcygmY2luZm8sIHNyY19tZ3ItPmJ1ZmZlciwgbnVtX3NjYW5saW5lcyk7Ci0gIH0KLQotICAvKiBGaW5pc2ggY29tcHJlc3Npb24gYW5kIHJlbGVhc2UgbWVtb3J5ICovCi0gICgqc3JjX21nci0+ZmluaXNoX2lucHV0KSAoJmNpbmZvLCBzcmNfbWdyKTsKLSAganBlZ19maW5pc2hfY29tcHJlc3MoJmNpbmZvKTsKLQotICAvKiBDbGVhbiB1cCBhbmQgZXhpdCAqLwotZmFpbDoKLSAganBlZ19kZXN0cm95X2NvbXByZXNzKCZjaW5mbyk7Ci0KLSAgaWYgKGlucHV0X2ZpbGUgIT0gTlVMTCkgZmNsb3NlKGlucHV0X2ZpbGUpOwotICBpZiAob3V0cHV0X2ZpbGUgIT0gTlVMTCkgZmNsb3NlKG91dHB1dF9maWxlKTsKLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBlbmRfcHJvZ3Jlc3NfbW9uaXRvcigoal9jb21tb25fcHRyKSAmY2luZm8pOwotI2VuZGlmCi0KLSAgLyogRGlzYWJsZSBzaWduYWwgY2F0Y2hlci4gKi8KLSNpZmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCi0gIGVuYWJsZV9zaWduYWxfY2F0Y2hlcigoal9jb21tb25fcHRyKSBOVUxMKTsKLSNlbmRpZgotCi0gIHJldHVybiBmaWxlX2luZGV4OwotfQotCi0KLS8qCi0gKiBUaGUgbWFpbiBwcm9ncmFtLgotICovCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICBpbnQgZmlsZV9pbmRleDsKLQotICAvKiBPbiBNYWMsIGZldGNoIGEgY29tbWFuZCBsaW5lLiAqLwotI2lmZGVmIFVTRV9DQ09NTUFORAotICBhcmdjID0gY2NvbW1hbmQoJmFyZ3YpOwotI2VuZGlmCi0KLSNpZmRlZiBNU0RPUwotICBwcm9nbmFtZSA9ICJjanBlZyI7CQkvKiBET1MgdGVuZHMgdG8gYmUgdG9vIHZlcmJvc2UgYWJvdXQgYXJndlswXSAqLwotI2Vsc2UKLSAgcHJvZ25hbWUgPSBhcmd2WzBdOwotICBpZiAocHJvZ25hbWUgPT0gTlVMTCB8fCBwcm9nbmFtZVswXSA9PSAwKQotICAgIHByb2duYW1lID0gImNqcGVnIjsJCS8qIGluIGNhc2UgQyBsaWJyYXJ5IGRvZXNuJ3QgcHJvdmlkZSBpdCAqLwotI2VuZGlmCi0KLSAgLyogVGhlIGRlZmF1bHQgbWF4bWVtIG11c3QgYmUgY29tcHV0ZWQgb25seSBvbmNlIGF0IHByb2dyYW0gc3RhcnR1cCwKLSAgICogc2luY2UgcmVsZWFzaW5nIG1lbW9yeSB3aXRoIGZyZWUoKSB3b24ndCBnaXZlIGl0IGJhY2sgdG8gdGhlIE9TLgotICAgKi8KLSNpZmRlZiBGUkVFX01FTV9FU1RJTUFURQotICBkZWZhdWx0X21heG1lbSA9IEZSRUVfTUVNX0VTVElNQVRFOwotI2Vsc2UKLSAgZGVmYXVsdF9tYXhtZW0gPSAwOwotI2VuZGlmCi0KLSAgLyogU2NhbiBjb21tYW5kIGxpbmUsIHBhcnNlIHN3aXRjaGVzIGFuZCBsb2NhdGUgaW5wdXQgZmlsZSBuYW1lcyAqLwotCi0gIGlmIChhcmdjIDwgMikKLSAgICB1c2FnZSgpOwkJCS8qIG5vdGhpbmcgb24gdGhlIGNvbW1hbmQgbGluZT8/ICovCi0KLSAgZmlsZV9pbmRleCA9IDA7Ci0KLSAgd2hpbGUgKGZpbGVfaW5kZXggPCBhcmdjLTEpCi0gICAgZmlsZV9pbmRleCA9IHByb2Nlc3Nfb25lX2ZpbGUoYXJnYywgYXJndiwgZmlsZV9pbmRleCk7Ci0KLSAgLyogQWxsIGRvbmUuICovCi0gIGV4aXQoRVhJVF9TVUNDRVNTKTsKLSAgcmV0dXJuIDA7CQkJLyogc3VwcHJlc3Mgbm8tcmV0dXJuLXZhbHVlIHdhcm5pbmdzICovCi19CmRpZmYgLS1naXQgYS9hbHR1aS9kanBlZy5jIGIvYWx0dWkvZGpwZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAwMGQ0NS4uMDAwMDAwMAotLS0gYS9hbHR1aS9kanBlZy5jCisrKyAvZGV2L251bGwKQEAgLTEsODM2ICswLDAgQEAKLS8qCi0gKiBhbHRlcm5hdGUgZGpwZWcuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi0gKiBUaGlzIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgZm9yIFNJTUQgZXh0ZW5zaW9uLgotICogTGFzdCBNb2RpZmllZCA6IEphbnVhcnkgNiwgMjAwNgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGFuIGFsdGVybmF0ZSB1c2VyIGludGVyZmFjZSBmb3IgdGhlIEpQRUcgZGVjb21wcmVzc29yLgotICogT25lIG9yIG1vcmUgaW5wdXQgZmlsZXMgYXJlIG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGFuZCBvdXRwdXQgZmlsZQotICogbmFtZXMgYXJlIGNyZWF0ZWQgYnkgc3Vic3RpdHV0aW5nIGFuIGFwcHJvcHJpYXRlIGV4dGVuc2lvbi4KLSAqLwotCi0jaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLwotI2luY2x1ZGUgImp2ZXJzaW9uLmgiCQkvKiBmb3IgdmVyc2lvbiBtZXNzYWdlICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgkJLyogdG8gZGVjbGFyZSBpc3ByaW50KCkgKi8KLQotI2lmZGVmIFVTRV9DQ09NTUFORAkJLyogY29tbWFuZC1saW5lIHJlYWRlciBmb3IgTWFjaW50b3NoICovCi0jaWZkZWYgX19NV0VSS1NfXwotI2luY2x1ZGUgPFNJT1VYLmg+ICAgICAgICAgICAgICAvKiBNZXRyb3dlcmtzIG5lZWRzIHRoaXMgKi8KLSNpbmNsdWRlIDxjb25zb2xlLmg+CQkvKiAuLi4gYW5kIHRoaXMgKi8KLSNlbmRpZgotI2lmZGVmIFRISU5LX0MKLSNpbmNsdWRlIDxjb25zb2xlLmg+CQkvKiBUaGluayBkZWNsYXJlcyBpdCBoZXJlICovCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFBBVEhfTUFYCQkvKiBBTlNJIG1heGltdW0tcGF0aG5hbWUtbGVuZ3RoIGNvbnN0YW50ICovCi0jZGVmaW5lIFBBVEhfTUFYIDI1NgotI2VuZGlmCi0KLQotLyogQ3JlYXRlIHRoZSBhZGQtb24gbWVzc2FnZSBzdHJpbmcgdGFibGUuICovCi0KLSNkZWZpbmUgSk1FU1NBR0UoY29kZSxzdHJpbmcpCXN0cmluZyAsCi0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2RqcGVnX21lc3NhZ2VfdGFibGVbXSA9IHsKLSNpbmNsdWRlICJjZGVycm9yLmgiCi0gIE5VTEwKLX07Ci0KLQotLyoKLSAqIFNJTUQgRXh0OiBjb21waWxlci1zcGVjaWZpYyBoYWNrcyB0byBlbmFibGUgZmlsZW5hbWUgd2lsZC1jYXJkIGV4cGFuc2lvbgotICovCi0KLSNpZmRlZiBfTVNDX1ZFUgkJLyogTWljcm9zb2Z0IFZpc3VhbCBDKysgKi8KLS8qIGZyb20gc2V0YXJndi5jIChzZXRhcmd2Lm9iaikgKi8KLS8qIFRlc3RlZCB1bmRlciBWaXN1YWwgQysrIFY2LjAsIFRvb2xraXQgMjAwMywgYW5kIDIwMDUgRXhwcmVzcyBFZGl0aW9uICovCi1pbnQgX19jZGVjbCBfc2V0YXJndih2b2lkKSB7IGludCBfX2NkZWNsIF9fc2V0YXJndih2b2lkKTsgcmV0dXJuIF9fc2V0YXJndigpOyB9Ci0jZW5kaWYKLSNpZmRlZiBfX0JPUkxBTkRDX18JLyogQm9ybGFuZCBDKysgKi8KLS8qIGZyb20gd2lsZGFyZ3MuYyAod2lsZGFyZ3Mub2JqKSAqLwotLyogVGVzdGVkIHVuZGVyIEJvcmxhbmQgQysrIENvbXBpbGVyIDUuNSAod2luMzIpICovCi0jaW5jbHVkZSA8d2lsZGFyZ3MuaD4KLXR5cGVkZWYgdm9pZCBfUlRMRU5UUlkgKCogX1JUTEVOVFJZIF9hcmd2X2V4cGFuZF9mbmMpKGNoYXIgKiwgX1BGTl9BRERBUkcpOwotX2FyZ3ZfZXhwYW5kX2ZuYyBfYXJndl9leHBhbmRfcHRyID0gX2V4cGFuZF93aWxkOwotI2VuZGlmCi0KLQotLyoKLSAqIEF1dG9tYXRpYyBkZXRlcm1pbmF0aW9uIG9mIGF2YWlsYWJsZSBtZW1vcnkuCi0gKi8KLQotc3RhdGljIGxvbmcgZGVmYXVsdF9tYXhtZW07CS8qIHNhdmVzIHZhbHVlIGRldGVybWluZWQgYXQgc3RhcnR1cCwgb3IgMCAqLwotCi0jaWZuZGVmIEZSRUVfTUVNX0VTVElNQVRFCS8qIG1heSBiZSBkZWZpbmVkIGZyb20gY29tbWFuZCBsaW5lICovCi0KLSNpZmRlZiBNU0RPUwkJCS8qIEZvciBNUy1ET1MgKHVubGVzcyBmbGF0LW1lbW9yeSBtb2RlbCkgKi8KLQotI2luY2x1ZGUgPGRvcy5oPgkJLyogZm9yIGFjY2VzcyB0byBpbnRkb3MoKSBjYWxsICovCi0KLUxPQ0FMKGxvbmcpCi11bnVzZWRfZG9zX21lbW9yeSAodm9pZCkKLS8qIE9idGFpbiB0b3RhbCBhbW91bnQgb2YgdW5hbGxvY2F0ZWQgRE9TIG1lbW9yeSAqLwotewotICB1bmlvbiBSRUdTIHJlZ3M7Ci0gIGxvbmcgbnBhcmFzOwotCi0gIHJlZ3MuaC5haCA9IDB4NDg7CQkvKiBET1MgZnVuY3Rpb24gQWxsb2NhdGUgTWVtb3J5IEJsb2NrICovCi0gIHJlZ3MueC5ieCA9IDB4RkZGRjsJCS8qIEFzayBmb3IgbW9yZSBtZW1vcnkgdGhhbiBET1MgY2FuIGhhdmUgKi8KLSAgKHZvaWQpIGludGRvcygmcmVncywgJnJlZ3MpOwotICAvKiBET1Mgd2lsbCBmYWlsIGFuZCByZXR1cm4gIyBvZiBwYXJhZ3JhcGhzIGFjdHVhbGx5IGF2YWlsYWJsZSBpbiBCWC4gKi8KLSAgbnBhcmFzID0gKHVuc2lnbmVkIGludCkgcmVncy54LmJ4OwotICAvKiBUaW1lcyAxNiB0byBjb252ZXJ0IHRvIGJ5dGVzLiAqLwotICByZXR1cm4gbnBhcmFzIDw8IDQ7Ci19Ci0KLS8qIFRoZSBkZWZhdWx0IG1lbW9yeSBzZXR0aW5nIGlzIDk1JSBvZiB0aGUgYXZhaWxhYmxlIHNwYWNlLiAqLwotI2RlZmluZSBGUkVFX01FTV9FU1RJTUFURSAgKCh1bnVzZWRfZG9zX21lbW9yeSgpICogOTVMKSAvIDEwMEwpCi0KLSNlbmRpZiAvKiBNU0RPUyAqLwotCi0jaWZkZWYgQVRBUkkJCQkvKiBGb3IgQXRhcmkgU1QvU1RFL1RULCBQdXJlIEMgb3IgVHVyYm8gQyAqLwotCi0jaW5jbHVkZSA8ZXh0Lmg+Ci0KLS8qIFRoZSBkZWZhdWx0IG1lbW9yeSBzZXR0aW5nIGlzIDkwJSBvZiB0aGUgYXZhaWxhYmxlIHNwYWNlLiAqLwotI2RlZmluZSBGUkVFX01FTV9FU1RJTUFURSAgKCgobG9uZykgY29yZWxlZnQoKSAqIDkwTCkgLyAxMDBMKQotCi0jZW5kaWYgLyogQVRBUkkgKi8KLQotLyogQWRkIG1lbW9yeS1lc3RpbWF0aW9uIHByb2NlZHVyZXMgZm9yIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIGhlcmUsCi0gKiB3aXRoIGFwcHJvcHJpYXRlICNpZmRlZidzIGFyb3VuZCB0aGVtLgotICovCi0KLSNlbmRpZiAvKiAhRlJFRV9NRU1fRVNUSU1BVEUgKi8KLQotCi0vKgotICogVGhpcyBsaXN0IGRlZmluZXMgdGhlIGtub3duIG91dHB1dCBpbWFnZSBmb3JtYXRzCi0gKiAobm90IGFsbCBvZiB3aGljaCBuZWVkIGJlIHN1cHBvcnRlZCBieSBhIGdpdmVuIHZlcnNpb24pLgotICogWW91IGNhbiBjaGFuZ2UgdGhlIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCBieSBkZWZpbmluZyBERUZBVUxUX0ZNVDsKLSAqIGluZGVlZCwgeW91IGhhZCBiZXR0ZXIgZG8gc28gaWYgeW91IHVuZGVmaW5lIFBQTV9TVVBQT1JURUQuCi0gKi8KLQotdHlwZWRlZiBlbnVtIHsKLQlGTVRfQk1QLAkJLyogQk1QIGZvcm1hdCAoV2luZG93cyBmbGF2b3IpICovCi0JRk1UX0dJRiwJCS8qIEdJRiBmb3JtYXQgKi8KLQlGTVRfT1MyLAkJLyogQk1QIGZvcm1hdCAoT1MvMiBmbGF2b3IpICovCi0JRk1UX1BQTSwJCS8qIFBQTS9QR00gKFBCTVBMVVMgZm9ybWF0cykgKi8KLQlGTVRfUkxFLAkJLyogUkxFIGZvcm1hdCAqLwotCUZNVF9UQVJHQSwJCS8qIFRhcmdhIGZvcm1hdCAqLwotCUZNVF9USUZGCQkvKiBUSUZGIGZvcm1hdCAqLwotfSBJTUFHRV9GT1JNQVRTOwotCi0jaWZuZGVmIERFRkFVTFRfRk1UCQkvKiBzbyBjYW4gb3ZlcnJpZGUgZnJvbSBDRkxBR1MgaW4gTWFrZWZpbGUgKi8KLSNkZWZpbmUgREVGQVVMVF9GTVQJRk1UX0dJRgotI2VuZGlmCi0KLXN0YXRpYyBJTUFHRV9GT1JNQVRTIHJlcXVlc3RlZF9mbXQ7Ci0KLQotLyoKLSAqIEFyZ3VtZW50LXBhcnNpbmcgY29kZS4KLSAqIFRoZSBzd2l0Y2ggcGFyc2VyIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWZ1bCB3aXRoIERPUy1zdHlsZSBjb21tYW5kIGxpbmUKLSAqIHN5bnRheCwgaWUsIGludGVybWl4ZWQgc3dpdGNoZXMgYW5kIGZpbGUgbmFtZXMsIHdoZXJlIG9ubHkgdGhlIHN3aXRjaGVzCi0gKiB0byB0aGUgbGVmdCBvZiBhIGdpdmVuIGZpbGUgbmFtZSBhZmZlY3QgcHJvY2Vzc2luZyBvZiB0aGF0IGZpbGUuCi0gKi8KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqIHByb2duYW1lOwkvKiBwcm9ncmFtIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCi1zdGF0aWMgY2hhciAqIG91dGZpbGVuYW1lOwkvKiBmb3IgLW91dGZpbGUgc3dpdGNoICovCi0KLQotTE9DQUwodm9pZCkKLXVzYWdlICh2b2lkKQotLyogY29tcGxhaW4gYWJvdXQgYmFkIGNvbW1hbmQgbGluZSAqLwotewotICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbc3dpdGNoZXNdIGlucHV0ZmlsZShzKVxuIiwgcHJvZ25hbWUpOwotICBmcHJpbnRmKHN0ZGVyciwgIkxpc3Qgb2YgaW5wdXQgZmlsZXMgbWF5IHVzZSB3aWxkY2FyZHMgKCogYW5kID8pXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZmlsZW5hbWUgaXMgc2FtZSBhcyBpbnB1dCBmaWxlbmFtZSBleGNlcHQgZm9yIGV4dGVuc2lvblxuIik7Ci0KLSAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyAobmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkKTpcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWNvbG9ycyBOICAgICAgUmVkdWNlIGltYWdlIHRvIG5vIG1vcmUgdGhhbiBOIGNvbG9yc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtZmFzdCAgICAgICAgICBGYXN0LCBsb3ctcXVhbGl0eSBwcm9jZXNzaW5nXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1ncmF5c2NhbGUgICAgIEZvcmNlIGdyYXlzY2FsZSBvdXRwdXRcbiIpOwotI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1zY2FsZSBNL04gICAgIFNjYWxlIG91dHB1dCBpbWFnZSBieSBmcmFjdGlvbiBNL04sIGVnLCAxLzhcbiIpOwotI2VuZGlmCi0jaWZkZWYgQk1QX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWJtcCAgICAgICAgICAgU2VsZWN0IEJNUCBvdXRwdXQgZm9ybWF0IChXaW5kb3dzIHN0eWxlKSVzXG4iLAotCSAgKERFRkFVTFRfRk1UID09IEZNVF9CTVAgPyAiIChkZWZhdWx0KSIgOiAiIikpOwotI2VuZGlmCi0jaWZkZWYgR0lGX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWdpZiAgICAgICAgICAgU2VsZWN0IEdJRiBvdXRwdXQgZm9ybWF0JXNcbiIsCi0JICAoREVGQVVMVF9GTVQgPT0gRk1UX0dJRiA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7Ci0jZW5kaWYKLSNpZmRlZiBCTVBfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtb3MyICAgICAgICAgICBTZWxlY3QgQk1QIG91dHB1dCBmb3JtYXQgKE9TLzIgc3R5bGUpJXNcbiIsCi0JICAoREVGQVVMVF9GTVQgPT0gRk1UX09TMiA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7Ci0jZW5kaWYKLSNpZmRlZiBQUE1fU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtcG5tICAgICAgICAgICBTZWxlY3QgUEJNUExVUyAoUFBNL1BHTSkgb3V0cHV0IGZvcm1hdCVzXG4iLAotCSAgKERFRkFVTFRfRk1UID09IEZNVF9QUE0gPyAiIChkZWZhdWx0KSIgOiAiIikpOwotI2VuZGlmCi0jaWZkZWYgUkxFX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJsZSAgICAgICAgICAgU2VsZWN0IFV0YWggUkxFIG91dHB1dCBmb3JtYXQlc1xuIiwKLQkgIChERUZBVUxUX0ZNVCA9PSBGTVRfUkxFID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKLSNlbmRpZgotI2lmZGVmIFRBUkdBX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXRhcmdhICAgICAgICAgU2VsZWN0IFRhcmdhIG91dHB1dCBmb3JtYXQlc1xuIiwKLQkgIChERUZBVUxUX0ZNVCA9PSBGTVRfVEFSR0EgPyAiIChkZWZhdWx0KSIgOiAiIikpOwotI2VuZGlmCi0gIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgZm9yIGFkdmFuY2VkIHVzZXJzOlxuIik7Ci0jaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRjdCBpbnQgICAgICAgVXNlIGludGVnZXIgRENUIG1ldGhvZCVzXG4iLAotCSAgKEpEQ1RfREVGQVVMVCA9PSBKRENUX0lTTE9XID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKLSNlbmRpZgotI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1kY3QgZmFzdCAgICAgIFVzZSBmYXN0IGludGVnZXIgRENUIChsZXNzIGFjY3VyYXRlKSVzXG4iLAotCSAgKEpEQ1RfREVGQVVMVCA9PSBKRENUX0lGQVNUID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKLSNlbmRpZgotI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1kY3QgZmxvYXQgICAgIFVzZSBmbG9hdGluZy1wb2ludCBEQ1QgbWV0aG9kJXNcbiIsCi0JICAoSkRDVF9ERUZBVUxUID09IEpEQ1RfRkxPQVQgPyAiIChkZWZhdWx0KSIgOiAiIikpOwotI2VuZGlmCi0gIGZwcmludGYoc3RkZXJyLCAiICAtZGl0aGVyIGZzICAgICBVc2UgRi1TIGRpdGhlcmluZyAoZGVmYXVsdClcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRpdGhlciBub25lICAgRG9uJ3QgdXNlIGRpdGhlcmluZyBpbiBxdWFudGl6YXRpb25cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRpdGhlciBvcmRlcmVkICBVc2Ugb3JkZXJlZCBkaXRoZXIgKG1lZGl1bSBzcGVlZCwgcXVhbGl0eSlcbiIpOwotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW1hcCBGSUxFICAgICAgTWFwIHRvIGNvbG9ycyB1c2VkIGluIG5hbWVkIGltYWdlIGZpbGVcbiIpOwotI2VuZGlmCi0gIGZwcmludGYoc3RkZXJyLCAiICAtbm9zbW9vdGggICAgICBEb24ndCB1c2UgaGlnaC1xdWFsaXR5IHVwc2FtcGxpbmdcbiIpOwotI2lmZGVmIFFVQU5UXzFQQVNTX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW9uZXBhc3MgICAgICAgVXNlIDEtcGFzcyBxdWFudGl6YXRpb24gKGZhc3QsIGxvdyBxdWFsaXR5KVxuIik7Ci0jZW5kaWYKLSNpZm5kZWYgRlJFRV9NRU1fRVNUSU1BVEUKLSAgZnByaW50ZihzdGRlcnIsICIgIC1tYXhtZW1vcnkgTiAgIE1heGltdW0gbWVtb3J5IHRvIHVzZSAoaW4ga2J5dGVzKVxuIik7Ci0jZW5kaWYKLSAgZnByaW50ZihzdGRlcnIsICIgIC1vdXRmaWxlIG5hbWUgIFNwZWNpZnkgbmFtZSBmb3Igb3V0cHV0IGZpbGVcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZlcmJvc2UgIG9yICAtZGVidWcgICBFbWl0IGRlYnVnIG91dHB1dFxuIik7Ci0gIGV4aXQoRVhJVF9GQUlMVVJFKTsKLX0KLQotCi0jaWZuZGVmIEpTSU1EX01PREVJTkZPX05PVF9TVVBQT1JURUQKLQotTE9DQUwodm9pZCkKLXByaW50X3NpbWRfaW5mbyAoRklMRSAqIGZpbGUsIGNoYXIgKiBsYWJlbHN0ciwgdW5zaWduZWQgaW50IHNpbWQpCi17Ci0gIGZwcmludGYoZmlsZSwgIiVzJXMlcyVzJXMlc1xuIiwgbGFiZWxzdHIsCi0JICBzaW1kICYgSlNJTURfTU1YICAgPyAiIE1NWCIgICAgOiAiIiwKLQkgIHNpbWQgJiBKU0lNRF8zRE5PVyA/ICIgM0ROb3chIiA6ICIiLAotCSAgc2ltZCAmIEpTSU1EX1NTRSAgID8gIiBTU0UiICAgIDogIiIsCi0JICBzaW1kICYgSlNJTURfU1NFMiAgPyAiIFNTRTIiICAgOiAiIiwKLQkgIHNpbWQgPT0gSlNJTURfTk9ORSA/ICIgTk9ORSIgICA6ICIiKTsKLX0KLQotI2VuZGlmIC8qICFKU0lNRF9NT0RFSU5GT19OT1RfU1VQUE9SVEVEICovCi0KLQotTE9DQUwoaW50KQotcGFyc2Vfc3dpdGNoZXMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBhcmdjLCBjaGFyICoqYXJndiwKLQkJaW50IGxhc3RfZmlsZV9hcmdfc2VlbiwgYm9vbGVhbiBmb3JfcmVhbCkKLS8qIFBhcnNlIG9wdGlvbmFsIHN3aXRjaGVzLgotICogUmV0dXJucyBhcmd2W10gaW5kZXggb2YgZmlyc3QgZmlsZS1uYW1lIGFyZ3VtZW50ICg9PSBhcmdjIGlmIG5vbmUpLgotICogQW55IGZpbGUgbmFtZXMgd2l0aCBpbmRleGVzIDw9IGxhc3RfZmlsZV9hcmdfc2VlbiBhcmUgaWdub3JlZDsKLSAqIHRoZXkgaGF2ZSBwcmVzdW1hYmx5IGJlZW4gcHJvY2Vzc2VkIGluIGEgcHJldmlvdXMgaXRlcmF0aW9uLgotICogKFBhc3MgMCBmb3IgbGFzdF9maWxlX2FyZ19zZWVuIG9uIHRoZSBmaXJzdCBvciBvbmx5IGl0ZXJhdGlvbi4pCi0gKiBmb3JfcmVhbCBpcyBGQUxTRSBvbiB0aGUgZmlyc3QgKGR1bW15KSBwYXNzOyB3ZSBtYXkgc2tpcCBhbnkgZXhwZW5zaXZlCi0gKiBwcm9jZXNzaW5nLgotICovCi17Ci0gIGludCBhcmduOwotICBjaGFyICogYXJnOwotCi0gIC8qIFNldCB1cCBkZWZhdWx0IEpQRUcgcGFyYW1ldGVycy4gKi8KLSAgcmVxdWVzdGVkX2ZtdCA9IERFRkFVTFRfRk1UOwkvKiBzZXQgZGVmYXVsdCBvdXRwdXQgZmlsZSBmb3JtYXQgKi8KLSAgb3V0ZmlsZW5hbWUgPSBOVUxMOwotICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA9IDA7Ci0gIGlmIChkZWZhdWx0X21heG1lbSA+IDApCS8qIG92ZXJyaWRlIGxpYnJhcnkncyBkZWZhdWx0IHZhbHVlICovCi0gICAgY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UgPSBkZWZhdWx0X21heG1lbTsKLQotICAvKiBTY2FuIGNvbW1hbmQgbGluZSBvcHRpb25zLCBhZGp1c3QgcGFyYW1ldGVycyAqLwotCi0gIGZvciAoYXJnbiA9IDE7IGFyZ24gPCBhcmdjOyBhcmduKyspIHsKLSAgICBhcmcgPSBhcmd2W2FyZ25dOwotICAgIGlmICgqYXJnICE9ICctJykgewotICAgICAgLyogTm90IGEgc3dpdGNoLCBtdXN0IGJlIGEgZmlsZSBuYW1lIGFyZ3VtZW50ICovCi0gICAgICBpZiAoYXJnbiA8PSBsYXN0X2ZpbGVfYXJnX3NlZW4pIHsKLQlvdXRmaWxlbmFtZSA9IE5VTEw7CS8qIC1vdXRmaWxlIGFwcGxpZXMgdG8ganVzdCBvbmUgaW5wdXQgZmlsZSAqLwotCWNvbnRpbnVlOwkJLyogaWdub3JlIHRoaXMgbmFtZSBpZiBwcmV2aW91c2x5IHByb2Nlc3NlZCAqLwotICAgICAgfQotICAgICAgYnJlYWs7CQkJLyogZWxzZSBkb25lIHBhcnNpbmcgc3dpdGNoZXMgKi8KLSAgICB9Ci0gICAgYXJnKys7CQkJLyogYWR2YW5jZSBwYXN0IHN3aXRjaCBtYXJrZXIgY2hhcmFjdGVyICovCi0KLSAgICBpZiAoa2V5bWF0Y2goYXJnLCAiYm1wIiwgMSkpIHsKLSAgICAgIC8qIEJNUCBvdXRwdXQgZm9ybWF0LiAqLwotICAgICAgcmVxdWVzdGVkX2ZtdCA9IEZNVF9CTVA7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImNvbG9ycyIsIDEpIHx8IGtleW1hdGNoKGFyZywgImNvbG91cnMiLCAxKSB8fAotCSAgICAgICBrZXltYXRjaChhcmcsICJxdWFudGl6ZSIsIDEpIHx8IGtleW1hdGNoKGFyZywgInF1YW50aXNlIiwgMSkpIHsKLSAgICAgIC8qIERvIGNvbG9yIHF1YW50aXphdGlvbi4gKi8KLSAgICAgIGludCB2YWw7Ci0KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVkIiwgJnZhbCkgIT0gMSkKLQl1c2FnZSgpOwotICAgICAgY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9ycyA9IHZhbDsKLSAgICAgIGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgPSBUUlVFOwotCi0jaWZuZGVmIEpTSU1EX01BU0tGVU5DX05PVF9TVVBQT1JURUQKLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm5vc2ltZCIgLCA0KSkgewotICAgICAganBlZ19zaW1kX21hc2soKGpfY29tbW9uX3B0cikgY2luZm8sIEpTSU1EX05PTkUsIEpTSU1EX0FMTCk7Ci0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJub21teCIgICwgMykpIHsKLSAgICAgIGpwZWdfc2ltZF9tYXNrKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKU0lNRF9OT05FLCBKU0lNRF9NTVgpOwotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibm8zZG5vdyIsIDMpKSB7Ci0gICAgICBqcGVnX3NpbWRfbWFzaygoal9jb21tb25fcHRyKSBjaW5mbywgSlNJTURfTk9ORSwgSlNJTURfM0ROT1cpOwotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibm9zc2UiICAsIDQpKSB7Ci0gICAgICBqcGVnX3NpbWRfbWFzaygoal9jb21tb25fcHRyKSBjaW5mbywgSlNJTURfTk9ORSwgSlNJTURfU1NFKTsKLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm5vc3NlMiIgLCA2KSkgewotICAgICAganBlZ19zaW1kX21hc2soKGpfY29tbW9uX3B0cikgY2luZm8sIEpTSU1EX05PTkUsIEpTSU1EX1NTRTIpOwotI2VuZGlmIC8qICFKU0lNRF9NQVNLRlVOQ19OT1RfU1VQUE9SVEVEICovCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImRjdCIsIDIpKSB7Ci0gICAgICAvKiBTZWxlY3QgSURDVCBhbGdvcml0aG0uICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImludCIsIDEpKSB7Ci0JY2luZm8tPmRjdF9tZXRob2QgPSBKRENUX0lTTE9XOwotICAgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiZmFzdCIsIDIpKSB7Ci0JY2luZm8tPmRjdF9tZXRob2QgPSBKRENUX0lGQVNUOwotICAgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiZmxvYXQiLCAyKSkgewotCWNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9GTE9BVDsKLSAgICAgIH0gZWxzZQotCXVzYWdlKCk7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImRpdGhlciIsIDIpKSB7Ci0gICAgICAvKiBTZWxlY3QgZGl0aGVyaW5nIGFsZ29yaXRobS4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiZnMiLCAyKSkgewotCWNpbmZvLT5kaXRoZXJfbW9kZSA9IEpESVRIRVJfRlM7Ci0gICAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJub25lIiwgMikpIHsKLQljaW5mby0+ZGl0aGVyX21vZGUgPSBKRElUSEVSX05PTkU7Ci0gICAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJvcmRlcmVkIiwgMikpIHsKLQljaW5mby0+ZGl0aGVyX21vZGUgPSBKRElUSEVSX09SREVSRUQ7Ci0gICAgICB9IGVsc2UKLQl1c2FnZSgpOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJkZWJ1ZyIsIDEpIHx8IGtleW1hdGNoKGFyZywgInZlcmJvc2UiLCAxKSkgewotICAgICAgLyogRW5hYmxlIGRlYnVnIHByaW50b3V0cy4gKi8KLSAgICAgIC8qIE9uIGZpcnN0IC1kLCBwcmludCB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uICovCi0gICAgICBzdGF0aWMgYm9vbGVhbiBwcmludGVkX3ZlcnNpb24gPSBGQUxTRTsKLQotICAgICAgaWYgKCEgcHJpbnRlZF92ZXJzaW9uKSB7Ci0JZnByaW50ZihzdGRlcnIsICJJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgREpQRUcsIHZlcnNpb24gJXNcbiVzXG4iLAotCQlKVkVSU0lPTiwgSkNPUFlSSUdIVCk7Ci0JZnByaW50ZihzdGRlcnIsCi0JCSJcbng4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeSwgdmVyc2lvbiAlc1xuXG4iLAotCQlKUEVHX1NJTURFWFRfVkVSX1NUUik7Ci0jaWZuZGVmIEpTSU1EX01PREVJTkZPX05PVF9TVVBQT1JURUQKLQlwcmludF9zaW1kX2luZm8oc3RkZXJyLCAiU0lNRCBpbnN0cnVjdGlvbnMgc3VwcG9ydGVkIGJ5IHRoZSBzeXN0ZW0gOiIsCi0JCQlqcGVnX3NpbWRfc3VwcG9ydChOVUxMKSk7Ci0KLQlmcHJpbnRmKHN0ZGVyciwgIlxuICAgICAgPT09IFNJTUQgT3BlcmF0aW9uIE1vZGVzID09PVxuIik7Ci0jaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotCXByaW50X3NpbWRfaW5mbyhzdGRlcnIsICJBY2N1cmF0ZSBpbnRlZ2VyIERDVCAgKC1kY3QgaW50KSAgIDoiLAotCQkJanBlZ19zaW1kX2ludmVyc2VfZGN0KGNpbmZvLCBKRENUX0lTTE9XKSk7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0JcHJpbnRfc2ltZF9pbmZvKHN0ZGVyciwgIkZhc3QgaW50ZWdlciBEQ1QgICAgICAoLWRjdCBmYXN0KSAgOiIsCi0JCQlqcGVnX3NpbWRfaW52ZXJzZV9kY3QoY2luZm8sIEpEQ1RfSUZBU1QpKTsKLSNlbmRpZgotI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLQlwcmludF9zaW1kX2luZm8oc3RkZXJyLCAiRmxvYXRpbmctcG9pbnQgRENUICAgICgtZGN0IGZsb2F0KSA6IiwKLQkJCWpwZWdfc2ltZF9pbnZlcnNlX2RjdChjaW5mbywgSkRDVF9GTE9BVCkpOwotI2VuZGlmCi0jaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAotCXByaW50X3NpbWRfaW5mbyhzdGRlcnIsICJSZWR1Y2VkLXNpemUgRENUICAgICAgKC1zY2FsZSBNL04pIDoiLAotCQkJanBlZ19zaW1kX2ludmVyc2VfZGN0KGNpbmZvLCBKRENUX0ZMT0FUKzEpKTsKLSNlbmRpZgotCXByaW50X3NpbWRfaW5mbyhzdGRlcnIsICJIaWdoLXF1YWxpdHkgdXBzYW1wbGluZyAoZGVmYXVsdCkgIDoiLAotCQkJanBlZ19zaW1kX3Vwc2FtcGxlcihjaW5mbywgVFJVRSkpOwotCXByaW50X3NpbWRfaW5mbyhzdGRlcnIsICJMb3ctcXVhbGl0eSB1cHNhbXBsaW5nICgtbm9zbW9vdGgpIDoiLAotCQkJanBlZ19zaW1kX3Vwc2FtcGxlcihjaW5mbywgRkFMU0UpKTsKLQlwcmludF9zaW1kX2luZm8oc3RkZXJyLCAiQ29sb3JzcGFjZSBjb252ZXJzaW9uIChZQ2JDci0+UkdCKSA6IiwKLQkJCWpwZWdfc2ltZF9jb2xvcl9kZWNvbnZlcnRlcihjaW5mbykpOwotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSNlbmRpZiAvKiAhSlNJTURfTU9ERUlORk9fTk9UX1NVUFBPUlRFRCAqLwotCXByaW50ZWRfdmVyc2lvbiA9IFRSVUU7Ci0gICAgICB9Ci0gICAgICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCsrOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJmYXN0IiwgMSkpIHsKLSAgICAgIC8qIFNlbGVjdCByZWNvbW1lbmRlZCBwcm9jZXNzaW5nIG9wdGlvbnMgZm9yIHF1aWNrLWFuZC1kaXJ0eSBvdXRwdXQuICovCi0gICAgICBjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgPSBGQUxTRTsKLSAgICAgIGNpbmZvLT5kaXRoZXJfbW9kZSA9IEpESVRIRVJfT1JERVJFRDsKLSAgICAgIGlmICghIGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIC8qIGRvbid0IG92ZXJyaWRlIGFuIGVhcmxpZXIgLWNvbG9ycyAqLwotCWNpbmZvLT5kZXNpcmVkX251bWJlcl9vZl9jb2xvcnMgPSAyMTY7Ci0gICAgICBjaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfRkFTVEVTVDsKLSAgICAgIGNpbmZvLT5kb19mYW5jeV91cHNhbXBsaW5nID0gRkFMU0U7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImdpZiIsIDEpKSB7Ci0gICAgICAvKiBHSUYgb3V0cHV0IGZvcm1hdC4gKi8KLSAgICAgIHJlcXVlc3RlZF9mbXQgPSBGTVRfR0lGOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJncmF5c2NhbGUiLCAyKSB8fCBrZXltYXRjaChhcmcsICJncmV5c2NhbGUiLDIpKSB7Ci0gICAgICAvKiBGb3JjZSBtb25vY2hyb21lIG91dHB1dC4gKi8KLSAgICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJtYXAiLCAzKSkgewotICAgICAgLyogUXVhbnRpemUgdG8gYSBjb2xvciBtYXAgdGFrZW4gZnJvbSBhbiBpbnB1dCBmaWxlLiAqLwotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKGZvcl9yZWFsKSB7CQkvKiB0b28gZXhwZW5zaXZlIHRvIGRvIHR3aWNlISAqLwotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAkvKiBvdGhlcndpc2UgY2FuJ3QgcXVhbnRpemUgdG8gc3VwcGxpZWQgbWFwICovCi0JRklMRSAqIG1hcGZpbGU7Ci0KLQlpZiAoKG1hcGZpbGUgPSBmb3Blbihhcmd2W2FyZ25dLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKLQkgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2FyZ25dKTsKLQkgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLQl9Ci0JcmVhZF9jb2xvcl9tYXAoY2luZm8sIG1hcGZpbGUpOwotCWZjbG9zZShtYXBmaWxlKTsKLQljaW5mby0+cXVhbnRpemVfY29sb3JzID0gVFJVRTsKLSNlbHNlCi0JRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotI2VuZGlmCi0gICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm1heG1lbW9yeSIsIDMpKSB7Ci0gICAgICAvKiBNYXhpbXVtIG1lbW9yeSBpbiBLYiAob3IgTWIgd2l0aCAnbScpLiAqLwotICAgICAgbG9uZyBsdmFsOwotICAgICAgY2hhciBjaCA9ICd4JzsKLQotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWxkJWMiLCAmbHZhbCwgJmNoKSA8IDEpCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChjaCA9PSAnbScgfHwgY2ggPT0gJ00nKQotCWx2YWwgKj0gMTAwMEw7Ci0gICAgICBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSA9IGx2YWwgKiAxMDAwTDsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibm9zbW9vdGgiLCAzKSkgewotICAgICAgLyogU3VwcHJlc3MgZmFuY3kgdXBzYW1wbGluZyAqLwotICAgICAgY2luZm8tPmRvX2ZhbmN5X3Vwc2FtcGxpbmcgPSBGQUxTRTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib25lcGFzcyIsIDMpKSB7Ci0gICAgICAvKiBVc2UgZmFzdCBvbmUtcGFzcyBxdWFudGl6YXRpb24uICovCi0gICAgICBjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgPSBGQUxTRTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib3MyIiwgMykpIHsKLSAgICAgIC8qIEJNUCBvdXRwdXQgZm9ybWF0IChPUy8yIGZsYXZvcikuICovCi0gICAgICByZXF1ZXN0ZWRfZm10ID0gRk1UX09TMjsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib3V0ZmlsZSIsIDQpKSB7Ci0gICAgICAvKiBTZXQgb3V0cHV0IGZpbGUgbmFtZS4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIG91dGZpbGVuYW1lID0gYXJndlthcmduXTsJLyogc2F2ZSBpdCBhd2F5IGZvciBsYXRlciB1c2UgKi8KLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicG5tIiwgMSkgfHwga2V5bWF0Y2goYXJnLCAicHBtIiwgMSkpIHsKLSAgICAgIC8qIFBQTS9QR00gb3V0cHV0IGZvcm1hdC4gKi8KLSAgICAgIHJlcXVlc3RlZF9mbXQgPSBGTVRfUFBNOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJybGUiLCAxKSkgewotICAgICAgLyogUkxFIG91dHB1dCBmb3JtYXQuICovCi0gICAgICByZXF1ZXN0ZWRfZm10ID0gRk1UX1JMRTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAic2NhbGUiLCAxKSkgewotICAgICAgLyogU2NhbGUgdGhlIG91dHB1dCBpbWFnZSBieSBhIGZyYWN0aW9uIE0vTi4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVkLyVkIiwKLQkJICZjaW5mby0+c2NhbGVfbnVtLCAmY2luZm8tPnNjYWxlX2Rlbm9tKSAhPSAyKQotCXVzYWdlKCk7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInRhcmdhIiwgMSkpIHsKLSAgICAgIC8qIFRhcmdhIG91dHB1dCBmb3JtYXQuICovCi0gICAgICByZXF1ZXN0ZWRfZm10ID0gRk1UX1RBUkdBOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIHVzYWdlKCk7CQkJLyogYm9ndXMgc3dpdGNoICovCi0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGFyZ247CQkJLyogcmV0dXJuIGluZGV4IG9mIG5leHQgYXJnIChmaWxlIG5hbWUpICovCi19Ci0KLQotLyoKLSAqIE1hcmtlciBwcm9jZXNzb3IgZm9yIENPTSBhbmQgaW50ZXJlc3RpbmcgQVBQbiBtYXJrZXJzLgotICogVGhpcyByZXBsYWNlcyB0aGUgbGlicmFyeSdzIGJ1aWx0LWluIHByb2Nlc3Nvciwgd2hpY2gganVzdCBza2lwcyB0aGUgbWFya2VyLgotICogV2Ugd2FudCB0byBwcmludCBvdXQgdGhlIG1hcmtlciBhcyB0ZXh0LCB0byB0aGUgZXh0ZW50IHBvc3NpYmxlLgotICogTm90ZSB0aGlzIGNvZGUgcmVsaWVzIG9uIGEgbm9uLXN1c3BlbmRpbmcgZGF0YSBzb3VyY2UuCi0gKi8KLQotTE9DQUwodW5zaWduZWQgaW50KQotanBlZ19nZXRjIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogUmVhZCBuZXh0IGJ5dGUgKi8KLXsKLSAgc3RydWN0IGpwZWdfc291cmNlX21nciAqIGRhdGFzcmMgPSBjaW5mby0+c3JjOwotCi0gIGlmIChkYXRhc3JjLT5ieXRlc19pbl9idWZmZXIgPT0gMCkgewotICAgIGlmICghICgqZGF0YXNyYy0+ZmlsbF9pbnB1dF9idWZmZXIpIChjaW5mbykpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7Ci0gIH0KLSAgZGF0YXNyYy0+Ynl0ZXNfaW5fYnVmZmVyLS07Ci0gIHJldHVybiBHRVRKT0NURVQoKmRhdGFzcmMtPm5leHRfaW5wdXRfYnl0ZSsrKTsKLX0KLQotCi1NRVRIT0RERUYoYm9vbGVhbikKLXByaW50X3RleHRfbWFya2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBib29sZWFuIHRyYWNlaXQgPSAoY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPj0gMSk7Ci0gIElOVDMyIGxlbmd0aDsKLSAgdW5zaWduZWQgaW50IGNoOwotICB1bnNpZ25lZCBpbnQgbGFzdGNoID0gMDsKLQotICBsZW5ndGggPSBqcGVnX2dldGMoY2luZm8pIDw8IDg7Ci0gIGxlbmd0aCArPSBqcGVnX2dldGMoY2luZm8pOwotICBsZW5ndGggLT0gMjsJCQkvKiBkaXNjb3VudCB0aGUgbGVuZ3RoIHdvcmQgaXRzZWxmICovCi0KLSAgaWYgKHRyYWNlaXQpIHsKLSAgICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gSlBFR19DT00pCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvbW1lbnQsIGxlbmd0aCAlbGQ6XG4iLCAobG9uZykgbGVuZ3RoKTsKLSAgICBlbHNlCQkJLyogYXNzdW1lIGl0IGlzIGFuIEFQUG4gb3RoZXJ3aXNlICovCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkFQUCVkLCBsZW5ndGggJWxkOlxuIiwKLQkgICAgICBjaW5mby0+dW5yZWFkX21hcmtlciAtIEpQRUdfQVBQMCwgKGxvbmcpIGxlbmd0aCk7Ci0gIH0KLQotICB3aGlsZSAoLS1sZW5ndGggPj0gMCkgewotICAgIGNoID0ganBlZ19nZXRjKGNpbmZvKTsKLSAgICBpZiAodHJhY2VpdCkgewotICAgICAgLyogRW1pdCB0aGUgY2hhcmFjdGVyIGluIGEgcmVhZGFibGUgZm9ybS4KLSAgICAgICAqIE5vbnByaW50YWJsZXMgYXJlIGNvbnZlcnRlZCB0byBcbm5uIGZvcm0sCi0gICAgICAgKiB3aGlsZSBcIGlzIGNvbnZlcnRlZCB0byBcXC4KLSAgICAgICAqIE5ld2xpbmVzIGluIENSLCBDUi9MRiwgb3IgTEYgZm9ybSB3aWxsIGJlIHByaW50ZWQgYXMgb25lIG5ld2xpbmUuCi0gICAgICAgKi8KLSAgICAgIGlmIChjaCA9PSAnXHInKSB7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXG4nKSB7Ci0JaWYgKGxhc3RjaCAhPSAnXHInKQotCSAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXFwnKSB7Ci0JZnByaW50ZihzdGRlcnIsICJcXFxcIik7Ci0gICAgICB9IGVsc2UgaWYgKGlzcHJpbnQoY2gpKSB7Ci0JcHV0YyhjaCwgc3RkZXJyKTsKLSAgICAgIH0gZWxzZSB7Ci0JZnByaW50ZihzdGRlcnIsICJcXCUwM28iLCBjaCk7Ci0gICAgICB9Ci0gICAgICBsYXN0Y2ggPSBjaDsKLSAgICB9Ci0gIH0KLQotICBpZiAodHJhY2VpdCkKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIENoZWNrIGZvciBvdmVyd3JpdGUgb2YgYW4gZXhpc3RpbmcgZmlsZTsgY2xlYXIgaXQgd2l0aCB1c2VyCi0gKi8KLQotI2lmbmRlZiBOT19PVkVSV1JJVEVfQ0hFQ0sKLQotTE9DQUwoYm9vbGVhbikKLWlzX3dyaXRlX29rIChjaGFyICogb3V0Zm5hbWUpCi17Ci0gIEZJTEUgKiBvZmlsZTsKLSAgaW50IGNoOwotCi0gIG9maWxlID0gZm9wZW4ob3V0Zm5hbWUsIFJFQURfQklOQVJZKTsKLSAgaWYgKG9maWxlID09IE5VTEwpCi0gICAgcmV0dXJuIFRSVUU7CQkvKiBub3QgcHJlc2VudCAqLwotICBmY2xvc2Uob2ZpbGUpOwkJLyogb29wcywgaXQgaXMgcHJlc2VudCAqLwotCi0gIGZvciAoOzspIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIGFscmVhZHkgZXhpc3RzLCBvdmVyd3JpdGUgaXQ/IFt5L25dICIsCi0JICAgIG91dGZuYW1lKTsKLSAgICBmZmx1c2goc3RkZXJyKTsKLSAgICBjaCA9IGdldGMoc3RkaW4pOwotICAgIGlmIChjaCAhPSAnXG4nKQkJLyogZmx1c2ggcmVzdCBvZiBsaW5lICovCi0gICAgICB3aGlsZSAoZ2V0YyhzdGRpbikgIT0gJ1xuJykKLQkvKiBub3RoaW5nICovOwotCi0gICAgc3dpdGNoIChjaCkgewotICAgIGNhc2UgJ1knOgotICAgIGNhc2UgJ3knOgotICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgY2FzZSAnTic6Ci0gICAgY2FzZSAnbic6Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgLyogb3RoZXJ3aXNlLCBhc2sgYWdhaW4gKi8KLSAgICB9Ci0gIH0KLX0KLQotI2VuZGlmCi0KLQotLyoKLSAqIFByb2Nlc3MgYSBzaW5nbGUgaW5wdXQgZmlsZSBuYW1lLCBhbmQgcmV0dXJuIGl0cyBpbmRleCBpbiBhcmd2W10uCi0gKiBGaWxlIG5hbWVzIGF0IG9yIHRvIGxlZnQgb2Ygb2xkX2ZpbGVfaW5kZXggaGF2ZSBiZWVuIHByb2Nlc3NlZCBhbHJlYWR5LgotICovCi0KLUxPQ0FMKGludCkKLXByb2Nlc3Nfb25lX2ZpbGUgKGludCBhcmdjLCBjaGFyICoqYXJndiwgaW50IG9sZF9maWxlX2luZGV4KQotewotICBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBjaW5mbzsKLSAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7Ci0gIGNoYXIgKmluZmlsZW5hbWU7Ci0gIGNoYXIgd29ya2ZpbGVuYW1lW1BBVEhfTUFYXTsKLSAgY29uc3QgY2hhciAqZGVmYXVsdF9leHRlbnNpb24gPSBOVUxMOwotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBzdHJ1Y3QgY2RqcGVnX3Byb2dyZXNzX21nciBwcm9ncmVzczsKLSNlbmRpZgotICBpbnQgZmlsZV9pbmRleDsKLSAgZGpwZWdfZGVzdF9wdHIgZGVzdF9tZ3IgPSBOVUxMOwotICBGSUxFICogaW5wdXRfZmlsZSA9IE5VTEw7Ci0gIEZJTEUgKiBvdXRwdXRfZmlsZSA9IE5VTEw7Ci0gIEpESU1FTlNJT04gbnVtX3NjYW5saW5lczsKLQotICAvKiBJbml0aWFsaXplIHRoZSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0IHdpdGggZGVmYXVsdCBlcnJvciBoYW5kbGluZy4gKi8KLSAgY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIpOwotICBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCZjaW5mbyk7Ci0gIC8qIEFkZCBzb21lIGFwcGxpY2F0aW9uLXNwZWNpZmljIGVycm9yIG1lc3NhZ2VzIChmcm9tIGNkZXJyb3IuaCkgKi8KLSAgamVyci5hZGRvbl9tZXNzYWdlX3RhYmxlID0gY2RqcGVnX21lc3NhZ2VfdGFibGU7Ci0gIGplcnIuZmlyc3RfYWRkb25fbWVzc2FnZSA9IEpNU0dfRklSU1RBRERPTkNPREU7Ci0gIGplcnIubGFzdF9hZGRvbl9tZXNzYWdlID0gSk1TR19MQVNUQURET05DT0RFOwotCi0gIC8qIEluc2VydCBjdXN0b20gbWFya2VyIHByb2Nlc3NvciBmb3IgQ09NIGFuZCBBUFAxMi4KLSAgICogQVBQMTIgaXMgdXNlZCBieSBzb21lIGRpZ2l0YWwgY2FtZXJhIG1ha2VycyBmb3IgdGV4dHVhbCBpbmZvLAotICAgKiBzbyB3ZSBwcm92aWRlIHRoZSBhYmlsaXR5IHRvIGRpc3BsYXkgaXQgYXMgdGV4dC4KLSAgICogSWYgeW91IGxpa2UsIGFkZGl0aW9uYWwgQVBQbiBtYXJrZXIgdHlwZXMgY2FuIGJlIHNlbGVjdGVkIGZvciBkaXNwbGF5LAotICAgKiBidXQgZG9uJ3QgdHJ5IHRvIG92ZXJyaWRlIEFQUDAgb3IgQVBQMTQgdGhpcyB3YXkgKHNlZSBsaWJqcGVnLmRvYykuCi0gICAqLwotICBqcGVnX3NldF9tYXJrZXJfcHJvY2Vzc29yKCZjaW5mbywgSlBFR19DT00sIHByaW50X3RleHRfbWFya2VyKTsKLSAganBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvcigmY2luZm8sIEpQRUdfQVBQMCsxMiwgcHJpbnRfdGV4dF9tYXJrZXIpOwotCi0gIC8qIE5vdyBzYWZlIHRvIGVuYWJsZSBzaWduYWwgY2F0Y2hlci4gKi8KLSNpZmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCi0gIGVuYWJsZV9zaWduYWxfY2F0Y2hlcigoal9jb21tb25fcHRyKSAmY2luZm8pOwotI2VuZGlmCi0KLSAgLyogU2NhbiBjb21tYW5kIGxpbmUgdG8gZmluZCBuZXh0IGZpbGUgbmFtZS4KLSAgICogSXQgaXMgY29udmVuaWVudCB0byB1c2UganVzdCBvbmUgc3dpdGNoLXBhcnNpbmcgcm91dGluZSwgYnV0IHRoZSBzd2l0Y2gKLSAgICogdmFsdWVzIHJlYWQgaGVyZSBhcmUgaWdub3JlZDsgd2Ugd2lsbCByZXNjYW4gdGhlIHN3aXRjaGVzIGFmdGVyIG9wZW5pbmcKLSAgICogdGhlIGlucHV0IGZpbGUuCi0gICAqIChFeGNlcHRpb246IHRyYWNpbmcgbGV2ZWwgc2V0IGhlcmUgY29udHJvbHMgdmVyYm9zaXR5IGZvciBDT00gbWFya2VycwotICAgKiBmb3VuZCBkdXJpbmcganBlZ19yZWFkX2hlYWRlci4uLikKLSAgICovCi0KLSAgZmlsZV9pbmRleCA9IHBhcnNlX3N3aXRjaGVzKCZjaW5mbywgYXJnYywgYXJndiwgb2xkX2ZpbGVfaW5kZXgsIEZBTFNFKTsKLSAgaWYgKGZpbGVfaW5kZXggPj0gYXJnYykgewotICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG1pc3NpbmcgaW5wdXQgZmlsZSBuYW1lXG4iLCBwcm9nbmFtZSk7Ci0gICAgdXNhZ2UoKTsKLSAgfQotCi0gIC8qIE9wZW4gdGhlIGlucHV0IGZpbGUuICovCi0gIGluZmlsZW5hbWUgPSBhcmd2W2ZpbGVfaW5kZXhdOwotICBpZiAoKGlucHV0X2ZpbGUgPSBmb3BlbihpbmZpbGVuYW1lLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgaW5maWxlbmFtZSk7Ci0gICAgZ290byBmYWlsOwotICB9Ci0KLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgc3RhcnRfcHJvZ3Jlc3NfbW9uaXRvcigoal9jb21tb25fcHRyKSAmY2luZm8sICZwcm9ncmVzcyk7Ci0jZW5kaWYKLQotICAvKiBTcGVjaWZ5IGRhdGEgc291cmNlIGZvciBkZWNvbXByZXNzaW9uICovCi0gIGpwZWdfc3RkaW9fc3JjKCZjaW5mbywgaW5wdXRfZmlsZSk7Ci0KLSAgLyogUmVhZCBmaWxlIGhlYWRlciwgc2V0IGRlZmF1bHQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzICovCi0gICh2b2lkKSBqcGVnX3JlYWRfaGVhZGVyKCZjaW5mbywgVFJVRSk7Ci0KLSAgLyogQWRqdXN0IGRlZmF1bHQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGJ5IHJlLXBhcnNpbmcgdGhlIG9wdGlvbnMgKi8KLSAgZmlsZV9pbmRleCA9IHBhcnNlX3N3aXRjaGVzKCZjaW5mbywgYXJnYywgYXJndiwgb2xkX2ZpbGVfaW5kZXgsIFRSVUUpOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIG91dHB1dCBtb2R1bGUgbm93IHRvIGxldCBpdCBvdmVycmlkZSBhbnkgY3J1Y2lhbAotICAgKiBvcHRpb24gc2V0dGluZ3MgKGZvciBpbnN0YW5jZSwgR0lGIHdhbnRzIHRvIGZvcmNlIGNvbG9yIHF1YW50aXphdGlvbikuCi0gICAqLwotICBzd2l0Y2ggKHJlcXVlc3RlZF9mbXQpIHsKLSNpZmRlZiBCTVBfU1VQUE9SVEVECi0gIGNhc2UgRk1UX0JNUDoKLSAgICBkZXN0X21nciA9IGppbml0X3dyaXRlX2JtcCgmY2luZm8sIEZBTFNFKTsKLSAgICBkZWZhdWx0X2V4dGVuc2lvbiA9ICIuYm1wIjsKLSAgICBicmVhazsKLSAgY2FzZSBGTVRfT1MyOgotICAgIGRlc3RfbWdyID0gamluaXRfd3JpdGVfYm1wKCZjaW5mbywgVFJVRSk7Ci0gICAgZGVmYXVsdF9leHRlbnNpb24gPSAiLmJtcCI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBHSUZfU1VQUE9SVEVECi0gIGNhc2UgRk1UX0dJRjoKLSAgICBkZXN0X21nciA9IGppbml0X3dyaXRlX2dpZigmY2luZm8pOwotICAgIGRlZmF1bHRfZXh0ZW5zaW9uID0gIi5naWYiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgUFBNX1NVUFBPUlRFRAotICBjYXNlIEZNVF9QUE06Ci0gICAgZGVzdF9tZ3IgPSBqaW5pdF93cml0ZV9wcG0oJmNpbmZvKTsKLSAgICBkZWZhdWx0X2V4dGVuc2lvbiA9ICIucHBtIjsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIFJMRV9TVVBQT1JURUQKLSAgY2FzZSBGTVRfUkxFOgotICAgIGRlc3RfbWdyID0gamluaXRfd3JpdGVfcmxlKCZjaW5mbyk7Ci0gICAgZGVmYXVsdF9leHRlbnNpb24gPSAiLnJsZSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBUQVJHQV9TVVBQT1JURUQKLSAgY2FzZSBGTVRfVEFSR0E6Ci0gICAgZGVzdF9tZ3IgPSBqaW5pdF93cml0ZV90YXJnYSgmY2luZm8pOwotICAgIGRlZmF1bHRfZXh0ZW5zaW9uID0gIi50Z2EiOwotICAgIGJyZWFrOwotI2VuZGlmCi0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVCgmY2luZm8sIEpFUlJfVU5TVVBQT1JURURfRk9STUFUKTsKLSAgICBicmVhazsKLSAgfQotCi0gIC8qIElmIHVzZXIgZGlkbid0IHN1cHBseSAtb3V0ZmlsZSBzd2l0Y2gsIHNlbGVjdCBvdXRwdXQgZmlsZSBuYW1lLiAqLwotICBpZiAob3V0ZmlsZW5hbWUgPT0gTlVMTCkgewotICAgIGludCBpOwotCi0gICAgb3V0ZmlsZW5hbWUgPSB3b3JrZmlsZW5hbWU7Ci0gICAgLyogTWFrZSBvdXRmaWxlbmFtZSBiZSBpbmZpbGVuYW1lIHdpdGggYXBwcm9wcmlhdGUgZXh0ZW5zaW9uICovCi0gICAgc3RyY3B5KG91dGZpbGVuYW1lLCBpbmZpbGVuYW1lKTsKLSAgICBmb3IgKGkgPSBzdHJsZW4ob3V0ZmlsZW5hbWUpLTE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICBzd2l0Y2ggKG91dGZpbGVuYW1lW2ldKSB7Ci0gICAgICBjYXNlICc6JzoKLSAgICAgIGNhc2UgJy8nOgotICAgICAgY2FzZSAnXFwnOgotCWkgPSAwOwkJCS8qIHN0b3Agc2Nhbm5pbmcgKi8KLQlicmVhazsKLSAgICAgIGNhc2UgJy4nOgotCW91dGZpbGVuYW1lW2ldID0gJ1wwJzsJLyogbG9wIG9mZiBleGlzdGluZyBleHRlbnNpb24gKi8KLQlpID0gMDsJCQkvKiBzdG9wIHNjYW5uaW5nICovCi0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCWJyZWFrOwkJCS8qIGtlZXAgc2Nhbm5pbmcgKi8KLSAgICAgIH0KLSAgICB9Ci0gICAgc3RyY2F0KG91dGZpbGVuYW1lLCBkZWZhdWx0X2V4dGVuc2lvbik7Ci0gIH0KLQotICBmcHJpbnRmKHN0ZGVyciwgIkRlY29tcHJlc3NpbmcgJXMgPT4gJXNcbiIsIGluZmlsZW5hbWUsIG91dGZpbGVuYW1lKTsKLSNpZm5kZWYgTk9fT1ZFUldSSVRFX0NIRUNLCi0gIGlmICghIGlzX3dyaXRlX29rKG91dGZpbGVuYW1lKSkKLSAgICBnb3RvIGZhaWw7Ci0jZW5kaWYKLQotICAvKiBPcGVuIHRoZSBvdXRwdXQgZmlsZS4gKi8KLSAgaWYgKChvdXRwdXRfZmlsZSA9IGZvcGVuKG91dGZpbGVuYW1lLCBXUklURV9CSU5BUlkpKSA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3QgY3JlYXRlICVzXG4iLCBwcm9nbmFtZSwgb3V0ZmlsZW5hbWUpOwotICAgIGdvdG8gZmFpbDsKLSAgfQotICBkZXN0X21nci0+b3V0cHV0X2ZpbGUgPSBvdXRwdXRfZmlsZTsKLQotICAvKiBTdGFydCBkZWNvbXByZXNzb3IgKi8KLSAgKHZvaWQpIGpwZWdfc3RhcnRfZGVjb21wcmVzcygmY2luZm8pOwotCi0gIC8qIFdyaXRlIG91dHB1dCBmaWxlIGhlYWRlciAqLwotICAoKmRlc3RfbWdyLT5zdGFydF9vdXRwdXQpICgmY2luZm8sIGRlc3RfbWdyKTsKLQotICAvKiBQcm9jZXNzIGRhdGEgKi8KLSAgd2hpbGUgKGNpbmZvLm91dHB1dF9zY2FubGluZSA8IGNpbmZvLm91dHB1dF9oZWlnaHQpIHsKLSAgICBudW1fc2NhbmxpbmVzID0ganBlZ19yZWFkX3NjYW5saW5lcygmY2luZm8sIGRlc3RfbWdyLT5idWZmZXIsCi0JCQkJCWRlc3RfbWdyLT5idWZmZXJfaGVpZ2h0KTsKLSAgICAoKmRlc3RfbWdyLT5wdXRfcGl4ZWxfcm93cykgKCZjaW5mbywgZGVzdF9tZ3IsIG51bV9zY2FubGluZXMpOwotICB9Ci0KLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgLyogSGFjazogY291bnQgZmluYWwgcGFzcyBhcyBkb25lIGluIGNhc2UgZmluaXNoX291dHB1dCBkb2VzIGFuIGV4dHJhIHBhc3MuCi0gICAqIFRoZSBsaWJyYXJ5IHdvbid0IGhhdmUgdXBkYXRlZCBjb21wbGV0ZWRfcGFzc2VzLgotICAgKi8KLSAgcHJvZ3Jlc3MucHViLmNvbXBsZXRlZF9wYXNzZXMgPSBwcm9ncmVzcy5wdWIudG90YWxfcGFzc2VzOwotI2VuZGlmCi0KLSAgLyogRmluaXNoIGRlY29tcHJlc3Npb24gYW5kIHJlbGVhc2UgbWVtb3J5LgotICAgKiBJIG11c3QgZG8gaXQgaW4gdGhpcyBvcmRlciBiZWNhdXNlIG91dHB1dCBtb2R1bGUgaGFzIGFsbG9jYXRlZCBtZW1vcnkKLSAgICogb2YgbGlmZXNwYW4gSlBPT0xfSU1BR0U7IGl0IG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgcmVsZWFzaW5nIG1lbW9yeS4KLSAgICovCi0gICgqZGVzdF9tZ3ItPmZpbmlzaF9vdXRwdXQpICgmY2luZm8sIGRlc3RfbWdyKTsKLSAgKHZvaWQpIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoJmNpbmZvKTsKLQotICAvKiBDbGVhbiB1cCBhbmQgZXhpdCAqLwotZmFpbDoKLSAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKLQotICBpZiAoaW5wdXRfZmlsZSAhPSBOVUxMKSBmY2xvc2UoaW5wdXRfZmlsZSk7Ci0gIGlmIChvdXRwdXRfZmlsZSAhPSBOVUxMKSBmY2xvc2Uob3V0cHV0X2ZpbGUpOwotCi0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIGVuZF9wcm9ncmVzc19tb25pdG9yKChqX2NvbW1vbl9wdHIpICZjaW5mbyk7Ci0jZW5kaWYKLQotICAvKiBEaXNhYmxlIHNpZ25hbCBjYXRjaGVyLiAqLwotI2lmZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKLSAgZW5hYmxlX3NpZ25hbF9jYXRjaGVyKChqX2NvbW1vbl9wdHIpIE5VTEwpOwotI2VuZGlmCi0KLSAgcmV0dXJuIGZpbGVfaW5kZXg7Ci19Ci0KLQotLyoKLSAqIFRoZSBtYWluIHByb2dyYW0uCi0gKi8KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIGludCBmaWxlX2luZGV4OwotCi0gIC8qIE9uIE1hYywgZmV0Y2ggYSBjb21tYW5kIGxpbmUuICovCi0jaWZkZWYgVVNFX0NDT01NQU5ECi0gIGFyZ2MgPSBjY29tbWFuZCgmYXJndik7Ci0jZW5kaWYKLQotI2lmZGVmIE1TRE9TCi0gIHByb2duYW1lID0gImRqcGVnIjsJCS8qIERPUyB0ZW5kcyB0byBiZSB0b28gdmVyYm9zZSBhYm91dCBhcmd2WzBdICovCi0jZWxzZQotICBwcm9nbmFtZSA9IGFyZ3ZbMF07Ci0gIGlmIChwcm9nbmFtZSA9PSBOVUxMIHx8IHByb2duYW1lWzBdID09IDApCi0gICAgcHJvZ25hbWUgPSAiZGpwZWciOwkJLyogaW4gY2FzZSBDIGxpYnJhcnkgZG9lc24ndCBwcm92aWRlIGl0ICovCi0jZW5kaWYKLQotICAvKiBUaGUgZGVmYXVsdCBtYXhtZW0gbXVzdCBiZSBjb21wdXRlZCBvbmx5IG9uY2UgYXQgcHJvZ3JhbSBzdGFydHVwLAotICAgKiBzaW5jZSByZWxlYXNpbmcgbWVtb3J5IHdpdGggZnJlZSgpIHdvbid0IGdpdmUgaXQgYmFjayB0byB0aGUgT1MuCi0gICAqLwotI2lmZGVmIEZSRUVfTUVNX0VTVElNQVRFCi0gIGRlZmF1bHRfbWF4bWVtID0gRlJFRV9NRU1fRVNUSU1BVEU7Ci0jZWxzZQotICBkZWZhdWx0X21heG1lbSA9IDA7Ci0jZW5kaWYKLQotICAvKiBTY2FuIGNvbW1hbmQgbGluZSwgcGFyc2Ugc3dpdGNoZXMgYW5kIGxvY2F0ZSBpbnB1dCBmaWxlIG5hbWVzICovCi0KLSAgaWYgKGFyZ2MgPCAyKQotICAgIHVzYWdlKCk7CQkJLyogbm90aGluZyBvbiB0aGUgY29tbWFuZCBsaW5lPz8gKi8KLQotICBmaWxlX2luZGV4ID0gMDsKLQotICB3aGlsZSAoZmlsZV9pbmRleCA8IGFyZ2MtMSkKLSAgICBmaWxlX2luZGV4ID0gcHJvY2Vzc19vbmVfZmlsZShhcmdjLCBhcmd2LCBmaWxlX2luZGV4KTsKLQotICAvKiBBbGwgZG9uZS4gKi8KLSAgZXhpdChFWElUX1NVQ0NFU1MpOwotICByZXR1cm4gMDsJCQkvKiBzdXBwcmVzcyBuby1yZXR1cm4tdmFsdWUgd2FybmluZ3MgKi8KLX0KZGlmZiAtLWdpdCBhL2FsdHVpL3VzYWdlLmFsdCBiL2FsdHVpL3VzYWdlLmFsdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3MzMyYi4uMDAwMDAwMAotLS0gYS9hbHR1aS91c2FnZS5hbHQKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0oTW9zdCBvZiB0aGUgc3RhbmRhcmQgdXNhZ2UuZG9jIGZpbGUgYWxzbyBhcHBsaWVzIHRvIHRoaXMgYWx0ZXJuYXRlIHZlcnNpb24sCi1idXQgcmVwbGFjZSBpdHMgIkdFTkVSQUwgVVNBR0UiIHNlY3Rpb24gd2l0aCB0aGUgdGV4dCBiZWxvdy4gIEVkaXQgdGhlIHRleHQKLWFzIG5lY2Vzc2FyeSBpZiB5b3UgZG9uJ3Qgc3VwcG9ydCB3aWxkY2FyZHMgb3Igb3ZlcndyaXRlIGNoZWNraW5nLiAgQmUgc3VyZQotdG8gZml4IHRoZSBkanBlZyBzd2l0Y2ggZGVzY3JpcHRpb25zIGlmIHlvdSBhcmUgbm90IGRlZmF1bHRpbmcgdG8gUFBNIG91dHB1dC4KLUFsc28sIGlmIHlvdSd2ZSBwcm92aWRlZCBhbiBhY2N1cmF0ZSBtZW1vcnktZXN0aW1hdGlvbiBwcm9jZWR1cmUsIHlvdSBjYW4KLXByb2JhYmx5IGVsaW1pbmF0ZSB0aGUgSElOVFMgcmVsYXRlZCB0byB0aGUgLW1heG1lbW9yeSBzd2l0Y2guKQotCi0KLUdFTkVSQUwgVVNBR0UKLQotV2UgcHJvdmlkZSB0d28gcHJvZ3JhbXMsIGNqcGVnIHRvIGNvbXByZXNzIGFuIGltYWdlIGZpbGUgaW50byBKUEVHIGZvcm1hdCwKLWFuZCBkanBlZyB0byBkZWNvbXByZXNzIGEgSlBFRyBmaWxlIGJhY2sgaW50byBhIGNvbnZlbnRpb25hbCBpbWFnZSBmb3JtYXQuCi0KLVRoZSBiYXNpYyBjb21tYW5kIGxpbmUgaXM6Ci0JY2pwZWcgW3N3aXRjaGVzXSBsaXN0IG9mIGltYWdlIGZpbGVzCi1vcgotCWRqcGVnIFtzd2l0Y2hlc10gbGlzdCBvZiBqcGVnIGZpbGVzCi0KLUVhY2ggZmlsZSBuYW1lZCBpcyBjb21wcmVzc2VkIG9yIGRlY29tcHJlc3NlZC4gIFRoZSBpbnB1dCBmaWxlKHMpIGFyZSBub3QKLW1vZGlmaWVkOyB0aGUgb3V0cHV0IGRhdGEgaXMgd3JpdHRlbiB0byBmaWxlcyB3aGljaCBoYXZlIHRoZSBzYW1lIG5hbWVzCi1leGNlcHQgZm9yIGV4dGVuc2lvbi4gIGNqcGVnIGFsd2F5cyB1c2VzICIuanBnIiBmb3IgdGhlIG91dHB1dCBmaWxlIG5hbWUncwotZXh0ZW5zaW9uOyBkanBlZyB1c2VzIG9uZSBvZiAiLmJtcCIsICIuZ2lmIiwgIi5wcG0iLCAiLnJsZSIsIG9yICIudGdhIiwKLWRlcGVuZGluZyBvbiB3aGF0IG91dHB1dCBmb3JtYXQgaXMgc2VsZWN0ZWQgYnkgdGhlIHN3aXRjaGVzLgotCi1Gb3IgZXhhbXBsZSwgdG8gY29udmVydCB4eHguYm1wIHRvIHh4eC5qcGcgYW5kIHl5eS5wcG0gdG8geXl5LmpwZywgc2F5OgotCWNqcGVnIHh4eC5ibXAgeXl5LnBwbQotCi1PbiBtb3N0IHN5c3RlbXMgeW91IGNhbiB1c2Ugc3RhbmRhcmQgd2lsZGNhcmRzIHRvIHNwZWNpZnkgdGhlIGxpc3Qgb2YgaW5wdXQKLWZpbGVzOyBmb3IgZXhhbXBsZSwgb24gRE9TICJkanBlZyAqLmpwZyIgZGVjb21wcmVzc2VzIGFsbCB0aGUgSlBFRyBmaWxlcyBpbgotdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotCi1JZiBhbiBpbnRlbmRlZCBvdXRwdXQgZmlsZSBhbHJlYWR5IGV4aXN0cywgeW91J2xsIGJlIGFza2VkIHdoZXRoZXIgb3Igbm90IHRvCi1vdmVyd3JpdGUgaXQuICBJZiB5b3Ugc2F5IG5vLCB0aGUgcHJvZ3JhbSBza2lwcyB0aGF0IGlucHV0IGZpbGUgYW5kIGdvZXMgb24KLXRvIHRoZSBuZXh0IG9uZS4KLQotWW91IGNhbiBpbnRlcm1peCBzd2l0Y2hlcyBhbmQgZmlsZSBuYW1lczsgZm9yIGV4YW1wbGUKLQlkanBlZyAtZ2lmIGZpbGUxLmpwZyAtdGFyZ2EgZmlsZTIuanBnCi1kZWNvbXByZXNzZXMgZmlsZTEuanBnIGludG8gR0lGIGZvcm1hdCAoZmlsZTEuZ2lmKSBhbmQgZmlsZTIuanBnIGludG8gVGFyZ2EKLWZvcm1hdCAoZmlsZTIudGdhKS4gIE9ubHkgc3dpdGNoZXMgdG8gdGhlIGxlZnQgb2YgYSBnaXZlbiBmaWxlIG5hbWUgYWZmZWN0Ci1wcm9jZXNzaW5nIG9mIHRoYXQgZmlsZTsgd2hlbiB0aGVyZSBhcmUgY29uZmxpY3Rpbmcgc3dpdGNoZXMsIHRoZSByaWdodG1vc3QKLW9uZSB0YWtlcyBwcmVjZWRlbmNlLgotCi1Zb3UgY2FuIG92ZXJyaWRlIHRoZSBwcm9ncmFtJ3MgY2hvaWNlIG9mIG91dHB1dCBmaWxlIG5hbWUgYnkgdXNpbmcgdGhlCi0tb3V0ZmlsZSBzd2l0Y2gsIGFzIGluCi0JY2pwZWcgLW91dGZpbGUgb3V0cHV0LmpwZyBpbnB1dC5wcG0KLS1vdXRmaWxlIG9ubHkgYWZmZWN0cyB0aGUgZmlyc3QgaW5wdXQgZmlsZSBuYW1lIHRvIGl0cyByaWdodC4KLQotVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgaW1hZ2UgZmlsZSBmb3JtYXRzIGFyZTogUFBNIChQQk1QTFVTIGNvbG9yIGZvcm1hdCksCi1QR00gKFBCTVBMVVMgZ3JheS1zY2FsZSBmb3JtYXQpLCBCTVAsIEdJRiwgVGFyZ2EsIGFuZCBSTEUgKFV0YWggUmFzdGVyCi1Ub29sa2l0IGZvcm1hdCkuICAoUkxFIGlzIHN1cHBvcnRlZCBvbmx5IGlmIHRoZSBVUlQgbGlicmFyeSBpcyBhdmFpbGFibGUsCi13aGljaCBpdCBpc24ndCBvbiBtb3N0IG5vbi1Vbml4IHN5c3RlbXMuKSAgY2pwZWcgcmVjb2duaXplcyB0aGUgaW5wdXQgaW1hZ2UKLWZvcm1hdCBhdXRvbWF0aWNhbGx5LCB3aXRoIHRoZSBleGNlcHRpb24gb2Ygc29tZSBUYXJnYS1mb3JtYXQgZmlsZXMuICBZb3UKLWhhdmUgdG8gdGVsbCBkanBlZyB3aGljaCBmb3JtYXQgdG8gZ2VuZXJhdGUuCi0KLUpQRUcgZmlsZXMgYXJlIGluIHRoZSBkZWZhY3RvIHN0YW5kYXJkIEpGSUYgZmlsZSBmb3JtYXQuICBUaGVyZSBhcmUgb3RoZXIsCi1sZXNzIHdpZGVseSB1c2VkIEpQRUctYmFzZWQgZmlsZSBmb3JtYXRzLCBidXQgd2UgZG9uJ3Qgc3VwcG9ydCB0aGVtLgotCi1BbGwgc3dpdGNoIG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZDsgZm9yIGV4YW1wbGUsIC1ncmF5c2NhbGUgbWF5IGJlIHdyaXR0ZW4KLS1ncmF5IG9yIC1nci4gIE1vc3Qgb2YgdGhlICJiYXNpYyIgc3dpdGNoZXMgY2FuIGJlIGFiYnJldmlhdGVkIHRvIGFzIGxpdHRsZSBhcwotb25lIGxldHRlci4gIFVwcGVyIGFuZCBsb3dlciBjYXNlIGFyZSBlcXVpdmFsZW50ICgtQk1QIGlzIHRoZSBzYW1lIGFzIC1ibXApLgotQnJpdGlzaCBzcGVsbGluZ3MgYXJlIGFsc28gYWNjZXB0ZWQgKGUuZy4sIC1ncmV5c2NhbGUpLCB0aG91Z2ggZm9yIGJyZXZpdHkKLXRoZXNlIGFyZSBub3QgbWVudGlvbmVkIGJlbG93LgpkaWZmIC0tZ2l0IGEvYW5zaTJrbnIuMSBiL2Fuc2kya25yLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZWU1YTYuLjAwMDAwMDAKLS0tIGEvYW5zaTJrbnIuMQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS5USCBBTlNJMktOUiAxICIxOSBKYW4gMTk5NiIKLS5TSCBOQU1FCi1hbnNpMmtuciBcLSBjb252ZXJ0IEFOU0kgQyB0byBLZXJuaWdoYW4gJiBSaXRjaGllIEMKLS5TSCBTWU5PUFNJUwotLkkgYW5zaTJrbnIKLVstLXZhcmFyZ3NdIGlucHV0X2ZpbGUgW291dHB1dF9maWxlXQotLlNIIERFU0NSSVBUSU9OCi1JZiBubyBvdXRwdXRfZmlsZSBpcyBzdXBwbGllZCwgb3V0cHV0IGdvZXMgdG8gc3Rkb3V0LgotLmJyCi1UaGVyZSBhcmUgbm8gZXJyb3IgbWVzc2FnZXMuCi0uc3AKLS5JIGFuc2kya25yCi1yZWNvZ25pemVzIGZ1bmN0aW9uIGRlZmluaXRpb25zIGJ5IHNlZWluZyBhIG5vbi1rZXl3b3JkIGlkZW50aWZpZXIgYXQgdGhlIGxlZnQKLW1hcmdpbiwgZm9sbG93ZWQgYnkgYSBsZWZ0IHBhcmVudGhlc2lzLCB3aXRoIGEgcmlnaHQgcGFyZW50aGVzaXMgYXMgdGhlIGxhc3QKLWNoYXJhY3RlciBvbiB0aGUgbGluZSwgYW5kIHdpdGggYSBsZWZ0IGJyYWNlIGFzIHRoZSBmaXJzdCB0b2tlbiBvbiB0aGUKLWZvbGxvd2luZyBsaW5lIChpZ25vcmluZyBwb3NzaWJsZSBpbnRlcnZlbmluZyBjb21tZW50cykuICBJdCB3aWxsIHJlY29nbml6ZSBhCi1tdWx0aS1saW5lIGhlYWRlciBwcm92aWRlZCB0aGF0IG5vIGludGVydmVuaW5nIGxpbmUgZW5kcyB3aXRoIGEgbGVmdCBvciByaWdodAotYnJhY2Ugb3IgYSBzZW1pY29sb24uICBUaGVzZSBhbGdvcml0aG1zIGlnbm9yZSB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cywgZXhjZXB0Ci10aGF0IHRoZSBmdW5jdGlvbiBuYW1lIG11c3QgYmUgdGhlIGZpcnN0IHRoaW5nIG9uIHRoZSBsaW5lLgotLnNwCi1UaGUgZm9sbG93aW5nIGNvbnN0cnVjdHMgd2lsbCBjb25mdXNlIGl0OgotLmJyCi0gICAgIC0gQW55IG90aGVyIGNvbnN0cnVjdCB0aGF0IHN0YXJ0cyBhdCB0aGUgbGVmdCBtYXJnaW4gYW5kIGZvbGxvd3MgdGhlCi1hYm92ZSBzeW50YXggKHN1Y2ggYXMgYSBtYWNybyBvciBmdW5jdGlvbiBjYWxsKS4KLS5icgotICAgICAtIFNvbWUgbWFjcm9zIHRoYXQgdGlua2VyIHdpdGggdGhlIHN5bnRheCBvZiB0aGUgZnVuY3Rpb24gaGVhZGVyLgotLnNwCi1UaGUgLS12YXJhcmdzIHN3aXRjaCBpcyBvYnNvbGV0ZSwgYW5kIGlzIHJlY29nbml6ZWQgb25seSBmb3IKLWJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgVGhlIHByZXNlbnQgdmVyc2lvbiBvZgotLkkgYW5zaTJrbnIKLXdpbGwgYWx3YXlzIGF0dGVtcHQgdG8gY29udmVydCBhIC4uLiBhcmd1bWVudCB0byB2YV9hbGlzdCBhbmQgdmFfZGNsLgotLlNIIEFVVEhPUgotTC4gUGV0ZXIgRGV1dHNjaCA8Z2hvc3RAYWxhZGRpbi5jb20+IHdyb3RlIHRoZSBvcmlnaW5hbCBhbnNpMmtuciBhbmQKLWNvbnRpbnVlcyB0byBtYWludGFpbiB0aGUgY3VycmVudCB2ZXJzaW9uOyBtb3N0IG9mIHRoZSBjb2RlIGluIHRoZSBjdXJyZW50Ci12ZXJzaW9uIGlzIGhpcyB3b3JrLiAgYW5zaTJrbnIgYWxzbyBpbmNsdWRlcyBjb250cmlidXRpb25zIGJ5IEZyYW5jb2lzCi1QaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPiBhbmQgSmltIEF2ZXJhIDxqaW1hQG5ldGNvbS5jb20+LgpkaWZmIC0tZ2l0IGEvYW5zaTJrbnIuYyBiL2Fuc2kya25yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMDVmYzIuLjAwMDAwMDAKLS0tIGEvYW5zaTJrbnIuYworKysgL2Rldi9udWxsCkBAIC0xLDY5MyArMCwwIEBACi0vKiBhbnNpMmtuci5jICovCi0vKiBDb252ZXJ0IEFOU0kgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB0byBLJlIgKCJ0cmFkaXRpb25hbCBDIikgc3ludGF4ICovCi0KLS8qCi1hbnNpMmtuciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKLVdBUlJBTlRZLiAgTm8gYXV0aG9yIG9yIGRpc3RyaWJ1dG9yIGFjY2VwdHMgcmVzcG9uc2liaWxpdHkgdG8gYW55b25lIGZvciB0aGUKLWNvbnNlcXVlbmNlcyBvZiB1c2luZyBpdCBvciBmb3Igd2hldGhlciBpdCBzZXJ2ZXMgYW55IHBhcnRpY3VsYXIgcHVycG9zZSBvcgotd29ya3MgYXQgYWxsLCB1bmxlc3MgaGUgc2F5cyBzbyBpbiB3cml0aW5nLiAgUmVmZXIgdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSAodGhlICJHUEwiKSBmb3IgZnVsbCBkZXRhaWxzLgotCi1FdmVyeW9uZSBpcyBncmFudGVkIHBlcm1pc3Npb24gdG8gY29weSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUgYW5zaTJrbnIsCi1idXQgb25seSB1bmRlciB0aGUgY29uZGl0aW9ucyBkZXNjcmliZWQgaW4gdGhlIEdQTC4gIEEgY29weSBvZiB0aGlzIGxpY2Vuc2UKLWlzIHN1cHBvc2VkIHRvIGhhdmUgYmVlbiBnaXZlbiB0byB5b3UgYWxvbmcgd2l0aCBhbnNpMmtuciBzbyB5b3UgY2FuIGtub3cKLXlvdXIgcmlnaHRzIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgSXQgc2hvdWxkIGJlIGluIGEgZmlsZSBuYW1lZCBDT1BZTEVGVC4KLVtJbiB0aGUgSUpHIGRpc3RyaWJ1dGlvbiwgdGhlIEdQTCBhcHBlYXJzIGJlbG93LCBub3QgaW4gYSBzZXBhcmF0ZSBmaWxlLl0KLUFtb25nIG90aGVyIHRoaW5ncywgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIG11c3QgYmUgcHJlc2VydmVkCi1vbiBhbGwgY29waWVzLgotCi1XZSBleHBsaWNpdGx5IHN0YXRlIGhlcmUgd2hhdCB3ZSBiZWxpZXZlIGlzIGFscmVhZHkgaW1wbGllZCBieSB0aGUgR1BMOiBpZgotdGhlIGFuc2kya25yIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgYXMgYSBzZXBhcmF0ZSBzZXQgb2Ygc291cmNlcyBhbmQgYQotc2VwYXJhdGUgZXhlY3V0YWJsZSBmaWxlIHdoaWNoIGFyZSBhZ2dyZWdhdGVkIG9uIGEgc3RvcmFnZSBtZWRpdW0gdG9nZXRoZXIKLXdpdGggYW5vdGhlciBwcm9ncmFtLCB0aGlzIGluIGl0c2VsZiBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgcHJvZ3JhbSB1bmRlcgotdGhlIEdQTCwgbm9yIGRvZXMgdGhlIG1lcmUgZmFjdCB0aGF0IHN1Y2ggYSBwcm9ncmFtIG9yIHRoZSBwcm9jZWR1cmVzIGZvcgotY29uc3RydWN0aW5nIGl0IGludm9rZSB0aGUgYW5zaTJrbnIgZXhlY3V0YWJsZSBicmluZyBhbnkgb3RoZXIgcGFydCBvZiB0aGUKLXByb2dyYW0gdW5kZXIgdGhlIEdQTC4KLSovCi0KLS8qCi0tLS0tLS0tLS0tIEhlcmUgaXMgdGhlIEdOVSBHUEwgZmlsZSBDT1BZTEVGVCwgcmVmZXJyZWQgdG8gYWJvdmUgLS0tLS0tLS0tLQotLS0tLS0gVGhlc2UgdGVybXMgZG8gTk9UIGFwcGx5IHRvIHRoZSBKUEVHIHNvZnR3YXJlIGl0c2VsZjsgc2VlIFJFQURNRSAtLS0tLS0KLQotCQkgICAgR0hPU1RTQ1JJUFQgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgKENsYXJpZmllZCAxMSBGZWIgMTk4OCkKLQotIENvcHlyaWdodCAoQykgMTk4OCBSaWNoYXJkIE0uIFN0YWxsbWFuCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoaXMKLSBsaWNlbnNlLCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgd29yZGluZwotIHRvIG1ha2UgdGhlIHRlcm1zIGZvciBvdGhlciBwcm9ncmFtcy4KLQotICBUaGUgbGljZW5zZSBhZ3JlZW1lbnRzIG9mIG1vc3Qgc29mdHdhcmUgY29tcGFuaWVzIGtlZXAgeW91IGF0IHRoZQotbWVyY3kgb2YgdGhvc2UgY29tcGFuaWVzLiAgQnkgY29udHJhc3QsIG91ciBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGlzCi1pbnRlbmRlZCB0byBnaXZlIGV2ZXJ5b25lIHRoZSByaWdodCB0byBzaGFyZSBHaG9zdHNjcmlwdC4gIFRvIG1ha2Ugc3VyZQotdGhhdCB5b3UgZ2V0IHRoZSByaWdodHMgd2Ugd2FudCB5b3UgdG8gaGF2ZSwgd2UgbmVlZCB0byBtYWtlCi1yZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQgYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91Ci10byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gIEhlbmNlIHRoaXMgbGljZW5zZSBhZ3JlZW1lbnQuCi0KLSAgU3BlY2lmaWNhbGx5LCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSByaWdodCB0byBnaXZlCi1hd2F5IGNvcGllcyBvZiBHaG9zdHNjcmlwdCwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBlbHNlIGNhbiBnZXQKLWl0IGlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIEdob3N0c2NyaXB0IG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zLCBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBtYWtlIHN1cmUgdGhhdCBldmVyeW9uZSBoYXMgc3VjaCByaWdodHMsIHdlIGhhdmUgdG8gZm9yYmlkIHlvdSB0bwotZGVwcml2ZSBhbnlvbmUgZWxzZSBvZiB0aGVzZSByaWdodHMuICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUKLWNvcGllcyBvZiBHaG9zdHNjcmlwdCwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Ci15b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQotc291cmNlIGNvZGUuICBBbmQgeW91IG11c3QgdGVsbCB0aGVtIHRoZWlyIHJpZ2h0cy4KLQotICBBbHNvLCBmb3Igb3VyIG93biBwcm90ZWN0aW9uLCB3ZSBtdXN0IG1ha2UgY2VydGFpbiB0aGF0IGV2ZXJ5b25lIGZpbmRzCi1vdXQgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgR2hvc3RzY3JpcHQuICBJZiBHaG9zdHNjcmlwdCBpcwotbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlIHdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdwotdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3Qgd2hhdCB3ZSBkaXN0cmlidXRlZCwgc28gdGhhdCBhbnkgcHJvYmxlbXMKLWludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gb3VyIHJlcHV0YXRpb24uCi0KLSAgVGhlcmVmb3JlIHdlIChSaWNoYXJkIE0uIFN0YWxsbWFuIGFuZCB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotSW5jLikgbWFrZSB0aGUgZm9sbG93aW5nIHRlcm1zIHdoaWNoIHNheSB3aGF0IHlvdSBtdXN0IGRvIHRvIGJlIGFsbG93ZWQKLXRvIGRpc3RyaWJ1dGUgb3IgY2hhbmdlIEdob3N0c2NyaXB0LgotCi0KLQkJCUNPUFlJTkcgUE9MSUNJRVMKLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIEdob3N0c2NyaXB0IHNvdXJjZQotY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseQotYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYSB2YWxpZCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UKLW5vdGljZSAiQ29weXJpZ2h0IChDKSAxOTg5IEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotRGlzdHJpYnV0ZWQgYnkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIiAob3Igd2l0aCB3aGF0ZXZlciB5ZWFyIGlzCi1hcHByb3ByaWF0ZSk7IGtlZXAgaW50YWN0IHRoZSBub3RpY2VzIG9uIGFsbCBmaWxlcyB0aGF0IHJlZmVyIHRvIHRoaXMKLUxpY2Vuc2UgQWdyZWVtZW50IGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFueSBvdGhlcgotcmVjaXBpZW50cyBvZiB0aGUgR2hvc3RzY3JpcHQgcHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIEFncmVlbWVudAotYWxvbmcgd2l0aCB0aGUgcHJvZ3JhbS4gIFlvdSBtYXkgY2hhcmdlIGEgZGlzdHJpYnV0aW9uIGZlZSBmb3IgdGhlCi1waHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIEdob3N0c2NyaXB0IG9yIGFueSBwb3J0aW9uIG9mCi1pdCwgYW5kIGNvcHkgYW5kIGRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBvZgotUGFyYWdyYXBoIDEgYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCi0gICAgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2U7IGFuZAotCi0gICAgYikgY2F1c2UgdGhlIHdob2xlIG9mIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwKLSAgICB0aGF0IGluIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgYSBkZXJpdmF0aXZlIG9mIEdob3N0c2NyaXB0Ci0gICAgb3IgYW55IHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgb24gdGVybXMgaWRlbnRpY2FsIHRvIHRob3NlIGNvbnRhaW5lZCBpbiB0aGlzIExpY2Vuc2UKLSAgICBBZ3JlZW1lbnQgKGV4Y2VwdCB0aGF0IHlvdSBtYXkgY2hvb3NlIHRvIGdyYW50IG1vcmUgZXh0ZW5zaXZlCi0gICAgd2FycmFudHkgcHJvdGVjdGlvbiB0byBzb21lIG9yIGFsbCB0aGlyZCBwYXJ0aWVzLCBhdCB5b3VyIG9wdGlvbikuCi0KLSAgICBjKSBZb3UgbWF5IGNoYXJnZSBhIGRpc3RyaWJ1dGlvbiBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YKLSAgICB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eQotICAgIHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi1NZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgdW5yZWxhdGVkIHByb2dyYW0gd2l0aCB0aGlzIHByb2dyYW0gKG9yIGl0cwotZGVyaXZhdGl2ZSkgb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcKLXRoZSBvdGhlciBwcm9ncmFtIHVuZGVyIHRoZSBzY29wZSBvZiB0aGVzZSB0ZXJtcy4KLQotICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgR2hvc3RzY3JpcHQgKG9yIGEgcG9ydGlvbiBvciBkZXJpdmF0aXZlCi1vZiBpdCwgdW5kZXIgUGFyYWdyYXBoIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUKLXRlcm1zIG9mIFBhcmFncmFwaHMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUKLWZvbGxvd2luZzoKLQotICAgIGEpIGFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKLSAgICBQYXJhZ3JhcGhzIDEgYW5kIDIgYWJvdmU7IG9yLAotCi0gICAgYikgYWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHkgZnJlZSAoZXhjZXB0IGZvciBhIG5vbWluYWwKLSAgICBzaGlwcGluZyBjaGFyZ2UpIGEgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgotICAgIFBhcmFncmFwaHMgMSBhbmQgMiBhYm92ZTsgb3IsCi0KLSAgICBjKSBhY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHdoZXJlIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKLSAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQotICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSBhbG9uZS4pCi0KLUZvciBhbiBleGVjdXRhYmxlIGZpbGUsIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yCi1hbGwgbW9kdWxlcyBpdCBjb250YWluczsgYnV0LCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpdCBuZWVkIG5vdCBpbmNsdWRlCi1zb3VyY2UgY29kZSBmb3IgbW9kdWxlcyB3aGljaCBhcmUgc3RhbmRhcmQgbGlicmFyaWVzIHRoYXQgYWNjb21wYW55IHRoZQotb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBmaWxlIHJ1bnMuCi0KLSAgNC4gWW91IG1heSBub3QgY29weSwgc3VibGljZW5zZSwgZGlzdHJpYnV0ZSBvciB0cmFuc2ZlciBHaG9zdHNjcmlwdAotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UgQWdyZWVtZW50LiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBzdWJsaWNlbnNlLCBkaXN0cmlidXRlIG9yIHRyYW5zZmVyIEdob3N0c2NyaXB0IGlzCi12b2lkIGFuZCB5b3VyIHJpZ2h0cyB0byB1c2UgdGhlIHByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlIGFncmVlbWVudAotc2hhbGwgYmUgYXV0b21hdGljYWxseSB0ZXJtaW5hdGVkLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZAotY29tcHV0ZXIgc29mdHdhcmUgcHJvZ3JhbXMgZnJvbSB5b3Ugd2l0aCB0aGlzIExpY2Vuc2UgQWdyZWVtZW50IHdpbGwgbm90Ci1oYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwKLWNvbXBsaWFuY2UuCi0KLSAgNS4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgR2hvc3RzY3JpcHQgaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiBhdCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzkuICBXZSBoYXZlIG5vdAoteWV0IHdvcmtlZCBvdXQgYSBzaW1wbGUgcnVsZSB0aGF0IGNhbiBiZSBzdGF0ZWQgaGVyZSwgYnV0IHdlIHdpbGwgb2Z0ZW4KLXBlcm1pdCB0aGlzLiAgV2Ugd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlCi1zdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlCi1zaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZS4KLQotWW91ciBjb21tZW50cyBhbmQgc3VnZ2VzdGlvbnMgYWJvdXQgb3VyIGxpY2Vuc2luZyBwb2xpY2llcyBhbmQgb3VyCi1zb2Z0d2FyZSBhcmUgd2VsY29tZSEgIFBsZWFzZSBjb250YWN0IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi1JbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIG9yIGNhbGwgKDYxNykgODc2LTMyOTYuCi0KLQkJICAgICAgIE5PIFdBUlJBTlRZCi0KLSAgQkVDQVVTRSBHSE9TVFNDUklQVCBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgV0UgUFJPVklERSBBQlNPTFVURUxZCi1OTyBXQVJSQU5UWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBTVEFURSBMQVcuICBFWENFUFQKLVdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HLCBGUkVFIFNPRlRXQVJFIEZPVU5EQVRJT04sIElOQywgUklDSEFSRAotTS4gU1RBTExNQU4sIEFMQURESU4gRU5URVJQUklTRVMsIEwuIFBFVEVSIERFVVRTQ0gsIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIEdIT1NUU0NSSVBUICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSCi1FWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi1XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUKLUVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBHSE9TVFNDUklQVCBJUyBXSVRICi1ZT1UuICBTSE9VTEQgR0hPU1RTQ1JJUFQgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTAotTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIFdJTEwgUklDSEFSRCBNLgotU1RBTExNQU4sIFRIRSBGUkVFIFNPRlRXQVJFIEZPVU5EQVRJT04sIElOQy4sIEwuIFBFVEVSIERFVVRTQ0gsIEFMQURESU4KLUVOVEVSUFJJU0VTLCBBTkQvT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORCBSRURJU1RSSUJVVEUKLUdIT1NUU0NSSVBUIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HCi1BTlkgTE9TVCBQUk9GSVRTLCBMT1NUIE1PTklFUywgT1IgT1RIRVIgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRQotKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQKLUlOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUKLVBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUykgR0hPU1RTQ1JJUFQsIEVWRU4gSUYgWU9VCi1IQVZFIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLCBPUiBGT1IgQU5ZIENMQUlNCi1CWSBBTlkgT1RIRVIgUEFSVFkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvZiBmaWxlIENPUFlMRUZUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotLyoKLSAqIFVzYWdlOgotCWFuc2kya25yIGlucHV0X2ZpbGUgW291dHB1dF9maWxlXQotICogSWYgbm8gb3V0cHV0X2ZpbGUgaXMgc3VwcGxpZWQsIG91dHB1dCBnb2VzIHRvIHN0ZG91dC4KLSAqIFRoZXJlIGFyZSBubyBlcnJvciBtZXNzYWdlcy4KLSAqCi0gKiBhbnNpMmtuciByZWNvZ25pemVzIGZ1bmN0aW9uIGRlZmluaXRpb25zIGJ5IHNlZWluZyBhIG5vbi1rZXl3b3JkCi0gKiBpZGVudGlmaWVyIGF0IHRoZSBsZWZ0IG1hcmdpbiwgZm9sbG93ZWQgYnkgYSBsZWZ0IHBhcmVudGhlc2lzLAotICogd2l0aCBhIHJpZ2h0IHBhcmVudGhlc2lzIGFzIHRoZSBsYXN0IGNoYXJhY3RlciBvbiB0aGUgbGluZSwKLSAqIGFuZCB3aXRoIGEgbGVmdCBicmFjZSBhcyB0aGUgZmlyc3QgdG9rZW4gb24gdGhlIGZvbGxvd2luZyBsaW5lCi0gKiAoaWdub3JpbmcgcG9zc2libGUgaW50ZXJ2ZW5pbmcgY29tbWVudHMpLgotICogSXQgd2lsbCByZWNvZ25pemUgYSBtdWx0aS1saW5lIGhlYWRlciBwcm92aWRlZCB0aGF0IG5vIGludGVydmVuaW5nCi0gKiBsaW5lIGVuZHMgd2l0aCBhIGxlZnQgb3IgcmlnaHQgYnJhY2Ugb3IgYSBzZW1pY29sb24uCi0gKiBUaGVzZSBhbGdvcml0aG1zIGlnbm9yZSB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cywgZXhjZXB0IHRoYXQKLSAqIHRoZSBmdW5jdGlvbiBuYW1lIG11c3QgYmUgdGhlIGZpcnN0IHRoaW5nIG9uIHRoZSBsaW5lLgotICogVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzIHdpbGwgY29uZnVzZSBpdDoKLSAqCS0gQW55IG90aGVyIGNvbnN0cnVjdCB0aGF0IHN0YXJ0cyBhdCB0aGUgbGVmdCBtYXJnaW4gYW5kCi0gKgkgICAgZm9sbG93cyB0aGUgYWJvdmUgc3ludGF4IChzdWNoIGFzIGEgbWFjcm8gb3IgZnVuY3Rpb24gY2FsbCkuCi0gKgktIFNvbWUgbWFjcm9zIHRoYXQgdGlua2VyIHdpdGggdGhlIHN5bnRheCBvZiB0aGUgZnVuY3Rpb24gaGVhZGVyLgotICovCi0KLS8qCi0gKiBUaGUgb3JpZ2luYWwgYW5kIHByaW5jaXBhbCBhdXRob3Igb2YgYW5zaTJrbnIgaXMgTC4gUGV0ZXIgRGV1dHNjaAotICogPGdob3N0QGFsYWRkaW4uY29tPi4gIE90aGVyIGF1dGhvcnMgYXJlIG5vdGVkIGluIHRoZSBjaGFuZ2UgaGlzdG9yeQotICogdGhhdCBmb2xsb3dzIChpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIpOgotCWxwZCA5Ni0wMS0yMSBhZGRlZCBjb2RlIHRvIGNvcGUgd2l0aCBub3QgSEFWRV9DT05GSUdfSCBhbmQgd2l0aAotCQljb21waWxlcnMgdGhhdCBkb24ndCB1bmRlcnN0YW5kIHZvaWQsIGFzIHN1Z2dlc3RlZCBieQotCQlUb20gTGFuZQotCWxwZCA5Ni0wMS0xNSBjaGFuZ2VkIHRvIHJlcXVpcmUgdGhhdCB0aGUgZmlyc3Qgbm9uLWNvbW1lbnQgdG9rZW4KLQkJb24gdGhlIGxpbmUgZm9sbG93aW5nIGEgZnVuY3Rpb24gaGVhZGVyIGJlIGEgbGVmdCBicmFjZSwKLQkJdG8gcmVkdWNlIHNlbnNpdGl2aXR5IHRvIG1hY3JvcywgYXMgc3VnZ2VzdGVkIGJ5IFRvbSBMYW5lCi0JCTx0Z2xAc3NzLnBnaC5wYS51cz4KLQlscGQgOTUtMDYtMjIgcmVtb3ZlZCAjaWZuZGVmcyB3aG9zZSBzb2xlIHB1cnBvc2Ugd2FzIHRvIGRlZmluZQotCQl1bmRlZmluZWQgcHJlcHJvY2Vzc29yIHN5bWJvbHMgYXMgMDsgY2hhbmdlZCBhbGwgI2lmZGVmcwotCQlmb3IgY29uZmlndXJhdGlvbiBzeW1ib2xzIHRvICNpZnMKLQlscGQgOTUtMDQtMDUgY2hhbmdlZCBjb3B5cmlnaHQgbm90aWNlIHRvIG1ha2UgaXQgY2xlYXIgdGhhdAotCQlpbmNsdWRpbmcgYW5zaTJrbnIgaW4gYSBwcm9ncmFtIGRvZXMgbm90IGJyaW5nIHRoZSBlbnRpcmUKLQkJcHJvZ3JhbSB1bmRlciB0aGUgR1BMCi0JbHBkIDk0LTEyLTE4IGFkZGVkIGNvbmRpdGlvbmFscyBmb3Igc3lzdGVtcyB3aGVyZSBjdHlwZSBtYWNyb3MKLQkJZG9uJ3QgaGFuZGxlIDgtYml0IGNoYXJhY3RlcnMgcHJvcGVybHksIHN1Z2dlc3RlZCBieQotCQlGcmFuY29pcyBQaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPjsKLQkJcmVtb3ZlZCAtLXZhcmFyZ3Mgc3dpdGNoICh0aGlzIGlzIG5vdyB0aGUgZGVmYXVsdCkKLQlscGQgOTQtMTAtMTAgcmVtb3ZlZCBDT05GSUdfQlJPS0VUUyBjb25kaXRpb25hbAotCWxwZCA5NC0wNy0xNiBhZGRlZCBzb21lIGNvbmRpdGlvbmFscyB0byBoZWxwIEdOVSBgY29uZmlndXJlJywKLQkJc3VnZ2VzdGVkIGJ5IEZyYW5jb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+OwotCQlwcm9wZXJseSBlcmFzZSBwcm90b3R5cGUgYXJncyBpbiBmdW5jdGlvbiBwYXJhbWV0ZXJzLAotCQljb250cmlidXRlZCBieSBKaW0gQXZlcmEgPGppbWFAbmV0Y29tLmNvbT47Ci0JCWNvcnJlY3QgZXJyb3IgaW4gd3JpdGVibGFua3MgKGl0IHNob3VsZG4ndCBlcmFzZSBFT0xzKQotCWxwZCA4OS14eC14eCBvcmlnaW5hbCB2ZXJzaW9uCi0gKi8KLQotLyogTW9zdCBvZiB0aGUgY29uZGl0aW9uYWxzIGhlcmUgYXJlIHRvIG1ha2UgYW5zaTJrbnIgd29yayB3aXRoICovCi0vKiBvciB3aXRob3V0IHRoZSBHTlUgY29uZmlndXJlIG1hY2hpbmVyeS4gKi8KLQotI2lmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2lmIEhBVkVfQ09ORklHX0gKLQotLyoKLSAgIEZvciBwcm9wZXJseSBhdXRvY29uZmlndXJpbmcgYW5zaTJrbnIsIHVzZSBBQ19DT05GSUdfSEVBREVSKGNvbmZpZy5oKS4KLSAgIFRoaXMgd2lsbCBkZWZpbmUgSEFWRV9DT05GSUdfSCBhbmQgc28sIGFjdGl2YXRlIHRoZSBmb2xsb3dpbmcgbGluZXMuCi0gKi8KLQotIyBpZiBTVERDX0hFQURFUlMgfHwgSEFWRV9TVFJJTkdfSAotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jIGVsc2UKLSMgIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSMgZW5kaWYKLQotI2Vsc2UgLyogbm90IEhBVkVfQ09ORklHX0ggKi8KLQotLyogT3RoZXJ3aXNlIGRvIGl0IHRoZSBoYXJkIHdheSAqLwotCi0jIGlmZGVmIEJTRAotIyAgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyBlbHNlCi0jICBpZmRlZiBWTVMKLSAgICBleHRlcm4gaW50IHN0cmxlbigpLCBzdHJuY21wKCk7Ci0jICBlbHNlCi0jICAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jICBlbmRpZgotIyBlbmRpZgotCi0jZW5kaWYgLyogbm90IEhBVkVfQ09ORklHX0ggKi8KLQotI2lmIFNURENfSEVBREVSUwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi0vKgotICAgbWFsbG9jIGFuZCBmcmVlIHNob3VsZCBiZSBkZWNsYXJlZCBpbiBzdGRsaWIuaCwKLSAgIGJ1dCBpZiB5b3UndmUgZ290IGEgSyZSIGNvbXBpbGVyLCB0aGV5IHByb2JhYmx5IGFyZW4ndC4KLSAqLwotIyBpZmRlZiBNU0RPUwotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jIGVsc2UKLSMgIGlmZGVmIFZNUwotICAgICBleHRlcm4gY2hhciAqbWFsbG9jKCk7Ci0gICAgIGV4dGVybiB2b2lkIGZyZWUoKTsKLSMgIGVsc2UKLSAgICAgZXh0ZXJuIGNoYXIgKm1hbGxvYygpOwotICAgICBleHRlcm4gaW50IGZyZWUoKTsKLSMgIGVuZGlmCi0jIGVuZGlmCi0KLSNlbmRpZgotCi0vKgotICogVGhlIGN0eXBlIG1hY3JvcyBkb24ndCBhbHdheXMgaGFuZGxlIDgtYml0IGNoYXJhY3RlcnMgY29ycmVjdGx5LgotICogQ29tcGVuc2F0ZSBmb3IgdGhpcyBoZXJlLgotICovCi0jaWZkZWYgaXNhc2NpaQotIyAgdW5kZWYgSEFWRV9JU0FTQ0lJCQkvKiBqdXN0IGluIGNhc2UgKi8KLSMgIGRlZmluZSBIQVZFX0lTQVNDSUkgMQotI2Vsc2UKLSNlbmRpZgotI2lmIFNURENfSEVBREVSUyB8fCAhSEFWRV9JU0FTQ0lJCi0jICBkZWZpbmUgaXNfYXNjaWkoYykgMQotI2Vsc2UKLSMgIGRlZmluZSBpc19hc2NpaShjKSBpc2FzY2lpKGMpCi0jZW5kaWYKLQotI2RlZmluZSBpc19zcGFjZShjKSAoaXNfYXNjaWkoYykgJiYgaXNzcGFjZShjKSkKLSNkZWZpbmUgaXNfYWxwaGEoYykgKGlzX2FzY2lpKGMpICYmIGlzYWxwaGEoYykpCi0jZGVmaW5lIGlzX2FsbnVtKGMpIChpc19hc2NpaShjKSAmJiBpc2FsbnVtKGMpKQotCi0vKiBTY2FubmluZyBtYWNyb3MgKi8KLSNkZWZpbmUgaXNpZGNoYXIoY2gpIChpc19hbG51bShjaCkgfHwgKGNoKSA9PSAnXycpCi0jZGVmaW5lIGlzaWRmaXJzdGNoYXIoY2gpIChpc19hbHBoYShjaCkgfHwgKGNoKSA9PSAnXycpCi0KLS8qIEZvcndhcmQgcmVmZXJlbmNlcyAqLwotY2hhciAqc2tpcHNwYWNlKCk7Ci1pbnQgd3JpdGVibGFua3MoKTsKLWludCB0ZXN0MSgpOwotaW50IGNvbnZlcnQxKCk7Ci0KLS8qIFRoZSBtYWluIHByb2dyYW0gKi8KLWludAotbWFpbihhcmdjLCBhcmd2KQotICAgIGludCBhcmdjOwotICAgIGNoYXIgKmFyZ3ZbXTsKLXsJRklMRSAqaW4sICpvdXQ7Ci0jZGVmaW5lIGJ1ZnNpemUgNTAwMAkJCS8qIGFyYml0cmFyeSBzaXplICovCi0JY2hhciAqYnVmOwotCWNoYXIgKmxpbmU7Ci0JY2hhciAqbW9yZTsKLQkvKgotCSAqIEluIHByZXZpb3VzIHZlcnNpb25zLCBhbnNpMmtuciByZWNvZ25pemVkIGEgLS12YXJhcmdzIHN3aXRjaC4KLQkgKiBJZiB0aGlzIHN3aXRjaCB3YXMgc3VwcGxpZWQsIGFuc2kya25yIHdvdWxkIGF0dGVtcHQgdG8gY29udmVydAotCSAqIGEgLi4uIGFyZ3VtZW50IHRvIHZhX2FsaXN0IGFuZCB2YV9kY2w7IGlmIHRoaXMgc3dpdGNoIHdhcyBub3QKLQkgKiBzdXBwbGllZCwgYW5zaTJrbnIgd291bGQgc2ltcGx5IGRyb3AgYW55IHN1Y2ggYXJndW1lbnRzLgotCSAqIE5vdywgYW5zaTJrbnIgYWx3YXlzIGRvZXMgdGhpcyBjb252ZXJzaW9uLCBhbmQgd2Ugb25seQotCSAqIGNoZWNrIGZvciB0aGlzIHN3aXRjaCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLQkgKi8KLQlpbnQgY29udmVydF92YXJhcmdzID0gMTsKLQotCWlmICggYXJnYyA+IDEgJiYgYXJndlsxXVswXSA9PSAnLScgKQotCSAgewlpZiAoICFzdHJjbXAoYXJndlsxXSwgIi0tdmFyYXJncyIpICkKLQkJICB7CWNvbnZlcnRfdmFyYXJncyA9IDE7Ci0JCQlhcmdjLS07Ci0JCQlhcmd2Kys7Ci0JCSAgfQotCQllbHNlCi0JCSAgewlmcHJpbnRmKHN0ZGVyciwgIlVucmVjb2duaXplZCBzd2l0Y2g6ICVzXG4iLCBhcmd2WzFdKTsKLQkJCWV4aXQoMSk7Ci0JCSAgfQotCSAgfQotCXN3aXRjaCAoIGFyZ2MgKQotCSAgIHsKLQlkZWZhdWx0OgotCQlwcmludGYoIlVzYWdlOiBhbnNpMmtuciBpbnB1dF9maWxlIFtvdXRwdXRfZmlsZV1cbiIpOwotCQlleGl0KDApOwotCWNhc2UgMjoKLQkJb3V0ID0gc3Rkb3V0OwotCQlicmVhazsKLQljYXNlIDM6Ci0JCW91dCA9IGZvcGVuKGFyZ3ZbMl0sICJ3Iik7Ci0JCWlmICggb3V0ID09IE5VTEwgKQotCQkgICB7CWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIGFyZ3ZbMl0pOwotCQkJZXhpdCgxKTsKLQkJICAgfQotCSAgIH0KLQlpbiA9IGZvcGVuKGFyZ3ZbMV0sICJyIik7Ci0JaWYgKCBpbiA9PSBOVUxMICkKLQkgICB7CWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlc1xuIiwgYXJndlsxXSk7Ci0JCWV4aXQoMSk7Ci0JICAgfQotCWZwcmludGYob3V0LCAiI2xpbmUgMSBcIiVzXCJcbiIsIGFyZ3ZbMV0pOwotCWJ1ZiA9IG1hbGxvYyhidWZzaXplKTsKLQlsaW5lID0gYnVmOwotCXdoaWxlICggZmdldHMobGluZSwgKHVuc2lnbmVkKShidWYgKyBidWZzaXplIC0gbGluZSksIGluKSAhPSBOVUxMICkKLQkgICB7Ci10ZXN0OgkJbGluZSArPSBzdHJsZW4obGluZSk7Ci0JCXN3aXRjaCAoIHRlc3QxKGJ1ZikgKQotCQkgICB7Ci0JCWNhc2UgMjoJCQkvKiBhIGZ1bmN0aW9uIGhlYWRlciAqLwotCQkJY29udmVydDEoYnVmLCBvdXQsIDEsIGNvbnZlcnRfdmFyYXJncyk7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgkJCS8qIGEgZnVuY3Rpb24gKi8KLQkJCS8qIENoZWNrIGZvciBhIHsgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGxpbmUuICovCi0JCQltb3JlID0gKytsaW5lOwotZjoJCQlpZiAoIGxpbmUgPj0gYnVmICsgKGJ1ZnNpemUgLSAxKSApIC8qIG92ZXJmbG93IGNoZWNrICovCi0JCQkgIGdvdG8gd2w7Ci0JCQlpZiAoIGZnZXRzKGxpbmUsICh1bnNpZ25lZCkoYnVmICsgYnVmc2l6ZSAtIGxpbmUpLCBpbikgPT0gTlVMTCApCi0JCQkgIGdvdG8gd2w7Ci0JCQlzd2l0Y2ggKCAqc2tpcHNwYWNlKG1vcmUsIDEpICkKLQkJCSAgewotCQkJICBjYXNlICd7JzoKLQkJCSAgICAvKiBEZWZpbml0ZWx5IGEgZnVuY3Rpb24gaGVhZGVyLiAqLwotCQkJICAgIGNvbnZlcnQxKGJ1Ziwgb3V0LCAwLCBjb252ZXJ0X3ZhcmFyZ3MpOwotCQkJICAgIGZwdXRzKG1vcmUsIG91dCk7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGNhc2UgMDoKLQkJCSAgICAvKiBUaGUgbmV4dCBsaW5lIHdhcyBibGFuayBvciBhIGNvbW1lbnQ6ICovCi0JCQkgICAgLyoga2VlcCBzY2FubmluZyBmb3IgYSBub24tY29tbWVudC4gKi8KLQkJCSAgICBsaW5lICs9IHN0cmxlbihsaW5lKTsKLQkJCSAgICBnb3RvIGY7Ci0JCQkgIGRlZmF1bHQ6Ci0JCQkgICAgLyogYnVmIGlzbid0IGEgZnVuY3Rpb24gaGVhZGVyLCBidXQgKi8KLQkJCSAgICAvKiBtb3JlIG1pZ2h0IGJlLiAqLwotCQkJICAgIGZwdXRzKGJ1Ziwgb3V0KTsKLQkJCSAgICBzdHJjcHkoYnVmLCBtb3JlKTsKLQkJCSAgICBsaW5lID0gYnVmOwotCQkJICAgIGdvdG8gdGVzdDsKLQkJCSAgfQotCQkJYnJlYWs7Ci0JCWNhc2UgLTE6CQkvKiBtYXliZSB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbiAqLwotCQkJaWYgKCBsaW5lICE9IGJ1ZiArIChidWZzaXplIC0gMSkgKSAvKiBvdmVyZmxvdyBjaGVjayAqLwotCQkJICBjb250aW51ZTsKLQkJCS8qIGZhbGxzIHRocm91Z2ggKi8KLQkJZGVmYXVsdDoJCS8qIG5vdCBhIGZ1bmN0aW9uICovCi13bDoJCQlmcHV0cyhidWYsIG91dCk7Ci0JCQlicmVhazsKLQkJICAgfQotCQlsaW5lID0gYnVmOwotCSAgIH0KLQlpZiAoIGxpbmUgIT0gYnVmICkKLQkgIGZwdXRzKGJ1Ziwgb3V0KTsKLQlmcmVlKGJ1Zik7Ci0JZmNsb3NlKG91dCk7Ci0JZmNsb3NlKGluKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogU2tpcCBvdmVyIHNwYWNlIGFuZCBjb21tZW50cywgaW4gZWl0aGVyIGRpcmVjdGlvbi4gKi8KLWNoYXIgKgotc2tpcHNwYWNlKHAsIGRpcikKLSAgICByZWdpc3RlciBjaGFyICpwOwotICAgIHJlZ2lzdGVyIGludCBkaXI7CQkJLyogMSBmb3IgZm9yd2FyZCwgLTEgZm9yIGJhY2t3YXJkICovCi17CWZvciAoIDsgOyApCi0JICAgewl3aGlsZSAoIGlzX3NwYWNlKCpwKSApCi0JCSAgcCArPSBkaXI7Ci0JCWlmICggISgqcCA9PSAnLycgJiYgcFtkaXJdID09ICcqJykgKQotCQkgIGJyZWFrOwotCQlwICs9IGRpcjsgIHAgKz0gZGlyOwotCQl3aGlsZSAoICEoKnAgPT0gJyonICYmIHBbZGlyXSA9PSAnLycpICkKLQkJICAgewlpZiAoICpwID09IDAgKQotCQkJICByZXR1cm4gcDsJLyogbXVsdGktbGluZSBjb21tZW50Pz8gKi8KLQkJCXAgKz0gZGlyOwotCQkgICB9Ci0JCXAgKz0gZGlyOyAgcCArPSBkaXI7Ci0JICAgfQotCXJldHVybiBwOwotfQotCi0vKgotICogV3JpdGUgYmxhbmtzIG92ZXIgcGFydCBvZiBhIHN0cmluZy4KLSAqIERvbid0IG92ZXJ3cml0ZSBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzLgotICovCi1pbnQKLXdyaXRlYmxhbmtzKHN0YXJ0LCBlbmQpCi0gICAgY2hhciAqc3RhcnQ7Ci0gICAgY2hhciAqZW5kOwotewljaGFyICpwOwotCWZvciAoIHAgPSBzdGFydDsgcCA8IGVuZDsgcCsrICkKLQkgIGlmICggKnAgIT0gJ1xyJyAmJiAqcCAhPSAnXG4nICkKLQkgICAgKnAgPSAnICc7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBUZXN0IHdoZXRoZXIgdGhlIHN0cmluZyBpbiBidWYgaXMgYSBmdW5jdGlvbiBkZWZpbml0aW9uLgotICogVGhlIHN0cmluZyBtYXkgY29udGFpbiBhbmQvb3IgZW5kIHdpdGggYSBuZXdsaW5lLgotICogUmV0dXJuIGFzIGZvbGxvd3M6Ci0gKgkwIC0gZGVmaW5pdGVseSBub3QgYSBmdW5jdGlvbiBkZWZpbml0aW9uOwotICoJMSAtIGRlZmluaXRlbHkgYSBmdW5jdGlvbiBkZWZpbml0aW9uOwotICoJMiAtIGRlZmluaXRlbHkgYSBmdW5jdGlvbiBwcm90b3R5cGUgKE5PVCBVU0VEKTsKLSAqCS0xIC0gbWF5IGJlIHRoZSBiZWdpbm5pbmcgb2YgYSBmdW5jdGlvbiBkZWZpbml0aW9uLAotICoJCWFwcGVuZCBhbm90aGVyIGxpbmUgYW5kIGxvb2sgYWdhaW4uCi0gKiBUaGUgcmVhc29uIHdlIGRvbid0IGF0dGVtcHQgdG8gY29udmVydCBmdW5jdGlvbiBwcm90b3R5cGVzIGlzIHRoYXQKLSAqIEdob3N0c2NyaXB0J3MgZGVjbGFyYXRpb24tZ2VuZXJhdGluZyBtYWNyb3MgbG9vayB0b28gbXVjaCBsaWtlCi0gKiBwcm90b3R5cGVzLCBhbmQgY29uZnVzZSB0aGUgYWxnb3JpdGhtcy4KLSAqLwotaW50Ci10ZXN0MShidWYpCi0gICAgY2hhciAqYnVmOwotewlyZWdpc3RlciBjaGFyICpwID0gYnVmOwotCWNoYXIgKmJlbmQ7Ci0JY2hhciAqZW5kZm47Ci0JaW50IGNvbnRpbjsKLQotCWlmICggIWlzaWRmaXJzdGNoYXIoKnApICkKLQkgIHJldHVybiAwOwkJLyogbm8gbmFtZSBhdCBsZWZ0IG1hcmdpbiAqLwotCWJlbmQgPSBza2lwc3BhY2UoYnVmICsgc3RybGVuKGJ1ZikgLSAxLCAtMSk7Ci0Jc3dpdGNoICggKmJlbmQgKQotCSAgIHsKLQkgICBjYXNlICc7JzogY29udGluID0gMCAvKjIqLzsgYnJlYWs7Ci0JICAgY2FzZSAnKSc6IGNvbnRpbiA9IDE7IGJyZWFrOwotCSAgIGNhc2UgJ3snOiByZXR1cm4gMDsJCS8qIG5vdCBhIGZ1bmN0aW9uICovCi0JICAgY2FzZSAnfSc6IHJldHVybiAwOwkJLyogbm90IGEgZnVuY3Rpb24gKi8KLQkgICBkZWZhdWx0OiBjb250aW4gPSAtMTsKLQkgICB9Ci0Jd2hpbGUgKCBpc2lkY2hhcigqcCkgKQotCSAgcCsrOwotCWVuZGZuID0gcDsKLQlwID0gc2tpcHNwYWNlKHAsIDEpOwotCWlmICggKnArKyAhPSAnKCcgKQotCSAgcmV0dXJuIDA7CQkvKiBub3QgYSBmdW5jdGlvbiAqLwotCXAgPSBza2lwc3BhY2UocCwgMSk7Ci0JaWYgKCAqcCA9PSAnKScgKQotCSAgcmV0dXJuIDA7CQkvKiBubyBwYXJhbWV0ZXJzICovCi0JLyogQ2hlY2sgdGhhdCB0aGUgYXBwYXJlbnQgZnVuY3Rpb24gbmFtZSBpc24ndCBhIGtleXdvcmQuICovCi0JLyogV2Ugb25seSBuZWVkIHRvIGNoZWNrIGZvciBrZXl3b3JkcyB0aGF0IGNvdWxkIGJlIGZvbGxvd2VkICovCi0JLyogYnkgYSBsZWZ0IHBhcmVudGhlc2lzICh3aGljaCwgdW5mb3J0dW5hdGVseSwgaXMgbW9zdCBvZiB0aGVtKS4gKi8KLQkgICB7CXN0YXRpYyBjaGFyICp3b3Jkc1tdID0KLQkJICAgewkiYXNtIiwgImF1dG8iLCAiY2FzZSIsICJjaGFyIiwgImNvbnN0IiwgImRvdWJsZSIsCi0JCQkiZXh0ZXJuIiwgImZsb2F0IiwgImZvciIsICJpZiIsICJpbnQiLCAibG9uZyIsCi0JCQkicmVnaXN0ZXIiLCAicmV0dXJuIiwgInNob3J0IiwgInNpZ25lZCIsICJzaXplb2YiLAotCQkJInN0YXRpYyIsICJzd2l0Y2giLCAidHlwZWRlZiIsICJ1bnNpZ25lZCIsCi0JCQkidm9pZCIsICJ2b2xhdGlsZSIsICJ3aGlsZSIsIDAKLQkJICAgfTsKLQkJY2hhciAqKmtleSA9IHdvcmRzOwotCQljaGFyICprcDsKLQkJaW50IGxlbiA9IGVuZGZuIC0gYnVmOwotCi0JCXdoaWxlICggKGtwID0gKmtleSkgIT0gMCApCi0JCSAgIHsJaWYgKCBzdHJsZW4oa3ApID09IGxlbiAmJiAhc3RybmNtcChrcCwgYnVmLCBsZW4pICkKLQkJCSAgcmV0dXJuIDA7CS8qIG5hbWUgaXMgYSBrZXl3b3JkICovCi0JCQlrZXkrKzsKLQkJICAgfQotCSAgIH0KLQlyZXR1cm4gY29udGluOwotfQotCi0vKiBDb252ZXJ0IGEgcmVjb2duaXplZCBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGhlYWRlciB0byBLJlIgc3ludGF4LiAqLwotaW50Ci1jb252ZXJ0MShidWYsIG91dCwgaGVhZGVyLCBjb252ZXJ0X3ZhcmFyZ3MpCi0gICAgY2hhciAqYnVmOwotICAgIEZJTEUgKm91dDsKLSAgICBpbnQgaGVhZGVyOwkJCS8qIEJvb2xlYW4gKi8KLSAgICBpbnQgY29udmVydF92YXJhcmdzOwkvKiBCb29sZWFuICovCi17CWNoYXIgKmVuZGZuOwotCXJlZ2lzdGVyIGNoYXIgKnA7Ci0JY2hhciAqKmJyZWFrczsKLQl1bnNpZ25lZCBudW1fYnJlYWtzID0gMjsJLyogZm9yIHRlc3RpbmcgKi8KLQljaGFyICoqYnRvcDsKLQljaGFyICoqYnA7Ci0JY2hhciAqKmFwOwotCWNoYXIgKnZhcmFyZyA9IDA7Ci0KLQkvKiBQcmUtQU5TSSBpbXBsZW1lbnRhdGlvbnMgZG9uJ3QgYWdyZWUgb24gd2hldGhlciBzdHJjaHIgKi8KLQkvKiBpcyBjYWxsZWQgc3RyY2hyIG9yIGluZGV4LCBzbyB3ZSBvcGVuLWNvZGUgaXQgaGVyZS4gKi8KLQlmb3IgKCBlbmRmbiA9IGJ1ZjsgKihlbmRmbisrKSAhPSAnKCc7ICkKLQkgIDsKLXRvcDoJcCA9IGVuZGZuOwotCWJyZWFrcyA9IChjaGFyICoqKW1hbGxvYyhzaXplb2YoY2hhciAqKSAqIG51bV9icmVha3MgKiAyKTsKLQlpZiAoIGJyZWFrcyA9PSAwICkKLQkgICB7CS8qIENvdWxkbid0IGFsbG9jYXRlIGJyZWFrIHRhYmxlLCBnaXZlIHVwICovCi0JCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGFsbG9jYXRlIGJyZWFrIHRhYmxlIVxuIik7Ci0JCWZwdXRzKGJ1Ziwgb3V0KTsKLQkJcmV0dXJuIC0xOwotCSAgIH0KLQlidG9wID0gYnJlYWtzICsgbnVtX2JyZWFrcyAqIDIgLSAyOwotCWJwID0gYnJlYWtzOwotCS8qIFBhcnNlIHRoZSBhcmd1bWVudCBsaXN0ICovCi0JZG8KLQkgICB7CWludCBsZXZlbCA9IDA7Ci0JCWNoYXIgKmxwID0gTlVMTDsKLQkJY2hhciAqcnA7Ci0JCWNoYXIgKmVuZCA9IE5VTEw7Ci0KLQkJaWYgKCBicCA+PSBidG9wICkKLQkJICAgewkvKiBGaWxsZWQgdXAgYnJlYWsgdGFibGUuICovCi0JCQkvKiBBbGxvY2F0ZSBhIGJpZ2dlciBvbmUgYW5kIHN0YXJ0IG92ZXIuICovCi0JCQlmcmVlKChjaGFyICopYnJlYWtzKTsKLQkJCW51bV9icmVha3MgPDw9IDE7Ci0JCQlnb3RvIHRvcDsKLQkJICAgfQotCQkqYnArKyA9IHA7Ci0JCS8qIEZpbmQgdGhlIGVuZCBvZiB0aGUgYXJndW1lbnQgKi8KLQkJZm9yICggOyBlbmQgPT0gTlVMTDsgcCsrICkKLQkJICAgewlzd2l0Y2goKnApCi0JCQkgICB7Ci0JCQkgICBjYXNlICcsJzoKLQkJCQlpZiAoICFsZXZlbCApIGVuZCA9IHA7Ci0JCQkJYnJlYWs7Ci0JCQkgICBjYXNlICcoJzoKLQkJCQlpZiAoICFsZXZlbCApIGxwID0gcDsKLQkJCQlsZXZlbCsrOwotCQkJCWJyZWFrOwotCQkJICAgY2FzZSAnKSc6Ci0JCQkJaWYgKCAtLWxldmVsIDwgMCApIGVuZCA9IHA7Ci0JCQkJZWxzZSBycCA9IHA7Ci0JCQkJYnJlYWs7Ci0JCQkgICBjYXNlICcvJzoKLQkJCQlwID0gc2tpcHNwYWNlKHAsIDEpIC0gMTsKLQkJCQlicmVhazsKLQkJCSAgIGRlZmF1bHQ6Ci0JCQkJOwotCQkJICAgfQotCQkgICB9Ci0JCS8qIEVyYXNlIGFueSBlbWJlZGRlZCBwcm90b3R5cGUgcGFyYW1ldGVycy4gKi8KLQkJaWYgKCBscCApCi0JCSAgd3JpdGVibGFua3MobHAgKyAxLCBycCk7Ci0JCXAtLTsJCQkvKiBiYWNrIHVwIG92ZXIgdGVybWluYXRvciAqLwotCQkvKiBGaW5kIHRoZSBuYW1lIGJlaW5nIGRlY2xhcmVkLiAqLwotCQkvKiBUaGlzIGlzIGNvbXBsaWNhdGVkIGJlY2F1c2Ugb2YgcHJvY2VkdXJlIGFuZCAqLwotCQkvKiBhcnJheSBtb2RpZmllcnMuICovCi0JCWZvciAoIDsgOyApCi0JCSAgIHsJcCA9IHNraXBzcGFjZShwIC0gMSwgLTEpOwotCQkJc3dpdGNoICggKnAgKQotCQkJICAgewotCQkJICAgY2FzZSAnXSc6CS8qIHNraXAgYXJyYXkgZGltZW5zaW9uKHMpICovCi0JCQkgICBjYXNlICcpJzoJLyogc2tpcCBwcm9jZWR1cmUgYXJncyBPUiBuYW1lICovCi0JCQkgICB7CWludCBsZXZlbCA9IDE7Ci0JCQkJd2hpbGUgKCBsZXZlbCApCi0JCQkJIHN3aXRjaCAoICotLXAgKQotCQkJCSAgIHsKLQkJCQkgICBjYXNlICddJzogY2FzZSAnKSc6IGxldmVsKys7IGJyZWFrOwotCQkJCSAgIGNhc2UgJ1snOiBjYXNlICcoJzogbGV2ZWwtLTsgYnJlYWs7Ci0JCQkJICAgY2FzZSAnLyc6IHAgPSBza2lwc3BhY2UocCwgLTEpICsgMTsgYnJlYWs7Ci0JCQkJICAgZGVmYXVsdDogOwotCQkJCSAgIH0KLQkJCSAgIH0KLQkJCQlpZiAoICpwID09ICcoJyAmJiAqc2tpcHNwYWNlKHAgKyAxLCAxKSA9PSAnKicgKQotCQkJCSAgIHsJLyogV2UgZm91bmQgdGhlIG5hbWUgYmVpbmcgZGVjbGFyZWQgKi8KLQkJCQkJd2hpbGUgKCAhaXNpZGZpcnN0Y2hhcigqcCkgKQotCQkJCQkgIHAgPSBza2lwc3BhY2UocCwgMSkgKyAxOwotCQkJCQlnb3RvIGZvdW5kOwotCQkJCSAgIH0KLQkJCQlicmVhazsKLQkJCSAgIGRlZmF1bHQ6Ci0JCQkJZ290byBmb3VuZDsKLQkJCSAgIH0KLQkJICAgfQotZm91bmQ6CQlpZiAoICpwID09ICcuJyAmJiBwWy0xXSA9PSAnLicgJiYgcFstMl0gPT0gJy4nICkKLQkJICB7CWlmICggY29udmVydF92YXJhcmdzICkKLQkJCSAgewkqYnArKyA9ICJ2YV9hbGlzdCI7Ci0JCQkJdmFyYXJnID0gcC0yOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsJcCsrOwotCQkJCWlmICggYnAgPT0gYnJlYWtzICsgMSApCS8qIHNvbGUgYXJndW1lbnQgKi8KLQkJCQkgIHdyaXRlYmxhbmtzKGJyZWFrc1swXSwgcCk7Ci0JCQkJZWxzZQotCQkJCSAgd3JpdGVibGFua3MoYnBbLTFdIC0gMSwgcCk7Ci0JCQkJYnAtLTsKLQkJCSAgfQotCQkgICB9Ci0JCWVsc2UKLQkJICAgewl3aGlsZSAoIGlzaWRjaGFyKCpwKSApIHAtLTsKLQkJCSpicCsrID0gcCsxOwotCQkgICB9Ci0JCXAgPSBlbmQ7Ci0JICAgfQotCXdoaWxlICggKnArKyA9PSAnLCcgKTsKLQkqYnAgPSBwOwotCS8qIE1ha2UgYSBzcGVjaWFsIGNoZWNrIGZvciAndm9pZCcgYXJnbGlzdCAqLwotCWlmICggYnAgPT0gYnJlYWtzKzIgKQotCSAgIHsJcCA9IHNraXBzcGFjZShicmVha3NbMF0sIDEpOwotCQlpZiAoICFzdHJuY21wKHAsICJ2b2lkIiwgNCkgKQotCQkgICB7CXAgPSBza2lwc3BhY2UocCs0LCAxKTsKLQkJCWlmICggcCA9PSBicmVha3NbMl0gLSAxICkKLQkJCSAgIHsJYnAgPSBicmVha3M7CS8qIHl1cCwgcHJldGVuZCBhcmdsaXN0IGlzIGVtcHR5ICovCi0JCQkJd3JpdGVibGFua3MoYnJlYWtzWzBdLCBwICsgMSk7Ci0JCQkgICB9Ci0JCSAgIH0KLQkgICB9Ci0JLyogUHV0IG91dCB0aGUgZnVuY3Rpb24gbmFtZSBhbmQgbGVmdCBwYXJlbnRoZXNpcy4gKi8KLQlwID0gYnVmOwotCXdoaWxlICggcCAhPSBlbmRmbiApIHB1dGMoKnAsIG91dCksIHArKzsKLQkvKiBQdXQgb3V0IHRoZSBkZWNsYXJhdGlvbi4gKi8KLQlpZiAoIGhlYWRlciApCi0JICB7CWZwdXRzKCIpOyIsIG91dCk7Ci0JCWZvciAoIHAgPSBicmVha3NbMF07ICpwOyBwKysgKQotCQkgIGlmICggKnAgPT0gJ1xyJyB8fCAqcCA9PSAnXG4nICkKLQkJICAgIHB1dGMoKnAsIG91dCk7Ci0JICB9Ci0JZWxzZQotCSAgewlmb3IgKCBhcCA9IGJyZWFrcysxOyBhcCA8IGJwOyBhcCArPSAyICkKLQkJICB7CXAgPSAqYXA7Ci0JCQl3aGlsZSAoIGlzaWRjaGFyKCpwKSApCi0JCQkgIHB1dGMoKnAsIG91dCksIHArKzsKLQkJCWlmICggYXAgPCBicCAtIDEgKQotCQkJICBmcHV0cygiLCAiLCBvdXQpOwotCQkgIH0KLQkJZnB1dHMoIikgICIsIG91dCk7Ci0JCS8qIFB1dCBvdXQgdGhlIGFyZ3VtZW50IGRlY2xhcmF0aW9ucyAqLwotCQlmb3IgKCBhcCA9IGJyZWFrcysyOyBhcCA8PSBicDsgYXAgKz0gMiApCi0JCSAgKCphcClbLTFdID0gJzsnOwotCQlpZiAoIHZhcmFyZyAhPSAwICkKLQkJICB7CSp2YXJhcmcgPSAwOwotCQkJZnB1dHMoYnJlYWtzWzBdLCBvdXQpOwkJLyogYW55IHByaW9yIGFyZ3MgKi8KLQkJCWZwdXRzKCJ2YV9kY2wiLCBvdXQpOwkJLyogdGhlIGZpbmFsIGFyZyAqLwotCQkJZnB1dHMoYnBbMF0sIG91dCk7Ci0JCSAgfQotCQllbHNlCi0JCSAgZnB1dHMoYnJlYWtzWzBdLCBvdXQpOwotCSAgfQotCWZyZWUoKGNoYXIgKilicmVha3MpOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvY2RlcnJvci5oIGIvY2RlcnJvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDQzNWUxLi4wMDAwMDAwCi0tLSBhL2NkZXJyb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogY2RlcnJvci5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZXJyb3IgYW5kIG1lc3NhZ2UgY29kZXMgZm9yIHRoZSBjanBlZy9kanBlZwotICogYXBwbGljYXRpb25zLiAgVGhlc2Ugc3RyaW5ncyBhcmUgbm90IG5lZWRlZCBhcyBwYXJ0IG9mIHRoZSBKUEVHIGxpYnJhcnkKLSAqIHByb3Blci4KLSAqIEVkaXQgdGhpcyBmaWxlIHRvIGFkZCBuZXcgY29kZXMsIG9yIHRvIHRyYW5zbGF0ZSB0aGUgbWVzc2FnZSBzdHJpbmdzIHRvCi0gKiBzb21lIG90aGVyIGxhbmd1YWdlLgotICovCi0KLS8qCi0gKiBUbyBkZWZpbmUgdGhlIGVudW0gbGlzdCBvZiBtZXNzYWdlIGNvZGVzLCBpbmNsdWRlIHRoaXMgZmlsZSB3aXRob3V0Ci0gKiBkZWZpbmluZyBtYWNybyBKTUVTU0FHRS4gIFRvIGNyZWF0ZSBhIG1lc3NhZ2Ugc3RyaW5nIHRhYmxlLCBpbmNsdWRlIGl0Ci0gKiBhZ2FpbiB3aXRoIGEgc3VpdGFibGUgSk1FU1NBR0UgZGVmaW5pdGlvbiAoc2VlIGplcnJvci5jIGZvciBhbiBleGFtcGxlKS4KLSAqLwotI2lmbmRlZiBKTUVTU0FHRQotI2lmbmRlZiBDREVSUk9SX0gKLSNkZWZpbmUgQ0RFUlJPUl9ICi0vKiBGaXJzdCB0aW1lIHRocm91Z2gsIGRlZmluZSB0aGUgZW51bSBsaXN0ICovCi0jZGVmaW5lIEpNQUtFX0VOVU1fTElTVAotI2Vsc2UKLS8qIFJlcGVhdGVkIGluY2x1c2lvbnMgb2YgdGhpcyBmaWxlIGFyZSBuby1vcHMgdW5sZXNzIEpNRVNTQUdFIGlzIGRlZmluZWQgKi8KLSNkZWZpbmUgSk1FU1NBR0UoY29kZSxzdHJpbmcpCi0jZW5kaWYgLyogQ0RFUlJPUl9IICovCi0jZW5kaWYgLyogSk1FU1NBR0UgKi8KLQotI2lmZGVmIEpNQUtFX0VOVU1fTElTVAotCi10eXBlZGVmIGVudW0gewotCi0jZGVmaW5lIEpNRVNTQUdFKGNvZGUsc3RyaW5nKQljb2RlICwKLQotI2VuZGlmIC8qIEpNQUtFX0VOVU1fTElTVCAqLwotCi1KTUVTU0FHRShKTVNHX0ZJUlNUQURET05DT0RFPTEwMDAsIE5VTEwpIC8qIE11c3QgYmUgZmlyc3QgZW50cnkhICovCi0KLSNpZmRlZiBCTVBfU1VQUE9SVEVECi1KTUVTU0FHRShKRVJSX0JNUF9CQURDTUFQLCAiVW5zdXBwb3J0ZWQgQk1QIGNvbG9ybWFwIGZvcm1hdCIpCi1KTUVTU0FHRShKRVJSX0JNUF9CQURERVBUSCwgIk9ubHkgOC0gYW5kIDI0LWJpdCBCTVAgZmlsZXMgYXJlIHN1cHBvcnRlZCIpCi1KTUVTU0FHRShKRVJSX0JNUF9CQURIRUFERVIsICJJbnZhbGlkIEJNUCBmaWxlOiBiYWQgaGVhZGVyIGxlbmd0aCIpCi1KTUVTU0FHRShKRVJSX0JNUF9CQURQTEFORVMsICJJbnZhbGlkIEJNUCBmaWxlOiBiaVBsYW5lcyBub3QgZXF1YWwgdG8gMSIpCi1KTUVTU0FHRShKRVJSX0JNUF9DT0xPUlNQQUNFLCAiQk1QIG91dHB1dCBtdXN0IGJlIGdyYXlzY2FsZSBvciBSR0IiKQotSk1FU1NBR0UoSkVSUl9CTVBfQ09NUFJFU1NFRCwgIlNvcnJ5LCBjb21wcmVzc2VkIEJNUHMgbm90IHlldCBzdXBwb3J0ZWQiKQotSk1FU1NBR0UoSkVSUl9CTVBfTk9ULCAiTm90IGEgQk1QIGZpbGUgLSBkb2VzIG5vdCBzdGFydCB3aXRoIEJNIikKLUpNRVNTQUdFKEpUUkNfQk1QLCAiJXV4JXUgMjQtYml0IEJNUCBpbWFnZSIpCi1KTUVTU0FHRShKVFJDX0JNUF9NQVBQRUQsICIldXgldSA4LWJpdCBjb2xvcm1hcHBlZCBCTVAgaW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19CTVBfT1MyLCAiJXV4JXUgMjQtYml0IE9TMiBCTVAgaW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19CTVBfT1MyX01BUFBFRCwgIiV1eCV1IDgtYml0IGNvbG9ybWFwcGVkIE9TMiBCTVAgaW1hZ2UiKQotI2VuZGlmIC8qIEJNUF9TVVBQT1JURUQgKi8KLQotI2lmZGVmIEdJRl9TVVBQT1JURUQKLUpNRVNTQUdFKEpFUlJfR0lGX0JVRywgIkdJRiBvdXRwdXQgZ290IGNvbmZ1c2VkIikKLUpNRVNTQUdFKEpFUlJfR0lGX0NPREVTSVpFLCAiQm9ndXMgR0lGIGNvZGVzaXplICVkIikKLUpNRVNTQUdFKEpFUlJfR0lGX0NPTE9SU1BBQ0UsICJHSUYgb3V0cHV0IG11c3QgYmUgZ3JheXNjYWxlIG9yIFJHQiIpCi1KTUVTU0FHRShKRVJSX0dJRl9JTUFHRU5PVEZPVU5ELCAiVG9vIGZldyBpbWFnZXMgaW4gR0lGIGZpbGUiKQotSk1FU1NBR0UoSkVSUl9HSUZfTk9ULCAiTm90IGEgR0lGIGZpbGUiKQotSk1FU1NBR0UoSlRSQ19HSUYsICIldXgldXglZCBHSUYgaW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19HSUZfQkFEVkVSU0lPTiwKLQkgIldhcm5pbmc6IHVuZXhwZWN0ZWQgR0lGIHZlcnNpb24gbnVtYmVyICclYyVjJWMnIikKLUpNRVNTQUdFKEpUUkNfR0lGX0VYVEVOU0lPTiwgIklnbm9yaW5nIEdJRiBleHRlbnNpb24gYmxvY2sgb2YgdHlwZSAweCUwMngiKQotSk1FU1NBR0UoSlRSQ19HSUZfTk9OU1FVQVJFLCAiQ2F1dGlvbjogbm9uc3F1YXJlIHBpeGVscyBpbiBpbnB1dCIpCi1KTUVTU0FHRShKV1JOX0dJRl9CQUREQVRBLCAiQ29ycnVwdCBkYXRhIGluIEdJRiBmaWxlIikKLUpNRVNTQUdFKEpXUk5fR0lGX0NIQVIsICJCb2d1cyBjaGFyIDB4JTAyeCBpbiBHSUYgZmlsZSwgaWdub3JpbmciKQotSk1FU1NBR0UoSldSTl9HSUZfRU5EQ09ERSwgIlByZW1hdHVyZSBlbmQgb2YgR0lGIGltYWdlIikKLUpNRVNTQUdFKEpXUk5fR0lGX05PTU9SRURBVEEsICJSYW4gb3V0IG9mIEdJRiBiaXRzIikKLSNlbmRpZiAvKiBHSUZfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBQUE1fU1VQUE9SVEVECi1KTUVTU0FHRShKRVJSX1BQTV9DT0xPUlNQQUNFLCAiUFBNIG91dHB1dCBtdXN0IGJlIGdyYXlzY2FsZSBvciBSR0IiKQotSk1FU1NBR0UoSkVSUl9QUE1fTk9OTlVNRVJJQywgIk5vbm51bWVyaWMgZGF0YSBpbiBQUE0gZmlsZSIpCi1KTUVTU0FHRShKRVJSX1BQTV9OT1QsICJOb3QgYSBQUE0vUEdNIGZpbGUiKQotSk1FU1NBR0UoSlRSQ19QR00sICIldXgldSBQR00gaW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19QR01fVEVYVCwgIiV1eCV1IHRleHQgUEdNIGltYWdlIikKLUpNRVNTQUdFKEpUUkNfUFBNLCAiJXV4JXUgUFBNIGltYWdlIikKLUpNRVNTQUdFKEpUUkNfUFBNX1RFWFQsICIldXgldSB0ZXh0IFBQTSBpbWFnZSIpCi0jZW5kaWYgLyogUFBNX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUkxFX1NVUFBPUlRFRAotSk1FU1NBR0UoSkVSUl9STEVfQkFERVJST1IsICJCb2d1cyBlcnJvciBjb2RlIGZyb20gUkxFIGxpYnJhcnkiKQotSk1FU1NBR0UoSkVSUl9STEVfQ09MT1JTUEFDRSwgIlJMRSBvdXRwdXQgbXVzdCBiZSBncmF5c2NhbGUgb3IgUkdCIikKLUpNRVNTQUdFKEpFUlJfUkxFX0RJTUVOU0lPTlMsICJJbWFnZSBkaW1lbnNpb25zICgldXgldSkgdG9vIGxhcmdlIGZvciBSTEUiKQotSk1FU1NBR0UoSkVSUl9STEVfRU1QVFksICJFbXB0eSBSTEUgZmlsZSIpCi1KTUVTU0FHRShKRVJSX1JMRV9FT0YsICJQcmVtYXR1cmUgRU9GIGluIFJMRSBoZWFkZXIiKQotSk1FU1NBR0UoSkVSUl9STEVfTUVNLCAiSW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgUkxFIGhlYWRlciIpCi1KTUVTU0FHRShKRVJSX1JMRV9OT1QsICJOb3QgYW4gUkxFIGZpbGUiKQotSk1FU1NBR0UoSkVSUl9STEVfVE9PTUFOWUNIQU5ORUxTLCAiQ2Fubm90IGhhbmRsZSAlZCBvdXRwdXQgY2hhbm5lbHMgZm9yIFJMRSIpCi1KTUVTU0FHRShKRVJSX1JMRV9VTlNVUFBPUlRFRCwgIkNhbm5vdCBoYW5kbGUgdGhpcyBSTEUgc2V0dXAiKQotSk1FU1NBR0UoSlRSQ19STEUsICIldXgldSBmdWxsLWNvbG9yIFJMRSBmaWxlIikKLUpNRVNTQUdFKEpUUkNfUkxFX0ZVTExNQVAsICIldXgldSBmdWxsLWNvbG9yIFJMRSBmaWxlIHdpdGggbWFwIG9mIGxlbmd0aCAlZCIpCi1KTUVTU0FHRShKVFJDX1JMRV9HUkFZLCAiJXV4JXUgZ3JheXNjYWxlIFJMRSBmaWxlIikKLUpNRVNTQUdFKEpUUkNfUkxFX01BUEdSQVksICIldXgldSBncmF5c2NhbGUgUkxFIGZpbGUgd2l0aCBtYXAgb2YgbGVuZ3RoICVkIikKLUpNRVNTQUdFKEpUUkNfUkxFX01BUFBFRCwgIiV1eCV1IGNvbG9ybWFwcGVkIFJMRSBmaWxlIHdpdGggbWFwIG9mIGxlbmd0aCAlZCIpCi0jZW5kaWYgLyogUkxFX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgVEFSR0FfU1VQUE9SVEVECi1KTUVTU0FHRShKRVJSX1RHQV9CQURDTUFQLCAiVW5zdXBwb3J0ZWQgVGFyZ2EgY29sb3JtYXAgZm9ybWF0IikKLUpNRVNTQUdFKEpFUlJfVEdBX0JBRFBBUk1TLCAiSW52YWxpZCBvciB1bnN1cHBvcnRlZCBUYXJnYSBmaWxlIikKLUpNRVNTQUdFKEpFUlJfVEdBX0NPTE9SU1BBQ0UsICJUYXJnYSBvdXRwdXQgbXVzdCBiZSBncmF5c2NhbGUgb3IgUkdCIikKLUpNRVNTQUdFKEpUUkNfVEdBLCAiJXV4JXUgUkdCIFRhcmdhIGltYWdlIikKLUpNRVNTQUdFKEpUUkNfVEdBX0dSQVksICIldXgldSBncmF5c2NhbGUgVGFyZ2EgaW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19UR0FfTUFQUEVELCAiJXV4JXUgY29sb3JtYXBwZWQgVGFyZ2EgaW1hZ2UiKQotI2Vsc2UKLUpNRVNTQUdFKEpFUlJfVEdBX05PVENPTVAsICJUYXJnYSBzdXBwb3J0IHdhcyBub3QgY29tcGlsZWQiKQotI2VuZGlmIC8qIFRBUkdBX1NVUFBPUlRFRCAqLwotCi1KTUVTU0FHRShKRVJSX0JBRF9DTUFQX0ZJTEUsCi0JICJDb2xvciBtYXAgZmlsZSBpcyBpbnZhbGlkIG9yIG9mIHVuc3VwcG9ydGVkIGZvcm1hdCIpCi1KTUVTU0FHRShKRVJSX1RPT19NQU5ZX0NPTE9SUywKLQkgIk91dHB1dCBmaWxlIGZvcm1hdCBjYW5ub3QgaGFuZGxlICVkIGNvbG9ybWFwIGVudHJpZXMiKQotSk1FU1NBR0UoSkVSUl9VTkdFVENfRkFJTEVELCAidW5nZXRjIGZhaWxlZCIpCi0jaWZkZWYgVEFSR0FfU1VQUE9SVEVECi1KTUVTU0FHRShKRVJSX1VOS05PV05fRk9STUFULAotCSAiVW5yZWNvZ25pemVkIGlucHV0IGZpbGUgZm9ybWF0IC0tLSBwZXJoYXBzIHlvdSBuZWVkIC10YXJnYSIpCi0jZWxzZQotSk1FU1NBR0UoSkVSUl9VTktOT1dOX0ZPUk1BVCwgIlVucmVjb2duaXplZCBpbnB1dCBmaWxlIGZvcm1hdCIpCi0jZW5kaWYKLUpNRVNTQUdFKEpFUlJfVU5TVVBQT1JURURfRk9STUFULCAiVW5zdXBwb3J0ZWQgb3V0cHV0IGZpbGUgZm9ybWF0IikKLQotI2lmZGVmIEpNQUtFX0VOVU1fTElTVAotCi0gIEpNU0dfTEFTVEFERE9OQ09ERQotfSBBRERPTl9NRVNTQUdFX0NPREU7Ci0KLSN1bmRlZiBKTUFLRV9FTlVNX0xJU1QKLSNlbmRpZiAvKiBKTUFLRV9FTlVNX0xJU1QgKi8KLQotLyogWmFwIEpNRVNTQUdFIG1hY3JvIHNvIHRoYXQgZnV0dXJlIHJlLWluY2x1c2lvbnMgZG8gbm90aGluZyBieSBkZWZhdWx0ICovCi0jdW5kZWYgSk1FU1NBR0UKZGlmZiAtLWdpdCBhL2NkanBlZy5jIGIvY2RqcGVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MjUwZmYuLjAwMDAwMDAKLS0tIGEvY2RqcGVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoKLSAqIGNkanBlZy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgY29tbW9uIHN1cHBvcnQgcm91dGluZXMgdXNlZCBieSB0aGUgSUpHIGFwcGxpY2F0aW9uCi0gKiBwcm9ncmFtcyAoY2pwZWcsIGRqcGVnLCBqcGVndHJhbikuCi0gKi8KLQotI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KLSNpbmNsdWRlIDxjdHlwZS5oPgkJLyogdG8gZGVjbGFyZSBpc3VwcGVyKCksIHRvbG93ZXIoKSAqLwotI2lmZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKLSNpbmNsdWRlIDxzaWduYWwuaD4JCS8qIHRvIGRlY2xhcmUgc2lnbmFsKCkgKi8KLSNlbmRpZgotI2lmZGVmIFVTRV9TRVRNT0RFCi0jaW5jbHVkZSA8ZmNudGwuaD4JCS8qIHRvIGRlY2xhcmUgc2V0bW9kZSgpJ3MgcGFyYW1ldGVyIG1hY3JvcyAqLwotLyogSWYgeW91IGhhdmUgc2V0bW9kZSgpIGJ1dCBub3QgPGlvLmg+LCBqdXN0IGRlbGV0ZSB0aGlzIGxpbmU6ICovCi0jaW5jbHVkZSA8aW8uaD4JCQkvKiB0byBkZWNsYXJlIHNldG1vZGUoKSAqLwotI2VuZGlmCi0KLQotLyoKLSAqIFNpZ25hbCBjYXRjaGVyIHRvIGVuc3VyZSB0aGF0IHRlbXBvcmFyeSBmaWxlcyBhcmUgcmVtb3ZlZCBiZWZvcmUgYWJvcnRpbmcuCi0gKiBOQjogZm9yIEFtaWdhIE1hbnggQyB0aGlzIGlzIGFjdHVhbGx5IGEgZ2xvYmFsIHJvdXRpbmUgbmFtZWQgX2Fib3J0KCk7Ci0gKiB3ZSBwdXQgIiNkZWZpbmUgc2lnbmFsX2NhdGNoZXIgX2Fib3J0IiBpbiBqY29uZmlnLmguICBUYWxrIGFib3V0IGJvZ3VzLi4uCi0gKi8KLQotI2lmZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKLQotc3RhdGljIGpfY29tbW9uX3B0ciBzaWdfY2luZm87Ci0KLXZvaWQJCQkJLyogbXVzdCBiZSBnbG9iYWwgZm9yIE1hbnggQyAqLwotc2lnbmFsX2NhdGNoZXIgKGludCBzaWdudW0pCi17Ci0gIGlmIChzaWdfY2luZm8gIT0gTlVMTCkgewotICAgIGlmIChzaWdfY2luZm8tPmVyciAhPSBOVUxMKSAvKiB0dXJuIG9mZiB0cmFjZSBvdXRwdXQgKi8KLSAgICAgIHNpZ19jaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA9IDA7Ci0gICAganBlZ19kZXN0cm95KHNpZ19jaW5mbyk7CS8qIGNsZWFuIHVwIG1lbW9yeSBhbGxvY2F0aW9uICYgdGVtcCBmaWxlcyAqLwotICB9Ci0gIGV4aXQoRVhJVF9GQUlMVVJFKTsKLX0KLQotCi1HTE9CQUwodm9pZCkKLWVuYWJsZV9zaWduYWxfY2F0Y2hlciAoal9jb21tb25fcHRyIGNpbmZvKQotewotICBzaWdfY2luZm8gPSBjaW5mbzsKLSNpZmRlZiBTSUdJTlQJCQkvKiBub3QgYWxsIHN5c3RlbXMgaGF2ZSBTSUdJTlQgKi8KLSAgc2lnbmFsKFNJR0lOVCwgc2lnbmFsX2NhdGNoZXIpOwotI2VuZGlmCi0jaWZkZWYgU0lHVEVSTQkJCS8qIG5vdCBhbGwgc3lzdGVtcyBoYXZlIFNJR1RFUk0gKi8KLSAgc2lnbmFsKFNJR1RFUk0sIHNpZ25hbF9jYXRjaGVyKTsKLSNlbmRpZgotfQotCi0jZW5kaWYKLQotCi0vKgotICogT3B0aW9uYWwgcHJvZ3Jlc3MgbW9uaXRvcjogZGlzcGxheSBhIHBlcmNlbnQtZG9uZSBmaWd1cmUgb24gc3RkZXJyLgotICovCi0KLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLQotTUVUSE9EREVGKHZvaWQpCi1wcm9ncmVzc19tb25pdG9yIChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIGNkX3Byb2dyZXNzX3B0ciBwcm9nID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOwotICBpbnQgdG90YWxfcGFzc2VzID0gcHJvZy0+cHViLnRvdGFsX3Bhc3NlcyArIHByb2ctPnRvdGFsX2V4dHJhX3Bhc3NlczsKLSAgaW50IHBlcmNlbnRfZG9uZSA9IChpbnQpIChwcm9nLT5wdWIucGFzc19jb3VudGVyKjEwMEwvcHJvZy0+cHViLnBhc3NfbGltaXQpOwotCi0gIGlmIChwZXJjZW50X2RvbmUgIT0gcHJvZy0+cGVyY2VudF9kb25lKSB7Ci0gICAgcHJvZy0+cGVyY2VudF9kb25lID0gcGVyY2VudF9kb25lOwotICAgIGlmICh0b3RhbF9wYXNzZXMgPiAxKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlxyUGFzcyAlZC8lZDogJTNkJSUgIiwKLQkgICAgICBwcm9nLT5wdWIuY29tcGxldGVkX3Bhc3NlcyArIHByb2ctPmNvbXBsZXRlZF9leHRyYV9wYXNzZXMgKyAxLAotCSAgICAgIHRvdGFsX3Bhc3NlcywgcGVyY2VudF9kb25lKTsKLSAgICB9IGVsc2UgewotICAgICAgZnByaW50ZihzdGRlcnIsICJcciAlM2QlJSAiLCBwZXJjZW50X2RvbmUpOwotICAgIH0KLSAgICBmZmx1c2goc3RkZXJyKTsKLSAgfQotfQotCi0KLUdMT0JBTCh2b2lkKQotc3RhcnRfcHJvZ3Jlc3NfbW9uaXRvciAoal9jb21tb25fcHRyIGNpbmZvLCBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MpCi17Ci0gIC8qIEVuYWJsZSBwcm9ncmVzcyBkaXNwbGF5LCB1bmxlc3MgdHJhY2Ugb3V0cHV0IGlzIG9uICovCi0gIGlmIChjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA9PSAwKSB7Ci0gICAgcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yID0gcHJvZ3Jlc3NfbW9uaXRvcjsKLSAgICBwcm9ncmVzcy0+Y29tcGxldGVkX2V4dHJhX3Bhc3NlcyA9IDA7Ci0gICAgcHJvZ3Jlc3MtPnRvdGFsX2V4dHJhX3Bhc3NlcyA9IDA7Ci0gICAgcHJvZ3Jlc3MtPnBlcmNlbnRfZG9uZSA9IC0xOwotICAgIGNpbmZvLT5wcm9ncmVzcyA9ICZwcm9ncmVzcy0+cHViOwotICB9Ci19Ci0KLQotR0xPQkFMKHZvaWQpCi1lbmRfcHJvZ3Jlc3NfbW9uaXRvciAoal9jb21tb25fcHRyIGNpbmZvKQotewotICAvKiBDbGVhciBhd2F5IHByb2dyZXNzIGRpc3BsYXkgKi8KLSAgaWYgKGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID09IDApIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlxyICAgICAgICAgICAgICAgIFxyIik7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0gIH0KLX0KLQotI2VuZGlmCi0KLQotLyoKLSAqIENhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcgb2YgcG9zc2libHktYWJicmV2aWF0ZWQga2V5d29yZCBzd2l0Y2hlcy4KLSAqIGtleXdvcmQgaXMgdGhlIGNvbnN0YW50IGtleXdvcmQgKG11c3QgYmUgbG93ZXIgY2FzZSBhbHJlYWR5KSwKLSAqIG1pbmNoYXJzIGlzIGxlbmd0aCBvZiBtaW5pbXVtIGxlZ2FsIGFiYnJldmlhdGlvbi4KLSAqLwotCi1HTE9CQUwoYm9vbGVhbikKLWtleW1hdGNoIChjaGFyICogYXJnLCBjb25zdCBjaGFyICoga2V5d29yZCwgaW50IG1pbmNoYXJzKQotewotICByZWdpc3RlciBpbnQgY2EsIGNrOwotICByZWdpc3RlciBpbnQgbm1hdGNoZWQgPSAwOwotCi0gIHdoaWxlICgoY2EgPSAqYXJnKyspICE9ICdcMCcpIHsKLSAgICBpZiAoKGNrID0gKmtleXdvcmQrKykgPT0gJ1wwJykKLSAgICAgIHJldHVybiBGQUxTRTsJCS8qIGFyZyBsb25nZXIgdGhhbiBrZXl3b3JkLCBubyBnb29kICovCi0gICAgaWYgKGlzdXBwZXIoY2EpKQkJLyogZm9yY2UgYXJnIHRvIGxjYXNlIChhc3N1bWUgY2sgaXMgYWxyZWFkeSkgKi8KLSAgICAgIGNhID0gdG9sb3dlcihjYSk7Ci0gICAgaWYgKGNhICE9IGNrKQotICAgICAgcmV0dXJuIEZBTFNFOwkJLyogbm8gZ29vZCAqLwotICAgIG5tYXRjaGVkKys7CQkJLyogY291bnQgbWF0Y2hlZCBjaGFyYWN0ZXJzICovCi0gIH0KLSAgLyogcmVhY2hlZCBlbmQgb2YgYXJndW1lbnQ7IGZhaWwgaWYgaXQncyB0b28gc2hvcnQgZm9yIHVuaXF1ZSBhYmJyZXYgKi8KLSAgaWYgKG5tYXRjaGVkIDwgbWluY2hhcnMpCi0gICAgcmV0dXJuIEZBTFNFOwotICByZXR1cm4gVFJVRTsJCQkvKiBBLU9LICovCi19Ci0KLQotLyoKLSAqIFJvdXRpbmVzIHRvIGVzdGFibGlzaCBiaW5hcnkgSS9PIG1vZGUgZm9yIHN0ZGluIGFuZCBzdGRvdXQuCi0gKiBOb24tVW5peCBzeXN0ZW1zIG9mdGVuIHJlcXVpcmUgc29tZSBoYWNraW5nIHRvIGdldCBvdXQgb2YgdGV4dCBtb2RlLgotICovCi0KLUdMT0JBTChGSUxFICopCi1yZWFkX3N0ZGluICh2b2lkKQotewotICBGSUxFICogaW5wdXRfZmlsZSA9IHN0ZGluOwotCi0jaWZkZWYgVVNFX1NFVE1PREUJCS8qIG5lZWQgdG8gaGFjayBmaWxlIG1vZGU/ICovCi0gIHNldG1vZGUoZmlsZW5vKHN0ZGluKSwgT19CSU5BUlkpOwotI2VuZGlmCi0jaWZkZWYgVVNFX0ZET1BFTgkJLyogbmVlZCB0byByZS1vcGVuIGluIGJpbmFyeSBtb2RlPyAqLwotICBpZiAoKGlucHV0X2ZpbGUgPSBmZG9wZW4oZmlsZW5vKHN0ZGluKSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3QgcmVvcGVuIHN0ZGluXG4iKTsKLSAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gIH0KLSNlbmRpZgotICByZXR1cm4gaW5wdXRfZmlsZTsKLX0KLQotCi1HTE9CQUwoRklMRSAqKQotd3JpdGVfc3Rkb3V0ICh2b2lkKQotewotICBGSUxFICogb3V0cHV0X2ZpbGUgPSBzdGRvdXQ7Ci0KLSNpZmRlZiBVU0VfU0VUTU9ERQkJLyogbmVlZCB0byBoYWNrIGZpbGUgbW9kZT8gKi8KLSAgc2V0bW9kZShmaWxlbm8oc3Rkb3V0KSwgT19CSU5BUlkpOwotI2VuZGlmCi0jaWZkZWYgVVNFX0ZET1BFTgkJLyogbmVlZCB0byByZS1vcGVuIGluIGJpbmFyeSBtb2RlPyAqLwotICBpZiAoKG91dHB1dF9maWxlID0gZmRvcGVuKGZpbGVubyhzdGRvdXQpLCBXUklURV9CSU5BUlkpKSA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3QgcmVvcGVuIHN0ZG91dFxuIik7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICB9Ci0jZW5kaWYKLSAgcmV0dXJuIG91dHB1dF9maWxlOwotfQpkaWZmIC0tZ2l0IGEvY2RqcGVnLmggYi9jZGpwZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzODdiNi4uMDAwMDAwMAotLS0gYS9jZGpwZWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKgotICogY2RqcGVnLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBjb21tb24gZGVjbGFyYXRpb25zIGZvciB0aGUgc2FtcGxlIGFwcGxpY2F0aW9ucwotICogY2pwZWcgYW5kIGRqcGVnLiAgSXQgaXMgTk9UIHVzZWQgYnkgdGhlIGNvcmUgSlBFRyBsaWJyYXJ5LgotICovCi0KLSNkZWZpbmUgSlBFR19DSlBFR19ESlBFRwkvKiBkZWZpbmUgcHJvcGVyIG9wdGlvbnMgaW4gamNvbmZpZy5oICovCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxfT1BUSU9OUwkvKiBjanBlZy5jLGRqcGVnLmMgbmVlZCB0byBzZWUgeHh4X1NVUFBPUlRFRCAqLwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImplcnJvci5oIgkJLyogZ2V0IGxpYnJhcnkgZXJyb3IgY29kZXMgdG9vICovCi0jaW5jbHVkZSAiY2RlcnJvci5oIgkJLyogZ2V0IGFwcGxpY2F0aW9uLXNwZWNpZmljIGVycm9yIGNvZGVzICovCi0KLQotLyoKLSAqIE9iamVjdCBpbnRlcmZhY2UgZm9yIGNqcGVnJ3Mgc291cmNlIGZpbGUgZGVjb2RpbmcgbW9kdWxlcwotICovCi0KLXR5cGVkZWYgc3RydWN0IGNqcGVnX3NvdXJjZV9zdHJ1Y3QgKiBjanBlZ19zb3VyY2VfcHRyOwotCi1zdHJ1Y3QgY2pwZWdfc291cmNlX3N0cnVjdCB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfaW5wdXQsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgICAgIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pKTsKLSAgSk1FVEhPRChKRElNRU5TSU9OLCBnZXRfcGl4ZWxfcm93cywgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSAgICAgICBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgZmluaXNoX2lucHV0LCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkgICAgICAgY2pwZWdfc291cmNlX3B0ciBzaW5mbykpOwotCi0gIEZJTEUgKmlucHV0X2ZpbGU7Ci0KLSAgSlNBTVBBUlJBWSBidWZmZXI7Ci0gIEpESU1FTlNJT04gYnVmZmVyX2hlaWdodDsKLX07Ci0KLQotLyoKLSAqIE9iamVjdCBpbnRlcmZhY2UgZm9yIGRqcGVnJ3Mgb3V0cHV0IGZpbGUgZW5jb2RpbmcgbW9kdWxlcwotICovCi0KLXR5cGVkZWYgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0ICogZGpwZWdfZGVzdF9wdHI7Ci0KLXN0cnVjdCBkanBlZ19kZXN0X3N0cnVjdCB7Ci0gIC8qIHN0YXJ0X291dHB1dCBpcyBjYWxsZWQgYWZ0ZXIganBlZ19zdGFydF9kZWNvbXByZXNzIGZpbmlzaGVzLgotICAgKiBUaGUgY29sb3IgbWFwIHdpbGwgYmUgcmVhZHkgYXQgdGhpcyB0aW1lLCBpZiBvbmUgaXMgbmVlZGVkLgotICAgKi8KLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9vdXRwdXQsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJICAgICAgIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKSk7Ci0gIC8qIEVtaXQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcGl4ZWwgcm93cyBmcm9tIHRoZSBidWZmZXIuICovCi0gIEpNRVRIT0Qodm9pZCwgcHV0X3BpeGVsX3Jvd3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSBkanBlZ19kZXN0X3B0ciBkaW5mbywKLQkJCQkgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKSk7Ci0gIC8qIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBpbWFnZS4gKi8KLSAgSk1FVEhPRCh2b2lkLCBmaW5pc2hfb3V0cHV0LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQlkanBlZ19kZXN0X3B0ciBkaW5mbykpOwotCi0gIC8qIFRhcmdldCBmaWxlIHNwZWM7IGZpbGxlZCBpbiBieSBkanBlZy5jIGFmdGVyIG9iamVjdCBpcyBjcmVhdGVkLiAqLwotICBGSUxFICogb3V0cHV0X2ZpbGU7Ci0KLSAgLyogT3V0cHV0IHBpeGVsLXJvdyBidWZmZXIuICBDcmVhdGVkIGJ5IG1vZHVsZSBpbml0IG9yIHN0YXJ0X291dHB1dC4KLSAgICogV2lkdGggaXMgY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50czsKLSAgICogaGVpZ2h0IGlzIGJ1ZmZlcl9oZWlnaHQuCi0gICAqLwotICBKU0FNUEFSUkFZIGJ1ZmZlcjsKLSAgSkRJTUVOU0lPTiBidWZmZXJfaGVpZ2h0OwotfTsKLQotCi0vKgotICogY2pwZWcvZGpwZWcgbWF5IG5lZWQgdG8gcGVyZm9ybSBleHRyYSBwYXNzZXMgdG8gY29udmVydCB0byBvciBmcm9tCi0gKiB0aGUgc291cmNlL2Rlc3RpbmF0aW9uIGZpbGUgZm9ybWF0LiAgVGhlIEpQRUcgbGlicmFyeSBkb2VzIG5vdCBrbm93Ci0gKiBhYm91dCB0aGVzZSBwYXNzZXMsIGJ1dCB3ZSdkIGxpa2UgdGhlbSB0byBiZSBjb3VudGVkIGJ5IHRoZSBwcm9ncmVzcwotICogbW9uaXRvci4gIFdlIHVzZSBhbiBleHBhbmRlZCBwcm9ncmVzcyBtb25pdG9yIG9iamVjdCB0byBob2xkIHRoZQotICogYWRkaXRpb25hbCBwYXNzIGNvdW50LgotICovCi0KLXN0cnVjdCBjZGpwZWdfcHJvZ3Jlc3NfbWdyIHsKLSAgc3RydWN0IGpwZWdfcHJvZ3Jlc3NfbWdyIHB1YjsJLyogZmllbGRzIGtub3duIHRvIEpQRUcgbGlicmFyeSAqLwotICBpbnQgY29tcGxldGVkX2V4dHJhX3Bhc3NlczsJLyogZXh0cmEgcGFzc2VzIGNvbXBsZXRlZCAqLwotICBpbnQgdG90YWxfZXh0cmFfcGFzc2VzOwkvKiB0b3RhbCBleHRyYSAqLwotICAvKiBsYXN0IHByaW50ZWQgcGVyY2VudGFnZSBzdG9yZWQgaGVyZSB0byBhdm9pZCBtdWx0aXBsZSBwcmludG91dHMgKi8KLSAgaW50IHBlcmNlbnRfZG9uZTsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IGNkanBlZ19wcm9ncmVzc19tZ3IgKiBjZF9wcm9ncmVzc19wdHI7Ci0KLQotLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCi0KLSNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jZGVmaW5lIGppbml0X3JlYWRfYm1wCQlqSVJkQk1QCi0jZGVmaW5lIGppbml0X3dyaXRlX2JtcAkJaklXckJNUAotI2RlZmluZSBqaW5pdF9yZWFkX2dpZgkJaklSZEdJRgotI2RlZmluZSBqaW5pdF93cml0ZV9naWYJCWpJV3JHSUYKLSNkZWZpbmUgamluaXRfcmVhZF9wcG0JCWpJUmRQUE0KLSNkZWZpbmUgamluaXRfd3JpdGVfcHBtCQlqSVdyUFBNCi0jZGVmaW5lIGppbml0X3JlYWRfcmxlCQlqSVJkUkxFCi0jZGVmaW5lIGppbml0X3dyaXRlX3JsZQkJaklXclJMRQotI2RlZmluZSBqaW5pdF9yZWFkX3RhcmdhCWpJUmRUYXJnYQotI2RlZmluZSBqaW5pdF93cml0ZV90YXJnYQlqSVdyVGFyZ2EKLSNkZWZpbmUgcmVhZF9xdWFudF90YWJsZXMJUmRRVGFibGVzCi0jZGVmaW5lIHJlYWRfc2Nhbl9zY3JpcHQJUmRTY25TY3JpcHQKLSNkZWZpbmUgc2V0X3F1YW50X3Nsb3RzCQlTZXRRU2xvdHMKLSNkZWZpbmUgc2V0X3NhbXBsZV9mYWN0b3JzCVNldFNGYWN0cwotI2RlZmluZSByZWFkX2NvbG9yX21hcAkJUmRDTWFwCi0jZGVmaW5lIGVuYWJsZV9zaWduYWxfY2F0Y2hlcglFblNpZ0NhdGNoZXIKLSNkZWZpbmUgc3RhcnRfcHJvZ3Jlc3NfbW9uaXRvcglTdFByb2dNb24KLSNkZWZpbmUgZW5kX3Byb2dyZXNzX21vbml0b3IJRW5Qcm9nTW9uCi0jZGVmaW5lIHJlYWRfc3RkaW4JCVJkU3RkaW4KLSNkZWZpbmUgd3JpdGVfc3Rkb3V0CQlXclN0ZG91dAotI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KLQotLyogTW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lcyBmb3IgSS9PIG1vZHVsZXMuICovCi0KLUVYVEVSTihjanBlZ19zb3VyY2VfcHRyKSBqaW5pdF9yZWFkX2JtcCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4oZGpwZWdfZGVzdF9wdHIpIGppbml0X3dyaXRlX2JtcCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICBib29sZWFuIGlzX29zMikpOwotRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfZ2lmIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTihkanBlZ19kZXN0X3B0cikgamluaXRfd3JpdGVfZ2lmIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfcHBtIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTihkanBlZ19kZXN0X3B0cikgamluaXRfd3JpdGVfcHBtIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfcmxlIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTihkanBlZ19kZXN0X3B0cikgamluaXRfd3JpdGVfcmxlIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfdGFyZ2EgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGRqcGVnX2Rlc3RfcHRyKSBqaW5pdF93cml0ZV90YXJnYSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLQotLyogY2pwZWcgc3VwcG9ydCByb3V0aW5lcyAoaW4gcmRzd2l0Y2guYykgKi8KLQotRVhURVJOKGJvb2xlYW4pIHJlYWRfcXVhbnRfdGFibGVzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKiBmaWxlbmFtZSwKLQkJCQkgICAgaW50IHNjYWxlX2ZhY3RvciwgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkpOwotRVhURVJOKGJvb2xlYW4pIHJlYWRfc2Nhbl9zY3JpcHQgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqIGZpbGVuYW1lKSk7Ci1FWFRFUk4oYm9vbGVhbikgc2V0X3F1YW50X3Nsb3RzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKmFyZykpOwotRVhURVJOKGJvb2xlYW4pIHNldF9zYW1wbGVfZmFjdG9ycyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjaGFyICphcmcpKTsKLQotLyogZGpwZWcgc3VwcG9ydCByb3V0aW5lcyAoaW4gcmRjb2xtYXAuYykgKi8KLQotRVhURVJOKHZvaWQpIHJlYWRfY29sb3JfbWFwIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkpOwotCi0vKiBjb21tb24gc3VwcG9ydCByb3V0aW5lcyAoaW4gY2RqcGVnLmMpICovCi0KLUVYVEVSTih2b2lkKSBlbmFibGVfc2lnbmFsX2NhdGNoZXIgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBzdGFydF9wcm9ncmVzc19tb25pdG9yIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLAotCQkJCQkgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzKSk7Ci1FWFRFUk4odm9pZCkgZW5kX3Byb2dyZXNzX21vbml0b3IgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLUVYVEVSTihib29sZWFuKSBrZXltYXRjaCBKUFAoKGNoYXIgKiBhcmcsIGNvbnN0IGNoYXIgKiBrZXl3b3JkLCBpbnQgbWluY2hhcnMpKTsKLUVYVEVSTihGSUxFICopIHJlYWRfc3RkaW4gSlBQKCh2b2lkKSk7Ci1FWFRFUk4oRklMRSAqKSB3cml0ZV9zdGRvdXQgSlBQKCh2b2lkKSk7Ci0KLS8qIG1pc2NlbGxhbmVvdXMgdXNlZnVsIG1hY3JvcyAqLwotCi0jaWZkZWYgRE9OVF9VU0VfQl9NT0RFCQkvKiBkZWZpbmUgbW9kZSBwYXJhbWV0ZXJzIGZvciBmb3BlbigpICovCi0jZGVmaW5lIFJFQURfQklOQVJZCSJyIgotI2RlZmluZSBXUklURV9CSU5BUlkJInciCi0jZWxzZQotI2lmZGVmIFZNUwkJCS8qIFZNUyBpcyB2ZXJ5IG5vbnN0YW5kYXJkICovCi0jZGVmaW5lIFJFQURfQklOQVJZCSJyYiIsICJjdHg9c3RtIgotI2RlZmluZSBXUklURV9CSU5BUlkJIndiIiwgImN0eD1zdG0iCi0jZWxzZQkJCQkvKiBzdGFuZGFyZCBBTlNJLWNvbXBsaWFudCBjYXNlICovCi0jZGVmaW5lIFJFQURfQklOQVJZCSJyYiIKLSNkZWZpbmUgV1JJVEVfQklOQVJZCSJ3YiIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRVhJVF9GQUlMVVJFCQkvKiBkZWZpbmUgZXhpdCgpIGNvZGVzIGlmIG5vdCBwcm92aWRlZCAqLwotI2RlZmluZSBFWElUX0ZBSUxVUkUgIDEKLSNlbmRpZgotI2lmbmRlZiBFWElUX1NVQ0NFU1MKLSNpZmRlZiBWTVMKLSNkZWZpbmUgRVhJVF9TVUNDRVNTICAxCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLwotI2Vsc2UKLSNkZWZpbmUgRVhJVF9TVUNDRVNTICAwCi0jZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBFWElUX1dBUk5JTkcKLSNpZmRlZiBWTVMKLSNkZWZpbmUgRVhJVF9XQVJOSU5HICAxCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLwotI2Vsc2UKLSNkZWZpbmUgRVhJVF9XQVJOSU5HICAyCi0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY2hhbmdlLmxvZyBiL2NoYW5nZS5sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MTAyYzAuLjAwMDAwMDAKLS0tIGEvY2hhbmdlLmxvZworKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi1DSEFOR0UgTE9HIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFRyBzb2Z0d2FyZQotCi0KLVZlcnNpb24gNmIgIDI3LU1hci0xOTk4Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1qcGVndHJhbiBoYXMgbmV3IGZlYXR1cmVzIGZvciBsb3NzbGVzcyBpbWFnZSB0cmFuc2Zvcm1hdGlvbnMgKHJvdGF0aW9uCi1hbmQgZmxpcHBpbmcpIGFzIHdlbGwgYXMgImxvc3NsZXNzIiByZWR1Y3Rpb24gdG8gZ3JheXNjYWxlLgotCi1qcGVndHJhbiBub3cgY29waWVzIGNvbW1lbnRzIGJ5IGRlZmF1bHQ7IGl0IGhhcyBhIC1jb3B5IHN3aXRjaCB0byBlbmFibGUKLWNvcHlpbmcgYWxsIEFQUG4gYmxvY2tzIGFzIHdlbGwsIG9yIHRvIHN1cHByZXNzIGNvbW1lbnRzLiAgKEZvcm1lcmx5IGl0Ci1hbHdheXMgc3VwcHJlc3NlZCBjb21tZW50cyBhbmQgQVBQbiBibG9ja3MuKSAganBlZ3RyYW4gbm93IGFsc28gcHJlc2VydmVzCi1KRklGIHZlcnNpb24gYW5kIHJlc29sdXRpb24gaW5mb3JtYXRpb24uCi0KLU5ldyBkZWNvbXByZXNzb3IgbGlicmFyeSBmZWF0dXJlOiBDT00gYW5kIEFQUG4gbWFya2VycyBmb3VuZCBpbiB0aGUgaW5wdXQKLWZpbGUgY2FuIGJlIHNhdmVkIGluIG1lbW9yeSBmb3IgbGF0ZXIgdXNlIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIChCZWZvcmUsCi15b3UgaGFkIHRvIGNvZGUgdGhpcyB1cCB5b3Vyc2VsZiB3aXRoIGEgY3VzdG9tIG1hcmtlciBwcm9jZXNzb3IuKQotCi1UaGVyZSBpcyBhbiB1bnVzZWQgZmllbGQgInZvaWQgKiBjbGllbnRfZGF0YSIgbm93IGluIGNvbXByZXNzIGFuZCBkZWNvbXByZXNzCi1wYXJhbWV0ZXIgc3RydWN0czsgdGhpcyBtYXkgYmUgdXNlZnVsIGluIHNvbWUgYXBwbGljYXRpb25zLgotCi1KRklGIHZlcnNpb24gbnVtYmVyIGluZm9ybWF0aW9uIGlzIG5vdyBzYXZlZCBieSB0aGUgZGVjb2RlciBhbmQgYWNjZXB0ZWQgYnkKLXRoZSBlbmNvZGVyLiAganBlZ3RyYW4gdXNlcyB0aGlzIHRvIGNvcHkgdGhlIHNvdXJjZSBmaWxlJ3MgdmVyc2lvbiBudW1iZXIsCi10byBlbnN1cmUgImpwZWd0cmFuIC1jb3B5IGFsbCIgd29uJ3QgY3JlYXRlIGJvZ3VzIGZpbGVzIHRoYXQgY29udGFpbiBKRlhYCi1leHRlbnNpb25zIGJ1dCBjbGFpbSB0byBiZSB2ZXJzaW9uIDEuMDEuICBBcHBsaWNhdGlvbnMgdGhhdCBnZW5lcmF0ZSB0aGVpcgotb3duIEpGWFggZXh0ZW5zaW9uIG1hcmtlcnMgYWxzbyAoZmluYWxseSkgaGF2ZSBhIHN1cHBvcnRlZCB3YXkgdG8gY2F1c2UgdGhlCi1lbmNvZGVyIHRvIGVtaXQgSkZJRiB2ZXJzaW9uIG51bWJlciAxLjAyLgotCi1kanBlZydzIHRyYWNlIG1vZGUgcmVwb3J0cyBKRklGIDEuMDIgdGh1bWJuYWlsIGltYWdlcyBhcyBzdWNoLCByYXRoZXIKLXRoYW4gYXMgdW5rbm93biBBUFAwIG1hcmtlcnMuCi0KLUluIC12ZXJib3NlIG1vZGUsIGRqcGVnIGFuZCByZGpwZ2NvbSB3aWxsIHRyeSB0byBwcmludCB0aGUgY29udGVudHMgb2YKLUFQUDEyIG1hcmtlcnMgYXMgdGV4dC4gIFNvbWUgZGlnaXRhbCBjYW1lcmFzIHN0b3JlIHVzZWZ1bCB0ZXh0IGluZm9ybWF0aW9uCi1pbiBBUFAxMiBtYXJrZXJzLgotCi1IYW5kbGluZyBvZiB0cnVuY2F0ZWQgZGF0YSBzdHJlYW1zIGlzIG1vcmUgcm9idXN0OiBibG9ja3MgYmV5b25kIHRoZSBvbmUgaW4KLXdoaWNoIHRoZSBlcnJvciBvY2N1cnMgd2lsbCBiZSBvdXRwdXQgYXMgdW5pZm9ybSBncmF5LCBvciBsZWZ0IHVuY2hhbmdlZAotaWYgZGVjb2RpbmcgYSBwcm9ncmVzc2l2ZSBKUEVHLiAgVGhlIGFwcGVhcmFuY2Ugbm8gbG9uZ2VyIGRlcGVuZHMgb24gdGhlCi1IdWZmbWFuIHRhYmxlcyBiZWluZyB1c2VkLgotCi1IdWZmbWFuIHRhYmxlcyBhcmUgY2hlY2tlZCBmb3IgdmFsaWRpdHkgbXVjaCBtb3JlIGNhcmVmdWxseSB0aGFuIGJlZm9yZS4KLQotVG8gYXZvaWQgdGhlIFVuaXN5cyBMWlcgcGF0ZW50LCBkanBlZydzIEdJRiBvdXRwdXQgY2FwYWJpbGl0eSBoYXMgYmVlbgotY2hhbmdlZCB0byBwcm9kdWNlICJ1bmNvbXByZXNzZWQgR0lGcyIsIGFuZCBjanBlZydzIEdJRiBpbnB1dCBjYXBhYmlsaXR5Ci1oYXMgYmVlbiByZW1vdmVkIGFsdG9nZXRoZXIuICBXZSdyZSBub3QgaGFwcHkgYWJvdXQgaXQgZWl0aGVyLCBidXQgdGhlcmUKLXNlZW1zIHRvIGJlIG5vIGdvb2QgYWx0ZXJuYXRpdmUuCi0KLVRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBzdXBwb3J0cyBidWlsZGluZyBsaWJqcGVnIGFzIGEgc2hhcmVkIGxpYnJhcnkKLW9uIG1hbnkgZmxhdm9ycyBvZiBVbml4IChhbGwgdGhlIG9uZXMgdGhhdCBHTlUgbGlidG9vbCBrbm93cyBob3cgdG8KLWJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgZm9yKS4gIFVzZSAiLi9jb25maWd1cmUgLS1lbmFibGUtc2hhcmVkIiB0bwotdHJ5IHRoaXMgb3V0LgotCi1OZXcgamNvbmZpZyBmaWxlIGFuZCBtYWtlZmlsZXMgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrIGFuZCBEZXZlbG9wZXIgU3R1ZGlvLgotQWxzbywgYSBqY29uZmlnIGZpbGUgYW5kIGEgYnVpbGQgc2NyaXB0IGZvciBNZXRyb3dlcmtzIENvZGVXYXJyaW9yCi1vbiBBcHBsZSBNYWNpbnRvc2guICBtYWtlZmlsZS5kaiBoYXMgYmVlbiB1cGRhdGVkIGZvciBESkdQUCB2MiwgYW5kIHRoZXJlCi1hcmUgbWlzY2VsbGFuZW91cyBvdGhlciBtaW5vciBpbXByb3ZlbWVudHMgaW4gdGhlIG1ha2VmaWxlcy4KLQotam1lbW1hYy5jIG5vdyBrbm93cyBob3cgdG8gY3JlYXRlIHRlbXBvcmFyeSBmaWxlcyBmb2xsb3dpbmcgTWFjIFN5c3RlbSA3Ci1jb252ZW50aW9ucy4KLQotZGpwZWcncyAtbWFwIHN3aXRjaCBpcyBub3cgYWJsZSB0byByZWFkIHJhdy1mb3JtYXQgUFBNIGZpbGVzIHJlbGlhYmx5LgotCi1janBlZyAtcHJvZ3Jlc3NpdmUgLXJlc3RhcnQgbm8gbG9uZ2VyIGdlbmVyYXRlcyBhbnkgdW5uZWNlc3NhcnkgRFJJIG1hcmtlcnMuCi0KLU11bHRpcGxlIGNhbGxzIHRvIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uIGZvciBhIHNpbmdsZSBKUEVHIG9iamVjdAotbm8gbG9uZ2VyIGxlYWsgbWVtb3J5LgotCi0KLVZlcnNpb24gNmEgIDctRmViLTk2Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1MaWJyYXJ5IGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIG1vZGlmaWVkIHRvIGRldGVjdCB2ZXJzaW9uIG1pc21hdGNoZXMKLWFuZCBzdHJ1Y3QgZmllbGQgcGFja2luZyBtaXNtYXRjaGVzIGJldHdlZW4gbGlicmFyeSBhbmQgY2FsbGluZyBhcHBsaWNhdGlvbi4KLVRoaXMgY2hhbmdlIHJlcXVpcmVzIGFwcGxpY2F0aW9ucyB0byBiZSByZWNvbXBpbGVkLCBidXQgZG9lcyBub3QgcmVxdWlyZQotYW55IGFwcGxpY2F0aW9uIHNvdXJjZSBjb2RlIGNoYW5nZS4KLQotQWxsIHJvdXRpbmUgZGVjbGFyYXRpb25zIGNoYW5nZWQgdG8gdGhlIHN0eWxlICJHTE9CQUwodHlwZSkgbmFtZSAuLi4iLAotdGhhdCBpcywgR0xPQkFMLCBMT0NBTCwgTUVUSE9EREVGLCBFWFRFUk4gYXJlIG5vdyBtYWNyb3MgdGFraW5nIHRoZQotcm91dGluZSdzIHJldHVybiB0eXBlIGFzIGFuIGFyZ3VtZW50LiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBhZGQKLU1pY3Jvc29mdC1zdHlsZSBsaW5rYWdlIGtleXdvcmRzIHRvIGFsbCB0aGUgcm91dGluZXMgYnkgY2hhbmdpbmcganVzdAotdGhlc2UgbWFjcm9zLiAgTm90ZSB0aGF0IGFueSBhcHBsaWNhdGlvbiBjb2RlIHRoYXQgd2FzIHVzaW5nIHRoZXNlIG1hY3Jvcwotd2lsbCBoYXZlIHRvIGJlIGNoYW5nZWQuCi0KLURDVCBjb2VmZmljaWVudCBxdWFudGl6YXRpb24gdGFibGVzIGFyZSBub3cgc3RvcmVkIGluIG5vcm1hbCBhcnJheSBvcmRlcgotcmF0aGVyIHRoYW4gemlnemFnIG9yZGVyLiAgQXBwbGljYXRpb24gY29kZSB0aGF0IGNhbGxzIGpwZWdfYWRkX3F1YW50X3RhYmxlLAotb3Igb3RoZXJ3aXNlIG1hbmlwdWxhdGVzIHF1YW50aXphdGlvbiB0YWJsZXMgZGlyZWN0bHksIHdpbGwgbmVlZCB0byBiZQotY2hhbmdlZC4gIElmIHlvdSBuZWVkIHRvIG1ha2Ugc3VjaCBjb2RlIHdvcmsgd2l0aCBlaXRoZXIgb2xkZXIgb3IgbmV3ZXIKLXZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5LCBhIHRlc3QgbGlrZSAiI2lmIEpQRUdfTElCX1ZFUlNJT04gPj0gNjEiIGlzCi1yZWNvbW1lbmRlZC4KLQotZGpwZWcncyB0cmFjZSBjYXBhYmlsaXR5IG5vdyBkdW1wcyBEUVQgdGFibGVzIGluIG5hdHVyYWwgb3JkZXIsIG5vdCB6aWd6YWcKLW9yZGVyLiAgVGhpcyBhbGxvd3MgdGhlIHRyYWNlIG91dHB1dCB0byBiZSBtYWRlIGludG8gYSAiLXF0YWJsZXMiIGZpbGUKLW1vcmUgZWFzaWx5LgotCi1OZXcgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkgbWFuYWdlciBtb2R1bGUgZm9yIHVzZSBvbiBBcHBsZSBNYWNpbnRvc2guCi0KLUZpeCBidWcgaW4gY2pwZWcncyAtc21vb3RoIG9wdGlvbjogbGFzdCBvbmUgb3IgdHdvIHNjYW5saW5lcyB3b3VsZCBiZQotZHVwbGljYXRlcyBvZiB0aGUgcHJpb3IgbGluZSB1bmxlc3MgdGhlIGltYWdlIGhlaWdodCBtb2QgMTYgd2FzIDEgb3IgMi4KLQotUmVwYWlyIG1pbm9yIHByb2JsZW1zIGluIFZNUywgQkNDLCBNQzYgbWFrZWZpbGVzLgotCi1OZXcgY29uZmlndXJlIHNjcmlwdCBiYXNlZCBvbiBsYXRlc3QgR05VIEF1dG9jb25mLgotCi1Db3JyZWN0IHRoZSBsaXN0IG9mIGluY2x1ZGUgZmlsZXMgbmVlZGVkIGJ5IE1ldHJvV2Vya3MgQyBmb3IgY2NvbW1hbmQoKS4KLQotTnVtZXJvdXMgc21hbGwgZG9jdW1lbnRhdGlvbiB1cGRhdGVzLgotCi0KLVZlcnNpb24gNiAgMi1BdWctOTUKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUHJvZ3Jlc3NpdmUgSlBFRyBzdXBwb3J0OiBsaWJyYXJ5IGNhbiByZWFkIGFuZCB3cml0ZSBmdWxsIHByb2dyZXNzaXZlIEpQRUcKLWZpbGVzLiAgQSAiYnVmZmVyZWQgaW1hZ2UiIG1vZGUgc3VwcG9ydHMgaW5jcmVtZW50YWwgZGVjb2RpbmcgZm9yIG9uLXRoZS1mbHkKLWRpc3BsYXkgb2YgcHJvZ3Jlc3NpdmUgaW1hZ2VzLiAgU2ltcGx5IHJlY29tcGlsaW5nIGFuIGV4aXN0aW5nIElKRy12NS1iYXNlZAotZGVjb2RlciB3aXRoIHY2IHNob3VsZCBhbGxvdyBpdCB0byByZWFkIHByb2dyZXNzaXZlIGZpbGVzLCB0aG91Z2ggb2YgY291cnNlCi13aXRob3V0IGFueSBzcGVjaWFsIHByb2dyZXNzaXZlIGRpc3BsYXkuCi0KLU5ldyAianBlZ3RyYW4iIGFwcGxpY2F0aW9uIHBlcmZvcm1zIGxvc3NsZXNzIHRyYW5zY29kaW5nIGJldHdlZW4gZGlmZmVyZW50Ci1KUEVHIGZvcm1hdHM7IHByaW1hcmlseSwgaXQgY2FuIGJlIHVzZWQgdG8gY29udmVydCBiYXNlbGluZSB0byBwcm9ncmVzc2l2ZQotSlBFRyBhbmQgdmljZSB2ZXJzYS4gIEluIHN1cHBvcnQgb2YganBlZ3RyYW4sIHRoZSBsaWJyYXJ5IG5vdyBhbGxvd3MgbG9zc2xlc3MKLXJlYWRpbmcgYW5kIHdyaXRpbmcgb2YgSlBFRyBmaWxlcyBhcyBEQ1QgY29lZmZpY2llbnQgYXJyYXlzLiAgVGhpcyBhYmlsaXR5Ci1tYXkgYmUgb2YgdXNlIGluIG90aGVyIGFwcGxpY2F0aW9ucy4KLQotTm90ZXMgZm9yIHByb2dyYW1tZXJzOgotKiBXZSBjaGFuZ2VkIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIHRvIGJlIGFibGUgdG8gc3VzcGVuZDsgdGhpcyBtYWtlcyBhbGwKLWRlY29kaW5nIG1vZGVzIGF2YWlsYWJsZSB0byBzdXNwZW5kaW5nLWlucHV0IGFwcGxpY2F0aW9ucy4gIEhvd2V2ZXIsCi1leGlzdGluZyBhcHBsaWNhdGlvbnMgdGhhdCB1c2Ugc3VzcGVuZGluZyBpbnB1dCB3aWxsIG5lZWQgdG8gYmUgY2hhbmdlZAotdG8gY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLiAgWW91IGRvbid0IG5lZWQgdG8KLWRvIGFueXRoaW5nIGlmIHlvdSBkb24ndCB1c2UgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlLgotKiBXZSBjaGFuZ2VkIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHZpcnR1YWwgYXJyYXkgcm91dGluZXM6IGFjY2Vzc192aXJ0X2FycmF5Ci1yb3V0aW5lcyBub3cgdGFrZSBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2Ygcm93cyB0byBhY2Nlc3MgdGhpcyB0aW1lLiAgVGhlCi1sYXN0IHBhcmFtZXRlciB0byByZXF1ZXN0X3ZpcnRfYXJyYXkgcm91dGluZXMgaXMgbm93IGludGVycHJldGVkIGFzIHRoZQotbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0aGF0IG1heSBiZSBhY2Nlc3NlZCBhdCBvbmNlLCBidXQgbm90IG5lY2Vzc2FyaWx5Ci10aGUgaGVpZ2h0IG9mIGV2ZXJ5IGFjY2Vzcy4KLQotCi1WZXJzaW9uIDViICAxNS1NYXItOTUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db3JyZWN0IGJ1Z3Mgd2l0aCBncmF5c2NhbGUgaW1hZ2VzIGhhdmluZyB2X3NhbXBfZmFjdG9yID4gMS4KLQotanBlZ193cml0ZV9yYXdfZGF0YSgpIG5vdyBzdXBwb3J0cyBvdXRwdXQgc3VzcGVuc2lvbi4KLQotQ29ycmVjdCBidWdzIGluICJjb25maWd1cmUiIHNjcmlwdCBmb3IgY2FzZSBvZiBjb21waWxpbmcgaW4KLWEgZGlyZWN0b3J5IG90aGVyIHRoYW4gdGhlIG9uZSBjb250YWluaW5nIHRoZSBzb3VyY2UgZmlsZXMuCi0KLVJlcGFpciBidWcgaW4ganF1YW50MS5jOiBzb21ldGltZXMgZGlkbid0IHVzZSBhcyBtYW55IGNvbG9ycyBhcyBpdCBjb3VsZC4KLQotQm9ybGFuZCBDIG1ha2VmaWxlIGFuZCBqY29uZmlnIGZpbGUgd29yayB1bmRlciBlaXRoZXIgTVMtRE9TIG9yIE9TLzIuCi0KLU1pc2NlbGxhbmVvdXMgaW1wcm92ZW1lbnRzIHRvIGRvY3VtZW50YXRpb24uCi0KLQotVmVyc2lvbiA1YSAgNy1EZWMtOTQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNoYW5nZWQgY29sb3IgY29udmVyc2lvbiByb3VuZG9mZiBiZWhhdmlvciBzbyB0aGF0IGdyYXlzY2FsZSB2YWx1ZXMgYXJlCi1yZXByZXNlbnRlZCBleGFjdGx5LiAgKFRoaXMgY2F1c2VzIHRlc3QgaW1hZ2UgZmlsZXMgdG8gY2hhbmdlLikKLQotTWFrZSBvcmRlcmVkIGRpdGhlciB1c2UgMTZ4MTYgaW5zdGVhZCBvZiA0eDQgcGF0dGVybiBmb3IgYSBzbWFsbCBxdWFsaXR5Ci1pbXByb3ZlbWVudC4KLQotTmV3IGNvbmZpZ3VyZSBzY3JpcHQgYmFzZWQgb24gbGF0ZXN0IEdOVSBBdXRvY29uZi4KLUZpeCBjb25maWd1cmUgc2NyaXB0IHRvIGhhbmRsZSBDRkxBR1MgY29ycmVjdGx5LgotUmVuYW1lICouYXV0byBmaWxlcyB0byAqLmNmZywgc28gdGhhdCBjb25maWd1cmUgc2NyaXB0IHN0aWxsIHdvcmtzIGlmCi1maWxlIG5hbWVzIGhhdmUgYmVlbiB0cnVuY2F0ZWQgZm9yIERPUy4KLQotRml4IGJ1ZyBpbiByZGJtcC5jOiBkaWRuJ3QgYWxsb3cgZm9yIGV4dHJhIGRhdGEgYmV0d2VlbiBoZWFkZXIgYW5kIGltYWdlLgotCi1Nb2RpZnkgcmRwcG0uYy93cnBwbS5jIHRvIGhhbmRsZSAyLWJ5dGUgcmF3IFBQTS9QR00gZm9ybWF0cyBmb3IgMTItYml0IGRhdGEuCi0KLUZpeCBzZXZlcmFsIGJ1Z3MgaW4gcmRybGUuYy4KLQotTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyBvcHRpb24gd2FzIGJyb2tlbi4KLQotUmV2aXNlIGplcnJvci5oL2plcnJvci5jIGZvciBtb3JlIGZsZXhpYmlsaXR5IGluIG1lc3NhZ2UgdGFibGUuCi0KLVJlcGFpciBvdmVyc2lnaHQgaW4gam1lbW5hbWUuYyBOT19NS1RFTVAgY2FzZTogZmlsZSBjb3VsZCBiZSB0aGVyZQotYnV0IHVucmVhZGFibGUuCi0KLQotVmVyc2lvbiA1ICAyNC1TZXAtOTQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVZlcnNpb24gNSByZXByZXNlbnRzIGEgbmVhcmx5IGNvbXBsZXRlIHJlZGVzaWduIGFuZCByZXdyaXRlIG9mIHRoZSBJSkcKLXNvZnR3YXJlLiAgTWFqb3IgdXNlci12aXNpYmxlIGNoYW5nZXMgaW5jbHVkZToKLSAgKiBBdXRvbWF0aWMgY29uZmlndXJhdGlvbiBzaW1wbGlmaWVzIGluc3RhbGxhdGlvbiBmb3IgbW9zdCBVbml4IHN5c3RlbXMuCi0gICogQSByYW5nZSBvZiBzcGVlZCB2cy4gaW1hZ2UgcXVhbGl0eSB0cmFkZW9mZnMgYXJlIHN1cHBvcnRlZC4KLSAgICBUaGlzIGluY2x1ZGVzIHJlc2l6aW5nIG9mIGFuIGltYWdlIGR1cmluZyBkZWNvbXByZXNzaW9uOiBzY2FsaW5nIGRvd24KLSAgICBieSBhIGZhY3RvciBvZiAxLzIsIDEvNCwgb3IgMS84IGlzIGhhbmRsZWQgdmVyeSBlZmZpY2llbnRseS4KLSAgKiBOZXcgcHJvZ3JhbXMgcmRqcGdjb20gYW5kIHdyanBnY29tIGFsbG93IGluc2VydGlvbiBhbmQgZXh0cmFjdGlvbgotICAgIG9mIHRleHQgY29tbWVudHMgaW4gYSBKUEVHIGZpbGUuCi0KLVRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWVyJ3MgaW50ZXJmYWNlIHRvIHRoZSBsaWJyYXJ5IGhhcyBjaGFuZ2VkIGNvbXBsZXRlbHkuCi1Ob3RhYmxlIGltcHJvdmVtZW50cyBpbmNsdWRlOgotICAqIFdlIGhhdmUgZWxpbWluYXRlZCB0aGUgdXNlIG9mIGNhbGxiYWNrIHJvdXRpbmVzIGZvciBoYW5kbGluZyB0aGUKLSAgICB1bmNvbXByZXNzZWQgaW1hZ2UgZGF0YS4gIFRoZSBhcHBsaWNhdGlvbiBub3cgc2VlcyB0aGUgbGlicmFyeSBhcyBhCi0gICAgc2V0IG9mIHJvdXRpbmVzIHRoYXQgaXQgY2FsbHMgdG8gcmVhZCBvciB3cml0ZSBpbWFnZSBkYXRhIG9uIGEKLSAgICBzY2FubGluZS1ieS1zY2FubGluZSBiYXNpcy4KLSAgKiBUaGUgYXBwbGljYXRpb24gaW1hZ2UgZGF0YSBpcyByZXByZXNlbnRlZCBpbiBhIGNvbnZlbnRpb25hbCBpbnRlcmxlYXZlZC0KLSAgICBwaXhlbCBmb3JtYXQsIHJhdGhlciB0aGFuIGFzIGEgc2VwYXJhdGUgYXJyYXkgZm9yIGVhY2ggY29sb3IgY2hhbm5lbC4KLSAgICBUaGlzIGNhbiBzYXZlIGEgY29weWluZyBzdGVwIGluIG1hbnkgcHJvZ3JhbXMuCi0gICogVGhlIGhhbmRsaW5nIG9mIGNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiBjbGVhbmVkIHVwOiB0aGUgYXBwbGljYXRpb24gY2FuCi0gICAgc3VwcGx5IHJvdXRpbmVzIHRvIHNvdXJjZSBvciBzaW5rIHRoZSBjb21wcmVzc2VkIGRhdGEuICBJdCBpcyBwb3NzaWJsZSB0bwotICAgIHN1c3BlbmQgcHJvY2Vzc2luZyBvbiBzb3VyY2Uvc2luayBidWZmZXIgb3ZlcnJ1biwgYWx0aG91Z2ggdGhpcyBpcyBub3QKLSAgICBzdXBwb3J0ZWQgaW4gYWxsIG9wZXJhdGluZyBtb2Rlcy4KLSAgKiBBbGwgc3RhdGljIHN0YXRlIGhhcyBiZWVuIGVsaW1pbmF0ZWQgZnJvbSB0aGUgbGlicmFyeSwgc28gdGhhdCBtdWx0aXBsZQotICAgIGluc3RhbmNlcyBvZiBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIGNhbiBiZSBhY3RpdmUgY29uY3VycmVudGx5LgotICAqIEpQRUcgYWJicmV2aWF0ZWQgZGF0YXN0cmVhbSBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQsIGllLCBxdWFudGl6YXRpb24gYW5kCi0gICAgSHVmZm1hbiB0YWJsZXMgY2FuIGJlIHN0b3JlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIGltYWdlIGRhdGEuCi0gICogQW5kIG5vdCBvbmx5IHRoYXQsIGJ1dCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgbGlicmFyeSBoYXMgaW1wcm92ZWQKLSAgICBjb25zaWRlcmFibHkhCi0KLQotVGhlIGxhc3Qgd2lkZWx5IHVzZWQgcmVsZWFzZSBiZWZvcmUgdGhlIHZlcnNpb24gNSByZXdyaXRlIHdhcyB2ZXJzaW9uIDRBIG9mCi0xOC1GZWItOTMuICBDaGFuZ2UgbG9ncyBiZWZvcmUgdGhhdCBwb2ludCBoYXZlIGJlZW4gZGlzY2FyZGVkLCBzaW5jZSB0aGV5Ci1hcmUgbm90IG9mIG11Y2ggaW50ZXJlc3QgYWZ0ZXIgdGhlIHJld3JpdGUuCmRpZmYgLS1naXQgYS9janBlZy4xIGIvY2pwZWcuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE3NWE5Ni4uMDAwMDAwMAotLS0gYS9janBlZy4xCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS5USCBDSlBFRyAxICIyMCBNYXJjaCAxOTk4IgotLlNIIE5BTUUKLWNqcGVnIFwtIGNvbXByZXNzIGFuIGltYWdlIGZpbGUgdG8gYSBKUEVHIGZpbGUKLS5TSCBTWU5PUFNJUwotLkIgY2pwZWcKLVsKLS5JIG9wdGlvbnMKLV0KLVsKLS5JIGZpbGVuYW1lCi1dCi0uTFAKLS5TSCBERVNDUklQVElPTgotLkxQCi0uQiBjanBlZwotY29tcHJlc3NlcyB0aGUgbmFtZWQgaW1hZ2UgZmlsZSwgb3IgdGhlIHN0YW5kYXJkIGlucHV0IGlmIG5vIGZpbGUgaXMKLW5hbWVkLCBhbmQgcHJvZHVjZXMgYSBKUEVHL0pGSUYgZmlsZSBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgaW5wdXQgZmlsZSBmb3JtYXRzIGFyZTogUFBNIChQQk1QTFVTIGNvbG9yCi1mb3JtYXQpLCBQR00gKFBCTVBMVVMgZ3JheS1zY2FsZSBmb3JtYXQpLCBCTVAsIFRhcmdhLCBhbmQgUkxFIChVdGFoIFJhc3RlcgotVG9vbGtpdCBmb3JtYXQpLiAgKFJMRSBpcyBzdXBwb3J0ZWQgb25seSBpZiB0aGUgVVJUIGxpYnJhcnkgaXMgYXZhaWxhYmxlLikKLS5TSCBPUFRJT05TCi1BbGwgc3dpdGNoIG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZDsgZm9yIGV4YW1wbGUsCi0uQiBcLWdyYXlzY2FsZQotbWF5IGJlIHdyaXR0ZW4KLS5CIFwtZ3JheQotb3IKLS5CUiBcLWdyIC4KLU1vc3Qgb2YgdGhlICJiYXNpYyIgc3dpdGNoZXMgY2FuIGJlIGFiYnJldmlhdGVkIHRvIGFzIGxpdHRsZSBhcyBvbmUgbGV0dGVyLgotVXBwZXIgYW5kIGxvd2VyIGNhc2UgYXJlIGVxdWl2YWxlbnQgKHRodXMKLS5CIFwtQk1QCi1pcyB0aGUgc2FtZSBhcwotLkJSIFwtYm1wICkuCi1Ccml0aXNoIHNwZWxsaW5ncyBhcmUgYWxzbyBhY2NlcHRlZCAoZS5nLiwKLS5CUiBcLWdyZXlzY2FsZSApLAotdGhvdWdoIGZvciBicmV2aXR5IHRoZXNlIGFyZSBub3QgbWVudGlvbmVkIGJlbG93LgotLlBQCi1UaGUgYmFzaWMgc3dpdGNoZXMgYXJlOgotLlRQCi0uQkkgXC1xdWFsaXR5ICIgTiIKLVNjYWxlIHF1YW50aXphdGlvbiB0YWJsZXMgdG8gYWRqdXN0IGltYWdlIHF1YWxpdHkuICBRdWFsaXR5IGlzIDAgKHdvcnN0KSB0bwotMTAwIChiZXN0KTsgZGVmYXVsdCBpcyA3NS4gIChTZWUgYmVsb3cgZm9yIG1vcmUgaW5mby4pCi0uVFAKLS5CIFwtZ3JheXNjYWxlCi1DcmVhdGUgbW9ub2Nocm9tZSBKUEVHIGZpbGUgZnJvbSBjb2xvciBpbnB1dC4gIEJlIHN1cmUgdG8gdXNlIHRoaXMgc3dpdGNoIHdoZW4KLWNvbXByZXNzaW5nIGEgZ3JheXNjYWxlIEJNUCBmaWxlLCBiZWNhdXNlCi0uQiBjanBlZwotaXNuJ3QgYnJpZ2h0IGVub3VnaCB0byBub3RpY2Ugd2hldGhlciBhIEJNUCBmaWxlIHVzZXMgb25seSBzaGFkZXMgb2YgZ3JheS4KLUJ5IHNheWluZwotLkJSIFwtZ3JheXNjYWxlICwKLXlvdSdsbCBnZXQgYSBzbWFsbGVyIEpQRUcgZmlsZSB0aGF0IHRha2VzIGxlc3MgdGltZSB0byBwcm9jZXNzLgotLlRQCi0uQiBcLW9wdGltaXplCi1QZXJmb3JtIG9wdGltaXphdGlvbiBvZiBlbnRyb3B5IGVuY29kaW5nIHBhcmFtZXRlcnMuICBXaXRob3V0IHRoaXMsIGRlZmF1bHQKLWVuY29kaW5nIHBhcmFtZXRlcnMgYXJlIHVzZWQuCi0uQiBcLW9wdGltaXplCi11c3VhbGx5IG1ha2VzIHRoZSBKUEVHIGZpbGUgYSBsaXR0bGUgc21hbGxlciwgYnV0Ci0uQiBjanBlZwotcnVucyBzb21ld2hhdCBzbG93ZXIgYW5kIG5lZWRzIG11Y2ggbW9yZSBtZW1vcnkuICBJbWFnZSBxdWFsaXR5IGFuZCBzcGVlZCBvZgotZGVjb21wcmVzc2lvbiBhcmUgdW5hZmZlY3RlZCBieQotLkJSIFwtb3B0aW1pemUgLgotLlRQCi0uQiBcLXByb2dyZXNzaXZlCi1DcmVhdGUgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlIChzZWUgYmVsb3cpLgotLlRQCi0uQiBcLXRhcmdhCi1JbnB1dCBmaWxlIGlzIFRhcmdhIGZvcm1hdC4gIFRhcmdhIGZpbGVzIHRoYXQgY29udGFpbiBhbiAiaWRlbnRpZmljYXRpb24iCi1maWVsZCB3aWxsIG5vdCBiZSBhdXRvbWF0aWNhbGx5IHJlY29nbml6ZWQgYnkKLS5CUiBjanBlZyA7Ci1mb3Igc3VjaCBmaWxlcyB5b3UgbXVzdCBzcGVjaWZ5Ci0uQiBcLXRhcmdhCi10byBtYWtlCi0uQiBjanBlZwotdHJlYXQgdGhlIGlucHV0IGFzIFRhcmdhIGZvcm1hdC4KLUZvciBtb3N0IFRhcmdhIGZpbGVzLCB5b3Ugd29uJ3QgbmVlZCB0aGlzIHN3aXRjaC4KLS5QUAotVGhlCi0uQiBcLXF1YWxpdHkKLXN3aXRjaCBsZXRzIHlvdSB0cmFkZSBvZmYgY29tcHJlc3NlZCBmaWxlIHNpemUgYWdhaW5zdCBxdWFsaXR5IG9mIHRoZQotcmVjb25zdHJ1Y3RlZCBpbWFnZTogdGhlIGhpZ2hlciB0aGUgcXVhbGl0eSBzZXR0aW5nLCB0aGUgbGFyZ2VyIHRoZSBKUEVHIGZpbGUsCi1hbmQgdGhlIGNsb3NlciB0aGUgb3V0cHV0IGltYWdlIHdpbGwgYmUgdG8gdGhlIG9yaWdpbmFsIGlucHV0LiAgTm9ybWFsbHkgeW91Ci13YW50IHRvIHVzZSB0aGUgbG93ZXN0IHF1YWxpdHkgc2V0dGluZyAoc21hbGxlc3QgZmlsZSkgdGhhdCBkZWNvbXByZXNzZXMgaW50bwotc29tZXRoaW5nIHZpc3VhbGx5IGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIG9yaWdpbmFsIGltYWdlLiAgRm9yIHRoaXMKLXB1cnBvc2UgdGhlIHF1YWxpdHkgc2V0dGluZyBzaG91bGQgYmUgYmV0d2VlbiA1MCBhbmQgOTU7IHRoZSBkZWZhdWx0IG9mIDc1IGlzCi1vZnRlbiBhYm91dCByaWdodC4gIElmIHlvdSBzZWUgZGVmZWN0cyBhdAotLkIgXC1xdWFsaXR5Ci03NSwgdGhlbiBnbyB1cCA1IG9yIDEwIGNvdW50cyBhdCBhIHRpbWUgdW50aWwgeW91IGFyZSBoYXBweSB3aXRoIHRoZSBvdXRwdXQKLWltYWdlLiAgKFRoZSBvcHRpbWFsIHNldHRpbmcgd2lsbCB2YXJ5IGZyb20gb25lIGltYWdlIHRvIGFub3RoZXIuKQotLlBQCi0uQiBcLXF1YWxpdHkKLTEwMCB3aWxsIGdlbmVyYXRlIGEgcXVhbnRpemF0aW9uIHRhYmxlIG9mIGFsbCAxJ3MsIG1pbmltaXppbmcgbG9zcyBpbiB0aGUKLXF1YW50aXphdGlvbiBzdGVwIChidXQgdGhlcmUgaXMgc3RpbGwgaW5mb3JtYXRpb24gbG9zcyBpbiBzdWJzYW1wbGluZywgYXMgd2VsbAotYXMgcm91bmRvZmYgZXJyb3IpLiAgVGhpcyBzZXR0aW5nIGlzIG1haW5seSBvZiBpbnRlcmVzdCBmb3IgZXhwZXJpbWVudGFsCi1wdXJwb3Nlcy4gIFF1YWxpdHkgdmFsdWVzIGFib3ZlIGFib3V0IDk1IGFyZQotLkIgbm90Ci1yZWNvbW1lbmRlZCBmb3Igbm9ybWFsIHVzZTsgdGhlIGNvbXByZXNzZWQgZmlsZSBzaXplIGdvZXMgdXAgZHJhbWF0aWNhbGx5IGZvcgotaGFyZGx5IGFueSBnYWluIGluIG91dHB1dCBpbWFnZSBxdWFsaXR5LgotLlBQCi1JbiB0aGUgb3RoZXIgZGlyZWN0aW9uLCBxdWFsaXR5IHZhbHVlcyBiZWxvdyA1MCB3aWxsIHByb2R1Y2UgdmVyeSBzbWFsbCBmaWxlcwotb2YgbG93IGltYWdlIHF1YWxpdHkuICBTZXR0aW5ncyBhcm91bmQgNSB0byAxMCBtaWdodCBiZSB1c2VmdWwgaW4gcHJlcGFyaW5nIGFuCi1pbmRleCBvZiBhIGxhcmdlIGltYWdlIGxpYnJhcnksIGZvciBleGFtcGxlLiAgVHJ5Ci0uQiBcLXF1YWxpdHkKLTIgKG9yIHNvKSBmb3Igc29tZSBhbXVzaW5nIEN1YmlzdCBlZmZlY3RzLiAgKE5vdGU6IHF1YWxpdHkKLXZhbHVlcyBiZWxvdyBhYm91dCAyNSBnZW5lcmF0ZSAyLWJ5dGUgcXVhbnRpemF0aW9uIHRhYmxlcywgd2hpY2ggYXJlCi1jb25zaWRlcmVkIG9wdGlvbmFsIGluIHRoZSBKUEVHIHN0YW5kYXJkLgotLkIgY2pwZWcKLWVtaXRzIGEgd2FybmluZyBtZXNzYWdlIHdoZW4geW91IGdpdmUgc3VjaCBhIHF1YWxpdHkgdmFsdWUsIGJlY2F1c2Ugc29tZQotb3RoZXIgSlBFRyBwcm9ncmFtcyBtYXkgYmUgdW5hYmxlIHRvIGRlY29kZSB0aGUgcmVzdWx0aW5nIGZpbGUuICBVc2UKLS5CIFwtYmFzZWxpbmUKLWlmIHlvdSBuZWVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGF0IGxvdyBxdWFsaXR5IHZhbHVlcy4pCi0uUFAKLVRoZQotLkIgXC1wcm9ncmVzc2l2ZQotc3dpdGNoIGNyZWF0ZXMgYSAicHJvZ3Jlc3NpdmUgSlBFRyIgZmlsZS4gIEluIHRoaXMgdHlwZSBvZiBKUEVHIGZpbGUsIHRoZSBkYXRhCi1pcyBzdG9yZWQgaW4gbXVsdGlwbGUgc2NhbnMgb2YgaW5jcmVhc2luZyBxdWFsaXR5LiAgSWYgdGhlIGZpbGUgaXMgYmVpbmcKLXRyYW5zbWl0dGVkIG92ZXIgYSBzbG93IGNvbW11bmljYXRpb25zIGxpbmssIHRoZSBkZWNvZGVyIGNhbiB1c2UgdGhlIGZpcnN0Ci1zY2FuIHRvIGRpc3BsYXkgYSBsb3ctcXVhbGl0eSBpbWFnZSB2ZXJ5IHF1aWNrbHksIGFuZCBjYW4gdGhlbiBpbXByb3ZlIHRoZQotZGlzcGxheSB3aXRoIGVhY2ggc3Vic2VxdWVudCBzY2FuLiAgVGhlIGZpbmFsIGltYWdlIGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0byBhCi1zdGFuZGFyZCBKUEVHIGZpbGUgb2YgdGhlIHNhbWUgcXVhbGl0eSBzZXR0aW5nLCBhbmQgdGhlIHRvdGFsIGZpbGUgc2l6ZSBpcwotYWJvdXQgdGhlIHNhbWUgLS0tIG9mdGVuIGEgbGl0dGxlIHNtYWxsZXIuCi0uQiBDYXV0aW9uOgotcHJvZ3Jlc3NpdmUgSlBFRyBpcyBub3QgeWV0IHdpZGVseSBpbXBsZW1lbnRlZCwgc28gbWFueSBkZWNvZGVycyB3aWxsIGJlCi11bmFibGUgdG8gdmlldyBhIHByb2dyZXNzaXZlIEpQRUcgZmlsZSBhdCBhbGwuCi0uUFAKLVN3aXRjaGVzIGZvciBhZHZhbmNlZCB1c2VyczoKLS5UUAotLkIgXC1kY3QgaW50Ci1Vc2UgaW50ZWdlciBEQ1QgbWV0aG9kIChkZWZhdWx0KS4KLS5UUAotLkIgXC1kY3QgZmFzdAotVXNlIGZhc3QgaW50ZWdlciBEQ1QgKGxlc3MgYWNjdXJhdGUpLgotLlRQCi0uQiBcLWRjdCBmbG9hdAotVXNlIGZsb2F0aW5nLXBvaW50IERDVCBtZXRob2QuCi1UaGUgZmxvYXQgbWV0aG9kIGlzIHZlcnkgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSBpbnQgbWV0aG9kLCBidXQgaXMKLW11Y2ggc2xvd2VyIHVubGVzcyB5b3VyIG1hY2hpbmUgaGFzIHZlcnkgZmFzdCBmbG9hdGluZy1wb2ludCBoYXJkd2FyZS4gIEFsc28KLW5vdGUgdGhhdCByZXN1bHRzIG9mIHRoZSBmbG9hdGluZy1wb2ludCBtZXRob2QgbWF5IHZhcnkgc2xpZ2h0bHkgYWNyb3NzCi1tYWNoaW5lcywgd2hpbGUgdGhlIGludGVnZXIgbWV0aG9kcyBzaG91bGQgZ2l2ZSB0aGUgc2FtZSByZXN1bHRzIGV2ZXJ5d2hlcmUuCi1UaGUgZmFzdCBpbnRlZ2VyIG1ldGhvZCBpcyBtdWNoIGxlc3MgYWNjdXJhdGUgdGhhbiB0aGUgb3RoZXIgdHdvLgotLlRQCi0uQkkgXC1yZXN0YXJ0ICIgTiIKLUVtaXQgYSBKUEVHIHJlc3RhcnQgbWFya2VyIGV2ZXJ5IE4gTUNVIHJvd3MsIG9yIGV2ZXJ5IE4gTUNVIGJsb2NrcyBpZiAiQiIgaXMKLWF0dGFjaGVkIHRvIHRoZSBudW1iZXIuCi0uQiBcLXJlc3RhcnQgMAotKHRoZSBkZWZhdWx0KSBtZWFucyBubyByZXN0YXJ0IG1hcmtlcnMuCi0uVFAKLS5CSSBcLXNtb290aCAiIE4iCi1TbW9vdGggdGhlIGlucHV0IGltYWdlIHRvIGVsaW1pbmF0ZSBkaXRoZXJpbmcgbm9pc2UuICBOLCByYW5naW5nIGZyb20gMSB0bwotMTAwLCBpbmRpY2F0ZXMgdGhlIHN0cmVuZ3RoIG9mIHNtb290aGluZy4gIDAgKHRoZSBkZWZhdWx0KSBtZWFucyBubyBzbW9vdGhpbmcuCi0uVFAKLS5CSSBcLW1heG1lbW9yeSAiIE4iCi1TZXQgbGltaXQgZm9yIGFtb3VudCBvZiBtZW1vcnkgdG8gdXNlIGluIHByb2Nlc3NpbmcgbGFyZ2UgaW1hZ2VzLiAgVmFsdWUgaXMKLWluIHRob3VzYW5kcyBvZiBieXRlcywgb3IgbWlsbGlvbnMgb2YgYnl0ZXMgaWYgIk0iIGlzIGF0dGFjaGVkIHRvIHRoZQotbnVtYmVyLiAgRm9yIGV4YW1wbGUsCi0uQiBcLW1heCA0bQotc2VsZWN0cyA0MDAwMDAwIGJ5dGVzLiAgSWYgbW9yZSBzcGFjZSBpcyBuZWVkZWQsIHRlbXBvcmFyeSBmaWxlcyB3aWxsIGJlIHVzZWQuCi0uVFAKLS5CSSBcLW91dGZpbGUgIiBuYW1lIgotU2VuZCBvdXRwdXQgaW1hZ2UgdG8gdGhlIG5hbWVkIGZpbGUsIG5vdCB0byBzdGFuZGFyZCBvdXRwdXQuCi0uVFAKLS5CIFwtdmVyYm9zZQotRW5hYmxlIGRlYnVnIHByaW50b3V0LiAgTW9yZQotLkJSIFwtdiAncwotZ2l2ZSBtb3JlIG91dHB1dC4gIEFsc28sIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgcHJpbnRlZCBhdCBzdGFydHVwLgotLlRQCi0uQiBcLWRlYnVnCi1TYW1lIGFzCi0uQlIgXC12ZXJib3NlIC4KLS5QUAotVGhlCi0uQiBcLXJlc3RhcnQKLW9wdGlvbiBpbnNlcnRzIGV4dHJhIG1hcmtlcnMgdGhhdCBhbGxvdyBhIEpQRUcgZGVjb2RlciB0byByZXN5bmNocm9uaXplIGFmdGVyCi1hIHRyYW5zbWlzc2lvbiBlcnJvci4gIFdpdGhvdXQgcmVzdGFydCBtYXJrZXJzLCBhbnkgZGFtYWdlIHRvIGEgY29tcHJlc3NlZAotZmlsZSB3aWxsIHVzdWFsbHkgcnVpbiB0aGUgaW1hZ2UgZnJvbSB0aGUgcG9pbnQgb2YgdGhlIGVycm9yIHRvIHRoZSBlbmQgb2YgdGhlCi1pbWFnZTsgd2l0aCByZXN0YXJ0IG1hcmtlcnMsIHRoZSBkYW1hZ2UgaXMgdXN1YWxseSBjb25maW5lZCB0byB0aGUgcG9ydGlvbiBvZgotdGhlIGltYWdlIHVwIHRvIHRoZSBuZXh0IHJlc3RhcnQgbWFya2VyLiAgT2YgY291cnNlLCB0aGUgcmVzdGFydCBtYXJrZXJzCi1vY2N1cHkgZXh0cmEgc3BhY2UuICBXZSByZWNvbW1lbmQKLS5CIFwtcmVzdGFydCAxCi1mb3IgaW1hZ2VzIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZCBhY3Jvc3MgdW5yZWxpYWJsZSBuZXR3b3JrcyBzdWNoIGFzIFVzZW5ldC4KLS5QUAotVGhlCi0uQiBcLXNtb290aAotb3B0aW9uIGZpbHRlcnMgdGhlIGlucHV0IHRvIGVsaW1pbmF0ZSBmaW5lLXNjYWxlIG5vaXNlLiAgVGhpcyBpcyBvZnRlbiB1c2VmdWwKLXdoZW4gY29udmVydGluZyBkaXRoZXJlZCBpbWFnZXMgdG8gSlBFRzogYSBtb2RlcmF0ZSBzbW9vdGhpbmcgZmFjdG9yIG9mIDEwIHRvCi01MCBnZXRzIHJpZCBvZiBkaXRoZXJpbmcgcGF0dGVybnMgaW4gdGhlIGlucHV0IGZpbGUsIHJlc3VsdGluZyBpbiBhIHNtYWxsZXIKLUpQRUcgZmlsZSBhbmQgYSBiZXR0ZXItbG9va2luZyBpbWFnZS4gIFRvbyBsYXJnZSBhIHNtb290aGluZyBmYWN0b3Igd2lsbAotdmlzaWJseSBibHVyIHRoZSBpbWFnZSwgaG93ZXZlci4KLS5QUAotU3dpdGNoZXMgZm9yIHdpemFyZHM6Ci0uVFAKLS5CIFwtYmFzZWxpbmUKLUZvcmNlIGJhc2VsaW5lLWNvbXBhdGlibGUgcXVhbnRpemF0aW9uIHRhYmxlcyB0byBiZSBnZW5lcmF0ZWQuICBUaGlzIGNsYW1wcwotcXVhbnRpemF0aW9uIHZhbHVlcyB0byA4IGJpdHMgZXZlbiBhdCBsb3cgcXVhbGl0eSBzZXR0aW5ncy4gIChUaGlzIHN3aXRjaCBpcwotcG9vcmx5IG5hbWVkLCBzaW5jZSBpdCBkb2VzIG5vdCBlbnN1cmUgdGhhdCB0aGUgb3V0cHV0IGlzIGFjdHVhbGx5IGJhc2VsaW5lCi1KUEVHLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlCi0uQiBcLWJhc2VsaW5lCi1hbmQKLS5CIFwtcHJvZ3Jlc3NpdmUKLXRvZ2V0aGVyLikKLS5UUAotLkJJIFwtcXRhYmxlcyAiIGZpbGUiCi1Vc2UgdGhlIHF1YW50aXphdGlvbiB0YWJsZXMgZ2l2ZW4gaW4gdGhlIHNwZWNpZmllZCB0ZXh0IGZpbGUuCi0uVFAKLS5CSSBcLXFzbG90cyAiIE5bLC4uLl0iCi1TZWxlY3Qgd2hpY2ggcXVhbnRpemF0aW9uIHRhYmxlIHRvIHVzZSBmb3IgZWFjaCBjb2xvciBjb21wb25lbnQuCi0uVFAKLS5CSSBcLXNhbXBsZSAiIEh4VlssLi4uXSIKLVNldCBKUEVHIHNhbXBsaW5nIGZhY3RvcnMgZm9yIGVhY2ggY29sb3IgY29tcG9uZW50LgotLlRQCi0uQkkgXC1zY2FucyAiIGZpbGUiCi1Vc2UgdGhlIHNjYW4gc2NyaXB0IGdpdmVuIGluIHRoZSBzcGVjaWZpZWQgdGV4dCBmaWxlLgotLlBQCi1UaGUgIndpemFyZCIgc3dpdGNoZXMgYXJlIGludGVuZGVkIGZvciBleHBlcmltZW50YXRpb24gd2l0aCBKUEVHLiAgSWYgeW91Ci1kb24ndCBrbm93IHdoYXQgeW91IGFyZSBkb2luZywgXGZCZG9uJ3QgdXNlIHRoZW1cZlIuICBUaGVzZSBzd2l0Y2hlcyBhcmUKLWRvY3VtZW50ZWQgZnVydGhlciBpbiB0aGUgZmlsZSB3aXphcmQuZG9jLgotLlNIIEVYQU1QTEVTCi0uTFAKLVRoaXMgZXhhbXBsZSBjb21wcmVzc2VzIHRoZSBQUE0gZmlsZSBmb28ucHBtIHdpdGggYSBxdWFsaXR5IGZhY3RvciBvZgotNjAgYW5kIHNhdmVzIHRoZSBvdXRwdXQgYXMgZm9vLmpwZzoKLS5JUAotLkIgY2pwZWcgXC1xdWFsaXR5Ci0uSSA2MCBmb28ucHBtCi0uQiA+Ci0uSSBmb28uanBnCi0uU0ggSElOVFMKLUNvbG9yIEdJRiBmaWxlcyBhcmUgbm90IHRoZSBpZGVhbCBpbnB1dCBmb3IgSlBFRzsgSlBFRyBpcyByZWFsbHkgaW50ZW5kZWQgZm9yCi1jb21wcmVzc2luZyBmdWxsLWNvbG9yICgyNC1iaXQpIGltYWdlcy4gIEluIHBhcnRpY3VsYXIsIGRvbid0IHRyeSB0byBjb252ZXJ0Ci1jYXJ0b29ucywgbGluZSBkcmF3aW5ncywgYW5kIG90aGVyIGltYWdlcyB0aGF0IGhhdmUgb25seSBhIGZldyBkaXN0aW5jdAotY29sb3JzLiAgR0lGIHdvcmtzIGdyZWF0IG9uIHRoZXNlLCBKUEVHIGRvZXMgbm90LiAgSWYgeW91IHdhbnQgdG8gY29udmVydCBhCi1HSUYgdG8gSlBFRywgeW91IHNob3VsZCBleHBlcmltZW50IHdpdGgKLS5CUiBjanBlZyAncwotLkIgXC1xdWFsaXR5Ci1hbmQKLS5CIFwtc21vb3RoCi1vcHRpb25zIHRvIGdldCBhIHNhdGlzZmFjdG9yeSBjb252ZXJzaW9uLgotLkIgXC1zbW9vdGggMTAKLW9yIHNvIGlzIG9mdGVuIGhlbHBmdWwuCi0uUFAKLUF2b2lkIHJ1bm5pbmcgYW4gaW1hZ2UgdGhyb3VnaCBhIHNlcmllcyBvZiBKUEVHIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24KLWN5Y2xlcy4gIEltYWdlIHF1YWxpdHkgbG9zcyB3aWxsIGFjY3VtdWxhdGU7IGFmdGVyIHRlbiBvciBzbyBjeWNsZXMgdGhlIGltYWdlCi1tYXkgYmUgbm90aWNlYWJseSB3b3JzZSB0aGFuIGl0IHdhcyBhZnRlciBvbmUgY3ljbGUuICBJdCdzIGJlc3QgdG8gdXNlIGEKLWxvc3NsZXNzIGZvcm1hdCB3aGlsZSBtYW5pcHVsYXRpbmcgYW4gaW1hZ2UsIHRoZW4gY29udmVydCB0byBKUEVHIGZvcm1hdCB3aGVuCi15b3UgYXJlIHJlYWR5IHRvIGZpbGUgdGhlIGltYWdlIGF3YXkuCi0uUFAKLVRoZQotLkIgXC1vcHRpbWl6ZQotb3B0aW9uIHRvCi0uQiBjanBlZwotaXMgd29ydGggdXNpbmcgd2hlbiB5b3UgYXJlIG1ha2luZyBhICJmaW5hbCIgdmVyc2lvbiBmb3IgcG9zdGluZyBvciBhcmNoaXZpbmcuCi1JdCdzIGFsc28gYSB3aW4gd2hlbiB5b3UgYXJlIHVzaW5nIGxvdyBxdWFsaXR5IHNldHRpbmdzIHRvIG1ha2UgdmVyeSBzbWFsbAotSlBFRyBmaWxlczsgdGhlIHBlcmNlbnRhZ2UgaW1wcm92ZW1lbnQgaXMgb2Z0ZW4gYSBsb3QgbW9yZSB0aGFuIGl0IGlzIG9uCi1sYXJnZXIgZmlsZXMuICAoQXQgcHJlc2VudCwKLS5CIFwtb3B0aW1pemUKLW1vZGUgaXMgYWx3YXlzIHNlbGVjdGVkIHdoZW4gZ2VuZXJhdGluZyBwcm9ncmVzc2l2ZSBKUEVHIGZpbGVzLikKLS5TSCBFTlZJUk9OTUVOVAotLlRQCi0uQiBKUEVHTUVNCi1JZiB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCwgaXRzIHZhbHVlIGlzIHRoZSBkZWZhdWx0IG1lbW9yeSBsaW1pdC4KLVRoZSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXMgZGVzY3JpYmVkIGZvciB0aGUKLS5CIFwtbWF4bWVtb3J5Ci1zd2l0Y2guCi0uQiBKUEVHTUVNCi1vdmVycmlkZXMgdGhlIGRlZmF1bHQgdmFsdWUgc3BlY2lmaWVkIHdoZW4gdGhlIHByb2dyYW0gd2FzIGNvbXBpbGVkLCBhbmQKLWl0c2VsZiBpcyBvdmVycmlkZGVuIGJ5IGFuIGV4cGxpY2l0Ci0uQlIgXC1tYXhtZW1vcnkgLgotLlNIIFNFRSBBTFNPCi0uQlIgZGpwZWcgKDEpLAotLkJSIGpwZWd0cmFuICgxKSwKLS5CUiByZGpwZ2NvbSAoMSksCi0uQlIgd3JqcGdjb20gKDEpCi0uYnIKLS5CUiBwcG0gKDUpLAotLkJSIHBnbSAoNSkKLS5icgotV2FsbGFjZSwgR3JlZ29yeSBLLiAgIlRoZSBKUEVHIFN0aWxsIFBpY3R1cmUgQ29tcHJlc3Npb24gU3RhbmRhcmQiLAotQ29tbXVuaWNhdGlvbnMgb2YgdGhlIEFDTSwgQXByaWwgMTk5MSAodm9sLiAzNCwgbm8uIDQpLCBwcC4gMzAtNDQuCi0uU0ggQVVUSE9SCi1JbmRlcGVuZGVudCBKUEVHIEdyb3VwCi0uU0ggQlVHUwotQXJpdGhtZXRpYyBjb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBmb3IgbGVnYWwgcmVhc29ucy4KLS5QUAotR0lGIGlucHV0IGZpbGVzIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLCB0byBhdm9pZCB0aGUgVW5pc3lzIExaVyBwYXRlbnQuCi1Vc2UgYSBVbmlzeXMtbGljZW5zZWQgcHJvZ3JhbSBpZiB5b3UgbmVlZCB0byByZWFkIGEgR0lGIGZpbGUuICAoQ29udmVyc2lvbgotb2YgR0lGIGZpbGVzIHRvIEpQRUcgaXMgdXN1YWxseSBhIGJhZCBpZGVhIGFueXdheS4pCi0uUFAKLU5vdCBhbGwgdmFyaWFudHMgb2YgQk1QIGFuZCBUYXJnYSBmaWxlIGZvcm1hdHMgYXJlIHN1cHBvcnRlZC4KLS5QUAotVGhlCi0uQiBcLXRhcmdhCi1zd2l0Y2ggaXMgbm90IGEgYnVnLCBpdCdzIGEgZmVhdHVyZS4gIChJdCB3b3VsZCBiZSBhIGJ1ZyBpZiB0aGUgVGFyZ2EgZm9ybWF0Ci1kZXNpZ25lcnMgaGFkIG5vdCBiZWVuIGNsdWVsZXNzLikKLS5QUAotU3RpbGwgbm90IGFzIGZhc3QgYXMgd2UnZCBsaWtlLgpkaWZmIC0tZ2l0IGEvY2pwZWcuYyBiL2NqcGVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZjVmNWIuLjAwMDAwMDAKLS0tIGEvY2pwZWcuYworKysgL2Rldi9udWxsCkBAIC0xLDY2OCArMCwwIEBACi0vKgotICogY2pwZWcuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi0gKiBUaGlzIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgZm9yIFNJTUQgZXh0ZW5zaW9uLgotICogTGFzdCBNb2RpZmllZCA6IEF1Z3VzdCAyMywgMjAwNQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgY29tbWFuZC1saW5lIHVzZXIgaW50ZXJmYWNlIGZvciB0aGUgSlBFRyBjb21wcmVzc29yLgotICogSXQgc2hvdWxkIHdvcmsgb24gYW55IHN5c3RlbSB3aXRoIFVuaXgtIG9yIE1TLURPUy1zdHlsZSBjb21tYW5kIGxpbmVzLgotICoKLSAqIFR3byBkaWZmZXJlbnQgY29tbWFuZCBsaW5lIHN0eWxlcyBhcmUgcGVybWl0dGVkLCBkZXBlbmRpbmcgb24gdGhlCi0gKiBjb21waWxlLXRpbWUgc3dpdGNoIFRXT19GSUxFX0NPTU1BTkRMSU5FOgotICoJY2pwZWcgW29wdGlvbnNdICBpbnB1dGZpbGUgb3V0cHV0ZmlsZQotICoJY2pwZWcgW29wdGlvbnNdICBbaW5wdXRmaWxlXQotICogSW4gdGhlIHNlY29uZCBzdHlsZSwgb3V0cHV0IGlzIGFsd2F5cyB0byBzdGFuZGFyZCBvdXRwdXQsIHdoaWNoIHlvdSdkCi0gKiBub3JtYWxseSByZWRpcmVjdCB0byBhIGZpbGUgb3IgcGlwZSB0byBzb21lIG90aGVyIHByb2dyYW0uICBJbnB1dCBpcwotICogZWl0aGVyIGZyb20gYSBuYW1lZCBmaWxlIG9yIGZyb20gc3RhbmRhcmQgaW5wdXQgKHR5cGljYWxseSByZWRpcmVjdGVkKS4KLSAqIFRoZSBzZWNvbmQgc3R5bGUgaXMgY29udmVuaWVudCBvbiBVbml4IGJ1dCBpcyB1bmhlbHBmdWwgb24gc3lzdGVtcyB0aGF0Ci0gKiBkb24ndCBzdXBwb3J0IHBpcGVzLiAgQWxzbywgeW91IE1VU1QgdXNlIHRoZSBmaXJzdCBzdHlsZSBpZiB5b3VyIHN5c3RlbQotICogZG9lc24ndCBkbyBiaW5hcnkgSS9PIHRvIHN0ZGluL3N0ZG91dC4KLSAqIFRvIHNpbXBsaWZ5IHNjcmlwdCB3cml0aW5nLCB0aGUgIi1vdXRmaWxlIiBzd2l0Y2ggaXMgcHJvdmlkZWQuICBUaGUgc3ludGF4Ci0gKgljanBlZyBbb3B0aW9uc10gIC1vdXRmaWxlIG91dHB1dGZpbGUgIGlucHV0ZmlsZQotICogd29ya3MgcmVnYXJkbGVzcyBvZiB3aGljaCBjb21tYW5kIGxpbmUgc3R5bGUgaXMgdXNlZC4KLSAqLwotCi0jaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLwotI2luY2x1ZGUgImp2ZXJzaW9uLmgiCQkvKiBmb3IgdmVyc2lvbiBtZXNzYWdlICovCi0KLSNpZmRlZiBVU0VfQ0NPTU1BTkQJCS8qIGNvbW1hbmQtbGluZSByZWFkZXIgZm9yIE1hY2ludG9zaCAqLwotI2lmZGVmIF9fTVdFUktTX18KLSNpbmNsdWRlIDxTSU9VWC5oPiAgICAgICAgICAgICAgLyogTWV0cm93ZXJrcyBuZWVkcyB0aGlzICovCi0jaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogLi4uIGFuZCB0aGlzICovCi0jZW5kaWYKLSNpZmRlZiBUSElOS19DCi0jaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogVGhpbmsgZGVjbGFyZXMgaXQgaGVyZSAqLwotI2VuZGlmCi0jZW5kaWYKLQotCi0vKiBDcmVhdGUgdGhlIGFkZC1vbiBtZXNzYWdlIHN0cmluZyB0YWJsZS4gKi8KLQotI2RlZmluZSBKTUVTU0FHRShjb2RlLHN0cmluZykJc3RyaW5nICwKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZGpwZWdfbWVzc2FnZV90YWJsZVtdID0gewotI2luY2x1ZGUgImNkZXJyb3IuaCIKLSAgTlVMTAotfTsKLQotCi0vKgotICogVGhpcyByb3V0aW5lIGRldGVybWluZXMgd2hhdCBmb3JtYXQgdGhlIGlucHV0IGZpbGUgaXMsCi0gKiBhbmQgc2VsZWN0cyB0aGUgYXBwcm9wcmlhdGUgaW5wdXQtcmVhZGluZyBtb2R1bGUuCi0gKgotICogVG8gZGV0ZXJtaW5lIHdoaWNoIGZhbWlseSBvZiBpbnB1dCBmb3JtYXRzIHRoZSBmaWxlIGJlbG9uZ3MgdG8sCi0gKiB3ZSBtYXkgbG9vayBvbmx5IGF0IHRoZSBmaXJzdCBieXRlIG9mIHRoZSBmaWxlLCBzaW5jZSBDIGRvZXMgbm90Ci0gKiBndWFyYW50ZWUgdGhhdCBtb3JlIHRoYW4gb25lIGNoYXJhY3RlciBjYW4gYmUgcHVzaGVkIGJhY2sgd2l0aCB1bmdldGMuCi0gKiBMb29raW5nIGF0IGFkZGl0aW9uYWwgYnl0ZXMgd291bGQgcmVxdWlyZSBvbmUgb2YgdGhlc2UgYXBwcm9hY2hlczoKLSAqICAgICAxKSBhc3N1bWUgd2UgY2FuIGZzZWVrKCkgdGhlIGlucHV0IGZpbGUgKGZhaWxzIGZvciBwaXBlZCBpbnB1dCk7Ci0gKiAgICAgMikgYXNzdW1lIHdlIGNhbiBwdXNoIGJhY2sgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIgKHdvcmtzIGluCi0gKiAgICAgICAgc29tZSBDIGltcGxlbWVudGF0aW9ucywgYnV0IHVucG9ydGFibGUpOwotICogICAgIDMpIHByb3ZpZGUgb3VyIG93biBidWZmZXJpbmcgKGJyZWFrcyBpbnB1dCByZWFkZXJzIHRoYXQgd2FudCB0byB1c2UKLSAqICAgICAgICBzdGRpbyBkaXJlY3RseSwgc3VjaCBhcyB0aGUgUkxFIGxpYnJhcnkpOwotICogb3IgIDQpIGRvbid0IHB1dCBiYWNrIHRoZSBkYXRhLCBhbmQgbW9kaWZ5IHRoZSBpbnB1dF9pbml0IG1ldGhvZHMgdG8gYXNzdW1lCi0gKiAgICAgICAgdGhleSBzdGFydCByZWFkaW5nIGFmdGVyIHRoZSBzdGFydCBvZiBmaWxlIChhbHNvIGJyZWFrcyBSTEUgbGlicmFyeSkuCi0gKiAjMSBpcyBhdHRyYWN0aXZlIGZvciBNUy1ET1MgYnV0IGlzIHVudGVuYWJsZSBvbiBVbml4LgotICoKLSAqIFRoZSBtb3N0IHBvcnRhYmxlIHNvbHV0aW9uIGZvciBmaWxlIHR5cGVzIHRoYXQgY2FuJ3QgYmUgaWRlbnRpZmllZCBieSB0aGVpcgotICogZmlyc3QgYnl0ZSBpcyB0byBtYWtlIHRoZSB1c2VyIHRlbGwgdXMgd2hhdCB0aGV5IGFyZS4gIFRoaXMgaXMgYWxzbyB0aGUKLSAqIG9ubHkgYXBwcm9hY2ggZm9yICJyYXciIGZpbGUgdHlwZXMgdGhhdCBjb250YWluIG9ubHkgYXJiaXRyYXJ5IHZhbHVlcy4KLSAqIFdlIHByZXNlbnRseSBhcHBseSB0aGlzIG1ldGhvZCBmb3IgVGFyZ2EgZmlsZXMuICBNb3N0IG9mIHRoZSB0aW1lIFRhcmdhCi0gKiBmaWxlcyBzdGFydCB3aXRoIDB4MDAsIHNvIHdlIHJlY29nbml6ZSB0aGF0IGNhc2UuICBQb3RlbnRpYWxseSwgaG93ZXZlciwKLSAqIGEgVGFyZ2EgZmlsZSBjb3VsZCBzdGFydCB3aXRoIGFueSBieXRlIHZhbHVlIChieXRlIDAgaXMgdGhlIGxlbmd0aCBvZiB0aGUKLSAqIHNlbGRvbS11c2VkIElEIGZpZWxkKSwgc28gd2UgcHJvdmlkZSBhIHN3aXRjaCB0byBmb3JjZSBUYXJnYSBpbnB1dCBtb2RlLgotICovCi0KLXN0YXRpYyBib29sZWFuIGlzX3RhcmdhOwkvKiByZWNvcmRzIHVzZXIgLXRhcmdhIHN3aXRjaCAqLwotCi0KLUxPQ0FMKGNqcGVnX3NvdXJjZV9wdHIpCi1zZWxlY3RfZmlsZV90eXBlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkKLXsKLSAgaW50IGM7Ci0KLSAgaWYgKGlzX3RhcmdhKSB7Ci0jaWZkZWYgVEFSR0FfU1VQUE9SVEVECi0gICAgcmV0dXJuIGppbml0X3JlYWRfdGFyZ2EoY2luZm8pOwotI2Vsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9OT1RDT01QKTsKLSNlbmRpZgotICB9Ci0KLSAgaWYgKChjID0gZ2V0YyhpbmZpbGUpKSA9PSBFT0YpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FTVBUWSk7Ci0gIGlmICh1bmdldGMoYywgaW5maWxlKSA9PSBFT0YpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9VTkdFVENfRkFJTEVEKTsKLQotICBzd2l0Y2ggKGMpIHsKLSNpZmRlZiBCTVBfU1VQUE9SVEVECi0gIGNhc2UgJ0InOgotICAgIHJldHVybiBqaW5pdF9yZWFkX2JtcChjaW5mbyk7Ci0jZW5kaWYKLSNpZmRlZiBHSUZfU1VQUE9SVEVECi0gIGNhc2UgJ0cnOgotICAgIHJldHVybiBqaW5pdF9yZWFkX2dpZihjaW5mbyk7Ci0jZW5kaWYKLSNpZmRlZiBQUE1fU1VQUE9SVEVECi0gIGNhc2UgJ1AnOgotICAgIHJldHVybiBqaW5pdF9yZWFkX3BwbShjaW5mbyk7Ci0jZW5kaWYKLSNpZmRlZiBSTEVfU1VQUE9SVEVECi0gIGNhc2UgJ1InOgotICAgIHJldHVybiBqaW5pdF9yZWFkX3JsZShjaW5mbyk7Ci0jZW5kaWYKLSNpZmRlZiBUQVJHQV9TVVBQT1JURUQKLSAgY2FzZSAweDAwOgotICAgIHJldHVybiBqaW5pdF9yZWFkX3RhcmdhKGNpbmZvKTsKLSNlbmRpZgotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVU5LTk9XTl9GT1JNQVQpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIE5VTEw7CQkJLyogc3VwcHJlc3MgY29tcGlsZXIgd2FybmluZ3MgKi8KLX0KLQotCi0vKgotICogQXJndW1lbnQtcGFyc2luZyBjb2RlLgotICogVGhlIHN3aXRjaCBwYXJzZXIgaXMgZGVzaWduZWQgdG8gYmUgdXNlZnVsIHdpdGggRE9TLXN0eWxlIGNvbW1hbmQgbGluZQotICogc3ludGF4LCBpZSwgaW50ZXJtaXhlZCBzd2l0Y2hlcyBhbmQgZmlsZSBuYW1lcywgd2hlcmUgb25seSB0aGUgc3dpdGNoZXMKLSAqIHRvIHRoZSBsZWZ0IG9mIGEgZ2l2ZW4gZmlsZSBuYW1lIGFmZmVjdCBwcm9jZXNzaW5nIG9mIHRoYXQgZmlsZS4KLSAqIFRoZSBtYWluIHByb2dyYW0gaW4gdGhpcyBmaWxlIGRvZXNuJ3QgYWN0dWFsbHkgdXNlIHRoaXMgY2FwYWJpbGl0eS4uLgotICovCi0KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBwcm9nbmFtZTsJLyogcHJvZ3JhbSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcyAqLwotc3RhdGljIGNoYXIgKiBvdXRmaWxlbmFtZTsJLyogZm9yIC1vdXRmaWxlIHN3aXRjaCAqLwotCi0KLUxPQ0FMKHZvaWQpCi11c2FnZSAodm9pZCkKLS8qIGNvbXBsYWluIGFib3V0IGJhZCBjb21tYW5kIGxpbmUgKi8KLXsKLSAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgW3N3aXRjaGVzXSAiLCBwcm9nbmFtZSk7Ci0jaWZkZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKLSAgZnByaW50ZihzdGRlcnIsICJpbnB1dGZpbGUgb3V0cHV0ZmlsZVxuIik7Ci0jZWxzZQotICBmcHJpbnRmKHN0ZGVyciwgIltpbnB1dGZpbGVdXG4iKTsKLSNlbmRpZgotCi0gIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgKG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCk6XG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1xdWFsaXR5IE4gICAgIENvbXByZXNzaW9uIHF1YWxpdHkgKDAuLjEwMDsgNS05NSBpcyB1c2VmdWwgcmFuZ2UpXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1ncmF5c2NhbGUgICAgIENyZWF0ZSBtb25vY2hyb21lIEpQRUcgZmlsZVxuIik7Ci0jaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtb3B0aW1pemUgICAgICBPcHRpbWl6ZSBIdWZmbWFuIHRhYmxlIChzbWFsbGVyIGZpbGUsIGJ1dCBzbG93IGNvbXByZXNzaW9uKVxuIik7Ci0jZW5kaWYKLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXByb2dyZXNzaXZlICAgQ3JlYXRlIHByb2dyZXNzaXZlIEpQRUcgZmlsZVxuIik7Ci0jZW5kaWYKLSNpZmRlZiBUQVJHQV9TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC10YXJnYSAgICAgICAgIElucHV0IGZpbGUgaXMgVGFyZ2EgZm9ybWF0ICh1c3VhbGx5IG5vdCBuZWVkZWQpXG4iKTsKLSNlbmRpZgotICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIGZvciBhZHZhbmNlZCB1c2VyczpcbiIpOwotI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1kY3QgaW50ICAgICAgIFVzZSBpbnRlZ2VyIERDVCBtZXRob2Qlc1xuIiwKLQkgIChKRENUX0RFRkFVTFQgPT0gSkRDVF9JU0xPVyA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtZGN0IGZhc3QgICAgICBVc2UgZmFzdCBpbnRlZ2VyIERDVCAobGVzcyBhY2N1cmF0ZSklc1xuIiwKLQkgIChKRENUX0RFRkFVTFQgPT0gSkRDVF9JRkFTVCA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtZGN0IGZsb2F0ICAgICBVc2UgZmxvYXRpbmctcG9pbnQgRENUIG1ldGhvZCVzXG4iLAotCSAgKEpEQ1RfREVGQVVMVCA9PSBKRENUX0ZMT0FUID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKLSNlbmRpZgotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJlc3RhcnQgTiAgICAgU2V0IHJlc3RhcnQgaW50ZXJ2YWwgaW4gcm93cywgb3IgaW4gYmxvY2tzIHdpdGggQlxuIik7Ci0jaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXNtb290aCBOICAgICAgU21vb3RoIGRpdGhlcmVkIGlucHV0IChOPTEuLjEwMCBpcyBzdHJlbmd0aClcbiIpOwotI2VuZGlmCi0gIGZwcmludGYoc3RkZXJyLCAiICAtbWF4bWVtb3J5IE4gICBNYXhpbXVtIG1lbW9yeSB0byB1c2UgKGluIGtieXRlcylcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW91dGZpbGUgbmFtZSAgU3BlY2lmeSBuYW1lIGZvciBvdXRwdXQgZmlsZVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtdmVyYm9zZSAgb3IgIC1kZWJ1ZyAgIEVtaXQgZGVidWcgb3V0cHV0XG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3Igd2l6YXJkczpcbiIpOwotI2lmZGVmIENfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWFyaXRobWV0aWMgICAgVXNlIGFyaXRobWV0aWMgY29kaW5nXG4iKTsKLSNlbmRpZgotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWJhc2VsaW5lICAgICAgRm9yY2UgYmFzZWxpbmUgcXVhbnRpemF0aW9uIHRhYmxlc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtcXRhYmxlcyBmaWxlICBVc2UgcXVhbnRpemF0aW9uIHRhYmxlcyBnaXZlbiBpbiBmaWxlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1xc2xvdHMgTlssLi4uXSAgICBTZXQgY29tcG9uZW50IHF1YW50aXphdGlvbiB0YWJsZXNcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXNhbXBsZSBIeFZbLC4uLl0gIFNldCBjb21wb25lbnQgc2FtcGxpbmcgZmFjdG9yc1xuIik7Ci0jaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtc2NhbnMgZmlsZSAgICBDcmVhdGUgbXVsdGktc2NhbiBKUEVHIHBlciBzY3JpcHQgZmlsZVxuIik7Ci0jZW5kaWYKLSAgZXhpdChFWElUX0ZBSUxVUkUpOwotfQotCi0KLSNpZm5kZWYgSlNJTURfTU9ERUlORk9fTk9UX1NVUFBPUlRFRAotCi1MT0NBTCh2b2lkKQotcHJpbnRfc2ltZF9pbmZvIChGSUxFICogZmlsZSwgY2hhciAqIGxhYmVsc3RyLCB1bnNpZ25lZCBpbnQgc2ltZCkKLXsKLSAgZnByaW50ZihmaWxlLCAiJXMlcyVzJXMlcyVzXG4iLCBsYWJlbHN0ciwKLQkgIHNpbWQgJiBKU0lNRF9NTVggICA/ICIgTU1YIiAgICA6ICIiLAotCSAgc2ltZCAmIEpTSU1EXzNETk9XID8gIiAzRE5vdyEiIDogIiIsCi0JICBzaW1kICYgSlNJTURfU1NFICAgPyAiIFNTRSIgICAgOiAiIiwKLQkgIHNpbWQgJiBKU0lNRF9TU0UyICA/ICIgU1NFMiIgICA6ICIiLAotCSAgc2ltZCA9PSBKU0lNRF9OT05FID8gIiBOT05FIiAgIDogIiIpOwotfQotCi0jZW5kaWYgLyogIUpTSU1EX01PREVJTkZPX05PVF9TVVBQT1JURUQgKi8KLQotCi1MT0NBTChpbnQpCi1wYXJzZV9zd2l0Y2hlcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBhcmdjLCBjaGFyICoqYXJndiwKLQkJaW50IGxhc3RfZmlsZV9hcmdfc2VlbiwgYm9vbGVhbiBmb3JfcmVhbCkKLS8qIFBhcnNlIG9wdGlvbmFsIHN3aXRjaGVzLgotICogUmV0dXJucyBhcmd2W10gaW5kZXggb2YgZmlyc3QgZmlsZS1uYW1lIGFyZ3VtZW50ICg9PSBhcmdjIGlmIG5vbmUpLgotICogQW55IGZpbGUgbmFtZXMgd2l0aCBpbmRleGVzIDw9IGxhc3RfZmlsZV9hcmdfc2VlbiBhcmUgaWdub3JlZDsKLSAqIHRoZXkgaGF2ZSBwcmVzdW1hYmx5IGJlZW4gcHJvY2Vzc2VkIGluIGEgcHJldmlvdXMgaXRlcmF0aW9uLgotICogKFBhc3MgMCBmb3IgbGFzdF9maWxlX2FyZ19zZWVuIG9uIHRoZSBmaXJzdCBvciBvbmx5IGl0ZXJhdGlvbi4pCi0gKiBmb3JfcmVhbCBpcyBGQUxTRSBvbiB0aGUgZmlyc3QgKGR1bW15KSBwYXNzOyB3ZSBtYXkgc2tpcCBhbnkgZXhwZW5zaXZlCi0gKiBwcm9jZXNzaW5nLgotICovCi17Ci0gIGludCBhcmduOwotICBjaGFyICogYXJnOwotICBpbnQgcXVhbGl0eTsJCQkvKiAtcXVhbGl0eSBwYXJhbWV0ZXIgKi8KLSAgaW50IHFfc2NhbGVfZmFjdG9yOwkJLyogc2NhbGluZyBwZXJjZW50YWdlIGZvciAtcXRhYmxlcyAqLwotICBib29sZWFuIGZvcmNlX2Jhc2VsaW5lOwotICBib29sZWFuIHNpbXBsZV9wcm9ncmVzc2l2ZTsKLSAgY2hhciAqIHF0YWJsZWZpbGUgPSBOVUxMOwkvKiBzYXZlcyAtcXRhYmxlcyBmaWxlbmFtZSBpZiBhbnkgKi8KLSAgY2hhciAqIHFzbG90c2FyZyA9IE5VTEw7CS8qIHNhdmVzIC1xc2xvdHMgcGFybSBpZiBhbnkgKi8KLSAgY2hhciAqIHNhbXBsZWFyZyA9IE5VTEw7CS8qIHNhdmVzIC1zYW1wbGUgcGFybSBpZiBhbnkgKi8KLSAgY2hhciAqIHNjYW5zYXJnID0gTlVMTDsJLyogc2F2ZXMgLXNjYW5zIHBhcm0gaWYgYW55ICovCi0KLSAgLyogU2V0IHVwIGRlZmF1bHQgSlBFRyBwYXJhbWV0ZXJzLiAqLwotICAvKiBOb3RlIHRoYXQgZGVmYXVsdCAtcXVhbGl0eSBsZXZlbCBuZWVkIG5vdCwgYW5kIGRvZXMgbm90LAotICAgKiBtYXRjaCB0aGUgZGVmYXVsdCBzY2FsaW5nIGZvciBhbiBleHBsaWNpdCAtcXRhYmxlcyBhcmd1bWVudC4KLSAgICovCi0gIHF1YWxpdHkgPSA3NTsJCQkvKiBkZWZhdWx0IC1xdWFsaXR5IHZhbHVlICovCi0gIHFfc2NhbGVfZmFjdG9yID0gMTAwOwkJLyogZGVmYXVsdCB0byBubyBzY2FsaW5nIGZvciAtcXRhYmxlcyAqLwotICBmb3JjZV9iYXNlbGluZSA9IEZBTFNFOwkvKiBieSBkZWZhdWx0LCBhbGxvdyAxNi1iaXQgcXVhbnRpemVycyAqLwotICBzaW1wbGVfcHJvZ3Jlc3NpdmUgPSBGQUxTRTsKLSAgaXNfdGFyZ2EgPSBGQUxTRTsKLSAgb3V0ZmlsZW5hbWUgPSBOVUxMOwotICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA9IDA7Ci0KLSAgLyogU2NhbiBjb21tYW5kIGxpbmUgb3B0aW9ucywgYWRqdXN0IHBhcmFtZXRlcnMgKi8KLQotICBmb3IgKGFyZ24gPSAxOyBhcmduIDwgYXJnYzsgYXJnbisrKSB7Ci0gICAgYXJnID0gYXJndlthcmduXTsKLSAgICBpZiAoKmFyZyAhPSAnLScpIHsKLSAgICAgIC8qIE5vdCBhIHN3aXRjaCwgbXVzdCBiZSBhIGZpbGUgbmFtZSBhcmd1bWVudCAqLwotICAgICAgaWYgKGFyZ24gPD0gbGFzdF9maWxlX2FyZ19zZWVuKSB7Ci0Jb3V0ZmlsZW5hbWUgPSBOVUxMOwkvKiAtb3V0ZmlsZSBhcHBsaWVzIHRvIGp1c3Qgb25lIGlucHV0IGZpbGUgKi8KLQljb250aW51ZTsJCS8qIGlnbm9yZSB0aGlzIG5hbWUgaWYgcHJldmlvdXNseSBwcm9jZXNzZWQgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwkJCS8qIGVsc2UgZG9uZSBwYXJzaW5nIHN3aXRjaGVzICovCi0gICAgfQotICAgIGFyZysrOwkJCS8qIGFkdmFuY2UgcGFzdCBzd2l0Y2ggbWFya2VyIGNoYXJhY3RlciAqLwotCi0gICAgaWYgKGtleW1hdGNoKGFyZywgImFyaXRobWV0aWMiLCAxKSkgewotICAgICAgLyogVXNlIGFyaXRobWV0aWMgY29kaW5nLiAqLwotI2lmZGVmIENfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRAotICAgICAgY2luZm8tPmFyaXRoX2NvZGUgPSBUUlVFOwotI2Vsc2UKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBhcml0aG1ldGljIGNvZGluZyBub3Qgc3VwcG9ydGVkXG4iLAotCSAgICAgIHByb2duYW1lKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSNlbmRpZgotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJiYXNlbGluZSIsIDEpKSB7Ci0gICAgICAvKiBGb3JjZSBiYXNlbGluZS1jb21wYXRpYmxlIG91dHB1dCAoOC1iaXQgcXVhbnRpemVyIHZhbHVlcykuICovCi0gICAgICBmb3JjZV9iYXNlbGluZSA9IFRSVUU7Ci0KLSNpZm5kZWYgSlNJTURfTUFTS0ZVTkNfTk9UX1NVUFBPUlRFRAotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibm9zaW1kIiAsIDQpKSB7Ci0gICAgICBqcGVnX3NpbWRfbWFzaygoal9jb21tb25fcHRyKSBjaW5mbywgSlNJTURfTk9ORSwgSlNJTURfQUxMKTsKLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm5vbW14IiAgLCAzKSkgewotICAgICAganBlZ19zaW1kX21hc2soKGpfY29tbW9uX3B0cikgY2luZm8sIEpTSU1EX05PTkUsIEpTSU1EX01NWCk7Ci0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJubzNkbm93IiwgMykpIHsKLSAgICAgIGpwZWdfc2ltZF9tYXNrKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKU0lNRF9OT05FLCBKU0lNRF8zRE5PVyk7Ci0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJub3NzZSIgICwgNCkpIHsKLSAgICAgIGpwZWdfc2ltZF9tYXNrKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKU0lNRF9OT05FLCBKU0lNRF9TU0UpOwotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibm9zc2UyIiAsIDYpKSB7Ci0gICAgICBqcGVnX3NpbWRfbWFzaygoal9jb21tb25fcHRyKSBjaW5mbywgSlNJTURfTk9ORSwgSlNJTURfU1NFMik7Ci0jZW5kaWYgLyogIUpTSU1EX01BU0tGVU5DX05PVF9TVVBQT1JURUQgKi8KLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZGN0IiwgMikpIHsKLSAgICAgIC8qIFNlbGVjdCBEQ1QgYWxnb3JpdGhtLiAqLwotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJpbnQiLCAxKSkgewotCWNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9JU0xPVzsKLSAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImZhc3QiLCAyKSkgewotCWNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9JRkFTVDsKLSAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImZsb2F0IiwgMikpIHsKLQljaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfRkxPQVQ7Ci0gICAgICB9IGVsc2UKLQl1c2FnZSgpOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJkZWJ1ZyIsIDEpIHx8IGtleW1hdGNoKGFyZywgInZlcmJvc2UiLCAxKSkgewotICAgICAgLyogRW5hYmxlIGRlYnVnIHByaW50b3V0cy4gKi8KLSAgICAgIC8qIE9uIGZpcnN0IC1kLCBwcmludCB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uICovCi0gICAgICBzdGF0aWMgYm9vbGVhbiBwcmludGVkX3ZlcnNpb24gPSBGQUxTRTsKLQotICAgICAgaWYgKCEgcHJpbnRlZF92ZXJzaW9uKSB7Ci0JZnByaW50ZihzdGRlcnIsICJJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgQ0pQRUcsIHZlcnNpb24gJXNcbiVzXG4iLAotCQlKVkVSU0lPTiwgSkNPUFlSSUdIVCk7Ci0JZnByaW50ZihzdGRlcnIsCi0JCSJcbng4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeSwgdmVyc2lvbiAlc1xuXG4iLAotCQlKUEVHX1NJTURFWFRfVkVSX1NUUik7Ci0jaWZuZGVmIEpTSU1EX01PREVJTkZPX05PVF9TVVBQT1JURUQKLQlwcmludF9zaW1kX2luZm8oc3RkZXJyLCAiU0lNRCBpbnN0cnVjdGlvbnMgc3VwcG9ydGVkIGJ5IHRoZSBzeXN0ZW0gOiIsCi0JCQlqcGVnX3NpbWRfc3VwcG9ydChOVUxMKSk7Ci0KLQlmcHJpbnRmKHN0ZGVyciwgIlxuICAgICAgPT09IFNJTUQgT3BlcmF0aW9uIE1vZGVzID09PVxuIik7Ci0jaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotCXByaW50X3NpbWRfaW5mbyhzdGRlcnIsICJBY2N1cmF0ZSBpbnRlZ2VyIERDVCAgKC1kY3QgaW50KSAgIDoiLAotCQkJanBlZ19zaW1kX2ZvcndhcmRfZGN0KGNpbmZvLCBKRENUX0lTTE9XKSk7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0JcHJpbnRfc2ltZF9pbmZvKHN0ZGVyciwgIkZhc3QgaW50ZWdlciBEQ1QgICAgICAoLWRjdCBmYXN0KSAgOiIsCi0JCQlqcGVnX3NpbWRfZm9yd2FyZF9kY3QoY2luZm8sIEpEQ1RfSUZBU1QpKTsKLSNlbmRpZgotI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLQlwcmludF9zaW1kX2luZm8oc3RkZXJyLCAiRmxvYXRpbmctcG9pbnQgRENUICAgICgtZGN0IGZsb2F0KSA6IiwKLQkJCWpwZWdfc2ltZF9mb3J3YXJkX2RjdChjaW5mbywgSkRDVF9GTE9BVCkpOwotI2VuZGlmCi0JcHJpbnRfc2ltZF9pbmZvKHN0ZGVyciwgIkRvd25zYW1wbGluZyAoLXNhbXBsZSAyeDIgb3IgMngxKSAgOiIsCi0JCQlqcGVnX3NpbWRfZG93bnNhbXBsZXIoY2luZm8pKTsKLQlwcmludF9zaW1kX2luZm8oc3RkZXJyLCAiQ29sb3JzcGFjZSBjb252ZXJzaW9uIChSR0ItPllDYkNyKSA6IiwKLQkJCWpwZWdfc2ltZF9jb2xvcl9jb252ZXJ0ZXIoY2luZm8pKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0jZW5kaWYgLyogIUpTSU1EX01PREVJTkZPX05PVF9TVVBQT1JURUQgKi8KLQlwcmludGVkX3ZlcnNpb24gPSBUUlVFOwotICAgICAgfQotICAgICAgY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwrKzsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZ3JheXNjYWxlIiwgMikgfHwga2V5bWF0Y2goYXJnLCAiZ3JleXNjYWxlIiwyKSkgewotICAgICAgLyogRm9yY2UgYSBtb25vY2hyb21lIEpQRUcgZmlsZSB0byBiZSBnZW5lcmF0ZWQuICovCi0gICAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGNpbmZvLCBKQ1NfR1JBWVNDQUxFKTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibWF4bWVtb3J5IiwgMykpIHsKLSAgICAgIC8qIE1heGltdW0gbWVtb3J5IGluIEtiIChvciBNYiB3aXRoICdtJykuICovCi0gICAgICBsb25nIGx2YWw7Ci0gICAgICBjaGFyIGNoID0gJ3gnOwotCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlbGQlYyIsICZsdmFsLCAmY2gpIDwgMSkKLQl1c2FnZSgpOwotICAgICAgaWYgKGNoID09ICdtJyB8fCBjaCA9PSAnTScpCi0JbHZhbCAqPSAxMDAwTDsKLSAgICAgIGNpbmZvLT5tZW0tPm1heF9tZW1vcnlfdG9fdXNlID0gbHZhbCAqIDEwMDBMOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJvcHRpbWl6ZSIsIDEpIHx8IGtleW1hdGNoKGFyZywgIm9wdGltaXNlIiwgMSkpIHsKLSAgICAgIC8qIEVuYWJsZSBlbnRyb3B5IHBhcm0gb3B0aW1pemF0aW9uLiAqLwotI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAotICAgICAgY2luZm8tPm9wdGltaXplX2NvZGluZyA9IFRSVUU7Ci0jZWxzZQotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIGVudHJvcHkgb3B0aW1pemF0aW9uIHdhcyBub3QgY29tcGlsZWRcbiIsCi0JICAgICAgcHJvZ25hbWUpOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotI2VuZGlmCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm91dGZpbGUiLCA0KSkgewotICAgICAgLyogU2V0IG91dHB1dCBmaWxlIG5hbWUuICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBvdXRmaWxlbmFtZSA9IGFyZ3ZbYXJnbl07CS8qIHNhdmUgaXQgYXdheSBmb3IgbGF0ZXIgdXNlICovCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInByb2dyZXNzaXZlIiwgMSkpIHsKLSAgICAgIC8qIFNlbGVjdCBzaW1wbGUgcHJvZ3Jlc3NpdmUgbW9kZS4gKi8KLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICAgICAgc2ltcGxlX3Byb2dyZXNzaXZlID0gVFJVRTsKLSAgICAgIC8qIFdlIG11c3QgcG9zdHBvbmUgZXhlY3V0aW9uIHVudGlsIG51bV9jb21wb25lbnRzIGlzIGtub3duLiAqLwotI2Vsc2UKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBwcm9ncmVzc2l2ZSBvdXRwdXQgd2FzIG5vdCBjb21waWxlZFxuIiwKLQkgICAgICBwcm9nbmFtZSk7Ci0gICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0jZW5kaWYKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicXVhbGl0eSIsIDEpKSB7Ci0gICAgICAvKiBRdWFsaXR5IGZhY3RvciAocXVhbnRpemF0aW9uIHRhYmxlIHNjYWxpbmcgZmFjdG9yKS4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVkIiwgJnF1YWxpdHkpICE9IDEpCi0JdXNhZ2UoKTsKLSAgICAgIC8qIENoYW5nZSBzY2FsZSBmYWN0b3IgaW4gY2FzZSAtcXRhYmxlcyBpcyBwcmVzZW50LiAqLwotICAgICAgcV9zY2FsZV9mYWN0b3IgPSBqcGVnX3F1YWxpdHlfc2NhbGluZyhxdWFsaXR5KTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicXNsb3RzIiwgMikpIHsKLSAgICAgIC8qIFF1YW50aXphdGlvbiB0YWJsZSBzbG90IG51bWJlcnMuICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBxc2xvdHNhcmcgPSBhcmd2W2FyZ25dOwotICAgICAgLyogTXVzdCBkZWxheSBzZXR0aW5nIHFzbG90cyB1bnRpbCBhZnRlciB3ZSBoYXZlIHByb2Nlc3NlZCBhbnkKLSAgICAgICAqIGNvbG9yc3BhY2UtZGV0ZXJtaW5pbmcgc3dpdGNoZXMsIHNpbmNlIGpwZWdfc2V0X2NvbG9yc3BhY2Ugc2V0cwotICAgICAgICogZGVmYXVsdCBxdWFudCB0YWJsZSBudW1iZXJzLgotICAgICAgICovCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInF0YWJsZXMiLCAyKSkgewotICAgICAgLyogUXVhbnRpemF0aW9uIHRhYmxlcyBmZXRjaGVkIGZyb20gZmlsZS4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIHF0YWJsZWZpbGUgPSBhcmd2W2FyZ25dOwotICAgICAgLyogV2UgcG9zdHBvbmUgYWN0dWFsbHkgcmVhZGluZyB0aGUgZmlsZSBpbiBjYXNlIC1xdWFsaXR5IGNvbWVzIGxhdGVyLiAqLwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJyZXN0YXJ0IiwgMSkpIHsKLSAgICAgIC8qIFJlc3RhcnQgaW50ZXJ2YWwgaW4gTUNVIHJvd3MgKG9yIGluIE1DVXMgd2l0aCAnYicpLiAqLwotICAgICAgbG9uZyBsdmFsOwotICAgICAgY2hhciBjaCA9ICd4JzsKLQotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWxkJWMiLCAmbHZhbCwgJmNoKSA8IDEpCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChsdmFsIDwgMCB8fCBsdmFsID4gNjU1MzVMKQotCXVzYWdlKCk7Ci0gICAgICBpZiAoY2ggPT0gJ2InIHx8IGNoID09ICdCJykgewotCWNpbmZvLT5yZXN0YXJ0X2ludGVydmFsID0gKHVuc2lnbmVkIGludCkgbHZhbDsKLQljaW5mby0+cmVzdGFydF9pbl9yb3dzID0gMDsgLyogZWxzZSBwcmlvciAnLXJlc3RhcnQgbicgb3ZlcnJpZGVzIG1lICovCi0gICAgICB9IGVsc2UgewotCWNpbmZvLT5yZXN0YXJ0X2luX3Jvd3MgPSAoaW50KSBsdmFsOwotCS8qIHJlc3RhcnRfaW50ZXJ2YWwgd2lsbCBiZSBjb21wdXRlZCBkdXJpbmcgc3RhcnR1cCAqLwotICAgICAgfQotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJzYW1wbGUiLCAyKSkgewotICAgICAgLyogU2V0IHNhbXBsaW5nIGZhY3RvcnMuICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBzYW1wbGVhcmcgPSBhcmd2W2FyZ25dOwotICAgICAgLyogTXVzdCBkZWxheSBzZXR0aW5nIHNhbXBsZSBmYWN0b3JzIHVudGlsIGFmdGVyIHdlIGhhdmUgcHJvY2Vzc2VkIGFueQotICAgICAgICogY29sb3JzcGFjZS1kZXRlcm1pbmluZyBzd2l0Y2hlcywgc2luY2UganBlZ19zZXRfY29sb3JzcGFjZSBzZXRzCi0gICAgICAgKiBkZWZhdWx0IHNhbXBsaW5nIGZhY3RvcnMuCi0gICAgICAgKi8KLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAic2NhbnMiLCAyKSkgewotICAgICAgLyogU2V0IHNjYW4gc2NyaXB0LiAqLwotI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgc2NhbnNhcmcgPSBhcmd2W2FyZ25dOwotICAgICAgLyogV2UgbXVzdCBwb3N0cG9uZSByZWFkaW5nIHRoZSBmaWxlIGluIGNhc2UgLXByb2dyZXNzaXZlIGFwcGVhcnMuICovCi0jZWxzZQotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIG11bHRpLXNjYW4gb3V0cHV0IHdhcyBub3QgY29tcGlsZWRcbiIsCi0JICAgICAgcHJvZ25hbWUpOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotI2VuZGlmCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInNtb290aCIsIDIpKSB7Ci0gICAgICAvKiBTZXQgaW5wdXQgc21vb3RoaW5nIGZhY3Rvci4gKi8KLSAgICAgIGludCB2YWw7Ci0KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVkIiwgJnZhbCkgIT0gMSkKLQl1c2FnZSgpOwotICAgICAgaWYgKHZhbCA8IDAgfHwgdmFsID4gMTAwKQotCXVzYWdlKCk7Ci0gICAgICBjaW5mby0+c21vb3RoaW5nX2ZhY3RvciA9IHZhbDsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAidGFyZ2EiLCAxKSkgewotICAgICAgLyogSW5wdXQgZmlsZSBpcyBUYXJnYSBmb3JtYXQuICovCi0gICAgICBpc190YXJnYSA9IFRSVUU7Ci0KLSAgICB9IGVsc2UgewotICAgICAgdXNhZ2UoKTsJCQkvKiBib2d1cyBzd2l0Y2ggKi8KLSAgICB9Ci0gIH0KLQotICAvKiBQb3N0LXN3aXRjaC1zY2FubmluZyBjbGVhbnVwICovCi0KLSAgaWYgKGZvcl9yZWFsKSB7Ci0KLSAgICAvKiBTZXQgcXVhbnRpemF0aW9uIHRhYmxlcyBmb3Igc2VsZWN0ZWQgcXVhbGl0eS4gKi8KLSAgICAvKiBTb21lIG9yIGFsbCBtYXkgYmUgb3ZlcnJpZGRlbiBpZiAtcXRhYmxlcyBpcyBwcmVzZW50LiAqLwotICAgIGpwZWdfc2V0X3F1YWxpdHkoY2luZm8sIHF1YWxpdHksIGZvcmNlX2Jhc2VsaW5lKTsKLQotICAgIGlmIChxdGFibGVmaWxlICE9IE5VTEwpCS8qIHByb2Nlc3MgLXF0YWJsZXMgaWYgaXQgd2FzIHByZXNlbnQgKi8KLSAgICAgIGlmICghIHJlYWRfcXVhbnRfdGFibGVzKGNpbmZvLCBxdGFibGVmaWxlLAotCQkJICAgICAgcV9zY2FsZV9mYWN0b3IsIGZvcmNlX2Jhc2VsaW5lKSkKLQl1c2FnZSgpOwotCi0gICAgaWYgKHFzbG90c2FyZyAhPSBOVUxMKQkvKiBwcm9jZXNzIC1xc2xvdHMgaWYgaXQgd2FzIHByZXNlbnQgKi8KLSAgICAgIGlmICghIHNldF9xdWFudF9zbG90cyhjaW5mbywgcXNsb3RzYXJnKSkKLQl1c2FnZSgpOwotCi0gICAgaWYgKHNhbXBsZWFyZyAhPSBOVUxMKQkvKiBwcm9jZXNzIC1zYW1wbGUgaWYgaXQgd2FzIHByZXNlbnQgKi8KLSAgICAgIGlmICghIHNldF9zYW1wbGVfZmFjdG9ycyhjaW5mbywgc2FtcGxlYXJnKSkKLQl1c2FnZSgpOwotCi0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICBpZiAoc2ltcGxlX3Byb2dyZXNzaXZlKQkvKiBwcm9jZXNzIC1wcm9ncmVzc2l2ZTsgLXNjYW5zIGNhbiBvdmVycmlkZSAqLwotICAgICAganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24oY2luZm8pOwotI2VuZGlmCi0KLSNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSAgICBpZiAoc2NhbnNhcmcgIT0gTlVMTCkJLyogcHJvY2VzcyAtc2NhbnMgaWYgaXQgd2FzIHByZXNlbnQgKi8KLSAgICAgIGlmICghIHJlYWRfc2Nhbl9zY3JpcHQoY2luZm8sIHNjYW5zYXJnKSkKLQl1c2FnZSgpOwotI2VuZGlmCi0gIH0KLQotICByZXR1cm4gYXJnbjsJCQkvKiByZXR1cm4gaW5kZXggb2YgbmV4dCBhcmcgKGZpbGUgbmFtZSkgKi8KLX0KLQotCi0vKgotICogVGhlIG1haW4gcHJvZ3JhbS4KLSAqLwotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IGNpbmZvOwotICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgamVycjsKLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgc3RydWN0IGNkanBlZ19wcm9ncmVzc19tZ3IgcHJvZ3Jlc3M7Ci0jZW5kaWYKLSAgaW50IGZpbGVfaW5kZXg7Ci0gIGNqcGVnX3NvdXJjZV9wdHIgc3JjX21ncjsKLSAgRklMRSAqIGlucHV0X2ZpbGU7Ci0gIEZJTEUgKiBvdXRwdXRfZmlsZTsKLSAgSkRJTUVOU0lPTiBudW1fc2NhbmxpbmVzOwotCi0gIC8qIE9uIE1hYywgZmV0Y2ggYSBjb21tYW5kIGxpbmUuICovCi0jaWZkZWYgVVNFX0NDT01NQU5ECi0gIGFyZ2MgPSBjY29tbWFuZCgmYXJndik7Ci0jZW5kaWYKLQotICBwcm9nbmFtZSA9IGFyZ3ZbMF07Ci0gIGlmIChwcm9nbmFtZSA9PSBOVUxMIHx8IHByb2duYW1lWzBdID09IDApCi0gICAgcHJvZ25hbWUgPSAiY2pwZWciOwkJLyogaW4gY2FzZSBDIGxpYnJhcnkgZG9lc24ndCBwcm92aWRlIGl0ICovCi0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgSlBFRyBjb21wcmVzc2lvbiBvYmplY3Qgd2l0aCBkZWZhdWx0IGVycm9yIGhhbmRsaW5nLiAqLwotICBjaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVycik7Ci0gIGpwZWdfY3JlYXRlX2NvbXByZXNzKCZjaW5mbyk7Ci0gIC8qIEFkZCBzb21lIGFwcGxpY2F0aW9uLXNwZWNpZmljIGVycm9yIG1lc3NhZ2VzIChmcm9tIGNkZXJyb3IuaCkgKi8KLSAgamVyci5hZGRvbl9tZXNzYWdlX3RhYmxlID0gY2RqcGVnX21lc3NhZ2VfdGFibGU7Ci0gIGplcnIuZmlyc3RfYWRkb25fbWVzc2FnZSA9IEpNU0dfRklSU1RBRERPTkNPREU7Ci0gIGplcnIubGFzdF9hZGRvbl9tZXNzYWdlID0gSk1TR19MQVNUQURET05DT0RFOwotCi0gIC8qIE5vdyBzYWZlIHRvIGVuYWJsZSBzaWduYWwgY2F0Y2hlci4gKi8KLSNpZmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCi0gIGVuYWJsZV9zaWduYWxfY2F0Y2hlcigoal9jb21tb25fcHRyKSAmY2luZm8pOwotI2VuZGlmCi0KLSAgLyogSW5pdGlhbGl6ZSBKUEVHIHBhcmFtZXRlcnMuCi0gICAqIE11Y2ggb2YgdGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBsYXRlci4KLSAgICogSW4gcGFydGljdWxhciwgd2UgZG9uJ3QgeWV0IGtub3cgdGhlIGlucHV0IGZpbGUncyBjb2xvciBzcGFjZSwKLSAgICogYnV0IHdlIG5lZWQgdG8gcHJvdmlkZSBzb21lIHZhbHVlIGZvciBqcGVnX3NldF9kZWZhdWx0cygpIHRvIHdvcmsuCi0gICAqLwotCi0gIGNpbmZvLmluX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsgLyogYXJiaXRyYXJ5IGd1ZXNzICovCi0gIGpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7Ci0KLSAgLyogU2NhbiBjb21tYW5kIGxpbmUgdG8gZmluZCBmaWxlIG5hbWVzLgotICAgKiBJdCBpcyBjb252ZW5pZW50IHRvIHVzZSBqdXN0IG9uZSBzd2l0Y2gtcGFyc2luZyByb3V0aW5lLCBidXQgdGhlIHN3aXRjaAotICAgKiB2YWx1ZXMgcmVhZCBoZXJlIGFyZSBpZ25vcmVkOyB3ZSB3aWxsIHJlc2NhbiB0aGUgc3dpdGNoZXMgYWZ0ZXIgb3BlbmluZwotICAgKiB0aGUgaW5wdXQgZmlsZS4KLSAgICovCi0KLSAgZmlsZV9pbmRleCA9IHBhcnNlX3N3aXRjaGVzKCZjaW5mbywgYXJnYywgYXJndiwgMCwgRkFMU0UpOwotCi0jaWZkZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKLSAgLyogTXVzdCBoYXZlIGVpdGhlciAtb3V0ZmlsZSBzd2l0Y2ggb3IgZXhwbGljaXQgb3V0cHV0IGZpbGUgbmFtZSAqLwotICBpZiAob3V0ZmlsZW5hbWUgPT0gTlVMTCkgewotICAgIGlmIChmaWxlX2luZGV4ICE9IGFyZ2MtMikgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbXVzdCBuYW1lIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCBmaWxlXG4iLAotCSAgICAgIHByb2duYW1lKTsKLSAgICAgIHVzYWdlKCk7Ci0gICAgfQotICAgIG91dGZpbGVuYW1lID0gYXJndltmaWxlX2luZGV4KzFdOwotICB9IGVsc2UgewotICAgIGlmIChmaWxlX2luZGV4ICE9IGFyZ2MtMSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbXVzdCBuYW1lIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCBmaWxlXG4iLAotCSAgICAgIHByb2duYW1lKTsKLSAgICAgIHVzYWdlKCk7Ci0gICAgfQotICB9Ci0jZWxzZQotICAvKiBVbml4IHN0eWxlOiBleHBlY3QgemVybyBvciBvbmUgZmlsZSBuYW1lICovCi0gIGlmIChmaWxlX2luZGV4IDwgYXJnYy0xKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlczogb25seSBvbmUgaW5wdXQgZmlsZVxuIiwgcHJvZ25hbWUpOwotICAgIHVzYWdlKCk7Ci0gIH0KLSNlbmRpZiAvKiBUV09fRklMRV9DT01NQU5ETElORSAqLwotCi0gIC8qIE9wZW4gdGhlIGlucHV0IGZpbGUuICovCi0gIGlmIChmaWxlX2luZGV4IDwgYXJnYykgewotICAgIGlmICgoaW5wdXRfZmlsZSA9IGZvcGVuKGFyZ3ZbZmlsZV9pbmRleF0sIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbZmlsZV9pbmRleF0pOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBkZWZhdWx0IGlucHV0IGZpbGUgaXMgc3RkaW4gKi8KLSAgICBpbnB1dF9maWxlID0gcmVhZF9zdGRpbigpOwotICB9Ci0KLSAgLyogT3BlbiB0aGUgb3V0cHV0IGZpbGUuICovCi0gIGlmIChvdXRmaWxlbmFtZSAhPSBOVUxMKSB7Ci0gICAgaWYgKChvdXRwdXRfZmlsZSA9IGZvcGVuKG91dGZpbGVuYW1lLCBXUklURV9CSU5BUlkpKSA9PSBOVUxMKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgb3V0ZmlsZW5hbWUpOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBkZWZhdWx0IG91dHB1dCBmaWxlIGlzIHN0ZG91dCAqLwotICAgIG91dHB1dF9maWxlID0gd3JpdGVfc3Rkb3V0KCk7Ci0gIH0KLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBzdGFydF9wcm9ncmVzc19tb25pdG9yKChqX2NvbW1vbl9wdHIpICZjaW5mbywgJnByb2dyZXNzKTsKLSNlbmRpZgotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIGlucHV0IGZpbGUgZm9ybWF0LCBhbmQgc2V0IHVwIHRvIHJlYWQgaXQuICovCi0gIHNyY19tZ3IgPSBzZWxlY3RfZmlsZV90eXBlKCZjaW5mbywgaW5wdXRfZmlsZSk7Ci0gIHNyY19tZ3ItPmlucHV0X2ZpbGUgPSBpbnB1dF9maWxlOwotCi0gIC8qIFJlYWQgdGhlIGlucHV0IGZpbGUgaGVhZGVyIHRvIG9idGFpbiBmaWxlIHNpemUgJiBjb2xvcnNwYWNlLiAqLwotICAoKnNyY19tZ3ItPnN0YXJ0X2lucHV0KSAoJmNpbmZvLCBzcmNfbWdyKTsKLQotICAvKiBOb3cgdGhhdCB3ZSBrbm93IGlucHV0IGNvbG9yc3BhY2UsIGZpeCBjb2xvcnNwYWNlLWRlcGVuZGVudCBkZWZhdWx0cyAqLwotICBqcGVnX2RlZmF1bHRfY29sb3JzcGFjZSgmY2luZm8pOwotCi0gIC8qIEFkanVzdCBkZWZhdWx0IGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYnkgcmUtcGFyc2luZyB0aGUgb3B0aW9ucyAqLwotICBmaWxlX2luZGV4ID0gcGFyc2Vfc3dpdGNoZXMoJmNpbmZvLCBhcmdjLCBhcmd2LCAwLCBUUlVFKTsKLQotICAvKiBTcGVjaWZ5IGRhdGEgZGVzdGluYXRpb24gZm9yIGNvbXByZXNzaW9uICovCi0gIGpwZWdfc3RkaW9fZGVzdCgmY2luZm8sIG91dHB1dF9maWxlKTsKLQotICAvKiBTdGFydCBjb21wcmVzc29yICovCi0gIGpwZWdfc3RhcnRfY29tcHJlc3MoJmNpbmZvLCBUUlVFKTsKLQotICAvKiBQcm9jZXNzIGRhdGEgKi8KLSAgd2hpbGUgKGNpbmZvLm5leHRfc2NhbmxpbmUgPCBjaW5mby5pbWFnZV9oZWlnaHQpIHsKLSAgICBudW1fc2NhbmxpbmVzID0gKCpzcmNfbWdyLT5nZXRfcGl4ZWxfcm93cykgKCZjaW5mbywgc3JjX21ncik7Ci0gICAgKHZvaWQpIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCZjaW5mbywgc3JjX21nci0+YnVmZmVyLCBudW1fc2NhbmxpbmVzKTsKLSAgfQotCi0gIC8qIEZpbmlzaCBjb21wcmVzc2lvbiBhbmQgcmVsZWFzZSBtZW1vcnkgKi8KLSAgKCpzcmNfbWdyLT5maW5pc2hfaW5wdXQpICgmY2luZm8sIHNyY19tZ3IpOwotICBqcGVnX2ZpbmlzaF9jb21wcmVzcygmY2luZm8pOwotICBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoJmNpbmZvKTsKLQotICAvKiBDbG9zZSBmaWxlcywgaWYgd2Ugb3BlbmVkIHRoZW0gKi8KLSAgaWYgKGlucHV0X2ZpbGUgIT0gc3RkaW4pCi0gICAgZmNsb3NlKGlucHV0X2ZpbGUpOwotICBpZiAob3V0cHV0X2ZpbGUgIT0gc3Rkb3V0KQotICAgIGZjbG9zZShvdXRwdXRfZmlsZSk7Ci0KLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgZW5kX3Byb2dyZXNzX21vbml0b3IoKGpfY29tbW9uX3B0cikgJmNpbmZvKTsKLSNlbmRpZgotCi0gIC8qIEFsbCBkb25lLiAqLwotICBleGl0KGplcnIubnVtX3dhcm5pbmdzID8gRVhJVF9XQVJOSU5HIDogRVhJVF9TVUNDRVNTKTsKLSAgcmV0dXJuIDA7CQkJLyogc3VwcHJlc3Mgbm8tcmV0dXJuLXZhbHVlIHdhcm5pbmdzICovCi19CmRpZmYgLS1naXQgYS9ja2NvbmZpZy5jIGIvY2tjb25maWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEzODBkYy4uMDAwMDAwMAotLS0gYS9ja2NvbmZpZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDI0ICswLDAgQEAKLS8qCi0gKiBja2NvbmZpZy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTQsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KLSAqIFRoaXMgZmlsZSBoYXMgYmVlbiBtb2RpZmllZCBmb3IgU0lNRCBleHRlbnNpb24uCi0gKiBMYXN0IE1vZGlmaWVkIDogTWFyY2ggMjgsIDIwMDUKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgaW50ZW5kZWQgdG8gaGVscCB5b3UgZGV0ZXJtaW5lIGhvdyB0byBjb25maWd1cmUgdGhlIEpQRUcKLSAqIHNvZnR3YXJlIGZvciBpbnN0YWxsYXRpb24gb24gYSBwYXJ0aWN1bGFyIHN5c3RlbS4gIFRoZSBpZGVhIGlzIHRvIHRyeSB0bwotICogY29tcGlsZSBhbmQgZXhlY3V0ZSB0aGlzIHByb2dyYW0uICBJZiB5b3VyIGNvbXBpbGVyIGZhaWxzIHRvIGNvbXBpbGUgdGhlCi0gKiBwcm9ncmFtLCBtYWtlIGNoYW5nZXMgYXMgaW5kaWNhdGVkIGluIHRoZSBjb21tZW50cyBiZWxvdy4gIE9uY2UgeW91IGNhbgotICogY29tcGlsZSB0aGUgcHJvZ3JhbSwgcnVuIGl0LCBhbmQgaXQgd2lsbCBwcm9kdWNlIGEgImpjb25maWcuaCIgZmlsZSBmb3IKLSAqIHlvdXIgc3lzdGVtLgotICoKLSAqIEFzIGEgZ2VuZXJhbCBydWxlLCBlYWNoIHRpbWUgeW91IHRyeSB0byBjb21waWxlIHRoaXMgcHJvZ3JhbSwKLSAqIHBheSBhdHRlbnRpb24gb25seSB0byB0aGUgKmZpcnN0KiBlcnJvciBtZXNzYWdlIHlvdSBnZXQgZnJvbSB0aGUgY29tcGlsZXIuCi0gKiBNYW55IEMgY29tcGlsZXJzIHdpbGwgaXNzdWUgbG90cyBvZiBzcHVyaW91cyBlcnJvciBtZXNzYWdlcyBvbmNlIHRoZXkKLSAqIGhhdmUgZ290dGVuIGNvbmZ1c2VkLiAgR28gdG8gdGhlIGxpbmUgaW5kaWNhdGVkIGluIHRoZSBmaXJzdCBlcnJvciBtZXNzYWdlLAotICogYW5kIHJlYWQgdGhlIGNvbW1lbnRzIHByZWNlZGluZyB0aGF0IGxpbmUgdG8gc2VlIHdoYXQgdG8gY2hhbmdlLgotICoKLSAqIEFsbW9zdCBhbGwgb2YgdGhlIGVkaXRzIHlvdSBtYXkgbmVlZCB0byBtYWtlIHRvIHRoaXMgcHJvZ3JhbSBjb25zaXN0IG9mCi0gKiBjaGFuZ2luZyBhIGxpbmUgdGhhdCByZWFkcyAiI2RlZmluZSBTT01FX1NZTUJPTCIgdG8gIiN1bmRlZiBTT01FX1NZTUJPTCIsCi0gKiBvciB2aWNlIHZlcnNhLiAgVGhpcyBpcyBjYWxsZWQgZGVmaW5pbmcgb3IgdW5kZWZpbmluZyB0aGF0IHN5bWJvbC4KLSAqLwotCi0KLS8qIEZpcnN0IHdlIG11c3Qgc2VlIGlmIHlvdXIgc3lzdGVtIGhhcyB0aGUgaW5jbHVkZSBmaWxlcyB3ZSBuZWVkLgotICogV2Ugc3RhcnQgb3V0IHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB5b3VyIHN5c3RlbSBoYXMgYWxsIHRoZSBBTlNJLXN0YW5kYXJkCi0gKiBpbmNsdWRlIGZpbGVzLiAgSWYgeW91IGdldCBhbnkgZXJyb3IgdHJ5aW5nIHRvIGluY2x1ZGUgb25lIG9mIHRoZXNlIGZpbGVzLAotICogdW5kZWZpbmUgdGhlIGNvcnJlc3BvbmRpbmcgSEFWRV94eHggc3ltYm9sLgotICovCi0KLSNkZWZpbmUgSEFWRV9TVERERUZfSAkJLyogcmVwbGFjZSAnZGVmaW5lJyBieSAndW5kZWYnIGlmIGVycm9yIGhlcmUgKi8KLSNpZmRlZiBIQVZFX1NURERFRl9ICQkvKiBuZXh0IGxpbmUgd2lsbCBiZSBza2lwcGVkIGlmIHlvdSB1bmRlZi4uLiAqLwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi0KLSNkZWZpbmUgSEFWRV9TVERMSUJfSAkJLyogc2FtZSB0aGluZyBmb3Igc3RkbGliLmggKi8KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+CQkvKiBJZiB5b3UgYWluJ3QgZ290IHRoaXMsIHlvdSBhaW4ndCBnb3QgQy4gKi8KLQotLyogV2UgaGF2ZSB0byBzZWUgaWYgeW91ciBzdHJpbmcgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGJ5Ci0gKiBzdHJpbmdzLmggKG9sZCBCU0QgY29udmVudGlvbikgb3Igc3RyaW5nLmggKGV2ZXJ5Ym9keSBlbHNlKS4KLSAqIFdlIHRyeSB0aGUgbm9uLUJTRCBjb252ZW50aW9uIGZpcnN0OyBkZWZpbmUgTkVFRF9CU0RfU1RSSU5HUwotICogaWYgdGhlIGNvbXBpbGVyIHNheXMgaXQgY2FuJ3QgZmluZCBzdHJpbmcuaC4KLSAqLwotCi0jdW5kZWYgTkVFRF9CU0RfU1RSSU5HUwotCi0jaWZkZWYgTkVFRF9CU0RfU1RSSU5HUwotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotLyogT24gc29tZSBzeXN0ZW1zIChlc3BlY2lhbGx5IG9sZGVyIFVuaXggbWFjaGluZXMpLCB0eXBlIHNpemVfdCBpcwotICogZGVmaW5lZCBvbmx5IGluIHRoZSBpbmNsdWRlIGZpbGUgPHN5cy90eXBlcy5oPi4gIElmIHlvdSBnZXQgYSBmYWlsdXJlCi0gKiBvbiB0aGUgc2l6ZV90IHRlc3QgYmVsb3csIHRyeSBkZWZpbmluZyBORUVEX1NZU19UWVBFU19ILgotICovCi0KLSN1bmRlZiBORUVEX1NZU19UWVBFU19ICQkvKiBzdGFydCBieSBhc3N1bWluZyB3ZSBkb24ndCBuZWVkIGl0ICovCi0jaWZkZWYgTkVFRF9TWVNfVFlQRVNfSAotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0KLQotLyogVXN1YWxseSB0eXBlIHNpemVfdCBpcyBkZWZpbmVkIGluIG9uZSBvZiB0aGUgaW5jbHVkZSBmaWxlcyB3ZSd2ZSBpbmNsdWRlZAotICogYWJvdmUuICBJZiBub3QsIHlvdSdsbCBnZXQgYW4gZXJyb3Igb24gdGhlICJ0eXBlZGVmIHNpemVfdCBteV9zaXplX3Q7IiBsaW5lLgotICogSW4gdGhhdCBjYXNlLCBmaXJzdCB0cnkgZGVmaW5pbmcgTkVFRF9TWVNfVFlQRVNfSCBqdXN0IGFib3ZlLgotICogSWYgdGhhdCBkb2Vzbid0IHdvcmssIHlvdSdsbCBoYXZlIHRvIHNlYXJjaCB0aHJvdWdoIHlvdXIgc3lzdGVtIGxpYnJhcnkKLSAqIHRvIGZpZ3VyZSBvdXQgd2hpY2ggaW5jbHVkZSBmaWxlIGRlZmluZXMgInNpemVfdCIuICBMb29rIGZvciBhIGxpbmUgdGhhdAotICogc2F5cyAidHlwZWRlZiBzb21ldGhpbmctb3Itb3RoZXIgc2l6ZV90OyIuICBUaGVuLCBjaGFuZ2UgdGhlIGxpbmUgYmVsb3cKLSAqIHRoYXQgc2F5cyAiI2luY2x1ZGUgPHNvbWVpbmNsdWRlZmlsZS5oPiIgdG8gaW5zdGVhZCBpbmNsdWRlIHRoZSBmaWxlCi0gKiB5b3UgZm91bmQgc2l6ZV90IGluLCBhbmQgZGVmaW5lIE5FRURfU1BFQ0lBTF9JTkNMVURFLiAgSWYgeW91IGNhbid0IGZpbmQKLSAqIHR5cGUgc2l6ZV90IGFueXdoZXJlLCB0cnkgcmVwbGFjaW5nICIjaW5jbHVkZSA8c29tZWluY2x1ZGVmaWxlLmg+IiB3aXRoCi0gKiAidHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OyIuCi0gKi8KLQotI3VuZGVmIE5FRURfU1BFQ0lBTF9JTkNMVURFCS8qIGFzc3VtZSB3ZSBET04nVCBuZWVkIGl0LCBmb3Igc3RhcnRlcnMgKi8KLQotI2lmZGVmIE5FRURfU1BFQ0lBTF9JTkNMVURFCi0jaW5jbHVkZSA8c29tZWluY2x1ZGVmaWxlLmg+Ci0jZW5kaWYKLQotdHlwZWRlZiBzaXplX3QgbXlfc2l6ZV90OwkvKiBUaGUgcGF5b2ZmOiBkbyB3ZSBoYXZlIHNpemVfdCBub3c/ICovCi0KLQotLyogVGhlIG5leHQgcXVlc3Rpb24gaXMgd2hldGhlciB5b3VyIGNvbXBpbGVyIHN1cHBvcnRzIEFOU0ktc3R5bGUgZnVuY3Rpb24KLSAqIHByb3RvdHlwZXMuICBZb3UgbmVlZCB0byBrbm93IHRoaXMgaW4gb3JkZXIgdG8gY2hvb3NlIGJldHdlZW4gdXNpbmcKLSAqIG1ha2VmaWxlLmFuc2kgYW5kIHVzaW5nIG1ha2VmaWxlLnVuaXguCi0gKiBUaGUgI2RlZmluZSBsaW5lIGJlbG93IGlzIHNldCB0byBhc3N1bWUgeW91IGhhdmUgQU5TSSBmdW5jdGlvbiBwcm90b3R5cGVzLgotICogSWYgeW91IGdldCBhbiBlcnJvciBpbiB0aGlzIGdyb3VwIG9mIGxpbmVzLCB1bmRlZmluZSBIQVZFX1BST1RPVFlQRVMuCi0gKi8KLQotI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKLQotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwotaW50IHRlc3RmdW5jdGlvbiAoaW50IGFyZzEsIGludCAqIGFyZzIpOyAvKiBjaGVjayBwcm90b3R5cGVzICovCi0KLXN0cnVjdCBtZXRob2RzX3N0cnVjdCB7CQkvKiBjaGVjayBtZXRob2QtcG9pbnRlciBkZWNsYXJhdGlvbnMgKi8KLSAgaW50ICgqZXJyb3JfZXhpdCkgKGNoYXIgKm1zZ3RleHQpOwotICBpbnQgKCp0cmFjZV9tZXNzYWdlKSAoY2hhciAqbXNndGV4dCk7Ci0gIGludCAoKmFub3RoZXJfbWV0aG9kKSAodm9pZCk7Ci19OwotCi1pbnQgdGVzdGZ1bmN0aW9uIChpbnQgYXJnMSwgaW50ICogYXJnMikgLyogY2hlY2sgZGVmaW5pdGlvbnMgKi8KLXsKLSAgcmV0dXJuIGFyZzJbYXJnMV07Ci19Ci0KLWludCB0ZXN0MmZ1bmN0aW9uICh2b2lkKQkvKiBjaGVjayB2b2lkIGFyZyBsaXN0ICovCi17Ci0gIHJldHVybiAwOwotfQotI2VuZGlmCi0KLQotLyogTm93IHdlIHdhbnQgdG8gZmluZCBvdXQgaWYgeW91ciBjb21waWxlciBrbm93cyB3aGF0ICJ1bnNpZ25lZCBjaGFyIiBtZWFucy4KLSAqIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlICJ1bnNpZ25lZCBjaGFyIHVuX2NoYXI7IiBsaW5lLAotICogdGhlbiB1bmRlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIuCi0gKi8KLQotI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKLQotI2lmZGVmIEhBVkVfVU5TSUdORURfQ0hBUgotdW5zaWduZWQgY2hhciB1bl9jaGFyOwotI2VuZGlmCi0KLQotLyogTm93IHdlIHdhbnQgdG8gZmluZCBvdXQgaWYgeW91ciBjb21waWxlciBrbm93cyB3aGF0ICJ1bnNpZ25lZCBzaG9ydCIgbWVhbnMuCi0gKiBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSAidW5zaWduZWQgc2hvcnQgdW5fc2hvcnQ7IiBsaW5lLAotICogdGhlbiB1bmRlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JULgotICovCi0KLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAotCi0jaWZkZWYgSEFWRV9VTlNJR05FRF9TSE9SVAotdW5zaWduZWQgc2hvcnQgdW5fc2hvcnQ7Ci0jZW5kaWYKLQotCi0vKiBOb3cgd2Ugd2FudCB0byBmaW5kIG91dCBpZiB5b3VyIGNvbXBpbGVyIHVuZGVyc3RhbmRzIHR5cGUgInZvaWQiLgotICogSWYgeW91IGdldCBhbiBlcnJvciBhbnl3aGVyZSBpbiBoZXJlLCB1bmRlZmluZSBIQVZFX1ZPSUQuCi0gKi8KLQotI2RlZmluZSBIQVZFX1ZPSUQKLQotI2lmZGVmIEhBVkVfVk9JRAotLyogQ2F1dGlvbjogYSBDKysgY29tcGlsZXIgd2lsbCBpbnNpc3Qgb24gY29tcGxldGUgcHJvdG90eXBlcyAqLwotdHlwZWRlZiB2b2lkICogdm9pZF9wdHI7CS8qIGNoZWNrIHZvaWQgKiAqLwotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwkJLyogY2hlY2sgcHRyIHRvIGZ1bmN0aW9uIHJldHVybmluZyB2b2lkICovCi10eXBlZGVmIHZvaWQgKCp2b2lkX2Z1bmMpIChpbnQgYSwgaW50IGIpOwotI2Vsc2UKLXR5cGVkZWYgdm9pZCAoKnZvaWRfZnVuYykgKCk7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwkJLyogY2hlY2sgdm9pZCBmdW5jdGlvbiByZXN1bHQgKi8KLXZvaWQgdGVzdDNmdW5jdGlvbiAodm9pZF9wdHIgYXJnMSwgdm9pZF9mdW5jIGFyZzIpCi0jZWxzZQotdm9pZCB0ZXN0M2Z1bmN0aW9uIChhcmcxLCBhcmcyKQotICAgICB2b2lkX3B0ciBhcmcxOwotICAgICB2b2lkX2Z1bmMgYXJnMjsKLSNlbmRpZgotewotICBjaGFyICogbG9jcHRyID0gKGNoYXIgKikgYXJnMTsgLyogY2hlY2sgY2FzdGluZyB0byBhbmQgZnJvbSB2b2lkICogKi8KLSAgYXJnMSA9ICh2b2lkICopIGxvY3B0cjsKLSAgKCphcmcyKSAoMSwgMik7CQkvKiBjaGVjayBjYWxsIG9mIGZjbiByZXR1cm5pbmcgdm9pZCAqLwotfQotI2VuZGlmCi0KLQotLyogTm93IHdlIHdhbnQgdG8gZmluZCBvdXQgaWYgeW91ciBjb21waWxlciBrbm93cyB3aGF0ICJjb25zdCIgbWVhbnMuCi0gKiBJZiB5b3UgZ2V0IGFuIGVycm9yIGhlcmUsIHVuZGVmaW5lIEhBVkVfQ09OU1QuCi0gKi8KLQotI2RlZmluZSBIQVZFX0NPTlNUCi0KLSNpZmRlZiBIQVZFX0NPTlNUCi1zdGF0aWMgY29uc3QgaW50IGNhcnJheVszXSA9IHsxLCAyLCAzfTsKLQotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwotaW50IHRlc3Q0ZnVuY3Rpb24gKGNvbnN0IGludCBhcmcxKQotI2Vsc2UKLWludCB0ZXN0NGZ1bmN0aW9uIChhcmcxKQotICAgICBjb25zdCBpbnQgYXJnMTsKLSNlbmRpZgotewotICByZXR1cm4gY2FycmF5W2FyZzFdOwotfQotI2VuZGlmCi0KLQotLyogSWYgeW91IGdldCBhbiBlcnJvciBvciB3YXJuaW5nIGFib3V0IHRoaXMgc3RydWN0dXJlIGRlZmluaXRpb24sCi0gKiBkZWZpbmUgSU5DT01QTEVURV9UWVBFU19CUk9LRU4uCi0gKi8KLQotI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCi0KLSNpZm5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLXR5cGVkZWYgc3RydWN0IHVuZGVmaW5lZF9zdHJ1Y3R1cmUgKiB1bmRlZl9zdHJ1Y3RfcHRyOwotI2VuZGlmCi0KLQotLyogSWYgeW91IGdldCBhbiBlcnJvciBhYm91dCBkdXBsaWNhdGUgbmFtZXMsCi0gKiBkZWZpbmUgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUy4KLSAqLwotCi0jdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotCi0jaWZuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLQotaW50IHBvc3NpYmx5X2R1cGxpY2F0ZV9mdW5jdGlvbiAoKQotewotICByZXR1cm4gMDsKLX0KLQotaW50IHBvc3NpYmx5X2R1cGxpX2Z1bmN0aW9uICgpCi17Ci0gIHJldHVybiAxOwotfQotCi0jZW5kaWYKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBPSywgdGhhdCdzIGl0LiAgWW91IHNob3VsZCBub3QgaGF2ZSB0byBjaGFuZ2UgYW55dGhpbmcgYmV5b25kIHRoaXMKLSAqICBwb2ludCBpbiBvcmRlciB0byBjb21waWxlIGFuZCBleGVjdXRlIHRoaXMgcHJvZ3JhbS4gIChZb3UgbWlnaHQgZ2V0Ci0gKiAgc29tZSB3YXJuaW5ncywgYnV0IHlvdSBjYW4gaWdub3JlIHRoZW0uKQotICogIFdoZW4geW91IHJ1biB0aGUgcHJvZ3JhbSwgaXQgd2lsbCBtYWtlIGEgY291cGxlIG1vcmUgdGVzdHMgdGhhdCBpdAotICogIGNhbiBkbyBhdXRvbWF0aWNhbGx5LCBhbmQgdGhlbiBpdCB3aWxsIGNyZWF0ZSBqY29uZmlnLmggYW5kIHByaW50IG91dAotICogIGFueSBhZGRpdGlvbmFsIHN1Z2dlc3Rpb25zIGl0IGhhcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0KLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMKLWludCBpc19jaGFyX3NpZ25lZCAoaW50IGFyZykKLSNlbHNlCi1pbnQgaXNfY2hhcl9zaWduZWQgKGFyZykKLSAgICAgaW50IGFyZzsKLSNlbmRpZgotewotICBpZiAoYXJnID09IDE4OSkgewkJLyogZXhwZWN0ZWQgcmVzdWx0IGZvciB1bnNpZ25lZCBjaGFyICovCi0gICAgcmV0dXJuIDA7CQkJLyogdHlwZSBjaGFyIGlzIHVuc2lnbmVkICovCi0gIH0KLSAgZWxzZSBpZiAoYXJnICE9IC02NykgewkvKiBleHBlY3RlZCByZXN1bHQgZm9yIHNpZ25lZCBjaGFyICovCi0gICAgcHJpbnRmKCJIbW0sIGl0IHNlZW1zICdjaGFyJyBpcyBub3QgZWlnaHQgYml0cyB3aWRlIG9uIHlvdXIgbWFjaGluZS5cbiIpOwotICAgIHByaW50ZigiSSBmZWFyIHRoZSBKUEVHIHNvZnR3YXJlIHdpbGwgbm90IHdvcmsgYXQgYWxsLlxuXG4iKTsKLSAgfQotICByZXR1cm4gMTsJCQkvKiBhc3N1bWUgY2hhciBpcyBzaWduZWQgb3RoZXJ3aXNlICovCi19Ci0KLQotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwotaW50IGlzX3NoaWZ0aW5nX3NpZ25lZCAobG9uZyBhcmcpCi0jZWxzZQotaW50IGlzX3NoaWZ0aW5nX3NpZ25lZCAoYXJnKQotICAgICBsb25nIGFyZzsKLSNlbmRpZgotLyogU2VlIHdoZXRoZXIgcmlnaHQtc2hpZnQgb24gYSBsb25nIGlzIHNpZ25lZCBvciBub3QuICovCi17Ci0gIGxvbmcgcmVzID0gYXJnID4+IDQ7Ci0KLSAgaWYgKHJlcyA9PSAtMHg3RjdFODBDTCkgewkvKiBleHBlY3RlZCByZXN1bHQgZm9yIHNpZ25lZCBzaGlmdCAqLwotICAgIHJldHVybiAxOwkJCS8qIHJpZ2h0IHNoaWZ0IGlzIHNpZ25lZCAqLwotICB9Ci0gIC8qIHNlZSBpZiB1bnNpZ25lZC1zaGlmdCBoYWNrIHdpbGwgZml4IGl0LiAqLwotICAvKiB3ZSBjYW4ndCBqdXN0IHRlc3QgZXhhY3QgdmFsdWUgc2luY2UgaXQgZGVwZW5kcyBvbiB3aWR0aCBvZiBsb25nLi4uICovCi0gIHJlcyB8PSAofjBMKSA8PCAoMzItNCk7Ci0gIGlmIChyZXMgPT0gLTB4N0Y3RTgwQ0wpIHsJLyogZXhwZWN0ZWQgcmVzdWx0IG5vdz8gKi8KLSAgICByZXR1cm4gMDsJCQkvKiByaWdodCBzaGlmdCBpcyB1bnNpZ25lZCAqLwotICB9Ci0gIHByaW50ZigiUmlnaHQgc2hpZnQgaXNuJ3QgYWN0aW5nIGFzIEkgZXhwZWN0IGl0IHRvLlxuIik7Ci0gIHByaW50ZigiSSBmZWFyIHRoZSBKUEVHIHNvZnR3YXJlIHdpbGwgbm90IHdvcmsgYXQgYWxsLlxuXG4iKTsKLSAgcmV0dXJuIDA7CQkJLyogdHJ5IGl0IHdpdGggdW5zaWduZWQgYW55d2F5ICovCi19Ci0KLQotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwotaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCi0jZWxzZQotaW50IG1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqIGFyZ3Y7Ci0jZW5kaWYKLXsKLSAgY2hhciBzaWduZWRfY2hhcl9jaGVjayA9IChjaGFyKSAoLTY3KTsKLSAgRklMRSAqb3V0ZmlsZTsKLQotICAvKiBBdHRlbXB0IHRvIHdyaXRlIGpjb25maWcuaCAqLwotICBpZiAoKG91dGZpbGUgPSBmb3BlbigiamNvbmZpZy5oIiwgInciKSkgPT0gTlVMTCkgewotICAgIHByaW50ZigiRmFpbGVkIHRvIHdyaXRlIGpjb25maWcuaFxuIik7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICAvKiBXcml0ZSBvdXQgYWxsIHRoZSBpbmZvICovCi0gIGZwcmludGYob3V0ZmlsZSwgIi8qIGpjb25maWcuaCAtLS0gZ2VuZXJhdGVkIGJ5IGNrY29uZmlnLmMgKi9cbiIpOwotICBmcHJpbnRmKG91dGZpbGUsICIvKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqL1xuXG4iKTsKLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMKLSAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBIQVZFX1BST1RPVFlQRVNcbiIpOwotI2Vsc2UKLSAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIEhBVkVfUFJPVE9UWVBFU1xuIik7Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKLSAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVJcbiIpOwotI2Vsc2UKLSAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIEhBVkVfVU5TSUdORURfQ0hBUlxuIik7Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOU0lHTkVEX1NIT1JUCi0gIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVFxuIik7Ci0jZWxzZQotICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgSEFWRV9VTlNJR05FRF9TSE9SVFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1ZPSUQKLSAgZnByaW50ZihvdXRmaWxlLCAiLyogI2RlZmluZSB2b2lkIGNoYXIgKi9cbiIpOwotI2Vsc2UKLSAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSB2b2lkIGNoYXJcbiIpOwotI2VuZGlmCi0jaWZkZWYgSEFWRV9DT05TVAotICBmcHJpbnRmKG91dGZpbGUsICIvKiAjZGVmaW5lIGNvbnN0ICovXG4iKTsKLSNlbHNlCi0gIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgY29uc3RcbiIpOwotI2VuZGlmCi0gIGlmIChpc19jaGFyX3NpZ25lZCgoaW50KSBzaWduZWRfY2hhcl9jaGVjaykpCi0gICAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIENIQVJfSVNfVU5TSUdORURcbiIpOwotICBlbHNlCi0gICAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBDSEFSX0lTX1VOU0lHTkVEXG4iKTsKLSNpZmRlZiBIQVZFX1NURERFRl9ICi0gIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgSEFWRV9TVERERUZfSFxuIik7Ci0jZWxzZQotICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgSEFWRV9TVERERUZfSFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0gIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgSEFWRV9TVERMSUJfSFxuIik7Ci0jZWxzZQotICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgSEFWRV9TVERMSUJfSFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBORUVEX0JTRF9TVFJJTkdTCi0gIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgTkVFRF9CU0RfU1RSSU5HU1xuIik7Ci0jZWxzZQotICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgTkVFRF9CU0RfU1RSSU5HU1xuIik7Ci0jZW5kaWYKLSNpZmRlZiBORUVEX1NZU19UWVBFU19ICi0gIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgTkVFRF9TWVNfVFlQRVNfSFxuIik7Ci0jZWxzZQotICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgTkVFRF9TWVNfVFlQRVNfSFxuIik7Ci0jZW5kaWYKLSAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTXG4iKTsKLSNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0gIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FU1xuIik7Ci0jZWxzZQotICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FU1xuIik7Ci0jZW5kaWYKLSNpZmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgotICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOXG4iKTsKLSNlbHNlCi0gIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTlxuIik7Ci0jZW5kaWYKLSNpZmRlZiBfV0lOMzIKLSAgZnByaW50ZihvdXRmaWxlLCAiXG4vKiBEZWZpbmUgImJvb2xlYW4iIGFzIHVuc2lnbmVkIGNoYXIsIG5vdCBpbnQsIHBlciBXaW5kb3dzIGN1c3RvbSAqL1xuIik7Ci0gIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgVFlQRURFRl9VQ0hBUl9CT09MRUFOXG4iKTsKLSNlbmRpZgotICBmcHJpbnRmKG91dGZpbGUsICJcbiNpZmRlZiBKUEVHX0lOVEVSTkFMU1xuXG4iKTsKLSAgaWYgKGlzX3NoaWZ0aW5nX3NpZ25lZCgtMHg3RjdFODBCMUwpKQotICAgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRFxuIik7Ci0gIGVsc2UKLSAgICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVEXG4iKTsKLSAgZnByaW50ZihvdXRmaWxlLCAiXG4jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi9cbiIpOwotCi0gIGZwcmludGYob3V0ZmlsZSwgIlxuI2lmIGRlZmluZWQoSlBFR19JTlRFUk5BTFMpIHx8IGRlZmluZWQoSlBFR19JTlRFUk5BTF9PUFRJT05TKVxuIik7Ci0gIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBKU0lNRF9NTVhfTk9UX1NVUFBPUlRFRFxuIik7Ci0gIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBKU0lNRF8zRE5PV19OT1RfU1VQUE9SVEVEXG4iKTsKLSAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIEpTSU1EX1NTRV9OT1RfU1VQUE9SVEVEXG4iKTsKLSAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIEpTSU1EX1NTRTJfTk9UX1NVUFBPUlRFRFxuIik7Ci0gIGZwcmludGYob3V0ZmlsZSwgIiNlbmRpZlxuIik7Ci0KLSAgZnByaW50ZihvdXRmaWxlLCAiXG4jaWZkZWYgSlBFR19DSlBFR19ESlBFR1xuXG4iKTsKLSAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi9cbiIpOwotICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqL1xuIik7Ci0gIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovXG4iKTsKLSAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovXG4iKTsKLSAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovXG5cbiIpOwotICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUJLyogWW91IG1heSBuZWVkIHRoaXMgb24gbm9uLVVuaXggc3lzdGVtcyAqL1xuIik7Ci0jaWZkZWYgX1dJTjMyCi0gIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgVVNFX1NFVE1PREUJCS8qIE5lZWRlZCB0byBtYWtlIG9uZS1maWxlIHN0eWxlIHdvcmsgKi9cbiIpOwotI2VuZGlmCi0gIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCS8qIERlZmluZSB0aGlzIGlmIHlvdSB1c2Ugam1lbW5hbWUuYyAqL1xuIik7Ci0gIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBET05UX1VTRV9CX01PREVcbiIpOwotICBmcHJpbnRmKG91dGZpbGUsICIvKiAjZGVmaW5lIFBST0dSRVNTX1JFUE9SVCAqLwkvKiBvcHRpb25hbCAqL1xuIik7Ci0gIGZwcmludGYob3V0ZmlsZSwgIlxuI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi9cbiIpOwotCi0gIC8qIENsb3NlIHRoZSBqY29uZmlnLmggZmlsZSAqLwotICBmY2xvc2Uob3V0ZmlsZSk7Ci0KLSAgLyogVXNlciByZXBvcnQgKi8KLSAgcHJpbnRmKCJDb25maWd1cmF0aW9uIGNoZWNrIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUgZG9uZS5cbiIpOwotICBwcmludGYoIlxuSSBoYXZlIHdyaXR0ZW4gdGhlIGpjb25maWcuaCBmaWxlIGZvciB5b3UuXG5cbiIpOwotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwotICBwcmludGYoIllvdSBzaG91bGQgdXNlIG1ha2VmaWxlLmFuc2kgYXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciB5b3VyIE1ha2VmaWxlLlxuIik7Ci0jZWxzZQotICBwcmludGYoIllvdSBzaG91bGQgdXNlIG1ha2VmaWxlLnVuaXggYXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciB5b3VyIE1ha2VmaWxlLlxuIik7Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfU1BFQ0lBTF9JTkNMVURFCi0gIHByaW50ZigiXG5Zb3UnbGwgbmVlZCB0byBjaGFuZ2UgamNvbmZpZy5oIHRvIGluY2x1ZGUgdGhlIHN5c3RlbSBpbmNsdWRlIGZpbGVcbiIpOwotICBwcmludGYoInRoYXQgeW91IGZvdW5kIHR5cGUgc2l6ZV90IGluLCBvciBhZGQgYSBkaXJlY3QgZGVmaW5pdGlvbiBvZiB0eXBlXG4iKTsKLSAgcHJpbnRmKCJzaXplX3QgaWYgdGhhdCdzIHdoYXQgeW91IHVzZWQuICBKdXN0IGFkZCBpdCB0byB0aGUgZW5kLlxuIik7Ci0jZW5kaWYKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2NvZGVydWxlcy5kb2MgYi9jb2RlcnVsZXMuZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWI1ZDliLi4wMDAwMDAwCi0tLSBhL2NvZGVydWxlcy5kb2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotSUpHIEpQRUcgTElCUkFSWTogIENPRElORyBSVUxFUwotCi1Db3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotCi0KLVNpbmNlIG51bWVyb3VzIHBlb3BsZSB3aWxsIGJlIGNvbnRyaWJ1dGluZyBjb2RlIGFuZCBidWcgZml4ZXMsIGl0J3MgaW1wb3J0YW50Ci10byBlc3RhYmxpc2ggYSBjb21tb24gY29kaW5nIHN0eWxlLiAgVGhlIGdvYWwgb2YgdXNpbmcgc2ltaWxhciBjb2Rpbmcgc3R5bGVzCi1pcyBtdWNoIG1vcmUgaW1wb3J0YW50IHRoYW4gdGhlIGRldGFpbHMgb2YganVzdCB3aGF0IHRoYXQgc3R5bGUgaXMuCi0KLUluIGdlbmVyYWwgd2UgZm9sbG93IHRoZSByZWNvbW1lbmRhdGlvbnMgb2YgIlJlY29tbWVuZGVkIEMgU3R5bGUgYW5kIENvZGluZwotU3RhbmRhcmRzIiByZXZpc2lvbiA2LjEgKENhbm5vbiBldCBhbC4gYXMgbW9kaWZpZWQgYnkgU3BlbmNlciwgS2VwcGVsIGFuZAotQnJhZGVyKS4gIFRoaXMgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIGluIHRoZSBJSkcgRlRQIGFyY2hpdmUgKHNlZQotanBlZy9kb2MvY3N0eWxlLm1zLnRibC5aLCBvciBjc3R5bGUudHh0LlogZm9yIHRob3NlIHdpdGhvdXQgbnJvZmYvdGJsKS4KLQotQmxvY2sgY29tbWVudHMgc2hvdWxkIGJlIGxhaWQgb3V0IHRodXNseToKLQotLyoKLSAqICBCbG9jayBjb21tZW50cyBpbiB0aGlzIHN0eWxlLgotICovCi0KLVdlIGluZGVudCBzdGF0ZW1lbnRzIGluIEsmUiBzdHlsZSwgZS5nLiwKLQlpZiAodGVzdCkgewotCSAgdGhlbi1wYXJ0OwotCX0gZWxzZSB7Ci0JICBlbHNlLXBhcnQ7Ci0JfQotd2l0aCB0d28gc3BhY2VzIHBlciBpbmRlbnRhdGlvbiBsZXZlbC4gIChUaGlzIGluZGVudGF0aW9uIGNvbnZlbnRpb24gaXMKLWhhbmRsZWQgYXV0b21hdGljYWxseSBieSBHTlUgRW1hY3MgYW5kIG1hbnkgb3RoZXIgdGV4dCBlZGl0b3JzLikKLQotTXVsdGktd29yZCBuYW1lcyBzaG91bGQgYmUgd3JpdHRlbiBpbiBsb3dlciBjYXNlIHdpdGggdW5kZXJzY29yZXMsIGUuZy4sCi1tdWx0aV93b3JkX25hbWUgKG5vdCBtdWx0aVdvcmROYW1lKS4gIFByZXByb2Nlc3NvciBzeW1ib2xzIGFuZCBlbnVtIGNvbnN0YW50cwotYXJlIHNpbWlsYXIgYnV0IHVwcGVyIGNhc2UgKE1VTFRJX1dPUkRfTkFNRSkuICBOYW1lcyBzaG91bGQgYmUgdW5pcXVlIHdpdGhpbgotdGhlIGZpcnN0IGZpZnRlZW4gY2hhcmFjdGVycy4gIChPbiBzb21lIG9sZGVyIHN5c3RlbXMsIGdsb2JhbCBuYW1lcyBtdXN0IGJlCi11bmlxdWUgd2l0aGluIHNpeCBjaGFyYWN0ZXJzLiAgV2UgYWNjb21tb2RhdGUgdGhpcyB3aXRob3V0IGNsdXR0ZXJpbmcgdGhlCi1zb3VyY2UgY29kZSBieSB1c2luZyBtYWNyb3MgdG8gc3Vic3RpdHV0ZSBzaG9ydGVyIG5hbWVzLikKLQotV2UgdXNlIGZ1bmN0aW9uIHByb3RvdHlwZXMgZXZlcnl3aGVyZTsgd2UgcmVseSBvbiBhdXRvbWF0aWMgc291cmNlIGNvZGUKLXRyYW5zZm9ybWF0aW9uIHRvIGZlZWQgcHJvdG90eXBlLWxlc3MgQyBjb21waWxlcnMuICBUcmFuc2Zvcm1hdGlvbiBpcyBkb25lCi1ieSB0aGUgc2ltcGxlIGFuZCBwb3J0YWJsZSB0b29sICdhbnNpMmtuci5jJyAoY291cnRlc3kgb2YgR2hvc3RzY3JpcHQpLgotYW5zaTJrbnIgaXMgbm90IHZlcnkgYnJpZ2h0LCBzbyBpdCBpbXBvc2VzIGEgZm9ybWF0IHJlcXVpcmVtZW50IG9uIGZ1bmN0aW9uCi1kZWNsYXJhdGlvbnM6IHRoZSBmdW5jdGlvbiBuYW1lIE1VU1QgQkVHSU4gSU4gQ09MVU1OIDEuICBUaHVzIGFsbCBmdW5jdGlvbnMKLXNob3VsZCBiZSB3cml0dGVuIGluIHRoZSBmb2xsb3dpbmcgc3R5bGU6Ci0KLUxPQ0FMKGludCAqKQotZnVuY3Rpb25fbmFtZSAoaW50IGEsIGNoYXIgKmIpCi17Ci0gICAgY29kZS4uLgotfQotCi1Ob3RlIHRoYXQgZWFjaCBmdW5jdGlvbiBkZWZpbml0aW9uIG11c3QgYmVnaW4gd2l0aCBHTE9CQUwodHlwZSksIExPQ0FMKHR5cGUpLAotb3IgTUVUSE9EREVGKHR5cGUpLiAgVGhlc2UgbWFjcm9zIGV4cGFuZCB0byAic3RhdGljIHR5cGUiIG9yIGp1c3QgInR5cGUiIGFzCi1hcHByb3ByaWF0ZS4gIFRoZXkgcHJvdmlkZSBhIHJlYWRhYmxlIGluZGljYXRpb24gb2YgdGhlIHJvdXRpbmUncyB1c2FnZSBhbmQKLWNhbiByZWFkaWx5IGJlIGNoYW5nZWQgZm9yIHNwZWNpYWwgbmVlZHMuICAoRm9yIGluc3RhbmNlLCBzcGVjaWFsIGxpbmthZ2UKLWtleXdvcmRzIGNhbiBiZSBpbnNlcnRlZCBmb3IgdXNlIGluIFdpbmRvd3MgRExMcy4pCi0KLWFuc2kya25yIGRvZXMgbm90IHRyYW5zZm9ybSBtZXRob2QgZGVjbGFyYXRpb25zIChmdW5jdGlvbiBwb2ludGVycyBpbgotc3RydWN0cykuICBXZSBoYW5kbGUgdGhlc2Ugd2l0aCBhIG1hY3JvIEpNRVRIT0QsIGRlZmluZWQgYXMKLQkjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCi0JI2RlZmluZSBKTUVUSE9EKHR5cGUsbWV0aG9kbmFtZSxhcmdsaXN0KSAgdHlwZSAoKm1ldGhvZG5hbWUpIGFyZ2xpc3QKLQkjZWxzZQotCSNkZWZpbmUgSk1FVEhPRCh0eXBlLG1ldGhvZG5hbWUsYXJnbGlzdCkgIHR5cGUgKCptZXRob2RuYW1lKSAoKQotCSNlbmRpZgotd2hpY2ggaXMgdXNlZCBsaWtlIHRoaXM6Ci0Jc3RydWN0IGZ1bmN0aW9uX3BvaW50ZXJzIHsKLQkgIEpNRVRIT0Qodm9pZCwgaW5pdF9lbnRyb3B5X2VuY29kZXIsIChpbnQgc29tZWFyZywganBhcm1zICpqcCkpOwotCSAgSk1FVEhPRCh2b2lkLCB0ZXJtX2VudHJvcHlfZW5jb2RlciwgKHZvaWQpKTsKLQl9OwotTm90ZSB0aGUgc2V0IG9mIHBhcmVudGhlc2VzIHN1cnJvdW5kaW5nIHRoZSBwYXJhbWV0ZXIgbGlzdC4KLQotQSBzaW1pbGFyIHNvbHV0aW9uIGlzIHVzZWQgZm9yIGZvcndhcmQgYW5kIGV4dGVybmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucwotKHNlZSB0aGUgRVhURVJOIGFuZCBKUFAgbWFjcm9zKS4KLQotSWYgdGhlIGNvZGUgaXMgdG8gd29yayBvbiBub24tQU5TSSBjb21waWxlcnMsIHdlIGNhbm5vdCByZWx5IG9uIGEgcHJvdG90eXBlCi1kZWNsYXJhdGlvbiB0byBjb2VyY2UgYWN0dWFsIHBhcmFtZXRlcnMgaW50byB0aGUgcmlnaHQgdHlwZXMuICBUaGVyZWZvcmUsIHVzZQotZXhwbGljaXQgY2FzdHMgb24gYWN0dWFsIHBhcmFtZXRlcnMgd2hlbmV2ZXIgdGhlIGFjdHVhbCBwYXJhbWV0ZXIgdHlwZSBpcyBub3QKLWlkZW50aWNhbCB0byB0aGUgZm9ybWFsIHBhcmFtZXRlci4gIEJld2FyZSBvZiBpbXBsaWNpdCBjb252ZXJzaW9ucyB0byAiaW50Ii4KLQotSXQgc2VlbXMgdGhlcmUgYXJlIHNvbWUgbm9uLUFOU0kgY29tcGlsZXJzIGluIHdoaWNoIHRoZSBzaXplb2YoKSBvcGVyYXRvcgotaXMgZGVmaW5lZCB0byByZXR1cm4gaW50LCB5ZXQgc2l6ZV90IGlzIGRlZmluZWQgYXMgbG9uZy4gIE5lZWRsZXNzIHRvIHNheSwKLXRoaXMgaXMgYnJhaW4tZGFtYWdlZC4gIEFsd2F5cyB1c2UgdGhlIFNJWkVPRigpIG1hY3JvIGluIHBsYWNlIG9mIHNpemVvZigpLAotc28gdGhhdCB0aGUgcmVzdWx0IGlzIGd1YXJhbnRlZWQgdG8gYmUgb2YgdHlwZSBzaXplX3QuCi0KLQotVGhlIEpQRUcgbGlicmFyeSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGhpbiBsYXJnZXIgcHJvZ3JhbXMuICBGdXJ0aGVybW9yZSwKLXdlIHdhbnQgaXQgdG8gYmUgcmVlbnRyYW50IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zIHRoYXQgcHJvY2VzcwotbXVsdGlwbGUgaW1hZ2VzIGNvbmN1cnJlbnRseS4gIFRoZSBmb2xsb3dpbmcgcnVsZXMgc3VwcG9ydCB0aGVzZSByZXF1aXJlbWVudHM6Ci0KLTEuIEF2b2lkIGRpcmVjdCB1c2Ugb2YgZmlsZSBJL08sICJtYWxsb2MiLCBlcnJvciByZXBvcnQgcHJpbnRvdXRzLCBldGM7Ci1wYXNzIHRoZXNlIHRocm91Z2ggdGhlIGNvbW1vbiByb3V0aW5lcyBwcm92aWRlZC4KLQotMi4gTWluaW1pemUgZ2xvYmFsIG5hbWVzcGFjZSBwb2xsdXRpb24uICBGdW5jdGlvbnMgc2hvdWxkIGJlIGRlY2xhcmVkIHN0YXRpYwotd2hlcmV2ZXIgcG9zc2libGUuICAoTm90ZSB0aGF0IG91ciBtZXRob2QtYmFzZWQgY2FsbGluZyBjb252ZW50aW9ucyBoZWxwIHRoaXMKLWEgbG90OiBpbiBtYW55IG1vZHVsZXMgb25seSB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gd2lsbCBldmVyIG5lZWQgdG8gYmUKLWNhbGxlZCBkaXJlY3RseSwgc28gb25seSB0aGF0IGZ1bmN0aW9uIG5lZWQgYmUgZXh0ZXJuYWxseSB2aXNpYmxlLikgIEFsbAotZ2xvYmFsIGZ1bmN0aW9uIG5hbWVzIHNob3VsZCBiZWdpbiB3aXRoICJqcGVnXyIsIGFuZCBzaG91bGQgaGF2ZSBhbgotYWJicmV2aWF0ZWQgbmFtZSAodW5pcXVlIGluIHRoZSBmaXJzdCBzaXggY2hhcmFjdGVycykgc3Vic3RpdHV0ZWQgYnkgbWFjcm8KLXdoZW4gTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyBpcyBzZXQuCi0KLTMuIERvbid0IHVzZSBnbG9iYWwgdmFyaWFibGVzOyBhbnl0aGluZyB0aGF0IG11c3QgYmUgdXNlZCBpbiBhbm90aGVyIG1vZHVsZQotc2hvdWxkIGJlIGluIHRoZSBjb21tb24gZGF0YSBzdHJ1Y3R1cmVzLgotCi00LiBEb24ndCB1c2Ugc3RhdGljIHZhcmlhYmxlcyBleGNlcHQgZm9yIHJlYWQtb25seSBjb25zdGFudCB0YWJsZXMuICBWYXJpYWJsZXMKLXRoYXQgc2hvdWxkIGJlIHByaXZhdGUgdG8gYSBtb2R1bGUgY2FuIGJlIHBsYWNlZCBpbnRvIHByaXZhdGUgc3RydWN0dXJlcyAoc2VlCi10aGUgc3lzdGVtIGFyY2hpdGVjdHVyZSBkb2N1bWVudCwgc3RydWN0dXJlLmRvYykuCi0KLTUuIFNvdXJjZSBmaWxlIG5hbWVzIHNob3VsZCBiZWdpbiB3aXRoICJqIiBmb3IgZmlsZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUKLWxpYnJhcnkgcHJvcGVyOyBzb3VyY2UgZmlsZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGxpYnJhcnksIHN1Y2ggYXMgY2pwZWcuYwotYW5kIGRqcGVnLmMsIGRvIG5vdCBiZWdpbiB3aXRoICJqIi4gIEtlZXAgc291cmNlIGZpbGUgbmFtZXMgdG8gZWlnaHQKLWNoYXJhY3RlcnMgKHBsdXMgIi5jIiBvciAiLmgiLCBldGMpIHRvIG1ha2UgbGlmZSBlYXN5IGZvciBNUy1ET1NlcnMuICBLZWVwCi1jb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBjb2RlIGluIHNlcGFyYXRlIHNvdXJjZSBmaWxlcyAtLS0gc29tZQotYXBwbGljYXRpb25zIG1heSB3YW50IG9ubHkgb25lIGhhbGYgb2YgdGhlIGxpYnJhcnkuCi0KLU5vdGU6IHRoZXNlIHJ1bGVzIChwYXJ0aWN1bGFybHkgIzQpIGFyZSBub3QgZm9sbG93ZWQgcmVsaWdpb3VzbHkgaW4gdGhlCi1tb2R1bGVzIHRoYXQgYXJlIHVzZWQgaW4gY2pwZWcvZGpwZWcgYnV0IGFyZSBub3QgcGFydCBvZiB0aGUgSlBFRyBsaWJyYXJ5Ci1wcm9wZXIuICBUaG9zZSBtb2R1bGVzIGFyZSBub3QgcmVhbGx5IGludGVuZGVkIHRvIGJlIHVzZWQgaW4gb3RoZXIKLWFwcGxpY2F0aW9ucy4KZGlmZiAtLWdpdCBhL2NvbmZpZy5ndWVzcyBiL2NvbmZpZy5ndWVzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyNWZhNC4uMDAwMDAwMAotLS0gYS9jb25maWcuZ3Vlc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkxICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCi0jICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotdGltZXN0YW1wPScyMDA2LTAxLTMwJwotCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0jIDAyMTEwLTEzMDEsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0KLSMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyIDxwZXJAYm90aG5lci5jb20+LgotIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKLSMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgotIwotIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCi0jIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAotIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KLSMKLSMgVGhlIHBsYW4gaXMgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgYnkgY29uZmlndXJlIHNjcmlwdHMgaWYgeW91Ci0jIGRvbid0IHNwZWNpZnkgYW4gZXhwbGljaXQgYnVpbGQgc3lzdGVtIHR5cGUuCi0KLW1lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAotCi11c2FnZT0iXAotVXNhZ2U6ICQwIFtPUFRJT05dCi0KLU91dHB1dCB0aGUgY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZSBzeXN0ZW0gXGAkbWUnIGlzIHJ1biBvbi4KLQotT3BlcmF0aW9uIG1vZGVzOgotICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKLSAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAotICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAotCi1SZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgotCi12ZXJzaW9uPSJcCi1HTlUgY29uZmlnLmd1ZXNzICgkdGltZXN0YW1wKQotCi1PcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIuCi1Db3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTwotd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgotCi1oZWxwPSIKLVRyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLQotIyBQYXJzZSBjb21tYW5kIGxpbmUKLXdoaWxlIHRlc3QgJCMgLWd0IDAgOyBkbwotICBjYXNlICQxIGluCi0gICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKLSAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKLSAgICAtLXZlcnNpb24gfCAtdiApCi0gICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OwotICAgIC0taGVscCB8IC0taCogfCAtaCApCi0gICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OwotICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZwotICAgICAgIHNoaWZ0OyBicmVhayA7OwotICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KLSAgICAgICBicmVhayA7OwotICAgIC0qICkKLSAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiID4mMgotICAgICAgIGV4aXQgMSA7OwotICAgICogKQotICAgICAgIGJyZWFrIDs7Ci0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAkIyAhPSAwOyB0aGVuCi0gIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgotICBleGl0IDEKLWZpCi0KLXRyYXAgJ2V4aXQgMScgMSAyIDE1Ci0KLSMgQ0NfRk9SX0JVSUxEIC0tIGNvbXBpbGVyIHVzZWQgYnkgdGhpcyBzY3JpcHQuIE5vdGUgdGhhdCB0aGUgdXNlIG9mIGEKLSMgY29tcGlsZXIgdG8gYWlkIGluIHN5c3RlbSBkZXRlY3Rpb24gaXMgZGlzY291cmFnZWQgYXMgaXQgcmVxdWlyZXMKLSMgdGVtcG9yYXJ5IGZpbGVzIHRvIGJlIGNyZWF0ZWQgYW5kLCBhcyB5b3UgY2FuIHNlZSBiZWxvdywgaXQgaXMgYQotIyBoZWFkYWNoZSB0byBkZWFsIHdpdGggaW4gYSBwb3J0YWJsZSBmYXNoaW9uLgotCi0jIEhpc3RvcmljYWxseSwgYENDX0ZPUl9CVUlMRCcgdXNlZCB0byBiZSBuYW1lZCBgSE9TVF9DQycuIFdlIHN0aWxsCi0jIHVzZSBgSE9TVF9DQycgaWYgZGVmaW5lZCwgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuCi0KLSMgUG9ydGFibGUgdG1wIGRpcmVjdG9yeSBjcmVhdGlvbiBpbnNwaXJlZCBieSB0aGUgQXV0b2NvbmYgdGVhbS4KLQotc2V0X2NjX2Zvcl9idWlsZD0nCi10cmFwICJleGl0Y29kZT1cJD87IChybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbCkgJiYgZXhpdCBcJGV4aXRjb2RlIiAwIDsKLXRyYXAgInJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsOyBleGl0IDEiIDEgMiAxMyAxNSA7Ci06ICR7VE1QRElSPS90bXB9IDsKLSB7IHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIiRUTVBESVIvY2dYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIgOyB9IHx8Ci0geyB0ZXN0IC1uICIkUkFORE9NIiAmJiB0bXA9JFRNUERJUi9jZyQkLSRSQU5ET00gJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSA7IH0gfHwKLSB7IHRtcD0kVE1QRElSL2NnLSQkICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgJiYgZWNobyAiV2FybmluZzogY3JlYXRpbmcgaW5zZWN1cmUgdGVtcCBkaXJlY3RvcnkiID4mMiA7IH0gfHwKLSB7IGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gJFRNUERJUiIgPiYyIDsgZXhpdCAxIDsgfSA7Ci1kdW1teT0kdG1wL2R1bW15IDsKLXRtcGZpbGVzPSIkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsICRkdW1teSIgOwotY2FzZSAkQ0NfRk9SX0JVSUxELCRIT1NUX0NDLCRDQyBpbgotICwsKSAgICBlY2hvICJpbnQgeDsiID4gJGR1bW15LmMgOwotCWZvciBjIGluIGNjIGdjYyBjODkgYzk5IDsgZG8KLQkgIGlmICgkYyAtYyAtbyAkZHVtbXkubyAkZHVtbXkuYykgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCSAgICAgQ0NfRk9SX0JVSUxEPSIkYyI7IGJyZWFrIDsKLQkgIGZpIDsKLQlkb25lIDsKLQlpZiB0ZXN0IHgiJENDX0ZPUl9CVUlMRCIgPSB4IDsgdGhlbgotCSAgQ0NfRk9SX0JVSUxEPW5vX2NvbXBpbGVyX2ZvdW5kIDsKLQlmaQotCTs7Ci0gLCwqKSAgIENDX0ZPUl9CVUlMRD0kQ0MgOzsKLSAsKiwqKSAgQ0NfRk9SX0JVSUxEPSRIT1NUX0NDIDs7Ci1lc2FjIDsgc2V0X2NjX2Zvcl9idWlsZD0gOycKLQotIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KLSMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSAxOTk0LTA4LTI0KQotaWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKLWZpCi0KLVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgotVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCi1VTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgICB8fCBVTkFNRV9TWVNURU09dW5rbm93bgotVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCi0KLSMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KLQotY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgotICAgICo6TmV0QlNEOio6KikKLQkjIE5ldEJTRCAobmJzZCkgdGFyZ2V0cyBzaG91bGQgKHdoZXJlIGFwcGxpY2FibGUpIG1hdGNoIG9uZSBvcgotCSMgbW9yZSBvZiB0aGUgdHVwcGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKLQkjICotKi1uZXRic2RlY29mZiogYW5kICotKi1uZXRic2QqLiAgRm9yIHRhcmdldHMgdGhhdCByZWNlbnRseQotCSMgc3dpdGNoZWQgdG8gRUxGLCAqLSotbmV0YnNkKiB3b3VsZCBzZWxlY3QgdGhlIG9sZAotCSMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhpcyBwcm92aWRlcyBib3RoIGZvcndhcmQKLQkjIGNvbXBhdGliaWxpdHkgYW5kIGEgY29uc2lzdGVudCBtZWNoYW5pc20gZm9yIHNlbGVjdGluZyB0aGUKLQkjIG9iamVjdCBmaWxlIGZvcm1hdC4KLQkjCi0JIyBOb3RlOiBOZXRCU0QgZG9lc24ndCBwYXJ0aWN1bGFybHkgY2FyZSBhYm91dCB0aGUgdmVuZG9yCi0JIyBwb3J0aW9uIG9mIHRoZSBuYW1lLiAgV2UgYWx3YXlzIHNldCBpdCB0byAidW5rbm93biIuCi0Jc3lzY3RsPSJzeXNjdGwgLW4gaHcubWFjaGluZV9hcmNoIgotCVVOQU1FX01BQ0hJTkVfQVJDSD1gKC9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgXAotCSAgICAvdXNyL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd24pYAotCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KLQkgICAgYXJtZWIpIG1hY2hpbmU9YXJtZWItdW5rbm93biA7OwotCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7Ci0JICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7Ci0JICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKLQkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OwotCWVzYWMKLQkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKLQkjIHRvIEVMRiByZWNlbnRseSwgb3Igd2lsbCBpbiB0aGUgZnV0dXJlLgotCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KLQkgICAgYXJtKnxpMzg2fG02OGt8bnMzMmt8c2gzKnxzcGFyY3x2YXgpCi0JCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKLQkJCXwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGwKLQkJdGhlbgotCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgotCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/Ci0JCSAgICBvcz1uZXRic2QKLQkJZWxzZQotCQkgICAgb3M9bmV0YnNkZWxmCi0JCWZpCi0JCTs7Ci0JICAgICopCi0JICAgICAgICBvcz1uZXRic2QKLQkJOzsKLQllc2FjCi0JIyBUaGUgT1MgcmVsZWFzZQotCSMgRGViaWFuIEdOVS9OZXRCU0QgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCB1c2VybGFuZCwgYW5kCi0JIyB0aHVzLCBuZWVkIGEgZGlzdGluY3QgdHJpcGxldC4gSG93ZXZlciwgdGhleSBkbyBub3QgbmVlZAotCSMga2VybmVsIHZlcnNpb24gaW5mb3JtYXRpb24sIHNvIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEKLQkjIHN1aXRhYmxlIHRhZywgaW4gdGhlIHN0eWxlIG9mIGxpbnV4LWdudS4KLQljYXNlICIke1VOQU1FX1ZFUlNJT059IiBpbgotCSAgICBEZWJpYW4qKQotCQlyZWxlYXNlPSctZ251JwotCQk7OwotCSAgICAqKQotCQlyZWxlYXNlPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAotCQk7OwotCWVzYWMKLQkjIFNpbmNlIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTToKLQkjIGNvbnRhaW5zIHJlZHVuZGFudCBpbmZvcm1hdGlvbiwgdGhlIHNob3J0ZXIgZm9ybToKLQkjIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNIGlzIHVzZWQuCi0JZWNobyAiJHttYWNoaW5lfS0ke29zfSR7cmVsZWFzZX0iCi0JZXhpdCA7OwotICAgICo6T3BlbkJTRDoqOiopCi0JVU5BTUVfTUFDSElORV9BUkNIPWBhcmNoIHwgc2VkICdzL09wZW5CU0QuLy8nYAotCWVjaG8gJHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpla2tvQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1la2tvYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOlNvbGlkQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zb2xpZGJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgbWFjcHBjOk1pckJTRDoqOiopCi0JZWNobyBwb3dlcnBwYy11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpNaXJCU0Q6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgYWxwaGE6T1NGMToqOiopCi0JY2FzZSAkVU5BTUVfUkVMRUFTRSBpbgotCSo0LjApCi0JCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCi0JCTs7Ci0JKjUuKikKLQkgICAgICAgIFVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQ0fSdgCi0JCTs7Ci0JZXNhYwotCSMgQWNjb3JkaW5nIHRvIENvbXBhcSwgL3Vzci9zYmluL3BzcmluZm8gaGFzIGJlZW4gYXZhaWxhYmxlIG9uCi0JIyBPU0YvMSBhbmQgVHJ1NjQgc3lzdGVtcyBwcm9kdWNlZCBzaW5jZSAxOTk1LiAgSSBob3BlIHRoYXQKLQkjIGNvdmVycyBtb3N0IHN5c3RlbXMgcnVubmluZyB0b2RheS4gIFRoaXMgY29kZSBwaXBlcyB0aGUgQ1BVCi0JIyB0eXBlcyB0aHJvdWdoIGhlYWQgLW4gMSwgc28gd2Ugb25seSBkZXRlY3QgdGhlIHR5cGUgb2YgQ1BVIDAuCi0JQUxQSEFfQ1BVX1RZUEU9YC91c3Ivc2Jpbi9wc3JpbmZvIC12IHwgc2VkIC1uIC1lICdzL14gIFRoZSBhbHBoYSBcKC4qXCkgcHJvY2Vzc29yLiokL1wxL3AnIHwgaGVhZCAtbiAxYAotCWNhc2UgIiRBTFBIQV9DUFVfVFlQRSIgaW4KLQkgICAgIkVWNCAoMjEwNjQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7Ci0JICAgICJFVjQuNSAoMjEwNjQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7Ci0JICAgICJMQ0E0ICgyMTA2Ni8yMTA2OCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKLQkgICAgIkVWNSAoMjExNjQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiIDs7Ci0JICAgICJFVjUuNiAoMjExNjRBKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIgOzsKLQkgICAgIkVWNS42ICgyMTE2NFBDKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiIDs7Ci0JICAgICJFVjUuNyAoMjExNjRQQykiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU3IiA7OwotCSAgICAiRVY2ICgyMTI2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIgOzsKLQkgICAgIkVWNi43ICgyMTI2NEEpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY3IiA7OwotCSAgICAiRVY2LjhDQiAoMjEyNjRDKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKLQkgICAgIkVWNi44QUwgKDIxMjY0QikiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7Ci0JICAgICJFVjYuOENYICgyMTI2NEQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OwotCSAgICAiRVY2LjlBICgyMTI2NC9FVjY5QSkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjkiIDs7Ci0JICAgICJFVjcgKDIxMzY0KSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3IiA7OwotCSAgICAiRVY3LjkgKDIxMzY0QSkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NzkiIDs7Ci0JZXNhYwotCSMgQSBQbi5uIHZlcnNpb24gaXMgYSBwYXRjaGVkIHZlcnNpb24uCi0JIyBBIFZuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIHZlcnNpb24uCi0JIyBBIFRuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIGZpZWxkIHRlc3QgdmVyc2lvbi4KLQkjIEEgWG4ubiB2ZXJzaW9uIGlzIGFuIHVucmVsZWFzZWQgZXhwZXJpbWVudGFsIGJhc2VsZXZlbC4KLQkjIDEuMiB1c2VzICIxLjIiIGZvciB1bmFtZSAtci4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLW9zZmBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXltQVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKLQlleGl0IDs7Ci0gICAgQWxwaGFcICo6V2luZG93c19OVCo6KikKLQkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/Ci0JIyBTaG91bGQgd2UgY2hhbmdlIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkCi0JIyBvZiB0aGUgc3BlY2lmaWMgQWxwaGEgbW9kZWw/Ci0JZWNobyBhbHBoYS1wYy1pbnRlcml4Ci0JZXhpdCA7OwotICAgIDIxMDY0OldpbmRvd3NfTlQ6NTA6MykKLQllY2hvIGFscGhhLWRlYy13aW5udDMuNQotCWV4aXQgOzsKLSAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKLQllY2hvIG02OGstdW5rbm93bi1zeXN2NAotCWV4aXQgOzsKLSAgICAqOltBYV1taWdhW09vXVtTc106KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWFtaWdhb3MKLQlleGl0IDs7Ci0gICAgKjpbTW1db3JwaFtPb11bU3NdOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1tb3JwaG9zCi0JZXhpdCA7OwotICAgICo6T1MvMzkwOio6KikKLQllY2hvIGkzNzAtaWJtLW9wZW5lZGl0aW9uCi0JZXhpdCA7OwotICAgICo6ei9WTToqOiopCi0JZWNobyBzMzkwLWlibS16dm1vZQotCWV4aXQgOzsKLSAgICAqOk9TNDAwOio6KikKLSAgICAgICAgZWNobyBwb3dlcnBjLWlibS1vczQwMAotCWV4aXQgOzsKLSAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCi0JZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBhcm06cmlzY29zOio6Knxhcm06UklTQ09TOio6KikKLQllY2hvIGFybS11bmtub3duLXJpc2NvcwotCWV4aXQgOzsKLSAgICBTUjI/MDE6SEktVVgvTVBQOio6KiB8IFNSODAwMDpISS1VWC9NUFA6KjoqKQotCWVjaG8gaHBwYTEuMS1oaXRhY2hpLWhpdXhtcHAKLQlleGl0IDs7Ci0gICAgUHlyYW1pZCo6T1N4KjoqOiogfCBNSVMqOk9TeCo6KjoqIHwgTUlTKjpTTVBfREMtT1N4KjoqOiopCi0JIyBha2VlQHdwZGlzMDMud3BhZmIuYWYubWlsIChFYXJsZSBGLiBBa2UpIGNvbnRyaWJ1dGVkIE1JUyBhbmQgTklMRS4KLQlpZiB0ZXN0ICJgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYCIgPSBhdHQgOyB0aGVuCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN5c3YzCi0JZWxzZQotCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1ic2QKLQlmaQotCWV4aXQgOzsKLSAgICBOSUxFKjoqOio6ZGNvc3gpCi0JZWNobyBweXJhbWlkLXB5cmFtaWQtc3ZyNAotCWV4aXQgOzsKLSAgICBEUlM/NjAwMDp1bml4OjQuMDo2KikKLQllY2hvIHNwYXJjLWljbC1ueDYKLQlleGl0IDs7Ci0gICAgRFJTPzYwMDA6VU5JWF9TVjo0LjIqOjcqIHwgRFJTPzYwMDA6aXNpczo0LjIqOjcqKQotCWNhc2UgYC91c3IvYmluL3VuYW1lIC1wYCBpbgotCSAgICBzcGFyYykgZWNobyBzcGFyYy1pY2wtbng3OyBleGl0IDs7Ci0JZXNhYyA7OwotICAgIHN1bjRIOlN1bk9TOjUuKjoqKQotCWVjaG8gc3BhcmMtaGFsLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCA7OwotICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDs7Ci0gICAgaTg2cGM6U3VuT1M6NS4qOiopCi0JZWNobyBpMzg2LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCA7OwotICAgIHN1bjQqOlN1bk9TOjYqOiopCi0JIyBBY2NvcmRpbmcgdG8gY29uZmlnLnN1YiwgdGhpcyBpcyB0aGUgcHJvcGVyIHdheSB0byBjYW5vbmljYWxpemUKLQkjIFN1bk9TNi4gIEhhcmQgdG8gZ3Vlc3MgZXhhY3RseSB3aGF0IFN1bk9TNiB3aWxsIGJlIGxpa2UsIGJ1dAotCSMgaXQncyBsaWtlbHkgdG8gYmUgbW9yZSBsaWtlIFNvbGFyaXMgdGhhbiBTdW5PUzQuCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczNgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDs7Ci0gICAgc3VuNCo6U3VuT1M6KjoqKQotCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KLQkgICAgU2VyaWVzKnxTNCopCi0JCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAotCQk7OwotCWVzYWMKLQkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCi0JZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKLQlleGl0IDs7Ci0gICAgc3VuMyo6U3VuT1M6KjoqKQotCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIHN1bio6Kjo0LjJCU0Q6KikKLQlVTkFNRV9SRUxFQVNFPWAoc2VkIDFxIC9ldGMvbW90ZCB8IGF3ayAne3ByaW50IHN1YnN0cigkNSwxLDMpfScpIDI+L2Rldi9udWxsYAotCXRlc3QgIngke1VOQU1FX1JFTEVBU0V9IiA9ICJ4IiAmJiBVTkFNRV9SRUxFQVNFPTMKLQljYXNlICJgL2Jpbi9hcmNoYCIgaW4KLQkgICAgc3VuMykKLQkJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQkJOzsKLQkgICAgc3VuNCkKLQkJZWNobyBzcGFyYy1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JCTs7Ci0JZXNhYwotCWV4aXQgOzsKLSAgICBhdXNocDpTdW5PUzoqOiopCi0JZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICMgVGhlIHNpdHVhdGlvbiBmb3IgTWlOVCBpcyBhIGxpdHRsZSBjb25mdXNpbmcuICBUaGUgbWFjaGluZSBuYW1lCi0gICAgIyBjYW4gYmUgdmlydHVhbGx5IGV2ZXJ5dGhpbmcgKGV2ZXJ5dGhpbmcgd2hpY2ggaXMgbm90Ci0gICAgIyAiYXRhcmlzdCIgb3IgImF0YXJpc3RlIiBhdCBsZWFzdCBzaG91bGQgaGF2ZSBhIHByb2Nlc3NvcgotICAgICMgPiBtNjgwMDApLiAgVGhlIHN5c3RlbSBuYW1lIHJhbmdlcyBmcm9tICJNaU5UIiBvdmVyICJGcmVlTWlOVCIKLSAgICAjIHRvIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiAibWludCIgKG9yICJmcmVlbWludCIpLiAgRmluYWxseQotICAgICMgdGhlIHN5c3RlbSBuYW1lICJUT1MiIGRlbm90ZXMgYSBzeXN0ZW0gd2hpY2ggaXMgYWN0dWFsbHkgbm90Ci0gICAgIyBNaU5ULiAgQnV0IE1pTlQgaXMgZG93bndhcmQgY29tcGF0aWJsZSB0byBUT1MsIHNvIHRoaXMgc2hvdWxkCi0gICAgIyBiZSBubyBwcm9ibGVtLgotICAgIGF0YXJpc3RbZV06Kk1pTlQ6KjoqIHwgYXRhcmlzdFtlXToqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgYXRhcmkqOipNaU5UOio6KiB8IGF0YXJpKjoqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQotCWVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDs7Ci0gICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBtaWxhbio6Kk1pTlQ6KjoqIHwgbWlsYW4qOiptaW50Oio6KiB8ICptaWxhbio6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1taWxhbi1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDs7Ci0gICAgaGFkZXMqOipNaU5UOio6KiB8IGhhZGVzKjoqbWludDoqOiogfCAqaGFkZXMqOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstaGFkZXMtbWludCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZXhpdCA7OwotICAgICo6Kk1pTlQ6KjoqIHwgKjoqbWludDoqOiogfCAqOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDs7Ci0gICAgbTY4azptYWNodGVuOio6KikKLQllY2hvIG02OGstYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgcG93ZXJwYzptYWNodGVuOio6KikKLQllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgUklTQyo6TWFjaDoqOiopCi0JZWNobyBtaXBzLWRlYy1tYWNoX2JzZDQuMwotCWV4aXQgOzsKLSAgICBSSVNDKjpVTFRSSVg6KjoqKQotCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBWQVgqOlVMVFJJWCo6KjoqKQotCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIDIwMjA6Q0xJWDoqOiogfCAyNDMwOkNMSVg6KjoqKQotCWVjaG8gY2xpcHBlci1pbnRlcmdyYXBoLWNsaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KLQlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotI2Vsc2UKLQlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgewotI2VuZGlmCi0JI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNlbmRpZgotCSAgZXhpdCAoLTEpOwotCX0KLUVPRgotCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmCi0JICBkdW1teWFyZz1gZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCAmJgotCSAgU1lTVEVNX05BTUU9YCRkdW1teSAkZHVtbXlhcmdgICYmCi0JICAgIHsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQotCWVjaG8gbWlwcy1taXBzLXJpc2NvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgTW90b3JvbGE6UG93ZXJNQVhfT1M6KjoqKQotCWVjaG8gcG93ZXJwYy1tb3Rvcm9sYS1wb3dlcm1heAotCWV4aXQgOzsKLSAgICBNb3Rvcm9sYToqOjQuMzpQTDgtKikKLQllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4Ci0JZXhpdCA7OwotICAgIE5pZ2h0X0hhd2s6KjoqOlBvd2VyTUFYX09TIHwgU3luZXJneTpQb3dlck1BWF9PUzoqOiopCi0JZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAotCWV4aXQgOzsKLSAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQotCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4Ci0JZXhpdCA7OwotICAgIG04OGs6Q1gvVVg6Nyo6KikKLQllY2hvIG04OGstaGFycmlzLWN4dXg3Ci0JZXhpdCA7OwotICAgIG04OGs6Kjo0KjpSNCopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0Ci0JZXhpdCA7OwotICAgIG04OGs6KjozKjpSMyopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCA7OwotICAgIEFWaWlPTjpkZ3V4Oio6KikKLSAgICAgICAgIyBERy9VWCByZXR1cm5zIEFWaWlPTiBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKLSAgICAgICAgVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKLQlpZiBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTAwIF0gfHwgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdCi0JdGhlbgotCSAgICBpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBdIHx8IFwKLQkgICAgICAgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0KLQkgICAgdGhlbgotCQllY2hvIG04OGstZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KLQkgICAgZWxzZQotCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KLQkgICAgZmkKLQllbHNlCi0JICAgIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQotCWZpCi0gCWV4aXQgOzsKLSAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQotCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCi0JZXhpdCA7OwotICAgIE04OCo6KjpSMyo6KikKLQkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCA7OwotICAgIFhEODgqOio6KjoqKSAjIFRla3Ryb25peCBYRDg4IHN5c3RlbSBydW5uaW5nIFVUZWtWIChTVlIzKQotCWVjaG8gbTg4ay10ZWt0cm9uaXgtc3lzdjMKLQlleGl0IDs7Ci0gICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKLQllY2hvIG02OGstdGVrdHJvbml4LWJzZAotCWV4aXQgOzsKLSAgICAqOklSSVgqOio6KikKLQllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCi0JZXhpdCA7OwotICAgID8/Pz8/Pz8/OkFJWD86WzEyXS4xOjIpICAgIyBBSVggMi4yLjEgb3IgQUlYIDIuMS4xIGlzIFJUL1BDIEFJWC4KLQllY2hvIHJvbXAtaWJtLWFpeCAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAotCWV4aXQgOzsgICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKLSAgICBpKjg2OkFJWDoqOiopCi0JZWNobyBpMzg2LWlibS1haXgKLQlleGl0IDs7Ci0gICAgaWE2NDpBSVg6KjoqKQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tYWl4JHtJQk1fUkVWfQotCWV4aXQgOzsKLSAgICAqOkFJWDoyOjMpCi0JaWYgZ3JlcCBib3MzMjUgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJc2VkICdzL14JCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JCSNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+Ci0KLQkJbWFpbigpCi0JCQl7Ci0JCQlpZiAoIV9fcG93ZXJfcGMoKSkKLQkJCQlleGl0KDEpOwotCQkJcHV0cygicG93ZXJwYy1pYm0tYWl4My4yLjUiKTsKLQkJCWV4aXQoMCk7Ci0JCQl9Ci1FT0YKLQkJaWYgJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAKLQkJdGhlbgotCQkJZWNobyAiJFNZU1RFTV9OQU1FIgotCQllbHNlCi0JCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKLQkJZmkKLQllbGlmIGdyZXAgYm9zMzI0IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjQKLQllbHNlCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIKLQlmaQotCWV4aXQgOzsKLSAgICAqOkFJWDoqOls0NV0pCi0JSUJNX0NQVV9JRD1gL3Vzci9zYmluL2xzZGV2IC1DIC1jIHByb2Nlc3NvciAtUyBhdmFpbGFibGUgfCBzZWQgMXEgfCBhd2sgJ3sgcHJpbnQgJDEgfSdgCi0JaWYgL3Vzci9zYmluL2xzYXR0ciAtRWwgJHtJQk1fQ1BVX0lEfSB8IGdyZXAgJyBQT1dFUicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCUlCTV9BUkNIPXJzNjAwMAotCWVsc2UKLQkJSUJNX0FSQ0g9cG93ZXJwYwotCWZpCi0JaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCi0JCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCi0JZWxzZQotCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQotCWZpCi0JZWNobyAke0lCTV9BUkNIfS1pYm0tYWl4JHtJQk1fUkVWfQotCWV4aXQgOzsKLSAgICAqOkFJWDoqOiopCi0JZWNobyByczYwMDAtaWJtLWFpeAotCWV4aXQgOzsKLSAgICBpYm1ydDo0LjRCU0Q6Knxyb21wLWlibTpCU0Q6KikKLQllY2hvIHJvbXAtaWJtLWJzZDQuNAotCWV4aXQgOzsKLSAgICBpYm1ydDoqQlNEOip8cm9tcC1pYm06QlNEOiopICAgICAgICAgICAgIyBjb3ZlcnMgUlQvUEMgQlNEIGFuZAotCWVjaG8gcm9tcC1pYm0tYnNkJHtVTkFNRV9SRUxFQVNFfSAgICMgNC4zIHdpdGggdW5hbWUgYWRkZWQgdG8KLQlleGl0IDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcG9ydDogcm9tcC1pYm0gQlNEIDQuMwotICAgICo6Qk9TWDoqOiopCi0JZWNobyByczYwMDAtYnVsbC1ib3N4Ci0JZXhpdCA7OwotICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCi0JZWNobyBtNjhrLWJ1bGwtc3lzdjMKLQlleGl0IDs7Ci0gICAgOTAwMC9bMzRdPz86NC4zYnNkOjEuKjoqKQotCWVjaG8gbTY4ay1ocC1ic2QKLQlleGl0IDs7Ci0gICAgaHAzMDA6NC40QlNEOio6KiB8IDkwMDAvWzM0XT8/OjQuM2JzZDoyLio6KikKLQllY2hvIG02OGstaHAtYnNkNC40Ci0JZXhpdCA7OwotICAgIDkwMDAvWzM0Njc4XT8/OkhQLVVYOio6KikKLQlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKLQljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKLQkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OwotCSAgICA5MDAwL1s2NzhdWzAtOV1bMC05XSkKLQkJaWYgWyAteCAvdXNyL2Jpbi9nZXRjb25mIF07IHRoZW4KLQkJICAgIHNjX2NwdV92ZXJzaW9uPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0NQVV9WRVJTSU9OIDI+L2Rldi9udWxsYAotICAgICAgICAgICAgICAgICAgICBzY19rZXJuZWxfYml0cz1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19LRVJORUxfQklUUyAyPi9kZXYvbnVsbGAKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19jcHVfdmVyc2lvbn0iIGluCi0gICAgICAgICAgICAgICAgICAgICAgNTIzKSBIUF9BUkNIPSJocHBhMS4wIiA7OyAjIENQVV9QQV9SSVNDMV8wCi0gICAgICAgICAgICAgICAgICAgICAgNTI4KSBIUF9BUkNIPSJocHBhMS4xIiA7OyAjIENQVV9QQV9SSVNDMV8xCi0gICAgICAgICAgICAgICAgICAgICAgNTMyKSAgICAgICAgICAgICAgICAgICAgICAjIENQVV9QQV9SSVNDMl8wCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2tlcm5lbF9iaXRzfSIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgMzIpIEhQX0FSQ0g9ImhwcGEyLjBuIiA7OwotICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkgSFBfQVJDSD0iaHBwYTIuMHciIDs7Ci0JCQkgICcnKSBIUF9BUkNIPSJocHBhMi4wIiA7OyAgICMgSFAtVVggMTAuMjAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMgOzsKLSAgICAgICAgICAgICAgICAgICAgZXNhYwotCQlmaQotCQlpZiBbICIke0hQX0FSQ0h9IiA9ICIiIF07IHRoZW4KLQkJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJICAgIHNlZCAncy9eICAgICAgICAgICAgICAvLycgPDwgRU9GID4kZHVtbXkuYwotCi0gICAgICAgICAgICAgICNkZWZpbmUgX0hQVVhfU09VUkNFCi0gICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KLSAgICAgICAgICAgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0gICAgICAgICAgICAgIGludCBtYWluICgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQotICAgICAgICAgICAgICAgICAgbG9uZyBiaXRzID0gc3lzY29uZihfU0NfS0VSTkVMX0JJVFMpOwotICAgICAgICAgICAgICAjZW5kaWYKLSAgICAgICAgICAgICAgICAgIGxvbmcgY3B1ICA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0KLSAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3B1KQotICAgICAgICAgICAgICAJewotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMSIpOyBicmVhazsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MyXzA6Ci0gICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKLSAgICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGJpdHMpCi0gICAgICAgICAgICAgIAkJewotICAgICAgICAgICAgICAJCWNhc2UgNjQ6IHB1dHMgKCJocHBhMi4wdyIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQljYXNlIDMyOiBwdXRzICgiaHBwYTIuMG4iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJZGVmYXVsdDogcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJfSBicmVhazsKLSAgICAgICAgICAgICAgI2Vsc2UgIC8qICFkZWZpbmVkKF9TQ19LRVJORUxfQklUUykgKi8KLSAgICAgICAgICAgICAgCSAgICBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgI2VuZGlmCi0gICAgICAgICAgICAgIAlkZWZhdWx0OiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgIGV4aXQgKDApOwotICAgICAgICAgICAgICB9Ci1FT0YKLQkJICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsKSAmJiBIUF9BUkNIPWAkZHVtbXlgCi0JCSAgICB0ZXN0IC16ICIkSFBfQVJDSCIgJiYgSFBfQVJDSD1ocHBhCi0JCWZpIDs7Ci0JZXNhYwotCWlmIFsgJHtIUF9BUkNIfSA9ICJocHBhMi4wdyIgXQotCXRoZW4KLQkgICAgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCi0JICAgICMgaHBwYTIuMHctaHAtaHB1eCogaGFzIGEgNjQtYml0IGtlcm5lbCBhbmQgYSBjb21waWxlciBnZW5lcmF0aW5nCi0JICAgICMgMzItYml0IGNvZGUuICBocHBhNjQtaHAtaHB1eCogaGFzIHRoZSBzYW1lIGtlcm5lbCBhbmQgYSBjb21waWxlcgotCSAgICAjIGdlbmVyYXRpbmcgNjQtYml0IGNvZGUuICBHTlUgYW5kIEhQIHVzZSBkaWZmZXJlbnQgbm9tZW5jbGF0dXJlOgotCSAgICAjCi0JICAgICMgJCBDQ19GT1JfQlVJTEQ9Y2MgLi9jb25maWcuZ3Vlc3MKLQkgICAgIyA9PiBocHBhMi4wdy1ocC1ocHV4MTEuMjMKLQkgICAgIyAkIENDX0ZPUl9CVUlMRD0iY2MgK0RBMi4wdyIgLi9jb25maWcuZ3Vlc3MKLQkgICAgIyA9PiBocHBhNjQtaHAtaHB1eDExLjIzCi0KLQkgICAgaWYgZWNobyBfX0xQNjRfXyB8IChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfAotCQlncmVwIF9fTFA2NF9fID4vZGV2L251bGwKLQkgICAgdGhlbgotCQlIUF9BUkNIPSJocHBhMi4wdyIKLQkgICAgZWxzZQotCQlIUF9BUkNIPSJocHBhNjQiCi0JICAgIGZpCi0JZmkKLQllY2hvICR7SFBfQVJDSH0taHAtaHB1eCR7SFBVWF9SRVZ9Ci0JZXhpdCA7OwotICAgIGlhNjQ6SFAtVVg6KjoqKQotCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAotCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KLQlleGl0IDs7Ci0gICAgMzA1MCo6SEktVVg6KjoqKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotCSNpbmNsdWRlIDx1bmlzdGQuaD4KLQlpbnQKLQltYWluICgpCi0JewotCSAgbG9uZyBjcHUgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOwotCSAgLyogVGhlIG9yZGVyIG1hdHRlcnMsIGJlY2F1c2UgQ1BVX0lTX0hQX01DNjhLIGVycm9uZW91c2x5IHJldHVybnMKLQkgICAgIHRydWUgZm9yIENQVV9QQV9SSVNDMV8wLiAgQ1BVX0lTX1BBX1JJU0MgcmV0dXJucyBjb3JyZWN0Ci0JICAgICByZXN1bHRzLCBob3dldmVyLiAgKi8KLQkgIGlmIChDUFVfSVNfUEFfUklTQyAoY3B1KSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoY3B1KQotCQl7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBjYXNlIENQVV9QQV9SSVNDMl8wOiBwdXRzICgiaHBwYTIuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgZGVmYXVsdDogcHV0cyAoImhwcGEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKENQVV9JU19IUF9NQzY4SyAoY3B1KSkKLQkgICAgcHV0cyAoIm02OGstaGl0YWNoaS1oaXV4d2UyIik7Ci0JICBlbHNlIHB1dHMgKCJ1bmtub3duLWhpdGFjaGktaGl1eHdlMiIpOwotCSAgZXhpdCAoMCk7Ci0JfQotRU9GCi0JJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKLQkJeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9Ci0JZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgotCWV4aXQgOzsKLSAgICA5MDAwLzc/Pzo0LjNic2Q6KjoqIHwgOTAwMC84P1s3OV06NC4zYnNkOio6KiApCi0JZWNobyBocHBhMS4xLWhwLWJzZAotCWV4aXQgOzsKLSAgICA5MDAwLzg/Pzo0LjNic2Q6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1ic2QKLQlleGl0IDs7Ci0gICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAotCWV4aXQgOzsKLSAgICBocDc/PzpPU0YxOio6KiB8IGhwOD9bNzldOk9TRjE6KjoqICkKLQllY2hvIGhwcGExLjEtaHAtb3NmCi0JZXhpdCA7OwotICAgIGhwOD8/Ok9TRjE6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1vc2YKLQlleGl0IDs7Ci0gICAgaSo4NjpPU0YxOio6KikKLQlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtawotCWVsc2UKLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQotCWZpCi0JZXhpdCA7OwotICAgIHBhcmlzYyo6TGl0ZXMqOio6KikKLQllY2hvIGhwcGExLjEtaHAtbGl0ZXMKLQlleGl0IDs7Ci0gICAgQzEqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMSo6KikKLQllY2hvIGMxLWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCA7OwotICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCi0JaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCi0JdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCi0JZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKLQlmaQotICAgICAgICBleGl0IDs7Ci0gICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCA7OwotICAgIEMzOCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzOCo6KikKLQllY2hvIGMzOC1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgOzsKLSAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQotCWVjaG8gYzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDs7Ci0gICAgQ1JBWSpZLU1QOio6KjoqKQotCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCA7OwotICAgIENSQVkqW0EtWl05MDoqOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKLQl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKLQkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LyBcCi0JICAgICAgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgOzsKLSAgICBDUkFZKlRTOio6KjoqKQotCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCA7OwotICAgIENSQVkqVDNFOio6KjoqKQotCWVjaG8gYWxwaGFldjUtY3JheS11bmljb3NtayR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgOzsKLSAgICBDUkFZKlNWMToqOio6KikKLQllY2hvIHN2MS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgOzsKLSAgICAqOlVOSUNPUy9tcDoqOiopCi0JZWNobyBjcmF5bnYtY3JheS11bmljb3NtcCR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgOzsKLSAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKLQlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAotICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCi0gICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCi0gICAgICAgIGVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCi0gICAgICAgIGV4aXQgOzsKLSAgICA1MDAwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCi0gICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKLSAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy8gL18vJ2AKLSAgICAgICAgZWNobyAic3BhcmMtZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgotCWV4aXQgOzsKLSAgICBpKjg2OkJTRC8zODY6KjoqIHwgaSo4NjpCU0QvT1M6KjoqIHwgKjpBc2NlbmRcIEVtYmVkZGVkL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgc3BhcmMqOkJTRC9PUzoqOiopCi0JZWNobyBzcGFyYy11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6QlNEL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOkZyZWVCU0Q6KjoqKQotCWNhc2UgJHtVTkFNRV9NQUNISU5FfSBpbgotCSAgICBwYzk4KQotCQllY2hvIGkzODYtdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OwotCSAgICAqKQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OwotCWVzYWMKLQlleGl0IDs7Ci0gICAgaSo6Q1lHV0lOKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4KLQlleGl0IDs7Ci0gICAgaSo6TUlOR1cqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbmd3MzIKLQlleGl0IDs7Ci0gICAgaSo6d2luZG93czMyKjoqKQotICAgIAkjIHVuYW1lIC1tIGluY2x1ZGVzICItcGMiIG9uIHRoaXMgc3lzdGVtLgotICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tbWluZ3czMgotCWV4aXQgOzsKLSAgICBpKjpQVyo6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcHczMgotCWV4aXQgOzsKLSAgICB4ODY6SW50ZXJpeCo6WzM0NV0qKQotCWVjaG8gaTU4Ni1wYy1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvXC4uKi8vJwotCWV4aXQgOzsKLSAgICBbMzQ1XTg2OldpbmRvd3NfOTU6KiB8IFszNDVdODY6V2luZG93c185ODoqIHwgWzM0NV04NjpXaW5kb3dzX05UOiopCi0JZWNobyBpJHtVTkFNRV9NQUNISU5FfS1wYy1ta3MKLQlleGl0IDs7Ci0gICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCi0JIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPwotCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCi0JIyBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZiBpMzg2PwotCWVjaG8gaTU4Ni1wYy1pbnRlcml4Ci0JZXhpdCA7OwotICAgIGkqOlVXSU4qOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KLQlleGl0IDs7Ci0gICAgYW1kNjQ6Q1lHV0lOKjoqOiogfCB4ODZfNjQ6Q1lHV0lOKjoqOiopCi0JZWNobyB4ODZfNjQtdW5rbm93bi1jeWd3aW4KLQlleGl0IDs7Ci0gICAgcCo6Q1lHV0lOKjoqKQotCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luCi0JZXhpdCA7OwotICAgIHByZXAqOlN1bk9TOjUuKjoqKQotCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDs7Ci0gICAgKjpHTlU6KjoqKQotCSMgdGhlIEdOVSBzeXN0ZW0KLQllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKLQlleGl0IDs7Ci0gICAgKjpHTlUvKjoqOiopCi0JIyBvdGhlciBzeXN0ZW1zIHdpdGggR05VIGxpYmMgYW5kIHVzZXJsYW5kCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYGVjaG8gJHtVTkFNRV9TWVNURU19IHwgc2VkICdzLF5bXi9dKi8sLCcgfCB0ciAnW0EtWl0nICdbYS16XSdgYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYC1nbnUKLQlleGl0IDs7Ci0gICAgaSo4NjpNaW5peDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbml4Ci0JZXhpdCA7OwotICAgIGFybSo6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBjcmlzOkxpbnV4Oio6KikKLQllY2hvIGNyaXMtYXhpcy1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgY3Jpc3YzMjpMaW51eDoqOiopCi0JZWNobyBjcmlzdjMyLWF4aXMtbGludXgtZ251Ci0JZXhpdCA7OwotICAgIGZydjpMaW51eDoqOiopCi0gICAgCWVjaG8gZnJ2LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIGlhNjQ6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBtMzJyKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIG02OCo6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBtaXBzOkxpbnV4Oio6KikKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkjdW5kZWYgQ1BVCi0JI3VuZGVmIG1pcHMKLQkjdW5kZWYgbWlwc2VsCi0JI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKLQlDUFU9bWlwc2VsCi0JI2Vsc2UKLQkjaWYgZGVmaW5lZChfX01JUFNFQl9fKSB8fCBkZWZpbmVkKF9fTUlQU0VCKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoTUlQU0VCKQotCUNQVT1taXBzCi0JI2Vsc2UKLQlDUFU9Ci0JI2VuZGlmCi0JI2VuZGlmCi1FT0YKLQlldmFsICJgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IHNlZCAtbiAnCi0JICAgIC9eQ1BVL3sKLQkJczogOjpnCi0JCXAKLQkgICAgfSdgIgotCXRlc3QgeCIke0NQVX0iICE9IHggJiYgeyBlY2hvICIke0NQVX0tdW5rbm93bi1saW51eC1nbnUiOyBleGl0OyB9Ci0JOzsKLSAgICBtaXBzNjQ6TGludXg6KjoqKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotCSN1bmRlZiBDUFUKLQkjdW5kZWYgbWlwczY0Ci0JI3VuZGVmIG1pcHM2NGVsCi0JI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKLQlDUFU9bWlwczY0ZWwKLQkjZWxzZQotCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCi0JQ1BVPW1pcHM2NAotCSNlbHNlCi0JQ1BVPQotCSNlbmRpZgotCSNlbmRpZgotRU9GCi0JZXZhbCAiYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBzZWQgLW4gJwotCSAgICAvXkNQVS97Ci0JCXM6IDo6ZwotCQlwCi0JICAgIH0nYCIKLQl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIHsgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IjsgZXhpdDsgfQotCTs7Ci0gICAgb3IzMjpMaW51eDoqOiopCi0JZWNobyBvcjMyLXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHBwYzpMaW51eDoqOiopCi0JZWNobyBwb3dlcnBjLXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHBwYzY0OkxpbnV4Oio6KikKLQllY2hvIHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBhbHBoYTpMaW51eDoqOiopCi0JY2FzZSBgc2VkIC1uICcvXmNwdSBtb2RlbC9zL14uKjogXCguKlwpL1wxL3AnIDwgL3Byb2MvY3B1aW5mb2AgaW4KLQkgIEVWNSkgICBVTkFNRV9NQUNISU5FPWFscGhhZXY1IDs7Ci0JICBFVjU2KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NTYgOzsKLQkgIFBDQTU2KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKLQkgIFBDQTU3KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKLQkgIEVWNikgICBVTkFNRV9NQUNISU5FPWFscGhhZXY2IDs7Ci0JICBFVjY3KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NjcgOzsKLQkgIEVWNjgqKSBVTkFNRV9NQUNISU5FPWFscGhhZXY2OCA7OwotICAgICAgICBlc2FjCi0Jb2JqZHVtcCAtLXByaXZhdGUtaGVhZGVycyAvYmluL3NoIHwgZ3JlcCBsZC5zby4xID4vZGV2L251bGwKLQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbiBMSUJDPSJsaWJjMSIgOyBlbHNlIExJQkM9IiIgOyBmaQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30KLQlleGl0IDs7Ci0gICAgcGFyaXNjOkxpbnV4Oio6KiB8IGhwcGE6TGludXg6KjoqKQotCSMgTG9vayBmb3IgQ1BVIGxldmVsCi0JY2FzZSBgZ3JlcCAnXmNwdVteYS16XSo6JyAvcHJvYy9jcHVpbmZvIDI+L2Rldi9udWxsIHwgY3V0IC1kJyAnIC1mMmAgaW4KLQkgIFBBNyopIGVjaG8gaHBwYTEuMS11bmtub3duLWxpbnV4LWdudSA7OwotCSAgUEE4KikgZWNobyBocHBhMi4wLXVua25vd24tbGludXgtZ251IDs7Ci0JICAqKSAgICBlY2hvIGhwcGEtdW5rbm93bi1saW51eC1nbnUgOzsKLQllc2FjCi0JZXhpdCA7OwotICAgIHBhcmlzYzY0OkxpbnV4Oio6KiB8IGhwcGE2NDpMaW51eDoqOiopCi0JZWNobyBocHBhNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgczM5MDpMaW51eDoqOiogfCBzMzkweDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1saW51eAotCWV4aXQgOzsKLSAgICBzaDY0KjpMaW51eDoqOiopCi0gICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBzaCo6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBzcGFyYzpMaW51eDoqOiogfCBzcGFyYzY0OkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgdmF4OkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICB4ODZfNjQ6TGludXg6KjoqKQotCWVjaG8geDg2XzY0LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIGkqODY6TGludXg6KjoqKQotCSMgVGhlIEJGRCBsaW5rZXIga25vd3Mgd2hhdCB0aGUgZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQgaXMsIHNvCi0JIyBmaXJzdCBzZWUgaWYgaXQgd2lsbCB0ZWxsIHVzLiBjZCB0byB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gcHJldmVudAotCSMgcHJvYmxlbXMgd2l0aCBvdGhlciBwcm9ncmFtcyBvciBkaXJlY3RvcmllcyBjYWxsZWQgYGxkJyBpbiB0aGUgcGF0aC4KLQkjIFNldCBMQ19BTEw9QyB0byBlbnN1cmUgbGQgb3V0cHV0cyBtZXNzYWdlcyBpbiBFbmdsaXNoLgotCWxkX3N1cHBvcnRlZF90YXJnZXRzPWBjZCAvOyBMQ19BTEw9QyBsZCAtLWhlbHAgMj4mMSBcCi0JCQkgfCBzZWQgLW5lICcvc3VwcG9ydGVkIHRhcmdldHM6LyFkCi0JCQkJICAgIHMvWyAJXVsgCV0qLyAvZwotCQkJCSAgICBzLy4qc3VwcG9ydGVkIHRhcmdldHM6ICovLwotCQkJCSAgICBzLyAuKi8vCi0JCQkJICAgIHAnYAotICAgICAgICBjYXNlICIkbGRfc3VwcG9ydGVkX3RhcmdldHMiIGluCi0JICBlbGYzMi1pMzg2KQotCQlURU5UQVRJVkU9IiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251IgotCQk7OwotCSAgYS5vdXQtaTM4Ni1saW51eCkKLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVhb3V0IgotCQlleGl0IDs7Ci0JICBjb2ZmLWkzODYpCi0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251Y29mZiIKLQkJZXhpdCA7OwotCSAgIiIpCi0JCSMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKSBvcgotCQkjIG9uZSB0aGF0IGRvZXMgbm90IGdpdmUgdXMgdXNlZnVsIC0taGVscC4KLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVvbGRsZCIKLQkJZXhpdCA7OwotCWVzYWMKLQkjIERldGVybWluZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGlzIGEub3V0IG9yIGVsZgotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotCSNpbmNsdWRlIDxmZWF0dXJlcy5oPgotCSNpZmRlZiBfX0VMRl9fCi0JIyBpZmRlZiBfX0dMSUJDX18KLQkjICBpZiBfX0dMSUJDX18gPj0gMgotCUxJQkM9Z251Ci0JIyAgZWxzZQotCUxJQkM9Z251bGliYzEKLQkjICBlbmRpZgotCSMgZWxzZQotCUxJQkM9Z251bGliYzEKLQkjIGVuZGlmCi0JI2Vsc2UKLQkjaWYgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSB8fCBkZWZpbmVkKF9fUEdJKQotCUxJQkM9Z251Ci0JI2Vsc2UKLQlMSUJDPWdudWFvdXQKLQkjZW5kaWYKLQkjZW5kaWYKLQkjaWZkZWYgX19kaWV0bGliY19fCi0JTElCQz1kaWV0bGliYwotCSNlbmRpZgotRU9GCi0JZXZhbCAiYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBzZWQgLW4gJwotCSAgICAvXkxJQkMvewotCQlzOiA6OmcKLQkJcAotCSAgICB9J2AiCi0JdGVzdCB4IiR7TElCQ30iICE9IHggJiYgewotCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LSR7TElCQ30iCi0JCWV4aXQKLQl9Ci0JdGVzdCB4IiR7VEVOVEFUSVZFfSIgIT0geCAmJiB7IGVjaG8gIiR7VEVOVEFUSVZFfSI7IGV4aXQ7IH0KLQk7OwotICAgIGkqODY6RFlOSVgvcHR4OjQqOiopCi0JIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4KLQkjIGVhcmxpZXIgdmVyc2lvbnMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoCi0JIyBzeXNuYW1lIGFuZCBub2RlbmFtZS4KLQllY2hvIGkzODYtc2VxdWVudC1zeXN2NAotCWV4aXQgOzsKLSAgICBpKjg2OlVOSVhfU1Y6NC4yTVA6Mi4qKQotICAgICAgICAjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCi0gICAgICAgICMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KLSAgICAgICAgIyBJIGFtIG5vdCBwb3NpdGl2ZSB0aGF0IG90aGVyIFNWUjQgc3lzdGVtcyB3b24ndCBtYXRjaCB0aGlzLAotCSMgSSBqdXN0IGhhdmUgdG8gaG9wZS4gIC0tIHJtcy4KLSAgICAgICAgIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KLQlleGl0IDs7Ci0gICAgaSo4NjpPUy8yOio6KikKLQkjIElmIHdlIHdlcmUgYWJsZSB0byBmaW5kIGB1bmFtZScsIHRoZW4gRU1YIFVuaXggY29tcGF0aWJpbGl0eQotCSMgaXMgcHJvYmFibHkgaW5zdGFsbGVkLgotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1vczItZW14Ci0JZXhpdCA7OwotICAgIGkqODY6WFRTLTMwMDoqOlNUT1ApCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3RvcAotCWV4aXQgOzsKLSAgICBpKjg2OmF0aGVvczoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYXRoZW9zCi0JZXhpdCA7OwotICAgIGkqODY6c3lsbGFibGU6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeWxsYWJsZQotCWV4aXQgOzsKLSAgICBpKjg2Okx5bnhPUzoyLio6KiB8IGkqODY6THlueE9TOjMuWzAxXSo6KiB8IGkqODY6THlueE9TOjQuMCo6KikKLQllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIGkqODY6KkRPUzoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1zZG9zZGpncHAKLQlleGl0IDs7Ci0gICAgaSo4NjoqOjQuKjoqIHwgaSo4NjpTWVNURU1fVjo0Lio6KikKLQlVTkFNRV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAncy9cL01QJC8vJ2AKLQlpZiBncmVwIE5vdmVsbCAvdXNyL2luY2x1ZGUvbGluay5oID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVuaXZlbC1zeXN2JHtVTkFNRV9SRUx9Ci0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMfQotCWZpCi0JZXhpdCA7OwotICAgIGkqODY6Kjo1Ols2NzhdKikKLSAgICAJIyBVbml4V2FyZSA3LngsIE9wZW5VTklYIGFuZCBPcGVuU2VydmVyIDYuCi0JY2FzZSBgL2Jpbi91bmFtZSAtWCB8IGdyZXAgIl5NYWNoaW5lImAgaW4KLQkgICAgKjQ4NiopCSAgICAgVU5BTUVfTUFDSElORT1pNDg2IDs7Ci0JICAgICpQZW50aXVtKQkgICAgIFVOQU1FX01BQ0hJTkU9aTU4NiA7OwotCSAgICAqUGVudCp8KkNlbGVyb24pIFVOQU1FX01BQ0hJTkU9aTY4NiA7OwotCWVzYWMKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSR7VU5BTUVfU1lTVEVNfSR7VU5BTUVfVkVSU0lPTn0KLQlleGl0IDs7Ci0gICAgaSo4NjoqOjMuMjoqKQotCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KLQkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAotCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgotCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCi0JCSgvYmluL3VuYW1lIC1YfGdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgotCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2Ci0JCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50ICpJSScgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0JCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCi0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCi0JZmkKLQlleGl0IDs7Ci0gICAgcGM6KjoqOiopCi0JIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6Ci0gICAgICAgICMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0Ci0gICAgICAgICMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGkzODYuCi0JZWNobyBpMzg2LXBjLW1zZG9zZGpncHAKLSAgICAgICAgZXhpdCA7OwotICAgIEludGVsOk1hY2g6Myo6KikKLQllY2hvIGkzODYtcGMtbWFjaDMKLQlleGl0IDs7Ci0gICAgcGFyYWdvbjoqOio6KikKLQllY2hvIGk4NjAtaW50ZWwtb3NmMQotCWV4aXQgOzsKLSAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0Ci0JaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKLQllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCi0JICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAotCWZpCi0JZXhpdCA7OwotICAgIG1pbmkqOkNUSVg6U1lTKjU6KikKLQkjICJtaW5pZnJhbWUiCi0JZWNobyBtNjgwMTAtY29udmVyZ2VudC1zeXN2Ci0JZXhpdCA7OwotICAgIG1jNjhrOlVOSVg6U1lTVEVNNTozLjUxbSkKLQllY2hvIG02OGstY29udmVyZ2VudC1zeXN2Ci0JZXhpdCA7OwotICAgIE02ODA/MDpELU5JWDo1LjM6KikKLQllY2hvIG02OGstZGlhYi1kbml4Ci0JZXhpdCA7OwotICAgIE02OCo6KjpSM1ZbNTY3OF0qOiopCi0JdGVzdCAtciAvc3lzVjY4ICYmIHsgZWNobyAnbTY4ay1tb3Rvcm9sYS1zeXN2JzsgZXhpdDsgfSA7OwotICAgIDNbMzQ1XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz9BOio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCAzWzM0XT8/Lyo6Kjo0LjA6My4wIHwgNDQwMDoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCB8IFNLQTQwOio6NC4wOjMuMCB8IFNEUzI6Kjo0LjA6My4wIHwgU0hHMjoqOjQuMDozLjAgfCBTNzUwMSo6Kjo0LjA6My4wKQotCU9TX1JFTD0nJwotCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAotCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCi0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCi0JICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQotCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAotCSAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0gOzsKLSAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKLSAgICAgICAgL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCi0gICAgICAgICAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0OyBleGl0OyB9IDs7Ci0gICAgbTY4KjpMeW54T1M6Mi4qOiogfCBtNjgqOkx5bnhPUzozLjAqOiopCi0JZWNobyBtNjhrLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBtYzY4MDMwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCi0JZWNobyBtNjhrLWF0YXJpLXN5c3Y0Ci0JZXhpdCA7OwotICAgIFRTVU5BTUk6THlueE9TOjIuKjoqKQotCWVjaG8gc3BhcmMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIHJzNjAwMDpMeW54T1M6Mi4qOiopCi0JZWNobyByczYwMDAtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFBvd2VyUEM6THlueE9TOjIuKjoqIHwgUG93ZXJQQzpMeW54T1M6My5bMDFdKjoqIHwgUG93ZXJQQzpMeW54T1M6NC4wKjoqKQotCWVjaG8gcG93ZXJwYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgU01bQkVdUzpVTklYX1NWOio6KikKLQllY2hvIG1pcHMtZGRlLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFJNKjpSZWxpYW50VU5JWC0qOio6KikKLQllY2hvIG1pcHMtc25pLXN5c3Y0Ci0JZXhpdCA7OwotICAgIFJNKjpTSU5JWC0qOio6KikKLQllY2hvIG1pcHMtc25pLXN5c3Y0Ci0JZXhpdCA7OwotICAgICo6U0lOSVgtKjoqOiopCi0JaWYgdW5hbWUgLXAgMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KLQkJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXNuaS1zeXN2NAotCWVsc2UKLQkJZWNobyBuczMyay1zbmktc3lzdgotCWZpCi0JZXhpdCA7OwotICAgIFBFTlRJVU06Kjo0LjAqOiopICMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgotICAgICAgICBlY2hvIGk1ODYtdW5pc3lzLXN5c3Y0Ci0gICAgICAgIGV4aXQgOzsKLSAgICAqOlVOSVhfU3lzdGVtX1Y6NCo6RlRYKikKLQkjIEZyb20gR2VyYWxkIEhld2VzIDxoZXdlc0BvcGVubWFya2V0LmNvbT4uCi0JIyBIb3cgYWJvdXQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gc3RyYXR1cyBhcmNoaXRlY3R1cmVzPyAtZGptCi0JZWNobyBocHBhMS4xLXN0cmF0dXMtc3lzdjQKLQlleGl0IDs7Ci0gICAgKjoqOio6RlRYKikKLQkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KLQllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAotCWV4aXQgOzsKLSAgICBpKjg2OlZPUzoqOiopCi0JIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXN0cmF0dXMtdm9zCi0JZXhpdCA7OwotICAgICo6Vk9TOio6KikKLQkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KLQllY2hvIGhwcGExLjEtc3RyYXR1cy12b3MKLQlleGl0IDs7Ci0gICAgbWM2OCo6QS9VWDoqOiopCi0JZWNobyBtNjhrLWFwcGxlLWF1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgbmV3cyo6TkVXUy1PUzo2KjoqKQotCWVjaG8gbWlwcy1zb255LW5ld3NvczYKLQlleGl0IDs7Ci0gICAgUlszNF0wMDA6KlN5c3RlbV9WKjoqOiogfCBSNDAwMDpVTklYX1NZU1Y6KjoqIHwgUiowMDA6VU5JWF9TVjoqOiopCi0JaWYgWyAtZCAvdXNyL25lYyBdOyB0aGVuCi0JICAgICAgICBlY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZWxzZQotCSAgICAgICAgZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotICAgICAgICBleGl0IDs7Ci0gICAgQmVCb3g6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIGhhcmR3YXJlIG1hZGUgYnkgQmUsIFBQQyBvbmx5LgotCWVjaG8gcG93ZXJwYy1iZS1iZW9zCi0JZXhpdCA7OwotICAgIEJlTWFjOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBNYWMgb3IgTWFjIGNsb25lLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYXBwbGUtYmVvcwotCWV4aXQgOzsKLSAgICBCZVBDOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBJbnRlbCBQQyBjb21wYXRpYmxlLgotCWVjaG8gaTU4Ni1wYy1iZW9zCi0JZXhpdCA7OwotICAgIFNYLTQ6U1VQRVItVVg6KjoqKQotCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBTWC01OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgU1gtNjpTVVBFUi1VWDoqOiopCi0JZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFBvd2VyKjpSaGFwc29keToqOiopCi0JZWNobyBwb3dlcnBjLWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOlJoYXBzb2R5Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6RGFyd2luOio6KikKLQlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYCB8fCBVTkFNRV9QUk9DRVNTT1I9dW5rbm93bgotCWNhc2UgJFVOQU1FX1BST0NFU1NPUiBpbgotCSAgICB1bmtub3duKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYyA7OwotCWVzYWMKLQllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6cHJvY250byo6KjoqIHwgKjpRTlg6WzAxMjM0NTY3ODldKjoqKQotCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgCi0JaWYgdGVzdCAiJFVOQU1FX1BST0NFU1NPUiIgPSAieDg2IjsgdGhlbgotCQlVTkFNRV9QUk9DRVNTT1I9aTM4NgotCQlVTkFNRV9NQUNISU5FPXBjCi0JZmkKLQllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS0ke1VOQU1FX01BQ0hJTkV9LW50by1xbngke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6UU5YOio6NCopCi0JZWNobyBpMzg2LXBjLXFueAotCWV4aXQgOzsKLSAgICBOU0UtPzpOT05TVE9QX0tFUk5FTDoqOiopCi0JZWNobyBuc2UtdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgTlNSLT86Tk9OU1RPUF9LRVJORUw6KjoqKQotCWVjaG8gbnNyLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6Tm9uU3RvcC1VWDoqOiopCi0JZWNobyBtaXBzLWNvbXBhcS1ub25zdG9wdXgKLQlleGl0IDs7Ci0gICAgQlMyMDAwOlBPU0lYKjoqOiopCi0JZWNobyBiczIwMDAtc2llbWVucy1zeXN2Ci0JZXhpdCA7OwotICAgIERTLyo6VU5JWF9TeXN0ZW1fVjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LSR7VU5BTUVfU1lTVEVNfS0ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6UGxhbjk6KjoqKQotCSMgInVuYW1lIC1tIiBpcyBub3QgY29uc2lzdGVudCwgc28gdXNlICRjcHV0eXBlIGluc3RlYWQuIDM4NgotCSMgaXMgY29udmVydGVkIHRvIGkzODYgZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgeDg2Ci0JIyBvcGVyYXRpbmcgc3lzdGVtcy4KLQlpZiB0ZXN0ICIkY3B1dHlwZSIgPSAiMzg2IjsgdGhlbgotCSAgICBVTkFNRV9NQUNISU5FPWkzODYKLQllbHNlCi0JICAgIFVOQU1FX01BQ0hJTkU9IiRjcHV0eXBlIgotCWZpCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tcGxhbjkKLQlleGl0IDs7Ci0gICAgKjpUT1BTLTEwOio6KikKLQllY2hvIHBkcDEwLXVua25vd24tdG9wczEwCi0JZXhpdCA7OwotICAgICo6VEVORVg6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi10ZW5leAotCWV4aXQgOzsKLSAgICBLUzEwOlRPUFMtMjA6KjoqIHwgS0wxMDpUT1BTLTIwOio6KiB8IFRZUEU0OlRPUFMtMjA6KjoqKQotCWVjaG8gcGRwMTAtZGVjLXRvcHMyMAotCWV4aXQgOzsKLSAgICBYS0wtMTpUT1BTLTIwOio6KiB8IFRZUEU1OlRPUFMtMjA6KjoqKQotCWVjaG8gcGRwMTAteGtsLXRvcHMyMAotCWV4aXQgOzsKLSAgICAqOlRPUFMtMjA6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMjAKLQlleGl0IDs7Ci0gICAgKjpJVFM6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi1pdHMKLQlleGl0IDs7Ci0gICAgU0VJOio6KjpTRUlVWCkKLSAgICAgICAgZWNobyBtaXBzLXNlaS1zZWl1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpEcmFnb25GbHk6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWRyYWdvbmZseWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKLQlleGl0IDs7Ci0gICAgKjoqVk1TOio6KikKLSAgICAJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKLQljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgICBBKikgZWNobyBhbHBoYS1kZWMtdm1zIDsgZXhpdCA7OwotCSAgICBJKikgZWNobyBpYTY0LWRlYy12bXMgOyBleGl0IDs7Ci0JICAgIFYqKSBlY2hvIHZheC1kZWMtdm1zIDsgZXhpdCA7OwotCWVzYWMgOzsKLSAgICAqOlhFTklYOio6U3lzVikKLQllY2hvIGkzODYtcGMteGVuaXgKLQlleGl0IDs7Ci0gICAgaSo4Njpza3lvczoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNreW9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfWAgfCBzZWQgLWUgJ3MvIC4qJC8vJwotCWV4aXQgOzsKLSAgICBpKjg2OnJkb3M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1yZG9zCi0JZXhpdCA7OwotZXNhYwotCi0jZWNobyAnKE5vIHVuYW1lIGNvbW1hbmQgb3IgdW5hbWUgb3V0cHV0IG5vdCByZWNvZ25pemVkLiknIDE+JjIKLSNlY2hvICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIDE+JjIKLQotZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotY2F0ID4kZHVtbXkuYyA8PEVPRgotI2lmZGVmIF9TRVFVRU5UXwotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMgaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KLSNlbmRpZgotbWFpbiAoKQotewotI2lmIGRlZmluZWQgKHNvbnkpCi0jaWYgZGVmaW5lZCAoTUlQU0VCKQotICAvKiBCRkQgd2FudHMgImJzZCIgaW5zdGVhZCBvZiAibmV3c29zIi4gIFBlcmhhcHMgQkZEIHNob3VsZCBiZSBjaGFuZ2VkLAotICAgICBJIGRvbid0IGtub3cuLi4uICAqLwotICBwcmludGYgKCJtaXBzLXNvbnktYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotICBwcmludGYgKCJtNjhrLXNvbnktbmV3c29zJXNcbiIsCi0jaWZkZWYgTkVXU09TNAotICAgICAgICAgICI0IgotI2Vsc2UKLQkgICIiCi0jZW5kaWYKLSAgICAgICAgICk7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCi0gIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQotICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChOZVhUKQotI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQotI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgotI2VuZGlmCi0gIGludCB2ZXJzaW9uOwotICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7Ci0gIGlmICh2ZXJzaW9uIDwgNCkKLSAgICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOwotICBlbHNlCi0gICAgcHJpbnRmICgiJXMtbmV4dC1vcGVuc3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKLSAgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCi0jaWYgZGVmaW5lZCAoVU1BWFYpCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotI2lmIGRlZmluZWQgKENNVSkKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCi0gIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHNlcXVlbnQpCi0jaWYgZGVmaW5lZCAoaTM4NikKLSAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChuczMyMDAwKQotICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQotICAgIHN0cnVjdCB1dHNuYW1lIHVuOwotCi0gICAgdW5hbWUoJnVuKTsKLQotICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKLQlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOwotICAgIH0KLSAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLwotCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7Ci0gICAgfQotICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkICh2YXgpCi0jIGlmICFkZWZpbmVkICh1bHRyaXgpCi0jICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgIGlmIGRlZmluZWQgKEJTRCkKLSMgICBpZiBCU0QgPT0gNDMKLSAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zXG4iKTsgZXhpdCAoMCk7Ci0jICAgZWxzZQotIyAgICBpZiBCU0QgPT0gMTk5MDA2Ci0gICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM3Jlbm9cbiIpOyBleGl0ICgwKTsKLSMgICAgZWxzZQotICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZWxzZQotICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jICBlbmRpZgotIyBlbHNlCi0gICAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKLSAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSAgZXhpdCAoMSk7Ci19Ci1FT0YKLQotJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKLQl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KLQotIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgotCi10ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQ7IH0KLQotIyBDb252ZXggdmVyc2lvbnMgdGhhdCBwcmVkYXRlIHVuYW1lIGNhbiB1c2UgZ2V0c3lzaW5mbygxKQotCi1pZiBbIC14IC91c3IvY29udmV4L2dldHN5c2luZm8gXQotdGhlbgotICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCi0gICAgYzEqKQotCWVjaG8gYzEtY29udmV4LWJzZAotCWV4aXQgOzsKLSAgICBjMiopCi0JaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCi0JdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCi0JZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKLQlmaQotCWV4aXQgOzsKLSAgICBjMzQqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLQlleGl0IDs7Ci0gICAgYzM4KikKLQllY2hvIGMzOC1jb252ZXgtYnNkCi0JZXhpdCA7OwotICAgIGM0KikKLQllY2hvIGM0LWNvbnZleC1ic2QKLQlleGl0IDs7Ci0gICAgZXNhYwotZmkKLQotY2F0ID4mMiA8PEVPRgotJDA6IHVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZQotCi1UaGlzIHNjcmlwdCwgbGFzdCBtb2RpZmllZCAkdGltZXN0YW1wLCBoYXMgZmFpbGVkIHRvIHJlY29nbml6ZQotdGhlIG9wZXJhdGluZyBzeXN0ZW0geW91IGFyZSB1c2luZy4gSXQgaXMgYWR2aXNlZCB0aGF0IHlvdQotZG93bmxvYWQgdGhlIG1vc3QgdXAgdG8gZGF0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgc2NyaXB0cyBmcm9tCi0KLSAgaHR0cDovL3NhdmFubmFoLmdudS5vcmcvY2dpLWJpbi92aWV3Y3ZzLypjaGVja291dCovY29uZmlnL2NvbmZpZy9jb25maWcuZ3Vlc3MKLWFuZAotICBodHRwOi8vc2F2YW5uYWguZ251Lm9yZy9jZ2ktYmluL3ZpZXdjdnMvKmNoZWNrb3V0Ki9jb25maWcvY29uZmlnL2NvbmZpZy5zdWIKLQotSWYgdGhlIHZlcnNpb24geW91IHJ1biAoJDApIGlzIGFscmVhZHkgdXAgdG8gZGF0ZSwgcGxlYXNlCi1zZW5kIHRoZSBmb2xsb3dpbmcgZGF0YSBhbmQgYW55IGluZm9ybWF0aW9uIHlvdSB0aGluayBtaWdodCBiZQotcGVydGluZW50IHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPiBpbiBvcmRlciB0byBwcm92aWRlIHRoZSBuZWVkZWQKLWluZm9ybWF0aW9uIHRvIGhhbmRsZSB5b3VyIHN5c3RlbS4KLQotY29uZmlnLmd1ZXNzIHRpbWVzdGFtcCA9ICR0aW1lc3RhbXAKLQotdW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0KLS91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGxgCi0vYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGxgCi0KLWhvc3RpbmZvICAgICAgICAgICAgICAgPSBgKGhvc3RpbmZvKSAyPi9kZXYvbnVsbGAKLS9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYAotL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGxgCi0vYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsYAotL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGxgCi0vdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbGAKLQotVU5BTUVfTUFDSElORSA9ICR7VU5BTUVfTUFDSElORX0KLVVOQU1FX1JFTEVBU0UgPSAke1VOQU1FX1JFTEVBU0V9Ci1VTkFNRV9TWVNURU0gID0gJHtVTkFNRV9TWVNURU19Ci1VTkFNRV9WRVJTSU9OID0gJHtVTkFNRV9WRVJTSU9OfQotRU9GCi0KLWV4aXQgMQotCi0jIExvY2FsIHZhcmlhYmxlczoKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCi0jIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKLSMgdGltZS1zdGFtcC1lbmQ6ICInIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9jb25maWcuc3ViIGIvY29uZmlnLnN1YgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRlOGE5NC4uMDAwMDAwMAotLS0gYS9jb25maWcuc3ViCisrKyAvZGV2L251bGwKQEAgLTEsMTYwNiArMCwwIEBACi0jISAvYmluL3NoCi0jIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdC4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCi0jICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotdGltZXN0YW1wPScyMDA2LTAxLTAyJwotCi0jIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KLSMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQotIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotIyAwMjExMC0xMzAxLCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotCi0jIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiAgU3VibWl0IGEgY29udGV4dAotIyBkaWZmIGFuZCBhIHByb3Blcmx5IGZvcm1hdHRlZCBDaGFuZ2VMb2cgZW50cnkuCi0jCi0jIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgotIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCi0jIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgotIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgotCi0jIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcwotIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKLSMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KLSMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKLSMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCi0jIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKLSMgY29uZmlndXJhdGlvbi4KLQotIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KLSMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKLSMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KLSMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgotIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KLSMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgotCi1tZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKLQotdXNhZ2U9IlwKLVVzYWdlOiAkMCBbT1BUSU9OXSBDUFUtTUZSLU9QU1lTCi0gICAgICAgJDAgW09QVElPTl0gQUxJQVMKLQotQ2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiBuYW1lLgotCi1PcGVyYXRpb24gbW9kZXM6Ci0gIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAotICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0Ci0gIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0Ci0KLVJlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCi0KLXZlcnNpb249IlwKLUdOVSBjb25maWcuc3ViICgkdGltZXN0YW1wKQotCi1Db3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTwotd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgotCi1oZWxwPSIKLVRyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLQotIyBQYXJzZSBjb21tYW5kIGxpbmUKLXdoaWxlIHRlc3QgJCMgLWd0IDAgOyBkbwotICBjYXNlICQxIGluCi0gICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKLSAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKLSAgICAtLXZlcnNpb24gfCAtdiApCi0gICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OwotICAgIC0taGVscCB8IC0taCogfCAtaCApCi0gICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OwotICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZwotICAgICAgIHNoaWZ0OyBicmVhayA7OwotICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KLSAgICAgICBicmVhayA7OwotICAgIC0qICkKLSAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiCi0gICAgICAgZXhpdCAxIDs7Ci0KLSAgICAqbG9jYWwqKQotICAgICAgICMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgotICAgICAgIGVjaG8gJDEKLSAgICAgICBleGl0IDs7Ci0KLSAgICAqICkKLSAgICAgICBicmVhayA7OwotICBlc2FjCi1kb25lCi0KLWNhc2UgJCMgaW4KLSAwKSBlY2hvICIkbWU6IG1pc3NpbmcgYXJndW1lbnQkaGVscCIgPiYyCi0gICAgZXhpdCAxOzsKLSAxKSA7OwotICopIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgotICAgIGV4aXQgMTs7Ci1lc2FjCi0KLSMgU2VwYXJhdGUgd2hhdCB0aGUgdXNlciBnYXZlIGludG8gQ1BVLUNPTVBBTlkgYW5kIE9TIG9yIEtFUk5FTC1PUyAoaWYgYW55KS4KLSMgSGVyZSB3ZSBtdXN0IHJlY29nbml6ZSBhbGwgdGhlIHZhbGlkIEtFUk5FTC1PUyBjb21iaW5hdGlvbnMuCi1tYXliZV9vcz1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDIvJ2AKLWNhc2UgJG1heWJlX29zIGluCi0gIG50by1xbngqIHwgbGludXgtZ251KiB8IGxpbnV4LWRpZXRsaWJjIHwgbGludXgtbmV3bGliKiB8IGxpbnV4LXVjbGliYyogfCBcCi0gIHVjbGludXgtdWNsaWJjKiB8IHVjbGludXgtZ251KiB8IGtmcmVlYnNkKi1nbnUqIHwga25ldGJzZCotZ251KiB8IG5ldGJzZCotZ251KiB8IFwKLSAgc3Rvcm0tY2hhb3MqIHwgb3MyLWVteCogfCBydG1rLW5vdmEqKQotICAgIG9zPS0kbWF5YmVfb3MKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMS8nYAotICAgIDs7Ci0gICopCi0gICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAotICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQotICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKLSAgICBlbHNlIG9zPTsgZmkKLSAgICA7OwotZXNhYwotCi0jIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KLSMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCi0jIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCi0jIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KLWNhc2UgJG9zIGluCi0JLXN1bipvcyopCi0JCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgotCQk7OwotCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCi0JLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCi0JLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKLQktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAotCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCi0JLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCi0JLWFwcGxlIHwgLWF4aXMgfCAta251dGggfCAtY3JheSkKLQkJb3M9Ci0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktc2ltIHwgLWNpc2NvIHwgLW9raSB8IC13ZWMgfCAtd2luYm9uZCkKLQkJb3M9Ci0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktc2NvdXQpCi0JCTs7Ci0JLXdycykKLQkJb3M9LXZ4d29ya3MKLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1jaG9ydXNvcyopCi0JCW9zPS1jaG9ydXNvcwotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0gCS1jaG9ydXNyZGIpCi0gCQlvcz0tY2hvcnVzcmRiCi0JCWJhc2ljX21hY2hpbmU9JDEKLSAJCTs7Ci0JLWhpdXgqKQotCQlvcz0taGl1eHdlMgotCQk7OwotCS1zY282KQotCQlvcz0tc2NvNXY2Ci0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvNSkKLQkJb3M9LXNjbzMuMnY1Ci0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvNCkKLQkJb3M9LXNjbzMuMnY0Ci0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvMy4yLls0LTldKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3NjbzMuMi4vc2NvMy4ydi8nYAotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzMuMnZbNC05XSopCi0JCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvNXY2KikKLQkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28qKQotCQlvcz0tc2NvMy4ydjIKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS11ZGsqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLWlzYykKLQkJb3M9LWlzYzIuMgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLWNsaXgqKQotCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAotCQk7OwotCS1pc2MqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLWx5bngqKQotCQlvcz0tbHlueG9zCi0JCTs7Ci0JLXB0eCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAotCQk7OwotCS13aW5kb3dzbnQqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCi0JCTs7Ci0JLXBzb3MqKQotCQlvcz0tcHNvcwotCQk7OwotCS1taW50IHwgLW1pbnRbMC05XSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQotCQlvcz0tbWludAotCQk7OwotZXNhYwotCi0jIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgotCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCi0JMTc1MGEgfCA1ODAgXAotCXwgYTI5ayBcCi0JfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhZXY2Wzc4XSB8IGFscGhhcGNhNVs2N10gXAotCXwgYWxwaGE2NCB8IGFscGhhNjRldls0LThdIHwgYWxwaGE2NGV2NTYgfCBhbHBoYTY0ZXY2Wzc4XSB8IGFscGhhNjRwY2E1WzY3XSBcCi0JfCBhbTMzXzIuMCBcCi0JfCBhcmMgfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyMzQ1XSB8IGFybXZbMzQ1XVtsYl0gfCBhdnIgXAotCXwgYmZpbiBcCi0JfCBjNHggfCBjbGlwcGVyIFwKLQl8IGQxMHYgfCBkMzB2IHwgZGx4IHwgZHNwMTZ4eCBcCi0JfCBmcjMwIHwgZnJ2IFwKLQl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCi0JfCBpMzcwIHwgaTg2MCB8IGk5NjAgfCBpYTY0IFwKLQl8IGlwMmsgfCBpcTIwMDAgXAotCXwgbTMyciB8IG0zMnJsZSB8IG02ODAwMCB8IG02OGsgfCBtODhrIHwgbWF4cSB8IG1iIHwgbWljcm9ibGF6ZSB8IG1jb3JlIFwKLQl8IG1pcHMgfCBtaXBzYmUgfCBtaXBzZWIgfCBtaXBzZWwgfCBtaXBzbGUgXAotCXwgbWlwczE2IFwKLQl8IG1pcHM2NCB8IG1pcHM2NGVsIFwKLQl8IG1pcHM2NHZyIHwgbWlwczY0dnJlbCBcCi0JfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAotCXwgbWlwczY0dnI0MTAwIHwgbWlwczY0dnI0MTAwZWwgXAotCXwgbWlwczY0dnI0MzAwIHwgbWlwczY0dnI0MzAwZWwgXAotCXwgbWlwczY0dnI1MDAwIHwgbWlwczY0dnI1MDAwZWwgXAotCXwgbWlwczY0dnI1OTAwIHwgbWlwczY0dnI1OTAwZWwgXAotCXwgbWlwc2lzYTMyIHwgbWlwc2lzYTMyZWwgXAotCXwgbWlwc2lzYTMycjIgfCBtaXBzaXNhMzJyMmVsIFwKLQl8IG1pcHNpc2E2NCB8IG1pcHNpc2E2NGVsIFwKLQl8IG1pcHNpc2E2NHIyIHwgbWlwc2lzYTY0cjJlbCBcCi0JfCBtaXBzaXNhNjRzYjEgfCBtaXBzaXNhNjRzYjFlbCBcCi0JfCBtaXBzaXNhNjRzcjcxayB8IG1pcHNpc2E2NHNyNzFrZWwgXAotCXwgbWlwc3R4MzkgfCBtaXBzdHgzOWVsIFwKLQl8IG1uMTAyMDAgfCBtbjEwMzAwIFwKLQl8IG10IFwKLQl8IG1zcDQzMCBcCi0JfCBuczE2ayB8IG5zMzJrIFwKLQl8IG9yMzIgXAotCXwgcGRwMTAgfCBwZHAxMSB8IHBqIHwgcGpsIFwKLQl8IHBvd2VycGMgfCBwb3dlcnBjNjQgfCBwb3dlcnBjNjRsZSB8IHBvd2VycGNsZSB8IHBwY2JlIFwKLQl8IHB5cmFtaWQgXAotCXwgc2ggfCBzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFsyM11lIHwgc2hbMzRdZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAotCXwgc2g2NCB8IHNoNjRsZSBcCi0JfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzY0YiB8IHNwYXJjODZ4IHwgc3BhcmNsZXQgfCBzcGFyY2xpdGUgXAotCXwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiBcCi0JfCBzdHJvbmdhcm0gXAotCXwgdGFob2UgfCB0aHVtYiB8IHRpYzR4IHwgdGljODAgfCB0cm9uIFwKLQl8IHY4NTAgfCB2ODUwZSBcCi0JfCB3ZTMyayBcCi0JfCB4ODYgfCB4c2NhbGUgfCB4c2NhbGVlW2JsXSB8IHhzdG9ybXkxNiB8IHh0ZW5zYSBcCi0JfCB6OGspCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQk7OwotCW0zMmMpCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQk7OwotCW02ODExIHwgbTY4aGMxMSB8IG02ODEyIHwgbTY4aGMxMikKLQkJIyBNb3Rvcm9sYSA2OEhDMTEvMTIuCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQlvcz0tbm9uZQotCQk7OwotCW04ODExMCB8IG02ODBbMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgdjcwIHwgdzY1IHwgejhrKQotCQk7OwotCW1zMSkKLQkJYmFzaWNfbWFjaGluZT1tdC11bmtub3duCi0JCTs7Ci0KLQkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJwotCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAotCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KLQlpKjg2IHwgeDg2XzY0KQotCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYwotCSAgOzsKLQkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgotCSotKi0qKQotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci0JIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KLQk1ODAtKiBcCi0JfCBhMjlrLSogXAotCXwgYWxwaGEtKiB8IGFscGhhZXZbNC04XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYWV2Nls3OF0tKiBcCi0JfCBhbHBoYTY0LSogfCBhbHBoYTY0ZXZbNC04XS0qIHwgYWxwaGE2NGV2NTYtKiB8IGFscGhhNjRldjZbNzhdLSogXAotCXwgYWxwaGFwY2E1WzY3XS0qIHwgYWxwaGE2NHBjYTVbNjddLSogfCBhcmMtKiBcCi0JfCBhcm0tKiAgfCBhcm1iZS0qIHwgYXJtbGUtKiB8IGFybWViLSogfCBhcm12Ki0qIFwKLQl8IGF2ci0qIFwKLQl8IGJmaW4tKiB8IGJzMjAwMC0qIFwKLQl8IGNbMTIzXSogfCBjMzAtKiB8IFtjanRdOTAtKiB8IGM0eC0qIHwgYzU0eC0qIHwgYzU1eC0qIHwgYzZ4LSogXAotCXwgY2xpcHBlci0qIHwgY3JheW52LSogfCBjeWRyYS0qIFwKLQl8IGQxMHYtKiB8IGQzMHYtKiB8IGRseC0qIFwKLQl8IGVseHNpLSogXAotCXwgZjMwWzAxXS0qIHwgZjcwMC0qIHwgZnIzMC0qIHwgZnJ2LSogfCBmeDgwLSogXAotCXwgaDgzMDAtKiB8IGg4NTAwLSogXAotCXwgaHBwYS0qIHwgaHBwYTEuWzAxXS0qIHwgaHBwYTIuMC0qIHwgaHBwYTIuMFtud10tKiB8IGhwcGE2NC0qIFwKLQl8IGkqODYtKiB8IGk4NjAtKiB8IGk5NjAtKiB8IGlhNjQtKiBcCi0JfCBpcDJrLSogfCBpcTIwMDAtKiBcCi0JfCBtMzJyLSogfCBtMzJybGUtKiBcCi0JfCBtNjgwMDAtKiB8IG02ODBbMDEyMzQ2XTAtKiB8IG02ODM2MC0qIHwgbTY4Mz8yLSogfCBtNjhrLSogXAotCXwgbTg4MTEwLSogfCBtODhrLSogfCBtYXhxLSogfCBtY29yZS0qIFwKLQl8IG1pcHMtKiB8IG1pcHNiZS0qIHwgbWlwc2ViLSogfCBtaXBzZWwtKiB8IG1pcHNsZS0qIFwKLQl8IG1pcHMxNi0qIFwKLQl8IG1pcHM2NC0qIHwgbWlwczY0ZWwtKiBcCi0JfCBtaXBzNjR2ci0qIHwgbWlwczY0dnJlbC0qIFwKLQl8IG1pcHM2NG9yaW9uLSogfCBtaXBzNjRvcmlvbmVsLSogXAotCXwgbWlwczY0dnI0MTAwLSogfCBtaXBzNjR2cjQxMDBlbC0qIFwKLQl8IG1pcHM2NHZyNDMwMC0qIHwgbWlwczY0dnI0MzAwZWwtKiBcCi0JfCBtaXBzNjR2cjUwMDAtKiB8IG1pcHM2NHZyNTAwMGVsLSogXAotCXwgbWlwczY0dnI1OTAwLSogfCBtaXBzNjR2cjU5MDBlbC0qIFwKLQl8IG1pcHNpc2EzMi0qIHwgbWlwc2lzYTMyZWwtKiBcCi0JfCBtaXBzaXNhMzJyMi0qIHwgbWlwc2lzYTMycjJlbC0qIFwKLQl8IG1pcHNpc2E2NC0qIHwgbWlwc2lzYTY0ZWwtKiBcCi0JfCBtaXBzaXNhNjRyMi0qIHwgbWlwc2lzYTY0cjJlbC0qIFwKLQl8IG1pcHNpc2E2NHNiMS0qIHwgbWlwc2lzYTY0c2IxZWwtKiBcCi0JfCBtaXBzaXNhNjRzcjcxay0qIHwgbWlwc2lzYTY0c3I3MWtlbC0qIFwKLQl8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAotCXwgbW1peC0qIFwKLQl8IG10LSogXAotCXwgbXNwNDMwLSogXAotCXwgbm9uZS0qIHwgbnAxLSogfCBuczE2ay0qIHwgbnMzMmstKiBcCi0JfCBvcmlvbi0qIFwKLQl8IHBkcDEwLSogfCBwZHAxMS0qIHwgcGotKiB8IHBqbC0qIHwgcG4tKiB8IHBvd2VyLSogXAotCXwgcG93ZXJwYy0qIHwgcG93ZXJwYzY0LSogfCBwb3dlcnBjNjRsZS0qIHwgcG93ZXJwY2xlLSogfCBwcGNiZS0qIFwKLQl8IHB5cmFtaWQtKiBcCi0JfCByb21wLSogfCByczYwMDAtKiBcCi0JfCBzaC0qIHwgc2hbMTIzNF0tKiB8IHNoWzI0XWEtKiB8IHNoWzIzXWUtKiB8IHNoWzM0XWViLSogfCBzaGJlLSogXAotCXwgc2hsZS0qIHwgc2hbMTIzNF1sZS0qIHwgc2gzZWxlLSogfCBzaDY0LSogfCBzaDY0bGUtKiBcCi0JfCBzcGFyYy0qIHwgc3BhcmM2NC0qIHwgc3BhcmM2NGItKiB8IHNwYXJjODZ4LSogfCBzcGFyY2xldC0qIFwKLQl8IHNwYXJjbGl0ZS0qIFwKLQl8IHNwYXJjdjgtKiB8IHNwYXJjdjktKiB8IHNwYXJjdjliLSogfCBzdHJvbmdhcm0tKiB8IHN2MS0qIHwgc3g/LSogXAotCXwgdGFob2UtKiB8IHRodW1iLSogXAotCXwgdGljMzAtKiB8IHRpYzR4LSogfCB0aWM1NHgtKiB8IHRpYzU1eC0qIHwgdGljNngtKiB8IHRpYzgwLSogXAotCXwgdHJvbi0qIFwKLQl8IHY4NTAtKiB8IHY4NTBlLSogfCB2YXgtKiBcCi0JfCB3ZTMyay0qIFwKLQl8IHg4Ni0qIHwgeDg2XzY0LSogfCB4cHMxMDAtKiB8IHhzY2FsZS0qIHwgeHNjYWxlZVtibF0tKiBcCi0JfCB4c3Rvcm15MTYtKiB8IHh0ZW5zYS0qIFwKLQl8IHltcC0qIFwKLQl8IHo4ay0qKQotCQk7OwotCW0zMmMtKikKLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCi0JIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KLQkzODZic2QpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1ic2QKLQkJOzsKLQkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0Ci0JCTs7Ci0JM2IqKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCWEyOWtoaWYpCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotICAgIAlhYmFjdXMpCi0JCWJhc2ljX21hY2hpbmU9YWJhY3VzLXVua25vd24KLQkJOzsKLQlhZG9iZTY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKLQkJb3M9LXNjb3V0Ci0JCTs7Ci0JYWxsaWFudCB8IGZ4ODApCi0JCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50Ci0JCTs7Ci0JYWx0b3MgfCBhbHRvczMwNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcwotCQk7OwotCWFtMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQotCQlvcz0tYnNkCi0JCTs7Ci0JYW1kNjQpCi0JCWJhc2ljX21hY2hpbmU9eDg2XzY0LXBjCi0JCTs7Ci0JYW1kNjQtKikKLQkJYmFzaWNfbWFjaGluZT14ODZfNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlhbWRhaGwpCi0JCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAotCQlvcz0tc3lzdgotCQk7OwotCWFtaWdhIHwgYW1pZ2EtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KLQkJOzsKLQlhbWlnYW9zIHwgYW1pZ2Fkb3MpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCi0JCW9zPS1hbWlnYW9zCi0JCTs7Ci0JYW1pZ2F1bml4IHwgYW1peCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JYXBvbGxvNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KLQkJb3M9LXN5c3YKLQkJOzsKLQlhcG9sbG82OGJzZCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbwotCQlvcz0tYnNkCi0JCTs7Ci0JYXV4KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKLQkJb3M9LWF1eAotCQk7OwotCWJhbGFuY2UpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQljOTApCi0JCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNvbnZleC1jMSkKLQkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMikKLQkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzIpCi0JCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzNCkKLQkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzM4KQotCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNyYXkgfCBqOTApCi0JCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNyYXludikKLQkJYmFzaWNfbWFjaGluZT1jcmF5bnYtY3JheQotCQlvcz0tdW5pY29zbXAKLQkJOzsKLQljcjE2YykKLQkJYmFzaWNfbWFjaGluZT1jcjE2Yy11bmtub3duCi0JCW9zPS1lbGYKLQkJOzsKLQljcmRzIHwgdW5vcykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNyZHMKLQkJOzsKLQljcmlzdjMyIHwgY3Jpc3YzMi0qIHwgZXRyYXhmcyopCi0JCWJhc2ljX21hY2hpbmU9Y3Jpc3YzMi1heGlzCi0JCTs7Ci0JY3JpcyB8IGNyaXMtKiB8IGV0cmF4KikKLQkJYmFzaWNfbWFjaGluZT1jcmlzLWF4aXMKLQkJOzsKLQljcngpCi0JCWJhc2ljX21hY2hpbmU9Y3J4LXVua25vd24KLQkJb3M9LWVsZgotCQk7OwotCWRhMzAgfCBkYTMwLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCi0JCTs7Ci0JZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQotCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCi0JCTs7Ci0JZGVjc3lzdGVtMTAqIHwgZGVjMTAqKQotCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYwotCQlvcz0tdG9wczEwCi0JCTs7Ci0JZGVjc3lzdGVtMjAqIHwgZGVjMjAqKQotCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYwotCQlvcz0tdG9wczIwCi0JCTs7Ci0JZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKLQkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCi0JCTs7Ci0JZGVsdGE4OCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCi0JCW9zPS1zeXN2MwotCQk7OwotCWRqZ3BwKQotCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKLQkJb3M9LW1zZG9zZGpncHAKLQkJOzsKLQlkcHgyMCB8IGRweDIwLSopCi0JCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKLQkJb3M9LWJvc3gKLQkJOzsKLQlkcHgyKiB8IGRweDIqLWJ1bGwpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCi0JCW9zPS1zeXN2MwotCQk7OwotCWVibW9uMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS1lYm1vbgotCQk7OwotCWVseHNpKQotCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCi0JCW9zPS1ic2QKLQkJOzsKLQllbmNvcmUgfCB1bWF4IHwgbW1heCkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKLQkJOzsKLQllczE4MDAgfCBPU0U2OGsgfCBvc2U2OGsgfCBvc2UgfCBPU0UpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1lcmljc3NvbgotCQlvcz0tb3NlCi0JCTs7Ci0JZngyODAwKQotCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAotCQk7OwotCWdlbml4KQotCQliYXNpY19tYWNoaW5lPW5zMzJrLW5zCi0JCTs7Ci0JZ21pY3JvKQotCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JZ28zMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1nbzMyCi0JCTs7Ci0JaDMwNTByKiB8IGhpdXgqKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQotCQlvcz0taGl1eHdlMgotCQk7OwotCWg4MzAwaG1zKQotCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCWg4MzAweHJheSkKLQkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCi0JCW9zPS14cmF5Ci0JCTs7Ci0JaDg1MDBobXMpCi0JCWJhc2ljX21hY2hpbmU9aDg1MDAtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0JaGFycmlzKQotCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCi0JCW9zPS1zeXN2MwotCQk7OwotCWhwMzAwLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQk7OwotCWhwMzAwYnNkKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJb3M9LWJzZAotCQk7OwotCWhwMzAwaHB1eCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JaHAzazlbMC05XVswLTldIHwgaHA5WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCi0JCTs7Ci0JaHA5azNbMi05XVswLTldKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJOzsKLQlocDlrNlswLTldWzAtOV0gfCBocDZbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocDlrN1swLTc5XVswLTldIHwgaHA3WzAtNzldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs3OFswLTldIHwgaHA3OFswLTldKQotCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFs2N10xIHwgaHA4WzY3XTEgfCBocDlrODBbMjRdIHwgaHA4MFsyNF0gfCBocDlrOFs3OF05IHwgaHA4Wzc4XTkgfCBocDlrODkzIHwgaHA4OTMpCi0JCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzAtOV1bMTM2NzldIHwgaHA4WzAtOV1bMTM2NzldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFswLTldWzAtOV0gfCBocDhbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocHBhLW5leHQpCi0JCW9zPS1uZXh0c3RlcDMKLQkJOzsKLQlocHBhb3NmKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJb3M9LW9zZgotCQk7OwotCWhwcHJvKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJb3M9LXByb2VsZgotCQk7OwotCWkzNzAtaWJtKiB8IGlibSopCi0JCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KLQkJOzsKLSMgSSdtIG5vdCBzdXJlIHdoYXQgIlN5c3YzMiIgbWVhbnMuICBTaG91bGQgdGhpcyBiZSBzeXN2My4yPwotCWkqODZ2MzIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjMyCi0JCTs7Ci0JaSo4NnY0KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2NAotCQk7OwotCWkqODZ2KQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3YKLQkJOzsKLQlpKjg2c29sMikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCWkzODZtYWNoKQotCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAotCQlvcz0tbWFjaAotCQk7OwotCWkzODYtdnN0YSB8IHZzdGEpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS12c3RhCi0JCTs7Ci0JaXJpcyB8IGlyaXM0ZCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQotCQljYXNlICRvcyBpbgotCQkgICAgLWlyaXgqKQotCQkJOzsKLQkJICAgICopCi0JCQlvcz0taXJpeDQKLQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQlpc2k2OCB8IGlzaSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQotCQlvcz0tc3lzdgotCQk7OwotCW04OGstb21yb24qKQotCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KLQkJOzsKLQltYWdudW0gfCBtMzIzMCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKLQkJb3M9LXN5c3YKLQkJOzsKLQltZXJsaW4pCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlawotCQlvcz0tc3lzdgotCQk7OwotCW1pbmd3MzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tbWluZ3czMgotCQk7OwotCW1pbmlmcmFtZSkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtY29udmVyZ2VudAotCQk7OwotCSptaW50IHwgLW1pbnRbMC05XSogfCAqTWlOVCB8ICpNaU5UWzAtOV0qKQotCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKLQkJb3M9LW1pbnQKLQkJOzsKLQltaXBzMyotKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKLQkJOzsKLQltaXBzMyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KLQkJOzsKLQltb25pdG9yKQotCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JbW9ycGhvcykKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KLQkJb3M9LW1vcnBob3MKLQkJOzsKLQltc2RvcykKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1tc2RvcwotCQk7OwotCW1zMS0qKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21zMS0vbXQtLydgCi0JCTs7Ci0JbXZzKQotCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCi0JCW9zPS1tdnMKLQkJOzsKLQluY3IzMDAwKQotCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCi0JCW9zPS1zeXN2NAotCQk7OwotCW5ldGJzZDM4NikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW5ldGJzZAotCQk7OwotCW5ldHdpbmRlcikKLQkJYmFzaWNfbWFjaGluZT1hcm12NGwtcmViZWwKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5ld3MxMDAwKQotCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzLTM2MDAgfCByaXNjLW5ld3MpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZWN2NzApCi0JCWJhc2ljX21hY2hpbmU9djcwLW5lYwotCQlvcz0tc3lzdgotCQk7OwotCW5leHQgfCBtKi1uZXh0ICkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1uZXh0c3RlcCogKQotCQkJOzsKLQkJICAgIC1uczIqKQotCQkgICAgICBvcz0tbmV4dHN0ZXAyCi0JCQk7OwotCQkgICAgKikKLQkJICAgICAgb3M9LW5leHRzdGVwMwotCQkJOzsKLQkJZXNhYwotCQk7OwotCW5oMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5oWzQ1XTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5pbmR5OTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW5pbmR5Ci0JCTs7Ci0JbW9uOTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW1vbjk2MAotCQk7OwotCW5vbnN0b3B1eCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLWNvbXBhcQotCQlvcz0tbm9uc3RvcHV4Ci0JCTs7Ci0JbnAxKQotCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAotCQk7OwotCW5zci10YW5kZW0pCi0JCWJhc2ljX21hY2hpbmU9bnNyLXRhbmRlbQotCQk7OwotCW9wNTBuLSogfCBvcDYwYy0qKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQlvcGVucmlzYyB8IG9wZW5yaXNjLSopCi0JCWJhc2ljX21hY2hpbmU9b3IzMi11bmtub3duCi0JCTs7Ci0Jb3M0MDApCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1pYm0KLQkJb3M9LW9zNDAwCi0JCTs7Ci0JT1NFNjgwMDAgfCBvc2U2ODAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtZXJpY3Nzb24KLQkJb3M9LW9zZQotCQk7OwotCW9zNjhrKQotCQliYXNpY19tYWNoaW5lPW02OGstbm9uZQotCQlvcz0tb3M2OGsKLQkJOzsKLQlwYS1oaXRhY2hpKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQotCQlvcz0taGl1eHdlMgotCQk7OwotCXBhcmFnb24pCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1pbnRlbAotCQlvcz0tb3NmCi0JCTs7Ci0JcGJkKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQotCQk7OwotCXBiYikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQotCQk7OwotCXBjNTMyIHwgcGM1MzItKikKLQkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgotCQk7OwotCXBjOTgpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQk7OwotCXBjOTgtKikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbiB8IHZpYWMzKQotCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKLQkJOzsKLQlwZW50aXVtcHJvIHwgcDYgfCA2eDg2IHwgYXRobG9uIHwgYXRobG9uXyopCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1wYwotCQk7OwotCXBlbnRpdW1paSB8IHBlbnRpdW0yIHwgcGVudGl1bWlpaSB8IHBlbnRpdW0zKQotCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKLQkJOzsKLQlwZW50aXVtNCkKLQkJYmFzaWNfbWFjaGluZT1pNzg2LXBjCi0JCTs7Ci0JcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4Z2VuLSogfCB2aWFjMy0qKQotCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qIHwgYXRobG9uLSopCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKiB8IHBlbnRpdW1paWktKiB8IHBlbnRpdW0zLSopCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBlbnRpdW00LSopCi0JCWJhc2ljX21hY2hpbmU9aTc4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBuKQotCQliYXNpY19tYWNoaW5lPXBuLWdvdWxkCi0JCTs7Ci0JcG93ZXIpCWJhc2ljX21hY2hpbmU9cG93ZXItaWJtCi0JCTs7Ci0JcHBjKQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgotCQk7OwotCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgotCQk7OwotCXBwY2xlLSogfCBwb3dlcnBjbGl0dGxlLSopCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHBjNjQpCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LXVua25vd24KLQkJOzsKLQlwcGM2NC0qKSBiYXNpY19tYWNoaW5lPXBvd2VycGM2NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBwYzY0bGUgfCBwb3dlcnBjNjRsaXR0bGUgfCBwcGM2NC1sZSB8IHBvd2VycGM2NC1saXR0bGUpCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtdW5rbm93bgotCQk7OwotCXBwYzY0bGUtKiB8IHBvd2VycGM2NGxpdHRsZS0qKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCi0JCTs7Ci0JcHczMikKLQkJYmFzaWNfbWFjaGluZT1pNTg2LXVua25vd24KLQkJb3M9LXB3MzIKLQkJOzsKLQlyZG9zKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LXJkb3MKLQkJOzsKLQlyb202OGspCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKLQkJb3M9LWNvZmYKLQkJOzsKLQlybVs0Nl0wMCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNpZW1lbnMKLQkJOzsKLQlydHBjIHwgcnRwYy0qKQotCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCi0JCTs7Ci0JczM5MCB8IHMzOTAtKikKLQkJYmFzaWNfbWFjaGluZT1zMzkwLWlibQotCQk7OwotCXMzOTB4IHwgczM5MHgtKikKLQkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KLQkJOzsKLQlzYTI5MjAwKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLQlzYjEpCi0JCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxLXVua25vd24KLQkJOzsKLQlzYjFlbCkKLQkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjFlbC11bmtub3duCi0JCTs7Ci0Jc2VpKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2VpCi0JCW9zPS1zZWl1eAotCQk7OwotCXNlcXVlbnQpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCTs7Ci0Jc2gpCi0JCWJhc2ljX21hY2hpbmU9c2gtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0Jc2g2NCkKLQkJYmFzaWNfbWFjaGluZT1zaDY0LXVua25vd24KLQkJOzsKLQlzcGFyY2xpdGUtd3JzIHwgc2ltc28td3JzKQotCQliYXNpY19tYWNoaW5lPXNwYXJjbGl0ZS13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQlzcHM3KQotCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAotCQlvcz0tc3lzdjIKLQkJOzsKLQlzcHVyKQotCQliYXNpY19tYWNoaW5lPXNwdXItdW5rbm93bgotCQk7OwotCXN0MjAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXRhbmRlbQotCQk7OwotCXN0cmF0dXMpCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1zdHJhdHVzCi0JCW9zPS1zeXN2NAotCQk7OwotCXN1bjIpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQk7OwotCXN1bjJvczMpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuMm9zNCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW4zb3MzKQotCQliYXNpY19tYWNoaW5lPW02OGstc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW4zb3M0KQotCQliYXNpY19tYWNoaW5lPW02OGstc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW40b3MzKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuNG9zNCkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjRzb2wyKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc29sYXJpczIKLQkJOzsKLQlzdW4zIHwgc3VuMy0qKQotCQliYXNpY19tYWNoaW5lPW02OGstc3VuCi0JCTs7Ci0Jc3VuNCkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJOzsKLQlzdW4zODYgfCBzdW4zODZpIHwgcm9hZHJ1bm5lcikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXN1bgotCQk7OwotCXN2MSkKLQkJYmFzaWNfbWFjaGluZT1zdjEtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0Jc3ltbWV0cnkpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCW9zPS1keW5peAotCQk7OwotCXQzZSkKLQkJYmFzaWNfbWFjaGluZT1hbHBoYWV2NS1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQl0OTApCi0JCWJhc2ljX21hY2hpbmU9dDkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXRpYzU0eCB8IGM1NHgqKQotCQliYXNpY19tYWNoaW5lPXRpYzU0eC11bmtub3duCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JdGljNTV4IHwgYzU1eCopCi0JCWJhc2ljX21hY2hpbmU9dGljNTV4LXVua25vd24KLQkJb3M9LWNvZmYKLQkJOzsKLQl0aWM2eCB8IGM2eCopCi0JCWJhc2ljX21hY2hpbmU9dGljNngtdW5rbm93bgotCQlvcz0tY29mZgotCQk7OwotCXR4MzkpCi0JCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgotCQk7OwotCXR4MzllbCkKLQkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KLQkJOzsKLQl0b2FkMSkKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC14a2wKLQkJb3M9LXRvcHMyMAotCQk7OwotCXRvd2VyIHwgdG93ZXItMzIpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKLQkJOzsKLQl0cGYpCi0JCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCi0JCW9zPS10cGYKLQkJOzsKLQl1ZGkyOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXVsdHJhMykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQotCQlvcz0tc3ltMQotCQk7OwotCXY4MTAgfCBuZWN2ODEwKQotCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCi0JCW9zPS1ub25lCi0JCTs7Ci0JdmF4dikKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCW9zPS1zeXN2Ci0JCTs7Ci0Jdm1zKQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJb3M9LXZtcwotCQk7OwotCXZwcCp8dnh8dngtKikKLQkJYmFzaWNfbWFjaGluZT1mMzAxLWZ1aml0c3UKLQkJOzsKLQl2eHdvcmtzOTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jdnh3b3JrczY4KQotCQliYXNpY19tYWNoaW5lPW02OGstd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jdnh3b3JrczI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXc2NSopCi0JCWJhc2ljX21hY2hpbmU9dzY1LXdkYwotCQlvcz0tbm9uZQotCQk7OwotCXc4OWstKikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKLQkJb3M9LXByb2VsZgotCQk7OwotCXhib3gpCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1wYwotCQlvcz0tbWluZ3czMgotCQk7OwotCXhwcyB8IHhwczEwMCkKLQkJYmFzaWNfbWFjaGluZT14cHMxMDAtaG9uZXl3ZWxsCi0JCTs7Ci0JeW1wKQotCQliYXNpY19tYWNoaW5lPXltcC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQl6OGstKi1jb2ZmKQotCQliYXNpY19tYWNoaW5lPXo4ay11bmtub3duCi0JCW9zPS1zaW0KLQkJOzsKLQlub25lKQotCQliYXNpY19tYWNoaW5lPW5vbmUtbm9uZQotCQlvcz0tbm9uZQotCQk7OwotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG1hbnVmYWN0dXJlciBvZiBjZXJ0YWluIENQVSB0eXBlcy4gIEl0IGlzIGluCi0jIHNvbWUgY2FzZXMgdGhlIG9ubHkgbWFudWZhY3R1cmVyLCBpbiBvdGhlcnMsIGl0IGlzIHRoZSBtb3N0IHBvcHVsYXIuCi0Jdzg5aykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKLQkJOzsKLQlvcDUwbikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQk7OwotCW9wNjBjKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCTs7Ci0Jcm9tcCkKLQkJYmFzaWNfbWFjaGluZT1yb21wLWlibQotCQk7OwotCW1taXgpCi0JCWJhc2ljX21hY2hpbmU9bW1peC1rbnV0aAotCQk7OwotCXJzNjAwMCkKLQkJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCi0JCTs7Ci0JdmF4KQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJOzsKLQlwZHAxMCkKLQkJIyB0aGVyZSBhcmUgbWFueSBjbG9uZXMsIHNvIERFQyBpcyBub3QgYSBzYWZlIGJldAotCQliYXNpY19tYWNoaW5lPXBkcDEwLXVua25vd24KLQkJOzsKLQlwZHAxMSkKLQkJYmFzaWNfbWFjaGluZT1wZHAxMS1kZWMKLQkJOzsKLQl3ZTMyaykKLQkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKLQkJOzsKLQlzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFszNF1lYiB8IHNoWzEyMzRdbGUgfCBzaFsyM11lbGUpCi0JCWJhc2ljX21hY2hpbmU9c2gtdW5rbm93bgotCQk7OwotCXNwYXJjIHwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YikKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJOzsKLQljeWRyYSkKLQkJYmFzaWNfbWFjaGluZT1jeWRyYS1jeWRyb21lCi0JCTs7Ci0Jb3Jpb24pCi0JCWJhc2ljX21hY2hpbmU9b3Jpb24taGlnaGxldmVsCi0JCTs7Ci0Jb3Jpb24xMDUpCi0JCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKLQkJOzsKLQltYWMgfCBtcHcgfCBtYWMtbXB3KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKLQkJOzsKLQlwbWFjIHwgcG1hYy1tcHcpCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1hcHBsZQotCQk7OwotCSotdW5rbm93bikKLQkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KLQkJOzsKLQkqKQotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi0KLSMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotZGlnaXRhbCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAotCQk7OwotCSotY29tbW9kb3JlKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKLQkJOzsKLQkqKQotCQk7OwotZXNhYwotCi0jIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KLQotaWYgWyB4IiRvcyIgIT0geCIiIF0KLXRoZW4KLWNhc2UgJG9zIGluCi0gICAgICAgICMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCi0gICAgICAgICMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCi0JIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCi0JLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKLQkJOzsKLQktc29sYXJpcykKLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0JLXN2cjQqKQotCQlvcz0tc3lzdjQKLQkJOzsKLQktdW5peHdhcmUqKQotCQlvcz0tc3lzdjQuMnV3Ci0JCTs7Ci0JLWdudS9saW51eCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCi0JCTs7Ci0JIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KLQkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgotCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCi0JIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgotCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKLQkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1zdW5vcyB8IC1zdW5vc1szNF0qXAotCSAgICAgIHwgLWhwdXgqIHwgLXVub3MqIHwgLW9zZiogfCAtbHVuYSogfCAtZGd1eCogfCAtc29sYXJpcyogfCAtc3ltKiBcCi0JICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCi0JICAgICAgfCAtYW9zKiBcCi0JICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKLQkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKLQkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLWtuZXRic2QqIHwgLW1pcmJzZCogfCAtbmV0YnNkKiBcCi0JICAgICAgfCAtb3BlbmJzZCogfCAtc29saWRic2QqIFwKLQkgICAgICB8IC1la2tvYnNkKiB8IC1rZnJlZWJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiB8IC1seW54b3MqIFwKLQkgICAgICB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCi0JICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAotCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAotCSAgICAgIHwgLWNob3J1c29zKiB8IC1jaG9ydXNyZGIqIFwKLQkgICAgICB8IC1jeWd3aW4qIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCi0JICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC1saW51eC1uZXdsaWIqIHwgLWxpbnV4LXVjbGliYyogXAotCSAgICAgIHwgLXV4cHYqIHwgLWJlb3MqIHwgLW1wZWl4KiB8IC11ZGsqIFwKLQkgICAgICB8IC1pbnRlcml4KiB8IC11d2luKiB8IC1ta3MqIHwgLXJoYXBzb2R5KiB8IC1kYXJ3aW4qIHwgLW9wZW5lZCogXAotCSAgICAgIHwgLW9wZW5zdGVwKiB8IC1vc2tpdCogfCAtY29uaXgqIHwgLXB3MzIqIHwgLW5vbnN0b3B1eCogXAotCSAgICAgIHwgLXN0b3JtLWNoYW9zKiB8IC10b3BzMTAqIHwgLXRlbmV4KiB8IC10b3BzMjAqIHwgLWl0cyogXAotCSAgICAgIHwgLW9zMiogfCAtdm9zKiB8IC1wYWxtb3MqIHwgLXVjbGludXgqIHwgLW51Y2xldXMqIFwKLQkgICAgICB8IC1tb3JwaG9zKiB8IC1zdXBlcnV4KiB8IC1ydG1rKiB8IC1ydG1rLW5vdmEqIHwgLXdpbmRpc3MqIFwKLQkgICAgICB8IC1wb3dlcm1heCogfCAtZG5peCogfCAtbng2IHwgLW54NyB8IC1zZWkqIHwgLWRyYWdvbmZseSogXAotCSAgICAgIHwgLXNreW9zKiB8IC1oYWlrdSogfCAtcmRvcyopCi0JIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCQk7OwotCS1xbngqKQotCQljYXNlICRiYXNpY19tYWNoaW5lIGluCi0JCSAgICB4ODYtKiB8IGkqODYtKikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LW50byRvcwotCQkJOzsKLQkJZXNhYwotCQk7OwotCS1udG8tcW54KikKLQkJOzsKLQktbnRvKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG50b3xudG8tcW54fCdgCi0JCTs7Ci0JLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAotCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogfCAtaGFpa3UqIFwKLQkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQotCQk7OwotCS1tYWMqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCi0JCTs7Ci0JLWxpbnV4LWRpZXRsaWJjKQotCQlvcz0tbGludXgtZGlldGxpYmMKLQkJOzsKLQktbGludXgqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCi0JCTs7Ci0JLXN1bm9zNSopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKLQkJOzsKLQktc3Vub3M2KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAotCQk7OwotCS1vcGVuZWQqKQotCQlvcz0tb3BlbmVkaXRpb24KLQkJOzsKLSAgICAgICAgLW9zNDAwKikKLQkJb3M9LW9zNDAwCi0JCTs7Ci0JLXdpbmNlKikKLQkJb3M9LXdpbmNlCi0JCTs7Ci0JLW9zZnJvc2UqKQotCQlvcz0tb3Nmcm9zZQotCQk7OwotCS1vc2YqKQotCQlvcz0tb3NmCi0JCTs7Ci0JLXV0ZWsqKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWR5bml4KikKLQkJb3M9LWJzZAotCQk7OwotCS1hY2lzKikKLQkJb3M9LWFvcwotCQk7OwotCS1hdGhlb3MqKQotCQlvcz0tYXRoZW9zCi0JCTs7Ci0JLXN5bGxhYmxlKikKLQkJb3M9LXN5bGxhYmxlCi0JCTs7Ci0JLTM4NmJzZCkKLQkJb3M9LWJzZAotCQk7OwotCS1jdGl4KiB8IC11dHMqKQotCQlvcz0tc3lzdgotCQk7OwotCS1ub3ZhKikKLQkJb3M9LXJ0bWstbm92YQotCQk7OwotCS1uczIgKQotCQlvcz0tbmV4dHN0ZXAyCi0JCTs7Ci0JLW5zayopCi0JCW9zPS1uc2sKLQkJOzsKLQkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCi0JLXNpbml4NS4qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAotCQk7OwotCS1zaW5peCopCi0JCW9zPS1zeXN2NAotCQk7OwotICAgICAgICAtdHBmKikKLQkJb3M9LXRwZgotCQk7OwotCS10cml0b24qKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktb3NzKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLXN2cjQpCi0JCW9zPS1zeXN2NAotCQk7OwotCS1zdnIzKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktc3lzdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQkjIFRoaXMgbXVzdCBjb21lIGFmdGVyIC1zeXN2cjQuCi0JLXN5c3YqKQotCQk7OwotCS1vc2UqKQotCQlvcz0tb3NlCi0JCTs7Ci0JLWVzMTgwMCopCi0JCW9zPS1vc2UKLQkJOzsKLQkteGVuaXgpCi0JCW9zPS14ZW5peAotCQk7OwotCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCi0JCW9zPS1taW50Ci0JCTs7Ci0JLWFyb3MqKQotCQlvcz0tYXJvcwotCQk7OwotCS1rYW9zKikKLQkJb3M9LWthb3MKLQkJOzsKLQktenZtb2UpCi0JCW9zPS16dm1vZQotCQk7OwotCS1ub25lKQotCQk7OwotCSopCi0JCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgotCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi1lbHNlCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KLSMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCi0jIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCi0KLSMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKLSMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKLSMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQotIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCi0jIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgotCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi1hY29ybikKLQkJb3M9LXJpc2NpeDEuMgotCQk7OwotCWFybSotcmViZWwpCi0JCW9zPS1saW51eAotCQk7OwotCWFybSotc2VtaSkKLQkJb3M9LWFvdXQKLQkJOzsKLSAgICBjNHgtKiB8IHRpYzR4LSopCi0gICAgICAgIG9zPS1jb2ZmCi0gICAgICAgIDs7Ci0JIyBUaGlzIG11c3QgY29tZSBiZWZvcmUgdGhlICotZGVjIGVudHJ5LgotCXBkcDEwLSopCi0JCW9zPS10b3BzMjAKLQkJOzsKLQlwZHAxMS0qKQotCQlvcz0tbm9uZQotCQk7OwotCSotZGVjIHwgdmF4LSopCi0JCW9zPS11bHRyaXg0LjIKLQkJOzsKLQltNjgqLWFwb2xsbykKLQkJb3M9LWRvbWFpbgotCQk7OwotCWkzODYtc3VuKQotCQlvcz0tc3Vub3M0LjAuMgotCQk7OwotCW02ODAwMC1zdW4pCi0JCW9zPS1zdW5vczMKLQkJIyBUaGlzIGFsc28gZXhpc3RzIGluIHRoZSBjb25maWd1cmUgcHJvZ3JhbSwgYnV0IHdhcyBub3QgdGhlCi0JCSMgZGVmYXVsdC4KLQkJIyBvcz0tc3Vub3M0Ci0JCTs7Ci0JbTY4Ki1jaXNjbykKLQkJb3M9LWFvdXQKLQkJOzsKLQltaXBzKi1jaXNjbykKLQkJb3M9LWVsZgotCQk7OwotCW1pcHMqLSopCi0JCW9zPS1lbGYKLQkJOzsKLQlvcjMyLSopCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KLQkJb3M9LXN5c3YzCi0JCTs7Ci0Jc3BhcmMtKiB8ICotc3VuKQotCQlvcz0tc3Vub3M0LjEuMQotCQk7OwotCSotYmUpCi0JCW9zPS1iZW9zCi0JCTs7Ci0JKi1oYWlrdSkKLQkJb3M9LWhhaWt1Ci0JCTs7Ci0JKi1pYm0pCi0JCW9zPS1haXgKLQkJOzsKLSAgICAJKi1rbnV0aCkKLQkJb3M9LW1taXh3YXJlCi0JCTs7Ci0JKi13ZWMpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLXdpbmJvbmQpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLW9raSkKLQkJb3M9LXByb2VsZgotCQk7OwotCSotaHApCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JKi1oaXRhY2hpKQotCQlvcz0taGl1eAotCQk7OwotCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKLQkJb3M9LXN5c3YKLQkJOzsKLQkqLWNibSkKLQkJb3M9LWFtaWdhb3MKLQkJOzsKLQkqLWRnKQotCQlvcz0tZGd1eAotCQk7OwotCSotZG9scGhpbikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JbTY4ay1jY3VyKQotCQlvcz0tcnR1Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCW9zPS1sdW5hCi0JCTs7Ci0JKi1uZXh0ICkKLQkJb3M9LW5leHRzdGVwCi0JCTs7Ci0JKi1zZXF1ZW50KQotCQlvcz0tcHR4Ci0JCTs7Ci0JKi1jcmRzKQotCQlvcz0tdW5vcwotCQk7OwotCSotbnMpCi0JCW9zPS1nZW5peAotCQk7OwotCWkzNzAtKikKLQkJb3M9LW12cwotCQk7OwotCSotbmV4dCkKLQkJb3M9LW5leHRzdGVwMwotCQk7OwotCSotZ291bGQpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JKi1oaWdobGV2ZWwpCi0JCW9zPS1ic2QKLQkJOzsKLQkqLWVuY29yZSkKLQkJb3M9LWJzZAotCQk7OwotCSotc2dpKQotCQlvcz0taXJpeAotCQk7OwotCSotc2llbWVucykKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JKi1tYXNzY29tcCkKLQkJb3M9LXJ0dQotCQk7OwotCWYzMFswMV0tZnVqaXRzdSB8IGY3MDAtZnVqaXRzdSkKLQkJb3M9LXV4cHYKLQkJOzsKLQkqLXJvbTY4aykKLQkJb3M9LWNvZmYKLQkJOzsKLQkqLSpidWcpCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi1hcHBsZSkKLQkJb3M9LW1hY29zCi0JCTs7Ci0JKi1hdGFyaSopCi0JCW9zPS1taW50Ci0JCTs7Ci0JKikKLQkJb3M9LW5vbmUKLQkJOzsKLWVzYWMKLWZpCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGUgb3MsIGFuZCB0aGUgQ1BVIHR5cGUsIGJ1dCBub3QgdGhlCi0jIG1hbnVmYWN0dXJlci4gIFdlIHBpY2sgdGhlIGxvZ2ljYWwgbWFudWZhY3R1cmVyLgotdmVuZG9yPXVua25vd24KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLXVua25vd24pCi0JCWNhc2UgJG9zIGluCi0JCQktcmlzY2l4KikKLQkJCQl2ZW5kb3I9YWNvcm4KLQkJCQk7OwotCQkJLXN1bm9zKikKLQkJCQl2ZW5kb3I9c3VuCi0JCQkJOzsKLQkJCS1haXgqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLWJlb3MqKQotCQkJCXZlbmRvcj1iZQotCQkJCTs7Ci0JCQktaHB1eCopCi0JCQkJdmVuZG9yPWhwCi0JCQkJOzsKLQkJCS1tcGVpeCopCi0JCQkJdmVuZG9yPWhwCi0JCQkJOzsKLQkJCS1oaXV4KikKLQkJCQl2ZW5kb3I9aGl0YWNoaQotCQkJCTs7Ci0JCQktdW5vcyopCi0JCQkJdmVuZG9yPWNyZHMKLQkJCQk7OwotCQkJLWRndXgqKQotCQkJCXZlbmRvcj1kZwotCQkJCTs7Ci0JCQktbHVuYSopCi0JCQkJdmVuZG9yPW9tcm9uCi0JCQkJOzsKLQkJCS1nZW5peCopCi0JCQkJdmVuZG9yPW5zCi0JCQkJOzsKLQkJCS1tdnMqIHwgLW9wZW5lZCopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktb3M0MDAqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLXB0eCopCi0JCQkJdmVuZG9yPXNlcXVlbnQKLQkJCQk7OwotCQkJLXRwZiopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktdnhzaW0qIHwgLXZ4d29ya3MqIHwgLXdpbmRpc3MqKQotCQkJCXZlbmRvcj13cnMKLQkJCQk7OwotCQkJLWF1eCopCi0JCQkJdmVuZG9yPWFwcGxlCi0JCQkJOzsKLQkJCS1obXMqKQotCQkJCXZlbmRvcj1oaXRhY2hpCi0JCQkJOzsKLQkJCS1tcHcqIHwgLW1hY29zKikKLQkJCQl2ZW5kb3I9YXBwbGUKLQkJCQk7OwotCQkJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKLQkJCQl2ZW5kb3I9YXRhcmkKLQkJCQk7OwotCQkJLXZvcyopCi0JCQkJdmVuZG9yPXN0cmF0dXMKLQkJCQk7OwotCQllc2FjCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgInMvdW5rbm93bi8kdmVuZG9yLyJgCi0JCTs7Ci1lc2FjCi0KLWVjaG8gJGJhc2ljX21hY2hpbmUkb3MKLWV4aXQKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJyIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvY29uZmlnLnZlciBiL2NvbmZpZy52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmI2YzguLjAwMDAwMDAKLS0tIGEvY29uZmlnLnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLQotSlBFR19WRVJfTUFKT1I9NjIKLUpQRUdfVkVSX01JTk9SPTEKLUpQRUdfUkVWSVNJT049MAotCi1jYXNlICRob3N0X29zIGluCi0gIGN5Z3dpbiopCi0gICAgIyBUaGUgc2hhcmVkIGxpYnJhcnkgYnVpbHQgZnJvbSB0aGlzIHNvdXJjZSBjb2RlIGlzICpub3QqIGJpbmFyeQotICAgICMgY29tcGF0aWJsZSB3aXRoIHRoZSBjeWd3aW4ncyBvZmZpY2lhbCBiaW5hcnkgcmVsZWFzZSAoY3lnanBlZy02Mi5kbGwpLgotICAgICMgVGhpcyBpcyBiZWNhdXNlIHRoZSBvZmZpY2lhbCBiaW5hcnkgaGFzIGJlZW4gYnVpbHQgd2l0aAotICAgICMgdGhlIGxvc3NsZXNzIGpwZWcgcGF0Y2ggd2hpY2ggaXMgYXZhaWxhYmxlIGFzIGxqcGVnLTZiLnRhci5neiAuCi0gICAgIyBUaGVyZWZvcmUgd2UgZGVjaWRlZCB0byBnaXZlIHRoZSBzaGFyZWQgbGlicmFyeSB0aGUgdmVyc2lvbiBudW1iZXIKLSAgICAjIG90aGVyIHRoYW4gNjIuCi0gICAgIwotICAgIEpQRUdfVkVSX01BSk9SPTE2MgotICAgIEpQRUdfVkVSX01JTk9SPTAKLSAgICA7OwotICBmcmVlYnNkKikKLSAgICAjIFRoaXMgZm9sbG93cyB0aGUgb2ZmaWNpYWwgYmluYXJ5IHJlbGVhc2UgaW4gdGhlIHBvcnRzIGNvbGxlY3Rpb24uCi0gICAgSlBFR19WRVJfTUFKT1I9OQotICAgIDs7Ci1lc2FjCi0KLSMgY29udmVydCBhYnNvbHV0ZSB2ZXJzaW9uIG51bWJlcnMgdG8gbGlidG9vbCBhZ2VzCi1jYXNlICR2ZXJzaW9uX3R5cGUgaW4KLSAgZnJlZWJzZC1hb3V0fGZyZWVic2QtZWxmfHN1bm9zKQotICAgIEpQRUdfTFRfQ1VSUkVOVD0kSlBFR19WRVJfTUFKT1IKLSAgICBKUEVHX0xUX1JFVklTSU9OPSRKUEVHX1ZFUl9NSU5PUgotICAgIEpQRUdfTFRfQUdFPTAKLSAgICA7OwotICBpcml4fG5vbnN0b3B1eCkKLSAgICBKUEVHX0xUX0NVUlJFTlQ9YGV4cHIgJEpQRUdfVkVSX01BSk9SICsgJEpQRUdfVkVSX01JTk9SIC0gMWAKLSAgICBKUEVHX0xUX0FHRT0kSlBFR19WRVJfTUlOT1IKLSAgICBKUEVHX0xUX1JFVklTSU9OPSRKUEVHX1ZFUl9NSU5PUgotICAgIDs7Ci0gICopCi0gICAgSlBFR19MVF9DVVJSRU5UPWBleHByICRKUEVHX1ZFUl9NQUpPUiArICRKUEVHX1ZFUl9NSU5PUmAKLSAgICBKUEVHX0xUX0FHRT0kSlBFR19WRVJfTUlOT1IKLSAgICBKUEVHX0xUX1JFVklTSU9OPSRKUEVHX1JFVklTSU9OCi0gICAgOzsKLWVzYWMKLQotSlBFR19MSUJfVkVSU0lPTj0kSlBFR19MVF9DVVJSRU5UOiRKUEVHX0xUX1JFVklTSU9OOiRKUEVHX0xUX0FHRQotCmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljMzY4ZTUuLjAwMDAwMDAKLS0tIGEvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNzExMiArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKLQotIyBGaW5kIHRoZSBjb3JyZWN0IFBBVEggc2VwYXJhdG9yLiAgVXN1YWxseSB0aGlzIGlzIGA6JywgYnV0Ci0jIERKR1BQIHVzZXMgYDsnIGxpa2UgRE9TLgotaWYgdGVzdCAiWCR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gWHNldDsgdGhlbgotICBVTkFNRT0ke1VOQU1FLWB1bmFtZSAyPi9kZXYvbnVsbGB9Ci0gIGNhc2UgWCRVTkFNRSBpbgotICAgICotRE9TKSBsdF9jdl9zeXNfcGF0aF9zZXBhcmF0b3I9JzsnIDs7Ci0gICAgKikgICAgIGx0X2N2X3N5c19wYXRoX3NlcGFyYXRvcj0nOicgOzsKLSAgZXNhYwotICBQQVRIX1NFUEFSQVRPUj0kbHRfY3Zfc3lzX3BhdGhfc2VwYXJhdG9yCi1maQotCi0KLSMgQ2hlY2sgdGhhdCB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0KLWNhc2UgWCRFQ0hPIGluCi1YKi0tZmFsbGJhY2stZWNobykKLSAgIyBSZW1vdmUgb25lIGxldmVsIG9mIHF1b3RhdGlvbiAod2hpY2ggd2FzIHJlcXVpcmVkIGZvciBNYWtlKS4KLSAgRUNITz1gZWNobyAiJEVDSE8iIHwgc2VkICdzLFxcXFxcJFxcJDAsJyQwJywnYAotICA7OwotZXNhYwotCi1lY2hvPSR7RUNITy1lY2hvfQotaWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgc2hpZnQKLWVsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgotICA6Ci1lbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgotICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCi0gIDoKLWVsc2UKLSAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgotICBleGVjICRTSEVMTCAiJDAiIC0tbm8tcmVleGVjICR7MSsiJEAifQotZmkKLQotaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KLSAgc2hpZnQKLSAgY2F0IDw8RU9GCi0KLUVPRgotICBleGl0IDAKLWZpCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi1pZiB0ZXN0ICJYJHtDRFBBVEgrc2V0fSIgPSBYc2V0OyB0aGVuIENEUEFUSD06OyBleHBvcnQgQ0RQQVRIOyBmaQotCi1pZiB0ZXN0IC16ICIkRUNITyI7IHRoZW4KLWlmIHRlc3QgIlgke2VjaG9fdGVzdF9zdHJpbmcrc2V0fSIgIT0gWHNldDsgdGhlbgotIyBmaW5kIGEgc3RyaW5nIGFzIGxhcmdlIGFzIHBvc3NpYmxlLCBhcyBsb25nIGFzIHRoZSBzaGVsbCBjYW4gY29wZSB3aXRoIGl0Ci0gIGZvciBjbWQgaW4gJ3NlZCA1MHEgIiQwIicgJ3NlZCAyMHEgIiQwIicgJ3NlZCAxMHEgIiQwIicgJ3NlZCAycSAiJDAiJyAnZWNobyB0ZXN0JzsgZG8KLSAgICAjIGV4cGVjdGVkIHNpemVzOiBsZXNzIHRoYW4gMktiLCAxS2IsIDUxMiBieXRlcywgMTYgYnl0ZXMsIC4uLgotICAgIGlmIChlY2hvX3Rlc3Rfc3RyaW5nPSJgZXZhbCAkY21kYCIpIDI+L2Rldi9udWxsICYmCi0gICAgICAgZWNob190ZXN0X3N0cmluZz0iYGV2YWwgJGNtZGAiICYmCi0gICAgICAgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGwKLSAgICB0aGVuCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLWZpCi0KLWlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gIDoKLWVsc2UKLSAgIyBUaGUgU29sYXJpcywgQUlYLCBhbmQgRGlnaXRhbCBVbml4IGRlZmF1bHQgZWNobyBwcm9ncmFtcyB1bnF1b3RlCi0gICMgYmFja3NsYXNoZXMuICBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKLSAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKLSAgIwotICAjIFNvLCBmaXJzdCB3ZSBsb29rIGZvciBhIHdvcmtpbmcgZWNobyBpbiB0aGUgdXNlcidzIFBBVEguCi0KLSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgZm9yIGRpciBpbiAkUEFUSCAvdXNyL3VjYjsgZG8KLSAgICBpZiAodGVzdCAtZiAkZGlyL2VjaG8gfHwgdGVzdCAtZiAkZGlyL2VjaG8kYWNfZXhlZXh0KSAmJgotICAgICAgIHRlc3QgIlhgKCRkaXIvZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLSAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGRpci9lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAgICAgZWNobz0iJGRpci9lY2hvIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJHNhdmVfaWZzIgotCi0gIGlmIHRlc3QgIlgkZWNobyIgPSBYZWNobzsgdGhlbgotICAgICMgV2UgZGlkbid0IGZpbmQgYSBiZXR0ZXIgZWNobywgc28gbG9vayBmb3IgYWx0ZXJuYXRpdmVzLgotICAgIGlmIHRlc3QgIlhgKHByaW50IC1yICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YChwcmludCAtciAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLSAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgICAgICMgVGhpcyBzaGVsbCBoYXMgYSBidWlsdGluIHByaW50IC1yIHRoYXQgZG9lcyB0aGUgdHJpY2suCi0gICAgICBlY2hvPSdwcmludCAtcicKLSAgICBlbGlmICh0ZXN0IC1mIC9iaW4va3NoIHx8IHRlc3QgLWYgL2Jpbi9rc2gkYWNfZXhlZXh0KSAmJgotCSB0ZXN0ICJYJENPTkZJR19TSEVMTCIgIT0gWC9iaW4va3NoOyB0aGVuCi0gICAgICAjIElmIHdlIGhhdmUga3NoLCB0cnkgcnVubmluZyBjb25maWd1cmUgYWdhaW4gd2l0aCBpdC4KLSAgICAgIE9SSUdJTkFMX0NPTkZJR19TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotICAgICAgZXhwb3J0IE9SSUdJTkFMX0NPTkZJR19TSEVMTAotICAgICAgQ09ORklHX1NIRUxMPS9iaW4va3NoCi0gICAgICBleHBvcnQgQ09ORklHX1NIRUxMCi0gICAgICBleGVjICRDT05GSUdfU0hFTEwgIiQwIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KLSAgICBlbHNlCi0gICAgICAjIFRyeSB1c2luZyBwcmludGYuCi0gICAgICBlY2hvPSdwcmludGYgJXNcbicKLSAgICAgIGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotCSBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0JIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCSMgQ29vbCwgcHJpbnRmIHdvcmtzCi0JOgotICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiJDAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKLQkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKLQkgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiJDAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLQkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQlDT05GSUdfU0hFTEw9JE9SSUdJTkFMX0NPTkZJR19TSEVMTAotCWV4cG9ydCBDT05GSUdfU0hFTEwKLQlTSEVMTD0iJENPTkZJR19TSEVMTCIKLQlleHBvcnQgU0hFTEwKLQllY2hvPSIkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyIKLSAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIiQwIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgICYmCi0JICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCi0JICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIiQwIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0JICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JZWNobz0iJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iCi0gICAgICBlbHNlCi0JIyBtYXliZSB3aXRoIGEgc21hbGxlciBzdHJpbmcuLi4KLQlwcmV2PToKLQotCWZvciBjbWQgaW4gJ2VjaG8gdGVzdCcgJ3NlZCAycSAiJDAiJyAnc2VkIDEwcSAiJDAiJyAnc2VkIDIwcSAiJDAiJyAnc2VkIDUwcSAiJDAiJzsgZG8KLQkgIGlmICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlhgZXZhbCAkY21kYCIpIDI+L2Rldi9udWxsCi0JICB0aGVuCi0JICAgIGJyZWFrCi0JICBmaQotCSAgcHJldj0iJGNtZCIKLQlkb25lCi0KLQlpZiB0ZXN0ICIkcHJldiIgIT0gJ3NlZCA1MHEgIiQwIic7IHRoZW4KLQkgIGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJHByZXZgCi0JICBleHBvcnQgZWNob190ZXN0X3N0cmluZwotCSAgZXhlYyAke09SSUdJTkFMX0NPTkZJR19TSEVMTC0ke0NPTkZJR19TSEVMTC0vYmluL3NofX0gIiQwIiAkezErIiRAIn0KLQllbHNlCi0JICAjIE9vcHMuICBXZSBsb3N0IGNvbXBsZXRlbHksIHNvIGp1c3Qgc3RpY2sgd2l0aCBlY2hvLgotCSAgZWNobz1lY2hvCi0JZmkKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLWZpCi1maQotCi0jIENvcHkgZWNobyBhbmQgcXVvdGUgdGhlIGNvcHkgc3VpdGFibHkgZm9yIHBhc3NpbmcgdG8gbGlidG9vbCBmcm9tCi0jIHRoZSBNYWtlZmlsZSwgaW5zdGVhZCBvZiBxdW90aW5nIHRoZSBvcmlnaW5hbCwgd2hpY2ggaXMgdXNlZCBsYXRlci4KLUVDSE89JGVjaG8KLWlmIHRlc3QgIlgkRUNITyIgPSAiWCRDT05GSUdfU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIjsgdGhlbgotICAgRUNITz0iJENPTkZJR19TSEVMTCBcXFwkXCQwIC0tZmFsbGJhY2stZWNobyIKLWZpCi0KLQotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1waWMgICAgICAgICAgICAgIHRyeSB0byB1c2Ugb25seSBQSUMvbm9uLVBJQyBvYmplY3RzIFtkZWZhdWx0PXVzZSBib3RoXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1heG1lbVs9Tl0gICAgIGVuYWJsZSB1c2Ugb2YgdGVtcCBmaWxlcywgc2V0IG1heCBtZW0gdXNhZ2UgdG8gTiBNQiIKLWFjX2hlbHA9IiRhY19oZWxwCi0iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbW14ICAgICAgICAgICBkbyBub3QgdXNlIE1NWCBpbnN0cnVjdGlvbiBzZXQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtM2Rub3cgICAgICAgICBkbyBub3QgdXNlIDNETm93ISBpbnN0cnVjdGlvbiBzZXQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtc3NlICAgICAgICAgICBkbyBub3QgdXNlIFNTRSBpbnN0cnVjdGlvbiBzZXQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtc3NlMiAgICAgICAgICBkbyBub3QgdXNlIFNTRTIgaW5zdHJ1Y3Rpb24gc2V0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtdWNoYXItYm9vbGVhbiAgZGVmaW5lIHR5cGUgXCJib29sZWFuXCIgYXMgdW5zaWduZWQgY2hhciAoZm9yIFdpbmRvd3MpIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1qY21hc3Rlci5jCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBlbHNlCi0gICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBmaQotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcxNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzQ0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Nzk1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4Mjc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDgzOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjg0MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4Njk6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NzQ6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjg4MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MDI6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MzQ6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTQ5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5NTU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDk2NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6OTcyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5ODMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjk4OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZnVuY3Rpb24gcHJvdG90eXBlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAxNDogY2hlY2tpbmcgZm9yIGZ1bmN0aW9uIHByb3RvdHlwZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2lqZ19jdl9oYXZlX3Byb3RvdHlwZXMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDE5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IHRlc3RmdW5jdGlvbiAoaW50IGFyZzEsIGludCAqIGFyZzIpOyAvKiBjaGVjayBwcm90b3R5cGVzICovCi1zdHJ1Y3QgbWV0aG9kc19zdHJ1Y3QgewkJLyogY2hlY2sgbWV0aG9kLXBvaW50ZXIgZGVjbGFyYXRpb25zICovCi0gIGludCAoKmVycm9yX2V4aXQpIChjaGFyICptc2d0ZXh0KTsKLSAgaW50ICgqdHJhY2VfbWVzc2FnZSkgKGNoYXIgKm1zZ3RleHQpOwotICBpbnQgKCphbm90aGVyX21ldGhvZCkgKHZvaWQpOwotfTsKLWludCB0ZXN0ZnVuY3Rpb24gKGludCBhcmcxLCBpbnQgKiBhcmcyKSAvKiBjaGVjayBkZWZpbml0aW9ucyAqLwoteyByZXR1cm4gYXJnMlthcmcxXTsgfQotaW50IHRlc3QyZnVuY3Rpb24gKHZvaWQpCS8qIGNoZWNrIHZvaWQgYXJnIGxpc3QgKi8KLXsgcmV0dXJuIDA7IH0KLQotaW50IG1haW4oKSB7Ci0gCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAzNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGlqZ19jdl9oYXZlX3Byb3RvdHlwZXM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGlqZ19jdl9oYXZlX3Byb3RvdHlwZXM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkaWpnX2N2X2hhdmVfcHJvdG90eXBlcyIgMT4mNgotaWYgdGVzdCAkaWpnX2N2X2hhdmVfcHJvdG90eXBlcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTIAotRU9GCi0KLWVsc2UKLSAgZWNobyBZb3VyIGNvbXBpbGVyIGRvZXMgbm90IHNlZW0gdG8ga25vdyBhYm91dCBmdW5jdGlvbiBwcm90b3R5cGVzLgotICBlY2hvIFBlcmhhcHMgaXQgbmVlZHMgYSBzcGVjaWFsIHN3aXRjaCB0byBlbmFibGUgQU5TSSBDIG1vZGUuCi0gIGVjaG8gSWYgc28sIHdlIHJlY29tbWVuZCBydW5uaW5nIGNvbmZpZ3VyZSBsaWtlIHRoaXM6Ci0gIGVjaG8gIiAgIC4vY29uZmlndXJlICBDQz0nY2MgLXN3aXRjaCciCi0gIGVjaG8gd2hlcmUgLXN3aXRjaCBpcyB0aGUgcHJvcGVyIHN3aXRjaC4KLWZpCi1hY19zYWZlPWBlY2hvICJzdGRkZWYuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc3RkZGVmLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNjQ6IGNoZWNraW5nIGZvciBzdGRkZWYuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTA2OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEwNzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVERERUZfSCAKLUVPRgotCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotYWNfc2FmZT1gZWNobyAic3RkbGliLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN0ZGxpYi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTAwOiBjaGVja2luZyBmb3Igc3RkbGliLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTEwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RETElCX0ggCi1FT0YKLQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWFjX3NhZmU9YGVjaG8gInN0cmluZy5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzdHJpbmcuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEzNjogY2hlY2tpbmcgZm9yIHN0cmluZy5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTQxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE0NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9CU0RfU1RSSU5HUyAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTcyOiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExNzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgSEFWRV9TVERERUZfSAotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBORUVEX0JTRF9TVFJJTkdTCi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotdHlwZWRlZiBzaXplX3QgbXlfc2l6ZV90OwotCi1pbnQgbWFpbigpIHsKLSBteV9zaXplX3QgZm9vdmFyOyAKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTk1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgaWpnX3NpemVfdF9vaz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgaWpnX3NpemVfdF9vaz0ibm90IEFOU0ksIHBlcmhhcHMgaXQgaXMgaW4gc3lzL3R5cGVzLmgiCi1maQotcm0gLWYgY29uZnRlc3QqCi1lY2hvICIkYWNfdCIiJGlqZ19zaXplX3Rfb2siIDE+JjYKLWlmIHRlc3QgIiRpamdfc2l6ZV90X29rIiAhPSB5ZXM7IHRoZW4KLWFjX3NhZmU9YGVjaG8gInN5cy90eXBlcy5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzeXMvdHlwZXMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIwOTogY2hlY2tpbmcgZm9yIHN5cy90eXBlcy5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjE0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIxOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX1NZU19UWVBFU19IIAotRU9GCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyNDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJzaXplX3QiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGlqZ19zaXplX3Rfb2s9InNpemVfdCBpcyBpbiBzeXMvdHlwZXMuaCIKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBpamdfc2l6ZV90X29rPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1pamdfc2l6ZV90X29rPW5vCi1maQotCi1lY2hvICIkYWNfdCIiJGlqZ19zaXplX3Rfb2siIDE+JjYKLWlmIHRlc3QgIiRpamdfc2l6ZV90X29rIiA9IG5vOyB0aGVuCi0gIGVjaG8gVHlwZSBzaXplX3QgaXMgbm90IGRlZmluZWQgaW4gYW55IG9mIHRoZSB1c3VhbCBwbGFjZXMuCi0gIGVjaG8gVHJ5IHB1dHRpbmcgJyJ0eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3Q7IicgaW4gamNvbmZpZy5oLgotZmkKLWZpCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgdHlwZSB1bnNpZ25lZCBjaGFyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjY2OiBjaGVja2luZyBmb3IgdHlwZSB1bnNpZ25lZCBjaGFyIiA+JjUKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyNjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLSB1bnNpZ25lZCBjaGFyIHVuX2NoYXI7IAotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNzU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSIAotRU9GCi0KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotcm0gLWYgY29uZnRlc3QqCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgdHlwZSB1bnNpZ25lZCBzaG9ydCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI5MDogY2hlY2tpbmcgZm9yIHR5cGUgdW5zaWduZWQgc2hvcnQiID4mNQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI5MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotIHVuc2lnbmVkIHNob3J0IHVuX3Nob3J0OyAKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjk5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQgCi1FT0YKLQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0eXBlIHZvaWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMTQ6IGNoZWNraW5nIGZvciB0eXBlIHZvaWQiID4mNQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTMxNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIENhdXRpb246IGEgQysrIGNvbXBpbGVyIHdpbGwgaW5zaXN0IG9uIHZhbGlkIHByb3RvdHlwZXMgKi8KLXR5cGVkZWYgdm9pZCAqIHZvaWRfcHRyOwkvKiBjaGVjayB2b2lkICogKi8KLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMJCS8qIGNoZWNrIHB0ciB0byBmdW5jdGlvbiByZXR1cm5pbmcgdm9pZCAqLwotdHlwZWRlZiB2b2lkICgqdm9pZF9mdW5jKSAoaW50IGEsIGludCBiKTsKLSNlbHNlCi10eXBlZGVmIHZvaWQgKCp2b2lkX2Z1bmMpICgpOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMJCS8qIGNoZWNrIHZvaWQgZnVuY3Rpb24gcmVzdWx0ICovCi12b2lkIHRlc3QzZnVuY3Rpb24gKHZvaWRfcHRyIGFyZzEsIHZvaWRfZnVuYyBhcmcyKQotI2Vsc2UKLXZvaWQgdGVzdDNmdW5jdGlvbiAoYXJnMSwgYXJnMikKLSAgICAgdm9pZF9wdHIgYXJnMTsKLSAgICAgdm9pZF9mdW5jIGFyZzI7Ci0jZW5kaWYKLXsKLSAgY2hhciAqIGxvY3B0ciA9IChjaGFyICopIGFyZzE7IC8qIGNoZWNrIGNhc3RpbmcgdG8gYW5kIGZyb20gdm9pZCAqICovCi0gIGFyZzEgPSAodm9pZCAqKSBsb2NwdHI7Ci0gICgqYXJnMikgKDEsIDIpOwkJLyogY2hlY2sgY2FsbCBvZiBmY24gcmV0dXJuaW5nIHZvaWQgKi8KLX0KLQotaW50IG1haW4oKSB7Ci0gCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM0NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgdm9pZCBjaGFyCi1FT0YKLQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM2MDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzY1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLS8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi10eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7Ci0vKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwotY2hhciBjb25zdCAqY29uc3QgKmNjcDsKLWNoYXIgKipwOwotLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKLXN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgotICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCi0gICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLwotY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOwotY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOwotLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KLSsrY2NwOwotcCA9IChjaGFyKiopIGNjcDsKLWNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOwoteyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciAqdDsKLSAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKLQotICAqdCsrID0gMDsKLX0KLXsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCi0gIGludCB4W10gPSB7MjUsIDE3fTsKLSAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgKytmb287Ci19Ci17IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7Ci0gIGlwdHIgcCA9IDA7Ci0gICsrcDsKLX0KLXsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwotICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07Ci0gIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKLX0KLXsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCi0gIGNvbnN0IGludCBmb28gPSAxMDsKLX0KLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgY29uc3QgCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQzNTogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pamdfY3ZfaW5saW5lPSIiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDM4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19IF9faW5saW5lX18gaW50IGZvbygpIHsgcmV0dXJuIDA7IH0KLWludCBiYXIoKSB7IHJldHVybiBmb28oKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDQ2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgaWpnX2N2X2lubGluZT0iX19pbmxpbmVfXyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ1NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSBfX2lubGluZSBpbnQgZm9vKCkgeyByZXR1cm4gMDsgfQotaW50IGJhcigpIHsgcmV0dXJuIGZvbygpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0NjI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBpamdfY3ZfaW5saW5lPSJfX2lubGluZSIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ3MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSBpbmxpbmUgaW50IGZvbygpIHsgcmV0dXJuIDA7IH0KLWludCBiYXIoKSB7IHJldHVybiBmb28oKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDc4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgaWpnX2N2X2lubGluZT0iaW5saW5lIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiIkaWpnX2N2X2lubGluZSIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgSU5MSU5FICRpamdfY3ZfaW5saW5lCi1FT0YKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJyb2tlbiBpbmNvbXBsZXRlIHR5cGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDk2OiBjaGVja2luZyBmb3IgYnJva2VuIGluY29tcGxldGUgdHlwZXMiID4mNQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ5OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gdHlwZWRlZiBzdHJ1Y3QgdW5kZWZpbmVkX3N0cnVjdHVyZSAqIHVuZGVmX3N0cnVjdF9wdHI7IAotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTA1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZWNobyAiJGFjX3QiIm9rIiAxPiY2Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJicm9rZW4iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTiAKLUVPRgotCi1maQotcm0gLWYgY29uZnRlc3QqCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2hvcnQgZXh0ZXJuYWwgbmFtZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1MjA6IGNoZWNraW5nIGZvciBzaG9ydCBleHRlcm5hbCBuYW1lcyIgPiY1Ci1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNTIyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IHBvc3NpYmx5X2R1cGxpY2F0ZV9mdW5jdGlvbiAoKSB7IHJldHVybiAwOyB9Ci1pbnQgcG9zc2libHlfZHVwbGlfZnVuY3Rpb24gKCkgeyByZXR1cm4gMTsgfQotCi1pbnQgbWFpbigpIHsKLSAKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTMyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIib2siIDE+JjYKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZWNobyAiJGFjX3QiInNob3J0IiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAKLUVPRgotCi1maQotcm0gLWYgY29uZnRlc3QqCi1lY2hvICRhY19uICJjaGVja2luZyB0byBzZWUgaWYgY2hhciBpcyBzaWduZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1NDc6IGNoZWNraW5nIHRvIHNlZSBpZiBjaGFyIGlzIHNpZ25lZCIgPiY1Ci1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBlY2hvIEFzc3VtaW5nIHRoYXQgY2hhciBpcyBzaWduZWQgb24gdGFyZ2V0IG1hY2hpbmUuCi1lY2hvIElmIGl0IGlzIHVuc2lnbmVkLCB0aGlzIHdpbGwgYmUgYSBsaXR0bGUgYml0IGluZWZmaWNpZW50LgotCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1NTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgSEFWRV9QUk9UT1RZUEVTCi1pbnQgaXNfY2hhcl9zaWduZWQgKGludCBhcmcpCi0jZWxzZQotaW50IGlzX2NoYXJfc2lnbmVkIChhcmcpCi0gICAgIGludCBhcmc7Ci0jZW5kaWYKLXsKLSAgaWYgKGFyZyA9PSAxODkpIHsJCS8qIGV4cGVjdGVkIHJlc3VsdCBmb3IgdW5zaWduZWQgY2hhciAqLwotICAgIHJldHVybiAwOwkJCS8qIHR5cGUgY2hhciBpcyB1bnNpZ25lZCAqLwotICB9Ci0gIGVsc2UgaWYgKGFyZyAhPSAtNjcpIHsJLyogZXhwZWN0ZWQgcmVzdWx0IGZvciBzaWduZWQgY2hhciAqLwotICAgIHByaW50ZigiSG1tLCBpdCBzZWVtcyAnY2hhcicgaXMgbm90IGVpZ2h0IGJpdHMgd2lkZSBvbiB5b3VyIG1hY2hpbmUuXG4iKTsKLSAgICBwcmludGYoIkkgZmVhciB0aGUgSlBFRyBzb2Z0d2FyZSB3aWxsIG5vdCB3b3JrIGF0IGFsbC5cblxuIik7Ci0gIH0KLSAgcmV0dXJuIDE7CQkJLyogYXNzdW1lIGNoYXIgaXMgc2lnbmVkIG90aGVyd2lzZSAqLwotfQotY2hhciBzaWduZWRfY2hhcl9jaGVjayA9IChjaGFyKSAoLTY3KTsKLW1haW4oKSB7Ci0gIGV4aXQoaXNfY2hhcl9zaWduZWQoKGludCkgc2lnbmVkX2NoYXJfY2hlY2spKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTc4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENIQVJfSVNfVU5TSUdORUQgCi1FT0YKLQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdG8gc2VlIGlmIHJpZ2h0IHNoaWZ0IGlzIHNpZ25lZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTU5NTogY2hlY2tpbmcgdG8gc2VlIGlmIHJpZ2h0IHNoaWZ0IGlzIHNpZ25lZCIgPiY1Ci1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBlY2hvICIkYWNfdCIiQXNzdW1pbmcgdGhhdCByaWdodCBzaGlmdCBpcyBzaWduZWQgb24gdGFyZ2V0IG1hY2hpbmUuIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2MDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgSEFWRV9QUk9UT1RZUEVTCi1pbnQgaXNfc2hpZnRpbmdfc2lnbmVkIChsb25nIGFyZykKLSNlbHNlCi1pbnQgaXNfc2hpZnRpbmdfc2lnbmVkIChhcmcpCi0gICAgIGxvbmcgYXJnOwotI2VuZGlmCi0vKiBTZWUgd2hldGhlciByaWdodC1zaGlmdCBvbiBhIGxvbmcgaXMgc2lnbmVkIG9yIG5vdC4gKi8KLXsKLSAgbG9uZyByZXMgPSBhcmcgPj4gNDsKLQotICBpZiAocmVzID09IC0weDdGN0U4MENMKSB7CS8qIGV4cGVjdGVkIHJlc3VsdCBmb3Igc2lnbmVkIHNoaWZ0ICovCi0gICAgcmV0dXJuIDE7CQkJLyogcmlnaHQgc2hpZnQgaXMgc2lnbmVkICovCi0gIH0KLSAgLyogc2VlIGlmIHVuc2lnbmVkLXNoaWZ0IGhhY2sgd2lsbCBmaXggaXQuICovCi0gIC8qIHdlIGNhbid0IGp1c3QgdGVzdCBleGFjdCB2YWx1ZSBzaW5jZSBpdCBkZXBlbmRzIG9uIHdpZHRoIG9mIGxvbmcuLi4gKi8KLSAgcmVzIHw9ICh+MEwpIDw8ICgzMi00KTsKLSAgaWYgKHJlcyA9PSAtMHg3RjdFODBDTCkgewkvKiBleHBlY3RlZCByZXN1bHQgbm93PyAqLwotICAgIHJldHVybiAwOwkJCS8qIHJpZ2h0IHNoaWZ0IGlzIHVuc2lnbmVkICovCi0gIH0KLSAgcHJpbnRmKCJSaWdodCBzaGlmdCBpc24ndCBhY3RpbmcgYXMgSSBleHBlY3QgaXQgdG8uXG4iKTsKLSAgcHJpbnRmKCJJIGZlYXIgdGhlIEpQRUcgc29mdHdhcmUgd2lsbCBub3Qgd29yayBhdCBhbGwuXG5cbiIpOwotICByZXR1cm4gMDsJCQkvKiB0cnkgaXQgd2l0aCB1bnNpZ25lZCBhbnl3YXkgKi8KLX0KLW1haW4oKSB7Ci0gIGV4aXQoaXNfc2hpZnRpbmdfc2lnbmVkKC0weDdGN0U4MEIxTCkpOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQgCi1FT0YKLQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdG8gc2VlIGlmIGZvcGVuIGFjY2VwdHMgYiBzcGVjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjQ3OiBjaGVja2luZyB0byBzZWUgaWYgZm9wZW4gYWNjZXB0cyBiIHNwZWMiID4mNQotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgZWNobyAiJGFjX3QiIkFzc3VtaW5nIHRoYXQgaXQgZG9lcy4iIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTY1MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotbWFpbigpIHsKLSAgaWYgKGZvcGVuKCJjb25mdGVzdGRhdGEiLCAid2IiKSAhPSBOVUxMKQotICAgIGV4aXQoMCk7Ci0gIGV4aXQoMSk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY2MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIERPTlRfVVNFX0JfTU9ERSAKLUVPRgotCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzA5OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3NjQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3OTk6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MjA6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE4MjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4MzY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4NTM6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTg1OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4NjU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg4NDogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg5NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaikgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCi1maQotZmkKLQotRVhFRVhUPSIiCi10ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQotZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgotYWNfZXhlZXh0PSRFWEVFWFQKLQotCi0jIERlY2lkZSB3aGV0aGVyIHRvIHVzZSBsaWJ0b29sLAotIyBhbmQgaWYgc28gd2hldGhlciB0byBidWlsZCBzaGFyZWQsIHN0YXRpYywgb3IgYm90aCBmbGF2b3JzIG9mIGxpYnJhcnkuCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2hhcmVkIG9yIC0tZGlzYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaGFyZWQiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICRlbmFibGV2YWwgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc2hhcmVkPW5vCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc3RhdGljIG9yIC0tZGlzYWJsZS1zdGF0aWMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zdGF0aWMiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICRlbmFibGV2YWwgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc3RhdGljPW5vCi1maQotCi1pZiB0ZXN0ICJ4JGVuYWJsZV9zaGFyZWQiICE9IHhubyAgLW8gICJ4JGVuYWJsZV9zdGF0aWMiICE9IHhubzsgdGhlbgotICBVU0VMSUJUT09MPSJ5ZXMiCi0jIExJQlRPT0w9Ii4vbGlidG9vbCIKLSAgTz0ibG8iCi0gIEE9ImxhIgotICBMTj0nJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDKScKLSAgSU5TVEFMTF9MSUI9JyQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJHtJTlNUQUxMfScKLSAgSU5TVEFMTF9QUk9HUkFNPSJcJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkSU5TVEFMTF9QUk9HUkFNIgotICBVTklOU1RBTEw9JyQoTElCVE9PTCkgLS1tb2RlPXVuaW5zdGFsbCAkKFJNKScKLWVsc2UKLSAgVVNFTElCVE9PTD0ibm8iCi0gIExJQlRPT0w9IiIKLSAgTz0ibyIKLSAgQT0iYSIKLSAgTE49JyQoQ0MpJwotICBJTlNUQUxMX0xJQj0iJElOU1RBTExfREFUQSIKLSAgVU5JTlNUQUxMPSckKFJNKScKLWZpCi0KLQotCi0KLQotCi0KLSMgQ29uZmlndXJlIGxpYnRvb2wgaWYgbmVlZGVkLgotaWYgdGVzdCAkVVNFTElCVE9PTCA9IHllczsgdGhlbgotICAKLSAgCi0gICMgRmluZCB0aGUgY29ycmVjdCBQQVRIIHNlcGFyYXRvci4gIFVzdWFsbHkgdGhpcyBpcyBgOicsIGJ1dAotIyBESkdQUCB1c2VzIGA7JyBsaWtlIERPUy4KLWlmIHRlc3QgIlgke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IFhzZXQ7IHRoZW4KLSAgVU5BTUU9JHtVTkFNRS1gdW5hbWUgMj4vZGV2L251bGxgfQotICBjYXNlIFgkVU5BTUUgaW4KLSAgICAqLURPUykgbHRfY3Zfc3lzX3BhdGhfc2VwYXJhdG9yPSc7JyA7OwotICAgICopICAgICBsdF9jdl9zeXNfcGF0aF9zZXBhcmF0b3I9JzonIDs7Ci0gIGVzYWMKLSAgUEFUSF9TRVBBUkFUT1I9JGx0X2N2X3N5c19wYXRoX3NlcGFyYXRvcgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBvciAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfZmFzdF9pbnN0YWxsIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAkZW5hYmxldmFsIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDI3OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCi0gIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA1NjogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKLSAgY2FzZSAkaG9zdCBpbgotICAqLSotbWluZ3cqKQotICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKLSAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7Ci0gICopCi0gICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OwotICBlc2FjCi0gIGNhc2UgJGFjX3Byb2cgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA4NjogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1Ci1lbHNlCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDg5OiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X3BhdGhfTEQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KLSAgICAgIGx0X2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgbHRfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGx0X2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotdGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTI0OiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbHRfY3ZfcHJvZ19nbnVfbGQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgbHRfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X3Byb2dfZ251X2xkIiAxPiY2Ci13aXRoX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGQKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTQxOiBjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9sZF9yZWxvYWRfZmxhZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGx0X2N2X2xkX3JlbG9hZF9mbGFnPSctcicKLWZpCi0KLWVjaG8gIiRhY190IiIkbHRfY3ZfbGRfcmVsb2FkX2ZsYWciIDE+JjYKLXJlbG9hZF9mbGFnPSRsdF9jdl9sZF9yZWxvYWRfZmxhZwotdGVzdCAtbiAiJHJlbG9hZF9mbGFnIiAmJiByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTUzOiBjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X3BhdGhfTk0nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBsdF9jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICB0bXBfbm09JGFjX2Rpci8ke2FjX3Rvb2xfcHJlZml4fW5tCi0gICAgaWYgdGVzdCAtZiAkdG1wX25tIHx8IHRlc3QgLWYgJHRtcF9ubSRhY19leGVleHQgOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICAjIFRydTY0J3Mgbm0gY29tcGxhaW5zIHRoYXQgL2Rldi9udWxsIGlzIGFuIGludmFsaWQgb2JqZWN0IGZpbGUKLSAgICAgIGlmICgkdG1wX25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAnKC9kZXYvbnVsbHxJbnZhbGlkIGZpbGUgb3Igb2JqZWN0IHR5cGUpJyA+L2Rldi9udWxsOyB0aGVuCi0JbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJHRtcF9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JbHRfY3ZfcGF0aF9OTT0ke2x0X2N2X3BhdGhfTk09IiR0bXBfbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9OTSIgJiYgbHRfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi0KLU5NPSIkbHRfY3ZfcGF0aF9OTSIKLWVjaG8gIiRhY190IiIkTk0iIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTkxOiBjaGVja2luZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X3BhdGhfU0VEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBzZWQgYW5kIGdzZWQuCi0jIFRoZW4gdXNlIHRoYXQgbGlzdCBvZiBzZWQncyBhcyBvbmVzIHRvIHRlc3QgZm9yIHRydW5jYXRpb24uCi1hc19leGVjdXRhYmxlX3A9InRlc3QgLWYiCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19wcm9nIGluIHNlZCBnc2VkOyBkbwotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICAgICAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IHRoZW4KLSAgICAgICAgX3NlZF9saXN0PSIkX3NlZF9saXN0ICRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgICBmaQotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotCi0gICMgQ3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYW5kIGhvb2sgZm9yIGl0cyByZW1vdmFsIHVubGVzcyBkZWJ1Z2dpbmcuCi0kZGVidWcgfHwKLXsKLSAgdHJhcCAnZXhpdF9zdGF0dXM9JD87IHJtIC1yZiAkdG1wICYmIGV4aXQgJGV4aXRfc3RhdHVzJyAwCi0gIHRyYXAgJ3sgKGV4aXQgMSk7IGV4aXQgMTsgfScgMSAyIDEzIDE1Ci19Ci0KLSMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgotOiAke1RNUERJUj0vdG1wfQotewotICB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kIC1xICIkVE1QRElSL3NlZFhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgotICB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIgotfSAgfHwKLXsKLSAgdG1wPSRUTVBESVIvc2VkJCQtJFJBTkRPTQotICAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApCi19IHx8Ci17Ci0gICBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluICRUTVBESVIiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci19Ci0gIF9tYXg9MAotICBfY291bnQ9MAotICAjIEFkZCAvdXNyL3hwZzQvYmluL3NlZCBhcyBpdCBpcyB0eXBpY2FsbHkgZm91bmQgb24gU29sYXJpcwotICAjIGFsb25nIHdpdGggL2Jpbi9zZWQgdGhhdCB0cnVuY2F0ZXMgb3V0cHV0LgotICBmb3IgX3NlZCBpbiAkX3NlZF9saXN0IC91c3IveHBnNC9iaW4vc2VkOyBkbwotICAgIHRlc3QgISAtZiAke19zZWR9ICYmIGJyZWFrCi0gICAgY2F0IC9kZXYvbnVsbCA+ICIkdG1wL3NlZC5pbiIKLSAgICBfY291bnQ9MAotICAgIGVjaG8gJHtFQ0hPX04tJGFjX259ICIwMTIzNDU2Nzg5JHtFQ0hPX0MtJGFjX2N9IiA+IiR0bXAvc2VkLmluIgotICAgICMgQ2hlY2sgZm9yIEdOVSBzZWQgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KLSAgICBpZiAiJHtfc2VkfSIgLS12ZXJzaW9uIDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVSknID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBsdF9jdl9wYXRoX1NFRD0ke19zZWR9Ci0gICAgICBicmVhawotICAgIGZpCi0gICAgd2hpbGUgdHJ1ZTsgZG8KLSAgICAgIGNhdCAiJHRtcC9zZWQuaW4iICIkdG1wL3NlZC5pbiIgPiIkdG1wL3NlZC50bXAiCi0gICAgICBtdiAiJHRtcC9zZWQudG1wIiAiJHRtcC9zZWQuaW4iCi0gICAgICBjcCAiJHRtcC9zZWQuaW4iICIkdG1wL3NlZC5ubCIKLSAgICAgIGVjaG8gPj4iJHRtcC9zZWQubmwiCi0gICAgICAke19zZWR9IC1lICdzL2EkLy8nIDwgIiR0bXAvc2VkLm5sIiA+IiR0bXAvc2VkLm91dCIgfHwgYnJlYWsKLSAgICAgIGNtcCAtcyAiJHRtcC9zZWQub3V0IiAiJHRtcC9zZWQubmwiIHx8IGJyZWFrCi0gICAgICAjIDQwMDAwIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKLSAgICAgIHRlc3QgJF9jb3VudCAtZ3QgMTAgJiYgYnJlYWsKLSAgICAgIF9jb3VudD1gZXhwciAkX2NvdW50ICsgMWAKLSAgICAgIGlmIHRlc3QgJF9jb3VudCAtZ3QgJF9tYXg7IHRoZW4KLSAgICAgICAgX21heD0kX2NvdW50Ci0gICAgICAgIGx0X2N2X3BhdGhfU0VEPSRfc2VkCi0gICAgICBmaQotICAgIGRvbmUKLSAgZG9uZQotICBybSAtcmYgIiR0bXAiCi0KLWZpCi0KLWlmIHRlc3QgIlgkU0VEIiAhPSAiWCI7IHRoZW4KLSAgbHRfY3ZfcGF0aF9TRUQ9JFNFRAotZWxzZQotICBTRUQ9JGx0X2N2X3BhdGhfU0VECi1maQotZWNobyAiJGFjX3QiIiRTRUQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI3NTogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MTl9TJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3RkYXRhCi1pZiBsbiAtcyBYIGNvbmZ0ZXN0ZGF0YSAyPi9kZXYvbnVsbAotdGhlbgotICBybSAtZiBjb25mdGVzdGRhdGEKLSAgYWNfY3ZfcHJvZ19MTl9TPSJsbiAtcyIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19MTl9TPWxuCi1maQotZmkKLUxOX1M9IiRhY19jdl9wcm9nX0xOX1MiCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19MTl9TIiA9ICJsbiAtcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byByZWNvZ25pc2UgZGVwZW5kZW50IGxpYnJhcmllcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI5NjogY2hlY2tpbmcgaG93IHRvIHJlY29nbmlzZSBkZXBlbmRlbnQgbGlicmFyaWVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckTUFHSUNfQ01EJwotbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9Ci1sdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKLSMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAotIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgotIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCi0jIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KLSMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KLSMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KLSMgJ2ZpbGVfbWFnaWMgW1tyZWdleF1dJyAtLSBjaGVjayBieSBsb29raW5nIGZvciBmaWxlcyBpbiBsaWJyYXJ5IHBhdGgKLSMgd2hpY2ggcmVzcG9uZHMgdG8gdGhlICRmaWxlX21hZ2ljX2NtZCB3aXRoIGEgZ2l2ZW4gZWdyZXAgcmVnZXguCi0jIElmIHlvdSBoYXZlIGBmaWxlJyBvciBlcXVpdmFsZW50IG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UncmUgbm90IHN1cmUKLSMgd2hldGhlciBgcGFzc19hbGwnIHdpbGwgKmFsd2F5cyogd29yaywgeW91IHByb2JhYmx5IHdhbnQgdGhpcyBvbmUuCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDQqIHwgYWl4NSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWJlb3MqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1ic2RpNCopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKScKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy91c3IvYmluL2ZpbGUgLUwnCi0gIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCi0gIDs7Ci0KLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT8nCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKLSAgOzsKLQotZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgTWFjaC1PIGR5bmFtaWNhbGx5IGxpbmtlZCBzaGFyZWQgbGlicmFyeScKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy91c3IvYmluL2ZpbGUgLUwnCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICByaGFwc29keSogfCBkYXJ3aW4xLlswMTJdKQotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL1N5c3RlbS5mcmFtZXdvcmsvVmVyc2lvbnMvKi9TeXN0ZW0gfCBoZWFkIC0xYAotICAgIDs7Ci0gICopICMgRGFyd2luIDEuMyBvbgotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPScvdXNyL2xpYi9saWJTeXN0ZW0uZHlsaWInCi0gICAgOzsKLSAgZXNhYwotICA7OwotCi1mcmVlYnNkKikKLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KLSAgICBjYXNlICRob3N0X2NwdSBpbgotICAgIGkqODYgKQotICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBPcGVuQlNEIGhlcmUgd2FzIGEgbWlzdGFrZS4KLSAgICAgICMgTGV0J3MgYWNjZXB0IGJvdGggb2YgdGhlbSB1bnRpbCB0aGlzIGlzIGNsZWFyZWQgdXAuCi0gICAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoRnJlZUJTRHxPcGVuQlNEKS9pWzMtOV04NiAoY29tcGFjdCApP2RlbWFuZCBwYWdlZCBzaGFyZWQgbGlicmFyeScKLSAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28uKmAKLSAgICAgIDs7Ci0gICAgZXNhYwotICBlbHNlCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgZmkKLSAgOzsKLQotZ251KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotaHB1eDEwLjIwKnxocHV4MTEqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxQQS1SSVNDWzAtOV0uWzAtOV0pIHNoYXJlZCBsaWJyYXJ5JwotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBpcml4NSogfCBub25zdG9wdXgqKQotICAgICMgdGhpcyB3aWxsIGJlIG92ZXJyaWRkZW4gd2l0aCBwYXNzX2FsbCwgYnV0IGxldCB1cyBrZWVwIGl0IGp1c3QgaW4gY2FzZQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiAzMi1iaXQgTVNCIGR5bmFtaWMgbGliIE1JUFMgLSB2ZXJzaW9uIDEiCi0gICAgOzsKLSAgKikKLSAgICBjYXNlICRMRCBpbgotICAgICotMzJ8KiItMzIgIikgbGlibWFnaWM9MzItYml0OzsKLSAgICAqLW4zMnwqIi1uMzIgIikgbGlibWFnaWM9TjMyOzsKLSAgICAqLTY0fCoiLTY0ICIpIGxpYm1hZ2ljPTY0LWJpdDs7Ci0gICAgKikgbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICAgIGVzYWMKLSAgICAjIHRoaXMgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGggcGFzc19hbGwsIGJ1dCBsZXQgdXMga2VlcCBpdCBqdXN0IGluIGNhc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgJHtsaWJtYWdpY30gTVNCIG1pcHMtWzEyMzRdIGR5bmFtaWMgbGliIE1JUFMgLSB2ZXJzaW9uIDEiCi0gICAgOzsKLSAgZXNhYwotICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvbGliJHtsaWJzdWZmfS9saWJjLnNvKmAKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgtZ251KikKLSAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgYWxwaGEqIHwgaHBwYSogfCBpKjg2IHwgbWlwcyB8IG1pcHNlbCB8IHBvd2VycGMqIHwgc3BhcmMqIHwgaWE2NCogfCBzMzkwKiB8IHg4Nl82NCopCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwgOzsKLSAgKikKLSAgICAjIGdsaWJjIHVwIHRvIDIuMS4xIGRvZXMgbm90IHBlcmZvcm0gc29tZSByZWxvY2F0aW9ucyBvbiBBUk0KLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiApJyA7OwotICBlc2FjCi0gIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC9saWIvbGliYy5zbyogL2xpYi9saWJjLSouc29gCi0gIDs7Ci0KLW5ldGJzZCopCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL1wuXStcLnNvXC5bMC05XStcLlswLTldKyQnCi0gIGVsc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXC5dK1wuc28kJwotICBmaQotICA7OwotCi1uZXdvczYqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtNTF1TQiAoZXhlY3V0YWJsZXxkeW5hbWljIGxpYiknCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGlibmxzLnNvCi0gIDs7Ci0KLW9wZW5ic2QqKQotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28uKmAKLSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTE1dU0Igc2hhcmVkIG9iamVjdCcKLSAgZWxzZQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIE9wZW5CU0QuKiBzaGFyZWQgbGlicmFyeScKLSAgZmkKLSAgOzsKLQotb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICAjIHRoaXMgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGggcGFzc19hbGwsIGJ1dCBsZXQgdXMga2VlcCBpdCBqdXN0IGluIGNhc2UKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgQ09GRiBmb3JtYXQgYWxwaGEgc2hhcmVkIGxpYnJhcnknCi0gIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLXNjbzMuMnY1KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotc29sYXJpcyopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbwotICA7OwotCi1zeXN2NXV3Wzc4XSogfCBzeXN2NCp1dzIqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1zeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCi0gIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0gIG1vdG9yb2xhKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKSBNWzAtOV1bMC05XSogVmVyc2lvbiBbMC05XScKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvKmAKLSAgICA7OwotICBuY3IpCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgICA7OwotICBzZXF1ZW50KQotICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTE1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIgKScKLSAgICA7OwotICBzbmkpCi0gICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiBkeW5hbWljIGxpYiIKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vbGliL2xpYmMuc28KLSAgICA7OwotICBzaWVtZW5zKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gICAgOzsKLSAgZXNhYwotICA7OwotZXNhYwotCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kIiAxPiY2Ci1maWxlX21hZ2ljX2NtZD0kbHRfY3ZfZmlsZV9tYWdpY19jbWQKLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZAotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2JqZWN0IHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ4MjogY2hlY2tpbmcgZm9yIG9iamVjdCBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29iamV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotZWNobyAnaW50IGkgPSAxOycgPiBjb25mdGVzdC4kYWNfZXh0Ci1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0ODg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICBjYXNlICRhY19maWxlIGluCi0gICAgKi5jKSA7OwotICAgICopIGFjX2N2X29iamV4dD1gZWNobyAkYWNfZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Li8vYCA7OwotICAgIGVzYWMKLSAgZG9uZQotZWxzZQotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW07IGNvbXBpbGVyIGRvZXMgbm90IHdvcmsiIDE+JjI7IGV4aXQgMTsgfQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vYmpleHQiIDE+JjYKLU9CSkVYVD0kYWNfY3Zfb2JqZXh0Ci1hY19vYmpleHQ9JGFjX2N2X29iamV4dAotCi1pZiB0ZXN0ICRob3N0ICE9ICRidWlsZDsgdGhlbgotICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQotZWxzZQotICBhY190b29sX3ByZWZpeD0KLWZpCi0KLQotCi0KLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1lY2hvICRhY19uICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1MTY6IGNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIAotIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQotCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLXN5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLXN5bXhmcm09J1wxIFwyXDMgXDMnCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWx0X2N2X2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gc3ltYm9sIG5hbWUgYW5kIHN5bWJvbCBhZGRyZXNzCi1sdF9jdl9nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeCopCi0gIHN5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikgIyBJdHMgbGlua2VyIGRpc3Rpbmd1aXNoZXMgZGF0YSBmcm9tIGNvZGUgc3ltYm9scwotICBsdF9jdl9nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICBsdF9jdl9nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbXiBdKlwpIFwoW14gXSpcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvcCciCi0gIDs7Ci1pcml4KiB8IG5vbnN0b3B1eCopCi0gIHN5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1vc2YqKQotICBzeW1jb2RlPSdbQkNERUdRUlNUXScKLSAgOzsKLXNvbGFyaXMqIHwgc3lzdjUqKQotICBzeW1jb2RlPSdbQkRUXScKLSAgOzsKLXN5c3Y0KQotICBzeW1jb2RlPSdbREZOU1RVXScKLSAgOzsKLWVzYWMKLQotIyBIYW5kbGUgQ1JMRiBpbiBtaW5ndyB0b29sIGNoYWluCi1vcHRfY3I9Ci1jYXNlICRob3N0X29zIGluCi1taW5ndyopCi0gIG9wdF9jcj1gZWNobyAneFx7MCwxXH0nIHwgdHIgeCAnXDAxNSdgICMgb3B0aW9uIGNyIGluIHJlZ2V4cAotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBzeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgotbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsgCV1cKCRzeW1jb2RlJHN5bWNvZGUqXClbIAldWyAJXSpcKCRhY19zeW1wcmZ4XCkkc3ltcGF0JG9wdF9jciQvJHN5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIHBpcGVfd29ya3M9bm8KLSAgcm0gLWYgY29uZnRlc3QqCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQotRU9GCi0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTk5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgbmxpc3Q9Y29uZnRlc3Qubm0KLSAgICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2MDI6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJG5saXN0XCIpIDE+JjU7IChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRubGlzdCkgMj4mNTsgfSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KLQltdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJG5saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC4kYWNfZXh0Ci0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGx0X2N2X2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiID4+IGNvbmZ0ZXN0LiRhY19leHQnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC4kYWNfZXh0Ci0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHIgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyIGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0ciBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQkgIHNlZCAicy9eJHN5bWNvZGUkc3ltY29kZSogXCguKlwpIFwoLipcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvIiA8ICIkbmxpc3QiID4+IGNvbmZ0ZXN0LiRhY19leHQKLQkgIGNhdCA8PFxFT0YgPj4gY29uZnRlc3QuJGFjX2V4dAotICB7MCwgKGx0X3B0cikgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0c3RtLiRhY19vYmpleHQKLQkgIHNhdmVfTElCUz0iJExJQlMiCi0JICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0c3RtLiRhY19vYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotCSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjUzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0JICAgIHBpcGVfd29ya3M9eWVzCi0JICBmaQotCSAgTElCUz0iJHNhdmVfTElCUyIKLQkgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotCWVsc2UKLQkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mNQotCWZpCi0gICAgICBlbHNlCi0JZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJG5saXN0IiA+JjUKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IHJ1biAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1Ci0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KiBjb25mdHN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJHBpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi0KLWZpCi0KLWdsb2JhbF9zeW1ib2xfcGlwZT0iJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiCi1pZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0KLSAgZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0KLWVsc2UKLSAgZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0iJGx0X2N2X2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiCi0gIGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9IiRsdF9jdl9nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIgotZmkKLWlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUkZ2xvYmFsX3N5bWJvbF90b19jZGVjJGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MiOwotdGhlbgotICBlY2hvICIkYWNfdCIiZmFpbGVkIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJvayIgMT4mNgotZmkKLQotZm9yIGFjX2hkciBpbiBkbGZjbi5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcwMjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3MDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI3MTI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLQotCi0KLQotIyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGZvciBmaWxlLCBpZiB0aGUgY2hlY2sgbWV0aG9kIHJlcXVpcmVzIGl0Ci1jYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgotZmlsZV9tYWdpYyopCi0gIGlmIHRlc3QgIiRmaWxlX21hZ2ljX2NtZCIgPSAnJE1BR0lDX0NNRCc7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJHthY190b29sX3ByZWZpeH1maWxlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzQ4OiBjaGVja2luZyBmb3IgJHthY190b29sX3ByZWZpeH1maWxlIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9wYXRoX01BR0lDX0NNRCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgJE1BR0lDX0NNRCBpbgotICAvKikKLSAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQotICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBhY19zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKLSAgSUZTPSIke0lGUz0gICB9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIvdXNyL2JpbjokUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJHthY190b29sX3ByZWZpeH1maWxlOyB0aGVuCi0gICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci8ke2FjX3Rvb2xfcHJlZml4fWZpbGUiCi0gICAgICBpZiB0ZXN0IC1uICIkZmlsZV9tYWdpY190ZXN0X2ZpbGUiOyB0aGVuCi0JY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLQkiZmlsZV9tYWdpYyAiKikKLQkgIGZpbGVfbWFnaWNfcmVnZXg9ImBleHByIFwiJGRlcGxpYnNfY2hlY2tfbWV0aG9kXCIgOiBcImZpbGVfbWFnaWMgXCguKlwpXCJgIgotCSAgTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCi0JICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcJGZpbGVfbWFnaWNfdGVzdF9maWxlIDI+IC9kZXYvbnVsbCB8Ci0JICAgIGVncmVwICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgOgotCSAgZWxzZQotCSAgICBjYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAotKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgotKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCi0qKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKLSoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAotKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQotKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bwotKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKLQotRU9GCi0JICBmaSA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIE1BR0lDX0NNRD0iJGFjX3NhdmVfTUFHSUNfQ01EIgotICA7OwotZXNhYwotZmkKLQotTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCi1pZiB0ZXN0IC1uICIkTUFHSUNfQ01EIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1BR0lDX0NNRCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRsdF9jdl9wYXRoX01BR0lDX0NNRCI7IHRoZW4KLSAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBmaWxlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODEwOiBjaGVja2luZyBmb3IgZmlsZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbHRfY3ZfcGF0aF9NQUdJQ19DTUQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICRNQUdJQ19DTUQgaW4KLSAgLyopCi0gIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikKLSAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgYWNfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCi0gIElGUz0iJHtJRlM9ICAgfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iL3Vzci9iaW46JFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL2ZpbGU7IHRoZW4KLSAgICAgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkYWNfZGlyL2ZpbGUiCi0gICAgICBpZiB0ZXN0IC1uICIkZmlsZV9tYWdpY190ZXN0X2ZpbGUiOyB0aGVuCi0JY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLQkiZmlsZV9tYWdpYyAiKikKLQkgIGZpbGVfbWFnaWNfcmVnZXg9ImBleHByIFwiJGRlcGxpYnNfY2hlY2tfbWV0aG9kXCIgOiBcImZpbGVfbWFnaWMgXCguKlwpXCJgIgotCSAgTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCi0JICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcJGZpbGVfbWFnaWNfdGVzdF9maWxlIDI+IC9kZXYvbnVsbCB8Ci0JICAgIGVncmVwICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgOgotCSAgZWxzZQotCSAgICBjYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAotKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgotKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCi0qKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKLSoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAotKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQotKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bwotKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKLQotRU9GCi0JICBmaSA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIE1BR0lDX0NNRD0iJGFjX3NhdmVfTUFHSUNfQ01EIgotICA7OwotZXNhYwotZmkKLQotTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCi1pZiB0ZXN0IC1uICIkTUFHSUNfQ01EIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1BR0lDX0NNRCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgZWxzZQotICAgIE1BR0lDX0NNRD06Ci0gIGZpCi1maQotCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4ODE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5MTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIFJBTkxJQj0iOiIKLWZpCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9c3RyaXA7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk0ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1NUUklQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1NUUklQPSIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1TVFJJUD0iJGFjX2N2X3Byb2dfU1RSSVAiCi1pZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkU1RSSVAiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBzdHJpcDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTgwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfU1RSSVAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfU1RSSVA9IiRTVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfU1RSSVA9InN0cmlwIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19TVFJJUCIgJiYgYWNfY3ZfcHJvZ19TVFJJUD0iOiIKLWZpCi1maQotU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgotaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFNUUklQIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBTVFJJUD0iOiIKLWZpCi1maQotCi0KLWVuYWJsZV9kbG9wZW49eWVzCi1lbmFibGVfd2luMzJfZGxsPXllcwotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIG9yIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9saWJ0b29sX2xvY2siCi0gIDoKLWZpCi0KLXRlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICRob3N0IGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJyNsaW5lIDMwMjkgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMzA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwNTE6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2NjX25lZWRzX2JlbGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAKLSAgICAgYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotICAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDY0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDcxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0gICAgIGFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgMT4mNgotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi0qLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiopCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzEwMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iJHthY190b29sX3ByZWZpeH1kbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJkbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBkbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxMzM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9ImRsbHRvb2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiICYmIGFjX2N2X3Byb2dfRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBETExUT09MPSJmYWxzZSIKLWZpCi1maQotCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hczsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTY4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVM9IiR7YWNfdG9vbF9wcmVmaXh9YXMiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUFTPSIkYWNfY3ZfcHJvZ19BUyIKLWlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMDA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iYXMiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIiAmJiBhY19jdl9wcm9nX0FTPSJmYWxzZSIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBBUz0iZmFsc2UiCi1maQotZmkKLQotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vYmpkdW1wOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19PQkpEVU1QJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJE9CSkRVTVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfT0JKRFVNUD0iJE9CSkRVTVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX09CSkRVTVA9IiR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotT0JKRFVNUD0iJGFjX2N2X3Byb2dfT0JKRFVNUCIKLWlmIHRlc3QgLW4gIiRPQkpEVU1QIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE9CSkRVTVAiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX09CSkRVTVAiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2JqZHVtcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgb2JqZHVtcDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjY3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfT0JKRFVNUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRPQkpEVU1QIjsgdGhlbgotICBhY19jdl9wcm9nX09CSkRVTVA9IiRPQkpEVU1QIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19PQkpEVU1QPSJvYmpkdW1wIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19PQkpEVU1QIiAmJiBhY19jdl9wcm9nX09CSkRVTVA9ImZhbHNlIgotZmkKLWZpCi1PQkpEVU1QPSIkYWNfY3ZfcHJvZ19PQkpEVU1QIgotaWYgdGVzdCAtbiAiJE9CSkRVTVAiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkT0JKRFVNUCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgT0JKRFVNUD0iZmFsc2UiCi1maQotZmkKLQotCi0gICMgcmVjZW50IGN5Z3dpbiBhbmQgbWluZ3cgc3lzdGVtcyBzdXBwbHkgYSBzdHViIERsbE1haW4gd2hpY2ggdGhlIHVzZXIKLSAgIyBjYW4gb3ZlcnJpZGUsIGJ1dCBvbiBvbGRlciBzeXN0ZW1zIHdlIGhhdmUgdG8gc3VwcGx5IG9uZQotICBlY2hvICRhY19uICJjaGVja2luZyBpZiBsaWJ0b29sIHNob3VsZCBzdXBwbHkgRGxsTWFpbiBmdW5jdGlvbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzMwMzogY2hlY2tpbmcgaWYgbGlidG9vbCBzaG91bGQgc3VwcGx5IERsbE1haW4gZnVuY3Rpb24iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X25lZWRfZGxsbWFpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzMDggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygoX19zdGRjYWxsX18pKSBEbGxNYWluKHZvaWQqLCBpbnQsIHZvaWQqKTsKLSAgICAgIERsbE1haW4gKDAsIDAsIDApOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzMTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X25lZWRfZGxsbWFpbj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9uZWVkX2RsbG1haW49eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X25lZWRfZGxsbWFpbiIgMT4mNgotCi0gIGNhc2UgJGhvc3QvJENDIGluCi0gICotKi1jeWd3aW4qL2djYyotbW5vLWN5Z3dpbip8Ki0qLW1pbmd3KikKLSAgICAjIG9sZCBtaW5ndyBzeXN0ZW1zIHJlcXVpcmUgIi1kbGwiIHRvIGxpbmsgYSBETEwsIHdoaWxlIG1vcmUgcmVjZW50IG9uZXMKLSAgICAjIHJlcXVpcmUgIi1tZGxsIgotICAgIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICAgIENGTEFHUz0iJENGTEFHUyAtbWRsbCIKLSAgICBlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gbGluayBETExzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzM3OiBjaGVja2luZyBob3cgdG8gbGluayBETExzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9jY19kbGxfc3dpdGNoJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzM0MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM0OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfZGxsX3N3aXRjaD0tbWRsbAotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19kbGxfc3dpdGNoPS1kbGwKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkbHRfY3ZfY2NfZGxsX3N3aXRjaCIgMT4mNgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIiA7OwotICAqLSotY3lnd2luKiB8ICotKi1wdzMyKikKLSAgICAjIGN5Z3dpbiBzeXN0ZW1zIG5lZWQgdG8gcGFzcyAtLWRsbCB0byB0aGUgbGlua2VyLCBhbmQgbm90IGxpbmsKLSAgICAjIGNydC5vIHdoaWNoIHdpbGwgcmVxdWlyZSBhIFdpbk1haW5AMTYgZGVmaW5pdGlvbi4KLSAgICBsdF9jdl9jY19kbGxfc3dpdGNoPSItV2wsLS1kbGwgLW5vc3RhcnRmaWxlcyIgOzsKLSAgZXNhYwotICA7OwotICAKLWVzYWMKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwotIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9J3NlZCAtZSBzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgJFxcXFxdXCkvXFxcMS9nJwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KLWRvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGBcXFxcXVwpL1xcXDEvZycKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKLSMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KLWRlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCi0KLSMgQ29uc3RhbnRzOgotcm09InJtIC1mIgotCi0jIEdsb2JhbCB2YXJpYWJsZXM6Ci1kZWZhdWx0X29maWxlPWxpYnRvb2wKLWNhbl9idWlsZF9zaGFyZWQ9eWVzCi0KLSMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNJFZDLAotIyB3aGljaCBuZWVkcyAnLmxpYicpLgotbGliZXh0PWEKLWx0bWFpbj0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotb2ZpbGU9IiRkZWZhdWx0X29maWxlIgotd2l0aF9nbnVfbGQ9IiRsdF9jdl9wcm9nX2dudV9sZCIKLW5lZWRfbG9ja3M9IiRlbmFibGVfbGlidG9vbF9sb2NrIgotCi1vbGRfQ0M9IiRDQyIKLW9sZF9DRkxBR1M9IiRDRkxBR1MiCi0KLSMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIHZhcmlvdXMgdmFyaWFibGVzCi10ZXN0IC16ICIkQVIiICYmIEFSPWFyCi10ZXN0IC16ICIkQVJfRkxBR1MiICYmIEFSX0ZMQUdTPWNydQotdGVzdCAteiAiJEFTIiAmJiBBUz1hcwotdGVzdCAteiAiJENDIiAmJiBDQz1jYwotdGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAotdGVzdCAteiAiJExEIiAmJiBMRD1sZAotdGVzdCAteiAiJExOX1MiICYmIExOX1M9ImxuIC1zIgotdGVzdCAteiAiJE1BR0lDX0NNRCIgJiYgTUFHSUNfQ01EPWZpbGUKLXRlc3QgLXogIiROTSIgJiYgTk09bm0KLXRlc3QgLXogIiRPQkpEVU1QIiAmJiBPQkpEVU1QPW9iamR1bXAKLXRlc3QgLXogIiRSQU5MSUIiICYmIFJBTkxJQj06Ci10ZXN0IC16ICIkU1RSSVAiICYmIFNUUklQPToKLXRlc3QgLXogIiRhY19vYmpleHQiICYmIGFjX29iamV4dD1vCi0KLWlmIHRlc3QgeCIkaG9zdCIgIT0geCIkYnVpbGQiOyB0aGVuCi0gIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCi1lbHNlCi0gIGFjX3Rvb2xfcHJlZml4PQotZmkKLQotIyBUcmFuc2Zvcm0gbGludXgqIHRvICotKi1saW51eC1nbnUqLCB0byBzdXBwb3J0IG9sZCBjb25maWd1cmUgc2NyaXB0cy4KLWNhc2UgJGhvc3Rfb3MgaW4KLWxpbnV4LWdudSopIDs7Ci1saW51eCopIGhvc3Q9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoLiotLiotbGludXhcKVwoLipcKSQvXDEtZ251XDIvJ2AKLWVzYWMKLQotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQotICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgotICBpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KLSAgICBDT0xMRUNUX05BTUVTPQotICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLSMgRGV0ZXJtaW5lIGNvbW1hbmRzIHRvIGNyZWF0ZSBvbGQtc3R5bGUgc3RhdGljIGFyY2hpdmVzLgotb2xkX2FyY2hpdmVfY21kcz0nJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCi1vbGRfcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNjQ0ICRvbGRsaWInCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPQotCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBjYXNlICRob3N0X29zIGluCi0gIG9wZW5ic2QqKQotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSJcJFJBTkxJQiAtdCBcJG9sZGxpYn4kb2xkX3Bvc3RpbnN0YWxsX2NtZHMiCi0gICAgOzsKLSAgKikKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iXCRSQU5MSUIgXCRvbGRsaWJ+JG9sZF9wb3N0aW5zdGFsbF9jbWRzIgotICAgIDs7Ci0gIGVzYWMKLSAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCi1maQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotc2V0IGR1bW15ICRDQwotY29tcGlsZXI9IiQyIgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2JqZGlyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDYzOiBjaGVja2luZyBmb3Igb2JqZGlyIiA+JjUKLXJtIC1mIC5saWJzIDI+L2Rldi9udWxsCi1ta2RpciAubGlicyAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAubGliczsgdGhlbgotICBvYmpkaXI9LmxpYnMKLWVsc2UKLSAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KLSAgb2JqZGlyPV9saWJzCi1maQotcm1kaXIgLmxpYnMgMj4vZGV2L251bGwKLWVjaG8gIiRhY190IiIkb2JqZGlyIiAxPiY2Ci0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1waWMgb3IgLS13aXRob3V0LXBpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfcGljK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX3BpYyIKLSAgcGljX21vZGU9IiR3aXRodmFsIgotZWxzZQotICBwaWNfbW9kZT1kZWZhdWx0Ci1maQotCi10ZXN0IC16ICIkcGljX21vZGUiICYmIHBpY19tb2RlPWRlZmF1bHQKLQotIyBXZSBhc3N1bWUgaGVyZSB0aGF0IHRoZSB2YWx1ZSBmb3IgbHRfY3ZfcHJvZ19jY19waWMgd2lsbCBub3QgYmUgY2FjaGVkCi0jIGluIGlzb2xhdGlvbiwgYW5kIHRoYXQgc2VlaW5nIGl0IHNldCAoZnJvbSB0aGUgY2FjaGUpIGluZGljYXRlcyB0aGF0Ci0jIHRoZSBhc3NvY2lhdGVkIHZhbHVlcyBhcmUgc2V0IChpbiB0aGUgY2FjaGUpIGNvcnJlY3RseSB0b28uCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ5MDogY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X3Byb2dfY2NfcGljJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIGx0X2N2X3Byb2dfY2NfcGljPQotICBsdF9jdl9wcm9nX2NjX3NobGliPQotICBsdF9jdl9wcm9nX2NjX3dsPQotICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0KLSAgbHRfY3ZfcHJvZ19jY19ub19idWlsdGluPQotICBsdF9jdl9wcm9nX2NjX2Nhbl9idWlsZF9zaGFyZWQ9JGNhbl9idWlsZF9zaGFyZWQKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIGx0X2N2X3Byb2dfY2Nfd2w9Jy1XbCwnCi0gICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1zdGF0aWMnCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4KikKLSAgICAgICMgQmVsb3cgdGhlcmUgaXMgYSBkaXJ0eSBoYWNrIHRvIGZvcmNlIG5vcm1hbCBzdGF0aWMgbGlua2luZyB3aXRoIC1sZGwKLSAgICAgICMgVGhlIHByb2JsZW0gaXMgYmVjYXVzZSBsaWJkbCBkeW5hbWljYWxseSBsaW5rZWQgd2l0aCBib3RoIGxpYmMgYW5kCi0gICAgICAjIGxpYkMgKEFJWCBDKysgbGlicmFyeSksIHdoaWNoIG9idmlvdXNseSBkb2Vzbid0IGluY2x1ZGVkIGluIGxpYnJhcmllcwotICAgICAgIyBsaXN0IGJ5IGdjYy4gVGhpcyBjYXVzZSB1bmRlZmluZWQgc3ltYm9scyB3aXRoIC1zdGF0aWMgZmxhZ3MuCi0gICAgICAjIFRoaXMgaGFjayBhbGxvd3MgQyBwcm9ncmFtcyB0byBiZSBsaW5rZWQgd2l0aCAiLXN0YXRpYyAtbGRsIiwgYnV0Ci0gICAgICAjIG5vdCBzdXJlIGFib3V0IEMrKyBwcm9ncmFtcy4KLSAgICAgIGx0X2N2X3Byb2dfY2Nfc3RhdGljPSIkbHRfY3ZfcHJvZ19jY19zdGF0aWMgJHtsdF9jdl9wcm9nX2NjX3dsfS1sQyIKLSAgICAgIDs7Ci0gICAgYW1pZ2FvcyopCi0gICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0Ci0gICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKLSAgICAgICMgbGlrZSBgLW02ODA0MCcuCi0gICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JwotICAgICAgOzsKLSAgICBiZW9zKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KLSAgICAgIDs7Ci0gICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KLSAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKLSAgICAgIGx0X2N2X3Byb2dfY2NfcGljPSctZm5vLWNvbW1vbicKLSAgICAgIDs7Ci0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKLSAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKLSAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCi0gICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLURETExfRVhQT1JUJwotICAgICAgOzsKLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCi0JIGx0X2N2X3Byb2dfY2NfcGljPS1LY29uZm9ybV9waWMKLSAgICAgIGZpCi0gICAgICA7OwotICAgICopCi0gICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLWZQSUMnCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgICMgUE9SVE1FIENoZWNrIGZvciBQSUMgZmxhZ3MgZm9yIHRoZSBzeXN0ZW0gY29tcGlsZXIuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeDMqIHwgYWl4NCogfCBhaXg1KikKLSAgICAgIGx0X2N2X3Byb2dfY2Nfd2w9Jy1XbCwnCi0gICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCi0JbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgZWxzZQotCWx0X2N2X3Byb2dfY2Nfc3RhdGljPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9jdl9wcm9nX2NjX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/Ci0gICAgICBsdF9jdl9wcm9nX2NjX3dsPSctV2wsJwotICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9IiR7bHRfY3ZfcHJvZ19jY193bH0tYSAke2x0X2N2X3Byb2dfY2Nfd2x9YXJjaGl2ZSIKLSAgICAgIGx0X2N2X3Byb2dfY2NfcGljPScrWicKLSAgICAgIDs7Ci0KLSAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICAgICAgbHRfY3ZfcHJvZ19jY193bD0nLVdsLCcKLSAgICAgIGx0X2N2X3Byb2dfY2Nfc3RhdGljPSctbm9uX3NoYXJlZCcKLSAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KLSAgICAgIDs7Ci0KLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBvczIqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgIGx0X2N2X3Byb2dfY2NfcGljPSctRERMTF9FWFBPUlQnCi0gICAgICA7OwotCi0gICAgbmV3c29zNikKLSAgICAgIGx0X2N2X3Byb2dfY2NfcGljPSctS1BJQycKLSAgICAgIGx0X2N2X3Byb2dfY2Nfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICAjIEFsbCBPU0YvMSBjb2RlIGlzIFBJQy4KLSAgICAgIGx0X2N2X3Byb2dfY2Nfd2w9Jy1XbCwnCi0gICAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLW5vbl9zaGFyZWQnCi0gICAgICA7OwotCi0gICAgc2NvMy4ydjUqKQotICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1LcGljJwotICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1kbicKLSAgICAgIGx0X2N2X3Byb2dfY2Nfc2hsaWI9Jy1iZWxmJwotICAgICAgOzsKLQotICAgIHNvbGFyaXMqKQotICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1LUElDJwotICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgbHRfY3ZfcHJvZ19jY193bD0nLVdsLCcKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1QSUMnCi0gICAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICBsdF9jdl9wcm9nX2NjX3dsPSctUW9wdGlvbiBsZCAnCi0gICAgICA7OwotCi0gICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQotICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1LUElDJwotICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgbHRfY3ZfcHJvZ19jY193bD0nLVdsLCcKLSAgICAgIDs7Ci0KLSAgICB1dHM0KikKLSAgICAgIGx0X2N2X3Byb2dfY2NfcGljPSctcGljJwotICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KLQlsdF9jdl9wcm9nX2NjX3BpYz0nLUtjb25mb3JtX3BpYycKLQlsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgICopCi0gICAgICBsdF9jdl9wcm9nX2NjX2Nhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotCi1maQotCi1pZiB0ZXN0IC16ICIkbHRfY3ZfcHJvZ19jY19waWMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJub25lIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiIkbHRfY3ZfcHJvZ19jY19waWMiIDE+JjYKLQotICAjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcGljX2ZsYWcgYWN0dWFsbHkgd29ya3MuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfY3ZfcHJvZ19jY19waWMgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2Mzg6IGNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfY3ZfcHJvZ19jY19waWMgd29ya3MiID4mNQotICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbHRfY3ZfcHJvZ19jY19waWNfd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gICAgQ0ZMQUdTPSIkQ0ZMQUdTICRsdF9jdl9wcm9nX2NjX3BpYyAtRFBJQyIKLSAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjQ1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjUyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgICAgICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0JIyBPbiBIUC1VWCwgYm90aCBDQyBhbmQgR0NDIG9ubHkgd2FybiB0aGF0IFBJQyBpcyBzdXBwb3J0ZWQuLi4gdGhlbgotCSMgdGhleSBjcmVhdGUgbm9uLVBJQyBvYmplY3RzLiAgU28sIGlmIHRoZXJlIHdlcmUgYW55IHdhcm5pbmdzLCB3ZQotCSMgYXNzdW1lIHRoYXQgUElDIGlzIG5vdCBzdXBwb3J0ZWQuCi0JaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLQkgIGx0X2N2X3Byb2dfY2NfcGljX3dvcmtzPW5vCi0JZWxzZQotCSAgbHRfY3ZfcHJvZ19jY19waWNfd29ya3M9eWVzCi0JZmkKLQk7OwotICAgICAgKikKLQlsdF9jdl9wcm9nX2NjX3BpY193b3Jrcz15ZXMKLQk7OwotICAgICAgZXNhYwotICAgIAotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgICAgICBsdF9jdl9wcm9nX2NjX3BpY193b3Jrcz1ubwotICAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotICAKLWZpCi0KLQotICBpZiB0ZXN0ICJYJGx0X2N2X3Byb2dfY2NfcGljX3dvcmtzIiA9IFhubzsgdGhlbgotICAgIGx0X2N2X3Byb2dfY2NfcGljPQotICAgIGx0X2N2X3Byb2dfY2NfY2FuX2J1aWxkX3NoYXJlZD1ubwotICBlbHNlCi0gICAgbHRfY3ZfcHJvZ19jY19waWM9IiAkbHRfY3ZfcHJvZ19jY19waWMiCi0gIGZpCi0KLSAgZWNobyAiJGFjX3QiIiRsdF9jdl9wcm9nX2NjX3BpY193b3JrcyIgMT4mNgotZmkKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgc2hhcmVkIGxpYnJhcnkgY29tcGlsYXRpb24gZmxhZ3MuCi1pZiB0ZXN0IC1uICIkbHRfY3ZfcHJvZ19jY19zaGxpYiI7IHRoZW4KLSAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiBcYCRDQycgcmVxdWlyZXMgXGAkbHRfY3ZfcHJvZ19jY19zaGxpYicgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgotICBpZiBlY2hvICIkb2xkX0NDICRvbGRfQ0ZMQUdTICIgfCBlZ3JlcCAtZSAiWyAJXSRsdF9jdl9wcm9nX2NjX3NobGliWyAJXSIgPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIGVsc2UKLSAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogYWRkIFxgJGx0X2N2X3Byb2dfY2Nfc2hsaWInIHRvIHRoZSBDQyBvciBDRkxBR1MgZW52IHZhcmlhYmxlIGFuZCByZWNvbmZpZ3VyZSIgMT4mMgotICAgIGx0X2N2X3Byb2dfY2NfY2FuX2J1aWxkX3NoYXJlZD1ubwotICBmaQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF9jdl9wcm9nX2NjX3N0YXRpYyB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzcwNDogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF9jdl9wcm9nX2NjX3N0YXRpYyB3b3JrcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbHRfY3ZfcHJvZ19jY19zdGF0aWNfd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIGx0X2N2X3Byb2dfY2Nfc3RhdGljX3dvcmtzPW5vCi0gIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCi0gIExERkxBR1M9IiRMREZMQUdTICRsdF9jdl9wcm9nX2NjX3N0YXRpYyIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzcxMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzcxOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfcHJvZ19jY19zdGF0aWNfd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgotCi1maQotCi0KLSMgQmVsdCAqYW5kKiBicmFjZXMgdG8gc3RvcCBteSB0cm91c2VycyBmYWxsaW5nIGRvd246Ci10ZXN0ICJYJGx0X2N2X3Byb2dfY2Nfc3RhdGljX3dvcmtzIiA9IFhubyAmJiBsdF9jdl9wcm9nX2NjX3N0YXRpYz0KLWVjaG8gIiRhY190IiIkbHRfY3ZfcHJvZ19jY19zdGF0aWNfd29ya3MiIDE+JjYKLQotcGljX2ZsYWc9IiRsdF9jdl9wcm9nX2NjX3BpYyIKLXNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncz0iJGx0X2N2X3Byb2dfY2Nfc2hsaWIiCi13bD0iJGx0X2N2X3Byb2dfY2Nfd2wiCi1saW5rX3N0YXRpY19mbGFnPSIkbHRfY3ZfcHJvZ19jY19zdGF0aWMiCi1ub19idWlsdGluX2ZsYWc9IiRsdF9jdl9wcm9nX2NjX25vX2J1aWx0aW4iCi1jYW5fYnVpbGRfc2hhcmVkPSIkbHRfY3ZfcHJvZ19jY19jYW5fYnVpbGRfc2hhcmVkIgotCi0KLSMgQ2hlY2sgdG8gc2VlIGlmIG9wdGlvbnMgLW8gYW5kIC1jIGFyZSBzaW11bHRhbmVvdXNseSBzdXBwb3J0ZWQgYnkgY29tcGlsZXIKLWVjaG8gJGFjX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3NDY6IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2NvbXBpbGVyX2Nfbycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIAotJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCi1ta2RpciBjb25mdGVzdAotY2QgY29uZnRlc3QKLWVjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuJGFjX2V4dAotbWtkaXIgb3V0Ci0jIEFjY29yZGluZyB0byBUb20gVHJvbWV5LCBJYW4gTGFuY2UgVGF5bG9yIHJlcG9ydGVkIHRoZXJlIGFyZSBDIGNvbXBpbGVycwotIyB0aGF0IHdpbGwgY3JlYXRlIHRlbXBvcmFyeSBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgcmVnYXJkbGVzcyBvZgotIyB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gIFRodXMsIG1ha2luZyBDV0QgcmVhZC1vbmx5IHdpbGwgY2F1c2UgdGhpcyB0ZXN0Ci0jIHRvIGZhaWwsIGVuYWJsaW5nIGxvY2tpbmcgb3IgYXQgbGVhc3Qgd2FybmluZyB0aGUgdXNlciBub3QgdG8gZG8gcGFyYWxsZWwKLSMgYnVpbGRzLgotY2htb2QgLXcgLgotc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9IiRDRkxBR1MgLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgotY29tcGlsZXJfY19vPW5vCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3NjU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+b3V0L2NvbmZ0ZXN0LmVycjsgfSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dDsgdGhlbgotICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgaWYgdGVzdCAtcyBvdXQvY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgbHRfY3ZfY29tcGlsZXJfY19vPW5vCi0gIGVsc2UKLSAgICBsdF9jdl9jb21waWxlcl9jX289eWVzCi0gIGZpCi1lbHNlCi0gICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gIGNhdCBvdXQvY29uZnRlc3QuZXJyIDE+JjUKLSAgbHRfY3ZfY29tcGlsZXJfY19vPW5vCi1maQotQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCi1jaG1vZCB1K3cgLgotJHJtIGNvbmZ0ZXN0KiBvdXQvKgotcm1kaXIgb3V0Ci1jZCAuLgotcm1kaXIgY29uZnRlc3QKLSRybSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAotCi1maQotCi1jb21waWxlcl9jX289JGx0X2N2X2NvbXBpbGVyX2NfbwotZWNobyAiJGFjX3QiIiRjb21waWxlcl9jX28iIDE+JjYKLQotaWYgdGVzdCB4IiRjb21waWxlcl9jX28iID0geCJ5ZXMiOyB0aGVuCi0gICMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiB3cml0ZSB0byBhIC5sbwotICBlY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5sbyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzc5NDogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUubG8iID4mNQotICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbHRfY3ZfY29tcGlsZXJfb19sbycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIAotICBsdF9jdl9jb21waWxlcl9vX2xvPW5vCi0gIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWMgLW8gY29uZnRlc3QubG8iCi0gIHNhdmVfb2JqZXh0PSIkYWNfb2JqZXh0IgotICBhY19vYmpleHQ9bG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzgwNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotaW50IHNvbWVfdmFyaWFibGUgPSAwOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4MTI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICAgbHRfY3ZfY29tcGlsZXJfb19sbz1ubwotICAgIGVsc2UKLSAgICAgIGx0X2N2X2NvbXBpbGVyX29fbG89eWVzCi0gICAgZmkKLSAgCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19vYmpleHQ9IiRzYXZlX29iamV4dCIKLSAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCi0gIAotZmkKLQotICBjb21waWxlcl9vX2xvPSRsdF9jdl9jb21waWxlcl9vX2xvCi0gIGVjaG8gIiRhY190IiIkY29tcGlsZXJfb19sbyIgMT4mNgotZWxzZQotICBjb21waWxlcl9vX2xvPW5vCi1maQotCi0jIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZG8gaGFyZCBsaW5rcyB0byBsb2NrIHNvbWUgZmlsZXMgaWYgbmVlZGVkCi1oYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCi1pZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODQzOiBjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MiID4mNQotICBoYXJkX2xpbmtzPXllcwotICAkcm0gY29uZnRlc3QqCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIHRvdWNoIGNvbmZ0ZXN0LmEKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubwotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICBlY2hvICIkYWNfdCIiJGhhcmRfbGlua3MiIDE+JjYKLSAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KLSAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiIDE+JjIKLSAgICBuZWVkX2xvY2tzPXdhcm4KLSAgZmkKLWVsc2UKLSAgbmVlZF9sb2Nrcz1ubwotZmkKLQotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIGFyZSBzdXBwb3J0ZWQgYnkgY29tcGlsZXIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4NjI6IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIiA+JjUKLSAgZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyAtYyBjb25mdGVzdC4kYWNfZXh0IgotICBjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzg2OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotaW50IHNvbWVfdmFyaWFibGUgPSAwOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4NzU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICAgY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCi0gICAgZWxzZQotICAgICAgY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPXllcwotICAgIGZpCi0gIAotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCi0gIGVjaG8gIiRhY190IiIkY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiAxPiY2Ci0KLSAgaWYgdGVzdCAiJGNvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPSAieWVzIjsgdGhlbgotICAgIG5vX2J1aWx0aW5fZmxhZz0nIC1mbm8tYnVpbHRpbiAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zJwotICBlbHNlCi0gICAgbm9fYnVpbHRpbl9mbGFnPScgLWZuby1idWlsdGluJwotICBmaQotZmkKLQotIyBTZWUgaWYgdGhlIGxpbmtlciBzdXBwb3J0cyBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5MDI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLQotYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Ci1ub191bmRlZmluZWRfZmxhZz0KLW5lZWRfbGliX3ByZWZpeD11bmtub3duCi1uZWVkX3ZlcnNpb249dW5rbm93bgotIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCi0jIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKLWFyY2hpdmVfY21kcz0KLWFyY2hpdmVfZXhwc3ltX2NtZHM9Ci1vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPQotb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9Ci1leHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Ci13aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KLXRocmVhZF9zYWZlX2ZsYWdfc3BlYz0KLWhhcmRjb2RlX2ludG9fbGlicz1ubwotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9Ci1oYXJkY29kZV9kaXJlY3Q9bm8KLWhhcmRjb2RlX21pbnVzX0w9bm8KLWhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKLXJ1bnBhdGhfdmFyPQotbGlua19hbGxfZGVwbGlicz11bmtub3duCi1hbHdheXNfZXhwb3J0X3N5bWJvbHM9bm8KLWV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgc2VkICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgotIyBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIGxpc3QKLWluY2x1ZGVfZXhwc3ltcz0KLSMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBlZ3JlcCByZWd1bGFyIGV4cHJlc3Npb24gb2Ygc3ltYm9scyB0byBleGNsdWRlCi0jIGl0IHdpbGwgYmUgd3JhcHBlZCBieSBgICgnIGFuZCBgKSQnLCBzbyBvbmUgbXVzdCBub3QgbWF0Y2ggYmVnaW5uaW5nIG9yCi0jIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCi0jIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KLWV4Y2x1ZGVfZXhwc3ltcz0iX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgotIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0Ci0jIHBsYXRmb3JtcyAoYWIpdXNlIGl0IGluIFBJQyBjb2RlLCBidXQgdGhlaXIgbGlua2VycyBnZXQgY29uZnVzZWQgaWYKLSMgdGhlIHN5bWJvbCBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQuICBTaW5jZSBwb3J0YWJsZSBjb2RlIGNhbm5vdAotIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCi0jIHByZWxvYWRlZCBzeW1ib2wgdGFibGVzLgotZXh0cmFjdF9leHBzeW1zX2NtZHM9Ci0KLWNhc2UgJGhvc3Rfb3MgaW4KLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQotICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgotICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KLSAgICB3aXRoX2dudV9sZD1ubwotICBmaQotICA7Owotb3BlbmJzZCopCi0gIHdpdGhfZ251X2xkPW5vCi0gIDs7Ci1lc2FjCi0KLWxkX3NobGlicz15ZXMKLWlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKLSAgd2xhcmM9JyR7d2x9JwotCi0gICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgotICBjYXNlICRob3N0X29zIGluCi0gIGFpeDMqIHwgYWl4NCogfCBhaXg1KikKLSAgICAjIE9uIEFJWCwgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KLSAgICAjIE5vdGU6Q2hlY2sgR05VIGxpbmtlciBvbiBBSVggNS1JQTY0IHdoZW4vaWYgaXQgYmVjb21lcyBhdmFpbGFibGUuCi0gICAgbGRfc2hsaWJzPW5vCi0gICAgY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAotKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCi0qKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKLSoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKLSoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLUVPRgotICAgIDs7Ci0KLSAgYW1pZ2FvcyopCi0gICAgYXJjaGl2ZV9jbWRzPSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotCi0gICAgIyBTYW11ZWwgQS4gRmFsdm8gSUkgPGtjNXRqYUBkb2xwaGluLm9wZW5wcm9qZWN0cy5uZXQ+IHJlcG9ydHMKLSAgICAjIHRoYXQgdGhlIHNlbWFudGljcyBvZiBkeW5hbWljIGxpYnJhcmllcyBvbiBBbWlnYU9TLCBhdCBsZWFzdCB1cAotICAgICMgdG8gdmVyc2lvbiA0LCBpcyB0byBzaGFyZSBkYXRhIGFtb25nIG11bHRpcGxlIHByb2dyYW1zIGxpbmtlZAotICAgICMgd2l0aCB0aGUgc2FtZSBkeW5hbWljIGxpYnJhcnkuICBTaW5jZSB0aGlzIGRvZXNuJ3QgbWF0Y2ggdGhlCi0gICAgIyBiZWhhdmlvciBvZiBzaGFyZWQgbGlicmFyaWVzIG9uIG90aGVyIHBsYXRmb3Jtcywgd2UgY2FuIHVzZQotICAgICMgdGhlbS4KLSAgICBsZF9zaGxpYnM9bm8KLSAgICA7OwotCi0gIGJlb3MqKQotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgICAjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCi0gICAgICAjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICBmaQotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKLSAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKLQotICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzPSd0ZXN0IC1mICRvdXRwdXRfb2JqZGlyL2ltcGdlbi5jIHx8IFwKLSAgICAgIHNlZCAtZSAiL14jIFwvXCogaW1wZ2VuXC5jIHN0YXJ0cyBoZXJlIFwqXC8vLC9eIyBcL1wqIGltcGdlbi5jIGVuZHMgaGVyZSBcKlwvLyB7IHMvXiMgLy87cy9eIyAqJC8vOyBwOyB9IiAtZSBkIDwgJCcnMCA+ICRvdXRwdXRfb2JqZGlyL2ltcGdlbi5jfgotICAgICAgdGVzdCAtZiAkb3V0cHV0X29iamRpci9pbXBnZW4uZXhlIHx8IChjZCAkb3V0cHV0X29iamRpciAmJiBcCi0gICAgICBpZiB0ZXN0ICJ4JEhPU1RfQ0MiICE9ICJ4IiA7IHRoZW4gJEhPU1RfQ0MgLW8gaW1wZ2VuIGltcGdlbi5jIDsgXAotICAgICAgZWxzZSAkQ0MgLW8gaW1wZ2VuIGltcGdlbi5jIDsgZmkpfgotICAgICAgJG91dHB1dF9vYmpkaXIvaW1wZ2VuICRkaXIvJHNvcm9vdCA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmJwotCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JyRETExUT09MIC0tYXM9JEFTIC0tZGxsbmFtZSAkc29uYW1lIC0tZGVmICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmIC0tb3V0cHV0LWxpYiAkb3V0cHV0X29iamRpci8kbmV3bGliJwotCi0gICAgIyBjeWd3aW4gYW5kIG1pbmd3IGRsbHMgaGF2ZSBkaWZmZXJlbnQgZW50cnkgcG9pbnRzIGFuZCBzZXRzIG9mIHN5bWJvbHMKLSAgICAjIHRvIGV4Y2x1ZGUuCi0gICAgIyBGSVhNRTogd2hhdCBhYm91dCB2YWx1ZXMgZm9yIE1TVkM/Ci0gICAgZGxsX2VudHJ5PV9fY3lnd2luX2RsbF9lbnRyeUAxMgotICAgIGRsbF9leGNsdWRlX3N5bWJvbHM9RGxsTWFpbkAxMixfY3lnd2luX2RsbF9lbnRyeUAxMixfY3lnd2luX25vbmN5Z3dpbl9kbGxfZW50cnlAMTJ+Ci0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG1pbmd3KikKLSAgICAgICMgbWluZ3cgdmFsdWVzCi0gICAgICBkbGxfZW50cnk9X0RsbE1haW5DUlRTdGFydHVwQDEyCi0gICAgICBkbGxfZXhjbHVkZV9zeW1ib2xzPURsbE1haW5AMTIsRGxsTWFpbkNSVFN0YXJ0dXBAMTIsRGxsRW50cnlQb2ludEAxMn4KLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBtaW5ndyBhbmQgY3lnd2luIGRpZmZlciwgYW5kIGl0J3Mgc2ltcGxlc3QgdG8ganVzdCBleGNsdWRlIHRoZSB1bmlvbgotICAgICMgb2YgdGhlIHR3byBzeW1ib2wgc2V0cy4KLSAgICBkbGxfZXhjbHVkZV9zeW1ib2xzPURsbE1haW5AMTIsX2N5Z3dpbl9kbGxfZW50cnlAMTIsX2N5Z3dpbl9ub25jeWd3aW5fZGxsX2VudHJ5QDEyLERsbE1haW5DUlRTdGFydHVwQDEyLERsbEVudHJ5UG9pbnRAMTIKLQotICAgICMgcmVjZW50IGN5Z3dpbiBhbmQgbWluZ3cgc3lzdGVtcyBzdXBwbHkgYSBzdHViIERsbE1haW4gd2hpY2ggdGhlIHVzZXIKLSAgICAjIGNhbiBvdmVycmlkZSwgYnV0IG9uIG9sZGVyIHN5c3RlbXMgd2UgaGF2ZSB0byBzdXBwbHkgb25lIChpbiBsdGRsbC5jKQotICAgIGlmIHRlc3QgIngkbHRfY3ZfbmVlZF9kbGxtYWluIiA9ICJ4eWVzIjsgdGhlbgotICAgICAgbHRkbGxfb2JqPSckb3V0cHV0X29iamRpci8kc29uYW1lLWx0ZGxsLiciJGFjX29iamV4dCAiCi0gICAgICBsdGRsbF9jbWRzPSd0ZXN0IC1mICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtbHRkbGwuYyB8fCBzZWQgLWUgIi9eIyBcL1wqIGx0ZGxsXC5jIHN0YXJ0cyBoZXJlIFwqXC8vLC9eIyBcL1wqIGx0ZGxsLmMgZW5kcyBoZXJlIFwqXC8vIHsgcy9eIyAvLzsgcDsgfSIgLWUgZCA8ICQnJzAgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLWx0ZGxsLmN+Ci0JdGVzdCAtZiAkb3V0cHV0X29iamRpci8kc29uYW1lLWx0ZGxsLiRhY19vYmpleHQgfHwgKGNkICRvdXRwdXRfb2JqZGlyICYmICRDQyAtYyAkc29uYW1lLWx0ZGxsLmMpficKLSAgICBlbHNlCi0gICAgICBsdGRsbF9vYmo9Ci0gICAgICBsdGRsbF9jbWRzPQotICAgIGZpCi0KLSAgICAjIEV4dHJhY3QgdGhlIHN5bWJvbCBleHBvcnQgbGlzdCBmcm9tIGFuIGAtLWV4cG9ydC1hbGwnIGRlZiBmaWxlLAotICAgICMgdGhlbiByZWdlbmVyYXRlIHRoZSBkZWYgZmlsZSBmcm9tIHRoZSBzeW1ib2wgZXhwb3J0IGxpc3QsIHNvIHRoYXQKLSAgICAjIHRoZSBjb21waWxlZCBkbGwgb25seSBleHBvcnRzIHRoZSBzeW1ib2wgZXhwb3J0IGxpc3QuCi0gICAgIyBCZSBjYXJlZnVsIG5vdCB0byBzdHJpcCB0aGUgREFUQSB0YWcgbGVmdCBiZSBuZXdlciBkbGx0b29scy4KLSAgICBleHBvcnRfc3ltYm9sc19jbWRzPSIkbHRkbGxfY21kcyInCi0gICAgICAkRExMVE9PTCAtLWV4cG9ydC1hbGwgLS1leGNsdWRlLXN5bWJvbHMgJyRkbGxfZXhjbHVkZV9zeW1ib2xzJyAtLW91dHB1dC1kZWYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWYgJyRsdGRsbF9vYmonJGxpYm9ianMgJGNvbnZlbmllbmNlfgotICAgICAgc2VkIC1lICIxLC9FWFBPUlRTL2QiIC1lICJzLyBAIFswLTldKi8vIiAtZSAicy8gKjsuKiQvLyIgPCAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZiA+ICRleHBvcnRfc3ltYm9scycKLQotICAgICMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKLSAgICAjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXMuCi0gICAgIyBJZiBEQVRBIHRhZ3MgZnJvbSBhIHJlY2VudCBkbGx0b29sIGFyZSBwcmVzZW50LCBob25vdXIgdGhlbSEKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdpZiB0ZXN0ICJ4YHNlZCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCi0JY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmOwotICAgICAgZWxzZQotCWVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmOwotCV9sdF9oaW50PTE7Ci0JY2F0ICRleHBvcnRfc3ltYm9scyB8IHdoaWxlIHJlYWQgc3ltYm9sOyBkbwotCSBzZXQgZHVtbXkgXCRzeW1ib2w7Ci0JIGNhc2UgXCQjIGluCi0JICAgMikgZWNobyAiICAgXCQyIEAgXCRfbHRfaGludCA7ICIgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWY7OwotCSAgIDQpIGVjaG8gIiAgIFwkMiBcJDMgXCQ0IDsgIiA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZjsgX2x0X2hpbnQ9YGV4cHIgXCRfbHRfaGludCAtIDFgOzsKLQkgICAqKSBlY2hvICIgICAgIFwkMiBAIFwkX2x0X2hpbnQgXCQzIDsgIiA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZjs7Ci0JIGVzYWM7Ci0JIF9sdF9oaW50PWBleHByIDEgKyBcJF9sdF9oaW50YDsKLQlkb25lOwotICAgICAgZml+Ci0gICAgICAnIiRsdGRsbF9jbWRzIicKLSAgICAgICRDQyAtV2wsLS1iYXNlLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1iYXNlICckbHRfY3ZfY2NfZGxsX3N3aXRjaCcgLVdsLC1lLCckZGxsX2VudHJ5JyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICckbHRkbGxfb2JqJyRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34KLSAgICAgICRETExUT09MIC0tYXM9JEFTIC0tZGxsbmFtZSAkc29uYW1lIC0tZXhjbHVkZS1zeW1ib2xzICckZGxsX2V4Y2x1ZGVfc3ltYm9scycgLS1kZWYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWYgLS1iYXNlLWZpbGUgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1iYXNlIC0tb3V0cHV0LWV4cCAkb3V0cHV0X29iamRpci8kc29uYW1lLWV4cH4KLSAgICAgICRDQyAtV2wsLS1iYXNlLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1iYXNlICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZXhwICckbHRfY3ZfY2NfZGxsX3N3aXRjaCcgLVdsLC1lLCckZGxsX2VudHJ5JyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICckbHRkbGxfb2JqJyRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34KLSAgICAgICRETExUT09MIC0tYXM9JEFTIC0tZGxsbmFtZSAkc29uYW1lIC0tZXhjbHVkZS1zeW1ib2xzICckZGxsX2V4Y2x1ZGVfc3ltYm9scycgLS1kZWYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWYgLS1iYXNlLWZpbGUgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1iYXNlIC0tb3V0cHV0LWV4cCAkb3V0cHV0X29iamRpci8kc29uYW1lLWV4cCAtLW91dHB1dC1saWIgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGxsLmF+Ci0gICAgICAkQ0MgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1leHAgJyRsdF9jdl9jY19kbGxfc3dpdGNoJyAtV2wsLWUsJyRkbGxfZW50cnknIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJyRsdGRsbF9vYmonJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgIDs7Ci0KLSAgbmV0YnNkKikKLSAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCi0gICAgICB3bGFyYz0KLSAgICBlbHNlCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkIC1ub2RlZmF1bHRsaWJzICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgLW5vZGVmYXVsdGxpYnMgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgZmkKLSAgICA7OwotCi0gIHNvbGFyaXMqIHwgc3lzdjUqKQotICAgIGlmICRMRCAtdiAyPiYxIHwgZWdyZXAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgbGRfc2hsaWJzPW5vCi0gICAgICBjYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogVGhlIHJlbGVhc2VzIDIuOC4qIG9mIHRoZSBHTlUgbGlua2VyIGNhbm5vdCByZWxpYWJseQotKioqIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAotKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQotKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi45LjEgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKLSoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCi0qKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotRU9GCi0gICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCBlZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgbGRfc2hsaWJzPW5vCi0gICAgZmkKLSAgICA7OwotCi0gIHN1bm9zNCopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgIHdsYXJjPQotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICAqKQotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICBmaQotICAgIDs7Ci0gIGVzYWMKLQotICBpZiB0ZXN0ICIkbGRfc2hsaWJzIiA9IHllczsgdGhlbgotICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICAgIyBkbGx0b29sIGRvZXNuJ3QgdW5kZXJzdGFuZCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgotICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Ci0gICAgICA7OwotICAgICopCi0gICAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBlZ3JlcCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KLQl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKLSAgICAgIGVsc2UKLQl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLWVsc2UKLSAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQotICBjYXNlICRob3N0X29zIGluCi0gIGFpeDMqKQotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcwotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRMRCAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLWJFOiRleHBvcnRfc3ltYm9scyAtVDUxMiAtSDUxMiAtYk06U1JFfiRBUiAkQVJfRkxBR1MgJGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lJwotICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCi0gICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0gICAgICAjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKLSAgICAgICMgYnJva2VuIGNvbGxlY3QyLgotICAgICAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCi0gICAgZmkKLSAgICA7OwotCi0gIGFpeDQqIHwgYWl4NSopCi0gICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICAgICMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKLSAgICAgICMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgotICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotICAgICAgZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKLSAgICAgIG5vX2VudHJ5X2ZsYWc9IiIKLSAgICBlbHNlCi0gICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0KLSAgICAgICMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAotICAgICAgIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCi0gICAgICAjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgotICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4NSopCi0JZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCi0JICBjYXNlICRsZF9mbGFnIGluCi0JICAqLWJydGwqKQotCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcwotCSAgICBicmVhawotCSAgOzsKLQkgIGVzYWMKLQlkb25lCi0gICAgICBlc2FjCi0KLSAgICAgIGV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCi0gICAgICBub19lbnRyeV9mbGFnPSctYm5vZW50cnknCi0gICAgZmkKLQotICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KLSAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKLSAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bwotICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90Ci0gICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCi0KLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgYXJjaGl2ZV9jbWRzPScnCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nOicKLSAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlswMTJdfGFpeDQuWzAxMl0uKikKLQljb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCi0JaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYgXAotCSAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCBncmVwIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAotCXRoZW4KLQkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgotCSAgaGFyZGNvZGVfZGlyZWN0PXllcwotCWVsc2UKLQkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKLQkgIGhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAotCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAotCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKLQkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZwotCSAgaGFyZGNvZGVfbWludXNfTD15ZXMKLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLQkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9Ci0JZmkKLSAgICAgIGVzYWMKLQotICAgICAgc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCi0gICAgZWxzZQotICAgICAgIyBub3QgdXNpbmcgZ2NjCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCXNoYXJlZF9mbGFnPScke3dsfS1HJwotICAgICAgZWxzZQotCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCi0JZWxzZQotCSAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKLQlmaQotICAgICAgZmkKLSAgICBmaQotCi0gICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGNhbiBkbyBzdHJhbmdlIHRoaW5ncywgc28gaXQgaXMgYmV0dGVyIHRvCi0gICAgIyBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCi0gICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcwotICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotICAgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCi0gICAgICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nLWJlcm9rJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjovdXNyL2xpYjovbGliJwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBlY2hvICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyBcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgotICAgIGVsc2UKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Ii16IG5vZGVmcyIKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0taCRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kbm9fZW50cnlfZmxhZyBcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCi0gICAgICBlbHNlCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tYm5vbGlicGF0aCAke3dsfS1ibGlicGF0aDokbGliZGlyOi91c3IvbGliOi9saWInCi0JIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKLQkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyR7d2x9LWJlcm9rJwotCSMgVGhpcyBpcyBhIGJpdCBzdHJhbmdlLCBidXQgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzCi0JIyBpdCdzIHNoYXJlZCBsaWJyYXJpZXMuCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRub19lbnRyeV9mbGFnIFwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyInIH4kQVIgLWNybG8gJG9iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG9iamRpci8kc29uYW1lJwotICAgICAgZmkKLSAgICBmaQotICAgIDs7Ci0KLSAgYW1pZ2FvcyopCi0gICAgYXJjaGl2ZV9jbWRzPSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgZGlmZmVyZW50IHNlbWFudGljcyBvbiB0aGUgR05VIGxkIHNlY3Rpb24KLSAgICBsZF9zaGxpYnM9bm8KLSAgICA7OwotCi0gIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCi0gICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcwotICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nICcKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCi0gICAgbGliZXh0PWxpYgotICAgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KLSAgICBhcmNoaXZlX2NtZHM9JyRDQyAtbyAkbGliICRsaWJvYmpzICRjb21waWxlcl9mbGFncyBgZWNobyAiJGRlcGxpYnMiIHwgc2VkIC1lICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCi0gICAgIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSd0cnVlJwotICAgICMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCi0gICAgb2xkX2FyY2hpdmVfY21kcz0nbGliIC9PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJwotICAgIGZpeF9zcmNmaWxlX3BhdGg9J2BjeWdwYXRoIC13ICIkc3JjZmlsZSJgJwotICAgIDs7Ci0KLSAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgICByaGFwc29keSogfCBkYXJ3aW4xLlswMTJdKQotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Jy11bmRlZmluZWQgc3VwcHJlc3MnCi0gICAgICA7OwotICAgICopICMgRGFyd2luIDEuMyBvbgotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Jy1mbGF0X25hbWVzcGFjZSAtdW5kZWZpbmVkIHN1cHByZXNzJwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgIyBGSVhNRTogUmVseWluZyBvbiBwb3NpeHkgJCgpIHdpbGwgY2F1c2UgcHJvYmxlbXMgZm9yCi0gICAgIyAgICAgICAgY3Jvc3MtY29tcGlsYXRpb24sIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoZSBlY2hvIHRlc3RzIGRvIG5vdAotICAgICMgICAgICAgIHlldCBkZXRlY3QgenNoIGVjaG8ncyByZW1vdmFsIG9mIFwgZXNjYXBlcy4gIEFsc28genNoIG1hbmdsZXMKLSAgICAjCSAgICAgYCInIHF1b3RlcyBpZiB3ZSBwdXQgdGhlbSBpbiBoZXJlLi4uIHNvIGRvbid0IQotICAgIGFyY2hpdmVfY21kcz0nJENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gJHtsaWJ9LW1hc3Rlci5vICRsaWJvYmpzICYmICRDQyAkKHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLWJ1bmRsZSB8fCBlY2hvIC1keW5hbWljbGliKSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAke2xpYn0tbWFzdGVyLm8gJGRlcGxpYnMkbGlua2VyX2ZsYWdzICQodGVzdCAuJG1vZHVsZSAhPSAueWVzICYmIGVjaG8gLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nKScKLSAgICAjIFdlIG5lZWQgdG8gYWRkICdfJyB0byB0aGUgc3ltYm9scyBpbiAkZXhwb3J0X3N5bWJvbHMgZmlyc3QKLSAgICAjYXJjaGl2ZV9leHBzeW1fY21kcz0iJGFyY2hpdmVfY21kcyInICYmIHN0cmlwIC1zICRleHBvcnRfc3ltYm9scycKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSctYWxsX2xvYWQgJGNvbnZlbmllbmNlJwotICAgIDs7Ci0KLSAgZnJlZWJzZDEqKQotICAgIGxkX3NobGlicz1ubwotICAgIDs7Ci0KLSAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCi0gICMgc3VwcG9ydC4gIEZ1dHVyZSB2ZXJzaW9ucyBkbyB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dCBhbiBleHBsaWNpdCBjKytydDAubwotICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKLSAgIyBleHRyYSBzcGFjZSkuCi0gIGZyZWVic2QyLjIqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAvdXNyL2xpYi9jKytydDAubycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KLSAgZnJlZWJzZDIqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCi0gIGZyZWVic2QqKQotICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgaHB1eDkqKSBhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJyA7OwotICAgICopIGFyY2hpdmVfY21kcz0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgOzsKLSAgICBlc2FjCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwgYnV0IGFzIHRoZSBkZWZhdWx0Ci0JCQkgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0gICAgOzsKLQotICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBlbHNlCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctcnBhdGggJGxpYmRpcicKLSAgICBmaQotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCi0gICAgOzsKLQotICBuZXRic2QqKQotICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICMgYS5vdXQKLSAgICBlbHNlCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgotICAgIGZpCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBuZXdzb3M2KQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgb3BlbmJzZCopCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKLSAgICBlbHNlCi0gICAgICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgICAgIG9wZW5ic2RbMDFdLiogfCBvcGVuYnNkMi5bMC03XSB8IG9wZW5ic2QyLlswLTddLiopCi0JYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICAgICAgOzsKLSAgICAgICopCi0gICAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJwotICAgICAgICA7OwotICAgICAgZXNhYwotICAgIGZpCi0gICAgOzsKLQotICBvczIqKQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgYXJjaGl2ZV9jbWRzPSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgIDs7Ci0KLSAgb3NmMyopCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICBmaQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLSAgICA7OwotCi0gIG9zZjQqIHwgb3NmNSopCSMgYXMgb3NmMyogd2l0aCB0aGUgYWRkaXRpb24gb2YgLW1zeW0gZmxhZwotICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgZWxzZQotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICItZXhwb3J0ZWRfc3ltYm9sICIgPj4gJGxpYi5leHA7IGVjaG8gIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+Ci0gICAgICAkTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1pbnB1dCAkbGliLmV4cCAkbGlua2VyX2ZsYWdzICRsaWJvYmpzICRkZXBsaWJzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JHJtICRsaWIuZXhwJwotCi0gICAgICAjQm90aCBjIGFuZCBjeHggY29tcGlsZXIgc3VwcG9ydCAtcnBhdGggZGlyZWN0bHkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1ycGF0aCAkbGliZGlyJwotICAgIGZpCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgOzsKLQotICBzY28zLjJ2NSopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1CZXhwb3J0JwotICAgIDs7Ci0KLSAgc29sYXJpcyopCi0gICAgIyBnY2MgLS12ZXJzaW9uIDwgMy4wIHdpdGhvdXQgYmludXRpbHMgY2Fubm90IGNyZWF0ZSBzZWxmIGNvbnRhaW5lZAotICAgICMgc2hhcmVkIGxpYnJhcmllcyByZWxpYWJseSwgcmVxdWlyaW5nIGxpYmdjYy5hIHRvIHJlc29sdmUgc29tZSBvZgotICAgICMgdGhlIG9iamVjdCBzeW1ib2xzIGdlbmVyYXRlZCBpbiBzb21lIGNhc2VzLiAgTGlicmFyaWVzIHRoYXQgdXNlCi0gICAgIyBhc3NlcnQgbmVlZCBsaWJnY2MuYSB0byByZXNvbHZlIF9fZXByaW50ZiwgZm9yIGV4YW1wbGUuICBMaW5raW5nCi0gICAgIyBhIGNvcHkgb2YgbGliZ2NjLmEgaW50byBldmVyeSBzaGFyZWQgbGlicmFyeSB0byBndWFyYW50ZWUgcmVzb2x2aW5nCi0gICAgIyBzdWNoIHN5bWJvbHMgY2F1c2VzIG90aGVyIHByb2JsZW1zOiAgQWNjb3JkaW5nIHRvIFRpbSBWYW4gSG9sZGVyCi0gICAgIyA8dGltLnZhbi5ob2xkZXJAcGFuZG9yYS5iZT4sIEMrKyBsaWJyYXJpZXMgZW5kIHVwIHdpdGggYSBzZXBhcmF0ZQotICAgICMgKHRvIHRoZSBhcHBsaWNhdGlvbikgZXhjZXB0aW9uIHN0YWNrIGZvciBvbmUgdGhpbmcuCi0gICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAteiBkZWZzJwotICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgICBjYXNlIGAkQ0MgLS12ZXJzaW9uIDI+L2Rldi9udWxsYCBpbgotICAgICAgWzEyXS4qKQotCWNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBSZWxlYXNlcyBvZiBHQ0MgZWFybGllciB0aGFuIHZlcnNpb24gMy4wIGNhbm5vdCByZWxpYWJseQotKioqIGNyZWF0ZSBzZWxmIGNvbnRhaW5lZCBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcywgd2l0aG91dAotKioqIGludHJvZHVjaW5nIGEgZGVwZW5kZW5jeSBvbiBsaWJnY2MuYS4gIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcKLSoqKiAtbm8tdW5kZWZpbmVkIHN1cHBvcnQsIHdoaWNoIHdpbGwgYXQgbGVhc3QgYWxsb3cgeW91IHRvIGJ1aWxkIHNoYXJlZAotKioqIGxpYnJhcmllcy4gIEhvd2V2ZXIsIHlvdSBtYXkgZmluZCB0aGF0IHdoZW4geW91IGxpbmsgc3VjaCBsaWJyYXJpZXMKLSoqKiBpbnRvIGFuIGFwcGxpY2F0aW9uIHdpdGhvdXQgdXNpbmcgR0NDLCB5b3UgaGF2ZSB0byBtYW51YWxseSBhZGQKLSoqKiBcYGdjYyAtLXByaW50LWxpYmdjYy1maWxlLW5hbWVcYCB0byB0aGUgbGluayBjb21tYW5kLiAgV2UgdXJnZSB5b3UgdG8KLSoqKiB1cGdyYWRlIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBHQ0MuICBBbm90aGVyIG9wdGlvbiBpcyB0byByZWJ1aWxkIHlvdXIKLSoqKiBjdXJyZW50IEdDQyB0byB1c2UgdGhlIEdOVSBsaW5rZXIgZnJvbSBHTlUgYmludXRpbHMgMi45LjEgb3IgbmV3ZXIuCi0KLUVPRgotICAgICAgICBub191bmRlZmluZWRfZmxhZz0KLQk7OwotICAgICAgZXNhYwotICAgIGZpCi0gICAgIyAkQ0MgLXNoYXJlZCB3aXRob3V0IEdOVSBsZCB3aWxsIG5vdCBjcmVhdGUgYSBsaWJyYXJ5IGZyb20gQysrCi0gICAgIyBvYmplY3QgZmlsZXMgYW5kIGEgc3RhdGljIGxpYnN0ZGMrKywgYmV0dGVyIGF2b2lkIGl0IGJ5IG5vdwotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIHNvbGFyaXMyLlswLTVdIHwgc29sYXJpczIuWzAtNV0uKikgOzsKLSAgICAqKSAjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQotICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnIDs7Ci0gICAgZXNhYwotICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCi0gICAgOzsKLQotICBzdW5vczQqKQotICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KLSAgICAgICMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KLSAgICAgICMgZmlsZXMgdGhhdCBtYWtlIC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucyB3b3JrLgotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgIGVsc2UKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICBmaQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBzeXN2NCkKLSAgICBjYXNlICRob3N0X3ZlbmRvciBpbgotICAgICAgc25pKQotICAgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KLSAgICAgICAgOzsKLSAgICAgIHNpZW1lbnMpCi0gICAgICAgICMjIExEIGlzIGxkIGl0IG1ha2VzIGEgUExBTUxJQgotICAgICAgICAjIyBDQyBqdXN0IG1ha2VzIGEgR3Jvc3NNb2R1bGUuCi0gICAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgICAgcmVsb2FkX2NtZHM9JyRDQyAtciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwotICAgICAgICBoYXJkY29kZV9kaXJlY3Q9bm8KLSAgICAgICAgOzsKLSAgICAgIG1vdG9yb2xhKQotICAgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgICAgaGFyZGNvZGVfZGlyZWN0PW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKLSAgICAgICAgOzsKLSAgICBlc2FjCi0gICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIHN5c3Y0LjMqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Jy1CZXhwb3J0JwotICAgIDs7Ci0KLSAgc3lzdjUqKQotICAgIG5vX3VuZGVmaW5lZF9mbGFnPScgLXogdGV4dCcKLSAgICAjICRDQyAtc2hhcmVkIHdpdGhvdXQgR05VIGxkIHdpbGwgbm90IGNyZWF0ZSBhIGxpYnJhcnkgZnJvbSBDKysKLSAgICAjIG9iamVjdCBmaWxlcyBhbmQgYSBzdGF0aWMgbGlic3RkYysrLCBiZXR0ZXIgYXZvaWQgaXQgYnkgbm93Ci0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotCQkkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc34kcm0gJGxpYi5leHAnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotICAgIDs7Ci0KLSAgdXRzNCopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIGRndXgqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBzeXN2NCpNUCopCi0gICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgICAgaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCi0gICAgICBsZF9zaGxpYnM9eWVzCi0gICAgZmkKLSAgICA7OwotCi0gIHN5c3Y0LjJ1dzIqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD1ubwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICBoYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKLSAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgIDs7Ci0KLSAgc3lzdjV1dzcqIHwgdW5peHdhcmU3KikKLSAgICBub191bmRlZmluZWRfZmxhZz0nJHt3bH0teiAke3dsfXRleHQnCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgZWxzZQotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgZmkKLSAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgKikKLSAgICBsZF9zaGxpYnM9bm8KLSAgICA7OwotICBlc2FjCi1maQotZWNobyAiJGFjX3QiIiRsZF9zaGxpYnMiIDE+JjYKLXRlc3QgIiRsZF9zaGxpYnMiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi0jIENoZWNrIGhhcmRjb2RpbmcgYXR0cmlidXRlcy4KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2MDE6IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQotaGFyZGNvZGVfYWN0aW9uPQotaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHx8IFwKLSAgIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQotICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCi0gIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IG5vICYmCi0gICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKLSAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQotICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCi0gICAgICMjIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiAhPSBubyAmJgotICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0gbm87IHRoZW4KLSAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgotICAgIGhhcmRjb2RlX2FjdGlvbj1yZWxpbmsKLSAgZWxzZQotICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCi0gICAgaGFyZGNvZGVfYWN0aW9uPWltbWVkaWF0ZQotICBmaQotZWxzZQotICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZwotICAjIGRpcmVjdG9yaWVzLgotICBoYXJkY29kZV9hY3Rpb249dW5zdXBwb3J0ZWQKLWZpCi1lY2hvICIkYWNfdCIiJGhhcmRjb2RlX2FjdGlvbiIgMT4mNgotCi1zdHJpcGxpYj0KLW9sZF9zdHJpcGxpYj0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDYyOTogY2hlY2tpbmcgd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlIiA+JjUKLWlmIHRlc3QgLW4gIiRTVFJJUCIgJiYgJFNUUklQIC1WIDI+JjEgfCBncmVwICJHTlUgc3RyaXAiID4vZGV2L251bGw7IHRoZW4KLSAgdGVzdCAteiAiJG9sZF9zdHJpcGxpYiIgJiYgb2xkX3N0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC1kZWJ1ZyIKLSAgdGVzdCAteiAiJHN0cmlwbGliIiAmJiBzdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtdW5uZWVkZWQiCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1yZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi10ZXN0IC16ICIkZGVwbGlic19jaGVja19tZXRob2QiICYmIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KLQotIyBQT1JUTUUgRmlsbCBpbiB5b3VyIGxkLnNvIGNoYXJhY3RlcmlzdGljcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NjQzOiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQotbGlicmFyeV9uYW1lc19zcGVjPQotbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKLXNvbmFtZV9zcGVjPQotcG9zdGluc3RhbGxfY21kcz0KLXBvc3R1bmluc3RhbGxfY21kcz0KLWZpbmlzaF9jbWRzPQotZmluaXNoX2V2YWw9Ci1zaGxpYnBhdGhfdmFyPQotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KLXZlcnNpb25fdHlwZT1ub25lCi1keW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLQotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAkbGlibmFtZS5hJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLQotICAjIEFJWCBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIDs7Ci0KLWFpeDQqIHwgYWl4NSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAkbGlibmFtZS5zbycKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBlbHNlCi0gICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQotICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKLSAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCi0gICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KLSAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKLQlpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJwotCSAgICAgZWNobyAnIHllcyAnCi0JICAgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8IGdyZXAgeWVzID4gL2Rldi9udWxsOyB0aGVuCi0JICA6Ci0JZWxzZQotCSAgY2FuX2J1aWxkX3NoYXJlZD1ubwotCWZpCi0JOzsKLSAgICBlc2FjCi0gICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbgotICAgICMgbm90IGhhcmRjb2RlIGNvcnJlY3Qgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuCi0gICAgIyBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbgotICAgICMgYmUgdXNlZnVsIGluIGZ1dHVyZS4KLSAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLSAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbwotICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKLSAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICAgIGVsc2UKLSAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCi0gICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJwotICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICAgIGZpCi0gICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIGZpCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotYW1pZ2FvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCi0gICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCi0gIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFteL10qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiKGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEpIjsgKGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEpIHx8IGV4aXQgMTsgZG9uZScKLSAgOzsKLQotYmVvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfS5zbycKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAotICA7OwotCi1ic2RpNCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPS1yZHluYW1pYwotICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAotICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKLSAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCi0gIDs7Ci0KLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgdmVyc2lvbl90eXBlPXdpbmRvd3MKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KLSAgeWVzLGN5Z3dpbiopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKLSAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCBzZWQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9LmRsbCcKLSAgICBwb3N0aW5zdGFsbF9jbWRzPSdkbHBhdGg9YGJhc2ggMj4mMSAtYyAnXCcnLiAkZGlyLyR7ZmlsZX1pO2VjaG8gXCRkbG5hbWUnXCcnYH4KLSAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KLSAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgotICAgICAgJGluc3RhbGxfcHJvZyAubGlicy8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZScKLSAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWBiYXNoIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KLSAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+Ci0gICAgICAgJHJtIFwkZGxwYXRoJwotICAgIDs7Ci0gIHllcyxtaW5ndyopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8IHNlZCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0uZGxsJwotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8IHNlZCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicy87LyAvZyIgLWUgInMsPS8sLyxnImAKLSAgICA7OwotICB5ZXMscHczMiopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgc2VkIC1lICdzLy4vLS9nJ2Ake3ZlcnN1ZmZpeH0uZGxsJwotICAgIDs7Ci0gICopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8IHNlZCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0uZGxsICRsaWJuYW1lLmxpYicKLSAgICA7OwotICBlc2FjCi0gIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCi0gICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgotICBzaGxpYnBhdGhfdmFyPVBBVEgKLSAgOzsKLQotZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCi0gIHZlcnNpb25fdHlwZT1kYXJ3aW4KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICAjIEZJWE1FOiBSZWx5aW5nIG9uIHBvc2l4eSAkKCkgd2lsbCBjYXVzZSBwcm9ibGVtcyBmb3IKLSAgIyAgICAgICAgY3Jvc3MtY29tcGlsYXRpb24sIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoZSBlY2hvIHRlc3RzIGRvIG5vdAotICAjICAgICAgICB5ZXQgZGV0ZWN0IHpzaCBlY2hvJ3MgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3ZlcnN1ZmZpeH0uJCh0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIHNvIHx8IGVjaG8gZHlsaWIpICR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0uJCh0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIHNvIHx8IGVjaG8gZHlsaWIpICR7bGlibmFtZX0uJCh0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIHNvIHx8IGVjaG8gZHlsaWIpJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfS4kKHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gc28gfHwgZWNobyBkeWxpYiknCi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1mcmVlYnNkMSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLWZyZWVic2QqKQotICBvYmpmb3JtYXQ9YHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0ICYmIC91c3IvYmluL29iamZvcm1hdCB8fCBlY2hvIGFvdXRgCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKLSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0gICAgZnJlZWJzZC1lbGYqKQotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJGxpYm5hbWUuc28nCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBmcmVlYnNkLSopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAkbGlibmFtZS5zbyR2ZXJzdWZmaXgnCi0gICAgICBuZWVkX3ZlcnNpb249eWVzCi0gICAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgZnJlZWJzZDIqKQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICA7OwotICAqKQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHttYWpvcn0gJHtsaWJuYW1lfS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCi0gICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbCR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wkbWFqb3IgJGxpYm5hbWUuc2wnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbCRtYWpvcicKLSAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJwotICA7OwotCi1pcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICBjYXNlICRob3N0X29zIGluCi0gICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OwotICAgICopICAgICAgICAgIHZlcnNpb25fdHlwZT1pcml4IDs7Ci0gIGVzYWMKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvICRsaWJuYW1lLnNvJwotICBjYXNlICRob3N0X29zIGluCi0gIGlyaXg1KiB8IG5vbnN0b3B1eCopCi0gICAgbGlic3VmZj0gc2hsaWJzdWZmPQotICAgIDs7Ci0gICopCi0gICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAotICAgICotMzJ8KiItMzIgIikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OwotICAgICotbjMyfCoiLW4zMiAiKSBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKLSAgICAqLTY0fCoiLTY0ICIpIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7Ci0gICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKLSAgOzsKLQotIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgotbGludXgtZ251b2xkbGQqIHwgbGludXgtZ251YW91dCogfCBsaW51eC1nbnVjb2ZmKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgtZ251KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgotICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKLSAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotCi0gICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgotICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCi0gICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAotICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAotICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKLSAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCi0KLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nIChtdWx0aWxpYiBMaW51eCB4ODZfNjQgaGFjaykuCi0gIGxpYnN1ZmY9Ci0gIGNhc2UgIiRob3N0X2NwdSIgaW4KLSAgeDg2XzY0KnxzMzkweCopCi0gICAgZWNobyAnI2xpbmUgNDkwMiAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gICAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTAzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCi0gICAgICAqNjQtYml0KikKLSAgICAgICAgbGlic3VmZj02NAotICAgICAgICA7OwotICAgICAgZXNhYwotICAgIGZpCi0gICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgIDs7Ci0gICopCi0gICAgOzsKLSAgZXNhYwotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiR7bGlic3VmZn0gL3Vzci9saWIke2xpYnN1ZmZ9IgotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIke2xpYnN1ZmZ9IC91c3IvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCi0gIDs7Ci0KLW5ldGJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9LnNvJHZlcnN1ZmZpeCcKLSAgICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKLSAgZWxzZQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvICR7bGlibmFtZX0uc28nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJwotICBmaQotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotbmV3c29zNikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLW9wZW5ic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLSAgICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgICBvcGVuYnNkMi5bODldIHwgb3BlbmJzZDIuWzg5XS4qKQotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICA7OwotICAgICopCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgZmkKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfS5zbyR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLW9zMiopCi0gIGxpYm5hbWVfc3BlYz0nJG5hbWUnCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbCAkbGlibmFtZS5hJwotICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotICA7OwotCi1vc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gIHZlcnNpb25fdHlwZT1vc2YKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLXNjbzMuMnY1KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1zb2xhcmlzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCi0gIDs7Ci0KLXN1bm9zNCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9LnNvJHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGZpCi0gIG5lZWRfdmVyc2lvbj15ZXMKLSAgOzsKLQotc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLSAgICBzbmkpCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1CbGFyZ2VkeW5zeW0nCi0gICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgICAgOzsKLSAgICBzaWVtZW5zKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIG1vdG9yb2xhKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvY2NzL2xpYicKLSAgICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotdXRzNCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1kZ3V4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotc3lzdjQqTVAqKQotICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCi0gICAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5zby4kdmVyc3VmZml4ICRsaWJuYW1lLnNvLiRtYWpvciAkbGlibmFtZS5zbycKLSAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUuc28uJG1ham9yJwotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGZpCi0gIDs7Ci0KLSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci1lc2FjCi1lY2hvICIkYWNfdCIiJGR5bmFtaWNfbGlua2VyIiAxPiY2Ci10ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi0jIFJlcG9ydCB0aGUgZmluYWwgY29uc2VxdWVuY2VzLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MDc0OiBjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQotZWNobyAiJGFjX3QiIiRjYW5fYnVpbGRfc2hhcmVkIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTA3ODogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLXRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubwotCi0jIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKLSMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4MyopCi0gIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgotICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKLSAgZmkKLSAgOzsKLQotYWl4NCopCi0gIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KLSAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICBmaQotICA7OwotZXNhYwotZWNobyAiJGFjX3QiIiRlbmFibGVfc2hhcmVkIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTEwMTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzIiA+JjUKLSMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCi1lY2hvICIkYWNfdCIiJGVuYWJsZV9zdGF0aWMiIDE+JjYKLQotaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KLSAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLWVsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKLSAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KLSAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5Ci0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKLWZpCi0KLXZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgotZmkKLQotaWYgdGVzdCAieCRlbmFibGVfZGxvcGVuIiAhPSB4eWVzOyB0aGVuCi0gIGVuYWJsZV9kbG9wZW49dW5rbm93bgotICBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93bgotICBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24KLWVsc2UKLSAgbHRfY3ZfZGxvcGVuPW5vCi0gIGx0X2N2X2Rsb3Blbl9saWJzPQotCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgYmVvcyopCi0gICAgbHRfY3ZfZGxvcGVuPSJsb2FkX2FkZF9vbiIKLSAgICBsdF9jdl9kbG9wZW5fbGlicz0KLSAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKLSAgICA7OwotCi0gIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICBsdF9jdl9kbG9wZW49IkxvYWRMaWJyYXJ5IgotICAgIGx0X2N2X2Rsb3Blbl9saWJzPQotICAgOzsKLQotICAqKQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaGxfbG9hZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTE0MjogY2hlY2tpbmcgZm9yIHNobF9sb2FkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3NobF9sb2FkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTE0NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBzaGxfbG9hZCgpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIHNobF9sb2FkKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfc2hsX2xvYWQpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3NobF9sb2FkKQotY2hva2UgbWUKLSNlbHNlCi1zaGxfbG9hZCgpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MTcwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX3NobF9sb2FkPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY19zaGxfbG9hZD1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJ3NobF9sb2FkYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNobF9sb2FkIGluIC1sZGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MTg4OiBjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQiID4mNQotYWNfbGliX3Zhcj1gZWNobyBkbGQnXydzaGxfbG9hZCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxkbGQgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTE5NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIHNobF9sb2FkKCk7Ci0KLWludCBtYWluKCkgewotc2hsX2xvYWQoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUyMDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiIGx0X2N2X2Rsb3Blbl9saWJzPSItZGxkIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbG9wZW4iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUyMjY6IGNoZWNraW5nIGZvciBkbG9wZW4iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfZGxvcGVuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTIzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBkbG9wZW4oKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBkbG9wZW4oKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl9kbG9wZW4pIHx8IGRlZmluZWQgKF9fc3R1Yl9fX2Rsb3BlbikKLWNob2tlIG1lCi0jZWxzZQotZGxvcGVuKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUyNTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfZGxvcGVuPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY19kbG9wZW49bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXydkbG9wZW5gXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MjcyOiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBkbCdfJ2Rsb3BlbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxkbCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MjgwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgZGxvcGVuKCk7Ci0KLWludCBtYWluKCkgewotZGxvcGVuKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MjkxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUzMTA6IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxzdmxkIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gc3ZsZCdfJ2Rsb3BlbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxzdmxkICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUzMTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBkbG9wZW4oKTsKLQotaW50IG1haW4oKSB7Ci1kbG9wZW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUzMjk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxzdmxkIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTM0ODogY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gZGxkJ18nZGxkX2xpbmsgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sZGxkICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUzNTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBkbGRfbGluaygpOwotCi1pbnQgbWFpbigpIHsKLWRsZF9saW5rKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MzY3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBsdF9jdl9kbG9wZW49ImRsZF9saW5rIiBsdF9jdl9kbG9wZW5fbGlicz0iLWRsZCIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgICAgCi1maQotCi0JICAgIAotZmkKLQotCSAgCi1maQotCi0JCi1maQotCi0gICAgICAKLWZpCi0KLSAgICA7OwotICBlc2FjCi0KLSAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgotICAgIGVuYWJsZV9kbG9wZW49eWVzCi0gIGVsc2UKLSAgICBlbmFibGVfZGxvcGVuPW5vCi0gIGZpCi0KLSAgY2FzZSAkbHRfY3ZfZGxvcGVuIGluCi0gIGRsb3BlbikKLSAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCi0gICAgICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllcyAmJiBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9ETEZDTl9IIgotCi0gICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLSAgICBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCi0KLSAgICBzYXZlX0xJQlM9IiRMSUJTIgotICAgIExJQlM9IiRsdF9jdl9kbG9wZW5fbGlicyAkTElCUyIKLQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NDIzOiBjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbHRfY3ZfZGxvcGVuX3NlbGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAJICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIGx0X2N2X2Rsb3Blbl9zZWxmPWNyb3NzCi1lbHNlCi0gICAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgotICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NDMzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmIEhBVkVfRExGQ05fSAotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBSVExEX0dMT0JBTAotIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAotI2Vsc2UKLSMgIGlmZGVmIERMX0dMT0JBTAotIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAotIyAgZWxzZQotIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQotICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLwotI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCi0jICBpZmRlZiBSVExEX0xBWlkKLSMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQotIyAgZWxzZQotIyAgICBpZmRlZiBETF9MQVpZCi0jICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKLSMgICAgZWxzZQotIyAgICAgIGlmZGVmIFJUTERfTk9XCi0jICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVwotIyAgICAgIGVsc2UKLSMgICAgICAgIGlmZGVmIERMX05PVwotIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKLSMgICAgICAgIGVsc2UKLSMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAotIyAgICAgICAgZW5kaWYKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOwotI2VuZGlmCi0KLXZvaWQgZm5vcmQoKSB7IGludCBpPTQyO30KLWludCBtYWluICgpCi17Ci0gIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOwotICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKLQotICBpZiAoc2VsZikKLSAgICB7Ci0gICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKLSAgICAgIGVsc2UgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7Ci0gICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KLSAgICB9Ci0KLSAgICBleGl0IChzdGF0dXMpOwotfQotRU9GCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTQ5NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCi0gICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgMj4vZGV2L251bGwKLSAgICBsdF9zdGF0dXM9JD8KLSAgICBjYXNlIHgkbHRfc3RhdHVzIGluCi0gICAgICB4JGx0X2Rsbm9fdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZj15ZXMgOzsKLSAgICAgIHgkbHRfZGxuZWVkX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzIDs7Ci0gICAgICB4JGx0X3Vua25vd258eCopIGx0X2N2X2Rsb3Blbl9zZWxmPW5vIDs7Ci0gICAgZXNhYwotICBlbHNlIDoKLSAgICAjIGNvbXBpbGF0aW9uIGZhaWxlZAotICAgIGx0X2N2X2Rsb3Blbl9zZWxmPW5vCi0gIGZpCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotCi0gICAgCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2Rsb3Blbl9zZWxmIiAxPiY2Ci0KLSAgICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3Blbl9zZWxmIiA9IHh5ZXM7IHRoZW4KLSAgICAgIExERkxBR1M9IiRMREZMQUdTICRsaW5rX3N0YXRpY19mbGFnIgotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU1MTc6IGNoZWNraW5nIHdoZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAJICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1jcm9zcwotZWxzZQotICAgIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKLSAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTUyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZiBIQVZFX0RMRkNOX0gKLSNpbmNsdWRlIDxkbGZjbi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgUlRMRF9HTE9CQUwKLSMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKLSNlbHNlCi0jICBpZmRlZiBETF9HTE9CQUwKLSMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKLSMgIGVsc2UKLSMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKLSAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KLSNpZm5kZWYgTFRfRExMQVpZX09SX05PVwotIyAgaWZkZWYgUlRMRF9MQVpZCi0jICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKLSMgIGVsc2UKLSMgICAgaWZkZWYgRExfTEFaWQotIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCi0jICAgIGVsc2UKLSMgICAgICBpZmRlZiBSVExEX05PVwotIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKLSMgICAgICBlbHNlCi0jICAgICAgICBpZmRlZiBETF9OT1cKLSMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCi0jICAgICAgICBlbHNlCi0jICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKLSMgICAgICAgIGVuZGlmCi0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KTsKLSNlbmRpZgotCi12b2lkIGZub3JkKCkgeyBpbnQgaT00Mjt9Ci1pbnQgbWFpbiAoKQotewotICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKLSAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247Ci0KLSAgaWYgKHNlbGYpCi0gICAgewotICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7Ci0gICAgICBlbHNlIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOwotICAgICAgLyogZGxjbG9zZSAoc2VsZik7ICovCi0gICAgfQotCi0gICAgZXhpdCAoc3RhdHVzKTsKLX0KLUVPRgotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU1ODg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAyPi9kZXYvbnVsbDsgdGhlbgotICAgICguL2NvbmZ0ZXN0OyBleGl0OyApIDI+L2Rldi9udWxsCi0gICAgbHRfc3RhdHVzPSQ/Ci0gICAgY2FzZSB4JGx0X3N0YXR1cyBpbgotICAgICAgeCRsdF9kbG5vX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcyA7OwotICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzIDs7Ci0gICAgICB4JGx0X3Vua25vd258eCopIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubyA7OwotICAgIGVzYWMKLSAgZWxzZSA6Ci0gICAgIyBjb21waWxhdGlvbiBmYWlsZWQKLSAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8KLSAgZmkKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi0KLSAgICAgIAotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMiIDE+JjYKLSAgICBmaQotCi0gICAgQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIgotICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCi0gICAgTElCUz0iJHNhdmVfTElCUyIKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGYgaW4KLSAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7Ci0gICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7Ci0gIGVzYWMKLQotICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgaW4KLSAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKLSAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7Ci0gIGVzYWMKLWZpCi0KLQotaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIGNhc2UgJGFyY2hpdmVfY21kcyBpbgotICAqJ34nKikKLSAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCi0gICAgOzsKLSAgJyRDQyAnKikKLSAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCi0gICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCi0gICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NjM3OiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQotICAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICRybSBjb25mdGVzdCoKLSAgICBlY2hvICdzdGF0aWMgaW50IGR1bW15OycgPiBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU2NDQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICAgIHNvbmFtZT1jb25mdGVzdAotICAgICAgbGliPWNvbmZ0ZXN0Ci0gICAgICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgICAgIGRlcGxpYnM9Ci0gICAgICB3bD0kbHRfY3ZfcHJvZ19jY193bAotICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKLSAgICAgIGxpbmtlcl9mbGFncz0tdgotICAgICAgdmVyc3RyaW5nPQotICAgICAgb3V0cHV0X29iamRpcj0uCi0gICAgICBsaWJuYW1lPWNvbmZ0ZXN0Ci0gICAgICBzYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRhbGxvd191bmRlZmluZWRfZmxhZwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Ci0gICAgICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU2NTc6IFwiJGFyY2hpdmVfY21kcyAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxXCIpIDE+JjU7IChldmFsICRhcmNoaXZlX2NtZHMgMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkgMj4mNTsgfQotICAgICAgdGhlbgotCWx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjPW5vCi0gICAgICBlbHNlCi0JbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGM9eWVzCi0gICAgICBmaQotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JHNhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLSAgICBlbHNlCi0gICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICBmaQotICAgICRybSBjb25mdGVzdCoKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjIiAxPiY2Ci0gICAgOzsKLSAgZXNhYwotZmkKLW5lZWRfbGM9JHtsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYy15ZXN9Ci0KLSMgVGhlIHNlY29uZCBjbGF1c2Ugc2hvdWxkIG9ubHkgZmlyZSB3aGVuIGJvb3RzdHJhcHBpbmcgdGhlCi0jIGxpYnRvb2wgZGlzdHJpYnV0aW9uLCBvdGhlcndpc2UgeW91IGZvcmdvdCB0byBzaGlwIGx0bWFpbi5zaAotIyB3aXRoIHlvdXIgcGFja2FnZSwgYW5kIHlvdSB3aWxsIGdldCBjb21wbGFpbnRzIHRoYXQgdGhlcmUgYXJlCi0jIG5vIHJ1bGVzIHRvIGdlbmVyYXRlIGx0bWFpbi5zaC4KLWlmIHRlc3QgLWYgIiRsdG1haW4iOyB0aGVuCi0gIDoKLWVsc2UKLSAgIyBJZiB0aGVyZSBpcyBubyBNYWtlZmlsZSB5ZXQsIHdlIHJlbHkgb24gYSBtYWtlIHJ1bGUgdG8gZXhlY3V0ZQotICAjIGBjb25maWcuc3RhdHVzIC0tcmVjaGVjaycgdG8gcmVydW4gdGhlc2UgdGVzdHMgYW5kIGNyZWF0ZSB0aGUKLSAgIyBsaWJ0b29sIHNjcmlwdCB0aGVuLgotICB0ZXN0IC1mIE1ha2VmaWxlICYmIG1ha2UgIiRsdG1haW4iCi1maQotCi1pZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgotICB0cmFwICIkcm0gXCIke29maWxlfVRcIjsgZXhpdCAxIiAxIDIgMTUKLSAgJHJtIC1mICIke29maWxlfVQiCi0KLSAgZWNobyBjcmVhdGluZyAkb2ZpbGUKLQotICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCi0gICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQotICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCi0gIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBTRUQgXAotICAgIEFSIEFSX0ZMQUdTIENDIExEIExOX1MgTk0gU0hFTEwgXAotICAgIHJlbG9hZF9mbGFnIHJlbG9hZF9jbWRzIHdsIFwKLSAgICBwaWNfZmxhZyBsaW5rX3N0YXRpY19mbGFnIG5vX2J1aWx0aW5fZmxhZyBleHBvcnRfZHluYW1pY19mbGFnX3NwZWMgXAotICAgIHRocmVhZF9zYWZlX2ZsYWdfc3BlYyB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyBsaWJuYW1lX3NwZWMgXAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBcCi0gICAgUkFOTElCIG9sZF9hcmNoaXZlX2NtZHMgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyBvbGRfcG9zdGluc3RhbGxfY21kcyBcCi0gICAgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBhcmNoaXZlX2NtZHMgYXJjaGl2ZV9leHBzeW1fY21kcyBwb3N0aW5zdGFsbF9jbWRzIFwKLSAgICBwb3N0dW5pbnN0YWxsX2NtZHMgZXh0cmFjdF9leHBzeW1zX2NtZHMgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMgXAotICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBleHBvcnRfc3ltYm9sc19jbWRzIFwKLSAgICBkZXBsaWJzX2NoZWNrX21ldGhvZCBhbGxvd191bmRlZmluZWRfZmxhZyBub191bmRlZmluZWRfZmxhZyBcCi0gICAgZmluaXNoX2NtZHMgZmluaXNoX2V2YWwgZ2xvYmFsX3N5bWJvbF9waXBlIGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wgXAotICAgIGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciAgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCi0gICAgY29tcGlsZXJfY19vIGNvbXBpbGVyX29fbG8gbmVlZF9sb2NrcyBleGNsdWRlX2V4cHN5bXMgaW5jbHVkZV9leHBzeW1zOyBkbwotCi0gICAgY2FzZSAkdmFyIGluCi0gICAgcmVsb2FkX2NtZHMgfCBvbGRfYXJjaGl2ZV9jbWRzIHwgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyB8IFwKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kcyB8IGFyY2hpdmVfY21kcyB8IGFyY2hpdmVfZXhwc3ltX2NtZHMgfCBcCi0gICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyB8IFwKLSAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIGZpbmlzaF9jbWRzIHwgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMpCi0gICAgICAjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCi0gICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkZG91YmxlX3F1b3RlX3N1YnN0XCIgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiIC1lIFwiXCRkZWxheV92YXJpYWJsZV9zdWJzdFwiXGBcXFwiIgotICAgICAgOzsKLSAgICAqKQotICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGBcXFwiIgotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotICBjYXQgPDxfX0VPRl9fID4gIiR7b2ZpbGV9VCIKLSMhICRTSEVMTAotCi0jIGAkZWNobyAiJG9maWxlIiB8IHNlZCAncyVeLiovJSUnYCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUCkKLSMgTk9URTogQ2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3Q6IGxvb2sgYXQgbHRtYWluLnNoLgotIwotIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgT3JpZ2luYWxseSBieSBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIEEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0LgotU0VEPSRsdF9TRUQKLQotIyBTZWQgdGhhdCBoZWxwcyB1cyBhdm9pZCBhY2NpZGVudGFsbHkgdHJpZ2dlcmluZyBlY2hvKDEpIG9wdGlvbnMgbGlrZSAtbi4KLVhzZWQ9IiR7U0VEfSAtZSBzL15YLy8iCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi1pZiB0ZXN0ICJYXCR7Q0RQQVRIK3NldH0iID0gWHNldDsgdGhlbiBDRFBBVEg9OjsgZXhwb3J0IENEUEFUSDsgZmkKLQotIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUcKLQotIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotCi0jIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCi1TSEVMTD0kbHRfU0hFTEwKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KLWJ1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCi0KLSMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbmVlZF9sYz0kbmVlZF9sYwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KLWZhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAotCi0jIFRoZSBob3N0IHN5c3RlbS4KLWhvc3RfYWxpYXM9JGhvc3RfYWxpYXMKLWhvc3Q9JGhvc3QKLQotIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi1lY2hvPSRsdF9lY2hvCi0KLSMgVGhlIGFyY2hpdmVyLgotQVI9JGx0X0FSCi1BUl9GTEFHUz0kbHRfQVJfRkxBR1MKLQotIyBUaGUgZGVmYXVsdCBDIGNvbXBpbGVyLgotQ0M9JGx0X0NDCi0KLSMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KLXdpdGhfZ2NjPSRHQ0MKLQotIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgotTEQ9JGx0X0xECi0KLSMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KLUxOX1M9JGx0X0xOX1MKLQotIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCi1OTT0kbHRfTk0KLQotIyBBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbQotU1RSSVA9JFNUUklQCi0KLSMgVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyAiZmlsZSIKLU1BR0lDX0NNRD0kTUFHSUNfQ01ECi0KLSMgVXNlZCBvbiBjeWd3aW46IERMTCBjcmVhdGlvbiBwcm9ncmFtLgotRExMVE9PTD0iJERMTFRPT0wiCi0KLSMgVXNlZCBvbiBjeWd3aW46IG9iamVjdCBkdW1wZXIuCi1PQkpEVU1QPSIkT0JKRFVNUCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogYXNzZW1ibGVyLgotQVM9IiRBUyIKLQotIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCi1vYmpkaXI9JG9iamRpcgotCi0jIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCi1yZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWcKLXJlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kcwotCi0jIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCi13bD0kbHRfd2wKLQotIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCi1vYmpleHQ9IiRhY19vYmpleHQiCi0KLSMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgotbGliZXh0PSIkbGliZXh0IgotCi0jIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KLWV4ZWV4dD0iJGV4ZWV4dCIKLQotIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCi1waWNfZmxhZz0kbHRfcGljX2ZsYWcKLXBpY19tb2RlPSRwaWNfbW9kZQotCi0jIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KLWNvbXBpbGVyX2Nfbz0kbHRfY29tcGlsZXJfY19vCi0KLSMgQ2FuIHdlIHdyaXRlIGRpcmVjdGx5IHRvIGEgLmxvID8KLWNvbXBpbGVyX29fbG89JGx0X2NvbXBpbGVyX29fbG8KLQotIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbiA/Ci1uZWVkX2xvY2tzPSRsdF9uZWVkX2xvY2tzCi0KLSMgRG8gd2UgbmVlZCB0aGUgbGliIHByZWZpeCBmb3IgbW9kdWxlcz8KLW5lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4Ci0KLSMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KLW5lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCi0KLSMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgotZGxvcGVuX3N1cHBvcnQ9JGVuYWJsZV9kbG9wZW4KLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCi0KLSMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KLWxpbmtfc3RhdGljX2ZsYWc9JGx0X2xpbmtfc3RhdGljX2ZsYWcKLQotIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgotbm9fYnVpbHRpbl9mbGFnPSRsdF9ub19idWlsdGluX2ZsYWcKLQotIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9leHBvcnRfZHluYW1pY19mbGFnX3NwZWMKLQotIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXMuCi13aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0kbHRfd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMKLQotIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCi10aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X3RocmVhZF9zYWZlX2ZsYWdfc3BlYwotCi0jIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgotdmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKLQotIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KLWxpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCi0KLSMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KLSMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KLWxpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCi0KLSMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCi1zb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgotUkFOTElCPSRsdF9SQU5MSUIKLW9sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHMKLW9sZF9wb3N0aW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdGluc3RhbGxfY21kcwotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3R1bmluc3RhbGxfY21kcwotCi0jIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzCi0KLSMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgotYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHMKLWFyY2hpdmVfZXhwc3ltX2NtZHM9JGx0X2FyY2hpdmVfZXhwc3ltX2NtZHMKLXBvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKLXBvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgotb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKLXN0cmlwbGliPSRsdF9zdHJpcGxpYgotCi0jIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgotZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2RlcGxpYnNfY2hlY2tfbWV0aG9kCi0KLSMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSBmaWxlX21hZ2ljLgotZmlsZV9tYWdpY19jbWQ9JGx0X2ZpbGVfbWFnaWNfY21kCi0KLSMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCi1hbGxvd191bmRlZmluZWRfZmxhZz0kbHRfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLQotIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgotbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgotZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KLWZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAotCi0jIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCi1nbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2dsb2JhbF9zeW1ib2xfcGlwZQotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JGx0X2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKLWdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCi1ydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgotc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgotCi0jIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCi0KLSMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCi1oYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbgotCi0jIFdoZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXMuCi1oYXJkY29kZV9pbnRvX2xpYnM9JGhhcmRjb2RlX2ludG9fbGlicwotCi0jIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KLSMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMKLQotIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FLnNvIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0Ci0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KLSMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyCi0KLSMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCi0jIHJlc3RvcmVkIGF0IHJlbGluayB0aW1lLgotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayIKLQotIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCi1saW5rX2FsbF9kZXBsaWJzPSRsaW5rX2FsbF9kZXBsaWJzCi0KLSMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotCi0jIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKLQotIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgotZml4X3NyY2ZpbGVfcGF0aD0iJGZpeF9zcmNmaWxlX3BhdGgiCi0KLSMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KLWFsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzCi0KLSMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KLWV4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHMKLQotIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCi0KLSMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KLWV4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zCi0KLSMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgotaW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXMKLQotIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHCi0KLV9fRU9GX18KLQotICBjYXNlICRob3N0X29zIGluCi0gIGFpeDMqKQotICAgIGNhdCA8PFxFT0YgPj4gIiR7b2ZpbGV9VCIKLQotIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCi0jIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLWlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgotICBDT0xMRUNUX05BTUVTPQotICBleHBvcnQgQ09MTEVDVF9OQU1FUwotZmkKLUVPRgotICAgIDs7Ci0gIGVzYWMKLQotICBjYXNlICRob3N0X29zIGluCi0gIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IG9zMiopCi0gICAgY2F0IDw8J0VPRicgPj4gIiR7b2ZpbGV9VCIKLSAgICAgICMgVGhpcyBpcyBhIHNvdXJjZSBwcm9ncmFtIHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgZGxscyBvbiBXaW5kb3dzCi0gICAgICAjIERvbid0IHJlbW92ZSBub3IgbW9kaWZ5IHRoZSBzdGFydGluZyBhbmQgY2xvc2luZyBjb21tZW50cwotIyAvKiBsdGRsbC5jIHN0YXJ0cyBoZXJlICovCi0jICNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotIyAjaW5jbHVkZSA8d2luZG93cy5oPgotIyAjdW5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgotIyAjaW5jbHVkZSA8c3RkaW8uaD4KLSMKLSMgI2lmbmRlZiBfX0NZR1dJTl9fCi0jICMgIGlmZGVmIF9fQ1lHV0lOMzJfXwotIyAjICAgIGRlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXwotIyAjICBlbmRpZgotIyAjZW5kaWYKLSMKLSMgI2lmZGVmIF9fY3BsdXNwbHVzCi0jIGV4dGVybiAiQyIgewotIyAjZW5kaWYKLSMgQk9PTCBBUElFTlRSWSBEbGxNYWluIChISU5TVEFOQ0UgaEluc3QsIERXT1JEIHJlYXNvbiwgTFBWT0lEIHJlc2VydmVkKTsKLSMgI2lmZGVmIF9fY3BsdXNwbHVzCi0jIH0KLSMgI2VuZGlmCi0jCi0jICNpZmRlZiBfX0NZR1dJTl9fCi0jICNpbmNsdWRlIDxjeWd3aW4vY3lnd2luX2RsbC5oPgotIyBERUNMQVJFX0NZR1dJTl9ETEwoIERsbE1haW4gKTsKLSMgI2VuZGlmCi0jIEhJTlNUQU5DRSBfX2hEbGxJbnN0YW5jZV9iYXNlOwotIwotIyBCT09MIEFQSUVOVFJZCi0jIERsbE1haW4gKEhJTlNUQU5DRSBoSW5zdCwgRFdPUkQgcmVhc29uLCBMUFZPSUQgcmVzZXJ2ZWQpCi0jIHsKLSMgICBfX2hEbGxJbnN0YW5jZV9iYXNlID0gaEluc3Q7Ci0jICAgcmV0dXJuIFRSVUU7Ci0jIH0KLSMgLyogbHRkbGwuYyBlbmRzIGhlcmUgKi8KLQkjIFRoaXMgaXMgYSBzb3VyY2UgcHJvZ3JhbSB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIGltcG9ydCBsaWJyYXJpZXMKLQkjIG9uIFdpbmRvd3MgZm9yIGRsbHMgd2hpY2ggbGFjayB0aGVtLiBEb24ndCByZW1vdmUgbm9yIG1vZGlmeSB0aGUKLQkjIHN0YXJ0aW5nIGFuZCBjbG9zaW5nIGNvbW1lbnRzCi0jIC8qIGltcGdlbi5jIHN0YXJ0cyBoZXJlICovCi0jIC8qICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgbGlidG9vbC4KLSMKLSMgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIyAgKi8KLSMKLSMgI2luY2x1ZGUgPHN0ZGlvLmg+CQkvKiBmb3IgcHJpbnRmKCkgKi8KLSMgI2luY2x1ZGUgPHVuaXN0ZC5oPgkJLyogZm9yIG9wZW4oKSwgbHNlZWsoKSwgcmVhZCgpICovCi0jICNpbmNsdWRlIDxmY250bC5oPgkJLyogZm9yIE9fUkRPTkxZLCBPX0JJTkFSWSAqLwotIyAjaW5jbHVkZSA8c3RyaW5nLmg+CQkvKiBmb3Igc3RyZHVwKCkgKi8KLSMKLSMgLyogT19CSU5BUlkgaXNuJ3QgcmVxdWlyZWQgKG9yIGV2ZW4gZGVmaW5lZCBzb21ldGltZXMpIHVuZGVyIFVuaXggKi8KLSMgI2lmbmRlZiBPX0JJTkFSWQotIyAjZGVmaW5lIE9fQklOQVJZIDAKLSMgI2VuZGlmCi0jCi0jIHN0YXRpYyB1bnNpZ25lZCBpbnQKLSMgcGVfZ2V0MTYgKGZkLCBvZmZzZXQpCi0jICAgICAgaW50IGZkOwotIyAgICAgIGludCBvZmZzZXQ7Ci0jIHsKLSMgICB1bnNpZ25lZCBjaGFyIGJbMl07Ci0jICAgbHNlZWsgKGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKLSMgICByZWFkIChmZCwgYiwgMik7Ci0jICAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCk7Ci0jIH0KLSMKLSMgc3RhdGljIHVuc2lnbmVkIGludAotIyBwZV9nZXQzMiAoZmQsIG9mZnNldCkKLSMgICAgIGludCBmZDsKLSMgICAgIGludCBvZmZzZXQ7Ci0jIHsKLSMgICB1bnNpZ25lZCBjaGFyIGJbNF07Ci0jICAgbHNlZWsgKGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKLSMgICByZWFkIChmZCwgYiwgNCk7Ci0jICAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCkgKyAoYlsyXTw8MTYpICsgKGJbM108PDI0KTsKLSMgfQotIwotIyBzdGF0aWMgdW5zaWduZWQgaW50Ci0jIHBlX2FzMzIgKHB0cikKLSMgICAgICB2b2lkICpwdHI7Ci0jIHsKLSMgICB1bnNpZ25lZCBjaGFyICpiID0gcHRyOwotIyAgIHJldHVybiBiWzBdICsgKGJbMV08PDgpICsgKGJbMl08PDE2KSArIChiWzNdPDwyNCk7Ci0jIH0KLSMKLSMgaW50Ci0jIG1haW4gKGFyZ2MsIGFyZ3YpCi0jICAgICBpbnQgYXJnYzsKLSMgICAgIGNoYXIgKmFyZ3ZbXTsKLSMgewotIyAgICAgaW50IGRsbDsKLSMgICAgIHVuc2lnbmVkIGxvbmcgcGVfaGVhZGVyX29mZnNldCwgb3B0aGRyX29mcywgbnVtX2VudHJpZXMsIGk7Ci0jICAgICB1bnNpZ25lZCBsb25nIGV4cG9ydF9ydmEsIGV4cG9ydF9zaXplLCBuc2VjdGlvbnMsIHNlY3B0ciwgZXhwcHRyOwotIyAgICAgdW5zaWduZWQgbG9uZyBuYW1lX3J2YXMsIG5leHA7Ci0jICAgICB1bnNpZ25lZCBjaGFyICpleHBkYXRhLCAqZXJ2YTsKLSMgICAgIGNoYXIgKmZpbGVuYW1lLCAqZGxsX25hbWU7Ci0jCi0jICAgICBmaWxlbmFtZSA9IGFyZ3ZbMV07Ci0jCi0jICAgICBkbGwgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWXxPX0JJTkFSWSk7Ci0jICAgICBpZiAoZGxsIDwgMSkKLSMgCXJldHVybiAxOwotIwotIyAgICAgZGxsX25hbWUgPSBmaWxlbmFtZTsKLSMKLSMgICAgIGZvciAoaT0wOyBmaWxlbmFtZVtpXTsgaSsrKQotIyAJaWYgKGZpbGVuYW1lW2ldID09ICcvJyB8fCBmaWxlbmFtZVtpXSA9PSAnXFwnICB8fCBmaWxlbmFtZVtpXSA9PSAnOicpCi0jIAkgICAgZGxsX25hbWUgPSBmaWxlbmFtZSArIGkgKzE7Ci0jCi0jICAgICBwZV9oZWFkZXJfb2Zmc2V0ID0gcGVfZ2V0MzIgKGRsbCwgMHgzYyk7Ci0jICAgICBvcHRoZHJfb2ZzID0gcGVfaGVhZGVyX29mZnNldCArIDQgKyAyMDsKLSMgICAgIG51bV9lbnRyaWVzID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDkyKTsKLSMKLSMgICAgIGlmIChudW1fZW50cmllcyA8IDEpIC8qIG5vIGV4cG9ydHMgKi8KLSMgCXJldHVybiAxOwotIwotIyAgICAgZXhwb3J0X3J2YSA9IHBlX2dldDMyIChkbGwsIG9wdGhkcl9vZnMgKyA5Nik7Ci0jICAgICBleHBvcnRfc2l6ZSA9IHBlX2dldDMyIChkbGwsIG9wdGhkcl9vZnMgKyAxMDApOwotIyAgICAgbnNlY3Rpb25zID0gcGVfZ2V0MTYgKGRsbCwgcGVfaGVhZGVyX29mZnNldCArIDQgKzIpOwotIyAgICAgc2VjcHRyID0gKHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsgMjAgKwotIyAJICAgICAgcGVfZ2V0MTYgKGRsbCwgcGVfaGVhZGVyX29mZnNldCArIDQgKyAxNikpOwotIwotIyAgICAgZXhwcHRyID0gMDsKLSMgICAgIGZvciAoaSA9IDA7IGkgPCBuc2VjdGlvbnM7IGkrKykKLSMgICAgIHsKLSMgCWNoYXIgc25hbWVbOF07Ci0jIAl1bnNpZ25lZCBsb25nIHNlY3B0cjEgPSBzZWNwdHIgKyA0MCAqIGk7Ci0jIAl1bnNpZ25lZCBsb25nIHZhZGRyID0gcGVfZ2V0MzIgKGRsbCwgc2VjcHRyMSArIDEyKTsKLSMgCXVuc2lnbmVkIGxvbmcgdnNpemUgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMTYpOwotIyAJdW5zaWduZWQgbG9uZyBmcHRyID0gcGVfZ2V0MzIgKGRsbCwgc2VjcHRyMSArIDIwKTsKLSMgCWxzZWVrKGRsbCwgc2VjcHRyMSwgU0VFS19TRVQpOwotIyAJcmVhZChkbGwsIHNuYW1lLCA4KTsKLSMgCWlmICh2YWRkciA8PSBleHBvcnRfcnZhICYmIHZhZGRyK3ZzaXplID4gZXhwb3J0X3J2YSkKLSMgCXsKLSMgCSAgICBleHBwdHIgPSBmcHRyICsgKGV4cG9ydF9ydmEgLSB2YWRkcik7Ci0jIAkgICAgaWYgKGV4cG9ydF9ydmEgKyBleHBvcnRfc2l6ZSA+IHZhZGRyICsgdnNpemUpCi0jIAkJZXhwb3J0X3NpemUgPSB2c2l6ZSAtIChleHBvcnRfcnZhIC0gdmFkZHIpOwotIyAJICAgIGJyZWFrOwotIyAJfQotIyAgICAgfQotIwotIyAgICAgZXhwZGF0YSA9ICh1bnNpZ25lZCBjaGFyKiltYWxsb2MoZXhwb3J0X3NpemUpOwotIyAgICAgbHNlZWsgKGRsbCwgZXhwcHRyLCBTRUVLX1NFVCk7Ci0jICAgICByZWFkIChkbGwsIGV4cGRhdGEsIGV4cG9ydF9zaXplKTsKLSMgICAgIGVydmEgPSBleHBkYXRhIC0gZXhwb3J0X3J2YTsKLSMKLSMgICAgIG5leHAgPSBwZV9hczMyIChleHBkYXRhKzI0KTsKLSMgICAgIG5hbWVfcnZhcyA9IHBlX2FzMzIgKGV4cGRhdGErMzIpOwotIwotIyAgICAgcHJpbnRmICgiRVhQT1JUU1xuIik7Ci0jICAgICBmb3IgKGkgPSAwOyBpPG5leHA7IGkrKykKLSMgICAgIHsKLSMgCXVuc2lnbmVkIGxvbmcgbmFtZV9ydmEgPSBwZV9hczMyIChlcnZhK25hbWVfcnZhcytpKjQpOwotIyAJcHJpbnRmICgiXHQlcyBAICVsZCA7XG4iLCBlcnZhK25hbWVfcnZhLCAxKyBpKTsKLSMgICAgIH0KLSMKLSMgICAgIHJldHVybiAwOwotIyB9Ci0jIC8qIGltcGdlbi5jIGVuZHMgaGVyZSAqLwotCi1FT0YKLSAgICA7OwotICBlc2FjCi0KLSAgIyBXZSB1c2Ugc2VkIGluc3RlYWQgb2YgY2F0IGJlY2F1c2UgYmFzaCBvbiBESkdQUCBnZXRzIGNvbmZ1c2VkIGlmCi0gICMgaWYgZmluZHMgbWl4ZWQgQ1IvTEYgYW5kIExGLW9ubHkgbGluZXMuICBTaW5jZSBzZWQgb3BlcmF0ZXMgaW4KLSAgIyB0ZXh0IG1vZGUsIGl0IHByb3Blcmx5IGNvbnZlcnRzIGxpbmVzIHRvIENSL0xGLiAgVGhpcyBiYXNoIHByb2JsZW0KLSAgIyBpcyByZXBvcnRlZGx5IGZpeGVkLCBidXQgd2h5IG5vdCBydW4gb24gb2xkIHZlcnNpb25zIHRvbz8KLSAgc2VkICckcScgIiRsdG1haW4iID4+ICIke29maWxlfVQiIHx8IChybSAtZiAiJHtvZmlsZX1UIjsgZXhpdCAxKQotCi0gIG12IC1mICIke29maWxlfVQiICIkb2ZpbGUiIHx8IFwKLSAgICAocm0gLWYgIiRvZmlsZSIgJiYgY3AgIiR7b2ZpbGV9VCIgIiRvZmlsZSIgJiYgcm0gLWYgIiR7b2ZpbGV9VCIpCi0gIGNobW9kICt4ICIkb2ZpbGUiCi1maQotCi0KLQotCi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi0KLSMgUHJldmVudCBtdWx0aXBsZSBleHBhbnNpb24KLQotCi1maQotIyBpZiBsaWJ0b29sID49IDEuNQotVEFHQ0M9Ci0KLQotIyBTZWxlY3QgbWVtb3J5IG1hbmFnZXIgZGVwZW5kaW5nIG9uIHVzZXIgaW5wdXQuCi0jIElmIG5vICItZW5hYmxlLW1heG1lbSIsIHVzZSBqbWVtbm9icwotTUVNT1JZTUdSPSdqbWVtbm9icy4kKE8pJwotTUFYTUVNPSJubyIKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYXhtZW0gb3IgLS1kaXNhYmxlLW1heG1lbSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9tYXhtZW0rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX21heG1lbSIKLSAgTUFYTUVNPSIkZW5hYmxldmFsIgotZmkKLQotIyBzdXBwb3J0IC0td2l0aC1tYXhtZW0gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggSUpHIFY1LgotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1tYXhtZW0gb3IgLS13aXRob3V0LW1heG1lbSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfbWF4bWVtK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX21heG1lbSIKLSAgTUFYTUVNPSIkd2l0aHZhbCIKLWZpCi0KLWlmIHRlc3QgIngkTUFYTUVNIiA9IHh5ZXM7IHRoZW4KLSAgTUFYTUVNPTEKLWZpCi1pZiB0ZXN0ICJ4JE1BWE1FTSIgIT0geG5vOyB0aGVuCi0gIGlmIHRlc3QgLW4gImBlY2hvICRNQVhNRU0gfCBzZWQgJ3MvWzAtOV0vL2cnYCI7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vbi1udW1lcmljIGFyZ3VtZW50IHRvIC0tZW5hYmxlLW1heG1lbSIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIERFRkFVTFRNQVhNRU09YGV4cHIgJE1BWE1FTSBcKiAxMDQ4NTc2YAotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgREVGQVVMVF9NQVhfTUVNICR7REVGQVVMVE1BWE1FTX0KLUVPRgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJ3RtcGZpbGUoKSciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYyNzc6IGNoZWNraW5nIGZvciAndG1wZmlsZSgpJyIgPiY1Ci1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2Mjc5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotaW50IG1haW4oKSB7Ci0gRklMRSAqIHRmaWxlID0gdG1wZmlsZSgpOyAKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2Mjg2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1NRU1PUllNR1I9J2ptZW1hbnNpLiQoTyknCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotTUVNT1JZTUdSPSdqbWVtbmFtZS4kKE8pJwotY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfU0lHTkFMX0NBVENIRVIgCi1FT0YKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICdta3RlbXAoKSciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYzMDE6IGNoZWNraW5nIGZvciAnbWt0ZW1wKCknIiA+JjUKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDYzMDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLSBjaGFyIGZuYW1lWzgwXTsgbWt0ZW1wKGZuYW1lKTsgCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjMxMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBOT19NS1RFTVAgCi1FT0YKLQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRvIHNlZSBpZiB0aGUgaG9zdCBjcHUgdHlwZSBpcyBpMzg2IG9yIGNvbXBhdGlibGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYzMzE6IGNoZWNraW5nIHRvIHNlZSBpZiB0aGUgaG9zdCBjcHUgdHlwZSBpcyBpMzg2IG9yIGNvbXBhdGlibGUiID4mNQotY2FzZSAiJGhvc3RfY3B1IiBpbgotICBpKjg2IHwgeDg2IHwgaWEzMikKLSAgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIDs7Ci0gIHg4Nl82NCB8IGFtZDY0IHwgYWE2NCkKLSAgICBlY2hvICIkYWNfdCIibm8gKHg4Nl82NCkiIDE+JjYKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IEN1cnJlbnRseSwgdGhpcyB2ZXJzaW9uIG9mIEpQRUcgbGlicmFyeSBjYW5ub3QgYmUgY29tcGlsZWQgYXMgNjQtYml0IGNvZGUuIHNvcnJ5LiIgMT4mMjsgZXhpdCAxOyB9Ci0gIDs7Ci0gICopCi0gICAgZWNobyAiJGFjX3QiIm5vICgiJGhvc3RfY3B1IikiIDE+JjYKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFRoaXMgdmVyc2lvbiBvZiBKUEVHIGxpYnJhcnkgaXMgZm9yIGkzODYgb3IgY29tcGF0aWJsZSBwcm9jZXNzb3JzIG9ubHkuIiAxPiYyOyBleGl0IDE7IH0KLSAgOzsKLWVzYWMKLQotaWYgdGVzdCAteiAiJE5BRkxBR1MiIDsgdGhlbgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igb2JqZWN0IGZpbGUgZm9ybWF0IG9mIGhvc3Qgc3lzdGVtIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MzQ4OiBjaGVja2luZyBmb3Igb2JqZWN0IGZpbGUgZm9ybWF0IG9mIGhvc3Qgc3lzdGVtIiA+JjUKLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgaW50ZXJpeCopCi0gICAgICBvYmpmbXQ9J1dpbjMyLUNPRkYnCi0gICAgOzsKLSAgICBtc2Rvc2RqZ3BwKiB8IGdvMzIqKQotICAgICAgb2JqZm10PSdDT0ZGJwotICAgIDs7Ci0gICAgb3MyLWVteCopCQkJIyBub3QgdGVzdGVkCi0gICAgICBvYmpmbXQ9J01TT01GJwkJIyBvYmoKLSAgICA7OwotICAgIGxpbnV4KmNvZmYqIHwgbGludXgqb2xkbGQqKQotICAgICAgb2JqZm10PSdDT0ZGJwkJIyA/Pz8KLSAgICA7OwotICAgIGxpbnV4KmFvdXQqKQotICAgICAgb2JqZm10PSdhLm91dCcKLSAgICA7OwotICAgIGxpbnV4KikKLSAgICAgIG9iamZtdD0nRUxGJwotICAgIDs7Ci0gICAgZnJlZWJzZCogfCBuZXRic2QqIHwgb3BlbmJzZCopCi0gICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgICBvYmpmbXQ9J0JTRC1hLm91dCcKLSAgICAgIGVsc2UKLSAgICAgICAgb2JqZm10PSdFTEYnCi0gICAgICBmaQotICAgIDs7Ci0gICAgc29sYXJpcyogfCBzdW5vcyogfCBzeXN2KiB8IHNjbyopCi0gICAgICBvYmpmbXQ9J0VMRicKLSAgICA7OwotICAgIGRhcndpbiogfCByaGFwc29keSogfCBuZXh0c3RlcCogfCBvcGVuc3RlcCogfCBtYWNvcyopCi0gICAgICBvYmpmbXQ9J01hY2gtTycKLSAgICA7OwotICAgICopCi0gICAgICBvYmpmbXQ9J0VMRiA/JwotICAgIDs7Ci0gIGVzYWMKLSAgZWNobyAiJGFjX3QiIiRvYmpmbXQiIDE+JjYKLSAgaWYgdGVzdCAiJG9iamZtdCIgPSAnRUxGID8nOyB0aGVuCi0gICAgb2JqZm10PSdFTEYnCi0gICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiB1bmV4cGVjdGVkIGhvc3Qgc3lzdGVtLiBhc3N1bWVkIHRoYXQgdGhlIGZvcm1hdCBpcyAkb2JqZm10LiIgMT4mMgotICBmaQotZWxzZQotICBvYmpmbXQ9JycKLWZpCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2JqZWN0IGZpbGUgZm9ybWF0IHNwZWNpZmllciAoTkFGTEFHUykgIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2Mzk0OiBjaGVja2luZyBmb3Igb2JqZWN0IGZpbGUgZm9ybWF0IHNwZWNpZmllciAoTkFGTEFHUykgIiA+JjUKLWNhc2UgIiRvYmpmbXQiIGluCi0gIE1TT01GKSAgICAgIE5BRkxBR1M9Jy1mb2JqIC1ET0JKMzInOzsKLSAgV2luMzItQ09GRikgTkFGTEFHUz0nLWZ3aW4zMiAtRFdJTjMyJzs7Ci0gIENPRkYpICAgICAgIE5BRkxBR1M9Jy1mY29mZiAtRENPRkYnOzsKLSAgYS5vdXQpICAgICAgTkFGTEFHUz0nLWZhb3V0IC1EQU9VVCc7OwotICBCU0QtYS5vdXQpICBOQUZMQUdTPSctZmFvdXRiIC1EQU9VVCc7OwotICBFTEYpICAgICAgICBOQUZMQUdTPSctZmVsZiAtREVMRic7OwotICBSREYpICAgICAgICBOQUZMQUdTPSctZnJkZiAtRFJERic7OwotICBNYWNoLU8pICAgICBOQUZMQUdTPSctZm1hY2hvIC1ETUFDSE8nOzsKLWVzYWMKLWVjaG8gIiRhY190IiIkTkFGTEFHUyIgMT4mNgotCi0KLQotZm9yIGFjX3Byb2cgaW4gbmFzbSBuYXNtdwotZG8KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY0MTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19OQVNNJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJE5BU00iOyB0aGVuCi0gIGFjX2N2X3Byb2dfTkFTTT0iJE5BU00iICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX05BU009IiRhY19wcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1OQVNNPSIkYWNfY3ZfcHJvZ19OQVNNIgotaWYgdGVzdCAtbiAiJE5BU00iOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTkFTTSIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLXRlc3QgLW4gIiROQVNNIiAmJiBicmVhawotZG9uZQotCi10ZXN0IC16ICIkTkFTTSIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBuYXNtIChOZXR3aWRlIEFzc2VtYmxlcikgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWlmIGVjaG8gIiROQVNNIiB8IGdyZXAgeWFzbSA+IC9kZXYvbnVsbDsgdGhlbgotICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IERPTidUIFVTRSBZQVNNISBDVVJSRU5UIFZFUlNJT04gKFIwLjQuMCkgSVMgQlVHR1khIiAxPiYyCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBhc3NlbWJsZXIgKCROQVNNICROQUZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjQ0OTogY2hlY2tpbmcgd2hldGhlciB0aGUgYXNzZW1ibGVyICgkTkFTTSAkTkFGTEFHUykgd29ya3MiID4mNQotY2F0ID4gY29uZnRlc3QuYXNtIDw8RU9GCi0lbGluZSA2NDUxICJjb25maWd1cmUiCi0gICAgICAgIHNlY3Rpb24gLnRleHQKLSAgICAgICAgYml0cyAgICAzMgotICAgICAgICBnbG9iYWwgIF9tYWluLG1haW4KLV9tYWluOgotbWFpbjogICB4b3IgICAgIGVheCxlYXgKLSAgICAgICAgcmV0Ci1FT0YKLXRyeV9uYXNtPSckTkFTTSAkTkFGTEFHUyAtbyBjb25mdGVzdC5vIGNvbmZ0ZXN0LmFzbScKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjQ2MDogXCIkdHJ5X25hc21cIikgMT4mNTsgKGV2YWwgJHRyeV9uYXNtKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QubzsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC5hc20gPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogYXNzZW1ibGVyIGNhbm5vdCBjcmVhdGUgb2JqZWN0IGZpbGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgbGlua2VyIGFjY2VwdHMgYXNzZW1ibGVyIG91dHB1dCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjQ3MDogY2hlY2tpbmcgd2hldGhlciB0aGUgbGlua2VyIGFjY2VwdHMgYXNzZW1ibGVyIG91dHB1dCIgPiY1Ci10cnlfbmFzbT0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJExERkxBR1MgY29uZnRlc3QubyAkTElCUyAxPiY1JwotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NDcyOiBcIiR0cnlfbmFzbVwiKSAxPiY1OyAoZXZhbCAkdHJ5X25hc20pIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjb25maWd1cmF0aW9uIHByb2JsZW06IG1heWJlIG9iamVjdCBmaWxlIGZvcm1hdCBtaXNtYXRjaC4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgYXNzZW1ibGVyIHN1cHBvcnRzIGxpbmUgY29udGludWF0aW9uIGNoYXJhY3RlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjQ4MjogY2hlY2tpbmcgd2hldGhlciB0aGUgYXNzZW1ibGVyIHN1cHBvcnRzIGxpbmUgY29udGludWF0aW9uIGNoYXJhY3RlciIgPiY1Ci1jYXQgPiBjb25mdGVzdC5hc20gPDxcRU9GCi0lbGluZSA2NDg0ICJjb25maWd1cmUiCi07IFRoZSBsaW5lIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXIgJ1wnCi07IHdhcyBpbnRyb2R1Y2VkIGluIG5hc20gMC45OC4yNS4KLSAgICAgICAgc2VjdGlvbiAudGV4dAotICAgICAgICBiaXRzICAgIDMyCi0gICAgICAgIGdsb2JhbCAgX3plcm8KLV96ZXJvOiAgeG9yICAgICBcCi0gICAgICAgICAgICAgICAgZWF4LGVheAotICAgICAgICByZXQKLUVPRgotdHJ5X25hc209JyROQVNNICROQUZMQUdTIC1vIGNvbmZ0ZXN0Lm8gY29uZnRlc3QuYXNtJwotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NDk1OiBcIiR0cnlfbmFzbVwiKSAxPiY1OyAoZXZhbCAkdHJ5X25hc20pIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdC5vOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuYXNtID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IHlvdSBoYXZlIHRvIHVzZSBhIG1vcmUgcmVjZW50IHZlcnNpb24gb2YgdGhlIGFzc2VtYmxlci4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBTSU1EIGluc3RydWN0aW9uIHNldHMgcmVxdWVzdGVkIHRvIHVzZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjUwODogY2hlY2tpbmcgU0lNRCBpbnN0cnVjdGlvbiBzZXRzIHJlcXVlc3RlZCB0byB1c2UiID4mNQotc2ltZF90b191c2U9IiIKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1teCBvciAtLWRpc2FibGUtbW14IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21teCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbW14IgotICBpZiB0ZXN0ICJ4JGVuYWJsZXZhbCIgPSB4bm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEpTSU1EX01NWF9OT1RfU1VQUE9SVEVEIAotRU9GCi0KLWVsc2UKLSAgc2ltZF90b191c2U9IiRzaW1kX3RvX3VzZSBNTVgiCi1maQotZWxzZQotICBzaW1kX3RvX3VzZT0iJHNpbWRfdG9fdXNlIE1NWCIKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLTNkbm93IG9yIC0tZGlzYWJsZS0zZG5vdyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV8zZG5vdytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfM2Rub3ciCi0gIGlmIHRlc3QgIngkZW5hYmxldmFsIiA9IHhubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSlNJTURfM0ROT1dfTk9UX1NVUFBPUlRFRCAKLUVPRgotCi1lbHNlCi0gIHNpbWRfdG9fdXNlPSIkc2ltZF90b191c2UgM0ROb3chIgotZmkKLWVsc2UKLSAgc2ltZF90b191c2U9IiRzaW1kX3RvX3VzZSAzRE5vdyEiCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zc2Ugb3IgLS1kaXNhYmxlLXNzZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zc2Urc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NzZSIKLSAgaWYgdGVzdCAieCRlbmFibGV2YWwiID0geG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBKU0lNRF9TU0VfTk9UX1NVUFBPUlRFRCAKLUVPRgotCi1lbHNlCi0gIHNpbWRfdG9fdXNlPSIkc2ltZF90b191c2UgU1NFIgotZmkKLWVsc2UKLSAgc2ltZF90b191c2U9IiRzaW1kX3RvX3VzZSBTU0UiCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zc2UyIG9yIC0tZGlzYWJsZS1zc2UyIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NzZTIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NzZTIiCi0gIGlmIHRlc3QgIngkZW5hYmxldmFsIiA9IHhubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSlNJTURfU1NFMl9OT1RfU1VQUE9SVEVEIAotRU9GCi0KLWVsc2UKLSAgc2ltZF90b191c2U9IiRzaW1kX3RvX3VzZSBTU0UyIgotZmkKLWVsc2UKLSAgc2ltZF90b191c2U9IiRzaW1kX3RvX3VzZSBTU0UyIgotZmkKLQotCi10ZXN0IC16ICIkc2ltZF90b191c2UiICYmIHNpbWRfdG9fdXNlPSJOT05FIgotZWNobyAiJGFjX3QiIiRzaW1kX3RvX3VzZSIgMT4mNgotCi1mb3Igc2ltZF9uYW1lIGluICRzaW1kX3RvX3VzZTsgZG8KLWNhc2UgIiRzaW1kX25hbWUiIGluCi0gIE1NWCkgICAgc2ltZF9pbnN0cnVjdGlvbj0ncHN1YncgbW0wLG1tMCc7OwotICAzRE5vdyEpIHNpbWRfaW5zdHJ1Y3Rpb249J3Bmc3ViIG1tMCxtbTAnOzsKLSAgU1NFKSAgICBzaW1kX2luc3RydWN0aW9uPSdzdWJwcyB4bW0wLHhtbTAnOzsKLSAgU1NFMikgICBzaW1kX2luc3RydWN0aW9uPSdzdWJwZCB4bW0wLHhtbTAnOzsKLSAgKikgICAgICBjb250aW51ZTs7Ci1lc2FjCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBhc3NlbWJsZXIgc3VwcG9ydHMgJHNpbWRfbmFtZSBpbnN0cnVjdGlvbnMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY1ODc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIGFzc2VtYmxlciBzdXBwb3J0cyAkc2ltZF9uYW1lIGluc3RydWN0aW9ucyIgPiY1Ci1jYXQgPiBjb25mdGVzdC5hc20gPDxFT0YKLSVsaW5lIDY1ODkgImNvbmZpZ3VyZSIKLSAgICAgICAgc2VjdGlvbiAudGV4dAotICAgICAgICBiaXRzICAgIDMyCi0gICAgICAgIGdsb2JhbCAgX3NpbWQKLV9zaW1kOiAgJHNpbWRfaW5zdHJ1Y3Rpb24KLSAgICAgICAgcmV0Ci1FT0YKLXRyeV9uYXNtPSckTkFTTSAkTkFGTEFHUyAtbyBjb25mdGVzdC5vIGNvbmZ0ZXN0LmFzbScKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjU5NzogXCIkdHJ5X25hc21cIikgMT4mNTsgKGV2YWwgJHRyeV9uYXNtKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QubzsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LmFzbSA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiB5b3UgaGF2ZSB0byB1c2UgYSBtb3JlIHJlY2VudCB2ZXJzaW9uIG9mIHRoZSBhc3NlbWJsZXIuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1kb25lCi0KLSMgU2VsZWN0IE9TLWRlcGVuZGVudCBTSU1EIGluc3RydWN0aW9uIHN1cHBvcnQgY2hlY2tlci4KLSMganNpbWR3MzIuJChPKSAoV2luMzIpIC8ganNpbWRkamcuJChPKSAoREpHUFAgVi4yKSAvIGpzaW1kZ2NjLiQoTykgKFVuaXgvZ2NjKQotaWYgdGVzdCAieCRTSU1EQ0hFQ0tFUiIgPSB4IDsgdGhlbgotICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBpbnRlcml4KikKLSAgICAgIFNJTURDSEVDS0VSPSdqc2ltZHczMi4kKE8pJwotICAgIDs7Ci0gICAgbXNkb3NkamdwcCogfCBnbzMyKikKLSAgICAgIFNJTURDSEVDS0VSPSdqc2ltZGRqZy4kKE8pJwotICAgIDs7Ci0gICAgb3MyLWVteCopCQkJIyBub3QgdGVzdGVkCi0gICAgICBTSU1EQ0hFQ0tFUj0nanNpbWRnY2MuJChPKScKLSAgICA7OwotICAgICopCi0gICAgICBTSU1EQ0hFQ0tFUj0nanNpbWRnY2MuJChPKScKLSAgICA7OwotICBlc2FjCi1maQotCi0KLWNhc2UgIiRob3N0X29zIiBpbgotICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBvczItZW14KiB8IG1zZG9zZGpncHAqIHwgZ28zMiopCi0gICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFVTRV9TRVRNT0RFIAotRU9GCi0KLSAgOzsKLSMgX2hvc3RfbmFtZV8qKQotIyAgIEFDX0RFRklORShbVVNFX0ZET1BFTl0sKQotIyA7OwotZXNhYwotCi0jIFRoaXMgaXMgZm9yIFVOSVgtbGlrZSBlbnZpcm9ubWVudHMgb24gV2luZG93cyBwbGF0Zm9ybS4KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS11Y2hhci1ib29sZWFuIG9yIC0tZGlzYWJsZS11Y2hhci1ib29sZWFuIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3VjaGFyX2Jvb2xlYW4rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3VjaGFyX2Jvb2xlYW4iCi0gIGlmIHRlc3QgIngkZW5hYmxldmFsIiAhPSB4bm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFRZUEVERUZfVUNIQVJfQk9PTEVBTiAKLUVPRgotCi1maQotZmkKLQotCi0KLUpQRUdfTElCX1ZFUlNJT049IjYzOjA6MSIKLWNvbmZ2X2RpcnM9IiRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIgotY29uZmlnX3Zlcj0KLWZvciBhY19kaXIgaW4gJGNvbmZ2X2RpcnM7IGRvCi0gIGlmIHRlc3QgLXIgJGFjX2Rpci9jb25maWcudmVyOyB0aGVuCi0gICAgY29uZmlnX3Zlcj0kYWNfZGlyL2NvbmZpZy52ZXIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGNvbmZpZ192ZXIiOyB0aGVuCi0gIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogY2Fubm90IGZpbmQgY29uZmlnLnZlciBpbiAkY29uZnZfZGlycyIgMT4mMgotICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IGRlZmF1bHQgdmVyc2lvbiBudW1iZXIgJEpQRUdfTElCX1ZFUlNJT04gaXMgdXNlZCIgMT4mMgotICBlY2hvICRhY19uICJjaGVja2luZyBsaWJqcGVnIHZlcnNpb24gbnVtYmVyIGZvciBsaWJ0b29sIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NjY4OiBjaGVja2luZyBsaWJqcGVnIHZlcnNpb24gbnVtYmVyIGZvciBsaWJ0b29sIiA+JjUKLSAgZWNobyAiJGFjX3QiIiRKUEVHX0xJQl9WRVJTSU9OIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGxpYmpwZWcgdmVyc2lvbiBudW1iZXIgZm9yIGxpYnRvb2wiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY2NzI6IGNoZWNraW5nIGxpYmpwZWcgdmVyc2lvbiBudW1iZXIgZm9yIGxpYnRvb2wiID4mNQotICAuICRjb25maWdfdmVyCi0gIGVjaG8gIiRhY190IiIkSlBFR19MSUJfVkVSU0lPTiIgMT4mNgotICBlY2hvICJjb25maWd1cmU6IGlmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgdmVyc2lvbiBudW1iZXIsIG1vZGlmeSAkY29uZmlnX3ZlciIgMT4mMgotZmkKLQotCi0jIFByZXBhcmUgdG8gbWFzc2FnZSBtYWtlZmlsZS5jZmcgY29ycmVjdGx5LgotaWYgdGVzdCAkaWpnX2N2X2hhdmVfcHJvdG90eXBlcyA9IHllczsgdGhlbgotICBBMktfREVQUz0iIgotICBDT01fQTJLPSIjICIKLWVsc2UKLSAgQTJLX0RFUFM9ImFuc2kya25yIgotICBDT01fQTJLPSIiCi1maQotCi0KLSMgYW5zaTJrbnIgbmVlZHMgLURCU0QgaWYgc3RyaW5nLmggaXMgbWlzc2luZwotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0cmluZ19oID0gbm87IHRoZW4KLSAgQU5TSTJLTlJGTEFHUz0iLURCU0QiCi1lbHNlCi0gIEFOU0kyS05SRkxBR1M9IiIKLWZpCi0KLSMgU3Vic3RpdHV0aW9ucyB0byBlbmFibGUgb3IgZGlzYWJsZSBsaWJ0b29sLXJlbGF0ZWQgc3R1ZmYKLWlmIHRlc3QgJFVTRUxJQlRPT0wgPSB5ZXMgLWEgJGlqZ19jdl9oYXZlX3Byb3RvdHlwZXMgPSB5ZXM7IHRoZW4KLSAgQ09NX0xUPSIiCi1lbHNlCi0gIENPTV9MVD0iIyAiCi1maQotCi1pZiB0ZXN0ICJ4JGVuYWJsZV9zaGFyZWQiICE9IHhubzsgdGhlbgotICBGT1JDRV9JTlNUQUxMX0xJQj0iaW5zdGFsbC1saWIiCi0gIFVOSU5TVEFMTF9MSUI9InVuaW5zdGFsbC1saWIiCi1lbHNlCi0gIEZPUkNFX0lOU1RBTExfTElCPSIiCi0gIFVOSU5TVEFMTF9MSUI9IiIKLWZpCi0KLQotIyBTZXQgdXAgLUkgZGlyZWN0aXZlcwotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgSU5DTFVERUZMQUdTPSctSSQoc3JjZGlyKScKLWVsc2UKLSAgSU5DTFVERUZMQUdTPSctSS4gLUkkKHNyY2RpciknCi1maQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGU6bWFrZWZpbGUuY2ZnIGpjb25maWcuaDpqY29uZmlnLmNmZyIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAQ0NAJSRDQyVnCi1zJUBDUFBAJSRDUFAlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQE9AJSRPJWcKLXMlQEFAJSRBJWcKLXMlQExOQCUkTE4lZwotcyVASU5TVEFMTF9MSUJAJSRJTlNUQUxMX0xJQiVnCi1zJUBVTklOU1RBTExAJSRVTklOU1RBTEwlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBMTl9TQCUkTE5fUyVnCi1zJUBPQkpFWFRAJSRPQkpFWFQlZwotcyVARUNIT0AlJEVDSE8lZwotcyVAU1RSSVBAJSRTVFJJUCVnCi1zJUBETExUT09MQCUkRExMVE9PTCVnCi1zJUBBU0AlJEFTJWcKLXMlQE9CSkRVTVBAJSRPQkpEVU1QJWcKLXMlQFRBR0NDQCUkVEFHQ0MlZwotcyVATUVNT1JZTUdSQCUkTUVNT1JZTUdSJWcKLXMlQE5BRkxBR1NAJSROQUZMQUdTJWcKLXMlQE5BU01AJSROQVNNJWcKLXMlQFNJTURDSEVDS0VSQCUkU0lNRENIRUNLRVIlZwotcyVASlBFR19MSUJfVkVSU0lPTkAlJEpQRUdfTElCX1ZFUlNJT04lZwotcyVAQTJLX0RFUFNAJSRBMktfREVQUyVnCi1zJUBDT01fQTJLQCUkQ09NX0EySyVnCi1zJUBBTlNJMktOUkZMQUdTQCUkQU5TSTJLTlJGTEFHUyVnCi1zJUBDT01fTFRAJSRDT01fTFQlZwotcyVARk9SQ0VfSU5TVEFMTF9MSUJAJSRGT1JDRV9JTlNUQUxMX0xJQiVnCi1zJUBVTklOU1RBTExfTElCQCUkVU5JTlNUQUxMX0xJQiVnCi1zJUBJTkNMVURFRkxBR1NAJSRJTkNMVURFRkxBR1MlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGU6bWFrZWZpbGUuY2ZnIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJqY29uZmlnLmg6amNvbmZpZy5jZmciCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZpCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0KLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QudmFscwotY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotcy9bXFwmJV0vXFwmL2cKLXMlW1xcJGBdJVxcJiVnCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKLUVPRgotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0KLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKLXdoaWxlIDoKLWRvCi0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKLSAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgotICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCi0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgotICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAotICBybSAtZiBjb25mdGVzdC5pbgotICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KLScgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCi0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCi1kb25lCi1ybSAtZiBjb25mdGVzdC52YWxzCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCi0gIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAotICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAotICBybSAtZiBjb25mdGVzdC5pbgotICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKLSAgICBybSAtZiBjb25mdGVzdC5oCi0gIGVsc2UKLSAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGZpCi0gICAgcm0gLWYgJGFjX2ZpbGUKLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCi0gIGZpCi1maTsgZG9uZQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5hYyBiL2NvbmZpZ3VyZS5hYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODNjYTdlCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlndXJlLmFjCkBAIC0wLDAgKzEsMTExIEBACisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCisKK0FDX1BSRVJFUShbMi42MV0pCitBQ19JTklUKFtsaWJqcGVnXSwgWzYuYl0pCisKK0FNX0lOSVRfQVVUT01BS0UoWy1XYWxsIGZvcmVpZ24gZGlzdC1iemlwMl0pCisKKyMgQWx3YXlzIGJ1aWxkIHdpdGggcHJvdG90eXBlcworQUNfREVGSU5FKFtIQVZFX1BST1RPVFlQRVNdLCAxLCBbRGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgcHJvdG90eXBlc10pCisjIERvbid0IHVzZSB1bmRlZmluZWQgdHlwZXMKK0FDX0RFRklORShbSU5DT01QTEVURV9UWVBFU19CUk9LRU5dLCAxLCBbRGVmaW5lIGlmIHlvdSB3YW50IHVzZSBjb21wbGV0ZSB0eXBlc10pCisKKyMgQ2hlY2tzIGZvciBwcm9ncmFtcy4KK0FDX1BST0dfQ1BQCitBQ19QUk9HX0NDCitBQ19QUk9HX0lOU1RBTEwKK0FDX1BST0dfTElCVE9PTAorQUNfUFJPR19MTl9TCisKKyMgQ2hlY2tzIGZvciBsaWJyYXJpZXMuCisKKyMgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCitBQ19IRUFERVJfU1REQworQUNfQ0hFQ0tfSEVBREVSUyhbc3RkZGVmLmggc3RkbGliLmggc3RyaW5nLmhdKQorQUNfQ0hFQ0tfSEVBREVSKFtzeXMvdHlwZXMuaF0sIEFDX0RFRklORShbTkVFRF9TWVNfVFlQRVNfSF0sIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgc3lzL3R5cGVzLmhdKSkKKworIyBDaGVja3MgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzLCBhbmQgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzLgorQUNfQ19DT05TVAorQUNfQ19DSEFSX1VOU0lHTkVECitBQ19DX0lOTElORQorQUNfVFlQRV9TSVpFX1QKK0FDX0NIRUNLX1RZUEVTKFt1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBzaG9ydF0pCisKK0FDX01TR19DSEVDS0lORyhbaWYgcmlnaHQgc2hpZnQgaXMgc2lnbmVkXSkKK0FDX1RSWV9SVU4oCisJWyNpbmNsdWRlIDxzdGRpby5oPgorCSBpbnQgaXNfc2hpZnRpbmdfc2lnbmVkIChsb25nIGFyZykgeworCSBsb25nIHJlcyA9IGFyZyA+PiA0OworCisJIGlmIChyZXMgPT0gLTB4N0Y3RTgwQ0wpCisJCXJldHVybiAxOyAvKiByaWdodCBzaGlmdCBpcyBzaWduZWQgKi8KKworCSAvKiBzZWUgaWYgdW5zaWduZWQtc2hpZnQgaGFjayB3aWxsIGZpeCBpdC4gKi8KKwkgLyogd2UgY2FuJ3QganVzdCB0ZXN0IGV4YWN0IHZhbHVlIHNpbmNlIGl0IGRlcGVuZHMgb24gd2lkdGggb2YgbG9uZy4uLiAqLworCSByZXMgfD0gKH4wTCkgPDwgKDMyLTQpOworCSBpZiAocmVzID09IC0weDdGN0U4MENMKQorCQlyZXR1cm4gMDsgLyogcmlnaHQgc2hpZnQgaXMgdW5zaWduZWQgKi8KKworCSBwcmludGYoIlJpZ2h0IHNoaWZ0IGlzbid0IGFjdGluZyBhcyBJIGV4cGVjdCBpdCB0by5cbiIpOworCSBwcmludGYoIkkgZmVhciB0aGUgSlBFRyBzb2Z0d2FyZSB3aWxsIG5vdCB3b3JrIGF0IGFsbC5cblxuIik7CisJIHJldHVybiAwOyAvKiB0cnkgaXQgd2l0aCB1bnNpZ25lZCBhbnl3YXkgKi8KKwkgfQorCSBpbnQgbWFpbiAodm9pZCkgeworCQlleGl0KGlzX3NoaWZ0aW5nX3NpZ25lZCgtMHg3RjdFODBCMUwpKTsKKwkgfV0sCisJW0FDX01TR19SRVNVTFQobm8pCisJIEFDX0RFRklORShbUklHSFRfU0hJRlRfSVNfVU5TSUdORURdLCAxLCBbRGVmaW5lIGlmIHNoaWZ0IGlzIHVuc2lnbmVkXSldLAorCVtBQ19NU0dfUkVTVUxUKHllcyldLAorCVtBQ19NU0dfUkVTVUxUKEFzc3VtaW5nIHRoYXQgcmlnaHQgc2hpZnQgaXMgc2lnbmVkIG9uIHRhcmdldCBtYWNoaW5lLildKQorCisjIHRlc3Qgd2hldGhlciBnbG9iYWwgbmFtZXMgYXJlIHVuaXF1ZSB0byBhdCBsZWFzdCAxNSBjaGFycworQUNfTVNHX0NIRUNLSU5HKFtmb3Igc2hvcnQgZXh0ZXJuYWwgbmFtZXNdKQorQUNfVFJZX0xJTksoCisJW2ludCBwb3NzaWJseV9kdXBsaWNhdGVfZnVuY3Rpb24gKCkgeyByZXR1cm4gMDsgfQorCSBpbnQgcG9zc2libHlfZHVwbGlfZnVuY3Rpb24gKCkgeyByZXR1cm4gMTsgfV0sIFsgXSwKKwlbQUNfTVNHX1JFU1VMVChvayldLAorCVtBQ19NU0dfUkVTVUxUKHNob3J0KQorCSBBQ19ERUZJTkUoW05FRURfU0hPUlRfRVhURVJOQUxfTkFNRVNdLCAxLCBbRGVmaW5lIGlmIHlvdSBuZWVkIHNob3J0IGZ1bmN0aW9uIG5hbWVzXSldKQorCisjIENoZWNrcyBmb3IgbGlicmFyeSBmdW5jdGlvbnMuCitBQ19DSEVDS19GVU5DUyhbbWVtc2V0IG1lbWNweV0sIFtdLAorCVtBQ19ERUZJTkUoW05FRURfQlNEX1NUUklOR1NdLCAxLAorCQkgICBbRGVmaW5lIGlmIHlvdSBoYXZlIEJTRC1saWtlIGJ6ZXJvIGFuZCBiY29weV0pXSkKKworIyBTZXQgZmxhZ3MgdG8gaW5kaWNhdGUgcGxhdGZvcm0KK2Nhc2UgIiRob3N0X29zIiBpbgorICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBpbnRlcml4KikKKyAgICBpc193aW4zMj0xCisgIDs7Citlc2FjCitBTV9DT05ESVRJT05BTChbSVNfV0lOMzJdLCBbdGVzdCAieCRpc193aW4zMiIgPSAieDEiXSkKKworIyBTSU1EIGlzIG9wdGlvbmFsCitBQ19BUkdfV0lUSChbc2ltZF0sCisgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aG91dC1zaW1kXSxbT21pdCBhY2NlbGVyYXRlZCBTSU1EIHJvdXRpbmVzLl0pKQoraWYgdGVzdCAieCR7d2l0aF9zaW1kfSIgIT0gInhubyI7IHRoZW4KKyAgIyBDaGVjayBpZiB3ZSdyZSBvbiBhIHN1cHBvcnRlZCBDUFUKKyAgQUNfTVNHX0NIRUNLSU5HKFtpZiBob3N0IGNwdSB0eXBlIGlzIGkzODYgb3IgY29tcGF0aWJsZV0pCisgIGNhc2UgIiRob3N0X2NwdSIgaW4KKyAgICBpKjg2IHwgeDg2IHwgaWEzMikKKyAgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICAgQUNfUFJPR19OQVNNCisgICAgICBBQ19ERUZJTkUoW1dJVEhfU0lNRF0sIFsxXSwgW1VzZSBhY2NlbGVyYXRlZCBTSU1EIHJvdXRpbmVzLl0pCisgICAgOzsKKyAgICAqKQorICAgICAgQUNfTVNHX1JFU1VMVChbbm8gKCIkaG9zdF9jcHUiKV0pCisgICAgICB3aXRoX3NpbWQ9bm8KKyAgICA7OworICBlc2FjCitmaQorQU1fQ09ORElUSU9OQUwoW1dJVEhfU0lNRF0sIFt0ZXN0ICJ4JHdpdGhfc2ltZCIgIT0gInhubyJdKQorCisjIGpjb25maWcuaCBpcyB0aGUgZmlsZSB3ZSB1c2UsIGJ1dCB3ZSBoYXZlIGFub3RoZXIgYmVmb3JlIHRoYXQgdG8KKyMgZm9vbCBhdXRvaGVhZGVyLiB0aGUgcmVhc29uIGlzIHRoYXQgd2UgaW5jbHVkZSB0aGlzIGhlYWRlciBpbiBvdXIKKyMgQVBJIGhlYWRlcnMsIHdoaWNoIGNhbiBzY3JldyB0aGluZ3MgdXAgZm9yIHVzZXJzIG9mIHRoZSBsaWIuCisjIGpjb25maWcuaCBpcyBhIG1pbmltYWwgdmVyc2lvbiB0aGF0IGFsbG93cyB0aGlzIHBhY2thZ2UgdG8gYmUgYnVpbHQKK0FDX0NPTkZJR19IRUFERVJTKFtjb25maWcuaF0pCitBQ19DT05GSUdfSEVBREVSUyhbamNvbmZpZy5oXSkKK0FDX0NPTkZJR19GSUxFUyhbTWFrZWZpbGVdKQorQUNfT1VUUFVUCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTcxZjAuLjAwMDAwMDAKLS0tIGEvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjM0ICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotQUNfSU5JVChbamNtYXN0ZXIuY10pCi1BQ19DT05GSUdfSEVBREVSKFtqY29uZmlnLmg6amNvbmZpZy5jZmddKQotZG5sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19QUk9HX0NDCi1BQ19QUk9HX0NQUAotZG5sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBmdW5jdGlvbiBwcm90b3R5cGVzXSkKLUFDX0NBQ0hFX1ZBTChbaWpnX2N2X2hhdmVfcHJvdG90eXBlc10sW0FDX1RSWV9DT01QSUxFKFsKLWludCB0ZXN0ZnVuY3Rpb24gKGludCBhcmcxLCBpbnQgKiBhcmcyKTsgLyogY2hlY2sgcHJvdG90eXBlcyAqLwotc3RydWN0IG1ldGhvZHNfc3RydWN0IHsJCS8qIGNoZWNrIG1ldGhvZC1wb2ludGVyIGRlY2xhcmF0aW9ucyAqLwotICBpbnQgKCplcnJvcl9leGl0KSAoY2hhciAqbXNndGV4dCk7Ci0gIGludCAoKnRyYWNlX21lc3NhZ2UpIChjaGFyICptc2d0ZXh0KTsKLSAgaW50ICgqYW5vdGhlcl9tZXRob2QpICh2b2lkKTsKLX07Ci1pbnQgdGVzdGZ1bmN0aW9uIChpbnQgYXJnMSwgaW50ICogYXJnMikgLyogY2hlY2sgZGVmaW5pdGlvbnMgKi8KLXsgcmV0dXJuIGFyZzJbYXJnMV07IH0KLWludCB0ZXN0MmZ1bmN0aW9uICh2b2lkKQkvKiBjaGVjayB2b2lkIGFyZyBsaXN0ICovCi17IHJldHVybiAwOyB9Ci1dLFsgXSxbaWpnX2N2X2hhdmVfcHJvdG90eXBlcz15ZXNdLFtpamdfY3ZfaGF2ZV9wcm90b3R5cGVzPW5vXSldKQotQUNfTVNHX1JFU1VMVChbJGlqZ19jdl9oYXZlX3Byb3RvdHlwZXNdKQotaWYgdGVzdCAkaWpnX2N2X2hhdmVfcHJvdG90eXBlcyA9IHllczsgdGhlbgotICBBQ19ERUZJTkUoW0hBVkVfUFJPVE9UWVBFU10sKQotZWxzZQotICBlY2hvIFtZb3VyIGNvbXBpbGVyIGRvZXMgbm90IHNlZW0gdG8ga25vdyBhYm91dCBmdW5jdGlvbiBwcm90b3R5cGVzLl0KLSAgZWNobyBbUGVyaGFwcyBpdCBuZWVkcyBhIHNwZWNpYWwgc3dpdGNoIHRvIGVuYWJsZSBBTlNJIEMgbW9kZS5dCi0gIGVjaG8gW0lmIHNvLCB3ZSByZWNvbW1lbmQgcnVubmluZyBjb25maWd1cmUgbGlrZSB0aGlzOl0KLSAgZWNobyBbIiAgIC4vY29uZmlndXJlICBDQz0nY2MgLXN3aXRjaCciXQotICBlY2hvIFt3aGVyZSAtc3dpdGNoIGlzIHRoZSBwcm9wZXIgc3dpdGNoLl0KLWZpCi1kbmwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFDX0NIRUNLX0hFQURFUihbc3RkZGVmLmhdLFtBQ19ERUZJTkUoW0hBVkVfU1REREVGX0hdLCldKQotQUNfQ0hFQ0tfSEVBREVSKFtzdGRsaWIuaF0sW0FDX0RFRklORShbSEFWRV9TVERMSUJfSF0sKV0pCi1BQ19DSEVDS19IRUFERVIoW3N0cmluZy5oXSxbOl0sW0FDX0RFRklORShbTkVFRF9CU0RfU1RSSU5HU10sKV0pCi1kbmwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFDX01TR19DSEVDS0lORyhbZm9yIHNpemVfdF0pCi1BQ19UUllfQ09NUElMRShbCi0jaWZkZWYgSEFWRV9TVERERUZfSAotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBORUVEX0JTRF9TVFJJTkdTCi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotdHlwZWRlZiBzaXplX3QgbXlfc2l6ZV90OwotXSxbIG15X3NpemVfdCBmb292YXI7IF0sCi1baWpnX3NpemVfdF9vaz15ZXNdLAotW2lqZ19zaXplX3Rfb2s9Im5vdCBBTlNJLCBwZXJoYXBzIGl0IGlzIGluIHN5cy90eXBlcy5oIl0pCi1BQ19NU0dfUkVTVUxUKFskaWpnX3NpemVfdF9va10pCi1pZiB0ZXN0ICIkaWpnX3NpemVfdF9vayIgIT0geWVzOyB0aGVuCi1BQ19DSEVDS19IRUFERVIoW3N5cy90eXBlcy5oXSxbQUNfREVGSU5FKFtORUVEX1NZU19UWVBFU19IXSwpCi1BQ19FR1JFUF9IRUFERVIoW3NpemVfdF0sW3N5cy90eXBlcy5oXSwKLVtpamdfc2l6ZV90X29rPSJzaXplX3QgaXMgaW4gc3lzL3R5cGVzLmgiXSxbaWpnX3NpemVfdF9vaz1ub10pXSwKLVtpamdfc2l6ZV90X29rPW5vXSkKLUFDX01TR19SRVNVTFQoWyRpamdfc2l6ZV90X29rXSkKLWlmIHRlc3QgIiRpamdfc2l6ZV90X29rIiA9IG5vOyB0aGVuCi0gIGVjaG8gW1R5cGUgc2l6ZV90IGlzIG5vdCBkZWZpbmVkIGluIGFueSBvZiB0aGUgdXN1YWwgcGxhY2VzLl0KLSAgZWNobyBbVHJ5IHB1dHRpbmcgJyJ0eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3Q7IicgaW4gamNvbmZpZy5oLl0KLWZpCi1maQotZG5sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciB0eXBlIHVuc2lnbmVkIGNoYXJdKQotQUNfVFJZX0NPTVBJTEUoLFsgdW5zaWduZWQgY2hhciB1bl9jaGFyOyBdLFtBQ19NU0dfUkVTVUxUKHllcykKLUFDX0RFRklORShbSEFWRV9VTlNJR05FRF9DSEFSXSwpXSxbQUNfTVNHX1JFU1VMVChubyldKQotZG5sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciB0eXBlIHVuc2lnbmVkIHNob3J0XSkKLUFDX1RSWV9DT01QSUxFKCxbIHVuc2lnbmVkIHNob3J0IHVuX3Nob3J0OyBdLFtBQ19NU0dfUkVTVUxUKHllcykKLUFDX0RFRklORShbSEFWRV9VTlNJR05FRF9TSE9SVF0sKV0sW0FDX01TR19SRVNVTFQobm8pXSkKLWRubCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfTVNHX0NIRUNLSU5HKFtmb3IgdHlwZSB2b2lkXSkKLUFDX1RSWV9DT01QSUxFKFsKLS8qIENhdXRpb246IGEgQysrIGNvbXBpbGVyIHdpbGwgaW5zaXN0IG9uIHZhbGlkIHByb3RvdHlwZXMgKi8KLXR5cGVkZWYgdm9pZCAqIHZvaWRfcHRyOwkvKiBjaGVjayB2b2lkICogKi8KLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMJCS8qIGNoZWNrIHB0ciB0byBmdW5jdGlvbiByZXR1cm5pbmcgdm9pZCAqLwotdHlwZWRlZiB2b2lkICgqdm9pZF9mdW5jKSAoaW50IGEsIGludCBiKTsKLSNlbHNlCi10eXBlZGVmIHZvaWQgKCp2b2lkX2Z1bmMpICgpOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMJCS8qIGNoZWNrIHZvaWQgZnVuY3Rpb24gcmVzdWx0ICovCi12b2lkIHRlc3QzZnVuY3Rpb24gKHZvaWRfcHRyIGFyZzEsIHZvaWRfZnVuYyBhcmcyKQotI2Vsc2UKLXZvaWQgdGVzdDNmdW5jdGlvbiAoYXJnMSwgYXJnMikKLSAgICAgdm9pZF9wdHIgYXJnMTsKLSAgICAgdm9pZF9mdW5jIGFyZzI7Ci0jZW5kaWYKLXsKLSAgY2hhciAqIGxvY3B0ciA9IChjaGFyICopIGFyZzE7IC8qIGNoZWNrIGNhc3RpbmcgdG8gYW5kIGZyb20gdm9pZCAqICovCi0gIGFyZzEgPSAodm9pZCAqKSBsb2NwdHI7Ci0gICgqYXJnMikgKDEsIDIpOwkJLyogY2hlY2sgY2FsbCBvZiBmY24gcmV0dXJuaW5nIHZvaWQgKi8KLX0KLV0sWyBdLFtBQ19NU0dfUkVTVUxUKHllcyldLFtBQ19NU0dfUkVTVUxUKG5vKQotQUNfREVGSU5FKFt2b2lkXSxbY2hhcl0pXSkKLQotZG5sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciB3b3JraW5nIGNvbnN0XSkKLUFDX0NBQ0hFX1ZBTChbYWNfY3ZfY19jb25zdF0sW0FDX1RSWV9DT01QSUxFKCxbCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci1dLFthY19jdl9jX2NvbnN0PXllc10sW2FjX2N2X2NfY29uc3Q9bm9dKV0pCi1BQ19NU0dfUkVTVUxUKFskYWNfY3ZfY19jb25zdF0pCi1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgQUNfREVGSU5FKFtjb25zdF0sKQotZmkKLQotZG5sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBpbmxpbmVdKQotaWpnX2N2X2lubGluZT0iIgotQUNfVFJZX0NPTVBJTEUoLFt9IF9faW5saW5lX18gaW50IGZvbygpIHsgcmV0dXJuIDA7IH0KLWludCBiYXIoKSB7IHJldHVybiBmb28oKTtdLFtpamdfY3ZfaW5saW5lPSJfX2lubGluZV9fIl0sCi1bQUNfVFJZX0NPTVBJTEUoLFt9IF9faW5saW5lIGludCBmb28oKSB7IHJldHVybiAwOyB9Ci1pbnQgYmFyKCkgeyByZXR1cm4gZm9vKCk7XSxbaWpnX2N2X2lubGluZT0iX19pbmxpbmUiXSwKLVtBQ19UUllfQ09NUElMRSgsW30gaW5saW5lIGludCBmb28oKSB7IHJldHVybiAwOyB9Ci1pbnQgYmFyKCkgeyByZXR1cm4gZm9vKCk7XSxbaWpnX2N2X2lubGluZT0iaW5saW5lIl0sKV0pXSkKLUFDX01TR19SRVNVTFQoWyRpamdfY3ZfaW5saW5lXSkKLUFDX0RFRklORV9VTlFVT1RFRChbSU5MSU5FXSxbJGlqZ19jdl9pbmxpbmVdKQotZG5sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBicm9rZW4gaW5jb21wbGV0ZSB0eXBlc10pCi1BQ19UUllfQ09NUElMRShbIHR5cGVkZWYgc3RydWN0IHVuZGVmaW5lZF9zdHJ1Y3R1cmUgKiB1bmRlZl9zdHJ1Y3RfcHRyOyBdLAotLFtBQ19NU0dfUkVTVUxUKG9rKV0sW0FDX01TR19SRVNVTFQoYnJva2VuKQotQUNfREVGSU5FKFtJTkNPTVBMRVRFX1RZUEVTX0JST0tFTl0sKV0pCi1kbmwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFDX01TR19DSEVDS0lORyhbZm9yIHNob3J0IGV4dGVybmFsIG5hbWVzXSkKLUFDX1RSWV9MSU5LKFsKLWludCBwb3NzaWJseV9kdXBsaWNhdGVfZnVuY3Rpb24gKCkgeyByZXR1cm4gMDsgfQotaW50IHBvc3NpYmx5X2R1cGxpX2Z1bmN0aW9uICgpIHsgcmV0dXJuIDE7IH0KLV0sWyBdLFtBQ19NU0dfUkVTVUxUKG9rKV0sW0FDX01TR19SRVNVTFQoc2hvcnQpCi1BQ19ERUZJTkUoW05FRURfU0hPUlRfRVhURVJOQUxfTkFNRVNdLCldKQotZG5sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19NU0dfQ0hFQ0tJTkcoW3RvIHNlZSBpZiBjaGFyIGlzIHNpZ25lZF0pCi1BQ19UUllfUlVOKFsKLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMKLWludCBpc19jaGFyX3NpZ25lZCAoaW50IGFyZykKLSNlbHNlCi1pbnQgaXNfY2hhcl9zaWduZWQgKGFyZykKLSAgICAgaW50IGFyZzsKLSNlbmRpZgotewotICBpZiAoYXJnID09IDE4OSkgewkJLyogZXhwZWN0ZWQgcmVzdWx0IGZvciB1bnNpZ25lZCBjaGFyICovCi0gICAgcmV0dXJuIDA7CQkJLyogdHlwZSBjaGFyIGlzIHVuc2lnbmVkICovCi0gIH0KLSAgZWxzZSBpZiAoYXJnICE9IC02NykgewkvKiBleHBlY3RlZCByZXN1bHQgZm9yIHNpZ25lZCBjaGFyICovCi0gICAgcHJpbnRmKCJIbW0sIGl0IHNlZW1zICdjaGFyJyBpcyBub3QgZWlnaHQgYml0cyB3aWRlIG9uIHlvdXIgbWFjaGluZS5cbiIpOwotICAgIHByaW50ZigiSSBmZWFyIHRoZSBKUEVHIHNvZnR3YXJlIHdpbGwgbm90IHdvcmsgYXQgYWxsLlxuXG4iKTsKLSAgfQotICByZXR1cm4gMTsJCQkvKiBhc3N1bWUgY2hhciBpcyBzaWduZWQgb3RoZXJ3aXNlICovCi19Ci1jaGFyIHNpZ25lZF9jaGFyX2NoZWNrID0gKGNoYXIpICgtNjcpOwotbWFpbigpIHsKLSAgZXhpdChpc19jaGFyX3NpZ25lZCgoaW50KSBzaWduZWRfY2hhcl9jaGVjaykpOwotfV0sW0FDX01TR19SRVNVTFQobm8pCi1BQ19ERUZJTkUoW0NIQVJfSVNfVU5TSUdORURdLCldLFtBQ19NU0dfUkVTVUxUKHllcyldLAotW2VjaG8gQXNzdW1pbmcgdGhhdCBjaGFyIGlzIHNpZ25lZCBvbiB0YXJnZXQgbWFjaGluZS4KLWVjaG8gSWYgaXQgaXMgdW5zaWduZWQsIHRoaXMgd2lsbCBiZSBhIGxpdHRsZSBiaXQgaW5lZmZpY2llbnQuCi1dKQotZG5sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19NU0dfQ0hFQ0tJTkcoW3RvIHNlZSBpZiByaWdodCBzaGlmdCBpcyBzaWduZWRdKQotQUNfVFJZX1JVTihbCi0jaWZkZWYgSEFWRV9QUk9UT1RZUEVTCi1pbnQgaXNfc2hpZnRpbmdfc2lnbmVkIChsb25nIGFyZykKLSNlbHNlCi1pbnQgaXNfc2hpZnRpbmdfc2lnbmVkIChhcmcpCi0gICAgIGxvbmcgYXJnOwotI2VuZGlmCi0vKiBTZWUgd2hldGhlciByaWdodC1zaGlmdCBvbiBhIGxvbmcgaXMgc2lnbmVkIG9yIG5vdC4gKi8KLXsKLSAgbG9uZyByZXMgPSBhcmcgPj4gNDsKLQotICBpZiAocmVzID09IC0weDdGN0U4MENMKSB7CS8qIGV4cGVjdGVkIHJlc3VsdCBmb3Igc2lnbmVkIHNoaWZ0ICovCi0gICAgcmV0dXJuIDE7CQkJLyogcmlnaHQgc2hpZnQgaXMgc2lnbmVkICovCi0gIH0KLSAgLyogc2VlIGlmIHVuc2lnbmVkLXNoaWZ0IGhhY2sgd2lsbCBmaXggaXQuICovCi0gIC8qIHdlIGNhbid0IGp1c3QgdGVzdCBleGFjdCB2YWx1ZSBzaW5jZSBpdCBkZXBlbmRzIG9uIHdpZHRoIG9mIGxvbmcuLi4gKi8KLSAgcmVzIHw9ICh+MEwpIDw8ICgzMi00KTsKLSAgaWYgKHJlcyA9PSAtMHg3RjdFODBDTCkgewkvKiBleHBlY3RlZCByZXN1bHQgbm93PyAqLwotICAgIHJldHVybiAwOwkJCS8qIHJpZ2h0IHNoaWZ0IGlzIHVuc2lnbmVkICovCi0gIH0KLSAgcHJpbnRmKCJSaWdodCBzaGlmdCBpc24ndCBhY3RpbmcgYXMgSSBleHBlY3QgaXQgdG8uXG4iKTsKLSAgcHJpbnRmKCJJIGZlYXIgdGhlIEpQRUcgc29mdHdhcmUgd2lsbCBub3Qgd29yayBhdCBhbGwuXG5cbiIpOwotICByZXR1cm4gMDsJCQkvKiB0cnkgaXQgd2l0aCB1bnNpZ25lZCBhbnl3YXkgKi8KLX0KLW1haW4oKSB7Ci0gIGV4aXQoaXNfc2hpZnRpbmdfc2lnbmVkKC0weDdGN0U4MEIxTCkpOwotfV0sW0FDX01TR19SRVNVTFQobm8pCi1BQ19ERUZJTkUoW1JJR0hUX1NISUZUX0lTX1VOU0lHTkVEXSwpXSxbQUNfTVNHX1JFU1VMVCh5ZXMpXSwKLVtBQ19NU0dfUkVTVUxUKFtBc3N1bWluZyB0aGF0IHJpZ2h0IHNoaWZ0IGlzIHNpZ25lZCBvbiB0YXJnZXQgbWFjaGluZS5dKV0pCi1kbmwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFDX01TR19DSEVDS0lORyhbdG8gc2VlIGlmIGZvcGVuIGFjY2VwdHMgYiBzcGVjXSkKLUFDX1RSWV9SVU4oWwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci1tYWluKCkgewotICBpZiAoZm9wZW4oImNvbmZ0ZXN0ZGF0YSIsICJ3YiIpICE9IE5VTEwpCi0gICAgZXhpdCgwKTsKLSAgZXhpdCgxKTsKLX1dLFtBQ19NU0dfUkVTVUxUKHllcyldLFtBQ19NU0dfUkVTVUxUKG5vKQotQUNfREVGSU5FKFtET05UX1VTRV9CX01PREVdLCldLFtBQ19NU0dfUkVTVUxUKFtBc3N1bWluZyB0aGF0IGl0IGRvZXMuXSldKQotZG5sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19QUk9HX0lOU1RBTEwKLUFDX1BST0dfUkFOTElCCi1kbmwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQUNfQ0FOT05JQ0FMX0hPU1QKLUFDX0VYRUVYVAotCi0jIERlY2lkZSB3aGV0aGVyIHRvIHVzZSBsaWJ0b29sLAotIyBhbmQgaWYgc28gd2hldGhlciB0byBidWlsZCBzaGFyZWQsIHN0YXRpYywgb3IgYm90aCBmbGF2b3JzIG9mIGxpYnJhcnkuCi1BQ19ESVNBQkxFX1NIQVJFRAotQUNfRElTQUJMRV9TVEFUSUMKLWlmIHRlc3QgIngkZW5hYmxlX3NoYXJlZCIgIT0geG5vICAtbyAgIngkZW5hYmxlX3N0YXRpYyIgIT0geG5vOyB0aGVuCi0gIFVTRUxJQlRPT0w9InllcyIKLSMgTElCVE9PTD0iLi9saWJ0b29sIgotICBPPSJsbyIKLSAgQT0ibGEiCi0gIExOPSckKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0MpJwotICBJTlNUQUxMX0xJQj0nJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAke0lOU1RBTEx9JwotICBJTlNUQUxMX1BST0dSQU09IlwkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICRJTlNUQUxMX1BST0dSQU0iCi0gIFVOSU5TVEFMTD0nJChMSUJUT09MKSAtLW1vZGU9dW5pbnN0YWxsICQoUk0pJwotZWxzZQotICBVU0VMSUJUT09MPSJubyIKLSAgTElCVE9PTD0iIgotICBPPSJvIgotICBBPSJhIgotICBMTj0nJChDQyknCi0gIElOU1RBTExfTElCPSIkSU5TVEFMTF9EQVRBIgotICBVTklOU1RBTEw9JyQoUk0pJwotZmkKLUFDX1NVQlNUKFtMSUJUT09MXSkKLUFDX1NVQlNUKFtPXSkKLUFDX1NVQlNUKFtBXSkKLUFDX1NVQlNUKFtMTl0pCi1BQ19TVUJTVChbSU5TVEFMTF9MSUJdKQotQUNfU1VCU1QoW1VOSU5TVEFMTF0pCi0KLSMgQ29uZmlndXJlIGxpYnRvb2wgaWYgbmVlZGVkLgotaWYgdGVzdCAkVVNFTElCVE9PTCA9IHllczsgdGhlbgotICBBQ19MSUJUT09MX0RMT1BFTgotICBBQ19MSUJUT09MX1dJTjMyX0RMTAotICBBQ19QUk9HX0xJQlRPT0wKLWZpCi0jIGlmIGxpYnRvb2wgPj0gMS41Ci1UQUdDQz1pZmRlZihbQUNfTElCVE9PTF9HQ0pdLFstLXRhZz1DQ10pCi1BQ19TVUJTVChbVEFHQ0NdKQotCi1kbmwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgU2VsZWN0IG1lbW9yeSBtYW5hZ2VyIGRlcGVuZGluZyBvbiB1c2VyIGlucHV0LgotIyBJZiBubyAiLWVuYWJsZS1tYXhtZW0iLCB1c2Ugam1lbW5vYnMKLU1FTU9SWU1HUj0nam1lbW5vYnMuJChPKScKLU1BWE1FTT0ibm8iCi1BQ19BUkdfRU5BQkxFKFttYXhtZW1dLAotWyAgLS1lbmFibGUtbWF4bWVtWz1OXSAgICAgZW5hYmxlIHVzZSBvZiB0ZW1wIGZpbGVzLCBzZXQgbWF4IG1lbSB1c2FnZSB0byBOIE1CXSwKLVtNQVhNRU09IiRlbmFibGV2YWwiXSkKLSMgc3VwcG9ydCAtLXdpdGgtbWF4bWVtIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIElKRyBWNS4KLUFDX0FSR19XSVRIKFttYXhtZW1dLCxbTUFYTUVNPSIkd2l0aHZhbCJdKQotaWYgdGVzdCAieCRNQVhNRU0iID0geHllczsgdGhlbgotICBNQVhNRU09MQotZmkKLWlmIHRlc3QgIngkTUFYTUVNIiAhPSB4bm87IHRoZW4KLSAgaWYgdGVzdCAtbiAiYGVjaG8gJE1BWE1FTSB8IHNlZCAncy9bWzAtOV1dLy9nJ2AiOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtub24tbnVtZXJpYyBhcmd1bWVudCB0byAtLWVuYWJsZS1tYXhtZW1dKQotICBmaQotICBERUZBVUxUTUFYTUVNPWBleHByICRNQVhNRU0gXCogMTA0ODU3NmAKLUFDX0RFRklORV9VTlFVT1RFRChbREVGQVVMVF9NQVhfTUVNXSxbJHtERUZBVUxUTUFYTUVNfV0pCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAndG1wZmlsZSgpJ10pCi1BQ19UUllfTElOSyhbI2luY2x1ZGUgPHN0ZGlvLmg+XSxbIEZJTEUgKiB0ZmlsZSA9IHRtcGZpbGUoKTsgXSwKLVtBQ19NU0dfUkVTVUxUKHllcykKLU1FTU9SWU1HUj0nam1lbWFuc2kuJChPKSddLAotW0FDX01TR19SRVNVTFQobm8pCi1NRU1PUllNR1I9J2ptZW1uYW1lLiQoTyknCi1BQ19ERUZJTkUoW05FRURfU0lHTkFMX0NBVENIRVJdLCkKLUFDX01TR19DSEVDS0lORyhbZm9yICdta3RlbXAoKSddKQotQUNfVFJZX0xJTksoLFsgY2hhciBmbmFtZVs4MF07IG1rdGVtcChmbmFtZSk7IF0sCi1bQUNfTVNHX1JFU1VMVCh5ZXMpXSxbQUNfTVNHX1JFU1VMVChubykKLUFDX0RFRklORShbTk9fTUtURU1QXSwpXSldKQotZmkKLUFDX1NVQlNUKFtNRU1PUllNR1JdKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQUNfTVNHX0NIRUNLSU5HKFt0byBzZWUgaWYgdGhlIGhvc3QgY3B1IHR5cGUgaXMgaTM4NiBvciBjb21wYXRpYmxlXSkKLWNhc2UgIiRob3N0X2NwdSIgaW4KLSAgaSo4NiB8IHg4NiB8IGlhMzIpCi0gICAgQUNfTVNHX1JFU1VMVCh5ZXMpCi0gIDs7Ci0gIHg4Nl82NCB8IGFtZDY0IHwgYWE2NCkKLSAgICBBQ19NU0dfUkVTVUxUKFtubyAoeDg2XzY0KV0pCi0gICAgQUNfTVNHX0VSUk9SKFtDdXJyZW50bHksIHRoaXMgdmVyc2lvbiBvZiBKUEVHIGxpYnJhcnkgY2Fubm90IGJlIGNvbXBpbGVkIGFzIDY0LWJpdCBjb2RlLiBzb3JyeS5dKQotICA7OwotICAqKQotICAgIEFDX01TR19SRVNVTFQoW25vICgiJGhvc3RfY3B1IildKQotICAgIEFDX01TR19FUlJPUihbVGhpcyB2ZXJzaW9uIG9mIEpQRUcgbGlicmFyeSBpcyBmb3IgaTM4NiBvciBjb21wYXRpYmxlIHByb2Nlc3NvcnMgb25seS5dKQotICA7OwotZXNhYwotCi1pZiB0ZXN0IC16ICIkTkFGTEFHUyIgOyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIG9iamVjdCBmaWxlIGZvcm1hdCBvZiBob3N0IHN5c3RlbV0pCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGludGVyaXgqKQotICAgICAgb2JqZm10PSdXaW4zMi1DT0ZGJwotICAgIDs7Ci0gICAgbXNkb3NkamdwcCogfCBnbzMyKikKLSAgICAgIG9iamZtdD0nQ09GRicKLSAgICA7OwotICAgIG9zMi1lbXgqKQkJCSMgbm90IHRlc3RlZAotICAgICAgb2JqZm10PSdNU09NRicJCSMgb2JqCi0gICAgOzsKLSAgICBsaW51eCpjb2ZmKiB8IGxpbnV4Km9sZGxkKikKLSAgICAgIG9iamZtdD0nQ09GRicJCSMgPz8/Ci0gICAgOzsKLSAgICBsaW51eCphb3V0KikKLSAgICAgIG9iamZtdD0nYS5vdXQnCi0gICAgOzsKLSAgICBsaW51eCopCi0gICAgICBvYmpmbXQ9J0VMRicKLSAgICA7OwotICAgIGZyZWVic2QqIHwgbmV0YnNkKiB8IG9wZW5ic2QqKQotICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KLSAgICAgICAgb2JqZm10PSdCU0QtYS5vdXQnCi0gICAgICBlbHNlCi0gICAgICAgIG9iamZtdD0nRUxGJwotICAgICAgZmkKLSAgICA7OwotICAgIHNvbGFyaXMqIHwgc3Vub3MqIHwgc3lzdiogfCBzY28qKQotICAgICAgb2JqZm10PSdFTEYnCi0gICAgOzsKLSAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqIHwgbmV4dHN0ZXAqIHwgb3BlbnN0ZXAqIHwgbWFjb3MqKQotICAgICAgb2JqZm10PSdNYWNoLU8nCi0gICAgOzsKLSAgICAqKQotICAgICAgb2JqZm10PSdFTEYgPycKLSAgICA7OwotICBlc2FjCi0gIEFDX01TR19SRVNVTFQoWyRvYmpmbXRdKQotICBpZiB0ZXN0ICIkb2JqZm10IiA9ICdFTEYgPyc7IHRoZW4KLSAgICBvYmpmbXQ9J0VMRicKLSAgICBBQ19NU0dfV0FSTihbdW5leHBlY3RlZCBob3N0IHN5c3RlbS4gYXNzdW1lZCB0aGF0IHRoZSBmb3JtYXQgaXMgJG9iamZtdC5dKQotICBmaQotZWxzZQotICBvYmpmbXQ9JycKLWZpCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBvYmplY3QgZmlsZSBmb3JtYXQgc3BlY2lmaWVyIChOQUZMQUdTKSBdKQotY2FzZSAiJG9iamZtdCIgaW4KLSAgTVNPTUYpICAgICAgTkFGTEFHUz0nLWZvYmogLURPQkozMic7OwotICBXaW4zMi1DT0ZGKSBOQUZMQUdTPSctZndpbjMyIC1EV0lOMzInOzsKLSAgQ09GRikgICAgICAgTkFGTEFHUz0nLWZjb2ZmIC1EQ09GRic7OwotICBhLm91dCkgICAgICBOQUZMQUdTPSctZmFvdXQgLURBT1VUJzs7Ci0gIEJTRC1hLm91dCkgIE5BRkxBR1M9Jy1mYW91dGIgLURBT1VUJzs7Ci0gIEVMRikgICAgICAgIE5BRkxBR1M9Jy1mZWxmIC1ERUxGJzs7Ci0gIFJERikgICAgICAgIE5BRkxBR1M9Jy1mcmRmIC1EUkRGJzs7Ci0gIE1hY2gtTykgICAgIE5BRkxBR1M9Jy1mbWFjaG8gLURNQUNITyc7OwotZXNhYwotQUNfTVNHX1JFU1VMVChbJE5BRkxBR1NdKQotQUNfU1VCU1QoW05BRkxBR1NdKQotCi1kbmwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQUNfQ0hFQ0tfUFJPR1MoTkFTTSwgW25hc20gbmFzbXddKQotdGVzdCAteiAiJE5BU00iICYmIEFDX01TR19FUlJPUihbbm8gbmFzbSAoTmV0d2lkZSBBc3NlbWJsZXIpIGZvdW5kIGluIFwkUEFUSF0pCi1pZiBlY2hvICIkTkFTTSIgfCBncmVwIHlhc20gPiAvZGV2L251bGw7IHRoZW4KLSAgQUNfTVNHX1dBUk4oW0RPTidUIFVTRSBZQVNNISBDVVJSRU5UIFZFUlNJT04gKFIwLjQuMCkgSVMgQlVHR1khXSkKLWZpCi0KLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgYXNzZW1ibGVyICgkTkFTTSAkTkFGTEFHUykgd29ya3NdKQotY2F0ID4gY29uZnRlc3QuYXNtIDw8RU9GCi1bJWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiCi0gICAgICAgIHNlY3Rpb24gLnRleHQKLSAgICAgICAgYml0cyAgICAzMgotICAgICAgICBnbG9iYWwgIF9tYWluLG1haW4KLV9tYWluOgotbWFpbjogICB4b3IgICAgIGVheCxlYXgKLSAgICAgICAgcmV0Ci1dRU9GCi10cnlfbmFzbT0nJE5BU00gJE5BRkxBR1MgLW8gY29uZnRlc3QubyBjb25mdGVzdC5hc20nCi1pZiBBQ19UUllfRVZBTCh0cnlfbmFzbSkgJiYgdGVzdCAtcyBjb25mdGVzdC5vOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoeWVzKQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLSAgY2F0IGNvbmZ0ZXN0LmFzbSA+JkFDX0ZEX0NDCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQUNfTVNHX1JFU1VMVChubykKLSAgQUNfTVNHX0VSUk9SKFtpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBhc3NlbWJsZXIgY2Fubm90IGNyZWF0ZSBvYmplY3QgZmlsZXMuXSkKLWZpCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIGxpbmtlciBhY2NlcHRzIGFzc2VtYmxlciBvdXRwdXRdKQotdHJ5X25hc209JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRMREZMQUdTIGNvbmZ0ZXN0Lm8gJExJQlMgMT4mQUNfRkRfQ0MnCi1pZiBBQ19UUllfRVZBTCh0cnlfbmFzbSkgJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIEFDX01TR19SRVNVTFQoeWVzKQotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIEFDX01TR19SRVNVTFQobm8pCi0gIEFDX01TR19FUlJPUihbY29uZmlndXJhdGlvbiBwcm9ibGVtOiBtYXliZSBvYmplY3QgZmlsZSBmb3JtYXQgbWlzbWF0Y2guXSkKLWZpCi0KLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgYXNzZW1ibGVyIHN1cHBvcnRzIGxpbmUgY29udGludWF0aW9uIGNoYXJhY3Rlcl0pCi1jYXQgPiBjb25mdGVzdC5hc20gPDxcRU9GCi1bJWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiCi07IFRoZSBsaW5lIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXIgJ1wnCi07IHdhcyBpbnRyb2R1Y2VkIGluIG5hc20gMC45OC4yNS4KLSAgICAgICAgc2VjdGlvbiAudGV4dAotICAgICAgICBiaXRzICAgIDMyCi0gICAgICAgIGdsb2JhbCAgX3plcm8KLV96ZXJvOiAgeG9yICAgICBcCi0gICAgICAgICAgICAgICAgZWF4LGVheAotICAgICAgICByZXQKLV1FT0YKLXRyeV9uYXNtPSckTkFTTSAkTkFGTEFHUyAtbyBjb25mdGVzdC5vIGNvbmZ0ZXN0LmFzbScKLWlmIEFDX1RSWV9FVkFMKHRyeV9uYXNtKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0Lm87IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBBQ19NU0dfUkVTVUxUKHllcykKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0gIGNhdCBjb25mdGVzdC5hc20gPiZBQ19GRF9DQwotICBybSAtcmYgY29uZnRlc3QqCi0gIEFDX01TR19SRVNVTFQobm8pCi0gIEFDX01TR19FUlJPUihbeW91IGhhdmUgdG8gdXNlIGEgbW9yZSByZWNlbnQgdmVyc2lvbiBvZiB0aGUgYXNzZW1ibGVyLl0pCi1maQotCi1kbmwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQUNfTVNHX0NIRUNLSU5HKFtTSU1EIGluc3RydWN0aW9uIHNldHMgcmVxdWVzdGVkIHRvIHVzZV0pCi1zaW1kX3RvX3VzZT0iIgotCi1BQ19BUkdfRU5BQkxFKG1teCwKLVsgIC0tZGlzYWJsZS1tbXggICAgICAgICAgIGRvIG5vdCB1c2UgTU1YIGluc3RydWN0aW9uIHNldF0sCi1baWYgdGVzdCAieCRlbmFibGV2YWwiID0geG5vOyB0aGVuCi0gIEFDX0RFRklORShbSlNJTURfTU1YX05PVF9TVVBQT1JURURdLCkKLWVsc2UKLSAgc2ltZF90b191c2U9IiRzaW1kX3RvX3VzZSBNTVgiCi1maV0sIFtzaW1kX3RvX3VzZT0iJHNpbWRfdG9fdXNlIE1NWCJdKQotCi1BQ19BUkdfRU5BQkxFKDNkbm93LAotWyAgLS1kaXNhYmxlLTNkbm93ICAgICAgICAgZG8gbm90IHVzZSAzRE5vdyEgaW5zdHJ1Y3Rpb24gc2V0XSwKLVtpZiB0ZXN0ICJ4JGVuYWJsZXZhbCIgPSB4bm87IHRoZW4KLSAgQUNfREVGSU5FKFtKU0lNRF8zRE5PV19OT1RfU1VQUE9SVEVEXSwpCi1lbHNlCi0gIHNpbWRfdG9fdXNlPSIkc2ltZF90b191c2UgM0ROb3chIgotZmldLCBbc2ltZF90b191c2U9IiRzaW1kX3RvX3VzZSAzRE5vdyEiXSkKLQotQUNfQVJHX0VOQUJMRShzc2UsCi1bICAtLWRpc2FibGUtc3NlICAgICAgICAgICBkbyBub3QgdXNlIFNTRSBpbnN0cnVjdGlvbiBzZXRdLAotW2lmIHRlc3QgIngkZW5hYmxldmFsIiA9IHhubzsgdGhlbgotICBBQ19ERUZJTkUoW0pTSU1EX1NTRV9OT1RfU1VQUE9SVEVEXSwpCi1lbHNlCi0gIHNpbWRfdG9fdXNlPSIkc2ltZF90b191c2UgU1NFIgotZmldLCBbc2ltZF90b191c2U9IiRzaW1kX3RvX3VzZSBTU0UiXSkKLQotQUNfQVJHX0VOQUJMRShzc2UyLAotWyAgLS1kaXNhYmxlLXNzZTIgICAgICAgICAgZG8gbm90IHVzZSBTU0UyIGluc3RydWN0aW9uIHNldF0sCi1baWYgdGVzdCAieCRlbmFibGV2YWwiID0geG5vOyB0aGVuCi0gIEFDX0RFRklORShbSlNJTURfU1NFMl9OT1RfU1VQUE9SVEVEXSwpCi1lbHNlCi0gIHNpbWRfdG9fdXNlPSIkc2ltZF90b191c2UgU1NFMiIKLWZpXSwgW3NpbWRfdG9fdXNlPSIkc2ltZF90b191c2UgU1NFMiJdKQotCi10ZXN0IC16ICIkc2ltZF90b191c2UiICYmIHNpbWRfdG9fdXNlPSJOT05FIgotQUNfTVNHX1JFU1VMVChbJHNpbWRfdG9fdXNlXSkKLQotZm9yIHNpbWRfbmFtZSBpbiAkc2ltZF90b191c2U7IGRvCi1jYXNlICIkc2ltZF9uYW1lIiBpbgotICBNTVgpICAgIHNpbWRfaW5zdHJ1Y3Rpb249J3BzdWJ3IG1tMCxtbTAnOzsKLSAgM0ROb3chKSBzaW1kX2luc3RydWN0aW9uPSdwZnN1YiBtbTAsbW0wJzs7Ci0gIFNTRSkgICAgc2ltZF9pbnN0cnVjdGlvbj0nc3VicHMgeG1tMCx4bW0wJzs7Ci0gIFNTRTIpICAgc2ltZF9pbnN0cnVjdGlvbj0nc3VicGQgeG1tMCx4bW0wJzs7Ci0gICopICAgICAgY29udGludWU7OwotZXNhYwotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBhc3NlbWJsZXIgc3VwcG9ydHMgJHNpbWRfbmFtZSBpbnN0cnVjdGlvbnNdKQotY2F0ID4gY29uZnRlc3QuYXNtIDw8RU9GCi1bJWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiCi0gICAgICAgIHNlY3Rpb24gLnRleHQKLSAgICAgICAgYml0cyAgICAzMgotICAgICAgICBnbG9iYWwgIF9zaW1kCi1fc2ltZDogICRzaW1kX2luc3RydWN0aW9uCi0gICAgICAgIHJldAotXUVPRgotdHJ5X25hc209JyROQVNNICROQUZMQUdTIC1vIGNvbmZ0ZXN0Lm8gY29uZnRlc3QuYXNtJwotaWYgQUNfVFJZX0VWQUwodHJ5X25hc20pICYmIHRlc3QgLXMgY29uZnRlc3QubzsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIEFDX01TR19SRVNVTFQoeWVzKQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLSAgY2F0IGNvbmZ0ZXN0LmFzbSA+JkFDX0ZEX0NDCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQUNfTVNHX1JFU1VMVChubykKLSAgQUNfTVNHX0VSUk9SKFt5b3UgaGF2ZSB0byB1c2UgYSBtb3JlIHJlY2VudCB2ZXJzaW9uIG9mIHRoZSBhc3NlbWJsZXIuXSkKLWZpCi1kb25lCi0KLWRubCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTZWxlY3QgT1MtZGVwZW5kZW50IFNJTUQgaW5zdHJ1Y3Rpb24gc3VwcG9ydCBjaGVja2VyLgotIyBqc2ltZHczMi4kKE8pIChXaW4zMikgLyBqc2ltZGRqZy4kKE8pIChESkdQUCBWLjIpIC8ganNpbWRnY2MuJChPKSAoVW5peC9nY2MpCi1pZiB0ZXN0ICJ4JFNJTURDSEVDS0VSIiA9IHggOyB0aGVuCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGludGVyaXgqKQotICAgICAgU0lNRENIRUNLRVI9J2pzaW1kdzMyLiQoTyknCi0gICAgOzsKLSAgICBtc2Rvc2RqZ3BwKiB8IGdvMzIqKQotICAgICAgU0lNRENIRUNLRVI9J2pzaW1kZGpnLiQoTyknCi0gICAgOzsKLSAgICBvczItZW14KikJCQkjIG5vdCB0ZXN0ZWQKLSAgICAgIFNJTURDSEVDS0VSPSdqc2ltZGdjYy4kKE8pJwotICAgIDs7Ci0gICAgKikKLSAgICAgIFNJTURDSEVDS0VSPSdqc2ltZGdjYy4kKE8pJwotICAgIDs7Ci0gIGVzYWMKLWZpCi1BQ19TVUJTVChbU0lNRENIRUNLRVJdKQotCi1jYXNlICIkaG9zdF9vcyIgaW4KLSAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgb3MyLWVteCogfCBtc2Rvc2RqZ3BwKiB8IGdvMzIqKQotICAgIEFDX0RFRklORShbVVNFX1NFVE1PREVdLCkKLSAgOzsKLSMgX2hvc3RfbmFtZV8qKQotIyAgIEFDX0RFRklORShbVVNFX0ZET1BFTl0sKQotIyA7OwotZXNhYwotCi0jIFRoaXMgaXMgZm9yIFVOSVgtbGlrZSBlbnZpcm9ubWVudHMgb24gV2luZG93cyBwbGF0Zm9ybS4KLUFDX0FSR19FTkFCTEUodWNoYXItYm9vbGVhbiwKLVsgIC0tZW5hYmxlLXVjaGFyLWJvb2xlYW4gIGRlZmluZSB0eXBlIFwiYm9vbGVhblwiIGFzIHVuc2lnbmVkIGNoYXIgKGZvciBXaW5kb3dzKV0sCi1baWYgdGVzdCAieCRlbmFibGV2YWwiICE9IHhubzsgdGhlbgotICBBQ19ERUZJTkUoW1RZUEVERUZfVUNIQVJfQk9PTEVBTl0sKQotZmldKQotCi1kbmwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSlBFR19MSUJfVkVSU0lPTj0iNjM6MDoxIgotY29uZnZfZGlycz0iJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iCi1jb25maWdfdmVyPQotZm9yIGFjX2RpciBpbiAkY29uZnZfZGlyczsgZG8KLSAgaWYgdGVzdCAtciAkYWNfZGlyL2NvbmZpZy52ZXI7IHRoZW4KLSAgICBjb25maWdfdmVyPSRhY19kaXIvY29uZmlnLnZlcgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkY29uZmlnX3ZlciI7IHRoZW4KLSAgQUNfTVNHX1dBUk4oW2Nhbm5vdCBmaW5kIGNvbmZpZy52ZXIgaW4gJGNvbmZ2X2RpcnNdKQotICBBQ19NU0dfV0FSTihbZGVmYXVsdCB2ZXJzaW9uIG51bWJlciAkSlBFR19MSUJfVkVSU0lPTiBpcyB1c2VkXSkKLSAgQUNfTVNHX0NIRUNLSU5HKFtsaWJqcGVnIHZlcnNpb24gbnVtYmVyIGZvciBsaWJ0b29sXSkKLSAgQUNfTVNHX1JFU1VMVChbJEpQRUdfTElCX1ZFUlNJT05dKQotZWxzZQotICBBQ19NU0dfQ0hFQ0tJTkcoW2xpYmpwZWcgdmVyc2lvbiBudW1iZXIgZm9yIGxpYnRvb2xdKQotICAuICRjb25maWdfdmVyCi0gIEFDX01TR19SRVNVTFQoWyRKUEVHX0xJQl9WRVJTSU9OXSkKLSAgZWNobyAiY29uZmlndXJlOiBpZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIHZlcnNpb24gbnVtYmVyLCBtb2RpZnkgJGNvbmZpZ192ZXIiIDE+JjIKLWZpCi1BQ19TVUJTVChbSlBFR19MSUJfVkVSU0lPTl0pCi0KLWRubCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQcmVwYXJlIHRvIG1hc3NhZ2UgbWFrZWZpbGUuY2ZnIGNvcnJlY3RseS4KLWlmIHRlc3QgJGlqZ19jdl9oYXZlX3Byb3RvdHlwZXMgPSB5ZXM7IHRoZW4KLSAgQTJLX0RFUFM9IiIKLSAgQ09NX0EySz0iIyAiCi1lbHNlCi0gIEEyS19ERVBTPSJhbnNpMmtuciIKLSAgQ09NX0EySz0iIgotZmkKLUFDX1NVQlNUKFtBMktfREVQU10pCi1BQ19TVUJTVChbQ09NX0EyS10pCi0jIGFuc2kya25yIG5lZWRzIC1EQlNEIGlmIHN0cmluZy5oIGlzIG1pc3NpbmcKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdHJpbmdfaCA9IG5vOyB0aGVuCi0gIEFOU0kyS05SRkxBR1M9Ii1EQlNEIgotZWxzZQotICBBTlNJMktOUkZMQUdTPSIiCi1maQotQUNfU1VCU1QoW0FOU0kyS05SRkxBR1NdKQotIyBTdWJzdGl0dXRpb25zIHRvIGVuYWJsZSBvciBkaXNhYmxlIGxpYnRvb2wtcmVsYXRlZCBzdHVmZgotaWYgdGVzdCAkVVNFTElCVE9PTCA9IHllcyAtYSAkaWpnX2N2X2hhdmVfcHJvdG90eXBlcyA9IHllczsgdGhlbgotICBDT01fTFQ9IiIKLWVsc2UKLSAgQ09NX0xUPSIjICIKLWZpCi1BQ19TVUJTVChbQ09NX0xUXSkKLWlmIHRlc3QgIngkZW5hYmxlX3NoYXJlZCIgIT0geG5vOyB0aGVuCi0gIEZPUkNFX0lOU1RBTExfTElCPSJpbnN0YWxsLWxpYiIKLSAgVU5JTlNUQUxMX0xJQj0idW5pbnN0YWxsLWxpYiIKLWVsc2UKLSAgRk9SQ0VfSU5TVEFMTF9MSUI9IiIKLSAgVU5JTlNUQUxMX0xJQj0iIgotZmkKLUFDX1NVQlNUKFtGT1JDRV9JTlNUQUxMX0xJQl0pCi1BQ19TVUJTVChbVU5JTlNUQUxMX0xJQl0pCi0jIFNldCB1cCAtSSBkaXJlY3RpdmVzCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBJTkNMVURFRkxBR1M9Jy1JJChzcmNkaXIpJwotZWxzZQotICBJTkNMVURFRkxBR1M9Jy1JLiAtSSQoc3JjZGlyKScKLWZpCi1BQ19TVUJTVChbSU5DTFVERUZMQUdTXSkKLWRubCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfT1VUUFVUKFtNYWtlZmlsZTptYWtlZmlsZS5jZmddKQpkaWZmIC0tZ2l0IGEvZGpwZWcuMSBiL2RqcGVnLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYmViNmEuLjAwMDAwMDAKLS0tIGEvZGpwZWcuMQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0uVEggREpQRUcgMSAiMjIgQXVndXN0IDE5OTciCi0uU0ggTkFNRQotZGpwZWcgXC0gZGVjb21wcmVzcyBhIEpQRUcgZmlsZSB0byBhbiBpbWFnZSBmaWxlCi0uU0ggU1lOT1BTSVMKLS5CIGRqcGVnCi1bCi0uSSBvcHRpb25zCi1dCi1bCi0uSSBmaWxlbmFtZQotXQotLkxQCi0uU0ggREVTQ1JJUFRJT04KLS5MUAotLkIgZGpwZWcKLWRlY29tcHJlc3NlcyB0aGUgbmFtZWQgSlBFRyBmaWxlLCBvciB0aGUgc3RhbmRhcmQgaW5wdXQgaWYgbm8gZmlsZSBpcyBuYW1lZCwKLWFuZCBwcm9kdWNlcyBhbiBpbWFnZSBmaWxlIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuICBQQk1QTFVTIChQUE0vUEdNKSwgQk1QLAotR0lGLCBUYXJnYSwgb3IgUkxFIChVdGFoIFJhc3RlciBUb29sa2l0KSBvdXRwdXQgZm9ybWF0IGNhbiBiZSBzZWxlY3RlZC4KLShSTEUgaXMgc3VwcG9ydGVkIG9ubHkgaWYgdGhlIFVSVCBsaWJyYXJ5IGlzIGF2YWlsYWJsZS4pCi0uU0ggT1BUSU9OUwotQWxsIHN3aXRjaCBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQ7IGZvciBleGFtcGxlLAotLkIgXC1ncmF5c2NhbGUKLW1heSBiZSB3cml0dGVuCi0uQiBcLWdyYXkKLW9yCi0uQlIgXC1nciAuCi1Nb3N0IG9mIHRoZSAiYmFzaWMiIHN3aXRjaGVzIGNhbiBiZSBhYmJyZXZpYXRlZCB0byBhcyBsaXR0bGUgYXMgb25lIGxldHRlci4KLVVwcGVyIGFuZCBsb3dlciBjYXNlIGFyZSBlcXVpdmFsZW50ICh0aHVzCi0uQiBcLUJNUAotaXMgdGhlIHNhbWUgYXMKLS5CUiBcLWJtcCApLgotQnJpdGlzaCBzcGVsbGluZ3MgYXJlIGFsc28gYWNjZXB0ZWQgKGUuZy4sCi0uQlIgXC1ncmV5c2NhbGUgKSwKLXRob3VnaCBmb3IgYnJldml0eSB0aGVzZSBhcmUgbm90IG1lbnRpb25lZCBiZWxvdy4KLS5QUAotVGhlIGJhc2ljIHN3aXRjaGVzIGFyZToKLS5UUAotLkJJIFwtY29sb3JzICIgTiIKLVJlZHVjZSBpbWFnZSB0byBhdCBtb3N0IE4gY29sb3JzLiAgVGhpcyByZWR1Y2VzIHRoZSBudW1iZXIgb2YgY29sb3JzIHVzZWQgaW4KLXRoZSBvdXRwdXQgaW1hZ2UsIHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BsYXllZCBvbiBhIGNvbG9ybWFwcGVkIGRpc3BsYXkgb3IKLXN0b3JlZCBpbiBhIGNvbG9ybWFwcGVkIGZpbGUgZm9ybWF0LiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGFuIDgtYml0Ci1kaXNwbGF5LCB5b3UnZCBuZWVkIHRvIHJlZHVjZSB0byAyNTYgb3IgZmV3ZXIgY29sb3JzLgotLlRQCi0uQkkgXC1xdWFudGl6ZSAiIE4iCi1TYW1lIGFzCi0uQlIgXC1jb2xvcnMgLgotLkIgXC1jb2xvcnMKLWlzIHRoZSByZWNvbW1lbmRlZCBuYW1lLAotLkIgXC1xdWFudGl6ZQotaXMgcHJvdmlkZWQgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCi0uVFAKLS5CIFwtZmFzdAotU2VsZWN0IHJlY29tbWVuZGVkIHByb2Nlc3Npbmcgb3B0aW9ucyBmb3IgZmFzdCwgbG93IHF1YWxpdHkgb3V0cHV0LiAgKFRoZQotZGVmYXVsdCBvcHRpb25zIGFyZSBjaG9zZW4gZm9yIGhpZ2hlc3QgcXVhbGl0eSBvdXRwdXQuKSAgQ3VycmVudGx5LCB0aGlzIGlzCi1lcXVpdmFsZW50IHRvIFxmQlwtZGN0IGZhc3QgXC1ub3Ntb290aCBcLW9uZXBhc3MgXC1kaXRoZXIgb3JkZXJlZFxmUi4KLS5UUAotLkIgXC1ncmF5c2NhbGUKLUZvcmNlIGdyYXktc2NhbGUgb3V0cHV0IGV2ZW4gaWYgSlBFRyBmaWxlIGlzIGNvbG9yLiAgVXNlZnVsIGZvciB2aWV3aW5nIG9uCi1tb25vY2hyb21lIGRpc3BsYXlzOyBhbHNvLAotLkIgZGpwZWcKLXJ1bnMgbm90aWNlYWJseSBmYXN0ZXIgaW4gdGhpcyBtb2RlLgotLlRQCi0uQkkgXC1zY2FsZSAiIE0vTiIKLVNjYWxlIHRoZSBvdXRwdXQgaW1hZ2UgYnkgYSBmYWN0b3IgTS9OLiAgQ3VycmVudGx5IHRoZSBzY2FsZSBmYWN0b3IgbXVzdCBiZQotMS8xLCAxLzIsIDEvNCwgb3IgMS84LiAgU2NhbGluZyBpcyBoYW5keSBpZiB0aGUgaW1hZ2UgaXMgbGFyZ2VyIHRoYW4geW91cgotc2NyZWVuOyBhbHNvLAotLkIgZGpwZWcKLXJ1bnMgbXVjaCBmYXN0ZXIgd2hlbiBzY2FsaW5nIGRvd24gdGhlIG91dHB1dC4KLS5UUAotLkIgXC1ibXAKLVNlbGVjdCBCTVAgb3V0cHV0IGZvcm1hdCAoV2luZG93cyBmbGF2b3IpLiAgOC1iaXQgY29sb3JtYXBwZWQgZm9ybWF0IGlzCi1lbWl0dGVkIGlmCi0uQiBcLWNvbG9ycwotb3IKLS5CIFwtZ3JheXNjYWxlCi1pcyBzcGVjaWZpZWQsIG9yIGlmIHRoZSBKUEVHIGZpbGUgaXMgZ3JheS1zY2FsZTsgb3RoZXJ3aXNlLCAyNC1iaXQgZnVsbC1jb2xvcgotZm9ybWF0IGlzIGVtaXR0ZWQuCi0uVFAKLS5CIFwtZ2lmCi1TZWxlY3QgR0lGIG91dHB1dCBmb3JtYXQuICBTaW5jZSBHSUYgZG9lcyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gMjU2IGNvbG9ycywKLS5CIFwtY29sb3JzIDI1NgotaXMgYXNzdW1lZCAodW5sZXNzIHlvdSBzcGVjaWZ5IGEgc21hbGxlciBudW1iZXIgb2YgY29sb3JzKS4KLS5UUAotLkIgXC1vczIKLVNlbGVjdCBCTVAgb3V0cHV0IGZvcm1hdCAoT1MvMiAxLnggZmxhdm9yKS4gIDgtYml0IGNvbG9ybWFwcGVkIGZvcm1hdCBpcwotZW1pdHRlZCBpZgotLkIgXC1jb2xvcnMKLW9yCi0uQiBcLWdyYXlzY2FsZQotaXMgc3BlY2lmaWVkLCBvciBpZiB0aGUgSlBFRyBmaWxlIGlzIGdyYXktc2NhbGU7IG90aGVyd2lzZSwgMjQtYml0IGZ1bGwtY29sb3IKLWZvcm1hdCBpcyBlbWl0dGVkLgotLlRQCi0uQiBcLXBubQotU2VsZWN0IFBCTVBMVVMgKFBQTS9QR00pIG91dHB1dCBmb3JtYXQgKHRoaXMgaXMgdGhlIGRlZmF1bHQgZm9ybWF0KS4KLVBHTSBpcyBlbWl0dGVkIGlmIHRoZSBKUEVHIGZpbGUgaXMgZ3JheS1zY2FsZSBvciBpZgotLkIgXC1ncmF5c2NhbGUKLWlzIHNwZWNpZmllZDsgb3RoZXJ3aXNlIFBQTSBpcyBlbWl0dGVkLgotLlRQCi0uQiBcLXJsZQotU2VsZWN0IFJMRSBvdXRwdXQgZm9ybWF0LiAgKFJlcXVpcmVzIFVSVCBsaWJyYXJ5LikKLS5UUAotLkIgXC10YXJnYQotU2VsZWN0IFRhcmdhIG91dHB1dCBmb3JtYXQuICBHcmF5LXNjYWxlIGZvcm1hdCBpcyBlbWl0dGVkIGlmIHRoZSBKUEVHIGZpbGUgaXMKLWdyYXktc2NhbGUgb3IgaWYKLS5CIFwtZ3JheXNjYWxlCi1pcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSwgY29sb3JtYXBwZWQgZm9ybWF0IGlzIGVtaXR0ZWQgaWYKLS5CIFwtY29sb3JzCi1pcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSwgMjQtYml0IGZ1bGwtY29sb3IgZm9ybWF0IGlzIGVtaXR0ZWQuCi0uUFAKLVN3aXRjaGVzIGZvciBhZHZhbmNlZCB1c2VyczoKLS5UUAotLkIgXC1kY3QgaW50Ci1Vc2UgaW50ZWdlciBEQ1QgbWV0aG9kIChkZWZhdWx0KS4KLS5UUAotLkIgXC1kY3QgZmFzdAotVXNlIGZhc3QgaW50ZWdlciBEQ1QgKGxlc3MgYWNjdXJhdGUpLgotLlRQCi0uQiBcLWRjdCBmbG9hdAotVXNlIGZsb2F0aW5nLXBvaW50IERDVCBtZXRob2QuCi1UaGUgZmxvYXQgbWV0aG9kIGlzIHZlcnkgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSBpbnQgbWV0aG9kLCBidXQgaXMKLW11Y2ggc2xvd2VyIHVubGVzcyB5b3VyIG1hY2hpbmUgaGFzIHZlcnkgZmFzdCBmbG9hdGluZy1wb2ludCBoYXJkd2FyZS4gIEFsc28KLW5vdGUgdGhhdCByZXN1bHRzIG9mIHRoZSBmbG9hdGluZy1wb2ludCBtZXRob2QgbWF5IHZhcnkgc2xpZ2h0bHkgYWNyb3NzCi1tYWNoaW5lcywgd2hpbGUgdGhlIGludGVnZXIgbWV0aG9kcyBzaG91bGQgZ2l2ZSB0aGUgc2FtZSByZXN1bHRzIGV2ZXJ5d2hlcmUuCi1UaGUgZmFzdCBpbnRlZ2VyIG1ldGhvZCBpcyBtdWNoIGxlc3MgYWNjdXJhdGUgdGhhbiB0aGUgb3RoZXIgdHdvLgotLlRQCi0uQiBcLWRpdGhlciBmcwotVXNlIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcgaW4gY29sb3IgcXVhbnRpemF0aW9uLgotLlRQCi0uQiBcLWRpdGhlciBvcmRlcmVkCi1Vc2Ugb3JkZXJlZCBkaXRoZXJpbmcgaW4gY29sb3IgcXVhbnRpemF0aW9uLgotLlRQCi0uQiBcLWRpdGhlciBub25lCi1EbyBub3QgdXNlIGRpdGhlcmluZyBpbiBjb2xvciBxdWFudGl6YXRpb24uCi1CeSBkZWZhdWx0LCBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nIGlzIGFwcGxpZWQgd2hlbiBxdWFudGl6aW5nIGNvbG9yczsgdGhpcwotaXMgc2xvdyBidXQgdXN1YWxseSBwcm9kdWNlcyB0aGUgYmVzdCByZXN1bHRzLiAgT3JkZXJlZCBkaXRoZXIgaXMgYSBjb21wcm9taXNlCi1iZXR3ZWVuIHNwZWVkIGFuZCBxdWFsaXR5OyBubyBkaXRoZXJpbmcgaXMgZmFzdCBidXQgdXN1YWxseSBsb29rcyBhd2Z1bC4gIE5vdGUKLXRoYXQgdGhlc2Ugc3dpdGNoZXMgaGF2ZSBubyBlZmZlY3QgdW5sZXNzIGNvbG9yIHF1YW50aXphdGlvbiBpcyBiZWluZyBkb25lLgotT3JkZXJlZCBkaXRoZXIgaXMgb25seSBhdmFpbGFibGUgaW4KLS5CIFwtb25lcGFzcwotbW9kZS4KLS5UUAotLkJJIFwtbWFwICIgZmlsZSIKLVF1YW50aXplIHRvIHRoZSBjb2xvcnMgdXNlZCBpbiB0aGUgc3BlY2lmaWVkIGltYWdlIGZpbGUuICBUaGlzIGlzIHVzZWZ1bCBmb3IKLXByb2R1Y2luZyBtdWx0aXBsZSBmaWxlcyB3aXRoIGlkZW50aWNhbCBjb2xvciBtYXBzLCBvciBmb3IgZm9yY2luZyBhCi1wcmVkZWZpbmVkIHNldCBvZiBjb2xvcnMgdG8gYmUgdXNlZC4gIFRoZQotLkkgZmlsZQotbXVzdCBiZSBhIEdJRiBvciBQUE0gZmlsZS4gVGhpcyBvcHRpb24gb3ZlcnJpZGVzCi0uQiBcLWNvbG9ycwotYW5kCi0uQlIgXC1vbmVwYXNzIC4KLS5UUAotLkIgXC1ub3Ntb290aAotVXNlIGEgZmFzdGVyLCBsb3dlci1xdWFsaXR5IHVwc2FtcGxpbmcgcm91dGluZS4KLS5UUAotLkIgXC1vbmVwYXNzCi1Vc2Ugb25lLXBhc3MgaW5zdGVhZCBvZiB0d28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24uICBUaGUgb25lLXBhc3MgbWV0aG9kIGlzCi1mYXN0ZXIgYW5kIG5lZWRzIGxlc3MgbWVtb3J5LCBidXQgaXQgcHJvZHVjZXMgYSBsb3dlci1xdWFsaXR5IGltYWdlLgotLkIgXC1vbmVwYXNzCi1pcyBpZ25vcmVkIHVubGVzcyB5b3UgYWxzbyBzYXkKLS5CIFwtY29sb3JzCi0uSVIgTiAuCi1BbHNvLCB0aGUgb25lLXBhc3MgbWV0aG9kIGlzIGFsd2F5cyB1c2VkIGZvciBncmF5LXNjYWxlIG91dHB1dCAodGhlIHR3by1wYXNzCi1tZXRob2QgaXMgbm8gaW1wcm92ZW1lbnQgdGhlbikuCi0uVFAKLS5CSSBcLW1heG1lbW9yeSAiIE4iCi1TZXQgbGltaXQgZm9yIGFtb3VudCBvZiBtZW1vcnkgdG8gdXNlIGluIHByb2Nlc3NpbmcgbGFyZ2UgaW1hZ2VzLiAgVmFsdWUgaXMKLWluIHRob3VzYW5kcyBvZiBieXRlcywgb3IgbWlsbGlvbnMgb2YgYnl0ZXMgaWYgIk0iIGlzIGF0dGFjaGVkIHRvIHRoZQotbnVtYmVyLiAgRm9yIGV4YW1wbGUsCi0uQiBcLW1heCA0bQotc2VsZWN0cyA0MDAwMDAwIGJ5dGVzLiAgSWYgbW9yZSBzcGFjZSBpcyBuZWVkZWQsIHRlbXBvcmFyeSBmaWxlcyB3aWxsIGJlIHVzZWQuCi0uVFAKLS5CSSBcLW91dGZpbGUgIiBuYW1lIgotU2VuZCBvdXRwdXQgaW1hZ2UgdG8gdGhlIG5hbWVkIGZpbGUsIG5vdCB0byBzdGFuZGFyZCBvdXRwdXQuCi0uVFAKLS5CIFwtdmVyYm9zZQotRW5hYmxlIGRlYnVnIHByaW50b3V0LiAgTW9yZQotLkJSIFwtdiAncwotZ2l2ZSBtb3JlIG91dHB1dC4gIEFsc28sIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgcHJpbnRlZCBhdCBzdGFydHVwLgotLlRQCi0uQiBcLWRlYnVnCi1TYW1lIGFzCi0uQlIgXC12ZXJib3NlIC4KLS5TSCBFWEFNUExFUwotLkxQCi1UaGlzIGV4YW1wbGUgZGVjb21wcmVzc2VzIHRoZSBKUEVHIGZpbGUgZm9vLmpwZywgcXVhbnRpemVzIGl0IHRvCi0yNTYgY29sb3JzLCBhbmQgc2F2ZXMgdGhlIG91dHB1dCBpbiA4LWJpdCBCTVAgZm9ybWF0IGluIGZvby5ibXA6Ci0uSVAKLS5CIGRqcGVnIFwtY29sb3JzIDI1NiBcLWJtcAotLkkgZm9vLmpwZwotLkIgPgotLkkgZm9vLmJtcAotLlNIIEhJTlRTCi1UbyBnZXQgYSBxdWljayBwcmV2aWV3IG9mIGFuIGltYWdlLCB1c2UgdGhlCi0uQiBcLWdyYXlzY2FsZQotYW5kL29yCi0uQiBcLXNjYWxlCi1zd2l0Y2hlcy4KLS5CIFwtZ3JheXNjYWxlIFwtc2NhbGUgMS84Ci1pcyB0aGUgZmFzdGVzdCBjYXNlLgotLlBQCi1TZXZlcmFsIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB0aGF0IHRyYWRlIG9mZiBpbWFnZSBxdWFsaXR5IHRvIGdhaW4gc3BlZWQuCi0uQiBcLWZhc3QKLXR1cm5zIG9uIHRoZSByZWNvbW1lbmRlZCBzZXR0aW5ncy4KLS5QUAotLkIgXC1kY3QgZmFzdAotYW5kL29yCi0uQiBcLW5vc21vb3RoCi1nYWluIHNwZWVkIGF0IGEgc21hbGwgc2FjcmlmaWNlIGluIHF1YWxpdHkuCi1XaGVuIHByb2R1Y2luZyBhIGNvbG9yLXF1YW50aXplZCBpbWFnZSwKLS5CIFwtb25lcGFzcyBcLWRpdGhlciBvcmRlcmVkCi1pcyBmYXN0IGJ1dCBtdWNoIGxvd2VyIHF1YWxpdHkgdGhhbiB0aGUgZGVmYXVsdCBiZWhhdmlvci4KLS5CIFwtZGl0aGVyIG5vbmUKLW1heSBnaXZlIGFjY2VwdGFibGUgcmVzdWx0cyBpbiB0d28tcGFzcyBtb2RlLCBidXQgaXMgc2VsZG9tIHRvbGVyYWJsZSBpbgotb25lLXBhc3MgbW9kZS4KLS5QUAotSWYgeW91IGFyZSBmb3J0dW5hdGUgZW5vdWdoIHRvIGhhdmUgdmVyeSBmYXN0IGZsb2F0aW5nIHBvaW50IGhhcmR3YXJlLAotXGZCXC1kY3QgZmxvYXRcZlIgbWF5IGJlIGV2ZW4gZmFzdGVyIHRoYW4gXGZCXC1kY3QgZmFzdFxmUi4gIEJ1dCBvbiBtb3N0Ci1tYWNoaW5lcyBcZkJcLWRjdCBmbG9hdFxmUiBpcyBzbG93ZXIgdGhhbiBcZkJcLWRjdCBpbnRcZlI7IGluIHRoaXMgY2FzZSBpdCBpcwotbm90IHdvcnRoIHVzaW5nLCBiZWNhdXNlIGl0cyB0aGVvcmV0aWNhbCBhY2N1cmFjeSBhZHZhbnRhZ2UgaXMgdG9vIHNtYWxsIHRvIGJlCi1zaWduaWZpY2FudCBpbiBwcmFjdGljZS4KLS5TSCBFTlZJUk9OTUVOVAotLlRQCi0uQiBKUEVHTUVNCi1JZiB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCwgaXRzIHZhbHVlIGlzIHRoZSBkZWZhdWx0IG1lbW9yeSBsaW1pdC4KLVRoZSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXMgZGVzY3JpYmVkIGZvciB0aGUKLS5CIFwtbWF4bWVtb3J5Ci1zd2l0Y2guCi0uQiBKUEVHTUVNCi1vdmVycmlkZXMgdGhlIGRlZmF1bHQgdmFsdWUgc3BlY2lmaWVkIHdoZW4gdGhlIHByb2dyYW0gd2FzIGNvbXBpbGVkLCBhbmQKLWl0c2VsZiBpcyBvdmVycmlkZGVuIGJ5IGFuIGV4cGxpY2l0Ci0uQlIgXC1tYXhtZW1vcnkgLgotLlNIIFNFRSBBTFNPCi0uQlIgY2pwZWcgKDEpLAotLkJSIGpwZWd0cmFuICgxKSwKLS5CUiByZGpwZ2NvbSAoMSksCi0uQlIgd3JqcGdjb20gKDEpCi0uYnIKLS5CUiBwcG0gKDUpLAotLkJSIHBnbSAoNSkKLS5icgotV2FsbGFjZSwgR3JlZ29yeSBLLiAgIlRoZSBKUEVHIFN0aWxsIFBpY3R1cmUgQ29tcHJlc3Npb24gU3RhbmRhcmQiLAotQ29tbXVuaWNhdGlvbnMgb2YgdGhlIEFDTSwgQXByaWwgMTk5MSAodm9sLiAzNCwgbm8uIDQpLCBwcC4gMzAtNDQuCi0uU0ggQVVUSE9SCi1JbmRlcGVuZGVudCBKUEVHIEdyb3VwCi0uU0ggQlVHUwotQXJpdGhtZXRpYyBjb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBmb3IgbGVnYWwgcmVhc29ucy4KLS5QUAotVG8gYXZvaWQgdGhlIFVuaXN5cyBMWlcgcGF0ZW50LAotLkIgZGpwZWcKLXByb2R1Y2VzIHVuY29tcHJlc3NlZCBHSUYgZmlsZXMuICBUaGVzZSBhcmUgbGFyZ2VyIHRoYW4gdGhleSBzaG91bGQgYmUsIGJ1dAotYXJlIHJlYWRhYmxlIGJ5IHN0YW5kYXJkIEdJRiBkZWNvZGVycy4KLS5QUAotU3RpbGwgbm90IGFzIGZhc3QgYXMgd2UnZCBsaWtlLgpkaWZmIC0tZ2l0IGEvZGpwZWcuYyBiL2RqcGVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZWMwNTkuLjAwMDAwMDAKLS0tIGEvZGpwZWcuYworKysgL2Rldi9udWxsCkBAIC0xLDY4NCArMCwwIEBACi0vKgotICogZGpwZWcuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi0gKiBUaGlzIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgZm9yIFNJTUQgZXh0ZW5zaW9uLgotICogTGFzdCBNb2RpZmllZCA6IEF1Z3VzdCAyMywgMjAwNQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgY29tbWFuZC1saW5lIHVzZXIgaW50ZXJmYWNlIGZvciB0aGUgSlBFRyBkZWNvbXByZXNzb3IuCi0gKiBJdCBzaG91bGQgd29yayBvbiBhbnkgc3lzdGVtIHdpdGggVW5peC0gb3IgTVMtRE9TLXN0eWxlIGNvbW1hbmQgbGluZXMuCi0gKgotICogVHdvIGRpZmZlcmVudCBjb21tYW5kIGxpbmUgc3R5bGVzIGFyZSBwZXJtaXR0ZWQsIGRlcGVuZGluZyBvbiB0aGUKLSAqIGNvbXBpbGUtdGltZSBzd2l0Y2ggVFdPX0ZJTEVfQ09NTUFORExJTkU6Ci0gKglkanBlZyBbb3B0aW9uc10gIGlucHV0ZmlsZSBvdXRwdXRmaWxlCi0gKglkanBlZyBbb3B0aW9uc10gIFtpbnB1dGZpbGVdCi0gKiBJbiB0aGUgc2Vjb25kIHN0eWxlLCBvdXRwdXQgaXMgYWx3YXlzIHRvIHN0YW5kYXJkIG91dHB1dCwgd2hpY2ggeW91J2QKLSAqIG5vcm1hbGx5IHJlZGlyZWN0IHRvIGEgZmlsZSBvciBwaXBlIHRvIHNvbWUgb3RoZXIgcHJvZ3JhbS4gIElucHV0IGlzCi0gKiBlaXRoZXIgZnJvbSBhIG5hbWVkIGZpbGUgb3IgZnJvbSBzdGFuZGFyZCBpbnB1dCAodHlwaWNhbGx5IHJlZGlyZWN0ZWQpLgotICogVGhlIHNlY29uZCBzdHlsZSBpcyBjb252ZW5pZW50IG9uIFVuaXggYnV0IGlzIHVuaGVscGZ1bCBvbiBzeXN0ZW1zIHRoYXQKLSAqIGRvbid0IHN1cHBvcnQgcGlwZXMuICBBbHNvLCB5b3UgTVVTVCB1c2UgdGhlIGZpcnN0IHN0eWxlIGlmIHlvdXIgc3lzdGVtCi0gKiBkb2Vzbid0IGRvIGJpbmFyeSBJL08gdG8gc3RkaW4vc3Rkb3V0LgotICogVG8gc2ltcGxpZnkgc2NyaXB0IHdyaXRpbmcsIHRoZSAiLW91dGZpbGUiIHN3aXRjaCBpcyBwcm92aWRlZC4gIFRoZSBzeW50YXgKLSAqCWRqcGVnIFtvcHRpb25zXSAgLW91dGZpbGUgb3V0cHV0ZmlsZSAgaW5wdXRmaWxlCi0gKiB3b3JrcyByZWdhcmRsZXNzIG9mIHdoaWNoIGNvbW1hbmQgbGluZSBzdHlsZSBpcyB1c2VkLgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0jaW5jbHVkZSAianZlcnNpb24uaCIJCS8qIGZvciB2ZXJzaW9uIG1lc3NhZ2UgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+CQkvKiB0byBkZWNsYXJlIGlzcHJpbnQoKSAqLwotCi0jaWZkZWYgVVNFX0NDT01NQU5ECQkvKiBjb21tYW5kLWxpbmUgcmVhZGVyIGZvciBNYWNpbnRvc2ggKi8KLSNpZmRlZiBfX01XRVJLU19fCi0jaW5jbHVkZSA8U0lPVVguaD4gICAgICAgICAgICAgIC8qIE1ldHJvd2Vya3MgbmVlZHMgdGhpcyAqLwotI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIC4uLiBhbmQgdGhpcyAqLwotI2VuZGlmCi0jaWZkZWYgVEhJTktfQwotI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIFRoaW5rIGRlY2xhcmVzIGl0IGhlcmUgKi8KLSNlbmRpZgotI2VuZGlmCi0KLQotLyogQ3JlYXRlIHRoZSBhZGQtb24gbWVzc2FnZSBzdHJpbmcgdGFibGUuICovCi0KLSNkZWZpbmUgSk1FU1NBR0UoY29kZSxzdHJpbmcpCXN0cmluZyAsCi0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2RqcGVnX21lc3NhZ2VfdGFibGVbXSA9IHsKLSNpbmNsdWRlICJjZGVycm9yLmgiCi0gIE5VTEwKLX07Ci0KLQotLyoKLSAqIFRoaXMgbGlzdCBkZWZpbmVzIHRoZSBrbm93biBvdXRwdXQgaW1hZ2UgZm9ybWF0cwotICogKG5vdCBhbGwgb2Ygd2hpY2ggbmVlZCBiZSBzdXBwb3J0ZWQgYnkgYSBnaXZlbiB2ZXJzaW9uKS4KLSAqIFlvdSBjYW4gY2hhbmdlIHRoZSBkZWZhdWx0IG91dHB1dCBmb3JtYXQgYnkgZGVmaW5pbmcgREVGQVVMVF9GTVQ7Ci0gKiBpbmRlZWQsIHlvdSBoYWQgYmV0dGVyIGRvIHNvIGlmIHlvdSB1bmRlZmluZSBQUE1fU1VQUE9SVEVELgotICovCi0KLXR5cGVkZWYgZW51bSB7Ci0JRk1UX0JNUCwJCS8qIEJNUCBmb3JtYXQgKFdpbmRvd3MgZmxhdm9yKSAqLwotCUZNVF9HSUYsCQkvKiBHSUYgZm9ybWF0ICovCi0JRk1UX09TMiwJCS8qIEJNUCBmb3JtYXQgKE9TLzIgZmxhdm9yKSAqLwotCUZNVF9QUE0sCQkvKiBQUE0vUEdNIChQQk1QTFVTIGZvcm1hdHMpICovCi0JRk1UX1JMRSwJCS8qIFJMRSBmb3JtYXQgKi8KLQlGTVRfVEFSR0EsCQkvKiBUYXJnYSBmb3JtYXQgKi8KLQlGTVRfVElGRgkJLyogVElGRiBmb3JtYXQgKi8KLX0gSU1BR0VfRk9STUFUUzsKLQotI2lmbmRlZiBERUZBVUxUX0ZNVAkJLyogc28gY2FuIG92ZXJyaWRlIGZyb20gQ0ZMQUdTIGluIE1ha2VmaWxlICovCi0jZGVmaW5lIERFRkFVTFRfRk1UCUZNVF9QUE0KLSNlbmRpZgotCi1zdGF0aWMgSU1BR0VfRk9STUFUUyByZXF1ZXN0ZWRfZm10OwotCi0KLS8qCi0gKiBBcmd1bWVudC1wYXJzaW5nIGNvZGUuCi0gKiBUaGUgc3dpdGNoIHBhcnNlciBpcyBkZXNpZ25lZCB0byBiZSB1c2VmdWwgd2l0aCBET1Mtc3R5bGUgY29tbWFuZCBsaW5lCi0gKiBzeW50YXgsIGllLCBpbnRlcm1peGVkIHN3aXRjaGVzIGFuZCBmaWxlIG5hbWVzLCB3aGVyZSBvbmx5IHRoZSBzd2l0Y2hlcwotICogdG8gdGhlIGxlZnQgb2YgYSBnaXZlbiBmaWxlIG5hbWUgYWZmZWN0IHByb2Nlc3Npbmcgb2YgdGhhdCBmaWxlLgotICogVGhlIG1haW4gcHJvZ3JhbSBpbiB0aGlzIGZpbGUgZG9lc24ndCBhY3R1YWxseSB1c2UgdGhpcyBjYXBhYmlsaXR5Li4uCi0gKi8KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqIHByb2duYW1lOwkvKiBwcm9ncmFtIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCi1zdGF0aWMgY2hhciAqIG91dGZpbGVuYW1lOwkvKiBmb3IgLW91dGZpbGUgc3dpdGNoICovCi0KLQotTE9DQUwodm9pZCkKLXVzYWdlICh2b2lkKQotLyogY29tcGxhaW4gYWJvdXQgYmFkIGNvbW1hbmQgbGluZSAqLwotewotICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbc3dpdGNoZXNdICIsIHByb2duYW1lKTsKLSNpZmRlZiBUV09fRklMRV9DT01NQU5ETElORQotICBmcHJpbnRmKHN0ZGVyciwgImlucHV0ZmlsZSBvdXRwdXRmaWxlXG4iKTsKLSNlbHNlCi0gIGZwcmludGYoc3RkZXJyLCAiW2lucHV0ZmlsZV1cbiIpOwotI2VuZGlmCi0KLSAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyAobmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkKTpcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWNvbG9ycyBOICAgICAgUmVkdWNlIGltYWdlIHRvIG5vIG1vcmUgdGhhbiBOIGNvbG9yc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtZmFzdCAgICAgICAgICBGYXN0LCBsb3ctcXVhbGl0eSBwcm9jZXNzaW5nXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1ncmF5c2NhbGUgICAgIEZvcmNlIGdyYXlzY2FsZSBvdXRwdXRcbiIpOwotI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1zY2FsZSBNL04gICAgIFNjYWxlIG91dHB1dCBpbWFnZSBieSBmcmFjdGlvbiBNL04sIGVnLCAxLzhcbiIpOwotI2VuZGlmCi0jaWZkZWYgQk1QX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWJtcCAgICAgICAgICAgU2VsZWN0IEJNUCBvdXRwdXQgZm9ybWF0IChXaW5kb3dzIHN0eWxlKSVzXG4iLAotCSAgKERFRkFVTFRfRk1UID09IEZNVF9CTVAgPyAiIChkZWZhdWx0KSIgOiAiIikpOwotI2VuZGlmCi0jaWZkZWYgR0lGX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWdpZiAgICAgICAgICAgU2VsZWN0IEdJRiBvdXRwdXQgZm9ybWF0JXNcbiIsCi0JICAoREVGQVVMVF9GTVQgPT0gRk1UX0dJRiA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7Ci0jZW5kaWYKLSNpZmRlZiBCTVBfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtb3MyICAgICAgICAgICBTZWxlY3QgQk1QIG91dHB1dCBmb3JtYXQgKE9TLzIgc3R5bGUpJXNcbiIsCi0JICAoREVGQVVMVF9GTVQgPT0gRk1UX09TMiA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7Ci0jZW5kaWYKLSNpZmRlZiBQUE1fU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtcG5tICAgICAgICAgICBTZWxlY3QgUEJNUExVUyAoUFBNL1BHTSkgb3V0cHV0IGZvcm1hdCVzXG4iLAotCSAgKERFRkFVTFRfRk1UID09IEZNVF9QUE0gPyAiIChkZWZhdWx0KSIgOiAiIikpOwotI2VuZGlmCi0jaWZkZWYgUkxFX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJsZSAgICAgICAgICAgU2VsZWN0IFV0YWggUkxFIG91dHB1dCBmb3JtYXQlc1xuIiwKLQkgIChERUZBVUxUX0ZNVCA9PSBGTVRfUkxFID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKLSNlbmRpZgotI2lmZGVmIFRBUkdBX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXRhcmdhICAgICAgICAgU2VsZWN0IFRhcmdhIG91dHB1dCBmb3JtYXQlc1xuIiwKLQkgIChERUZBVUxUX0ZNVCA9PSBGTVRfVEFSR0EgPyAiIChkZWZhdWx0KSIgOiAiIikpOwotI2VuZGlmCi0gIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgZm9yIGFkdmFuY2VkIHVzZXJzOlxuIik7Ci0jaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRjdCBpbnQgICAgICAgVXNlIGludGVnZXIgRENUIG1ldGhvZCVzXG4iLAotCSAgKEpEQ1RfREVGQVVMVCA9PSBKRENUX0lTTE9XID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKLSNlbmRpZgotI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1kY3QgZmFzdCAgICAgIFVzZSBmYXN0IGludGVnZXIgRENUIChsZXNzIGFjY3VyYXRlKSVzXG4iLAotCSAgKEpEQ1RfREVGQVVMVCA9PSBKRENUX0lGQVNUID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKLSNlbmRpZgotI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1kY3QgZmxvYXQgICAgIFVzZSBmbG9hdGluZy1wb2ludCBEQ1QgbWV0aG9kJXNcbiIsCi0JICAoSkRDVF9ERUZBVUxUID09IEpEQ1RfRkxPQVQgPyAiIChkZWZhdWx0KSIgOiAiIikpOwotI2VuZGlmCi0gIGZwcmludGYoc3RkZXJyLCAiICAtZGl0aGVyIGZzICAgICBVc2UgRi1TIGRpdGhlcmluZyAoZGVmYXVsdClcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRpdGhlciBub25lICAgRG9uJ3QgdXNlIGRpdGhlcmluZyBpbiBxdWFudGl6YXRpb25cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRpdGhlciBvcmRlcmVkICBVc2Ugb3JkZXJlZCBkaXRoZXIgKG1lZGl1bSBzcGVlZCwgcXVhbGl0eSlcbiIpOwotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW1hcCBGSUxFICAgICAgTWFwIHRvIGNvbG9ycyB1c2VkIGluIG5hbWVkIGltYWdlIGZpbGVcbiIpOwotI2VuZGlmCi0gIGZwcmludGYoc3RkZXJyLCAiICAtbm9zbW9vdGggICAgICBEb24ndCB1c2UgaGlnaC1xdWFsaXR5IHVwc2FtcGxpbmdcbiIpOwotI2lmZGVmIFFVQU5UXzFQQVNTX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW9uZXBhc3MgICAgICAgVXNlIDEtcGFzcyBxdWFudGl6YXRpb24gKGZhc3QsIGxvdyBxdWFsaXR5KVxuIik7Ci0jZW5kaWYKLSAgZnByaW50ZihzdGRlcnIsICIgIC1tYXhtZW1vcnkgTiAgIE1heGltdW0gbWVtb3J5IHRvIHVzZSAoaW4ga2J5dGVzKVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtb3V0ZmlsZSBuYW1lICBTcGVjaWZ5IG5hbWUgZm9yIG91dHB1dCBmaWxlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC12ZXJib3NlICBvciAgLWRlYnVnICAgRW1pdCBkZWJ1ZyBvdXRwdXRcbiIpOwotICBleGl0KEVYSVRfRkFJTFVSRSk7Ci19Ci0KLQotI2lmbmRlZiBKU0lNRF9NT0RFSU5GT19OT1RfU1VQUE9SVEVECi0KLUxPQ0FMKHZvaWQpCi1wcmludF9zaW1kX2luZm8gKEZJTEUgKiBmaWxlLCBjaGFyICogbGFiZWxzdHIsIHVuc2lnbmVkIGludCBzaW1kKQotewotICBmcHJpbnRmKGZpbGUsICIlcyVzJXMlcyVzJXNcbiIsIGxhYmVsc3RyLAotCSAgc2ltZCAmIEpTSU1EX01NWCAgID8gIiBNTVgiICAgIDogIiIsCi0JICBzaW1kICYgSlNJTURfM0ROT1cgPyAiIDNETm93ISIgOiAiIiwKLQkgIHNpbWQgJiBKU0lNRF9TU0UgICA/ICIgU1NFIiAgICA6ICIiLAotCSAgc2ltZCAmIEpTSU1EX1NTRTIgID8gIiBTU0UyIiAgIDogIiIsCi0JICBzaW1kID09IEpTSU1EX05PTkUgPyAiIE5PTkUiICAgOiAiIik7Ci19Ci0KLSNlbmRpZiAvKiAhSlNJTURfTU9ERUlORk9fTk9UX1NVUFBPUlRFRCAqLwotCi0KLUxPQ0FMKGludCkKLXBhcnNlX3N3aXRjaGVzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCi0JCWludCBsYXN0X2ZpbGVfYXJnX3NlZW4sIGJvb2xlYW4gZm9yX3JlYWwpCi0vKiBQYXJzZSBvcHRpb25hbCBzd2l0Y2hlcy4KLSAqIFJldHVybnMgYXJndltdIGluZGV4IG9mIGZpcnN0IGZpbGUtbmFtZSBhcmd1bWVudCAoPT0gYXJnYyBpZiBub25lKS4KLSAqIEFueSBmaWxlIG5hbWVzIHdpdGggaW5kZXhlcyA8PSBsYXN0X2ZpbGVfYXJnX3NlZW4gYXJlIGlnbm9yZWQ7Ci0gKiB0aGV5IGhhdmUgcHJlc3VtYWJseSBiZWVuIHByb2Nlc3NlZCBpbiBhIHByZXZpb3VzIGl0ZXJhdGlvbi4KLSAqIChQYXNzIDAgZm9yIGxhc3RfZmlsZV9hcmdfc2VlbiBvbiB0aGUgZmlyc3Qgb3Igb25seSBpdGVyYXRpb24uKQotICogZm9yX3JlYWwgaXMgRkFMU0Ugb24gdGhlIGZpcnN0IChkdW1teSkgcGFzczsgd2UgbWF5IHNraXAgYW55IGV4cGVuc2l2ZQotICogcHJvY2Vzc2luZy4KLSAqLwotewotICBpbnQgYXJnbjsKLSAgY2hhciAqIGFyZzsKLQotICAvKiBTZXQgdXAgZGVmYXVsdCBKUEVHIHBhcmFtZXRlcnMuICovCi0gIHJlcXVlc3RlZF9mbXQgPSBERUZBVUxUX0ZNVDsJLyogc2V0IGRlZmF1bHQgb3V0cHV0IGZpbGUgZm9ybWF0ICovCi0gIG91dGZpbGVuYW1lID0gTlVMTDsKLSAgY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPSAwOwotCi0gIC8qIFNjYW4gY29tbWFuZCBsaW5lIG9wdGlvbnMsIGFkanVzdCBwYXJhbWV0ZXJzICovCi0KLSAgZm9yIChhcmduID0gMTsgYXJnbiA8IGFyZ2M7IGFyZ24rKykgewotICAgIGFyZyA9IGFyZ3ZbYXJnbl07Ci0gICAgaWYgKCphcmcgIT0gJy0nKSB7Ci0gICAgICAvKiBOb3QgYSBzd2l0Y2gsIG11c3QgYmUgYSBmaWxlIG5hbWUgYXJndW1lbnQgKi8KLSAgICAgIGlmIChhcmduIDw9IGxhc3RfZmlsZV9hcmdfc2VlbikgewotCW91dGZpbGVuYW1lID0gTlVMTDsJLyogLW91dGZpbGUgYXBwbGllcyB0byBqdXN0IG9uZSBpbnB1dCBmaWxlICovCi0JY29udGludWU7CQkvKiBpZ25vcmUgdGhpcyBuYW1lIGlmIHByZXZpb3VzbHkgcHJvY2Vzc2VkICovCi0gICAgICB9Ci0gICAgICBicmVhazsJCQkvKiBlbHNlIGRvbmUgcGFyc2luZyBzd2l0Y2hlcyAqLwotICAgIH0KLSAgICBhcmcrKzsJCQkvKiBhZHZhbmNlIHBhc3Qgc3dpdGNoIG1hcmtlciBjaGFyYWN0ZXIgKi8KLQotICAgIGlmIChrZXltYXRjaChhcmcsICJibXAiLCAxKSkgewotICAgICAgLyogQk1QIG91dHB1dCBmb3JtYXQuICovCi0gICAgICByZXF1ZXN0ZWRfZm10ID0gRk1UX0JNUDsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiY29sb3JzIiwgMSkgfHwga2V5bWF0Y2goYXJnLCAiY29sb3VycyIsIDEpIHx8Ci0JICAgICAgIGtleW1hdGNoKGFyZywgInF1YW50aXplIiwgMSkgfHwga2V5bWF0Y2goYXJnLCAicXVhbnRpc2UiLCAxKSkgewotICAgICAgLyogRG8gY29sb3IgcXVhbnRpemF0aW9uLiAqLwotICAgICAgaW50IHZhbDsKLQotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWQiLCAmdmFsKSAhPSAxKQotCXVzYWdlKCk7Ci0gICAgICBjaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzID0gdmFsOwotICAgICAgY2luZm8tPnF1YW50aXplX2NvbG9ycyA9IFRSVUU7Ci0KLSNpZm5kZWYgSlNJTURfTUFTS0ZVTkNfTk9UX1NVUFBPUlRFRAotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibm9zaW1kIiAsIDQpKSB7Ci0gICAgICBqcGVnX3NpbWRfbWFzaygoal9jb21tb25fcHRyKSBjaW5mbywgSlNJTURfTk9ORSwgSlNJTURfQUxMKTsKLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm5vbW14IiAgLCAzKSkgewotICAgICAganBlZ19zaW1kX21hc2soKGpfY29tbW9uX3B0cikgY2luZm8sIEpTSU1EX05PTkUsIEpTSU1EX01NWCk7Ci0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJubzNkbm93IiwgMykpIHsKLSAgICAgIGpwZWdfc2ltZF9tYXNrKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKU0lNRF9OT05FLCBKU0lNRF8zRE5PVyk7Ci0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJub3NzZSIgICwgNCkpIHsKLSAgICAgIGpwZWdfc2ltZF9tYXNrKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKU0lNRF9OT05FLCBKU0lNRF9TU0UpOwotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibm9zc2UyIiAsIDYpKSB7Ci0gICAgICBqcGVnX3NpbWRfbWFzaygoal9jb21tb25fcHRyKSBjaW5mbywgSlNJTURfTk9ORSwgSlNJTURfU1NFMik7Ci0jZW5kaWYgLyogIUpTSU1EX01BU0tGVU5DX05PVF9TVVBQT1JURUQgKi8KLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZGN0IiwgMikpIHsKLSAgICAgIC8qIFNlbGVjdCBJRENUIGFsZ29yaXRobS4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiaW50IiwgMSkpIHsKLQljaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfSVNMT1c7Ci0gICAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJmYXN0IiwgMikpIHsKLQljaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfSUZBU1Q7Ci0gICAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJmbG9hdCIsIDIpKSB7Ci0JY2luZm8tPmRjdF9tZXRob2QgPSBKRENUX0ZMT0FUOwotICAgICAgfSBlbHNlCi0JdXNhZ2UoKTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZGl0aGVyIiwgMikpIHsKLSAgICAgIC8qIFNlbGVjdCBkaXRoZXJpbmcgYWxnb3JpdGhtLiAqLwotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJmcyIsIDIpKSB7Ci0JY2luZm8tPmRpdGhlcl9tb2RlID0gSkRJVEhFUl9GUzsKLSAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgIm5vbmUiLCAyKSkgewotCWNpbmZvLT5kaXRoZXJfbW9kZSA9IEpESVRIRVJfTk9ORTsKLSAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgIm9yZGVyZWQiLCAyKSkgewotCWNpbmZvLT5kaXRoZXJfbW9kZSA9IEpESVRIRVJfT1JERVJFRDsKLSAgICAgIH0gZWxzZQotCXVzYWdlKCk7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImRlYnVnIiwgMSkgfHwga2V5bWF0Y2goYXJnLCAidmVyYm9zZSIsIDEpKSB7Ci0gICAgICAvKiBFbmFibGUgZGVidWcgcHJpbnRvdXRzLiAqLwotICAgICAgLyogT24gZmlyc3QgLWQsIHByaW50IHZlcnNpb24gaWRlbnRpZmljYXRpb24gKi8KLSAgICAgIHN0YXRpYyBib29sZWFuIHByaW50ZWRfdmVyc2lvbiA9IEZBTFNFOwotCi0gICAgICBpZiAoISBwcmludGVkX3ZlcnNpb24pIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBESlBFRywgdmVyc2lvbiAlc1xuJXNcbiIsCi0JCUpWRVJTSU9OLCBKQ09QWVJJR0hUKTsKLQlmcHJpbnRmKHN0ZGVyciwKLQkJIlxueDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5LCB2ZXJzaW9uICVzXG5cbiIsCi0JCUpQRUdfU0lNREVYVF9WRVJfU1RSKTsKLSNpZm5kZWYgSlNJTURfTU9ERUlORk9fTk9UX1NVUFBPUlRFRAotCXByaW50X3NpbWRfaW5mbyhzdGRlcnIsICJTSU1EIGluc3RydWN0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIHN5c3RlbSA6IiwKLQkJCWpwZWdfc2ltZF9zdXBwb3J0KE5VTEwpKTsKLQotCWZwcmludGYoc3RkZXJyLCAiXG4gICAgICA9PT0gU0lNRCBPcGVyYXRpb24gTW9kZXMgPT09XG4iKTsKLSNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECi0JcHJpbnRfc2ltZF9pbmZvKHN0ZGVyciwgIkFjY3VyYXRlIGludGVnZXIgRENUICAoLWRjdCBpbnQpICAgOiIsCi0JCQlqcGVnX3NpbWRfaW52ZXJzZV9kY3QoY2luZm8sIEpEQ1RfSVNMT1cpKTsKLSNlbmRpZgotI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKLQlwcmludF9zaW1kX2luZm8oc3RkZXJyLCAiRmFzdCBpbnRlZ2VyIERDVCAgICAgICgtZGN0IGZhc3QpICA6IiwKLQkJCWpwZWdfc2ltZF9pbnZlcnNlX2RjdChjaW5mbywgSkRDVF9JRkFTVCkpOwotI2VuZGlmCi0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotCXByaW50X3NpbWRfaW5mbyhzdGRlcnIsICJGbG9hdGluZy1wb2ludCBEQ1QgICAgKC1kY3QgZmxvYXQpIDoiLAotCQkJanBlZ19zaW1kX2ludmVyc2VfZGN0KGNpbmZvLCBKRENUX0ZMT0FUKSk7Ci0jZW5kaWYKLSNpZmRlZiBJRENUX1NDQUxJTkdfU1VQUE9SVEVECi0JcHJpbnRfc2ltZF9pbmZvKHN0ZGVyciwgIlJlZHVjZWQtc2l6ZSBEQ1QgICAgICAoLXNjYWxlIE0vTikgOiIsCi0JCQlqcGVnX3NpbWRfaW52ZXJzZV9kY3QoY2luZm8sIEpEQ1RfRkxPQVQrMSkpOwotI2VuZGlmCi0JcHJpbnRfc2ltZF9pbmZvKHN0ZGVyciwgIkhpZ2gtcXVhbGl0eSB1cHNhbXBsaW5nIChkZWZhdWx0KSAgOiIsCi0JCQlqcGVnX3NpbWRfdXBzYW1wbGVyKGNpbmZvLCBUUlVFKSk7Ci0JcHJpbnRfc2ltZF9pbmZvKHN0ZGVyciwgIkxvdy1xdWFsaXR5IHVwc2FtcGxpbmcgKC1ub3Ntb290aCkgOiIsCi0JCQlqcGVnX3NpbWRfdXBzYW1wbGVyKGNpbmZvLCBGQUxTRSkpOwotCXByaW50X3NpbWRfaW5mbyhzdGRlcnIsICJDb2xvcnNwYWNlIGNvbnZlcnNpb24gKFlDYkNyLT5SR0IpIDoiLAotCQkJanBlZ19zaW1kX2NvbG9yX2RlY29udmVydGVyKGNpbmZvKSk7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotI2VuZGlmIC8qICFKU0lNRF9NT0RFSU5GT19OT1RfU1VQUE9SVEVEICovCi0JcHJpbnRlZF92ZXJzaW9uID0gVFJVRTsKLSAgICAgIH0KLSAgICAgIGNpbmZvLT5lcnItPnRyYWNlX2xldmVsKys7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImZhc3QiLCAxKSkgewotICAgICAgLyogU2VsZWN0IHJlY29tbWVuZGVkIHByb2Nlc3Npbmcgb3B0aW9ucyBmb3IgcXVpY2stYW5kLWRpcnR5IG91dHB1dC4gKi8KLSAgICAgIGNpbmZvLT50d29fcGFzc19xdWFudGl6ZSA9IEZBTFNFOwotICAgICAgY2luZm8tPmRpdGhlcl9tb2RlID0gSkRJVEhFUl9PUkRFUkVEOwotICAgICAgaWYgKCEgY2luZm8tPnF1YW50aXplX2NvbG9ycykgLyogZG9uJ3Qgb3ZlcnJpZGUgYW4gZWFybGllciAtY29sb3JzICovCi0JY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9ycyA9IDIxNjsKLSAgICAgIGNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9GQVNURVNUOwotICAgICAgY2luZm8tPmRvX2ZhbmN5X3Vwc2FtcGxpbmcgPSBGQUxTRTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZ2lmIiwgMSkpIHsKLSAgICAgIC8qIEdJRiBvdXRwdXQgZm9ybWF0LiAqLwotICAgICAgcmVxdWVzdGVkX2ZtdCA9IEZNVF9HSUY7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImdyYXlzY2FsZSIsIDIpIHx8IGtleW1hdGNoKGFyZywgImdyZXlzY2FsZSIsMikpIHsKLSAgICAgIC8qIEZvcmNlIG1vbm9jaHJvbWUgb3V0cHV0LiAqLwotICAgICAgY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9IEpDU19HUkFZU0NBTEU7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm1hcCIsIDMpKSB7Ci0gICAgICAvKiBRdWFudGl6ZSB0byBhIGNvbG9yIG1hcCB0YWtlbiBmcm9tIGFuIGlucHV0IGZpbGUuICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBpZiAoZm9yX3JlYWwpIHsJCS8qIHRvbyBleHBlbnNpdmUgdG8gZG8gdHdpY2UhICovCi0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECS8qIG90aGVyd2lzZSBjYW4ndCBxdWFudGl6ZSB0byBzdXBwbGllZCBtYXAgKi8KLQlGSUxFICogbWFwZmlsZTsKLQotCWlmICgobWFwZmlsZSA9IGZvcGVuKGFyZ3ZbYXJnbl0sIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgewotCSAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbYXJnbl0pOwotCSAgZXhpdChFWElUX0ZBSUxVUkUpOwotCX0KLQlyZWFkX2NvbG9yX21hcChjaW5mbywgbWFwZmlsZSk7Ci0JZmNsb3NlKG1hcGZpbGUpOwotCWNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgPSBUUlVFOwotI2Vsc2UKLQlFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgICAgIH0KLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibWF4bWVtb3J5IiwgMykpIHsKLSAgICAgIC8qIE1heGltdW0gbWVtb3J5IGluIEtiIChvciBNYiB3aXRoICdtJykuICovCi0gICAgICBsb25nIGx2YWw7Ci0gICAgICBjaGFyIGNoID0gJ3gnOwotCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlbGQlYyIsICZsdmFsLCAmY2gpIDwgMSkKLQl1c2FnZSgpOwotICAgICAgaWYgKGNoID09ICdtJyB8fCBjaCA9PSAnTScpCi0JbHZhbCAqPSAxMDAwTDsKLSAgICAgIGNpbmZvLT5tZW0tPm1heF9tZW1vcnlfdG9fdXNlID0gbHZhbCAqIDEwMDBMOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJub3Ntb290aCIsIDMpKSB7Ci0gICAgICAvKiBTdXBwcmVzcyBmYW5jeSB1cHNhbXBsaW5nICovCi0gICAgICBjaW5mby0+ZG9fZmFuY3lfdXBzYW1wbGluZyA9IEZBTFNFOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJvbmVwYXNzIiwgMykpIHsKLSAgICAgIC8qIFVzZSBmYXN0IG9uZS1wYXNzIHF1YW50aXphdGlvbi4gKi8KLSAgICAgIGNpbmZvLT50d29fcGFzc19xdWFudGl6ZSA9IEZBTFNFOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJvczIiLCAzKSkgewotICAgICAgLyogQk1QIG91dHB1dCBmb3JtYXQgKE9TLzIgZmxhdm9yKS4gKi8KLSAgICAgIHJlcXVlc3RlZF9mbXQgPSBGTVRfT1MyOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJvdXRmaWxlIiwgNCkpIHsKLSAgICAgIC8qIFNldCBvdXRwdXQgZmlsZSBuYW1lLiAqLwotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgb3V0ZmlsZW5hbWUgPSBhcmd2W2FyZ25dOwkvKiBzYXZlIGl0IGF3YXkgZm9yIGxhdGVyIHVzZSAqLwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJwbm0iLCAxKSB8fCBrZXltYXRjaChhcmcsICJwcG0iLCAxKSkgewotICAgICAgLyogUFBNL1BHTSBvdXRwdXQgZm9ybWF0LiAqLwotICAgICAgcmVxdWVzdGVkX2ZtdCA9IEZNVF9QUE07Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInJsZSIsIDEpKSB7Ci0gICAgICAvKiBSTEUgb3V0cHV0IGZvcm1hdC4gKi8KLSAgICAgIHJlcXVlc3RlZF9mbXQgPSBGTVRfUkxFOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJzY2FsZSIsIDEpKSB7Ci0gICAgICAvKiBTY2FsZSB0aGUgb3V0cHV0IGltYWdlIGJ5IGEgZnJhY3Rpb24gTS9OLiAqLwotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWQvJWQiLAotCQkgJmNpbmZvLT5zY2FsZV9udW0sICZjaW5mby0+c2NhbGVfZGVub20pICE9IDIpCi0JdXNhZ2UoKTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAidGFyZ2EiLCAxKSkgewotICAgICAgLyogVGFyZ2Egb3V0cHV0IGZvcm1hdC4gKi8KLSAgICAgIHJlcXVlc3RlZF9mbXQgPSBGTVRfVEFSR0E7Ci0KLSAgICB9IGVsc2UgewotICAgICAgdXNhZ2UoKTsJCQkvKiBib2d1cyBzd2l0Y2ggKi8KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gYXJnbjsJCQkvKiByZXR1cm4gaW5kZXggb2YgbmV4dCBhcmcgKGZpbGUgbmFtZSkgKi8KLX0KLQotCi0vKgotICogTWFya2VyIHByb2Nlc3NvciBmb3IgQ09NIGFuZCBpbnRlcmVzdGluZyBBUFBuIG1hcmtlcnMuCi0gKiBUaGlzIHJlcGxhY2VzIHRoZSBsaWJyYXJ5J3MgYnVpbHQtaW4gcHJvY2Vzc29yLCB3aGljaCBqdXN0IHNraXBzIHRoZSBtYXJrZXIuCi0gKiBXZSB3YW50IHRvIHByaW50IG91dCB0aGUgbWFya2VyIGFzIHRleHQsIHRvIHRoZSBleHRlbnQgcG9zc2libGUuCi0gKiBOb3RlIHRoaXMgY29kZSByZWxpZXMgb24gYSBub24tc3VzcGVuZGluZyBkYXRhIHNvdXJjZS4KLSAqLwotCi1MT0NBTCh1bnNpZ25lZCBpbnQpCi1qcGVnX2dldGMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBSZWFkIG5leHQgYnl0ZSAqLwotewotICBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyICogZGF0YXNyYyA9IGNpbmZvLT5zcmM7Ci0KLSAgaWYgKGRhdGFzcmMtPmJ5dGVzX2luX2J1ZmZlciA9PSAwKSB7Ci0gICAgaWYgKCEgKCpkYXRhc3JjLT5maWxsX2lucHV0X2J1ZmZlcikgKGNpbmZvKSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ0FOVF9TVVNQRU5EKTsKLSAgfQotICBkYXRhc3JjLT5ieXRlc19pbl9idWZmZXItLTsKLSAgcmV0dXJuIEdFVEpPQ1RFVCgqZGF0YXNyYy0+bmV4dF9pbnB1dF9ieXRlKyspOwotfQotCi0KLU1FVEhPRERFRihib29sZWFuKQotcHJpbnRfdGV4dF9tYXJrZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGJvb2xlYW4gdHJhY2VpdCA9IChjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA+PSAxKTsKLSAgSU5UMzIgbGVuZ3RoOwotICB1bnNpZ25lZCBpbnQgY2g7Ci0gIHVuc2lnbmVkIGludCBsYXN0Y2ggPSAwOwotCi0gIGxlbmd0aCA9IGpwZWdfZ2V0YyhjaW5mbykgPDwgODsKLSAgbGVuZ3RoICs9IGpwZWdfZ2V0YyhjaW5mbyk7Ci0gIGxlbmd0aCAtPSAyOwkJCS8qIGRpc2NvdW50IHRoZSBsZW5ndGggd29yZCBpdHNlbGYgKi8KLQotICBpZiAodHJhY2VpdCkgewotICAgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSBKUEVHX0NPTSkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiQ29tbWVudCwgbGVuZ3RoICVsZDpcbiIsIChsb25nKSBsZW5ndGgpOwotICAgIGVsc2UJCQkvKiBhc3N1bWUgaXQgaXMgYW4gQVBQbiBvdGhlcndpc2UgKi8KLSAgICAgIGZwcmludGYoc3RkZXJyLCAiQVBQJWQsIGxlbmd0aCAlbGQ6XG4iLAotCSAgICAgIGNpbmZvLT51bnJlYWRfbWFya2VyIC0gSlBFR19BUFAwLCAobG9uZykgbGVuZ3RoKTsKLSAgfQotCi0gIHdoaWxlICgtLWxlbmd0aCA+PSAwKSB7Ci0gICAgY2ggPSBqcGVnX2dldGMoY2luZm8pOwotICAgIGlmICh0cmFjZWl0KSB7Ci0gICAgICAvKiBFbWl0IHRoZSBjaGFyYWN0ZXIgaW4gYSByZWFkYWJsZSBmb3JtLgotICAgICAgICogTm9ucHJpbnRhYmxlcyBhcmUgY29udmVydGVkIHRvIFxubm4gZm9ybSwKLSAgICAgICAqIHdoaWxlIFwgaXMgY29udmVydGVkIHRvIFxcLgotICAgICAgICogTmV3bGluZXMgaW4gQ1IsIENSL0xGLCBvciBMRiBmb3JtIHdpbGwgYmUgcHJpbnRlZCBhcyBvbmUgbmV3bGluZS4KLSAgICAgICAqLwotICAgICAgaWYgKGNoID09ICdccicpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0gICAgICB9IGVsc2UgaWYgKGNoID09ICdcbicpIHsKLQlpZiAobGFzdGNoICE9ICdccicpCi0JICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0gICAgICB9IGVsc2UgaWYgKGNoID09ICdcXCcpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIlxcXFwiKTsKLSAgICAgIH0gZWxzZSBpZiAoaXNwcmludChjaCkpIHsKLQlwdXRjKGNoLCBzdGRlcnIpOwotICAgICAgfSBlbHNlIHsKLQlmcHJpbnRmKHN0ZGVyciwgIlxcJTAzbyIsIGNoKTsKLSAgICAgIH0KLSAgICAgIGxhc3RjaCA9IGNoOwotICAgIH0KLSAgfQotCi0gIGlmICh0cmFjZWl0KQotICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogVGhlIG1haW4gcHJvZ3JhbS4KLSAqLwotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgY2luZm87Ci0gIHN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOwotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBzdHJ1Y3QgY2RqcGVnX3Byb2dyZXNzX21nciBwcm9ncmVzczsKLSNlbmRpZgotICBpbnQgZmlsZV9pbmRleDsKLSAgZGpwZWdfZGVzdF9wdHIgZGVzdF9tZ3IgPSBOVUxMOwotICBGSUxFICogaW5wdXRfZmlsZTsKLSAgRklMRSAqIG91dHB1dF9maWxlOwotICBKRElNRU5TSU9OIG51bV9zY2FubGluZXM7Ci0KLSAgLyogT24gTWFjLCBmZXRjaCBhIGNvbW1hbmQgbGluZS4gKi8KLSNpZmRlZiBVU0VfQ0NPTU1BTkQKLSAgYXJnYyA9IGNjb21tYW5kKCZhcmd2KTsKLSNlbmRpZgotCi0gIHByb2duYW1lID0gYXJndlswXTsKLSAgaWYgKHByb2duYW1lID09IE5VTEwgfHwgcHJvZ25hbWVbMF0gPT0gMCkKLSAgICBwcm9nbmFtZSA9ICJkanBlZyI7CQkvKiBpbiBjYXNlIEMgbGlicmFyeSBkb2Vzbid0IHByb3ZpZGUgaXQgKi8KLQotICAvKiBJbml0aWFsaXplIHRoZSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0IHdpdGggZGVmYXVsdCBlcnJvciBoYW5kbGluZy4gKi8KLSAgY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIpOwotICBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCZjaW5mbyk7Ci0gIC8qIEFkZCBzb21lIGFwcGxpY2F0aW9uLXNwZWNpZmljIGVycm9yIG1lc3NhZ2VzIChmcm9tIGNkZXJyb3IuaCkgKi8KLSAgamVyci5hZGRvbl9tZXNzYWdlX3RhYmxlID0gY2RqcGVnX21lc3NhZ2VfdGFibGU7Ci0gIGplcnIuZmlyc3RfYWRkb25fbWVzc2FnZSA9IEpNU0dfRklSU1RBRERPTkNPREU7Ci0gIGplcnIubGFzdF9hZGRvbl9tZXNzYWdlID0gSk1TR19MQVNUQURET05DT0RFOwotCi0gIC8qIEluc2VydCBjdXN0b20gbWFya2VyIHByb2Nlc3NvciBmb3IgQ09NIGFuZCBBUFAxMi4KLSAgICogQVBQMTIgaXMgdXNlZCBieSBzb21lIGRpZ2l0YWwgY2FtZXJhIG1ha2VycyBmb3IgdGV4dHVhbCBpbmZvLAotICAgKiBzbyB3ZSBwcm92aWRlIHRoZSBhYmlsaXR5IHRvIGRpc3BsYXkgaXQgYXMgdGV4dC4KLSAgICogSWYgeW91IGxpa2UsIGFkZGl0aW9uYWwgQVBQbiBtYXJrZXIgdHlwZXMgY2FuIGJlIHNlbGVjdGVkIGZvciBkaXNwbGF5LAotICAgKiBidXQgZG9uJ3QgdHJ5IHRvIG92ZXJyaWRlIEFQUDAgb3IgQVBQMTQgdGhpcyB3YXkgKHNlZSBsaWJqcGVnLmRvYykuCi0gICAqLwotICBqcGVnX3NldF9tYXJrZXJfcHJvY2Vzc29yKCZjaW5mbywgSlBFR19DT00sIHByaW50X3RleHRfbWFya2VyKTsKLSAganBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvcigmY2luZm8sIEpQRUdfQVBQMCsxMiwgcHJpbnRfdGV4dF9tYXJrZXIpOwotCi0gIC8qIE5vdyBzYWZlIHRvIGVuYWJsZSBzaWduYWwgY2F0Y2hlci4gKi8KLSNpZmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCi0gIGVuYWJsZV9zaWduYWxfY2F0Y2hlcigoal9jb21tb25fcHRyKSAmY2luZm8pOwotI2VuZGlmCi0KLSAgLyogU2NhbiBjb21tYW5kIGxpbmUgdG8gZmluZCBmaWxlIG5hbWVzLiAqLwotICAvKiBJdCBpcyBjb252ZW5pZW50IHRvIHVzZSBqdXN0IG9uZSBzd2l0Y2gtcGFyc2luZyByb3V0aW5lLCBidXQgdGhlIHN3aXRjaAotICAgKiB2YWx1ZXMgcmVhZCBoZXJlIGFyZSBpZ25vcmVkOyB3ZSB3aWxsIHJlc2NhbiB0aGUgc3dpdGNoZXMgYWZ0ZXIgb3BlbmluZwotICAgKiB0aGUgaW5wdXQgZmlsZS4KLSAgICogKEV4Y2VwdGlvbjogdHJhY2luZyBsZXZlbCBzZXQgaGVyZSBjb250cm9scyB2ZXJib3NpdHkgZm9yIENPTSBtYXJrZXJzCi0gICAqIGZvdW5kIGR1cmluZyBqcGVnX3JlYWRfaGVhZGVyLi4uKQotICAgKi8KLQotICBmaWxlX2luZGV4ID0gcGFyc2Vfc3dpdGNoZXMoJmNpbmZvLCBhcmdjLCBhcmd2LCAwLCBGQUxTRSk7Ci0KLSNpZmRlZiBUV09fRklMRV9DT01NQU5ETElORQotICAvKiBNdXN0IGhhdmUgZWl0aGVyIC1vdXRmaWxlIHN3aXRjaCBvciBleHBsaWNpdCBvdXRwdXQgZmlsZSBuYW1lICovCi0gIGlmIChvdXRmaWxlbmFtZSA9PSBOVUxMKSB7Ci0gICAgaWYgKGZpbGVfaW5kZXggIT0gYXJnYy0yKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBtdXN0IG5hbWUgb25lIGlucHV0IGFuZCBvbmUgb3V0cHV0IGZpbGVcbiIsCi0JICAgICAgcHJvZ25hbWUpOwotICAgICAgdXNhZ2UoKTsKLSAgICB9Ci0gICAgb3V0ZmlsZW5hbWUgPSBhcmd2W2ZpbGVfaW5kZXgrMV07Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGZpbGVfaW5kZXggIT0gYXJnYy0xKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBtdXN0IG5hbWUgb25lIGlucHV0IGFuZCBvbmUgb3V0cHV0IGZpbGVcbiIsCi0JICAgICAgcHJvZ25hbWUpOwotICAgICAgdXNhZ2UoKTsKLSAgICB9Ci0gIH0KLSNlbHNlCi0gIC8qIFVuaXggc3R5bGU6IGV4cGVjdCB6ZXJvIG9yIG9uZSBmaWxlIG5hbWUgKi8KLSAgaWYgKGZpbGVfaW5kZXggPCBhcmdjLTEpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBvbmx5IG9uZSBpbnB1dCBmaWxlXG4iLCBwcm9nbmFtZSk7Ci0gICAgdXNhZ2UoKTsKLSAgfQotI2VuZGlmIC8qIFRXT19GSUxFX0NPTU1BTkRMSU5FICovCi0KLSAgLyogT3BlbiB0aGUgaW5wdXQgZmlsZS4gKi8KLSAgaWYgKGZpbGVfaW5kZXggPCBhcmdjKSB7Ci0gICAgaWYgKChpbnB1dF9maWxlID0gZm9wZW4oYXJndltmaWxlX2luZGV4XSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgYXJndltmaWxlX2luZGV4XSk7Ci0gICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIGRlZmF1bHQgaW5wdXQgZmlsZSBpcyBzdGRpbiAqLwotICAgIGlucHV0X2ZpbGUgPSByZWFkX3N0ZGluKCk7Ci0gIH0KLQotICAvKiBPcGVuIHRoZSBvdXRwdXQgZmlsZS4gKi8KLSAgaWYgKG91dGZpbGVuYW1lICE9IE5VTEwpIHsKLSAgICBpZiAoKG91dHB1dF9maWxlID0gZm9wZW4ob3V0ZmlsZW5hbWUsIFdSSVRFX0JJTkFSWSkpID09IE5VTEwpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBvdXRmaWxlbmFtZSk7Ci0gICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIGRlZmF1bHQgb3V0cHV0IGZpbGUgaXMgc3Rkb3V0ICovCi0gICAgb3V0cHV0X2ZpbGUgPSB3cml0ZV9zdGRvdXQoKTsKLSAgfQotCi0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIHN0YXJ0X3Byb2dyZXNzX21vbml0b3IoKGpfY29tbW9uX3B0cikgJmNpbmZvLCAmcHJvZ3Jlc3MpOwotI2VuZGlmCi0KLSAgLyogU3BlY2lmeSBkYXRhIHNvdXJjZSBmb3IgZGVjb21wcmVzc2lvbiAqLwotICBqcGVnX3N0ZGlvX3NyYygmY2luZm8sIGlucHV0X2ZpbGUpOwotCi0gIC8qIFJlYWQgZmlsZSBoZWFkZXIsIHNldCBkZWZhdWx0IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyAqLwotICAodm9pZCkganBlZ19yZWFkX2hlYWRlcigmY2luZm8sIFRSVUUpOwotCi0gIC8qIEFkanVzdCBkZWZhdWx0IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyBieSByZS1wYXJzaW5nIHRoZSBvcHRpb25zICovCi0gIGZpbGVfaW5kZXggPSBwYXJzZV9zd2l0Y2hlcygmY2luZm8sIGFyZ2MsIGFyZ3YsIDAsIFRSVUUpOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIG91dHB1dCBtb2R1bGUgbm93IHRvIGxldCBpdCBvdmVycmlkZSBhbnkgY3J1Y2lhbAotICAgKiBvcHRpb24gc2V0dGluZ3MgKGZvciBpbnN0YW5jZSwgR0lGIHdhbnRzIHRvIGZvcmNlIGNvbG9yIHF1YW50aXphdGlvbikuCi0gICAqLwotICBzd2l0Y2ggKHJlcXVlc3RlZF9mbXQpIHsKLSNpZmRlZiBCTVBfU1VQUE9SVEVECi0gIGNhc2UgRk1UX0JNUDoKLSAgICBkZXN0X21nciA9IGppbml0X3dyaXRlX2JtcCgmY2luZm8sIEZBTFNFKTsKLSAgICBicmVhazsKLSAgY2FzZSBGTVRfT1MyOgotICAgIGRlc3RfbWdyID0gamluaXRfd3JpdGVfYm1wKCZjaW5mbywgVFJVRSk7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBHSUZfU1VQUE9SVEVECi0gIGNhc2UgRk1UX0dJRjoKLSAgICBkZXN0X21nciA9IGppbml0X3dyaXRlX2dpZigmY2luZm8pOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgUFBNX1NVUFBPUlRFRAotICBjYXNlIEZNVF9QUE06Ci0gICAgZGVzdF9tZ3IgPSBqaW5pdF93cml0ZV9wcG0oJmNpbmZvKTsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIFJMRV9TVVBQT1JURUQKLSAgY2FzZSBGTVRfUkxFOgotICAgIGRlc3RfbWdyID0gamluaXRfd3JpdGVfcmxlKCZjaW5mbyk7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBUQVJHQV9TVVBQT1JURUQKLSAgY2FzZSBGTVRfVEFSR0E6Ci0gICAgZGVzdF9tZ3IgPSBqaW5pdF93cml0ZV90YXJnYSgmY2luZm8pOwotICAgIGJyZWFrOwotI2VuZGlmCi0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVCgmY2luZm8sIEpFUlJfVU5TVVBQT1JURURfRk9STUFUKTsKLSAgICBicmVhazsKLSAgfQotICBkZXN0X21nci0+b3V0cHV0X2ZpbGUgPSBvdXRwdXRfZmlsZTsKLQotICAvKiBTdGFydCBkZWNvbXByZXNzb3IgKi8KLSAgKHZvaWQpIGpwZWdfc3RhcnRfZGVjb21wcmVzcygmY2luZm8pOwotCi0gIC8qIFdyaXRlIG91dHB1dCBmaWxlIGhlYWRlciAqLwotICAoKmRlc3RfbWdyLT5zdGFydF9vdXRwdXQpICgmY2luZm8sIGRlc3RfbWdyKTsKLQotICAvKiBQcm9jZXNzIGRhdGEgKi8KLSAgd2hpbGUgKGNpbmZvLm91dHB1dF9zY2FubGluZSA8IGNpbmZvLm91dHB1dF9oZWlnaHQpIHsKLSAgICBudW1fc2NhbmxpbmVzID0ganBlZ19yZWFkX3NjYW5saW5lcygmY2luZm8sIGRlc3RfbWdyLT5idWZmZXIsCi0JCQkJCWRlc3RfbWdyLT5idWZmZXJfaGVpZ2h0KTsKLSAgICAoKmRlc3RfbWdyLT5wdXRfcGl4ZWxfcm93cykgKCZjaW5mbywgZGVzdF9tZ3IsIG51bV9zY2FubGluZXMpOwotICB9Ci0KLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgLyogSGFjazogY291bnQgZmluYWwgcGFzcyBhcyBkb25lIGluIGNhc2UgZmluaXNoX291dHB1dCBkb2VzIGFuIGV4dHJhIHBhc3MuCi0gICAqIFRoZSBsaWJyYXJ5IHdvbid0IGhhdmUgdXBkYXRlZCBjb21wbGV0ZWRfcGFzc2VzLgotICAgKi8KLSAgcHJvZ3Jlc3MucHViLmNvbXBsZXRlZF9wYXNzZXMgPSBwcm9ncmVzcy5wdWIudG90YWxfcGFzc2VzOwotI2VuZGlmCi0KLSAgLyogRmluaXNoIGRlY29tcHJlc3Npb24gYW5kIHJlbGVhc2UgbWVtb3J5LgotICAgKiBJIG11c3QgZG8gaXQgaW4gdGhpcyBvcmRlciBiZWNhdXNlIG91dHB1dCBtb2R1bGUgaGFzIGFsbG9jYXRlZCBtZW1vcnkKLSAgICogb2YgbGlmZXNwYW4gSlBPT0xfSU1BR0U7IGl0IG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgcmVsZWFzaW5nIG1lbW9yeS4KLSAgICovCi0gICgqZGVzdF9tZ3ItPmZpbmlzaF9vdXRwdXQpICgmY2luZm8sIGRlc3RfbWdyKTsKLSAgKHZvaWQpIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoJmNpbmZvKTsKLSAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKLQotICAvKiBDbG9zZSBmaWxlcywgaWYgd2Ugb3BlbmVkIHRoZW0gKi8KLSAgaWYgKGlucHV0X2ZpbGUgIT0gc3RkaW4pCi0gICAgZmNsb3NlKGlucHV0X2ZpbGUpOwotICBpZiAob3V0cHV0X2ZpbGUgIT0gc3Rkb3V0KQotICAgIGZjbG9zZShvdXRwdXRfZmlsZSk7Ci0KLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgZW5kX3Byb2dyZXNzX21vbml0b3IoKGpfY29tbW9uX3B0cikgJmNpbmZvKTsKLSNlbmRpZgotCi0gIC8qIEFsbCBkb25lLiAqLwotICBleGl0KGplcnIubnVtX3dhcm5pbmdzID8gRVhJVF9XQVJOSU5HIDogRVhJVF9TVUNDRVNTKTsKLSAgcmV0dXJuIDA7CQkJLyogc3VwcHJlc3Mgbm8tcmV0dXJuLXZhbHVlIHdhcm5pbmdzICovCi19CmRpZmYgLS1naXQgYS9leGFtcGxlLmMgYi9leGFtcGxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYzM1NGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLS8qCi0gKiBleGFtcGxlLmMKLSAqCi0gKiBUaGlzIGZpbGUgaWxsdXN0cmF0ZXMgaG93IHRvIHVzZSB0aGUgSUpHIGNvZGUgYXMgYSBzdWJyb3V0aW5lIGxpYnJhcnkKLSAqIHRvIHJlYWQgb3Igd3JpdGUgSlBFRyBpbWFnZSBmaWxlcy4gIFlvdSBzaG91bGQgbG9vayBhdCB0aGlzIGNvZGUgaW4KLSAqIGNvbmp1bmN0aW9uIHdpdGggdGhlIGRvY3VtZW50YXRpb24gZmlsZSBsaWJqcGVnLmRvYy4KLSAqCi0gKiBUaGlzIGNvZGUgd2lsbCBub3QgZG8gYW55dGhpbmcgdXNlZnVsIGFzLWlzLCBidXQgaXQgbWF5IGJlIGhlbHBmdWwgYXMgYQotICogc2tlbGV0b24gZm9yIGNvbnN0cnVjdGluZyByb3V0aW5lcyB0aGF0IGNhbGwgdGhlIEpQRUcgbGlicmFyeS4gIAotICoKLSAqIFdlIHByZXNlbnQgdGhlc2Ugcm91dGluZXMgaW4gdGhlIHNhbWUgY29kaW5nIHN0eWxlIHVzZWQgaW4gdGhlIEpQRUcgY29kZQotICogKEFOU0kgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGV0Yyk7IGJ1dCB5b3UgYXJlIG9mIGNvdXJzZSBmcmVlIHRvIGNvZGUgeW91cgotICogcm91dGluZXMgaW4gYSBkaWZmZXJlbnQgc3R5bGUgaWYgeW91IHByZWZlci4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotLyoKLSAqIEluY2x1ZGUgZmlsZSBmb3IgdXNlcnMgb2YgSlBFRyBsaWJyYXJ5LgotICogWW91IHdpbGwgbmVlZCB0byBoYXZlIGluY2x1ZGVkIHN5c3RlbSBoZWFkZXJzIHRoYXQgZGVmaW5lIGF0IGxlYXN0Ci0gKiB0aGUgdHlwZWRlZnMgRklMRSBhbmQgc2l6ZV90IGJlZm9yZSB5b3UgY2FuIGluY2x1ZGUganBlZ2xpYi5oLgotICogKHN0ZGlvLmggaXMgc3VmZmljaWVudCBvbiBBTlNJLWNvbmZvcm1pbmcgc3lzdGVtcy4pCi0gKiBZb3UgbWF5IGFsc28gd2lzaCB0byBpbmNsdWRlICJqZXJyb3IuaCIuCi0gKi8KLQotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotLyoKLSAqIDxzZXRqbXAuaD4gaXMgdXNlZCBmb3IgdGhlIG9wdGlvbmFsIGVycm9yIHJlY292ZXJ5IG1lY2hhbmlzbSBzaG93biBpbgotICogdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBleGFtcGxlLgotICovCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKiBKUEVHIENPTVBSRVNTSU9OIFNBTVBMRSBJTlRFUkZBQ0UgKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhpcyBoYWxmIG9mIHRoZSBleGFtcGxlIHNob3dzIGhvdyB0byBmZWVkIGRhdGEgaW50byB0aGUgSlBFRyBjb21wcmVzc29yLgotICogV2UgcHJlc2VudCBhIG1pbmltYWwgdmVyc2lvbiB0aGF0IGRvZXMgbm90IHdvcnJ5IGFib3V0IHJlZmluZW1lbnRzIHN1Y2gKLSAqIGFzIGVycm9yIHJlY292ZXJ5ICh0aGUgSlBFRyBjb2RlIHdpbGwganVzdCBleGl0KCkgaWYgaXQgZ2V0cyBhbiBlcnJvcikuCi0gKi8KLQotCi0vKgotICogSU1BR0UgREFUQSBGT1JNQVRTOgotICoKLSAqIFRoZSBzdGFuZGFyZCBpbnB1dCBpbWFnZSBmb3JtYXQgaXMgYSByZWN0YW5ndWxhciBhcnJheSBvZiBwaXhlbHMsIHdpdGgKLSAqIGVhY2ggcGl4ZWwgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiAiY29tcG9uZW50IiB2YWx1ZXMgKGNvbG9yIGNoYW5uZWxzKS4KLSAqIEVhY2ggcGl4ZWwgcm93IGlzIGFuIGFycmF5IG9mIEpTQU1QTEVzICh3aGljaCB0eXBpY2FsbHkgYXJlIHVuc2lnbmVkIGNoYXJzKS4KLSAqIElmIHlvdSBhcmUgd29ya2luZyB3aXRoIGNvbG9yIGRhdGEsIHRoZW4gdGhlIGNvbG9yIHZhbHVlcyBmb3IgZWFjaCBwaXhlbAotICogbXVzdCBiZSBhZGphY2VudCBpbiB0aGUgcm93OyBmb3IgZXhhbXBsZSwgUixHLEIsUixHLEIsUixHLEIsLi4uIGZvciAyNC1iaXQKLSAqIFJHQiBjb2xvci4KLSAqCi0gKiBGb3IgdGhpcyBleGFtcGxlLCB3ZSdsbCBhc3N1bWUgdGhhdCB0aGlzIGRhdGEgc3RydWN0dXJlIG1hdGNoZXMgdGhlIHdheQotICogb3VyIGFwcGxpY2F0aW9uIGhhcyBzdG9yZWQgdGhlIGltYWdlIGluIG1lbW9yeSwgc28gd2UgY2FuIGp1c3QgcGFzcyBhCi0gKiBwb2ludGVyIHRvIG91ciBpbWFnZSBidWZmZXIuICBJbiBwYXJ0aWN1bGFyLCBsZXQncyBzYXkgdGhhdCB0aGUgaW1hZ2UgaXMKLSAqIFJHQiBjb2xvciBhbmQgaXMgZGVzY3JpYmVkIGJ5OgotICovCi0KLWV4dGVybiBKU0FNUExFICogaW1hZ2VfYnVmZmVyOwkvKiBQb2ludHMgdG8gbGFyZ2UgYXJyYXkgb2YgUixHLEItb3JkZXIgZGF0YSAqLwotZXh0ZXJuIGludCBpbWFnZV9oZWlnaHQ7CS8qIE51bWJlciBvZiByb3dzIGluIGltYWdlICovCi1leHRlcm4gaW50IGltYWdlX3dpZHRoOwkJLyogTnVtYmVyIG9mIGNvbHVtbnMgaW4gaW1hZ2UgKi8KLQotCi0vKgotICogU2FtcGxlIHJvdXRpbmUgZm9yIEpQRUcgY29tcHJlc3Npb24uICBXZSBhc3N1bWUgdGhhdCB0aGUgdGFyZ2V0IGZpbGUgbmFtZQotICogYW5kIGEgY29tcHJlc3Npb24gcXVhbGl0eSBmYWN0b3IgYXJlIHBhc3NlZCBpbi4KLSAqLwotCi1HTE9CQUwodm9pZCkKLXdyaXRlX0pQRUdfZmlsZSAoY2hhciAqIGZpbGVuYW1lLCBpbnQgcXVhbGl0eSkKLXsKLSAgLyogVGhpcyBzdHJ1Y3QgY29udGFpbnMgdGhlIEpQRUcgY29tcHJlc3Npb24gcGFyYW1ldGVycyBhbmQgcG9pbnRlcnMgdG8KLSAgICogd29ya2luZyBzcGFjZSAod2hpY2ggaXMgYWxsb2NhdGVkIGFzIG5lZWRlZCBieSB0aGUgSlBFRyBsaWJyYXJ5KS4KLSAgICogSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBzZXZlcmFsIHN1Y2ggc3RydWN0dXJlcywgcmVwcmVzZW50aW5nIG11bHRpcGxlCi0gICAqIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gcHJvY2Vzc2VzLCBpbiBleGlzdGVuY2UgYXQgb25jZS4gIFdlIHJlZmVyCi0gICAqIHRvIGFueSBvbmUgc3RydWN0IChhbmQgaXRzIGFzc29jaWF0ZWQgd29ya2luZyBkYXRhKSBhcyBhICJKUEVHIG9iamVjdCIuCi0gICAqLwotICBzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm87Ci0gIC8qIFRoaXMgc3RydWN0IHJlcHJlc2VudHMgYSBKUEVHIGVycm9yIGhhbmRsZXIuICBJdCBpcyBkZWNsYXJlZCBzZXBhcmF0ZWx5Ci0gICAqIGJlY2F1c2UgYXBwbGljYXRpb25zIG9mdGVuIHdhbnQgdG8gc3VwcGx5IGEgc3BlY2lhbGl6ZWQgZXJyb3IgaGFuZGxlcgotICAgKiAoc2VlIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGlzIGZpbGUgZm9yIGFuIGV4YW1wbGUpLiAgQnV0IGhlcmUgd2UganVzdAotICAgKiB0YWtlIHRoZSBlYXN5IHdheSBvdXQgYW5kIHVzZSB0aGUgc3RhbmRhcmQgZXJyb3IgaGFuZGxlciwgd2hpY2ggd2lsbAotICAgKiBwcmludCBhIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBjYWxsIGV4aXQoKSBpZiBjb21wcmVzc2lvbiBmYWlscy4KLSAgICogTm90ZSB0aGF0IHRoaXMgc3RydWN0IG11c3QgbGl2ZSBhcyBsb25nIGFzIHRoZSBtYWluIEpQRUcgcGFyYW1ldGVyCi0gICAqIHN0cnVjdCwgdG8gYXZvaWQgZGFuZ2xpbmctcG9pbnRlciBwcm9ibGVtcy4KLSAgICovCi0gIHN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOwotICAvKiBNb3JlIHN0dWZmICovCi0gIEZJTEUgKiBvdXRmaWxlOwkJLyogdGFyZ2V0IGZpbGUgKi8KLSAgSlNBTVBST1cgcm93X3BvaW50ZXJbMV07CS8qIHBvaW50ZXIgdG8gSlNBTVBMRSByb3dbc10gKi8KLSAgaW50IHJvd19zdHJpZGU7CQkvKiBwaHlzaWNhbCByb3cgd2lkdGggaW4gaW1hZ2UgYnVmZmVyICovCi0KLSAgLyogU3RlcCAxOiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdCAqLwotCi0gIC8qIFdlIGhhdmUgdG8gc2V0IHVwIHRoZSBlcnJvciBoYW5kbGVyIGZpcnN0LCBpbiBjYXNlIHRoZSBpbml0aWFsaXphdGlvbgotICAgKiBzdGVwIGZhaWxzLiAgKFVubGlrZWx5LCBidXQgaXQgY291bGQgaGFwcGVuIGlmIHlvdSBhcmUgb3V0IG9mIG1lbW9yeS4pCi0gICAqIFRoaXMgcm91dGluZSBmaWxscyBpbiB0aGUgY29udGVudHMgb2Ygc3RydWN0IGplcnIsIGFuZCByZXR1cm5zIGplcnIncwotICAgKiBhZGRyZXNzIHdoaWNoIHdlIHBsYWNlIGludG8gdGhlIGxpbmsgZmllbGQgaW4gY2luZm8uCi0gICAqLwotICBjaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVycik7Ci0gIC8qIE5vdyB3ZSBjYW4gaW5pdGlhbGl6ZSB0aGUgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QuICovCi0gIGpwZWdfY3JlYXRlX2NvbXByZXNzKCZjaW5mbyk7Ci0KLSAgLyogU3RlcCAyOiBzcGVjaWZ5IGRhdGEgZGVzdGluYXRpb24gKGVnLCBhIGZpbGUpICovCi0gIC8qIE5vdGU6IHN0ZXBzIDIgYW5kIDMgY2FuIGJlIGRvbmUgaW4gZWl0aGVyIG9yZGVyLiAqLwotCi0gIC8qIEhlcmUgd2UgdXNlIHRoZSBsaWJyYXJ5LXN1cHBsaWVkIGNvZGUgdG8gc2VuZCBjb21wcmVzc2VkIGRhdGEgdG8gYQotICAgKiBzdGRpbyBzdHJlYW0uICBZb3UgY2FuIGFsc28gd3JpdGUgeW91ciBvd24gY29kZSB0byBkbyBzb21ldGhpbmcgZWxzZS4KLSAgICogVkVSWSBJTVBPUlRBTlQ6IHVzZSAiYiIgb3B0aW9uIHRvIGZvcGVuKCkgaWYgeW91IGFyZSBvbiBhIG1hY2hpbmUgdGhhdAotICAgKiByZXF1aXJlcyBpdCBpbiBvcmRlciB0byB3cml0ZSBiaW5hcnkgZmlsZXMuCi0gICAqLwotICBpZiAoKG91dGZpbGUgPSBmb3BlbihmaWxlbmFtZSwgIndiIikpID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImNhbid0IG9wZW4gJXNcbiIsIGZpbGVuYW1lKTsKLSAgICBleGl0KDEpOwotICB9Ci0gIGpwZWdfc3RkaW9fZGVzdCgmY2luZm8sIG91dGZpbGUpOwotCi0gIC8qIFN0ZXAgMzogc2V0IHBhcmFtZXRlcnMgZm9yIGNvbXByZXNzaW9uICovCi0KLSAgLyogRmlyc3Qgd2Ugc3VwcGx5IGEgZGVzY3JpcHRpb24gb2YgdGhlIGlucHV0IGltYWdlLgotICAgKiBGb3VyIGZpZWxkcyBvZiB0aGUgY2luZm8gc3RydWN0IG11c3QgYmUgZmlsbGVkIGluOgotICAgKi8KLSAgY2luZm8uaW1hZ2Vfd2lkdGggPSBpbWFnZV93aWR0aDsgCS8qIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQsIGluIHBpeGVscyAqLwotICBjaW5mby5pbWFnZV9oZWlnaHQgPSBpbWFnZV9oZWlnaHQ7Ci0gIGNpbmZvLmlucHV0X2NvbXBvbmVudHMgPSAzOwkJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIHBlciBwaXhlbCAqLwotICBjaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7IAkvKiBjb2xvcnNwYWNlIG9mIGlucHV0IGltYWdlICovCi0gIC8qIE5vdyB1c2UgdGhlIGxpYnJhcnkncyByb3V0aW5lIHRvIHNldCBkZWZhdWx0IGNvbXByZXNzaW9uIHBhcmFtZXRlcnMuCi0gICAqIChZb3UgbXVzdCBzZXQgYXQgbGVhc3QgY2luZm8uaW5fY29sb3Jfc3BhY2UgYmVmb3JlIGNhbGxpbmcgdGhpcywKLSAgICogc2luY2UgdGhlIGRlZmF1bHRzIGRlcGVuZCBvbiB0aGUgc291cmNlIGNvbG9yIHNwYWNlLikKLSAgICovCi0gIGpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7Ci0gIC8qIE5vdyB5b3UgY2FuIHNldCBhbnkgbm9uLWRlZmF1bHQgcGFyYW1ldGVycyB5b3Ugd2lzaCB0by4KLSAgICogSGVyZSB3ZSBqdXN0IGlsbHVzdHJhdGUgdGhlIHVzZSBvZiBxdWFsaXR5IChxdWFudGl6YXRpb24gdGFibGUpIHNjYWxpbmc6Ci0gICAqLwotICBqcGVnX3NldF9xdWFsaXR5KCZjaW5mbywgcXVhbGl0eSwgVFJVRSAvKiBsaW1pdCB0byBiYXNlbGluZS1KUEVHIHZhbHVlcyAqLyk7Ci0KLSAgLyogU3RlcCA0OiBTdGFydCBjb21wcmVzc29yICovCi0KLSAgLyogVFJVRSBlbnN1cmVzIHRoYXQgd2Ugd2lsbCB3cml0ZSBhIGNvbXBsZXRlIGludGVyY2hhbmdlLUpQRUcgZmlsZS4KLSAgICogUGFzcyBUUlVFIHVubGVzcyB5b3UgYXJlIHZlcnkgc3VyZSBvZiB3aGF0IHlvdSdyZSBkb2luZy4KLSAgICovCi0gIGpwZWdfc3RhcnRfY29tcHJlc3MoJmNpbmZvLCBUUlVFKTsKLQotICAvKiBTdGVwIDU6IHdoaWxlIChzY2FuIGxpbmVzIHJlbWFpbiB0byBiZSB3cml0dGVuKSAqLwotICAvKiAgICAgICAgICAganBlZ193cml0ZV9zY2FubGluZXMoLi4uKTsgKi8KLQotICAvKiBIZXJlIHdlIHVzZSB0aGUgbGlicmFyeSdzIHN0YXRlIHZhcmlhYmxlIGNpbmZvLm5leHRfc2NhbmxpbmUgYXMgdGhlCi0gICAqIGxvb3AgY291bnRlciwgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgdHJhY2sgb3Vyc2VsdmVzLgotICAgKiBUbyBrZWVwIHRoaW5ncyBzaW1wbGUsIHdlIHBhc3Mgb25lIHNjYW5saW5lIHBlciBjYWxsOyB5b3UgY2FuIHBhc3MKLSAgICogbW9yZSBpZiB5b3Ugd2lzaCwgdGhvdWdoLgotICAgKi8KLSAgcm93X3N0cmlkZSA9IGltYWdlX3dpZHRoICogMzsJLyogSlNBTVBMRXMgcGVyIHJvdyBpbiBpbWFnZV9idWZmZXIgKi8KLQotICB3aGlsZSAoY2luZm8ubmV4dF9zY2FubGluZSA8IGNpbmZvLmltYWdlX2hlaWdodCkgewotICAgIC8qIGpwZWdfd3JpdGVfc2NhbmxpbmVzIGV4cGVjdHMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2NhbmxpbmVzLgotICAgICAqIEhlcmUgdGhlIGFycmF5IGlzIG9ubHkgb25lIGVsZW1lbnQgbG9uZywgYnV0IHlvdSBjb3VsZCBwYXNzCi0gICAgICogbW9yZSB0aGFuIG9uZSBzY2FubGluZSBhdCBhIHRpbWUgaWYgdGhhdCdzIG1vcmUgY29udmVuaWVudC4KLSAgICAgKi8KLSAgICByb3dfcG9pbnRlclswXSA9ICYgaW1hZ2VfYnVmZmVyW2NpbmZvLm5leHRfc2NhbmxpbmUgKiByb3dfc3RyaWRlXTsKLSAgICAodm9pZCkganBlZ193cml0ZV9zY2FubGluZXMoJmNpbmZvLCByb3dfcG9pbnRlciwgMSk7Ci0gIH0KLQotICAvKiBTdGVwIDY6IEZpbmlzaCBjb21wcmVzc2lvbiAqLwotCi0gIGpwZWdfZmluaXNoX2NvbXByZXNzKCZjaW5mbyk7Ci0gIC8qIEFmdGVyIGZpbmlzaF9jb21wcmVzcywgd2UgY2FuIGNsb3NlIHRoZSBvdXRwdXQgZmlsZS4gKi8KLSAgZmNsb3NlKG91dGZpbGUpOwotCi0gIC8qIFN0ZXAgNzogcmVsZWFzZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdCAqLwotCi0gIC8qIFRoaXMgaXMgYW4gaW1wb3J0YW50IHN0ZXAgc2luY2UgaXQgd2lsbCByZWxlYXNlIGEgZ29vZCBkZWFsIG9mIG1lbW9yeS4gKi8KLSAganBlZ19kZXN0cm95X2NvbXByZXNzKCZjaW5mbyk7Ci0KLSAgLyogQW5kIHdlJ3JlIGRvbmUhICovCi19Ci0KLQotLyoKLSAqIFNPTUUgRklORSBQT0lOVFM6Ci0gKgotICogSW4gdGhlIGFib3ZlIGxvb3AsIHdlIGlnbm9yZWQgdGhlIHJldHVybiB2YWx1ZSBvZiBqcGVnX3dyaXRlX3NjYW5saW5lcywKLSAqIHdoaWNoIGlzIHRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzIGFjdHVhbGx5IHdyaXR0ZW4uICBXZSBjb3VsZCBnZXQgYXdheQotICogd2l0aCB0aGlzIGJlY2F1c2Ugd2Ugd2VyZSBvbmx5IHJlbHlpbmcgb24gdGhlIHZhbHVlIG9mIGNpbmZvLm5leHRfc2NhbmxpbmUsCi0gKiB3aGljaCB3aWxsIGJlIGluY3JlbWVudGVkIGNvcnJlY3RseS4gIElmIHlvdSBtYWludGFpbiBhZGRpdGlvbmFsIGxvb3AKLSAqIHZhcmlhYmxlcyB0aGVuIHlvdSBzaG91bGQgYmUgY2FyZWZ1bCB0byBpbmNyZW1lbnQgdGhlbSBwcm9wZXJseS4KLSAqIEFjdHVhbGx5LCBmb3Igb3V0cHV0IHRvIGEgc3RkaW8gc3RyZWFtIHlvdSBuZWVkbid0IHdvcnJ5LCBiZWNhdXNlCi0gKiB0aGVuIGpwZWdfd3JpdGVfc2NhbmxpbmVzIHdpbGwgd3JpdGUgYWxsIHRoZSBsaW5lcyBwYXNzZWQgKG9yIGVsc2UgZXhpdAotICogd2l0aCBhIGZhdGFsIGVycm9yKS4gIFBhcnRpYWwgd3JpdGVzIGNhbiBvbmx5IG9jY3VyIGlmIHlvdSB1c2UgYSBkYXRhCi0gKiBkZXN0aW5hdGlvbiBtb2R1bGUgdGhhdCBjYW4gZGVtYW5kIHN1c3BlbnNpb24gb2YgdGhlIGNvbXByZXNzb3IuCi0gKiAoSWYgeW91IGRvbid0IGtub3cgd2hhdCB0aGF0J3MgZm9yLCB5b3UgZG9uJ3QgbmVlZCBpdC4pCi0gKgotICogSWYgdGhlIGNvbXByZXNzb3IgcmVxdWlyZXMgZnVsbC1pbWFnZSBidWZmZXJzIChmb3IgZW50cm9weS1jb2RpbmcKLSAqIG9wdGltaXphdGlvbiBvciBhIG11bHRpLXNjYW4gSlBFRyBmaWxlKSwgaXQgd2lsbCBjcmVhdGUgdGVtcG9yYXJ5Ci0gKiBmaWxlcyBmb3IgYW55dGhpbmcgdGhhdCBkb2Vzbid0IGZpdCB3aXRoaW4gdGhlIG1heGltdW0tbWVtb3J5IHNldHRpbmcuCi0gKiAoTm90ZSB0aGF0IHRlbXAgZmlsZXMgYXJlIE5PVCBuZWVkZWQgaWYgeW91IHVzZSB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzLikKLSAqIE9uIHNvbWUgc3lzdGVtcyB5b3UgbWF5IG5lZWQgdG8gc2V0IHVwIGEgc2lnbmFsIGhhbmRsZXIgdG8gZW5zdXJlIHRoYXQKLSAqIHRlbXBvcmFyeSBmaWxlcyBhcmUgZGVsZXRlZCBpZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcnJ1cHRlZC4gIFNlZSBsaWJqcGVnLmRvYy4KLSAqCi0gKiBTY2FubGluZXMgTVVTVCBiZSBzdXBwbGllZCBpbiB0b3AtdG8tYm90dG9tIG9yZGVyIGlmIHlvdSB3YW50IHlvdXIgSlBFRwotICogZmlsZXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGV2ZXJ5b25lIGVsc2Uncy4gIElmIHlvdSBjYW5ub3QgcmVhZGlseSByZWFkCi0gKiB5b3VyIGRhdGEgaW4gdGhhdCBvcmRlciwgeW91J2xsIG5lZWQgYW4gaW50ZXJtZWRpYXRlIGFycmF5IHRvIGhvbGQgdGhlCi0gKiBpbWFnZS4gIFNlZSByZHRhcmdhLmMgb3IgcmRibXAuYyBmb3IgZXhhbXBsZXMgb2YgaGFuZGxpbmcgYm90dG9tLXRvLXRvcAotICogc291cmNlIGRhdGEgdXNpbmcgdGhlIEpQRUcgY29kZSdzIGludGVybmFsIHZpcnR1YWwtYXJyYXkgbWVjaGFuaXNtcy4KLSAqLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqIEpQRUcgREVDT01QUkVTU0lPTiBTQU1QTEUgSU5URVJGQUNFICoqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoaXMgaGFsZiBvZiB0aGUgZXhhbXBsZSBzaG93cyBob3cgdG8gcmVhZCBkYXRhIGZyb20gdGhlIEpQRUcgZGVjb21wcmVzc29yLgotICogSXQncyBhIGJpdCBtb3JlIHJlZmluZWQgdGhhbiB0aGUgYWJvdmUsIGluIHRoYXQgd2Ugc2hvdzoKLSAqICAgKGEpIGhvdyB0byBtb2RpZnkgdGhlIEpQRUcgbGlicmFyeSdzIHN0YW5kYXJkIGVycm9yLXJlcG9ydGluZyBiZWhhdmlvcjsKLSAqICAgKGIpIGhvdyB0byBhbGxvY2F0ZSB3b3Jrc3BhY2UgdXNpbmcgdGhlIGxpYnJhcnkncyBtZW1vcnkgbWFuYWdlci4KLSAqCi0gKiBKdXN0IHRvIG1ha2UgdGhpcyBleGFtcGxlIGEgbGl0dGxlIGRpZmZlcmVudCBmcm9tIHRoZSBmaXJzdCBvbmUsIHdlJ2xsCi0gKiBhc3N1bWUgdGhhdCB3ZSBkbyBub3QgaW50ZW5kIHRvIHB1dCB0aGUgd2hvbGUgaW1hZ2UgaW50byBhbiBpbi1tZW1vcnkKLSAqIGJ1ZmZlciwgYnV0IHRvIHNlbmQgaXQgbGluZS1ieS1saW5lIHNvbWVwbGFjZSBlbHNlLiAgV2UgbmVlZCBhIG9uZS0KLSAqIHNjYW5saW5lLWhpZ2ggSlNBTVBMRSBhcnJheSBhcyBhIHdvcmsgYnVmZmVyLCBhbmQgd2Ugd2lsbCBsZXQgdGhlIEpQRUcKLSAqIG1lbW9yeSBtYW5hZ2VyIGFsbG9jYXRlIGl0IGZvciB1cy4gIFRoaXMgYXBwcm9hY2ggaXMgYWN0dWFsbHkgcXVpdGUgdXNlZnVsCi0gKiBiZWNhdXNlIHdlIGRvbid0IG5lZWQgdG8gcmVtZW1iZXIgdG8gZGVhbGxvY2F0ZSB0aGUgYnVmZmVyIHNlcGFyYXRlbHk6IGl0Ci0gKiB3aWxsIGdvIGF3YXkgYXV0b21hdGljYWxseSB3aGVuIHRoZSBKUEVHIG9iamVjdCBpcyBjbGVhbmVkIHVwLgotICovCi0KLQotLyoKLSAqIEVSUk9SIEhBTkRMSU5HOgotICoKLSAqIFRoZSBKUEVHIGxpYnJhcnkncyBzdGFuZGFyZCBlcnJvciBoYW5kbGVyIChqZXJyb3IuYykgaXMgZGl2aWRlZCBpbnRvCi0gKiBzZXZlcmFsICJtZXRob2RzIiB3aGljaCB5b3UgY2FuIG92ZXJyaWRlIGluZGl2aWR1YWxseS4gIFRoaXMgbGV0cyB5b3UKLSAqIGFkanVzdCB0aGUgYmVoYXZpb3Igd2l0aG91dCBkdXBsaWNhdGluZyBhIGxvdCBvZiBjb2RlLCB3aGljaCB5b3UgbWlnaHQKLSAqIGhhdmUgdG8gdXBkYXRlIHdpdGggZWFjaCBmdXR1cmUgcmVsZWFzZS4KLSAqCi0gKiBPdXIgZXhhbXBsZSBoZXJlIHNob3dzIGhvdyB0byBvdmVycmlkZSB0aGUgImVycm9yX2V4aXQiIG1ldGhvZCBzbyB0aGF0Ci0gKiBjb250cm9sIGlzIHJldHVybmVkIHRvIHRoZSBsaWJyYXJ5J3MgY2FsbGVyIHdoZW4gYSBmYXRhbCBlcnJvciBvY2N1cnMsCi0gKiByYXRoZXIgdGhhbiBjYWxsaW5nIGV4aXQoKSBhcyB0aGUgc3RhbmRhcmQgZXJyb3JfZXhpdCBtZXRob2QgZG9lcy4KLSAqCi0gKiBXZSB1c2UgQydzIHNldGptcC9sb25nam1wIGZhY2lsaXR5IHRvIHJldHVybiBjb250cm9sLiAgVGhpcyBtZWFucyB0aGF0IHRoZQotICogcm91dGluZSB3aGljaCBjYWxscyB0aGUgSlBFRyBsaWJyYXJ5IG11c3QgZmlyc3QgZXhlY3V0ZSBhIHNldGptcCgpIGNhbGwgdG8KLSAqIGVzdGFibGlzaCB0aGUgcmV0dXJuIHBvaW50LiAgV2Ugd2FudCB0aGUgcmVwbGFjZW1lbnQgZXJyb3JfZXhpdCB0byBkbyBhCi0gKiBsb25nam1wKCkuICBCdXQgd2UgbmVlZCB0byBtYWtlIHRoZSBzZXRqbXAgYnVmZmVyIGFjY2Vzc2libGUgdG8gdGhlCi0gKiBlcnJvcl9leGl0IHJvdXRpbmUuICBUbyBkbyB0aGlzLCB3ZSBtYWtlIGEgcHJpdmF0ZSBleHRlbnNpb24gb2YgdGhlCi0gKiBzdGFuZGFyZCBKUEVHIGVycm9yIGhhbmRsZXIgb2JqZWN0LiAgKElmIHdlIHdlcmUgdXNpbmcgQysrLCB3ZSdkIHNheSB3ZQotICogd2VyZSBtYWtpbmcgYSBzdWJjbGFzcyBvZiB0aGUgcmVndWxhciBlcnJvciBoYW5kbGVyLikKLSAqCi0gKiBIZXJlJ3MgdGhlIGV4dGVuZGVkIGVycm9yIGhhbmRsZXIgc3RydWN0OgotICovCi0KLXN0cnVjdCBteV9lcnJvcl9tZ3IgewotICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgcHViOwkvKiAicHVibGljIiBmaWVsZHMgKi8KLQotICBqbXBfYnVmIHNldGptcF9idWZmZXI7CS8qIGZvciByZXR1cm4gdG8gY2FsbGVyICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBteV9lcnJvcl9tZ3IgKiBteV9lcnJvcl9wdHI7Ci0KLS8qCi0gKiBIZXJlJ3MgdGhlIHJvdXRpbmUgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHN0YW5kYXJkIGVycm9yX2V4aXQgbWV0aG9kOgotICovCi0KLU1FVEhPRERFRih2b2lkKQotbXlfZXJyb3JfZXhpdCAoal9jb21tb25fcHRyIGNpbmZvKQotewotICAvKiBjaW5mby0+ZXJyIHJlYWxseSBwb2ludHMgdG8gYSBteV9lcnJvcl9tZ3Igc3RydWN0LCBzbyBjb2VyY2UgcG9pbnRlciAqLwotICBteV9lcnJvcl9wdHIgbXllcnIgPSAobXlfZXJyb3JfcHRyKSBjaW5mby0+ZXJyOwotCi0gIC8qIEFsd2F5cyBkaXNwbGF5IHRoZSBtZXNzYWdlLiAqLwotICAvKiBXZSBjb3VsZCBwb3N0cG9uZSB0aGlzIHVudGlsIGFmdGVyIHJldHVybmluZywgaWYgd2UgY2hvc2UuICovCi0gICgqY2luZm8tPmVyci0+b3V0cHV0X21lc3NhZ2UpIChjaW5mbyk7Ci0KLSAgLyogUmV0dXJuIGNvbnRyb2wgdG8gdGhlIHNldGptcCBwb2ludCAqLwotICBsb25nam1wKG15ZXJyLT5zZXRqbXBfYnVmZmVyLCAxKTsKLX0KLQotCi0vKgotICogU2FtcGxlIHJvdXRpbmUgZm9yIEpQRUcgZGVjb21wcmVzc2lvbi4gIFdlIGFzc3VtZSB0aGF0IHRoZSBzb3VyY2UgZmlsZSBuYW1lCi0gKiBpcyBwYXNzZWQgaW4uICBXZSB3YW50IHRvIHJldHVybiAxIG9uIHN1Y2Nlc3MsIDAgb24gZXJyb3IuCi0gKi8KLQotCi1HTE9CQUwoaW50KQotcmVhZF9KUEVHX2ZpbGUgKGNoYXIgKiBmaWxlbmFtZSkKLXsKLSAgLyogVGhpcyBzdHJ1Y3QgY29udGFpbnMgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGFuZCBwb2ludGVycyB0bwotICAgKiB3b3JraW5nIHNwYWNlICh3aGljaCBpcyBhbGxvY2F0ZWQgYXMgbmVlZGVkIGJ5IHRoZSBKUEVHIGxpYnJhcnkpLgotICAgKi8KLSAgc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgY2luZm87Ci0gIC8qIFdlIHVzZSBvdXIgcHJpdmF0ZSBleHRlbnNpb24gSlBFRyBlcnJvciBoYW5kbGVyLgotICAgKiBOb3RlIHRoYXQgdGhpcyBzdHJ1Y3QgbXVzdCBsaXZlIGFzIGxvbmcgYXMgdGhlIG1haW4gSlBFRyBwYXJhbWV0ZXIKLSAgICogc3RydWN0LCB0byBhdm9pZCBkYW5nbGluZy1wb2ludGVyIHByb2JsZW1zLgotICAgKi8KLSAgc3RydWN0IG15X2Vycm9yX21nciBqZXJyOwotICAvKiBNb3JlIHN0dWZmICovCi0gIEZJTEUgKiBpbmZpbGU7CQkvKiBzb3VyY2UgZmlsZSAqLwotICBKU0FNUEFSUkFZIGJ1ZmZlcjsJCS8qIE91dHB1dCByb3cgYnVmZmVyICovCi0gIGludCByb3dfc3RyaWRlOwkJLyogcGh5c2ljYWwgcm93IHdpZHRoIGluIG91dHB1dCBidWZmZXIgKi8KLQotICAvKiBJbiB0aGlzIGV4YW1wbGUgd2Ugd2FudCB0byBvcGVuIHRoZSBpbnB1dCBmaWxlIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLAotICAgKiBzbyB0aGF0IHRoZSBzZXRqbXAoKSBlcnJvciByZWNvdmVyeSBiZWxvdyBjYW4gYXNzdW1lIHRoZSBmaWxlIGlzIG9wZW4uCi0gICAqIFZFUlkgSU1QT1JUQU5UOiB1c2UgImIiIG9wdGlvbiB0byBmb3BlbigpIGlmIHlvdSBhcmUgb24gYSBtYWNoaW5lIHRoYXQKLSAgICogcmVxdWlyZXMgaXQgaW4gb3JkZXIgdG8gcmVhZCBiaW5hcnkgZmlsZXMuCi0gICAqLwotCi0gIGlmICgoaW5maWxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpKSA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJjYW4ndCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKiBTdGVwIDE6IGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QgKi8KLQotICAvKiBXZSBzZXQgdXAgdGhlIG5vcm1hbCBKUEVHIGVycm9yIHJvdXRpbmVzLCB0aGVuIG92ZXJyaWRlIGVycm9yX2V4aXQuICovCi0gIGNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZqZXJyLnB1Yik7Ci0gIGplcnIucHViLmVycm9yX2V4aXQgPSBteV9lcnJvcl9leGl0OwotICAvKiBFc3RhYmxpc2ggdGhlIHNldGptcCByZXR1cm4gY29udGV4dCBmb3IgbXlfZXJyb3JfZXhpdCB0byB1c2UuICovCi0gIGlmIChzZXRqbXAoamVyci5zZXRqbXBfYnVmZmVyKSkgewotICAgIC8qIElmIHdlIGdldCBoZXJlLCB0aGUgSlBFRyBjb2RlIGhhcyBzaWduYWxlZCBhbiBlcnJvci4KLSAgICAgKiBXZSBuZWVkIHRvIGNsZWFuIHVwIHRoZSBKUEVHIG9iamVjdCwgY2xvc2UgdGhlIGlucHV0IGZpbGUsIGFuZCByZXR1cm4uCi0gICAgICovCi0gICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKLSAgICBmY2xvc2UoaW5maWxlKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICAvKiBOb3cgd2UgY2FuIGluaXRpYWxpemUgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QuICovCi0gIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoJmNpbmZvKTsKLQotICAvKiBTdGVwIDI6IHNwZWNpZnkgZGF0YSBzb3VyY2UgKGVnLCBhIGZpbGUpICovCi0KLSAganBlZ19zdGRpb19zcmMoJmNpbmZvLCBpbmZpbGUpOwotCi0gIC8qIFN0ZXAgMzogcmVhZCBmaWxlIHBhcmFtZXRlcnMgd2l0aCBqcGVnX3JlYWRfaGVhZGVyKCkgKi8KLQotICAodm9pZCkganBlZ19yZWFkX2hlYWRlcigmY2luZm8sIFRSVUUpOwotICAvKiBXZSBjYW4gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBqcGVnX3JlYWRfaGVhZGVyIHNpbmNlCi0gICAqICAgKGEpIHN1c3BlbnNpb24gaXMgbm90IHBvc3NpYmxlIHdpdGggdGhlIHN0ZGlvIGRhdGEgc291cmNlLCBhbmQKLSAgICogICAoYikgd2UgcGFzc2VkIFRSVUUgdG8gcmVqZWN0IGEgdGFibGVzLW9ubHkgSlBFRyBmaWxlIGFzIGFuIGVycm9yLgotICAgKiBTZWUgbGlianBlZy5kb2MgZm9yIG1vcmUgaW5mby4KLSAgICovCi0KLSAgLyogU3RlcCA0OiBzZXQgcGFyYW1ldGVycyBmb3IgZGVjb21wcmVzc2lvbiAqLwotCi0gIC8qIEluIHRoaXMgZXhhbXBsZSwgd2UgZG9uJ3QgbmVlZCB0byBjaGFuZ2UgYW55IG9mIHRoZSBkZWZhdWx0cyBzZXQgYnkKLSAgICoganBlZ19yZWFkX2hlYWRlcigpLCBzbyB3ZSBkbyBub3RoaW5nIGhlcmUuCi0gICAqLwotCi0gIC8qIFN0ZXAgNTogU3RhcnQgZGVjb21wcmVzc29yICovCi0KLSAgKHZvaWQpIGpwZWdfc3RhcnRfZGVjb21wcmVzcygmY2luZm8pOwotICAvKiBXZSBjYW4gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgc2luY2Ugc3VzcGVuc2lvbiBpcyBub3QgcG9zc2libGUKLSAgICogd2l0aCB0aGUgc3RkaW8gZGF0YSBzb3VyY2UuCi0gICAqLwotCi0gIC8qIFdlIG1heSBuZWVkIHRvIGRvIHNvbWUgc2V0dXAgb2Ygb3VyIG93biBhdCB0aGlzIHBvaW50IGJlZm9yZSByZWFkaW5nCi0gICAqIHRoZSBkYXRhLiAgQWZ0ZXIganBlZ19zdGFydF9kZWNvbXByZXNzKCkgd2UgaGF2ZSB0aGUgY29ycmVjdCBzY2FsZWQKLSAgICogb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgYXZhaWxhYmxlLCBhcyB3ZWxsIGFzIHRoZSBvdXRwdXQgY29sb3JtYXAKLSAgICogaWYgd2UgYXNrZWQgZm9yIGNvbG9yIHF1YW50aXphdGlvbi4KLSAgICogSW4gdGhpcyBleGFtcGxlLCB3ZSBuZWVkIHRvIG1ha2UgYW4gb3V0cHV0IHdvcmsgYnVmZmVyIG9mIHRoZSByaWdodCBzaXplLgotICAgKi8gCi0gIC8qIEpTQU1QTEVzIHBlciByb3cgaW4gb3V0cHV0IGJ1ZmZlciAqLwotICByb3dfc3RyaWRlID0gY2luZm8ub3V0cHV0X3dpZHRoICogY2luZm8ub3V0cHV0X2NvbXBvbmVudHM7Ci0gIC8qIE1ha2UgYSBvbmUtcm93LWhpZ2ggc2FtcGxlIGFycmF5IHRoYXQgd2lsbCBnbyBhd2F5IHdoZW4gZG9uZSB3aXRoIGltYWdlICovCi0gIGJ1ZmZlciA9ICgqY2luZm8ubWVtLT5hbGxvY19zYXJyYXkpCi0JCSgoal9jb21tb25fcHRyKSAmY2luZm8sIEpQT09MX0lNQUdFLCByb3dfc3RyaWRlLCAxKTsKLQotICAvKiBTdGVwIDY6IHdoaWxlIChzY2FuIGxpbmVzIHJlbWFpbiB0byBiZSByZWFkKSAqLwotICAvKiAgICAgICAgICAganBlZ19yZWFkX3NjYW5saW5lcyguLi4pOyAqLwotCi0gIC8qIEhlcmUgd2UgdXNlIHRoZSBsaWJyYXJ5J3Mgc3RhdGUgdmFyaWFibGUgY2luZm8ub3V0cHV0X3NjYW5saW5lIGFzIHRoZQotICAgKiBsb29wIGNvdW50ZXIsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIHRyYWNrIG91cnNlbHZlcy4KLSAgICovCi0gIHdoaWxlIChjaW5mby5vdXRwdXRfc2NhbmxpbmUgPCBjaW5mby5vdXRwdXRfaGVpZ2h0KSB7Ci0gICAgLyoganBlZ19yZWFkX3NjYW5saW5lcyBleHBlY3RzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNjYW5saW5lcy4KLSAgICAgKiBIZXJlIHRoZSBhcnJheSBpcyBvbmx5IG9uZSBlbGVtZW50IGxvbmcsIGJ1dCB5b3UgY291bGQgYXNrIGZvcgotICAgICAqIG1vcmUgdGhhbiBvbmUgc2NhbmxpbmUgYXQgYSB0aW1lIGlmIHRoYXQncyBtb3JlIGNvbnZlbmllbnQuCi0gICAgICovCi0gICAgKHZvaWQpIGpwZWdfcmVhZF9zY2FubGluZXMoJmNpbmZvLCBidWZmZXIsIDEpOwotICAgIC8qIEFzc3VtZSBwdXRfc2NhbmxpbmVfc29tZXBsYWNlIHdhbnRzIGEgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50LiAqLwotICAgIHB1dF9zY2FubGluZV9zb21lcGxhY2UoYnVmZmVyWzBdLCByb3dfc3RyaWRlKTsKLSAgfQotCi0gIC8qIFN0ZXAgNzogRmluaXNoIGRlY29tcHJlc3Npb24gKi8KLQotICAodm9pZCkganBlZ19maW5pc2hfZGVjb21wcmVzcygmY2luZm8pOwotICAvKiBXZSBjYW4gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgc2luY2Ugc3VzcGVuc2lvbiBpcyBub3QgcG9zc2libGUKLSAgICogd2l0aCB0aGUgc3RkaW8gZGF0YSBzb3VyY2UuCi0gICAqLwotCi0gIC8qIFN0ZXAgODogUmVsZWFzZSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0ICovCi0KLSAgLyogVGhpcyBpcyBhbiBpbXBvcnRhbnQgc3RlcCBzaW5jZSBpdCB3aWxsIHJlbGVhc2UgYSBnb29kIGRlYWwgb2YgbWVtb3J5LiAqLwotICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwotCi0gIC8qIEFmdGVyIGZpbmlzaF9kZWNvbXByZXNzLCB3ZSBjYW4gY2xvc2UgdGhlIGlucHV0IGZpbGUuCi0gICAqIEhlcmUgd2UgcG9zdHBvbmUgaXQgdW50aWwgYWZ0ZXIgbm8gbW9yZSBKUEVHIGVycm9ycyBhcmUgcG9zc2libGUsCi0gICAqIHNvIGFzIHRvIHNpbXBsaWZ5IHRoZSBzZXRqbXAgZXJyb3IgbG9naWMgYWJvdmUuICAoQWN0dWFsbHksIEkgZG9uJ3QKLSAgICogdGhpbmsgdGhhdCBqcGVnX2Rlc3Ryb3kgY2FuIGRvIGFuIGVycm9yIGV4aXQsIGJ1dCB3aHkgYXNzdW1lIGFueXRoaW5nLi4uKQotICAgKi8KLSAgZmNsb3NlKGluZmlsZSk7Ci0KLSAgLyogQXQgdGhpcyBwb2ludCB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgYW55IGNvcnJ1cHQtZGF0YQotICAgKiB3YXJuaW5ncyBvY2N1cnJlZCAodGVzdCB3aGV0aGVyIGplcnIucHViLm51bV93YXJuaW5ncyBpcyBub256ZXJvKS4KLSAgICovCi0KLSAgLyogQW5kIHdlJ3JlIGRvbmUhICovCi0gIHJldHVybiAxOwotfQotCi0KLS8qCi0gKiBTT01FIEZJTkUgUE9JTlRTOgotICoKLSAqIEluIHRoZSBhYm92ZSBjb2RlLCB3ZSBpZ25vcmVkIHRoZSByZXR1cm4gdmFsdWUgb2YganBlZ19yZWFkX3NjYW5saW5lcywKLSAqIHdoaWNoIGlzIHRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzIGFjdHVhbGx5IHJlYWQuICBXZSBjb3VsZCBnZXQgYXdheSB3aXRoCi0gKiB0aGlzIGJlY2F1c2Ugd2UgYXNrZWQgZm9yIG9ubHkgb25lIGxpbmUgYXQgYSB0aW1lIGFuZCB3ZSB3ZXJlbid0IHVzaW5nCi0gKiBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UuICBTZWUgbGlianBlZy5kb2MgZm9yIG1vcmUgaW5mby4KLSAqCi0gKiBXZSBjaGVhdGVkIGEgYml0IGJ5IGNhbGxpbmcgYWxsb2Nfc2FycmF5KCkgYWZ0ZXIganBlZ19zdGFydF9kZWNvbXByZXNzKCk7Ci0gKiB3ZSBzaG91bGQgaGF2ZSBkb25lIGl0IGJlZm9yZWhhbmQgdG8gZW5zdXJlIHRoYXQgdGhlIHNwYWNlIHdvdWxkIGJlCi0gKiBjb3VudGVkIGFnYWluc3QgdGhlIEpQRUcgbWF4X21lbW9yeSBzZXR0aW5nLiAgSW4gc29tZSBzeXN0ZW1zIHRoZSBhYm92ZQotICogY29kZSB3b3VsZCByaXNrIGFuIG91dC1vZi1tZW1vcnkgZXJyb3IuICBIb3dldmVyLCBpbiBnZW5lcmFsIHdlIGRvbid0Ci0gKiBrbm93IHRoZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBiZWZvcmUganBlZ19zdGFydF9kZWNvbXByZXNzKCksIHVubGVzcyB3ZQotICogY2FsbCBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoKS4gIFNlZSBsaWJqcGVnLmRvYyBmb3IgbW9yZSBhYm91dCB0aGlzLgotICoKLSAqIFNjYW5saW5lcyBhcmUgcmV0dXJuZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBhcHBlYXIgaW4gdGhlIEpQRUcgZmlsZSwKLSAqIHdoaWNoIGlzIHN0YW5kYXJkbHkgdG9wLXRvLWJvdHRvbS4gIElmIHlvdSBtdXN0IGVtaXQgZGF0YSBib3R0b20tdG8tdG9wLAotICogeW91IGNhbiB1c2Ugb25lIG9mIHRoZSB2aXJ0dWFsIGFycmF5cyBwcm92aWRlZCBieSB0aGUgSlBFRyBtZW1vcnkgbWFuYWdlcgotICogdG8gaW52ZXJ0IHRoZSBkYXRhLiAgU2VlIHdyYm1wLmMgZm9yIGFuIGV4YW1wbGUuCi0gKgotICogQXMgd2l0aCBjb21wcmVzc2lvbiwgc29tZSBvcGVyYXRpbmcgbW9kZXMgbWF5IHJlcXVpcmUgdGVtcG9yYXJ5IGZpbGVzLgotICogT24gc29tZSBzeXN0ZW1zIHlvdSBtYXkgbmVlZCB0byBzZXQgdXAgYSBzaWduYWwgaGFuZGxlciB0byBlbnN1cmUgdGhhdAotICogdGVtcG9yYXJ5IGZpbGVzIGFyZSBkZWxldGVkIGlmIHRoZSBwcm9ncmFtIGlzIGludGVycnVwdGVkLiAgU2VlIGxpYmpwZWcuZG9jLgotICovCmRpZmYgLS1naXQgYS9maWxlbGlzdC5kb2MgYi9maWxlbGlzdC5kb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNDk4MmMuLjAwMDAwMDAKLS0tIGEvZmlsZWxpc3QuZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLUlKRyBKUEVHIExJQlJBUlk6ICBGSUxFIExJU1QKLQotQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIFRob21hcyBHLiBMYW5lLgotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLUZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLQotCi1IZXJlIGlzIGEgcm9hZCBtYXAgdG8gdGhlIGZpbGVzIGluIHRoZSBJSkcgSlBFRyBkaXN0cmlidXRpb24uICBUaGUKLWRpc3RyaWJ1dGlvbiBpbmNsdWRlcyB0aGUgSlBFRyBsaWJyYXJ5IHByb3BlciwgcGx1cyB0d28gYXBwbGljYXRpb24KLXByb2dyYW1zICgiY2pwZWciIGFuZCAiZGpwZWciKSB3aGljaCB1c2UgdGhlIGxpYnJhcnkgdG8gY29udmVydCBKUEVHCi1maWxlcyB0byBhbmQgZnJvbSBzb21lIG90aGVyIHBvcHVsYXIgaW1hZ2UgZm9ybWF0cy4gIEEgdGhpcmQgYXBwbGljYXRpb24KLSJqcGVndHJhbiIgdXNlcyB0aGUgbGlicmFyeSB0byBkbyBsb3NzbGVzcyBjb252ZXJzaW9uIGJldHdlZW4gZGlmZmVyZW50Ci12YXJpYW50cyBvZiBKUEVHLiAgVGhlcmUgYXJlIGFsc28gdHdvIHN0YW5kLWFsb25lIGFwcGxpY2F0aW9ucywKLSJyZGpwZ2NvbSIgYW5kICJ3cmpwZ2NvbSIuCi0KLQotVEhFIEpQRUcgTElCUkFSWQotPT09PT09PT09PT09PT09PQotCi1JbmNsdWRlIGZpbGVzOgotCi1qcGVnbGliLmgJSlBFRyBsaWJyYXJ5J3MgZXhwb3J0ZWQgZGF0YSBhbmQgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotamNvbmZpZy5oCUNvbmZpZ3VyYXRpb24gZGVjbGFyYXRpb25zLiAgTm90ZTogdGhpcyBmaWxlIGlzIG5vdCBwcmVzZW50Ci0JCWluIHRoZSBkaXN0cmlidXRpb247IGl0IGlzIGdlbmVyYXRlZCBkdXJpbmcgaW5zdGFsbGF0aW9uLgotam1vcmVjZmcuaAlBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZGVjbGFyYXRpb25zOyBuZWVkIG5vdCBiZSBjaGFuZ2VkCi0JCWZvciBhIHN0YW5kYXJkIGluc3RhbGxhdGlvbi4KLWplcnJvci5oCURlY2xhcmVzIEpQRUcgbGlicmFyeSdzIGVycm9yIGFuZCB0cmFjZSBtZXNzYWdlIGNvZGVzLgotamluY2x1ZGUuaAlDZW50cmFsIGluY2x1ZGUgZmlsZSB1c2VkIGJ5IGFsbCBJSkcgLmMgZmlsZXMgdG8gcmVmZXJlbmNlCi0JCXN5c3RlbSBpbmNsdWRlIGZpbGVzLgotanBlZ2ludC5oCUpQRUcgbGlicmFyeSdzIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy4KLWpjaHVmZi5oCVByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBIdWZmbWFuIGVuY29kZXIgbW9kdWxlcy4KLWpkaHVmZi5oCVByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBIdWZmbWFuIGRlY29kZXIgbW9kdWxlcy4KLWpkY3QuaAkJUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIGZvcndhcmQgJiByZXZlcnNlIERDVCBzdWJzeXN0ZW1zLgotam1lbXN5cy5oCVByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uCi1qdmVyc2lvbi5oCVZlcnNpb24gaW5mb3JtYXRpb24uCi0KLUFwcGxpY2F0aW9ucyB1c2luZyB0aGUgbGlicmFyeSBzaG91bGQgaW5jbHVkZSBqcGVnbGliLmggKHdoaWNoIGluIHR1cm4KLWluY2x1ZGVzIGpjb25maWcuaCBhbmQgam1vcmVjZmcuaCkuICBPcHRpb25hbGx5LCBqZXJyb3IuaCBtYXkgYmUgaW5jbHVkZWQKLWlmIHRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byByZWZlcmVuY2UgaW5kaXZpZHVhbCBKUEVHIGVycm9yIGNvZGVzLiAgVGhlCi1vdGhlciBpbmNsdWRlIGZpbGVzIGFyZSBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIGFuZCB3b3VsZCBub3Qgbm9ybWFsbHkKLWJlIGluY2x1ZGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0uICAoY2pwZWcvZGpwZWcvZXRjIGRvIHVzZSBqaW5jbHVkZS5oLAotc2luY2UgaXRzIGZ1bmN0aW9uIGlzIHRvIGltcHJvdmUgcG9ydGFiaWxpdHkgb2YgdGhlIHdob2xlIElKRyBkaXN0cmlidXRpb24uCi1Nb3N0IG90aGVyIGFwcGxpY2F0aW9ucyB3aWxsIGRpcmVjdGx5IGluY2x1ZGUgdGhlIHN5c3RlbSBpbmNsdWRlIGZpbGVzIHRoZXkKLXdhbnQsIGFuZCBoZW5jZSB3b24ndCBuZWVkIGppbmNsdWRlLmguKQotCi0KLUMgc291cmNlIGNvZGUgZmlsZXM6Ci0KLVRoZXNlIGZpbGVzIGNvbnRhaW4gbW9zdCBvZiB0aGUgZnVuY3Rpb25zIGludGVuZGVkIHRvIGJlIGNhbGxlZCBkaXJlY3RseSBieQotYW4gYXBwbGljYXRpb24gcHJvZ3JhbToKLQotamNhcGltaW4uYwlBcHBsaWNhdGlvbiBwcm9ncmFtIGludGVyZmFjZTogY29yZSByb3V0aW5lcyBmb3IgY29tcHJlc3Npb24uCi1qY2FwaXN0ZC5jCUFwcGxpY2F0aW9uIHByb2dyYW0gaW50ZXJmYWNlOiBzdGFuZGFyZCBjb21wcmVzc2lvbi4KLWpkYXBpbWluLmMJQXBwbGljYXRpb24gcHJvZ3JhbSBpbnRlcmZhY2U6IGNvcmUgcm91dGluZXMgZm9yIGRlY29tcHJlc3Npb24uCi1qZGFwaXN0ZC5jCUFwcGxpY2F0aW9uIHByb2dyYW0gaW50ZXJmYWNlOiBzdGFuZGFyZCBkZWNvbXByZXNzaW9uLgotamNvbWFwaS5jCUFwcGxpY2F0aW9uIHByb2dyYW0gaW50ZXJmYWNlIHJvdXRpbmVzIGNvbW1vbiB0byBjb21wcmVzc2lvbgotCQlhbmQgZGVjb21wcmVzc2lvbi4KLWpjcGFyYW0uYwlDb21wcmVzc2lvbiBwYXJhbWV0ZXIgc2V0dGluZyBoZWxwZXIgcm91dGluZXMuCi1qY3RyYW5zLmMJQVBJIGFuZCBsaWJyYXJ5IHJvdXRpbmVzIGZvciB0cmFuc2NvZGluZyBjb21wcmVzc2lvbi4KLWpkdHJhbnMuYwlBUEkgYW5kIGxpYnJhcnkgcm91dGluZXMgZm9yIHRyYW5zY29kaW5nIGRlY29tcHJlc3Npb24uCi0KLUNvbXByZXNzaW9uIHNpZGUgb2YgdGhlIGxpYnJhcnk6Ci0KLWpjaW5pdC5jCUluaXRpYWxpemF0aW9uOiBkZXRlcm1pbmVzIHdoaWNoIG90aGVyIG1vZHVsZXMgdG8gdXNlLgotamNtYXN0ZXIuYwlNYXN0ZXIgY29udHJvbDogc2V0dXAgYW5kIGludGVyLXBhc3Mgc2VxdWVuY2luZyBsb2dpYy4KLWpjbWFpbmN0LmMJTWFpbiBidWZmZXIgY29udHJvbGxlciAocHJlcHJvY2Vzc29yID0+IEpQRUcgY29tcHJlc3NvcikuCi1qY3ByZXBjdC5jCVByZXByb2Nlc3NvciBidWZmZXIgY29udHJvbGxlci4KLWpjY29lZmN0LmMJQnVmZmVyIGNvbnRyb2xsZXIgZm9yIERDVCBjb2VmZmljaWVudCBidWZmZXIuCi1qY2NvbG9yLmMJQ29sb3Igc3BhY2UgY29udmVyc2lvbi4KLWpjc2FtcGxlLmMJRG93bnNhbXBsaW5nLgotamNkY3RtZ3IuYwlEQ1QgbWFuYWdlciAoRENUIGltcGxlbWVudGF0aW9uIHNlbGVjdGlvbiAmIGNvbnRyb2wpLgotamZkY3RpbnQuYwlGb3J3YXJkIERDVCB1c2luZyBzbG93LWJ1dC1hY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZC4KLWpmZGN0ZnN0LmMJRm9yd2FyZCBEQ1QgdXNpbmcgZmFzdGVyLCBsZXNzIGFjY3VyYXRlIGludGVnZXIgbWV0aG9kLgotamZkY3RmbHQuYwlGb3J3YXJkIERDVCB1c2luZyBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLgotamNodWZmLmMJSHVmZm1hbiBlbnRyb3B5IGNvZGluZyBmb3Igc2VxdWVudGlhbCBKUEVHLgotamNwaHVmZi5jCUh1ZmZtYW4gZW50cm9weSBjb2RpbmcgZm9yIHByb2dyZXNzaXZlIEpQRUcuCi1qY21hcmtlci5jCUpQRUcgbWFya2VyIHdyaXRpbmcuCi1qZGF0YWRzdC5jCURhdGEgZGVzdGluYXRpb24gbWFuYWdlciBmb3Igc3RkaW8gb3V0cHV0LgotCi1EZWNvbXByZXNzaW9uIHNpZGUgb2YgdGhlIGxpYnJhcnk6Ci0KLWpkbWFzdGVyLmMJTWFzdGVyIGNvbnRyb2w6IGRldGVybWluZXMgd2hpY2ggb3RoZXIgbW9kdWxlcyB0byB1c2UuCi1qZGlucHV0LmMJSW5wdXQgY29udHJvbGxlcjogY29udHJvbHMgaW5wdXQgcHJvY2Vzc2luZyBtb2R1bGVzLgotamRtYWluY3QuYwlNYWluIGJ1ZmZlciBjb250cm9sbGVyIChKUEVHIGRlY29tcHJlc3NvciA9PiBwb3N0cHJvY2Vzc29yKS4KLWpkY29lZmN0LmMJQnVmZmVyIGNvbnRyb2xsZXIgZm9yIERDVCBjb2VmZmljaWVudCBidWZmZXIuCi1qZHBvc3RjdC5jCVBvc3Rwcm9jZXNzb3IgYnVmZmVyIGNvbnRyb2xsZXIuCi1qZG1hcmtlci5jCUpQRUcgbWFya2VyIHJlYWRpbmcuCi1qZGh1ZmYuYwlIdWZmbWFuIGVudHJvcHkgZGVjb2RpbmcgZm9yIHNlcXVlbnRpYWwgSlBFRy4KLWpkcGh1ZmYuYwlIdWZmbWFuIGVudHJvcHkgZGVjb2RpbmcgZm9yIHByb2dyZXNzaXZlIEpQRUcuCi1qZGRjdG1nci5jCUlEQ1QgbWFuYWdlciAoSURDVCBpbXBsZW1lbnRhdGlvbiBzZWxlY3Rpb24gJiBjb250cm9sKS4KLWppZGN0aW50LmMJSW52ZXJzZSBEQ1QgdXNpbmcgc2xvdy1idXQtYWNjdXJhdGUgaW50ZWdlciBtZXRob2QuCi1qaWRjdGZzdC5jCUludmVyc2UgRENUIHVzaW5nIGZhc3RlciwgbGVzcyBhY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZC4KLWppZGN0Zmx0LmMJSW52ZXJzZSBEQ1QgdXNpbmcgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYy4KLWppZGN0cmVkLmMJSW52ZXJzZSBEQ1RzIHdpdGggcmVkdWNlZC1zaXplIG91dHB1dHMuCi1qZHNhbXBsZS5jCVVwc2FtcGxpbmcuCi1qZGNvbG9yLmMJQ29sb3Igc3BhY2UgY29udmVyc2lvbi4KLWpkbWVyZ2UuYwlNZXJnZWQgdXBzYW1wbGluZy9jb2xvciBjb252ZXJzaW9uIChmYXN0ZXIsIGxvd2VyIHF1YWxpdHkpLgotanF1YW50MS5jCU9uZS1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiB1c2luZyBhIGZpeGVkLXNwYWNpbmcgY29sb3JtYXAuCi1qcXVhbnQyLmMJVHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uIHVzaW5nIGEgY3VzdG9tLWdlbmVyYXRlZCBjb2xvcm1hcC4KLQkJQWxzbyBoYW5kbGVzIG9uZS1wYXNzIHF1YW50aXphdGlvbiB0byBhbiBleHRlcm5hbGx5IGdpdmVuIG1hcC4KLWpkYXRhc3JjLmMJRGF0YSBzb3VyY2UgbWFuYWdlciBmb3Igc3RkaW8gaW5wdXQuCi0KLVN1cHBvcnQgZmlsZXMgZm9yIGJvdGggY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb246Ci0KLWplcnJvci5jCVN0YW5kYXJkIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzIChhcHBsaWNhdGlvbiByZXBsYWNlYWJsZSkuCi1qbWVtbWdyLmMJU3lzdGVtLWluZGVwZW5kZW50IChtb3JlIG9yIGxlc3MpIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUuCi1qdXRpbHMuYwlNaXNjZWxsYW5lb3VzIHV0aWxpdHkgcm91dGluZXMuCi0KLWptZW1tZ3IuYyByZWxpZXMgb24gYSBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeSBtYW5hZ2VtZW50IG1vZHVsZS4gIFRoZSBJSkcKLWRpc3RyaWJ1dGlvbiBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgc3lzdGVtLWRlcGVuZGVudAotbW9kdWxlOgotCi1qbWVtbm9icy5jCSJObyBiYWNraW5nIHN0b3JlIjogYXNzdW1lcyBhZGVxdWF0ZSB2aXJ0dWFsIG1lbW9yeSBleGlzdHMuCi1qbWVtYW5zaS5jCU1ha2VzIHRlbXBvcmFyeSBmaWxlcyB3aXRoIEFOU0ktc3RhbmRhcmQgcm91dGluZSB0bXBmaWxlKCkuCi1qbWVtbmFtZS5jCU1ha2VzIHRlbXBvcmFyeSBmaWxlcyB3aXRoIHByb2dyYW0tZ2VuZXJhdGVkIGZpbGUgbmFtZXMuCi1qbWVtZG9zLmMJQ3VzdG9tIGltcGxlbWVudGF0aW9uIGZvciBNUy1ET1MgKDE2LWJpdCBlbnZpcm9ubWVudCBvbmx5KToKLQkJY2FuIHVzZSBleHRlbmRlZCBhbmQgZXhwYW5kZWQgbWVtb3J5IGFzIHdlbGwgYXMgdGVtcCBmaWxlcy4KLWptZW1tYWMuYwlDdXN0b20gaW1wbGVtZW50YXRpb24gZm9yIEFwcGxlIE1hY2ludG9zaC4KLQotRXhhY3RseSBvbmUgb2YgdGhlIHN5c3RlbS1kZXBlbmRlbnQgbW9kdWxlcyBzaG91bGQgYmUgY29uZmlndXJlZCBpbnRvIGFuCi1pbnN0YWxsZWQgSlBFRyBsaWJyYXJ5IChzZWUgaW5zdGFsbC5kb2MgZm9yIGhpbnRzIGFib3V0IHdoaWNoIG9uZSB0byB1c2UpLgotT24gdW51c3VhbCBzeXN0ZW1zIHlvdSBtYXkgZmluZCBpdCB3b3J0aHdoaWxlIHRvIG1ha2UgYSBzcGVjaWFsCi1zeXN0ZW0tZGVwZW5kZW50IG1lbW9yeSBtYW5hZ2VyLgotCi0KLU5vbi1DIHNvdXJjZSBjb2RlIGZpbGVzOgotCi1qbWVtZG9zYS5hc20JODB4ODYgYXNzZW1ibHkgY29kZSBzdXBwb3J0IGZvciBqbWVtZG9zLmM7IHVzZWQgb25seSBpbgotCQlNUy1ET1Mtc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgb2YgdGhlIEpQRUcgbGlicmFyeS4KLQotCi1DSlBFRy9ESlBFRy9KUEVHVFJBTgotPT09PT09PT09PT09PT09PT09PT0KLQotSW5jbHVkZSBmaWxlczoKLQotY2RqcGVnLmgJRGVjbGFyYXRpb25zIHNoYXJlZCBieSBjanBlZy9kanBlZy9qcGVndHJhbiBtb2R1bGVzLgotY2RlcnJvci5oCUFkZGl0aW9uYWwgZXJyb3IgYW5kIHRyYWNlIG1lc3NhZ2UgY29kZXMgZm9yIGNqcGVnIGV0IGFsLgotdHJhbnN1cHAuaAlEZWNsYXJhdGlvbnMgZm9yIGpwZWd0cmFuIHN1cHBvcnQgcm91dGluZXMgaW4gdHJhbnN1cHAuYy4KLQotQyBzb3VyY2UgY29kZSBmaWxlczoKLQotY2pwZWcuYwkJTWFpbiBwcm9ncmFtIGZvciBjanBlZy4KLWRqcGVnLmMJCU1haW4gcHJvZ3JhbSBmb3IgZGpwZWcuCi1qcGVndHJhbi5jCU1haW4gcHJvZ3JhbSBmb3IganBlZ3RyYW4uCi1jZGpwZWcuYwlVdGlsaXR5IHJvdXRpbmVzIHVzZWQgYnkgYWxsIHRocmVlIHByb2dyYW1zLgotcmRjb2xtYXAuYwlDb2RlIHRvIHJlYWQgYSBjb2xvcm1hcCBmaWxlIGZvciBkanBlZydzICItbWFwIiBzd2l0Y2guCi1yZHN3aXRjaC5jCUNvZGUgdG8gcHJvY2VzcyBzb21lIG9mIGNqcGVnJ3MgbW9yZSBjb21wbGV4IHN3aXRjaGVzLgotCQlBbHNvIHVzZWQgYnkganBlZ3RyYW4uCi10cmFuc3VwcC5jCVN1cHBvcnQgY29kZSBmb3IganBlZ3RyYW46IGxvc3NsZXNzIGltYWdlIG1hbmlwdWxhdGlvbnMuCi0KLUltYWdlIGZpbGUgcmVhZGVyIG1vZHVsZXMgZm9yIGNqcGVnOgotCi1yZGJtcC5jCQlCTVAgZmlsZSBpbnB1dC4KLXJkZ2lmLmMJCUdJRiBmaWxlIGlucHV0IChub3cganVzdCBhIHN0dWIpLgotcmRwcG0uYwkJUFBNL1BHTSBmaWxlIGlucHV0LgotcmRybGUuYwkJVXRhaCBSTEUgZmlsZSBpbnB1dC4KLXJkdGFyZ2EuYwlUYXJnYSBmaWxlIGlucHV0LgotCi1JbWFnZSBmaWxlIHdyaXRlciBtb2R1bGVzIGZvciBkanBlZzoKLQotd3JibXAuYwkJQk1QIGZpbGUgb3V0cHV0Lgotd3JnaWYuYwkJR0lGIGZpbGUgb3V0cHV0IChhIG1lcmUgc2hhZG93IG9mIGl0cyBmb3JtZXIgc2VsZikuCi13cnBwbS5jCQlQUE0vUEdNIGZpbGUgb3V0cHV0Lgotd3JybGUuYwkJVXRhaCBSTEUgZmlsZSBvdXRwdXQuCi13cnRhcmdhLmMJVGFyZ2EgZmlsZSBvdXRwdXQuCi0KLQotUkRKUEdDT00vV1JKUEdDT00KLT09PT09PT09PT09PT09PT09Ci0KLUMgc291cmNlIGNvZGUgZmlsZXM6Ci0KLXJkanBnY29tLmMJU3RhbmQtYWxvbmUgcmRqcGdjb20gYXBwbGljYXRpb24uCi13cmpwZ2NvbS5jCVN0YW5kLWFsb25lIHdyanBnY29tIGFwcGxpY2F0aW9uLgotCi1UaGVzZSBwcm9ncmFtcyBkbyBub3QgZGVwZW5kIG9uIHRoZSBJSkcgbGlicmFyeS4gIFRoZXkgZG8gdXNlCi1qY29uZmlnLmggYW5kIGppbmNsdWRlLmgsIG9ubHkgdG8gaW1wcm92ZSBwb3J0YWJpbGl0eS4KLQotCi1BRERJVElPTkFMIEZJTEVTCi09PT09PT09PT09PT09PT09Ci0KLURvY3VtZW50YXRpb24gKHNlZSBSRUFETUUgZm9yIGEgZ3VpZGUgdG8gdGhlIGRvY3VtZW50YXRpb24gZmlsZXMpOgotCi1SRUFETUUJCU1hc3RlciBkb2N1bWVudGF0aW9uIGZpbGUuCi0qLmRvYwkJT3RoZXIgZG9jdW1lbnRhdGlvbiBmaWxlcy4KLSouMQkJRG9jdW1lbnRhdGlvbiBpbiBVbml4IG1hbiBwYWdlIGZvcm1hdC4KLWNoYW5nZS5sb2cJVmVyc2lvbi10by12ZXJzaW9uIGNoYW5nZSBoaWdobGlnaHRzLgotZXhhbXBsZS5jCVNhbXBsZSBjb2RlIGZvciBjYWxsaW5nIEpQRUcgbGlicmFyeS4KLQotQ29uZmlndXJhdGlvbi9pbnN0YWxsYXRpb24gZmlsZXMgYW5kIHByb2dyYW1zIChzZWUgaW5zdGFsbC5kb2MgZm9yIG1vcmUgaW5mbyk6Ci0KLWNvbmZpZ3VyZQlVbml4IHNoZWxsIHNjcmlwdCB0byBwZXJmb3JtIGF1dG9tYXRpYyBjb25maWd1cmF0aW9uLgotbHRjb25maWcJU3VwcG9ydCBzY3JpcHRzIGZvciBjb25maWd1cmUgKGZyb20gR05VIGxpYnRvb2wpLgotbHRtYWluLnNoCi1jb25maWcuZ3Vlc3MKLWNvbmZpZy5zdWIKLWluc3RhbGwtc2gJSW5zdGFsbCBzaGVsbCBzY3JpcHQgZm9yIHRob3NlIFVuaXggc3lzdGVtcyBsYWNraW5nIG9uZS4KLWNrY29uZmlnLmMJUHJvZ3JhbSB0byBnZW5lcmF0ZSBqY29uZmlnLmggb24gbm9uLVVuaXggc3lzdGVtcy4KLWpjb25maWcuZG9jCVRlbXBsYXRlIGZvciBtYWtpbmcgamNvbmZpZy5oIGJ5IGhhbmQuCi1tYWtlZmlsZS4qCVNhbXBsZSBtYWtlZmlsZXMgZm9yIHBhcnRpY3VsYXIgc3lzdGVtcy4KLWpjb25maWcuKglTYW1wbGUgamNvbmZpZy5oIGZvciBwYXJ0aWN1bGFyIHN5c3RlbXMuCi1hbnNpMmtuci5jCURlLUFOU0lmaWVyIGZvciBwcmUtQU5TSSBDIGNvbXBpbGVycyAoY291cnRlc3kgb2YKLQkJTC4gUGV0ZXIgRGV1dHNjaCBhbmQgQWxhZGRpbiBFbnRlcnByaXNlcykuCi0KLVRlc3QgZmlsZXMgKHNlZSBpbnN0YWxsLmRvYyBmb3IgdGVzdCBwcm9jZWR1cmUpOgotCi10ZXN0Ki4qCQlTb3VyY2UgYW5kIGNvbXBhcmlzb24gZmlsZXMgZm9yIGNvbmZpZGVuY2UgdGVzdC4KLQkJVGhlc2UgYXJlIGJpbmFyeSBpbWFnZSBmaWxlcywgTk9UIHRleHQgZmlsZXMuCmRpZmYgLS1naXQgYS9pbnN0YWxsLXNoIGIvaW5zdGFsbC1zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGQ0YTk1MS4uMDAwMDAwMAotLS0gYS9pbnN0YWxsLXNoCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLSMhL2Jpbi9zaAotIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKLQotc2NyaXB0dmVyc2lvbj0yMDA1LTA1LTE0LjIyCi0KLSMgVGhpcyBvcmlnaW5hdGVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCksIHdoaWNoIHdhcwotIyBsYXRlciByZWxlYXNlZCBpbiBYMTFSNiAoeGMvY29uZmlnL3V0aWwvaW5zdGFsbC5zaCkgd2l0aCB0aGUKLSMgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQgbGljZW5zZS4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTk0IFggQ29uc29ydGl1bQotIwotIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci0jIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0bwotIyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZQotIyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKLSMgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKLSMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSMKLSMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLSMgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0jCi0jIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0jIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi0jIFggQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSMgQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDLQotIyBUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotIwotIyBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiB0aGUgWCBDb25zb3J0aXVtIHNoYWxsIG5vdAotIyBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbC0KLSMgaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gdGhlIFggQ29uc29yLQotIyB0aXVtLgotIwotIwotIyBGU0YgY2hhbmdlcyB0byB0aGlzIGZpbGUgYXJlIGluIHRoZSBwdWJsaWMgZG9tYWluLgotIwotIyBDYWxsaW5nIHRoaXMgc2NyaXB0IGluc3RhbGwtc2ggaXMgcHJlZmVycmVkIG92ZXIgaW5zdGFsbC5zaCwgdG8gcHJldmVudAotIyBgbWFrZScgaW1wbGljaXQgcnVsZXMgZnJvbSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIGluc3RhbGwgZnJvbSBpdAotIyB3aGVuIHRoZXJlIGlzIG5vIE1ha2VmaWxlLgotIwotIyBUaGlzIHNjcmlwdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEJTRCBpbnN0YWxsIHNjcmlwdCwgYnV0IHdhcyB3cml0dGVuCi0jIGZyb20gc2NyYXRjaC4gIEl0IGNhbiBvbmx5IGluc3RhbGwgb25lIGZpbGUgYXQgYSB0aW1lLCBhIHJlc3RyaWN0aW9uCi0jIHNoYXJlZCB3aXRoIG1hbnkgT1MncyBpbnN0YWxsIHByb2dyYW1zLgotCi0jIHNldCBET0lUUFJPRyB0byBlY2hvIHRvIHRlc3QgdGhpcyBzY3JpcHQKLQotIyBEb24ndCB1c2UgOi0gc2luY2UgNC4zQlNEIGFuZCBlYXJsaWVyIHNoZWxscyBkb24ndCBsaWtlIGl0LgotZG9pdD0iJHtET0lUUFJPRy19IgotCi0jIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KLQotbXZwcm9nPSIke01WUFJPRy1tdn0iCi1jcHByb2c9IiR7Q1BQUk9HLWNwfSIKLWNobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgotY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCi1jaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKLXN0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igotcm1wcm9nPSIke1JNUFJPRy1ybX0iCi1ta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKLQotY2htb2RjbWQ9IiRjaG1vZHByb2cgMDc1NSIKLWNob3duY21kPQotY2hncnBjbWQ9Ci1zdHJpcGNtZD0KLXJtY21kPSIkcm1wcm9nIC1mIgotbXZjbWQ9IiRtdnByb2ciCi1zcmM9Ci1kc3Q9Ci1kaXJfYXJnPQotZHN0YXJnPQotbm9fdGFyZ2V0X2RpcmVjdG9yeT0KLQotdXNhZ2U9IlVzYWdlOiAkMCBbT1BUSU9OXS4uLiBbLVRdIFNSQ0ZJTEUgRFNURklMRQotICAgb3I6ICQwIFtPUFRJT05dLi4uIFNSQ0ZJTEVTLi4uIERJUkVDVE9SWQotICAgb3I6ICQwIFtPUFRJT05dLi4uIC10IERJUkVDVE9SWSBTUkNGSUxFUy4uLgotICAgb3I6ICQwIFtPUFRJT05dLi4uIC1kIERJUkVDVE9SSUVTLi4uCi0KLUluIHRoZSAxc3QgZm9ybSwgY29weSBTUkNGSUxFIHRvIERTVEZJTEUuCi1JbiB0aGUgMm5kIGFuZCAzcmQsIGNvcHkgYWxsIFNSQ0ZJTEVTIHRvIERJUkVDVE9SWS4KLUluIHRoZSA0dGgsIGNyZWF0ZSBESVJFQ1RPUklFUy4KLQotT3B0aW9uczoKLS1jICAgICAgICAgKGlnbm9yZWQpCi0tZCAgICAgICAgIGNyZWF0ZSBkaXJlY3RvcmllcyBpbnN0ZWFkIG9mIGluc3RhbGxpbmcgZmlsZXMuCi0tZyBHUk9VUCAgICRjaGdycHByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIEdST1VQLgotLW0gTU9ERSAgICAkY2htb2Rwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBNT0RFLgotLW8gVVNFUiAgICAkY2hvd25wcm9nIGluc3RhbGxlZCBmaWxlcyB0byBVU0VSLgotLXMgICAgICAgICAkc3RyaXBwcm9nIGluc3RhbGxlZCBmaWxlcy4KLS10IERJUkVDVE9SWSAgaW5zdGFsbCBpbnRvIERJUkVDVE9SWS4KLS1UICAgICAgICAgcmVwb3J0IGFuIGVycm9yIGlmIERTVEZJTEUgaXMgYSBkaXJlY3RvcnkuCi0tLWhlbHAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0LgotLS12ZXJzaW9uICBkaXNwbGF5IHZlcnNpb24gaW5mbyBhbmQgZXhpdC4KLQotRW52aXJvbm1lbnQgdmFyaWFibGVzIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbW1hbmRzOgotICBDSEdSUFBST0cgQ0hNT0RQUk9HIENIT1dOUFJPRyBDUFBST0cgTUtESVJQUk9HIE1WUFJPRyBSTVBST0cgU1RSSVBQUk9HCi0iCi0KLXdoaWxlIHRlc3QgLW4gIiQxIjsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC1jKSBzaGlmdAotICAgICAgICBjb250aW51ZTs7Ci0KLSAgICAtZCkgZGlyX2FyZz10cnVlCi0gICAgICAgIHNoaWZ0Ci0gICAgICAgIGNvbnRpbnVlOzsKLQotICAgIC1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKLSAgICAgICAgc2hpZnQKLSAgICAgICAgc2hpZnQKLSAgICAgICAgY29udGludWU7OwotCi0gICAgLS1oZWxwKSBlY2hvICIkdXNhZ2UiOyBleGl0ICQ/OzsKLQotICAgIC1tKSBjaG1vZGNtZD0iJGNobW9kcHJvZyAkMiIKLSAgICAgICAgc2hpZnQKLSAgICAgICAgc2hpZnQKLSAgICAgICAgY29udGludWU7OwotCi0gICAgLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgotICAgICAgICBzaGlmdAotICAgICAgICBzaGlmdAotICAgICAgICBjb250aW51ZTs7Ci0KLSAgICAtcykgc3RyaXBjbWQ9JHN0cmlwcHJvZwotICAgICAgICBzaGlmdAotICAgICAgICBjb250aW51ZTs7Ci0KLSAgICAtdCkgZHN0YXJnPSQyCi0Jc2hpZnQKLQlzaGlmdAotCWNvbnRpbnVlOzsKLQotICAgIC1UKSBub190YXJnZXRfZGlyZWN0b3J5PXRydWUKLQlzaGlmdAotCWNvbnRpbnVlOzsKLQotICAgIC0tdmVyc2lvbikgZWNobyAiJDAgJHNjcmlwdHZlcnNpb24iOyBleGl0ICQ/OzsKLQotICAgICopICAjIFdoZW4gLWQgaXMgdXNlZCwgYWxsIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZS4KLQkjIFdoZW4gLXQgaXMgdXNlZCwgdGhlIGRlc3RpbmF0aW9uIGlzIGFscmVhZHkgc3BlY2lmaWVkLgotCXRlc3QgLW4gIiRkaXJfYXJnJGRzdGFyZyIgJiYgYnJlYWsKLSAgICAgICAgIyBPdGhlcndpc2UsIHRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBkZXN0aW5hdGlvbi4gIFJlbW92ZSBpdCBmcm9tICRALgotCWZvciBhcmcKLQlkbwotICAgICAgICAgIGlmIHRlc3QgLW4gIiRkc3RhcmciOyB0aGVuCi0JICAgICMgJEAgaXMgbm90IGVtcHR5OiBpdCBjb250YWlucyBhdCBsZWFzdCAkYXJnLgotCSAgICBzZXQgZm5vcmQgIiRAIiAiJGRzdGFyZyIKLQkgICAgc2hpZnQgIyBmbm9yZAotCSAgZmkKLQkgIHNoaWZ0ICMgYXJnCi0JICBkc3Rhcmc9JGFyZwotCWRvbmUKLQlicmVhazs7Ci0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAteiAiJDEiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRkaXJfYXJnIjsgdGhlbgotICAgIGVjaG8gIiQwOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZC4iID4mMgotICAgIGV4aXQgMQotICBmaQotICAjIEl0J3MgT0sgdG8gY2FsbCBgaW5zdGFsbC1zaCAtZCcgd2l0aG91dCBhcmd1bWVudC4KLSAgIyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBjcmVhdGluZyBjb25kaXRpb25hbCBkaXJlY3Rvcmllcy4KLSAgZXhpdCAwCi1maQotCi1mb3Igc3JjCi1kbwotICAjIFByb3RlY3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBgLScuCi0gIGNhc2UgJHNyYyBpbgotICAgIC0qKSBzcmM9Li8kc3JjIDs7Ci0gIGVzYWMKLQotICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KLSAgICBkc3Q9JHNyYwotICAgIHNyYz0KLQotICAgIGlmIHRlc3QgLWQgIiRkc3QiOyB0aGVuCi0gICAgICBta2RpcmNtZD06Ci0gICAgICBjaG1vZGNtZD0KLSAgICBlbHNlCi0gICAgICBta2RpcmNtZD0kbWtkaXJwcm9nCi0gICAgZmkKLSAgZWxzZQotICAgICMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRjcHByb2cgJHNyYyAkZHN0dG1wIiBjb21tYW5kCi0gICAgIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZAotICAgICMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgotICAgIGlmIHRlc3QgISAtZiAiJHNyYyIgJiYgdGVzdCAhIC1kICIkc3JjIjsgdGhlbgotICAgICAgZWNobyAiJDA6ICRzcmMgZG9lcyBub3QgZXhpc3QuIiA+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC16ICIkZHN0YXJnIjsgdGhlbgotICAgICAgZWNobyAiJDA6IG5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZC4iID4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGRzdD0kZHN0YXJnCi0gICAgIyBQcm90ZWN0IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nLgotICAgIGNhc2UgJGRzdCBpbgotICAgICAgLSopIGRzdD0uLyRkc3QgOzsKLSAgICBlc2FjCi0KLSAgICAjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyB3b24ndCB3b3JrCi0gICAgIyBpZiBkb3VibGUgc2xhc2hlcyBhcmVuJ3QgaWdub3JlZC4KLSAgICBpZiB0ZXN0IC1kICIkZHN0IjsgdGhlbgotICAgICAgaWYgdGVzdCAtbiAiJG5vX3RhcmdldF9kaXJlY3RvcnkiOyB0aGVuCi0JZWNobyAiJDA6ICRkc3Rhcmc6IElzIGEgZGlyZWN0b3J5IiA+JjIKLQlleGl0IDEKLSAgICAgIGZpCi0gICAgICBkc3Q9JGRzdC9gYmFzZW5hbWUgIiRzcmMiYAotICAgIGZpCi0gIGZpCi0KLSAgIyBUaGlzIHNlZCBjb21tYW5kIGVtdWxhdGVzIHRoZSBkaXJuYW1lIGNvbW1hbmQuCi0gIGRzdGRpcj1gZWNobyAiJGRzdCIgfCBzZWQgLWUgJ3MsLyokLCw7cyxbXi9dKiQsLDtzLC8qJCwsO3MsXiQsLiwnYAotCi0gICMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCi0KLSAgIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KLSAgaWYgdGVzdCAhIC1kICIkZHN0ZGlyIjsgdGhlbgotICAgIGRlZmF1bHRJRlM9JwotCSAnCi0gICAgSUZTPSIke0lGUy0kZGVmYXVsdElGU30iCi0KLSAgICBvSUZTPSRJRlMKLSAgICAjIFNvbWUgc2gncyBjYW4ndCBoYW5kbGUgSUZTPS8gZm9yIHNvbWUgcmVhc29uLgotICAgIElGUz0nJScKLSAgICBzZXQgeCBgZWNobyAiJGRzdGRpciIgfCBzZWQgLWUgJ3NAL0AlQGcnIC1lICdzQF4lQC9AJ2AKLSAgICBzaGlmdAotICAgIElGUz0kb0lGUwotCi0gICAgcGF0aGNvbXA9Ci0KLSAgICB3aGlsZSB0ZXN0ICQjIC1uZSAwIDsgZG8KLSAgICAgIHBhdGhjb21wPSRwYXRoY29tcCQxCi0gICAgICBzaGlmdAotICAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCi0gICAgICAgICRta2RpcnByb2cgIiRwYXRoY29tcCIKLQkjIG1rZGlyIGNhbiBmYWlsIHdpdGggYSBgRmlsZSBleGlzdCcgZXJyb3IgaW4gY2FzZSBzZXZlcmFsCi0JIyBpbnN0YWxsLXNoIGFyZSBjcmVhdGluZyB0aGUgZGlyZWN0b3J5IGNvbmN1cnJlbnRseS4gIFRoaXMKLQkjIGlzIE9LLgotCXRlc3QgLWQgIiRwYXRoY29tcCIgfHwgZXhpdAotICAgICAgZmkKLSAgICAgIHBhdGhjb21wPSRwYXRoY29tcC8KLSAgICBkb25lCi0gIGZpCi0KLSAgaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCi0gICAgJGRvaXQgJG1rZGlyY21kICIkZHN0IiBcCi0gICAgICAmJiB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0IjsgfSBcCi0gICAgICAmJiB7IHRlc3QgLXogIiRjaGdycGNtZCIgfHwgJGRvaXQgJGNoZ3JwY21kICIkZHN0IjsgfSBcCi0gICAgICAmJiB7IHRlc3QgLXogIiRzdHJpcGNtZCIgfHwgJGRvaXQgJHN0cmlwY21kICIkZHN0IjsgfSBcCi0gICAgICAmJiB7IHRlc3QgLXogIiRjaG1vZGNtZCIgfHwgJGRvaXQgJGNobW9kY21kICIkZHN0IjsgfQotCi0gIGVsc2UKLSAgICBkc3RmaWxlPWBiYXNlbmFtZSAiJGRzdCJgCi0KLSAgICAjIE1ha2UgYSBjb3VwbGUgb2YgdGVtcCBmaWxlIG5hbWVzIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgotICAgIGRzdHRtcD0kZHN0ZGlyL19pbnN0LiQkXwotICAgIHJtdG1wPSRkc3RkaXIvX3JtLiQkXwotCi0gICAgIyBUcmFwIHRvIGNsZWFuIHVwIHRob3NlIHRlbXAgZmlsZXMgYXQgZXhpdC4KLSAgICB0cmFwICdyZXQ9JD87IHJtIC1mICIkZHN0dG1wIiAiJHJtdG1wIiAmJiBleGl0ICRyZXQnIDAKLSAgICB0cmFwICcoZXhpdCAkPyk7IGV4aXQnIDEgMiAxMyAxNQotCi0gICAgIyBDb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZS4KLSAgICAkZG9pdCAkY3Bwcm9nICIkc3JjIiAiJGRzdHRtcCIgJiYKLQotICAgICMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cy4KLSAgICAjCi0gICAgIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bwotICAgICMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQotICAgICMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KLSAgICAjCi0gICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdHRtcCI7IH0gXAotICAgICAgJiYgeyB0ZXN0IC16ICIkY2hncnBjbWQiIHx8ICRkb2l0ICRjaGdycGNtZCAiJGRzdHRtcCI7IH0gXAotICAgICAgJiYgeyB0ZXN0IC16ICIkc3RyaXBjbWQiIHx8ICRkb2l0ICRzdHJpcGNtZCAiJGRzdHRtcCI7IH0gXAotICAgICAgJiYgeyB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAiJGRzdHRtcCI7IH0gJiYKLQotICAgICMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KLSAgICB7ICRkb2l0ICRtdmNtZCAtZiAiJGRzdHRtcCIgIiRkc3RkaXIvJGRzdGZpbGUiIDI+L2Rldi9udWxsIFwKLSAgICAgIHx8IHsKLQkgICAjIFRoZSByZW5hbWUgZmFpbGVkLCBwZXJoYXBzIGJlY2F1c2UgbXYgY2FuJ3QgcmVuYW1lIHNvbWV0aGluZyBlbHNlCi0JICAgIyB0byBpdHNlbGYsIG9yIHBlcmhhcHMgYmVjYXVzZSBtdiBpcyBzbyBhbmNpZW50IHRoYXQgaXQgZG9lcyBub3QKLQkgICAjIHN1cHBvcnQgLWYuCi0KLQkgICAjIE5vdyByZW1vdmUgb3IgbW92ZSBhc2lkZSBhbnkgb2xkIGZpbGUgYXQgZGVzdGluYXRpb24gbG9jYXRpb24uCi0JICAgIyBXZSB0cnkgdGhpcyB0d28gd2F5cyBzaW5jZSBybSBjYW4ndCB1bmxpbmsgaXRzZWxmIG9uIHNvbWUKLQkgICAjIHN5c3RlbXMgYW5kIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG1pZ2h0IGJlIGJ1c3kgZm9yIG90aGVyCi0JICAgIyByZWFzb25zLiAgSW4gdGhpcyBjYXNlLCB0aGUgZmluYWwgY2xlYW51cCBtaWdodCBmYWlsIGJ1dCB0aGUgbmV3Ci0JICAgIyBmaWxlIHNob3VsZCBzdGlsbCBpbnN0YWxsIHN1Y2Nlc3NmdWxseS4KLQkgICB7Ci0JICAgICBpZiB0ZXN0IC1mICIkZHN0ZGlyLyRkc3RmaWxlIjsgdGhlbgotCSAgICAgICAkZG9pdCAkcm1jbWQgLWYgIiRkc3RkaXIvJGRzdGZpbGUiIDI+L2Rldi9udWxsIFwKLQkgICAgICAgfHwgJGRvaXQgJG12Y21kIC1mICIkZHN0ZGlyLyRkc3RmaWxlIiAiJHJtdG1wIiAyPi9kZXYvbnVsbCBcCi0JICAgICAgIHx8IHsKLQkJIGVjaG8gIiQwOiBjYW5ub3QgdW5saW5rIG9yIHJlbmFtZSAkZHN0ZGlyLyRkc3RmaWxlIiA+JjIKLQkJIChleGl0IDEpOyBleGl0IDEKLQkgICAgICAgfQotCSAgICAgZWxzZQotCSAgICAgICA6Ci0JICAgICBmaQotCSAgIH0gJiYKLQotCSAgICMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KLQkgICAkZG9pdCAkbXZjbWQgIiRkc3R0bXAiICIkZHN0ZGlyLyRkc3RmaWxlIgotCSB9Ci0gICAgfQotICBmaSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLWRvbmUKLQotIyBUaGUgZmluYWwgbGl0dGxlIHRyaWNrIHRvICJjb3JyZWN0bHkiIHBhc3MgdGhlIGV4aXQgc3RhdHVzIHRvIHRoZSBleGl0IHRyYXAuCi17Ci0gIChleGl0IDApOyBleGl0IDAKLX0KLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKLSMgdGltZS1zdGFtcC1lbmQ6ICIkIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9pbnN0YWxsLmRvYyBiL2luc3RhbGwuZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzAyYjk4Li4wMDAwMDAwCi0tLSBhL2luc3RhbGwuZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2MyArMCwwIEBACi1JTlNUQUxMQVRJT04gSU5TVFJVQ1RJT05TIGZvciB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIEpQRUcgc29mdHdhcmUKLQotQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLUZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLQotCi1UaGlzIGZpbGUgZXhwbGFpbnMgaG93IHRvIGNvbmZpZ3VyZSBhbmQgaW5zdGFsbCB0aGUgSUpHIHNvZnR3YXJlLiAgV2UgaGF2ZQotdHJpZWQgdG8gbWFrZSB0aGlzIHNvZnR3YXJlIGV4dHJlbWVseSBwb3J0YWJsZSBhbmQgZmxleGlibGUsIHNvIHRoYXQgaXQgY2FuIGJlCi1hZGFwdGVkIHRvIGFsbW9zdCBhbnkgZW52aXJvbm1lbnQuICBUaGUgZG93bnNpZGUgb2YgdGhpcyBkZWNpc2lvbiBpcyB0aGF0IHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MgaXMgY29tcGxpY2F0ZWQuICBXZSBoYXZlIHByb3ZpZGVkIHNob3J0Y3V0cyB0byBzaW1wbGlmeQotdGhlIHRhc2sgb24gY29tbW9uIHN5c3RlbXMuICBCdXQgaW4gYW55IGNhc2UsIHlvdSB3aWxsIG5lZWQgYXQgbGVhc3QgYSBsaXR0bGUKLWZhbWlsaWFyaXR5IHdpdGggQyBwcm9ncmFtbWluZyBhbmQgcHJvZ3JhbSBidWlsZCBwcm9jZWR1cmVzIGZvciB5b3VyIHN5c3RlbS4KLQotSWYgeW91IGFyZSBvbmx5IHVzaW5nIHRoaXMgc29mdHdhcmUgYXMgcGFydCBvZiBhIGxhcmdlciBwcm9ncmFtLCB0aGUgbGFyZ2VyCi1wcm9ncmFtJ3MgaW5zdGFsbGF0aW9uIHByb2NlZHVyZSBtYXkgdGFrZSBjYXJlIG9mIGNvbmZpZ3VyaW5nIHRoZSBJSkcgY29kZS4KLUZvciBleGFtcGxlLCBHaG9zdHNjcmlwdCdzIGluc3RhbGxhdGlvbiBzY3JpcHQgd2lsbCBjb25maWd1cmUgdGhlIElKRyBjb2RlLgotWW91IGRvbid0IG5lZWQgdG8gcmVhZCB0aGlzIGZpbGUgaWYgeW91IGp1c3Qgd2FudCB0byBjb21waWxlIEdob3N0c2NyaXB0LgotCi1JZiB5b3UgYXJlIG9uIGEgVW5peCBtYWNoaW5lLCB5b3UgbWF5IG5vdCBuZWVkIHRvIHJlYWQgdGhpcyBmaWxlIGF0IGFsbC4KLVRyeSBkb2luZwotCS4vY29uZmlndXJlCi0JbWFrZQotCW1ha2UgdGVzdAotSWYgdGhhdCBkb2Vzbid0IGNvbXBsYWluLCBkbwotCW1ha2UgaW5zdGFsbAotKGJldHRlciBkbyAibWFrZSAtbiBpbnN0YWxsIiBmaXJzdCB0byBzZWUgaWYgdGhlIG1ha2VmaWxlIHdpbGwgcHV0IHRoZSBmaWxlcwotd2hlcmUgeW91IHdhbnQgdGhlbSkuICBSZWFkIGZ1cnRoZXIgaWYgeW91IHJ1biBpbnRvIHNuYWdzIG9yIHdhbnQgdG8gY3VzdG9taXplCi10aGUgY29kZSBmb3IgeW91ciBzeXN0ZW0uCi0KLQotVEFCTEUgT0YgQ09OVEVOVFMKLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUJlZm9yZSB5b3Ugc3RhcnQKLUNvbmZpZ3VyaW5nIHRoZSBzb2Z0d2FyZToKLQl1c2luZyB0aGUgYXV0b21hdGljICJjb25maWd1cmUiIHNjcmlwdAotCXVzaW5nIG9uZSBvZiB0aGUgc3VwcGxpZWQgamNvbmZpZyBhbmQgbWFrZWZpbGUgZmlsZXMKLQlieSBoYW5kCi1CdWlsZGluZyB0aGUgc29mdHdhcmUKLVRlc3RpbmcgdGhlIHNvZnR3YXJlCi1JbnN0YWxsaW5nIHRoZSBzb2Z0d2FyZQotT3B0aW9uYWwgc3R1ZmYKLU9wdGltaXphdGlvbgotSGludHMgZm9yIHNwZWNpZmljIHN5c3RlbXMKLQotCi1CRUZPUkUgWU9VIFNUQVJUCi09PT09PT09PT09PT09PT09Ci0KLUJlZm9yZSBpbnN0YWxsaW5nIHRoZSBzb2Z0d2FyZSB5b3UgbXVzdCB1bnBhY2sgdGhlIGRpc3RyaWJ1dGVkIHNvdXJjZSBjb2RlLgotU2luY2UgeW91IGFyZSByZWFkaW5nIHRoaXMgZmlsZSwgeW91IGhhdmUgcHJvYmFibHkgYWxyZWFkeSBzdWNjZWVkZWQgaW4gdGhpcwotdGFzay4gIEhvd2V2ZXIsIHRoZXJlIGlzIGEgcG90ZW50aWFsIGZvciBlcnJvciBpZiB5b3UgbmVlZGVkIHRvIGNvbnZlcnQgdGhlCi1maWxlcyB0byB0aGUgbG9jYWwgc3RhbmRhcmQgdGV4dCBmaWxlIGZvcm1hdCAoZm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgb24KLU1TLURPUyB5b3UgbWF5IGhhdmUgY29udmVydGVkIExGIGVuZC1vZi1saW5lIHRvIENSL0xGKS4gIFlvdSBtdXN0IGFwcGx5Ci1zdWNoIGNvbnZlcnNpb24gdG8gYWxsIHRoZSBmaWxlcyBFWENFUFQgdGhvc2Ugd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCAidGVzdCIuCi1UaGUgdGVzdCBmaWxlcyBjb250YWluIGJpbmFyeSBkYXRhOyBpZiB5b3UgY2hhbmdlIHRoZW0gaW4gYW55IHdheSB0aGVuIHRoZQotc2VsZi10ZXN0IHdpbGwgZ2l2ZSBiYWQgcmVzdWx0cy4KLQotUGxlYXNlIGNoZWNrIHRoZSBsYXN0IHNlY3Rpb24gb2YgdGhpcyBmaWxlIHRvIHNlZSBpZiB0aGVyZSBhcmUgaGludHMgZm9yIHRoZQotc3BlY2lmaWMgbWFjaGluZSBvciBjb21waWxlciB5b3UgYXJlIHVzaW5nLgotCi0KLUNPTkZJR1VSSU5HIFRIRSBTT0ZUV0FSRQotPT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRvIGNvbmZpZ3VyZSB0aGUgSUpHIGNvZGUgZm9yIHlvdXIgc3lzdGVtLCB5b3UgbmVlZCB0byBjcmVhdGUgdHdvIGZpbGVzOgotICAqIGpjb25maWcuaDogY29udGFpbnMgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50ICNkZWZpbmUgc3ltYm9scy4KLSAgKiBNYWtlZmlsZTogY29udHJvbHMgdGhlIGNvbXBpbGF0aW9uIHByb2Nlc3MuCi0oT24gYSBub24tVW5peCBtYWNoaW5lLCB5b3UgbWF5IGNyZWF0ZSAicHJvamVjdCBmaWxlcyIgb3Igc29tZSBvdGhlcgotc3Vic3RpdHV0ZSBmb3IgYSBNYWtlZmlsZS4gIGpjb25maWcuaCBpcyBuZWVkZWQgaW4gYW55IGVudmlyb25tZW50LikKLQotV2UgcHJvdmlkZSB0aHJlZSBkaWZmZXJlbnQgd2F5cyB0byBnZW5lcmF0ZSB0aGVzZSBmaWxlczoKLSAgKiBPbiBhIFVuaXggc3lzdGVtLCB5b3UgY2FuIGp1c3QgcnVuIHRoZSAiY29uZmlndXJlIiBzY3JpcHQuCi0gICogV2UgcHJvdmlkZSBzYW1wbGUgamNvbmZpZyBmaWxlcyBhbmQgbWFrZWZpbGVzIGZvciBwb3B1bGFyIG1hY2hpbmVzOwotICAgIGlmIHlvdXIgbWFjaGluZSBtYXRjaGVzIG9uZSBvZiB0aGUgc2FtcGxlcywganVzdCBjb3B5IHRoZSByaWdodCBzYW1wbGUKLSAgICBmaWxlcyB0byBqY29uZmlnLmggYW5kIE1ha2VmaWxlLgotICAqIElmIGFsbCBlbHNlIGZhaWxzLCByZWFkIHRoZSBpbnN0cnVjdGlvbnMgYmVsb3cgYW5kIG1ha2UgeW91ciBvd24gZmlsZXMuCi0KLQotQ29uZmlndXJpbmcgdGhlIHNvZnR3YXJlIHVzaW5nIHRoZSBhdXRvbWF0aWMgImNvbmZpZ3VyZSIgc2NyaXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSWYgeW91IGFyZSBvbiBhIFVuaXggbWFjaGluZSwgeW91IGNhbiBqdXN0IHR5cGUKLQkuL2NvbmZpZ3VyZQotYW5kIGxldCB0aGUgY29uZmlndXJlIHNjcmlwdCBjb25zdHJ1Y3QgYXBwcm9wcmlhdGUgY29uZmlndXJhdGlvbiBmaWxlcy4KLUlmIHlvdSdyZSB1c2luZyAiY3NoIiBvbiBhbiBvbGQgdmVyc2lvbiBvZiBTeXN0ZW0gViwgeW91IG1pZ2h0IG5lZWQgdG8gdHlwZQotCXNoIGNvbmZpZ3VyZQotaW5zdGVhZCB0byBwcmV2ZW50IGNzaCBmcm9tIHRyeWluZyB0byBleGVjdXRlIGNvbmZpZ3VyZSBpdHNlbGYuCi1FeHBlY3QgY29uZmlndXJlIHRvIHJ1biBmb3IgYSBmZXcgbWludXRlcywgcGFydGljdWxhcmx5IG9uIHNsb3dlciBtYWNoaW5lczsKLWl0IHdvcmtzIGJ5IGNvbXBpbGluZyBhIHNlcmllcyBvZiB0ZXN0IHByb2dyYW1zLgotCi1Db25maWd1cmUgd2FzIGNyZWF0ZWQgd2l0aCBHTlUgQXV0b2NvbmYgYW5kIGl0IGZvbGxvd3MgdGhlIHVzdWFsIGNvbnZlbnRpb25zCi1mb3IgR05VIGNvbmZpZ3VyZSBzY3JpcHRzLiAgSXQgbWFrZXMgYSBmZXcgYXNzdW1wdGlvbnMgdGhhdCB5b3UgbWF5IHdhbnQgdG8KLW92ZXJyaWRlLiAgWW91IGNhbiBkbyB0aGlzIGJ5IHByb3ZpZGluZyBvcHRpb25hbCBzd2l0Y2hlcyB0byBjb25maWd1cmU6Ci0KLSogSWYgeW91IHdhbnQgdG8gYnVpbGQgbGlianBlZyBhcyBhIHNoYXJlZCBsaWJyYXJ5LCBzYXkKLQkuL2NvbmZpZ3VyZSAtLWVuYWJsZS1zaGFyZWQKLVRvIGdldCBib3RoIHNoYXJlZCBhbmQgc3RhdGljIGxpYnJhcmllcywgc2F5Ci0JLi9jb25maWd1cmUgLS1lbmFibGUtc2hhcmVkIC0tZW5hYmxlLXN0YXRpYwotTm90ZSB0aGF0IHRoZXNlIHN3aXRjaGVzIGludm9rZSBHTlUgbGlidG9vbCB0byB0YWtlIGNhcmUgb2Ygc3lzdGVtLWRlcGVuZGVudAotc2hhcmVkIGxpYnJhcnkgYnVpbGRpbmcgbWV0aG9kcy4gIElmIHRoaW5ncyBkb24ndCB3b3JrIHRoaXMgd2F5LCBwbGVhc2UgdHJ5Ci1ydW5uaW5nIGNvbmZpZ3VyZSB3aXRob3V0IGVpdGhlciBzd2l0Y2g7IHRoYXQgc2hvdWxkIGJ1aWxkIGEgc3RhdGljIGxpYnJhcnkKLXdpdGhvdXQgdXNpbmcgbGlidG9vbC4gIElmIHRoYXQgd29ya3MsIHlvdXIgcHJvYmxlbSBpcyBwcm9iYWJseSB3aXRoIGxpYnRvb2wKLW5vdCB3aXRoIHRoZSBJSkcgY29kZS4gIGxpYnRvb2wgaXMgZmFpcmx5IG5ldyBhbmQgZG9lc24ndCBzdXBwb3J0IGFsbCBmbGF2b3JzCi1vZiBVbml4IHlldC4gIChZb3UgbWlnaHQgYmUgYWJsZSB0byBmaW5kIGEgbmV3ZXIgdmVyc2lvbiBvZiBsaWJ0b29sIHRoYW4gdGhlCi1vbmUgaW5jbHVkZWQgd2l0aCBsaWJqcGVnOyBzZWUgZnRwLmdudS5vcmcuICBSZXBvcnQgbGlidG9vbCBwcm9ibGVtcyB0bwotYnVnLWxpYnRvb2xAZ251Lm9yZy4pCi0KLSogQ29uZmlndXJlIHdpbGwgdXNlIGdjYyAoR05VIEMgY29tcGlsZXIpIGlmIGl0J3MgYXZhaWxhYmxlLCBvdGhlcndpc2UgY2MuCi1UbyBmb3JjZSBhIHBhcnRpY3VsYXIgY29tcGlsZXIgdG8gYmUgc2VsZWN0ZWQsIHVzZSB0aGUgQ0Mgb3B0aW9uLCBmb3IgZXhhbXBsZQotCS4vY29uZmlndXJlIENDPSdjYycKLVRoZSBzYW1lIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBpbmNsdWRlIGFueSB1bnVzdWFsIGNvbXBpbGVyIHN3aXRjaGVzLgotRm9yIGV4YW1wbGUsIG9uIEhQLVVYIHlvdSBwcm9iYWJseSB3YW50IHRvIHNheQotCS4vY29uZmlndXJlIENDPSdjYyAtQWEnCi10byBnZXQgSFAncyBjb21waWxlciB0byBydW4gaW4gQU5TSSBtb2RlLgotCi0qIFRoZSBkZWZhdWx0IENGTEFHUyBzZXR0aW5nIGlzICItTyIgZm9yIG5vbi1nY2MgY29tcGlsZXJzLCAiLU8yIiBmb3IgZ2NjLgotWW91IGNhbiBvdmVycmlkZSB0aGlzIGJ5IHNheWluZywgZm9yIGV4YW1wbGUsCi0JLi9jb25maWd1cmUgQ0ZMQUdTPSctZycKLWlmIHlvdSB3YW50IHRvIGNvbXBpbGUgd2l0aCBkZWJ1Z2dpbmcgc3VwcG9ydC4KLQotKiBDb25maWd1cmUgd2lsbCBzZXQgdXAgdGhlIG1ha2VmaWxlIHNvIHRoYXQgIm1ha2UgaW5zdGFsbCIgd2lsbCBpbnN0YWxsIGZpbGVzCi1pbnRvIC91c3IvbG9jYWwvYmluLCAvdXNyL2xvY2FsL21hbiwgZXRjLiAgWW91IGNhbiBzcGVjaWZ5IGFuIGluc3RhbGxhdGlvbgotcHJlZml4IG90aGVyIHRoYW4gIi91c3IvbG9jYWwiIGJ5IGdpdmluZyBjb25maWd1cmUgdGhlIG9wdGlvbiAiLS1wcmVmaXg9UEFUSCIuCi0KLSogSWYgeW91IGRvbid0IGhhdmUgYSBsb3Qgb2Ygc3dhcCBzcGFjZSwgeW91IG1heSBuZWVkIHRvIGVuYWJsZSB0aGUgSUpHCi1zb2Z0d2FyZSdzIGludGVybmFsIHZpcnR1YWwgbWVtb3J5IG1lY2hhbmlzbS4gIFRvIGRvIHRoaXMsIGdpdmUgdGhlIG9wdGlvbgotIi0tZW5hYmxlLW1heG1lbT1OIiB3aGVyZSBOIGlzIHRoZSBkZWZhdWx0IG1heG1lbW9yeSBsaW1pdCBpbiBtZWdhYnl0ZXMuCi1UaGlzIGlzIGRpc2N1c3NlZCBpbiBtb3JlIGRldGFpbCB1bmRlciAiU2VsZWN0aW5nIGEgbWVtb3J5IG1hbmFnZXIiLCBiZWxvdy4KLVlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoaXMgb24gcmVhc29uYWJseS1zaXplZCBVbml4IG1hY2hpbmVzLAotdW5sZXNzIHlvdSBwbGFuIHRvIHByb2Nlc3MgdmVyeSBsYXJnZSBpbWFnZXMuCi0KLUNvbmZpZ3VyZSBoYXMgc29tZSBvdGhlciBmZWF0dXJlcyB0aGF0IGFyZSB1c2VmdWwgaWYgeW91IGFyZSBjcm9zcy1jb21waWxpbmcKLW9yIHdvcmtpbmcgaW4gYSBuZXR3b3JrIG9mIG11bHRpcGxlIG1hY2hpbmUgdHlwZXM7IGJ1dCBpZiB5b3UgbmVlZCB0aG9zZQotZmVhdHVyZXMsIHlvdSBwcm9iYWJseSBhbHJlYWR5IGtub3cgaG93IHRvIHVzZSB0aGVtLgotCi0KLUNvbmZpZ3VyaW5nIHRoZSBzb2Z0d2FyZSB1c2luZyBvbmUgb2YgdGhlIHN1cHBsaWVkIGpjb25maWcgYW5kIG1ha2VmaWxlIGZpbGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JZiB5b3UgaGF2ZSBvbmUgb2YgdGhlc2Ugc3lzdGVtcywgeW91IGNhbiBqdXN0IHVzZSB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvbgotZmlsZXM6Ci0KLU1ha2VmaWxlCWpjb25maWcgZmlsZQlTeXN0ZW0gYW5kL29yIGNvbXBpbGVyCi0KLW1ha2VmaWxlLm1hbngJamNvbmZpZy5tYW54CUFtaWdhLCBNYW54IEF6dGVjIEMKLW1ha2VmaWxlLnNhcwlqY29uZmlnLnNhcwlBbWlnYSwgU0FTIEMKLW1ha2Vwcm9qLm1hYwlqY29uZmlnLm1hYwlBcHBsZSBNYWNpbnRvc2gsIE1ldHJvd2Vya3MgQ29kZVdhcnJpb3IKLW1haypqcGVnLnN0CWpjb25maWcuc3QJQXRhcmkgU1QvU1RFL1RULCBQdXJlIEMgb3IgVHVyYm8gQwotbWFrZWZpbGUuYmNjCWpjb25maWcuYmNjCU1TLURPUyBvciBPUy8yLCBCb3JsYW5kIEMKLW1ha2VmaWxlLmRqCWpjb25maWcuZGoJTVMtRE9TLCBESkdQUCAoRGVsb3JpZSdzIHBvcnQgb2YgR05VIEMpCi1tYWtlZmlsZS5tYzYJamNvbmZpZy5tYzYJTVMtRE9TLCBNaWNyb3NvZnQgQyAoMTYtYml0IG9ubHkpCi1tYWtlZmlsZS53YXQJamNvbmZpZy53YXQJTVMtRE9TLCBPUy8yLCBvciBXaW5kb3dzIE5ULCBXYXRjb20gQwotbWFrZWZpbGUudmMJamNvbmZpZy52YwlXaW5kb3dzIE5ULzk1LCBNUyBWaXN1YWwgQysrCi1tYWtlKi5kcwlqY29uZmlnLnZjCVdpbmRvd3MgTlQvOTUsIE1TIERldmVsb3BlciBTdHVkaW8KLW1ha2VmaWxlLm1tcwlqY29uZmlnLnZtcwlEaWdpdGFsIFZNUywgd2l0aCBNTVMgc29mdHdhcmUKLW1ha2VmaWxlLnZtcwlqY29uZmlnLnZtcwlEaWdpdGFsIFZNUywgd2l0aG91dCBNTVMgc29mdHdhcmUKLQotQ29weSB0aGUgcHJvcGVyIGpjb25maWcgZmlsZSB0byBqY29uZmlnLmggYW5kIHRoZSBtYWtlZmlsZSB0byBNYWtlZmlsZSAob3IKLXdoYXRldmVyIHlvdXIgc3lzdGVtIHVzZXMgYXMgdGhlIHN0YW5kYXJkIG1ha2VmaWxlIG5hbWUpLiAgRm9yIG1vcmUgaW5mbyBzZWUKLXRoZSBhcHByb3ByaWF0ZSBzeXN0ZW0tc3BlY2lmaWMgaGludHMgc2VjdGlvbiBuZWFyIHRoZSBlbmQgb2YgdGhpcyBmaWxlLgotCi0KLUNvbmZpZ3VyaW5nIHRoZSBzb2Z0d2FyZSBieSBoYW5kCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1GaXJzdCwgZ2VuZXJhdGUgYSBqY29uZmlnLmggZmlsZS4gIElmIHlvdSBhcmUgbW9kZXJhdGVseSBmYW1pbGlhciB3aXRoIEMsCi10aGUgY29tbWVudHMgaW4gamNvbmZpZy5kb2Mgc2hvdWxkIGJlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBkbyB0aGlzOyBqdXN0Ci1jb3B5IGpjb25maWcuZG9jIHRvIGpjb25maWcuaCBhbmQgZWRpdCBpdCBhcHByb3ByaWF0ZWx5LiAgT3RoZXJ3aXNlLCB5b3UgbWF5Ci1wcmVmZXIgdG8gdXNlIHRoZSBja2NvbmZpZy5jIHByb2dyYW0uICBZb3Ugd2lsbCBuZWVkIHRvIGNvbXBpbGUgYW5kIGV4ZWN1dGUKLWNrY29uZmlnLmMgYnkgaGFuZCAtLS0gd2UgaG9wZSB5b3Uga25vdyBhdCBsZWFzdCBlbm91Z2ggdG8gZG8gdGhhdC4KLWNrY29uZmlnLmMgbWF5IG5vdCBjb21waWxlIHRoZSBmaXJzdCB0cnkgKGluIGZhY3QsIHRoZSB3aG9sZSBpZGVhIGlzIGZvciBpdAotdG8gZmFpbCBpZiBhbnl0aGluZyBpcyBnb2luZyB0bykuICBJZiB5b3UgZ2V0IGNvbXBpbGUgZXJyb3JzLCBmaXggdGhlbSBieQotZWRpdGluZyBja2NvbmZpZy5jIGFjY29yZGluZyB0byB0aGUgZGlyZWN0aW9ucyBnaXZlbiBpbiBja2NvbmZpZy5jLiAgT25jZQoteW91IGdldCBpdCB0byBydW4sIGl0IHdpbGwgd3JpdGUgYSBzdWl0YWJsZSBqY29uZmlnLmggZmlsZSwgYW5kIHdpbGwgYWxzbwotcHJpbnQgb3V0IHNvbWUgYWR2aWNlIGFib3V0IHdoaWNoIG1ha2VmaWxlIHRvIHVzZS4KLQotWW91IG1heSBhbHNvIHdhbnQgdG8gbG9vayBhdCB0aGUgY2FubmVkIGpjb25maWcgZmlsZXMsIGlmIHRoZXJlIGlzIG9uZSBmb3IgYQotc3lzdGVtIHNpbWlsYXIgdG8geW91cnMuCi0KLVNlY29uZCwgc2VsZWN0IGEgbWFrZWZpbGUgYW5kIGNvcHkgaXQgdG8gTWFrZWZpbGUgKG9yIHdoYXRldmVyIHlvdXIgc3lzdGVtCi11c2VzIGFzIHRoZSBzdGFuZGFyZCBtYWtlZmlsZSBuYW1lKS4gIFRoZSBtb3N0IGdlbmVyaWMgbWFrZWZpbGVzIHdlIHByb3ZpZGUKLWFyZQotCW1ha2VmaWxlLmFuc2k6CWlmIHlvdXIgQyBjb21waWxlciBzdXBwb3J0cyBmdW5jdGlvbiBwcm90b3R5cGVzCi0JbWFrZWZpbGUudW5peDoJaWYgbm90LgotKFlvdSBoYXZlIGZ1bmN0aW9uIHByb3RvdHlwZXMgaWYgY2tjb25maWcuYyBwdXQgIiNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTIgotaW4gamNvbmZpZy5oLikgIFlvdSBtYXkgd2FudCB0byBzdGFydCBmcm9tIG9uZSBvZiB0aGUgb3RoZXIgbWFrZWZpbGVzIGlmCi10aGVyZSBpcyBvbmUgZm9yIGEgc3lzdGVtIHNpbWlsYXIgdG8geW91cnMuCi0KLUxvb2sgb3ZlciB0aGUgc2VsZWN0ZWQgTWFrZWZpbGUgYW5kIGFkanVzdCBvcHRpb25zIGFzIG5lZWRlZC4gIEluIHBhcnRpY3VsYXIKLXlvdSBtYXkgd2FudCB0byBjaGFuZ2UgdGhlIENDIGFuZCBDRkxBR1MgZGVmaW5pdGlvbnMuICBGb3IgaW5zdGFuY2UsIGlmIHlvdQotYXJlIHVzaW5nIEdDQywgc2V0IENDPWdjYy4gIElmIHlvdSBoYWQgdG8gdXNlIGFueSBjb21waWxlciBzd2l0Y2hlcyB0byBnZXQKLWNrY29uZmlnLmMgdG8gd29yaywgbWFrZSBzdXJlIHRoZSBzYW1lIHN3aXRjaGVzIGFyZSBpbiBDRkxBR1MuCi0KLUlmIHlvdSBhcmUgb24gYSBzeXN0ZW0gdGhhdCBkb2Vzbid0IHVzZSBtYWtlZmlsZXMsIHlvdSdsbCBuZWVkIHRvIHNldCB1cAotcHJvamVjdCBmaWxlcyAob3Igd2hhdGV2ZXIgeW91IGRvIHVzZSkgdG8gY29tcGlsZSBhbGwgdGhlIHNvdXJjZSBmaWxlcyBhbmQKLWxpbmsgdGhlbSBpbnRvIGV4ZWN1dGFibGUgZmlsZXMgY2pwZWcsIGRqcGVnLCBqcGVndHJhbiwgcmRqcGdjb20sIGFuZCB3cmpwZ2NvbS4KLVNlZSB0aGUgZmlsZSBsaXN0cyBpbiBhbnkgb2YgdGhlIG1ha2VmaWxlcyB0byBmaW5kIG91dCB3aGljaCBmaWxlcyBnbyBpbnRvCi1lYWNoIHByb2dyYW0uICBOb3RlIHRoYXQgdGhlIHByb3ZpZGVkIG1ha2VmaWxlcyBhbGwgbWFrZSBhICJsaWJyYXJ5IiBmaWxlCi1saWJqcGVnIGZpcnN0LCBidXQgeW91IGRvbid0IGhhdmUgdG8gZG8gdGhhdCBpZiB5b3UgZG9uJ3Qgd2FudCB0bzsgdGhlIGZpbGUKLWxpc3RzIGlkZW50aWZ5IHdoaWNoIHNvdXJjZSBmaWxlcyBhcmUgYWN0dWFsbHkgbmVlZGVkIGZvciBjb21wcmVzc2lvbiwKLWRlY29tcHJlc3Npb24sIG9yIGJvdGguICBBcyBhIGxhc3QgcmVzb3J0LCB5b3UgY2FuIG1ha2UgYSBiYXRjaCBzY3JpcHQgdGhhdAotanVzdCBjb21waWxlcyBldmVyeXRoaW5nIGFuZCBsaW5rcyBpdCBhbGwgdG9nZXRoZXI7IG1ha2VmaWxlLnZtcyBpcyBhbiBleGFtcGxlCi1vZiB0aGlzIChpdCdzIGZvciBWTVMgc3lzdGVtcyB0aGF0IGhhdmUgbm8gbWFrZS1saWtlIHV0aWxpdHkpLgotCi1IZXJlIGFyZSBjb21tZW50cyBhYm91dCBzb21lIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZGVjaXNpb25zIHlvdSdsbAotbmVlZCB0byBtYWtlOgotCi1Db21tYW5kIGxpbmUgc3R5bGUKLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGVzZSBwcm9ncmFtcyBjYW4gdXNlIGEgVW5peC1saWtlIGNvbW1hbmQgbGluZSBzdHlsZSB3aGljaCBzdXBwb3J0cwotcmVkaXJlY3Rpb24gYW5kIHBpcGluZywgbGlrZSB0aGlzOgotCWNqcGVnIGlucHV0ZmlsZSA+b3V0cHV0ZmlsZQotCWNqcGVnIDxpbnB1dGZpbGUgPm91dHB1dGZpbGUKLQlzb3VyY2UgcHJvZ3JhbSB8IGNqcGVnID5vdXRwdXRmaWxlCi1UaGUgc2ltcGxlciAidHdvIGZpbGUiIGNvbW1hbmQgbGluZSBzdHlsZSBpcyBqdXN0Ci0JY2pwZWcgaW5wdXRmaWxlIG91dHB1dGZpbGUKLVlvdSBtYXkgcHJlZmVyIHRoZSB0d28tZmlsZSBzdHlsZSwgcGFydGljdWxhcmx5IGlmIHlvdSBkb24ndCBoYXZlIHBpcGVzLgotCi1Zb3UgTVVTVCB1c2UgdHdvLWZpbGUgc3R5bGUgb24gYW55IHN5c3RlbSB0aGF0IGRvZXNuJ3QgY29wZSB3ZWxsIHdpdGggYmluYXJ5Ci1kYXRhIGZlZCB0aHJvdWdoIHN0ZGluL3N0ZG91dDsgdGhpcyBpcyB0cnVlIGZvciBzb21lIE1TLURPUyBjb21waWxlcnMsIGZvcgotZXhhbXBsZS4gIElmIHlvdSdyZSBub3Qgb24gYSBVbml4IHN5c3RlbSwgaXQncyBzYWZlc3QgdG8gYXNzdW1lIHlvdSBuZWVkCi10d28tZmlsZSBzdHlsZS4gIChCdXQgaWYgeW91ciBjb21waWxlciBwcm92aWRlcyBlaXRoZXIgdGhlIFBvc2l4LXN0YW5kYXJkCi1mZG9wZW4oKSBsaWJyYXJ5IHJvdXRpbmUgb3IgYSBNaWNyb3NvZnQtY29tcGF0aWJsZSBzZXRtb2RlKCkgcm91dGluZSwgeW91Ci1jYW4gc2FmZWx5IHVzZSB0aGUgVW5peCBjb21tYW5kIGxpbmUgc3R5bGUsIGJ5IGRlZmluaW5nIFVTRV9GRE9QRU4gb3IKLVVTRV9TRVRNT0RFIHJlc3BlY3RpdmVseS4pCi0KLVRvIHVzZSB0aGUgdHdvLWZpbGUgc3R5bGUsIG1ha2UgamNvbmZpZy5oIHNheSAiI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORSIuCi0KLVNlbGVjdGluZyBhIG1lbW9yeSBtYW5hZ2VyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgSUpHIGNvZGUgaXMgY2FwYWJsZSBvZiB3b3JraW5nIG9uIGltYWdlcyB0aGF0IGFyZSB0b28gYmlnIHRvIGZpdCBpbiBtYWluCi1tZW1vcnk7IGRhdGEgaXMgc3dhcHBlZCBvdXQgdG8gdGVtcG9yYXJ5IGZpbGVzIGFzIG5lY2Vzc2FyeS4gIEhvd2V2ZXIsIHRoZQotY29kZSB0byBkbyB0aGlzIGlzIHJhdGhlciBzeXN0ZW0tZGVwZW5kZW50LiAgV2UgcHJvdmlkZSBmaXZlIGRpZmZlcmVudAotbWVtb3J5IG1hbmFnZXJzOgotCi0qIGptZW1hbnNpLmMJVGhpcyB2ZXJzaW9uIHVzZXMgdGhlIEFOU0ktc3RhbmRhcmQgbGlicmFyeSByb3V0aW5lIHRtcGZpbGUoKSwKLQkJd2hpY2ggbm90IGFsbCBub24tQU5TSSBzeXN0ZW1zIGhhdmUuICBPbiBzb21lIHN5c3RlbXMKLQkJdG1wZmlsZSgpIG1heSBwdXQgdGhlIHRlbXBvcmFyeSBmaWxlIGluIGEgbm9uLW9wdGltYWwKLQkJbG9jYXRpb247IGlmIHlvdSBkb24ndCBsaWtlIHdoYXQgaXQgZG9lcywgdXNlIGptZW1uYW1lLmMuCi0KLSogam1lbW5hbWUuYwlUaGlzIHZlcnNpb24gY3JlYXRlcyBuYW1lZCB0ZW1wb3JhcnkgZmlsZXMuICBGb3IgYW55dGhpbmcKLQkJZXhjZXB0IGEgVW5peCBtYWNoaW5lLCB5b3UnbGwgbmVlZCB0byBjb25maWd1cmUgdGhlCi0JCXNlbGVjdF9maWxlX25hbWUoKSByb3V0aW5lIGFwcHJvcHJpYXRlbHk7IHNlZSB0aGUgY29tbWVudHMKLQkJbmVhciB0aGUgaGVhZCBvZiBqbWVtbmFtZS5jLiAgSWYgeW91IHVzZSB0aGlzIHZlcnNpb24sIGRlZmluZQotCQlORUVEX1NJR05BTF9DQVRDSEVSIGluIGpjb25maWcuaCB0byBtYWtlIHN1cmUgdGhlIHRlbXAgZmlsZXMKLQkJYXJlIHJlbW92ZWQgaWYgdGhlIHByb2dyYW0gaXMgYWJvcnRlZC4KLQotKiBqbWVtbm9icy5jCShUaGF0IHN0YW5kcyBmb3IgTm8gQmFja2luZyBTdG9yZSA6LSkuKSAgVGhpcyB3aWxsIGNvbXBpbGUgb24KLQkJYWxtb3N0IGFueSBzeXN0ZW0sIGJ1dCBpdCBhc3N1bWVzIHlvdSBoYXZlIGVub3VnaCBtYWluIG1lbW9yeQotCQlvciB2aXJ0dWFsIG1lbW9yeSB0byBob2xkIHRoZSBiaWdnZXN0IGltYWdlcyB5b3Ugd29yayB3aXRoLgotCi0qIGptZW1kb3MuYwlUaGlzIHNob3VsZCBiZSB1c2VkIHdpdGggbW9zdCAxNi1iaXQgTVMtRE9TIGNvbXBpbGVycy4KLQkJU2VlIHRoZSBzeXN0ZW0tc3BlY2lmaWMgbm90ZXMgYWJvdXQgTVMtRE9TIGZvciBtb3JlIGluZm8uCi0JCUlNUE9SVEFOVDogaWYgeW91IHVzZSB0aGlzLCBkZWZpbmUgVVNFX01TRE9TX01FTU1HUiBpbgotCQlqY29uZmlnLmgsIGFuZCBpbmNsdWRlIHRoZSBhc3NlbWJseSBmaWxlIGptZW1kb3NhLmFzbSBpbiB0aGUKLQkJcHJvZ3JhbXMuICBUaGUgc3VwcGxpZWQgbWFrZWZpbGVzIGFuZCBqY29uZmlnIGZpbGVzIGZvcgotCQkxNi1iaXQgTVMtRE9TIGNvbXBpbGVycyBhbHJlYWR5IGRvIGJvdGguCi0KLSogam1lbW1hYy5jCUN1c3RvbSB2ZXJzaW9uIGZvciBBcHBsZSBNYWNpbnRvc2g7IHNlZSB0aGUgc3lzdGVtLXNwZWNpZmljCi0JCW5vdGVzIGZvciBNYWNpbnRvc2ggZm9yIG1vcmUgaW5mby4KLQotVG8gdXNlIGEgcGFydGljdWxhciBtZW1vcnkgbWFuYWdlciwgY2hhbmdlIHRoZSBTWVNERVBNRU0gdmFyaWFibGUgaW4geW91cgotbWFrZWZpbGUgdG8gZXF1YWwgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0IGZpbGUgbmFtZSAoZm9yIGV4YW1wbGUsIGptZW1hbnNpLm8KLW9yIGptZW1hbnNpLm9iaiBmb3Igam1lbWFuc2kuYykuCi0KLUlmIHlvdSBoYXZlIHBsZW50eSBvZiAocmVhbCBvciB2aXJ0dWFsKSBtYWluIG1lbW9yeSwganVzdCB1c2Ugam1lbW5vYnMuYy4KLSJQbGVudHkiIG1lYW5zIGFib3V0IHRlbiBieXRlcyBmb3IgZXZlcnkgcGl4ZWwgaW4gdGhlIGxhcmdlc3QgaW1hZ2VzCi15b3UgcGxhbiB0byBwcm9jZXNzLCBzbyBhIGxvdCBvZiBzeXN0ZW1zIGRvbid0IG1lZXQgdGhpcyBjcml0ZXJpb24uCi1JZiB5b3VycyBkb2Vzbid0LCB0cnkgam1lbWFuc2kuYyBmaXJzdC4gIElmIHRoYXQgZG9lc24ndCBjb21waWxlLCB5b3UnbGwgaGF2ZQotdG8gdXNlIGptZW1uYW1lLmM7IGJlIHN1cmUgdG8gYWRqdXN0IHNlbGVjdF9maWxlX25hbWUoKSBmb3IgbG9jYWwgY29uZGl0aW9ucy4KLVlvdSBtYXkgYWxzbyBuZWVkIHRvIGNoYW5nZSB1bmxpbmsoKSB0byByZW1vdmUoKSBpbiBjbG9zZV9iYWNraW5nX3N0b3JlKCkuCi0KLUV4Y2VwdCB3aXRoIGptZW1ub2JzLmMgb3Igam1lbW1hYy5jLCB5b3UgbmVlZCB0byBhZGp1c3QgdGhlIERFRkFVTFRfTUFYX01FTQotc2V0dGluZyB0byBhIHJlYXNvbmFibGUgdmFsdWUgZm9yIHlvdXIgc3lzdGVtIChlaXRoZXIgYnkgYWRkaW5nIGEgI2RlZmluZSBmb3IKLURFRkFVTFRfTUFYX01FTSB0byBqY29uZmlnLmgsIG9yIGJ5IGFkZGluZyBhIC1EIHN3aXRjaCB0byB0aGUgTWFrZWZpbGUpLgotVGhpcyB2YWx1ZSBsaW1pdHMgdGhlIGFtb3VudCBvZiBkYXRhIHNwYWNlIHRoZSBwcm9ncmFtIHdpbGwgYXR0ZW1wdCB0bwotYWxsb2NhdGUuICBDb2RlIGFuZCBzdGF0aWMgZGF0YSBzcGFjZSBpc24ndCBjb3VudGVkLCBzbyB0aGUgYWN0dWFsIG1lbW9yeQotbmVlZHMgZm9yIGNqcGVnIG9yIGRqcGVnIGFyZSB0eXBpY2FsbHkgMTAwIHRvIDE1MEtiIG1vcmUgdGhhbiB0aGUgbWF4LW1lbW9yeQotc2V0dGluZy4gIExhcmdlciBtYXgtbWVtb3J5IHNldHRpbmdzIHJlZHVjZSB0aGUgYW1vdW50IG9mIEkvTyBuZWVkZWQgdG8KLXByb2Nlc3MgYSBsYXJnZSBpbWFnZSwgYnV0IHRvbyBsYXJnZSBhIHZhbHVlIGNhbiByZXN1bHQgaW4gImluc3VmZmljaWVudAotbWVtb3J5IiBmYWlsdXJlcy4gIE9uIG1vc3QgVW5peCBtYWNoaW5lcyAoYW5kIG90aGVyIHN5c3RlbXMgd2l0aCB2aXJ0dWFsCi1tZW1vcnkpLCBqdXN0IHNldCBERUZBVUxUX01BWF9NRU0gdG8gc2V2ZXJhbCBtaWxsaW9uIGFuZCBmb3JnZXQgaXQuICBBdCB0aGUKLW90aGVyIGVuZCBvZiB0aGUgc3BlY3RydW0sIGZvciBNUy1ET1MgbWFjaGluZXMgeW91IHByb2JhYmx5IGNhbid0IGdvIG11Y2gKLWFib3ZlIDMwMEsgdG8gNDAwSy4gIChPbiBNUy1ET1MgdGhlIHZhbHVlIHJlZmVycyB0byBjb252ZW50aW9uYWwgbWVtb3J5IG9ubHkuCi1FeHRlbmRlZC9leHBhbmRlZCBtZW1vcnkgaXMgaGFuZGxlZCBzZXBhcmF0ZWx5IGJ5IGptZW1kb3MuYy4pCi0KLQotQlVJTERJTkcgVEhFIFNPRlRXQVJFCi09PT09PT09PT09PT09PT09PT09PT0KLQotTm93IHlvdSBzaG91bGQgYmUgYWJsZSB0byBjb21waWxlIHRoZSBzb2Z0d2FyZS4gIEp1c3Qgc2F5ICJtYWtlIiAob3IKLXdoYXRldmVyJ3MgbmVjZXNzYXJ5IHRvIHN0YXJ0IHRoZSBjb21waWxhdGlvbikuICBIYXZlIGEgY3VwIG9mIGNvZmZlZS4KLQotSGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCBjb3VsZCBnbyB3cm9uZzoKLQotSWYgeW91ciBjb21waWxlciBjb21wbGFpbnMgYWJvdXQgdW5kZWZpbmVkIHN0cnVjdHVyZXMsIHlvdSBzaG91bGQgYmUgYWJsZSB0bwotc2h1dCBpdCB1cCBieSBwdXR0aW5nICIjZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOIiBpbiBqY29uZmlnLmguCi0KLUlmIHlvdSBoYXZlIHRyb3VibGUgd2l0aCBtaXNzaW5nIHN5c3RlbSBpbmNsdWRlIGZpbGVzIG9yIGluY2x1c2lvbiBvZiB0aGUKLXdyb25nIG9uZXMsIHJlYWQgamluY2x1ZGUuaC4gIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBpZiB5b3UgdXNlZCBjb25maWd1cmUKLW9yIGNrY29uZmlnLmMgdG8gc2V0IHVwIGpjb25maWcuaC4KLQotVGhlcmUgYXJlIGEgZmFpciBudW1iZXIgb2Ygcm91dGluZXMgdGhhdCBkbyBub3QgdXNlIGFsbCBvZiB0aGVpciBwYXJhbWV0ZXJzOwotc29tZSBjb21waWxlcnMgd2lsbCBpc3N1ZSB3YXJuaW5ncyBhYm91dCB0aGlzLCB3aGljaCB5b3UgY2FuIGlnbm9yZS4gIFRoZXJlCi1hcmUgYWxzbyBhIGZldyBjb25maWd1cmF0aW9uIGNoZWNrcyB0aGF0IG1heSBnaXZlICJ1bnJlYWNoYWJsZSBjb2RlIiB3YXJuaW5ncy4KLUFueSBvdGhlciB3YXJuaW5nIGRlc2VydmVzIGludmVzdGlnYXRpb24uCi0KLUlmIHlvdSBkb24ndCBoYXZlIGEgZ2V0ZW52KCkgbGlicmFyeSByb3V0aW5lLCBkZWZpbmUgTk9fR0VURU5WLgotCi1BbHNvIHNlZSB0aGUgc3lzdGVtLXNwZWNpZmljIGhpbnRzLCBiZWxvdy4KLQotCi1URVNUSU5HIFRIRSBTT0ZUV0FSRQotPT09PT09PT09PT09PT09PT09PT0KLQotQXMgYSBxdWljayB0ZXN0IG9mIGZ1bmN0aW9uYWxpdHkgd2UndmUgaW5jbHVkZWQgYSBzbWFsbCBzYW1wbGUgaW1hZ2UgaW4KLXNldmVyYWwgZm9ybXM6Ci0JdGVzdG9yaWcuanBnCVN0YXJ0aW5nIHBvaW50IGZvciB0aGUgZGpwZWcgdGVzdHMuCi0JdGVzdGltZy5wcG0JVGhlIG91dHB1dCBvZiBkanBlZyB0ZXN0b3JpZy5qcGcKLQl0ZXN0aW1nLmJtcAlUaGUgb3V0cHV0IG9mIGRqcGVnIC1ibXAgLWNvbG9ycyAyNTYgdGVzdG9yaWcuanBnCi0JdGVzdGltZy5qcGcJVGhlIG91dHB1dCBvZiBjanBlZyB0ZXN0aW1nLnBwbQotCXRlc3Rwcm9nLmpwZwlQcm9ncmVzc2l2ZS1tb2RlIGVxdWl2YWxlbnQgb2YgdGVzdG9yaWcuanBnLgotCXRlc3RpbWdwLmpwZwlUaGUgb3V0cHV0IG9mIGNqcGVnIC1wcm9ncmVzc2l2ZSAtb3B0aW1pemUgdGVzdGltZy5wcG0KLShUaGUgZmlyc3QtIGFuZCBzZWNvbmQtZ2VuZXJhdGlvbiAuanBnIGZpbGVzIGFyZW4ndCBpZGVudGljYWwgc2luY2UgSlBFRyBpcwotbG9zc3kuKSAgSWYgeW91IGNhbiBnZW5lcmF0ZSBkdXBsaWNhdGVzIG9mIHRoZSB0ZXN0aW1nKiBmaWxlcyB0aGVuIHlvdQotcHJvYmFibHkgaGF2ZSB3b3JraW5nIHByb2dyYW1zLgotCi1XaXRoIG1vc3Qgb2YgdGhlIG1ha2VmaWxlcywgIm1ha2UgdGVzdCIgd2lsbCBwZXJmb3JtIHRoZSBuZWNlc3NhcnkKLWNvbXBhcmlzb25zLgotCi1JZiB5b3UncmUgdXNpbmcgYSBtYWtlZmlsZSB0aGF0IGRvZXNuJ3QgcHJvdmlkZSB0aGUgdGVzdCBvcHRpb24sIHJ1biBkanBlZwotYW5kIGNqcGVnIGJ5IGhhbmQgYW5kIGNvbXBhcmUgdGhlIG91dHB1dCBmaWxlcyB0byB0ZXN0aW1nKiB3aXRoIHdoYXRldmVyCi1iaW5hcnkgZmlsZSBjb21wYXJpc29uIHRvb2wgeW91IGhhdmUuICBUaGUgZmlsZXMgc2hvdWxkIGJlIGJpdC1mb3ItYml0Ci1pZGVudGljYWwuCi0KLUlmIHRoZSBwcm9ncmFtcyBjb21wbGFpbiAiTUFYX0FMTE9DX0NIVU5LIGlzIHdyb25nLCBwbGVhc2UgZml4IiwgdGhlbiB5b3UKLW5lZWQgdG8gcmVkdWNlIE1BWF9BTExPQ19DSFVOSyB0byBhIHZhbHVlIHRoYXQgZml0cyBpbiB0eXBlIHNpemVfdC4KLVRyeSBhZGRpbmcgIiNkZWZpbmUgTUFYX0FMTE9DX0NIVU5LIDY1NTIwTCIgdG8gamNvbmZpZy5oLiAgQSBsZXNzIGxpa2VseQotY29uZmlndXJhdGlvbiBlcnJvciBpcyAiQUxJR05fVFlQRSBpcyB3cm9uZywgcGxlYXNlIGZpeCI6IGRlZmluaW5nIEFMSUdOX1RZUEUKLWFzIGxvbmcgc2hvdWxkIHRha2UgY2FyZSBvZiB0aGF0IG9uZS4KLQotSWYgdGhlIGNqcGVnIHRlc3QgcnVuIGZhaWxzIHdpdGggIk1pc3NpbmcgSHVmZm1hbiBjb2RlIHRhYmxlIGVudHJ5IiwgaXQncyBhCi1nb29kIGJldCB0aGF0IHlvdSBuZWVkZWQgdG8gZGVmaW5lIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVELiAgR28gYmFjayB0byB0aGUKLWNvbmZpZ3VyYXRpb24gc3RlcCBhbmQgcnVuIGNrY29uZmlnLmMuICAoVGhpcyBpcyBhIGdvb2QgcGxhbiBmb3IgYW55IG90aGVyCi10ZXN0IGZhaWx1cmUsIHRvby4pCi0KLUlmIHlvdSBhcmUgdXNpbmcgVW5peCAob25lLWZpbGUpIGNvbW1hbmQgbGluZSBzdHlsZSBvbiBhIG5vbi1Vbml4IHN5c3RlbSwKLWl0J3MgYSBnb29kIGlkZWEgdG8gY2hlY2sgdGhhdCBiaW5hcnkgSS9PIHRocm91Z2ggc3RkaW4vc3Rkb3V0IGFjdHVhbGx5Ci13b3Jrcy4gIFlvdSBzaG91bGQgZ2V0IHRoZSBzYW1lIHJlc3VsdHMgZnJvbSAiZGpwZWcgPHRlc3RvcmlnLmpwZyA+b3V0LnBwbSIKLWFzIGZyb20gImRqcGVnIC1vdXRmaWxlIG91dC5wcG0gdGVzdG9yaWcuanBnIi4gIE5vdGUgdGhhdCB0aGUgbWFrZWZpbGVzIGFsbAotdXNlIHRoZSBsYXR0ZXIgc3R5bGUgYW5kIHRoZXJlZm9yZSBkbyBub3QgZXhlcmNpc2Ugc3RkaW4vc3Rkb3V0ISAgSWYgdGhpcwotY2hlY2sgZmFpbHMsIHRyeSByZWNvbXBpbGluZyB3aXRoIFVTRV9TRVRNT0RFIG9yIFVTRV9GRE9QRU4gZGVmaW5lZC4KLUlmIGl0IHN0aWxsIGRvZXNuJ3Qgd29yaywgYmV0dGVyIHVzZSB0d28tZmlsZSBzdHlsZS4KLQotSWYgeW91IGNob3NlIGEgbWVtb3J5IG1hbmFnZXIgb3RoZXIgdGhhbiBqbWVtbm9icy5jLCB5b3Ugc2hvdWxkIHRlc3QgdGhhdAotdGVtcG9yYXJ5LWZpbGUgdXNhZ2Ugd29ya3MuICBUcnkgImRqcGVnIC1ibXAgLWNvbG9ycyAyNTYgLW1heCAwIHRlc3RvcmlnLmpwZyIKLWFuZCBtYWtlIHN1cmUgaXRzIG91dHB1dCBtYXRjaGVzIHRlc3RpbWcuYm1wLiAgSWYgeW91IGhhdmUgYW55IHJlYWxseSBsYXJnZQotaW1hZ2VzIGhhbmR5LCB0cnkgY29tcHJlc3NpbmcgdGhlbSB3aXRoIC1vcHRpbWl6ZSBhbmQvb3IgZGVjb21wcmVzc2luZyB3aXRoCi0tY29sb3JzIDI1NiB0byBtYWtlIHN1cmUgeW91ciBERUZBVUxUX01BWF9NRU0gc2V0dGluZyBpcyBub3QgdG9vIGxhcmdlLgotCi1OT1RFOiB0aGlzIGlzIGZhciBmcm9tIGFuIGV4aGF1c3RpdmUgdGVzdCBvZiB0aGUgSlBFRyBzb2Z0d2FyZTsgc29tZSBtb2R1bGVzLAotc3VjaCBhcyAxLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uLCBhcmUgbm90IGV4ZXJjaXNlZCBhdCBhbGwuICBJdCdzIGp1c3QgYQotcXVpY2sgdGVzdCB0byBnaXZlIHlvdSBzb21lIGNvbmZpZGVuY2UgdGhhdCB5b3UgaGF2ZW4ndCBtaXNzZWQgc29tZXRoaW5nCi1tYWpvci4KLQotCi1JTlNUQUxMSU5HIFRIRSBTT0ZUV0FSRQotPT09PT09PT09PT09PT09PT09PT09PT0KLQotT25jZSB5b3UncmUgZG9uZSB3aXRoIHRoZSBhYm92ZSBzdGVwcywgeW91IGNhbiBpbnN0YWxsIHRoZSBzb2Z0d2FyZSBieQotY29weWluZyB0aGUgZXhlY3V0YWJsZSBmaWxlcyAoY2pwZWcsIGRqcGVnLCBqcGVndHJhbiwgcmRqcGdjb20sIGFuZCB3cmpwZ2NvbSkKLXRvIHdoZXJldmVyIHlvdSBub3JtYWxseSBpbnN0YWxsIHByb2dyYW1zLiAgT24gVW5peCBzeXN0ZW1zLCB5b3UnbGwgYWxzbyB3YW50Ci10byBwdXQgdGhlIG1hbiBwYWdlcyAoY2pwZWcuMSwgZGpwZWcuMSwganBlZ3RyYW4uMSwgcmRqcGdjb20uMSwgd3JqcGdjb20uMSkKLWluIHRoZSBtYW4tcGFnZSBkaXJlY3RvcnkuICBUaGUgcHJlLWZhYiBtYWtlZmlsZXMgZG9uJ3Qgc3VwcG9ydCB0aGlzIHN0ZXAKLXNpbmNlIHRoZXJlJ3Mgc3VjaCBhIHdpZGUgdmFyaWV0eSBvZiBpbnN0YWxsYXRpb24gcHJvY2VkdXJlcyBvbiBkaWZmZXJlbnQKLXN5c3RlbXMuCi0KLUlmIHlvdSBnZW5lcmF0ZWQgYSBNYWtlZmlsZSB3aXRoIHRoZSAiY29uZmlndXJlIiBzY3JpcHQsIHlvdSBjYW4ganVzdCBzYXkKLQltYWtlIGluc3RhbGwKLXRvIGluc3RhbGwgdGhlIHByb2dyYW1zIGFuZCB0aGVpciBtYW4gcGFnZXMgaW50byB0aGUgc3RhbmRhcmQgcGxhY2VzLgotKFlvdSdsbCBwcm9iYWJseSBuZWVkIHRvIGJlIHJvb3QgdG8gZG8gdGhpcy4pICBXZSByZWNvbW1lbmQgZmlyc3Qgc2F5aW5nCi0JbWFrZSAtbiBpbnN0YWxsCi10byBzZWUgd2hlcmUgY29uZmlndXJlIHRob3VnaHQgdGhlIGZpbGVzIHNob3VsZCBnby4gIFlvdSBtYXkgbmVlZCB0byBlZGl0Ci10aGUgTWFrZWZpbGUsIHBhcnRpY3VsYXJseSBpZiB5b3VyIHN5c3RlbSdzIGNvbnZlbnRpb25zIGZvciBtYW4gcGFnZQotZmlsZW5hbWVzIGRvbid0IG1hdGNoIHdoYXQgY29uZmlndXJlIGV4cGVjdHMuCi0KLUlmIHlvdSB3YW50IHRvIGluc3RhbGwgdGhlIElKRyBsaWJyYXJ5IGl0c2VsZiwgZm9yIHVzZSBpbiBjb21waWxpbmcgb3RoZXIKLXByb2dyYW1zIGJlc2lkZXMgb3VycywgdGhlbiB5b3UgbmVlZCB0byBwdXQgdGhlIGZvdXIgaW5jbHVkZSBmaWxlcwotCWpwZWdsaWIuaCBqZXJyb3IuaCBqY29uZmlnLmggam1vcmVjZmcuaAotaW50byB5b3VyIGluY2x1ZGUtZmlsZSBkaXJlY3RvcnksIGFuZCBwdXQgdGhlIGxpYnJhcnkgZmlsZSBsaWJqcGVnLmEKLShleHRlbnNpb24gbWF5IHZhcnkgZGVwZW5kaW5nIG9uIHN5c3RlbSkgd2hlcmV2ZXIgbGlicmFyeSBmaWxlcyBnby4KLUlmIHlvdSBnZW5lcmF0ZWQgYSBNYWtlZmlsZSB3aXRoICJjb25maWd1cmUiLCBpdCB3aWxsIGRvIHdoYXQgaXQgdGhpbmtzCi1pcyB0aGUgcmlnaHQgdGhpbmcgaWYgeW91IHNheQotCW1ha2UgaW5zdGFsbC1saWIKLQotCi1PUFRJT05BTCBTVFVGRgotPT09PT09PT09PT09PT0KLQotUHJvZ3Jlc3MgbW9uaXRvcjoKLQotSWYgeW91IGxpa2UsIHlvdSBjYW4gI2RlZmluZSBQUk9HUkVTU19SRVBPUlQgKGluIGpjb25maWcuaCkgdG8gZW5hYmxlIGRpc3BsYXkKLW9mIHBlcmNlbnQtZG9uZSBwcm9ncmVzcyByZXBvcnRzLiAgVGhlIHJvdXRpbmUgcHJvdmlkZWQgaW4gY2RqcGVnLmMgbWVyZWx5Ci1wcmludHMgcGVyY2VudGFnZXMgdG8gc3RkZXJyLCBidXQgeW91IGNhbiBjdXN0b21pemUgaXQgdG8gZG8gc29tZXRoaW5nCi1mYW5jaWVyLgotCi1VdGFoIFJMRSBmaWxlIGZvcm1hdCBzdXBwb3J0OgotCi1XZSBkaXN0cmlidXRlIHRoZSBzb2Z0d2FyZSB3aXRoIHN1cHBvcnQgZm9yIFJMRSBpbWFnZSBmaWxlcyAoVXRhaCBSYXN0ZXIKLVRvb2xraXQgZm9ybWF0KSBkaXNhYmxlZCwgYmVjYXVzZSB0aGUgUkxFIHN1cHBvcnQgd29uJ3QgY29tcGlsZSB3aXRob3V0IHRoZQotVXRhaCBsaWJyYXJ5LiAgSWYgeW91IGhhdmUgVVJUIHZlcnNpb24gMy4xIG9yIGxhdGVyLCB5b3UgY2FuIGVuYWJsZSBSTEUKLXN1cHBvcnQgYXMgZm9sbG93czoKLQkxLiAgI2RlZmluZSBSTEVfU1VQUE9SVEVEIGluIGpjb25maWcuaC4KLQkyLiAgQWRkIGEgLUkgb3B0aW9uIHRvIENGTEFHUyBpbiB0aGUgTWFrZWZpbGUgZm9yIHRoZSBkaXJlY3RvcnkKLQkgICAgY29udGFpbmluZyB0aGUgVVJUIC5oIGZpbGVzICh0eXBpY2FsbHkgdGhlICJpbmNsdWRlIgotCSAgICBzdWJkaXJlY3Rvcnkgb2YgdGhlIFVSVCBkaXN0cmlidXRpb24pLgotCTMuICBBZGQgLUwuLi4gLWxybGUgdG8gTERMSUJTIGluIHRoZSBNYWtlZmlsZSwgd2hlcmUgLi4uIHNwZWNpZmllcwotCSAgICB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIFVSVCAibGlicmxlLmEiIGZpbGUgKHR5cGljYWxseSB0aGUKLQkgICAgImxpYiIgc3ViZGlyZWN0b3J5IG9mIHRoZSBVUlQgZGlzdHJpYnV0aW9uKS4KLQotU3VwcG9ydCBmb3IgMTItYml0LWRlZXAgcGl4ZWwgZGF0YToKLQotVGhlIEpQRUcgc3RhbmRhcmQgYWxsb3dzIGVpdGhlciA4LWJpdCBvciAxMi1iaXQgZGF0YSBwcmVjaXNpb24uICAoRm9yIGNvbG9yLAotdGhpcyBtZWFucyA4IG9yIDEyIGJpdHMgcGVyIGNoYW5uZWwsIG9mIGNvdXJzZS4pICBJZiB5b3UgbmVlZCB0byB3b3JrIHdpdGgKLWRlZXBlciB0aGFuIDgtYml0IGRhdGEsIHlvdSBjYW4gY29tcGlsZSB0aGUgSUpHIGNvZGUgZm9yIDEyLWJpdCBvcGVyYXRpb24uCi1UbyBkbyBzbzoKLSAgMS4gSW4gam1vcmVjZmcuaCwgZGVmaW5lIEJJVFNfSU5fSlNBTVBMRSBhcyAxMiByYXRoZXIgdGhhbiA4LgotICAyLiBJbiBqY29uZmlnLmgsIHVuZGVmaW5lIEJNUF9TVVBQT1JURUQsIFJMRV9TVVBQT1JURUQsIGFuZCBUQVJHQV9TVVBQT1JURUQsCi0gICAgIGJlY2F1c2UgdGhlIGNvZGUgZm9yIHRob3NlIGZvcm1hdHMgZG9lc24ndCBoYW5kbGUgMTItYml0IGRhdGEgYW5kIHdvbid0Ci0gICAgIGV2ZW4gY29tcGlsZS4gIChUaGUgUFBNIGNvZGUgZG9lcyB3b3JrLCBhcyBleHBsYWluZWQgYmVsb3cuICBUaGUgR0lGCi0gICAgIGNvZGUgd29ya3MgdG9vOyBpdCBzY2FsZXMgOC1iaXQgR0lGIGRhdGEgdG8gYW5kIGZyb20gMTItYml0IGRlcHRoCi0gICAgIGF1dG9tYXRpY2FsbHkuKQotICAzLiBDb21waWxlLiAgRG9uJ3QgZXhwZWN0ICJtYWtlIHRlc3QiIHRvIHBhc3MsIHNpbmNlIHRoZSBzdXBwbGllZCB0ZXN0Ci0gICAgIGZpbGVzIGFyZSBmb3IgOC1iaXQgZGF0YS4KLQotQ3VycmVudGx5LCAxMi1iaXQgc3VwcG9ydCBkb2VzIG5vdCB3b3JrIG9uIDE2LWJpdC1pbnQgbWFjaGluZXMuCi0KLU5vdGUgdGhhdCBhIDEyLWJpdCB2ZXJzaW9uIHdpbGwgbm90IHJlYWQgOC1iaXQgSlBFRyBmaWxlcywgbm9yIHZpY2UgdmVyc2E7Ci1zbyB5b3UnbGwgd2FudCB0byBrZWVwIGFyb3VuZCBhIHJlZ3VsYXIgOC1iaXQgY29tcGlsYXRpb24gYXMgd2VsbC4KLShSdW4tdGltZSBzZWxlY3Rpb24gb2YgZGF0YSBkZXB0aCwgdG8gYWxsb3cgYSBzaW5nbGUgY29weSB0aGF0IGRvZXMgYm90aCwKLWlzIHBvc3NpYmxlIGJ1dCB3b3VsZCBwcm9iYWJseSBzbG93IHRoaW5ncyBkb3duIGNvbnNpZGVyYWJseTsgaXQncyB2ZXJ5IGxvdwotb24gb3VyIHRvLWRvIGxpc3QuKQotCi1UaGUgUFBNIHJlYWRlciAocmRwcG0uYykgY2FuIHJlYWQgMTItYml0IGRhdGEgZnJvbSBlaXRoZXIgdGV4dC1mb3JtYXQgb3IKLWJpbmFyeS1mb3JtYXQgUFBNIGFuZCBQR00gZmlsZXMuICBCaW5hcnktZm9ybWF0IFBQTS9QR00gZmlsZXMgd2hpY2ggaGF2ZSBhCi1tYXh2YWwgZ3JlYXRlciB0aGFuIDI1NSBhcmUgYXNzdW1lZCB0byB1c2UgMiBieXRlcyBwZXIgc2FtcGxlLCBMU0IgZmlyc3QKLShsaXR0bGUtZW5kaWFuIG9yZGVyKS4gIEFzIG9mIGVhcmx5IDE5OTUsIDItYnl0ZSBiaW5hcnkgZm9ybWF0IGlzIG5vdAotb2ZmaWNpYWxseSBzdXBwb3J0ZWQgYnkgdGhlIFBCTVBMVVMgbGlicmFyeSwgYnV0IGl0IGlzIGV4cGVjdGVkIHRoYXQgYQotZnV0dXJlIHJlbGVhc2Ugb2YgUEJNUExVUyB3aWxsIHN1cHBvcnQgaXQuICBOb3RlIHRoYXQgdGhlIFBQTSByZWFkZXIgd2lsbAotcmVhZCBmaWxlcyBvZiBhbnkgbWF4dmFsIHJlZ2FyZGxlc3Mgb2YgdGhlIEJJVFNfSU5fSlNBTVBMRSBzZXR0aW5nOyBpbmNvbWluZwotZGF0YSBpcyBhdXRvbWF0aWNhbGx5IHJlc2NhbGVkIHRvIGVpdGhlciBtYXh2YWw9MjU1IG9yIG1heHZhbD00MDk1IGFzCi1hcHByb3ByaWF0ZSBmb3IgdGhlIGNqcGVnIGJpdCBkZXB0aC4KLQotVGhlIFBQTSB3cml0ZXIgKHdycHBtLmMpIHdpbGwgbm9ybWFsbHkgd3JpdGUgMi1ieXRlIGJpbmFyeSBQUE0gb3IgUEdNCi1mb3JtYXQsIG1heHZhbCA0MDk1LCB3aGVuIGNvbXBpbGVkIHdpdGggQklUU19JTl9KU0FNUExFPTEyLiAgU2luY2UgdGhpcwotZm9ybWF0IGlzIG5vdCB5ZXQgd2lkZWx5IHN1cHBvcnRlZCwgeW91IGNhbiBkaXNhYmxlIGl0IGJ5IGNvbXBpbGluZyB3cnBwbS5jCi13aXRoIFBQTV9OT1JBV1dPUkQgZGVmaW5lZDsgdGhlbiB0aGUgZGF0YSBpcyBzY2FsZWQgZG93biB0byA4IGJpdHMgdG8gbWFrZSBhCi1zdGFuZGFyZCAxLWJ5dGUvc2FtcGxlIFBQTSBvciBQR00gZmlsZS4gIChZZXMsIHRoaXMgbWVhbnMgc3RpbGwgYW5vdGhlciBjb3B5Ci1vZiBkanBlZyB0byBrZWVwIGFyb3VuZC4gIEJ1dCBob3BlZnVsbHkgeW91IHdvbid0IG5lZWQgaXQgZm9yIHZlcnkgbG9uZy4KLVBvc2thbnplcidzIHN1cHBvc2VkIHRvIGdldCB0aGF0IG5ldyBQQk1QTFVTIHJlbGVhc2Ugb3V0IFJlYWwgU29vbiBOb3cuKQotCi1PZiBjb3Vyc2UsIGlmIHlvdSBhcmUgd29ya2luZyB3aXRoIDEyLWJpdCBkYXRhLCB5b3UgcHJvYmFibHkgaGF2ZSBpdCBzdG9yZWQKLWluIHNvbWUgb3RoZXIsIG5vbnN0YW5kYXJkIGZvcm1hdC4gIEluIHRoYXQgY2FzZSB5b3UnbGwgcHJvYmFibHkgd2FudCB0bwotd3JpdGUgeW91ciBvd24gSS9PIG1vZHVsZXMgdG8gcmVhZCBhbmQgd3JpdGUgeW91ciBmb3JtYXQuCi0KLU5vdGUgdGhhdCBhIDEyLWJpdCB2ZXJzaW9uIG9mIGNqcGVnIGFsd2F5cyBydW5zIGluICItb3B0aW1pemUiIG1vZGUsIGluCi1vcmRlciB0byBnZW5lcmF0ZSB2YWxpZCBIdWZmbWFuIHRhYmxlcy4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb3VyCi1kZWZhdWx0IEh1ZmZtYW4gdGFibGVzIG9ubHkgY292ZXIgOC1iaXQgZGF0YS4KLQotUmVtb3ZpbmcgY29kZToKLQotSWYgeW91IG5lZWQgdG8gbWFrZSBhIHNtYWxsZXIgdmVyc2lvbiBvZiB0aGUgSlBFRyBzb2Z0d2FyZSwgc29tZSBvcHRpb25hbAotZnVuY3Rpb25zIGNhbiBiZSByZW1vdmVkIGF0IGNvbXBpbGUgdGltZS4gIFNlZSB0aGUgeHh4X1NVUFBPUlRFRCAjZGVmaW5lcyBpbgotamNvbmZpZy5oIGFuZCBqbW9yZWNmZy5oLiAgSWYgYXQgYWxsIHBvc3NpYmxlLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgbGVhdmUgaW4KLWRlY29kZXIgc3VwcG9ydCBmb3IgYWxsIHZhbGlkIEpQRUcgZmlsZXMsIHRvIGVuc3VyZSB0aGF0IHlvdSBjYW4gcmVhZCBhbnlvbmUncwotb3V0cHV0LiAgVGFraW5nIG91dCBzdXBwb3J0IGZvciBpbWFnZSBmaWxlIGZvcm1hdHMgdGhhdCB5b3UgZG9uJ3QgdXNlIGlzIHRoZQotbW9zdCBwYWlubGVzcyB3YXkgdG8gbWFrZSB0aGUgcHJvZ3JhbXMgc21hbGxlci4gIEFub3RoZXIgcG9zc2liaWxpdHkgaXMgdG8KLXJlbW92ZSBzb21lIG9mIHRoZSBEQ1QgbWV0aG9kczogaW4gcGFydGljdWxhciwgdGhlICJJRkFTVCIgbWV0aG9kIG1heSBub3QgYmUKLWVub3VnaCBmYXN0ZXIgdGhhbiB0aGUgb3RoZXJzIHRvIGJlIHdvcnRoIGtlZXBpbmcgb24geW91ciBtYWNoaW5lLiAgKElmIHlvdQotZG8gcmVtb3ZlIElTTE9XIG9yIElGQVNULCBiZSBzdXJlIHRvIHJlZGVmaW5lIEpEQ1RfREVGQVVMVCBvciBKRENUX0ZBU1RFU1QKLXRvIGEgc3VwcG9ydGVkIG1ldGhvZCwgYnkgYWRkaW5nIGEgI2RlZmluZSBpbiBqY29uZmlnLmguKQotCi0KLU9QVElNSVpBVElPTgotPT09PT09PT09PT09Ci0KLVVubGVzcyB5b3Ugb3duIGEgQ3JheSwgeW91J2xsIHByb2JhYmx5IGJlIGludGVyZXN0ZWQgaW4gbWFraW5nIHRoZSBKUEVHCi1zb2Z0d2FyZSBnbyBhcyBmYXN0IGFzIHBvc3NpYmxlLiAgVGhpcyBzZWN0aW9uIGNvdmVycyBzb21lIG1hY2hpbmUtZGVwZW5kZW50Ci1vcHRpbWl6YXRpb25zIHlvdSBtYXkgd2FudCB0byB0cnkuICBXZSBzdWdnZXN0IHRoYXQgYmVmb3JlIHRyeWluZyBhbnkgb2YKLXRoaXMsIHlvdSBmaXJzdCBnZXQgdGhlIGJhc2ljIGluc3RhbGxhdGlvbiB0byBwYXNzIHRoZSBzZWxmLXRlc3Qgc3RlcC4KLVJlcGVhdCB0aGUgc2VsZi10ZXN0IGFmdGVyIGFueSBvcHRpbWl6YXRpb24gdG8gbWFrZSBzdXJlIHRoYXQgeW91IGhhdmVuJ3QKLWJyb2tlbiBhbnl0aGluZy4KLQotVGhlIGludGVnZXIgRENUIHJvdXRpbmVzIHBlcmZvcm0gYSBsb3Qgb2YgbXVsdGlwbGljYXRpb25zLiAgVGhlc2UKLW11bHRpcGxpY2F0aW9ucyBtdXN0IHlpZWxkIDMyLWJpdCByZXN1bHRzLCBidXQgbm9uZSBvZiB0aGVpciBpbnB1dCB2YWx1ZXMKLWFyZSBtb3JlIHRoYW4gMTYgYml0cyB3aWRlLiAgT24gbWFueSBtYWNoaW5lcywgbm90YWJseSB0aGUgNjgweDAgYW5kIDgweDg2Ci1DUFVzLCBhIDE2eDE2PT4zMiBiaXQgbXVsdGlwbHkgaW5zdHJ1Y3Rpb24gaXMgZmFzdGVyIHRoYW4gYSBmdWxsIDMyeDMyPT4zMgotYml0IG11bHRpcGx5LiAgVW5mb3J0dW5hdGVseSB0aGVyZSBpcyBubyBwb3J0YWJsZSB3YXkgdG8gc3BlY2lmeSBzdWNoIGEKLW11bHRpcGxpY2F0aW9uIGluIEMsIGJ1dCBzb21lIGNvbXBpbGVycyBjYW4gZ2VuZXJhdGUgb25lIHdoZW4geW91IHVzZSB0aGUKLXJpZ2h0IGNvbWJpbmF0aW9uIG9mIGNhc3RzLiAgU2VlIHRoZSBNVUxUSVBMWXh4eCBtYWNybyBkZWZpbml0aW9ucyBpbgotamRjdC5oLiAgSWYgeW91ciBjb21waWxlciBtYWtlcyAiaW50IiBiZSAzMiBiaXRzIGFuZCAic2hvcnQiIGJlIDE2IGJpdHMsCi1kZWZpbmluZyBTSE9SVHhTSE9SVF8zMiBpcyBmYWlybHkgbGlrZWx5IHRvIHdvcmsuICBXaGVuIGV4cGVyaW1lbnRpbmcgd2l0aAotYWx0ZXJuYXRlIGRlZmluaXRpb25zLCBiZSBzdXJlIHRvIHRlc3Qgbm90IG9ubHkgd2hldGhlciB0aGUgY29kZSBzdGlsbCB3b3JrcwotKHVzZSB0aGUgc2VsZi10ZXN0KSwgYnV0IGFsc28gd2hldGhlciBpdCBpcyBhY3R1YWxseSBmYXN0ZXIgLS0tIG9uIHNvbWUKLWNvbXBpbGVycywgYWx0ZXJuYXRlIGRlZmluaXRpb25zIG1heSBjb21wdXRlIHRoZSByaWdodCBhbnN3ZXIsIHlldCBiZSBzbG93ZXIKLXRoYW4gdGhlIGRlZmF1bHQuICBUaW1pbmcgY2pwZWcgb24gYSBsYXJnZSBQR00gKGdyYXlzY2FsZSkgaW5wdXQgZmlsZSBpcyB0aGUKLWJlc3Qgd2F5IHRvIGNoZWNrIHRoaXMsIGFzIHRoZSBEQ1Qgd2lsbCBiZSB0aGUgbGFyZ2VzdCBmcmFjdGlvbiBvZiB0aGUgcnVudGltZQotaW4gdGhhdCBtb2RlLiAgKE5vdGU6IHNvbWUgb2YgdGhlIGRpc3RyaWJ1dGVkIGNvbXBpbGVyLXNwZWNpZmljIGpjb25maWcgZmlsZXMKLWFscmVhZHkgY29udGFpbiAjZGVmaW5lIHN3aXRjaGVzIHRvIHNlbGVjdCBhcHByb3ByaWF0ZSBNVUxUSVBMWXh4eAotZGVmaW5pdGlvbnMuKQotCi1JZiB5b3VyIG1hY2hpbmUgaGFzIHN1ZmZpY2llbnRseSBmYXN0IGZsb2F0aW5nIHBvaW50IGhhcmR3YXJlLCB5b3UgbWF5IGZpbmQKLXRoYXQgdGhlIGZsb2F0IERDVCBtZXRob2QgaXMgZmFzdGVyIHRoYW4gdGhlIGludGVnZXIgRENUIG1ldGhvZHMsIGV2ZW4KLWFmdGVyIHR3ZWFraW5nIHRoZSBpbnRlZ2VyIG11bHRpcGx5IG1hY3Jvcy4gIEluIHRoYXQgY2FzZSB5b3UgbWF5IHdhbnQgdG8KLW1ha2UgdGhlIGZsb2F0IERDVCBiZSB0aGUgZGVmYXVsdCBtZXRob2QuICAoVGhlIG9ubHkgb2JqZWN0aW9uIHRvIHRoaXMgaXMKLXRoYXQgZmxvYXQgRENUIHJlc3VsdHMgbWF5IHZhcnkgc2xpZ2h0bHkgYWNyb3NzIG1hY2hpbmVzLikgIFRvIGRvIHRoYXQsIGFkZAotIiNkZWZpbmUgSkRDVF9ERUZBVUxUIEpEQ1RfRkxPQVQiIHRvIGpjb25maWcuaC4gIEV2ZW4gaWYgeW91IGRvbid0IGNoYW5nZQotdGhlIGRlZmF1bHQsIHlvdSBzaG91bGQgcmVkZWZpbmUgSkRDVF9GQVNURVNULCB3aGljaCBpcyB0aGUgbWV0aG9kIHNlbGVjdGVkCi1ieSBkanBlZydzIC1mYXN0IHN3aXRjaC4gIERvbid0IGZvcmdldCB0byB1cGRhdGUgdGhlIGRvY3VtZW50YXRpb24gZmlsZXMKLSh1c2FnZS5kb2MgYW5kL29yIGNqcGVnLjEsIGRqcGVnLjEpIHRvIGFncmVlIHdpdGggd2hhdCB5b3UndmUgZG9uZS4KLQotSWYgYWNjZXNzIHRvICJzaG9ydCIgYXJyYXlzIGlzIHNsb3cgb24geW91ciBtYWNoaW5lLCBpdCBtYXkgYmUgYSB3aW4gdG8KLWRlZmluZSB0eXBlIEpDT0VGIGFzIGludCByYXRoZXIgdGhhbiBzaG9ydC4gIFRoaXMgd2lsbCBjb3N0IGEgZ29vZCBkZWFsIG9mCi1tZW1vcnkgdGhvdWdoLCBwYXJ0aWN1bGFybHkgaW4gc29tZSBtdWx0aS1wYXNzIG1vZGVzLCBzbyBkb24ndCBkbyBpdCB1bmxlc3MKLXlvdSBoYXZlIG1lbW9yeSB0byBidXJuIGFuZCBzaG9ydCBpcyBSRUFMTFkgc2xvdy4KLQotSWYgeW91ciBjb21waWxlciBjYW4gY29tcGlsZSBmdW5jdGlvbiBjYWxscyBpbi1saW5lLCBtYWtlIHN1cmUgdGhlIElOTElORQotbWFjcm8gaW4gam1vcmVjZmcuaCBpcyBkZWZpbmVkIGFzIHRoZSBrZXl3b3JkIHRoYXQgbWFya3MgYSBmdW5jdGlvbgotaW5saW5lLWFibGUuICBTb21lIGNvbXBpbGVycyBoYXZlIGEgc3dpdGNoIHRoYXQgdGVsbHMgdGhlIGNvbXBpbGVyIHRvIGlubGluZQotYW55IGZ1bmN0aW9uIGl0IHRoaW5rcyBpcyBwcm9maXRhYmxlIChlLmcuLCAtZmlubGluZS1mdW5jdGlvbnMgZm9yIGdjYykuCi1FbmFibGluZyBzdWNoIGEgc3dpdGNoIGlzIGxpa2VseSB0byBtYWtlIHRoZSBjb21waWxlZCBjb2RlIGJpZ2dlciBidXQgZmFzdGVyLgotCi1JbiBnZW5lcmFsLCBpdCdzIHdvcnRoIHRyeWluZyB0aGUgbWF4aW11bSBvcHRpbWl6YXRpb24gbGV2ZWwgb2YgeW91ciBjb21waWxlciwKLWFuZCBleHBlcmltZW50aW5nIHdpdGggYW55IG9wdGlvbmFsIG9wdGltaXphdGlvbnMgc3VjaCBhcyBsb29wIHVucm9sbGluZy4KLShVbmZvcnR1bmF0ZWx5LCBmYXIgdG9vIG1hbnkgY29tcGlsZXJzIGhhdmUgb3B0aW1pemVyIGJ1Z3MgLi4uIGJlIHByZXBhcmVkIHRvCi1iYWNrIG9mZiBpZiB0aGUgY29kZSBmYWlscyBzZWxmLXRlc3QuKSAgSWYgeW91IGRvIGFueSBleHBlcmltZW50YXRpb24gYWxvbmcKLXRoZXNlIGxpbmVzLCBwbGVhc2UgcmVwb3J0IHRoZSBvcHRpbWFsIHNldHRpbmdzIHRvIGpwZWctaW5mb0B1dW5ldC51dS5uZXQgc28KLXdlIGNhbiBtZW50aW9uIHRoZW0gaW4gZnV0dXJlIHJlbGVhc2VzLiAgQmUgc3VyZSB0byBzcGVjaWZ5IHlvdXIgbWFjaGluZSBhbmQKLWNvbXBpbGVyIHZlcnNpb24uCi0KLQotSElOVFMgRk9SIFNQRUNJRklDIFNZU1RFTVMKLT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVdlIHdlbGNvbWUgcmVwb3J0cyBvbiBjaGFuZ2VzIG5lZWRlZCBmb3Igc3lzdGVtcyBub3QgbWVudGlvbmVkIGhlcmUuICBTdWJtaXQKLSdlbSB0byBqcGVnLWluZm9AdXVuZXQudXUubmV0LiAgQWxzbywgaWYgY29uZmlndXJlIG9yIGNrY29uZmlnLmMgaXMgd3JvbmcKLWFib3V0IGhvdyB0byBjb25maWd1cmUgdGhlIEpQRUcgc29mdHdhcmUgZm9yIHlvdXIgc3lzdGVtLCBwbGVhc2UgbGV0IHVzIGtub3cuCi0KLQotQWNvcm4gUklTQyBPUzoKLQotKFRoYW5rcyB0byBTaW1vbiBNaWRkbGV0b24gZm9yIHRoZXNlIGhpbnRzIG9uIGNvbXBpbGluZyB3aXRoIERlc2t0b3AgQy4pCi1BZnRlciByZW5hbWluZyB0aGUgZmlsZXMgYWNjb3JkaW5nIHRvIEFjb3JuIGNvbnZlbnRpb25zLCB0YWtlIGEgY29weSBvZgotbWFrZWZpbGUuYW5zaSwgY2hhbmdlIGFsbCBvY2N1cnJlbmNlcyBvZiAnbGlianBlZy5hJyB0byAnbGlianBlZy5vJyBhbmQKLWNoYW5nZSB0aGVzZSBkZWZpbml0aW9ucyBhcyBpbmRpY2F0ZWQ6Ci0KLUNGTEFHUz0gLXRocm93YmFjayAtSUM6IC1XbgotTERMSUJTPUM6by5TdHVicwotU1lTREVQTUVNPWptZW1hbnNpLm8KLUxOPUxpbmsKLUFSPUxpYkZpbGUgLWMgLW8KLQotQWxzbyBhZGQgYSBuZXcgbGluZSAnLmMubzo7ICQoY2MpICQ8ICQoY2ZsYWdzKSAtYyAtbyAkQCcuICBSZW1vdmUgdGhlCi1saW5lcyAnJChSTSkgbGlianBlZy5vJyBhbmQgJyQoQVIyKSBsaWJqcGVnLm8nIGFuZCB0aGUgJ2pjb25maWcuaCcKLWRlcGVuZGVuY3kgc2VjdGlvbi4KLQotQ29weSBqY29uZmlnLmRvYyB0byBqY29uZmlnLmguICBFZGl0IGpjb25maWcuaCB0byBkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUKLWFuZCBDSEFSX0lTX1VOU0lHTkVELgotCi1SdW4gdGhlIG1ha2VmaWxlIHVzaW5nICFBTVUgbm90ICFNYWtlLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSAnY2xlYW4nIGFuZAotJ3Rlc3QnIG1ha2VmaWxlIGVudHJpZXMgdGhlbiB5b3Ugd2lsbCBoYXZlIHRvIGZpZGRsZSB3aXRoIHRoZSBzeW50YXggYSBiaXQKLWFuZCByZW5hbWUgdGhlIHRlc3QgZmlsZXMuCi0KLQotQW1pZ2E6Ci0KLVNBUyBDIDYuNTAgcmVwb3J0ZWRseSBpcyB0b28gYnVnZ3kgdG8gY29tcGlsZSB0aGUgSUpHIGNvZGUgcHJvcGVybHkuCi1BIHBhdGNoIHRvIHVwZGF0ZSB0byA2LjUxIGlzIGF2YWlsYWJsZSBmcm9tIFNBUyBvciBBbWlOZXQgRlRQIHNpdGVzLgotCi1UaGUgc3VwcGxpZWQgY29uZmlnIGZpbGVzIGFyZSBzZXQgdXAgdG8gdXNlIGptZW1uYW1lLmMgYXMgdGhlIG1lbW9yeQotbWFuYWdlciwgd2l0aCB0ZW1wb3JhcnkgZmlsZXMgYmVpbmcgY3JlYXRlZCBvbiB0aGUgZGV2aWNlIG5hbWVkIGJ5Ci0iSlBFR1RNUDoiLgotCi0KLUF0YXJpIFNUL1NURS9UVDoKLSAKLUNvcHkgdGhlIHByb2plY3QgZmlsZXMgbWFrY2pwZWcuc3QsIG1ha2RqcGVnLnN0LCBtYWt0anBlZy5zdCwgYW5kIG1ha2xqcGVnLnN0Ci10byBjanBlZy5wcmosIGRqcGVnLnByaiwganBlZ3RyYW4ucHJqLCBhbmQgbGlianBlZy5wcmogcmVzcGVjdGl2ZWx5LiAgVGhlCi1wcm9qZWN0IGZpbGVzIHNob3VsZCB3b3JrIGFzLWlzIHdpdGggUHVyZSBDLiAgRm9yIFR1cmJvIEMsIGNoYW5nZSBsaWJyYXJ5Ci1maWxlbmFtZXMgInBjLi4uIiB0byAidGMuLi4iIGluIGVhY2ggcHJvamVjdCBmaWxlLiAgTm90ZSB0aGF0IGxpYmpwZWcucHJqCi1zZWxlY3RzIGptZW1hbnNpLmMgYXMgdGhlIHJlY29tbWVuZGVkIG1lbW9yeSBtYW5hZ2VyLiAgWW91J2xsIHByb2JhYmx5IHdhbnQgdG8KLWFkanVzdCB0aGUgREVGQVVMVF9NQVhfTUVNIHNldHRpbmcgLS0tIHlvdSB3YW50IGl0IHRvIGJlIGEgY291cGxlIGh1bmRyZWQgSwotbGVzcyB0aGFuIHlvdXIgbm9ybWFsIGZyZWUgbWVtb3J5LiAgUHV0ICIjZGVmaW5lIERFRkFVTFRfTUFYX01FTSBubm5uIiBpbnRvCi1qY29uZmlnLmggdG8gZG8gdGhpcy4KLQotVG8gdXNlIHRoZSA2ODg4MS82ODg4MiBjb3Byb2Nlc3NvciBmb3IgdGhlIGZsb2F0aW5nIHBvaW50IERDVCwgYWRkIHRoZQotY29tcGlsZXIgb3B0aW9uICItOCIgdG8gdGhlIHByb2plY3QgZmlsZXMgYW5kIHJlcGxhY2UgcGNmbHRsaWIubGliIHdpdGgKLXBjODgxbGliLmxpYiBpbiBjanBlZy5wcmogYW5kIGRqcGVnLnByai4gIE9yIGlmIHlvdSBkb24ndCBoYXZlIGEKLWNvcHJvY2Vzc29yLCB5b3UgbWF5IHByZWZlciB0byByZW1vdmUgdGhlIGZsb2F0IERDVCBjb2RlIGJ5IHVuZGVmaW5pbmcKLURDVF9GTE9BVF9TVVBQT1JURUQgaW4gam1vcmVjZmcuaCAoc2luY2Ugd2l0aG91dCBhIGNvcHJvY2Vzc29yLCB0aGUgZmxvYXQKLWNvZGUgd2lsbCBiZSB0b28gc2xvdyB0byBiZSB1c2VmdWwpLiAgSW4gdGhhdCBjYXNlLCB5b3UgY2FuIGRlbGV0ZQotcGNmbHRsaWIubGliIGZyb20gdGhlIHByb2plY3QgZmlsZXMuCi0KLU5vdGUgdGhhdCB5b3UgbXVzdCBtYWtlIGxpYmpwZWcubGliIGJlZm9yZSBtYWtpbmcgY2pwZWcudHRwLCBkanBlZy50dHAsCi1vciBqcGVndHJhbi50dHAuICBZb3UnbGwgaGF2ZSB0byBwZXJmb3JtIHRoZSBzZWxmLXRlc3QgYnkgaGFuZC4KLQotV2UgaGF2ZW4ndCBib3RoZXJlZCB0byBpbmNsdWRlIHByb2plY3QgZmlsZXMgZm9yIHJkanBnY29tIGFuZCB3cmpwZ2NvbS4KLVRob3NlIHNvdXJjZSBmaWxlcyBzaG91bGQganVzdCBiZSBjb21waWxlZCBieSB0aGVtc2VsdmVzOyB0aGV5IGRvbid0Ci1kZXBlbmQgb24gdGhlIEpQRUcgbGlicmFyeS4KLQotVGhlcmUgaXMgYSBidWcgaW4gc29tZSBvbGRlciB2ZXJzaW9ucyBvZiB0aGUgVHVyYm8gQyBsaWJyYXJ5IHdoaWNoIGNhdXNlcyB0aGUKLXNwYWNlIHVzZWQgYnkgdGVtcG9yYXJ5IGZpbGVzIGNyZWF0ZWQgd2l0aCAidG1wZmlsZSgpIiBub3QgdG8gYmUgZnJlZWQgYWZ0ZXIKLWFuIGFibm9ybWFsIHByb2dyYW0gZXhpdC4gIElmIHlvdSBjaGVjayB5b3VyIGRpc2sgYWZ0ZXJ3YXJkcywgeW91IHdpbGwgZmluZAotY2x1c3RlciBjaGFpbnMgdGhhdCBhcmUgYWxsb2NhdGVkIGJ1dCBub3QgdXNlZCBieSBhIGZpbGUuICBUaGlzIHNob3VsZCBub3QKLWhhcHBlbiBpbiBjanBlZy9kanBlZy9qcGVndHJhbiwgc2luY2Ugd2UgZW5hYmxlIGEgc2lnbmFsIGNhdGNoZXIgdG8gZXhwbGljaXRseQotY2xvc2UgdGVtcCBmaWxlcyBiZWZvcmUgZXhpdGluZy4gIEJ1dCBpZiB5b3UgdXNlIHRoZSBKUEVHIGxpYnJhcnkgd2l0aCB5b3VyCi1vd24gY29kZSwgYmUgc3VyZSB0byBzdXBwbHkgYSBzaWduYWwgY2F0Y2hlciwgb3IgZWxzZSB1c2UgYSBkaWZmZXJlbnQKLXN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5IG1hbmFnZXIuCi0KLQotQ3JheToKLQotU2hvdWxkIHlvdSBiZSBzbyBmb3J0dW5hdGUgYXMgdG8gYmUgcnVubmluZyBKUEVHIG9uIGEgQ3JheSBZTVAsIHRoZXJlIGlzIGEKLWNvbXBpbGVyIGJ1ZyBpbiBvbGQgdmVyc2lvbnMgb2YgQ3JheSdzIFN0YW5kYXJkIEMgKHByaW9yIHRvIDMuMSkuICBJZiB5b3UKLXN0aWxsIGhhdmUgYW4gb2xkIGNvbXBpbGVyLCB5b3UnbGwgbmVlZCB0byBpbnNlcnQgYSBsaW5lIHJlYWRpbmcKLSIjcHJhZ21hIG5vdmVjdG9yIiBqdXN0IGJlZm9yZSB0aGUgbG9vcAkKLSAgICBmb3IgKGkgPSAxOyBpIDw9IChpbnQpIGh0YmwtPmJpdHNbbF07IGkrKykKLSAgICAgIGh1ZmZzaXplW3ArK10gPSAoY2hhcikgbDsKLWluIGZpeF9odWZmX3RibCAoaW4gVjViZXRhMSwgbGluZSAyMDQgb2YgamNodWZmLmMgYW5kIGxpbmUgMTc2IG9mIGpkaHVmZi5jKS4KLVtUaGlzIGJ1ZyBtYXkgb3IgbWF5IG5vdCBzdGlsbCBvY2N1ciB3aXRoIHRoZSBjdXJyZW50IElKRyBjb2RlLCBidXQgaXQncwotcHJvYmFibHkgYSBkZWFkIGlzc3VlIGFueXdheS4uLl0KLQotCi1IUC1VWDoKLQotSWYgeW91IGhhdmUgSFAtVVggNy4wNSBvciBsYXRlciB3aXRoIHRoZSAic29mdHdhcmUgZGV2ZWxvcG1lbnQiIEMgY29tcGlsZXIsCi15b3Ugc2hvdWxkIHJ1biB0aGUgY29tcGlsZXIgaW4gQU5TSSBtb2RlLiAgSWYgdXNpbmcgdGhlIGNvbmZpZ3VyZSBzY3JpcHQsCi1zYXkKLQkuL2NvbmZpZ3VyZSBDQz0nY2MgLUFhJwotKG9yIC1BZSBpZiB5b3UgcHJlZmVyKS4gIElmIGNvbmZpZ3VyaW5nIGJ5IGhhbmQsIHVzZSBtYWtlZmlsZS5hbnNpIGFuZCBhZGQKLSItQWEiIHRvIHRoZSBDRkxBR1MgbGluZSBpbiB0aGUgbWFrZWZpbGUuCi0KLUlmIHlvdSBoYXZlIGEgcHJlLTcuMDUgc3lzdGVtLCBvciBpZiB5b3UgYXJlIHVzaW5nIHRoZSBub24tQU5TSSBDIGNvbXBpbGVyCi1kZWxpdmVyZWQgd2l0aCBhIG1pbmltdW0gSFAtVVggc3lzdGVtLCB0aGVuIHlvdSBtdXN0IHVzZSBtYWtlZmlsZS51bml4Ci0oYW5kIGRvIE5PVCBhZGQgLUFhKTsgb3IganVzdCBydW4gY29uZmlndXJlIHdpdGhvdXQgdGhlIENDIG9wdGlvbi4KLQotT24gSFAgOTAwMCBzZXJpZXMgODAwIG1hY2hpbmVzLCB0aGUgSFAgQyBjb21waWxlciBpcyBidWdneSBpbiByZXZpc2lvbnMgcHJpb3IKLXRvIEEuMDguMDcuICBJZiB5b3UgZ2V0IGNvbXBsYWludHMgYWJvdXQgIm5vdCBhIHR5cGVkZWYgbmFtZSIsIHlvdSdsbCBoYXZlIHRvCi11c2UgbWFrZWZpbGUudW5peCwgb3IgcnVuIGNvbmZpZ3VyZSB3aXRob3V0IHRoZSBDQyBvcHRpb24uCi0KLQotTWFjaW50b3NoLCBnZW5lcmljIGNvbW1lbnRzOgotCi1UaGUgc3VwcGxpZWQgdXNlci1pbnRlcmZhY2UgZmlsZXMgKGNqcGVnLmMsIGRqcGVnLmMsIGV0YykgYXJlIHNldCB1cCB0bwotcHJvdmlkZSBhIFVuaXgtc3R5bGUgY29tbWFuZCBsaW5lIGludGVyZmFjZS4gIFlvdSBjYW4gdXNlIHRoaXMgaW50ZXJmYWNlIG9uCi10aGUgTWFjIGJ5IG1lYW5zIG9mIHRoZSBjY29tbWFuZCgpIGxpYnJhcnkgcm91dGluZSBwcm92aWRlZCBieSBNZXRyb3dlcmtzCi1Db2RlV2FycmlvciBvciBUaGluayBDLiAgVGhpcyBpcyBvbmx5IGFwcHJvcHJpYXRlIGZvciB0ZXN0aW5nIHRoZSBsaWJyYXJ5LAotaG93ZXZlcjsgdG8gbWFrZSBhIHVzZXItZnJpZW5kbHkgZXF1aXZhbGVudCBvZiBjanBlZy9kanBlZyB5b3UnZCByZWFsbHkgd2FudAotdG8gZGV2ZWxvcCBhIE1hYy1zdHlsZSB1c2VyIGludGVyZmFjZS4gIFRoZXJlIGlzbid0IGEgY29tcGxldGUgZXhhbXBsZQotYXZhaWxhYmxlIGF0IHRoZSBtb21lbnQsIGJ1dCB0aGVyZSBhcmUgc29tZSBoZWxwZnVsIHN0YXJ0aW5nIHBvaW50czoKLTEuIFNhbSBCdXNoZWxsJ3MgZnJlZSAiVG8gSlBFRyIgYXBwbGV0IHByb3ZpZGVzIGRyYWctYW5kLWRyb3AgY29udmVyc2lvbiB0bwotSlBFRyB1bmRlciBTeXN0ZW0gNyBhbmQgbGF0ZXIuICBUaGlzIG9ubHkgaWxsdXN0cmF0ZXMgaG93IHRvIHVzZSB0aGUKLWNvbXByZXNzaW9uIGhhbGYgb2YgdGhlIGxpYnJhcnksIGJ1dCBpdCBkb2VzIGEgdmVyeSBuaWNlIGpvYiBvZiB0aGF0IHBhcnQuCi1UaGUgQ29kZVdhcnJpb3Igc291cmNlIGNvZGUgaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL3d3dy5wb2JveC5jb20vfmpzYW0uCi0yLiBKaW0gQnJ1bm5lciBwcmVwYXJlZCBhIE1hYy1zdHlsZSB1c2VyIGludGVyZmFjZSBmb3IgYm90aCBjb21wcmVzc2lvbiBhbmQKLWRlY29tcHJlc3Npb24uICBVbmZvcnR1bmF0ZWx5LCBpdCBoYXNuJ3QgYmVlbiB1cGRhdGVkIHNpbmNlIElKRyB2NCwgYW5kCi10aGUgbGlicmFyeSdzIEFQSSBoYXMgY2hhbmdlZCBjb25zaWRlcmFibHkgc2luY2UgdGhlbi4gIFN0aWxsIGl0IG1heSBiZSBvZgotc29tZSBoZWxwLCBwYXJ0aWN1bGFybHkgYXMgYSBndWlkZSB0byBjb21waWxpbmcgdGhlIElKRyBjb2RlIHVuZGVyIFRoaW5rIEMuCi1KaW0ncyBjb2RlIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBJbmZvLU1hYyBhcmNoaXZlcywgYXQgc3VtZXgtYWltLnN0YW5mb3JkLmVkdQotb3IgbWlycm9ycyB0aGVyZW9mOyBzZWUgZmlsZSAvaW5mby1tYWMvZGV2L3NyYy9qcGVnLWNvbnZlcnQtYy5ocXguCi0KLWptZW1tYWMuYyBpcyB0aGUgcmVjb21tZW5kZWQgbWVtb3J5IG1hbmFnZXIgYmFjayBlbmQgZm9yIE1hY2ludG9zaC4gIEl0IHVzZXMKLU5ld1B0ci9EaXNwb3NlUHRyIGluc3RlYWQgb2YgbWFsbG9jL2ZyZWUsIGFuZCBoYXMgYSBNYWMtc3BlY2lmaWMKLWltcGxlbWVudGF0aW9uIG9mIGpwZWdfbWVtX2F2YWlsYWJsZSgpLiAgSXQgYWxzbyBjcmVhdGVzIHRlbXBvcmFyeSBmaWxlcyB0aGF0Ci1mb2xsb3cgTWFjIGNvbnZlbnRpb25zLiAgKFRoYXQgcGFydCBvZiB0aGUgY29kZSByZWxpZXMgb24gU3lzdGVtLTctb3ItbGF0ZXIgT1MKLWZ1bmN0aW9ucy4gIFNlZSB0aGUgY29tbWVudHMgaW4gam1lbW1hYy5jIGlmIHlvdSBuZWVkIHRvIHJ1biBpdCBvbiBTeXN0ZW0gNi4pCi1OT1RFIHRoYXQgVVNFX01BQ19NRU1NR1IgbXVzdCBiZSBkZWZpbmVkIGluIGpjb25maWcuaCB0byB1c2Ugam1lbW1hYy5jLgotCi1Zb3UgY2FuIGFsc28gdXNlIGptZW1ub2JzLmMsIGlmIHlvdSBkb24ndCBjYXJlIGFib3V0IGhhbmRsaW5nIGltYWdlcyBsYXJnZXIKLXRoYW4gYXZhaWxhYmxlIG1lbW9yeS4gIElmIHlvdSB1c2UgYW55IG1lbW9yeSBtYW5hZ2VyIGJhY2sgZW5kIG90aGVyIHRoYW4KLWptZW1tYWMuYywgd2UgcmVjb21tZW5kIHJlcGxhY2luZyAibWFsbG9jIiBhbmQgImZyZWUiIGJ5ICJOZXdQdHIiIGFuZAotIkRpc3Bvc2VQdHIiLCBiZWNhdXNlIE1hYyBDIGxpYnJhcmllcyBvZnRlbiBoYXZlIHBlY3VsaWFyIGltcGxlbWVudGF0aW9ucyBvZgotbWFsbG9jL2ZyZWUuICAoRm9yIGluc3RhbmNlLCBmcmVlKCkgbWF5IG5vdCByZXR1cm4gdGhlIGZyZWVkIHNwYWNlIHRvIHRoZQotTWFjIE1lbW9yeSBNYW5hZ2VyLiAgVGhpcyBpcyB1bmRlc2lyYWJsZSBmb3IgdGhlIElKRyBjb2RlIGJlY2F1c2Ugam1lbW1nci5jCi1hbHJlYWR5IGNsdW1wcyBzcGFjZSByZXF1ZXN0cy4pCi0KLQotTWFjaW50b3NoLCBNZXRyb3dlcmtzIENvZGVXYXJyaW9yOgotCi1UaGUgVW5peC1jb21tYW5kLWxpbmUtc3R5bGUgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIGJ5IGRlZmluaW5nIFVTRV9DQ09NTUFORC4KLVlvdSdsbCBhbHNvIG5lZWQgdG8gZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FIHRvIGF2b2lkIHN0ZGluL3N0ZG91dC4KLVRoaXMgbWVhbnMgdGhhdCB3aGVuIHVzaW5nIHRoZSBjanBlZy9kanBlZyBwcm9ncmFtcywgeW91J2xsIGhhdmUgdG8gdHlwZSB0aGUKLWlucHV0IGFuZCBvdXRwdXQgZmlsZSBuYW1lcyBpbiB0aGUgIkFyZ3VtZW50cyIgdGV4dC1lZGl0IGJveCwgcmF0aGVyIHRoYW4KLXVzaW5nIHRoZSBmaWxlIHJhZGlvIGJ1dHRvbnMuICAoUGVyaGFwcyBVU0VfRkRPUEVOIG9yIFVTRV9TRVRNT0RFIHdvdWxkCi1lbGltaW5hdGUgdGhlIHByb2JsZW0sIGJ1dCBJIGhhdmVuJ3QgaGVhcmQgZnJvbSBhbnlvbmUgd2hvJ3MgdHJpZWQgaXQuKQotCi1PbiA2ODB4MCBNYWNzLCBNZXRyb3dlcmtzIGRlZmluZXMgdHlwZSAiZG91YmxlIiBhcyBhIDEwLWJ5dGUgSUVFRSBleHRlbmRlZAotZmxvYXQuICBqbWVtbWdyLmMgd29uJ3QgbGlrZSB0aGlzOiBpdCB3YW50cyBzaXplb2YoQUxJR05fVFlQRSkgdG8gYmUgYSBwb3dlcgotb2YgMi4gIEFkZCAiI2RlZmluZSBBTElHTl9UWVBFIGxvbmciIHRvIGpjb25maWcuaCB0byBlbGltaW5hdGUgdGhlIGNvbXBsYWludC4KLQotVGhlIHN1cHBsaWVkIGNvbmZpZ3VyYXRpb24gZmlsZSBqY29uZmlnLm1hYyBjYW4gYmUgdXNlZCBmb3IgeW91ciBqY29uZmlnLmg7Ci1pdCBpbmNsdWRlcyBhbGwgdGhlIHJlY29tbWVuZGVkIHN5bWJvbCBkZWZpbml0aW9ucy4gIElmIHlvdSBoYXZlIEFwcGxlU2NyaXB0Ci1pbnN0YWxsZWQsIHlvdSBjYW4gcnVuIHRoZSBzdXBwbGllZCBzY3JpcHQgbWFrZXByb2oubWFjIHRvIGNyZWF0ZSBDb2RlV2FycmlvcgotcHJvamVjdCBmaWxlcyBmb3IgdGhlIGxpYnJhcnkgYW5kIHRoZSB0ZXN0YmVkIGFwcGxpY2F0aW9ucywgdGhlbiBidWlsZCB0aGUKLWxpYnJhcnkgYW5kIGFwcGxpY2F0aW9ucy4gIChUaGFua3MgdG8gRGFuIFNlYXJzIGFuZCBEb24gQWdybyBmb3IgdGhpcyBuaWZ0eQotaGFjaywgd2hpY2ggc2F2ZXMgdXMgZnJvbSB0cnlpbmcgdG8gbWFpbnRhaW4gQ29kZVdhcnJpb3IgcHJvamVjdCBmaWxlcyBhcyBwYXJ0Ci1vZiB0aGUgSUpHIGRpc3RyaWJ1dGlvbi4uLikKLQotCi1NYWNpbnRvc2gsIFRoaW5rIEM6Ci0KLVRoZSBkb2N1bWVudGF0aW9uIGluIEppbSBCcnVubmVyJ3MgIkpQRUcgQ29udmVydCIgc291cmNlIGNvZGUgKHNlZSBhYm92ZSkKLWluY2x1ZGVzIGRldGFpbGVkIGJ1aWxkIGluc3RydWN0aW9ucyBmb3IgVGhpbmsgQzsgaXQncyBwcm9iYWJseSBzb21ld2hhdAotb3V0IG9mIGRhdGUgZm9yIHRoZSBjdXJyZW50IHJlbGVhc2UsIGJ1dCBtYXkgYmUgaGVscGZ1bC4KLQotSWYgeW91IHdhbnQgdG8gYnVpbGQgdGhlIG1pbmltYWwgY29tbWFuZCBsaW5lIHZlcnNpb24sIHByb2NlZWQgYXMgZm9sbG93cy4KLVlvdSdsbCBoYXZlIHRvIHByZXBhcmUgcHJvamVjdCBmaWxlcyBmb3IgdGhlIHByb2dyYW1zOyB3ZSBkb24ndCBpbmNsdWRlIGFueQotaW4gdGhlIGRpc3RyaWJ1dGlvbiBzaW5jZSB0aGV5IGFyZSBub3QgdGV4dCBmaWxlcy4gIFVzZSB0aGUgZmlsZSBsaXN0cyBpbgotYW55IG9mIHRoZSBzdXBwbGllZCBtYWtlZmlsZXMgYXMgYSBndWlkZS4gIEFsc28gYWRkIHRoZSBBTlNJIGFuZCBVbml4IEMKLWxpYnJhcmllcyBpbiBhIHNlcGFyYXRlIHNlZ21lbnQuICBZb3UgbWF5IG5lZWQgdG8gZGl2aWRlIHRoZSBKUEVHIGZpbGVzIGludG8KLW1vcmUgdGhhbiBvbmUgc2VnbWVudDsgd2UgcmVjb21tZW5kIGRpdmlkaW5nIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1tb2R1bGVzLiAgRGVmaW5lIFVTRV9DQ09NTUFORCBpbiBqY29uZmlnLmggc28gdGhhdCB0aGUgY2NvbW1hbmQoKSByb3V0aW5lIGlzCi1jYWxsZWQuICBZb3UgbXVzdCBhbHNvIGRlZmluZSBUV09fRklMRV9DT01NQU5ETElORSBiZWNhdXNlIHN0ZGluL3N0ZG91dAotZG9uJ3QgaGFuZGxlIGJpbmFyeSBkYXRhIGNvcnJlY3RseS4KLQotT24gNjgweDAgTWFjcywgVGhpbmsgQyBkZWZpbmVzIHR5cGUgImRvdWJsZSIgYXMgYSAxMi1ieXRlIElFRUUgZXh0ZW5kZWQgZmxvYXQuCi1qbWVtbWdyLmMgd29uJ3QgbGlrZSB0aGlzOiBpdCB3YW50cyBzaXplb2YoQUxJR05fVFlQRSkgdG8gYmUgYSBwb3dlciBvZiAyLgotQWRkICIjZGVmaW5lIEFMSUdOX1RZUEUgbG9uZyIgdG8gamNvbmZpZy5oIHRvIGVsaW1pbmF0ZSB0aGUgY29tcGxhaW50LgotCi1qY29uZmlnLm1hYyBzaG91bGQgd29yayBhcyBhIGpjb25maWcuaCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIFRoaW5rIEMsCi1idXQgdGhlIG1ha2Vwcm9qLm1hYyBBcHBsZVNjcmlwdCBzY3JpcHQgaXMgc3BlY2lmaWMgdG8gQ29kZVdhcnJpb3IuICBTb3JyeS4KLQotCi1NSVBTIFIzMDAwOgotCi1NSVBTJ3MgY2MgdmVyc2lvbiAxLjMxIGhhcyBhIHJhdGhlciBuYXN0eSBvcHRpbWl6YXRpb24gYnVnLiAgRG9uJ3QgdXNlIC1PCi1pZiB5b3UgaGF2ZSB0aGF0IGNvbXBpbGVyIHZlcnNpb24uICAoVXNlICJjYyAtViIgdG8gY2hlY2sgdGhlIHZlcnNpb24uKQotTm90ZSB0aGF0IHRoZSBSMzAwMCBjaGlwIGlzIGZvdW5kIGluIHdvcmtzdGF0aW9ucyBmcm9tIERFQyBhbmQgb3RoZXJzLgotCi0KLU1TLURPUywgZ2VuZXJpYyBjb21tZW50cyBmb3IgMTYtYml0IGNvbXBpbGVyczoKLQotVGhlIElKRyBjb2RlIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2VsbCBpbiA4MHg4NiAic21hbGwiIG9yICJtZWRpdW0iIG1lbW9yeQotbW9kZWxzIChpLmUuLCBkYXRhIHBvaW50ZXJzIGFyZSAxNiBiaXRzIHVubGVzcyBleHBsaWNpdGx5IGRlY2xhcmVkICJmYXIiOwotY29kZSBwb2ludGVycyBjYW4gYmUgZWl0aGVyIHNpemUpLiAgWW91IG1heSBiZSBhYmxlIHRvIHVzZSBzbWFsbCBtb2RlbCB0bwotY29tcGlsZSBjanBlZyBvciBkanBlZyBieSBpdHNlbGYsIGJ1dCB5b3Ugd2lsbCBwcm9iYWJseSBoYXZlIHRvIHVzZSBtZWRpdW0KLW1vZGVsIGZvciBhbnkgbGFyZ2VyIGFwcGxpY2F0aW9uLiAgVGhpcyB3b24ndCBtYWtlIG11Y2ggZGlmZmVyZW5jZSBpbgotcGVyZm9ybWFuY2UuICBZb3UgKndpbGwqIHRha2UgYSBub3RpY2VhYmxlIHBlcmZvcm1hbmNlIGhpdCBpZiB5b3UgdXNlIGEKLWxhcmdlLWRhdGEgbWVtb3J5IG1vZGVsLCBhbmQgeW91IHNob3VsZCBhdm9pZCAiaHVnZSIgbW9kZWwgaWYgYXQgYWxsCi1wb3NzaWJsZS4gIEJlIHN1cmUgdGhhdCBORUVEX0ZBUl9QT0lOVEVSUyBpcyBkZWZpbmVkIGluIGpjb25maWcuaCBpZiB5b3UgdXNlCi1hIHNtYWxsLWRhdGEgbWVtb3J5IG1vZGVsOyBiZSBzdXJlIGl0IGlzIE5PVCBkZWZpbmVkIGlmIHlvdSB1c2UgYSBsYXJnZS1kYXRhCi1tb2RlbC4gIChUaGUgc3VwcGxpZWQgbWFrZWZpbGVzIGFuZCBqY29uZmlnIGZpbGVzIGZvciBCb3JsYW5kIGFuZCBNaWNyb3NvZnQgQwotY29tcGlsZSBpbiBtZWRpdW0gbW9kZWwgYW5kIGRlZmluZSBORUVEX0ZBUl9QT0lOVEVSUy4pCi0KLVRoZSBET1Mtc3BlY2lmaWMgbWVtb3J5IG1hbmFnZXIsIGptZW1kb3MuYywgc2hvdWxkIGJlIHVzZWQgaWYgcG9zc2libGUuCi1JdCBuZWVkcyBzb21lIGFzc2VtYmx5LWNvZGUgcm91dGluZXMgd2hpY2ggYXJlIGluIGptZW1kb3NhLmFzbTsgbWFrZSBzdXJlCi15b3VyIG1ha2VmaWxlIGFzc2VtYmxlcyB0aGF0IGZpbGUgYW5kIGluY2x1ZGVzIGl0IGluIHRoZSBsaWJyYXJ5LiAgSWYgeW91Ci1kb24ndCBoYXZlIGEgc3VpdGFibGUgYXNzZW1ibGVyLCB5b3UgY2FuIGdldCBwcmUtYXNzZW1ibGVkIG9iamVjdCBmaWxlcyBmb3IKLWptZW1kb3NhIGJ5IEZUUCBmcm9tIGZ0cC51dS5uZXQ6L2dyYXBoaWNzL2pwZWcvamRvc2FvYmouemlwLiAgKERPUy1vcmllbnRlZAotZGlzdHJpYnV0aW9ucyBvZiB0aGUgSUpHIHNvdXJjZSBjb2RlIG9mdGVuIGluY2x1ZGUgdGhlc2Ugb2JqZWN0IGZpbGVzLikKLQotV2hlbiB1c2luZyBqbWVtZG9zLmMsIGpjb25maWcuaCBtdXN0IGRlZmluZSBVU0VfTVNET1NfTUVNTUdSIGFuZCBtdXN0IHNldAotTUFYX0FMTE9DX0NIVU5LIHRvIGxlc3MgdGhhbiA2NEsgKDY1NTIwTCBpcyBhIHR5cGljYWwgdmFsdWUpLiAgSWYgeW91cgotQyBsaWJyYXJ5J3MgZmFyLWhlYXAgbWFsbG9jKCkgY2FuJ3QgYWxsb2NhdGUgYmxvY2tzIHRoYXQgbGFyZ2UsIHJlZHVjZQotTUFYX0FMTE9DX0NIVU5LIHRvIHdoYXRldmVyIGl0IGNhbiBoYW5kbGUuCi0KLUlmIHlvdSBjYW4ndCB1c2Ugam1lbWRvcy5jIGZvciBzb21lIHJlYXNvbiAtLS0gZm9yIGV4YW1wbGUsIGJlY2F1c2UgeW91Ci1kb24ndCBoYXZlIGFuIGFzc2VtYmxlciB0byBhc3NlbWJsZSBqbWVtZG9zYS5hc20gLS0tIHlvdSdsbCBoYXZlIHRvIGZhbGwKLWJhY2sgdG8gam1lbWFuc2kuYyBvciBqbWVtbmFtZS5jLiAgWW91J2xsIHByb2JhYmx5IHN0aWxsIG5lZWQgdG8gc2V0Ci1NQVhfQUxMT0NfQ0hVTksgaW4gamNvbmZpZy5oLCBiZWNhdXNlIG1vc3QgRE9TIEMgbGlicmFyaWVzIHdvbid0IG1hbGxvYygpCi1tb3JlIHRoYW4gNjRLIGF0IGEgdGltZS4gIElNUE9SVEFOVDogaWYgeW91IHVzZSBqbWVtYW5zaS5jIG9yIGptZW1uYW1lLmMsCi15b3Ugd2lsbCBoYXZlIHRvIGNvbXBpbGUgaW4gYSBsYXJnZS1kYXRhIG1lbW9yeSBtb2RlbCBpbiBvcmRlciB0byBnZXQgdGhlCi1yaWdodCBzdGRpbyBsaWJyYXJ5LiAgVG9vIGJhZC4KLQotd3JqcGdjb20gbmVlZHMgdG8gYmUgY29tcGlsZWQgaW4gbGFyZ2UgbW9kZWwsIGJlY2F1c2UgaXQgbWFsbG9jKClzIGEgNjRLQgotd29yayBhcmVhIHRvIGhvbGQgdGhlIGNvbW1lbnQgdGV4dC4gIElmIHlvdXIgQyBsaWJyYXJ5J3MgbWFsbG9jIGNhbid0Ci1oYW5kbGUgdGhhdCwgcmVkdWNlIE1BWF9DT01fTEVOR1RIIGFzIG5lY2Vzc2FyeSBpbiB3cmpwZ2NvbS5jLgotCi1Nb3N0IE1TLURPUyBjb21waWxlcnMgdHJlYXQgc3RkaW4vc3Rkb3V0IGFzIHRleHQgZmlsZXMsIHNvIHlvdSBtdXN0IHVzZQotdHdvLWZpbGUgY29tbWFuZCBsaW5lIHN0eWxlLiAgQnV0IGlmIHlvdXIgY29tcGlsZXIgaGFzIGVpdGhlciBmZG9wZW4oKSBvcgotc2V0bW9kZSgpLCB5b3UgY2FuIHVzZSBvbmUtZmlsZSBzdHlsZSBpZiB5b3UgbGlrZS4gIFRvIGRvIHRoaXMsIGRlZmluZQotVVNFX1NFVE1PREUgb3IgVVNFX0ZET1BFTiBzbyB0aGF0IHN0ZGluL3N0ZG91dCB3aWxsIGJlIHNldCB0byBiaW5hcnkgbW9kZS4KLShVU0VfU0VUTU9ERSBzZWVtcyB0byB3b3JrIHdpdGggbW9yZSBET1MgY29tcGlsZXJzIHRoYW4gVVNFX0ZET1BFTi4pICBZb3UKLXNob3VsZCB0ZXN0IHRoYXQgSS9PIHRocm91Z2ggc3RkaW4vc3Rkb3V0IHByb2R1Y2VzIHRoZSBzYW1lIHJlc3VsdHMgYXMgSS9PCi10byBleHBsaWNpdGx5IG5hbWVkIGZpbGVzLi4uIHRoZSAibWFrZSB0ZXN0IiBwcm9jZWR1cmVzIGluIHRoZSBzdXBwbGllZAotbWFrZWZpbGVzIGRvIE5PVCB1c2Ugc3RkaW4vc3Rkb3V0LgotCi0KLU1TLURPUywgZ2VuZXJpYyBjb21tZW50cyBmb3IgMzItYml0IGNvbXBpbGVyczoKLQotTm9uZSBvZiB0aGUgYWJvdmUgY29tbWVudHMgYWJvdXQgbWVtb3J5IG1vZGVscyBhcHBseSBpZiB5b3UgYXJlIHVzaW5nIGEKLTMyLWJpdCBmbGF0LW1lbW9yeS1zcGFjZSBlbnZpcm9ubWVudCwgc3VjaCBhcyBESkdQUCBvciBXYXRjb20gQy4gIChBbmQgeW91Ci1zaG91bGQgdXNlIG9uZSBpZiB5b3UgaGF2ZSBpdCwgYXMgcGVyZm9ybWFuY2Ugd2lsbCBiZSBtdWNoIGJldHRlciB0aGFuCi04MDg2LWNvbXBhdGlibGUgY29kZSEpICBGb3IgZmxhdC1tZW1vcnktc3BhY2UgY29tcGlsZXJzLCBkbyBOT1QgZGVmaW5lCi1ORUVEX0ZBUl9QT0lOVEVSUywgYW5kIGRvIE5PVCB1c2Ugam1lbWRvcy5jLiAgVXNlIGptZW1ub2JzLmMgaWYgdGhlCi1lbnZpcm9ubWVudCBzdXBwbGllcyBhZGVxdWF0ZSB2aXJ0dWFsIG1lbW9yeSwgb3RoZXJ3aXNlIHVzZSBqbWVtYW5zaS5jIG9yCi1qbWVtbmFtZS5jLgotCi1Zb3UnbGwgc3RpbGwgbmVlZCB0byBiZSBjYXJlZnVsIGFib3V0IGJpbmFyeSBJL08gdGhyb3VnaCBzdGRpbi9zdGRvdXQuCi1TZWUgdGhlIGxhc3QgcGFyYWdyYXBoIG9mIHRoZSBwcmV2aW91cyBzZWN0aW9uLgotCi0KLU1TLURPUywgQm9ybGFuZCBDOgotCi1CZSBzdXJlIHRvIGNvbnZlcnQgYWxsIHRoZSBzb3VyY2UgZmlsZXMgdG8gRE9TIHRleHQgZm9ybWF0IChDUi9MRiBuZXdsaW5lcykuCi1BbHRob3VnaCBCb3JsYW5kIEMgd2lsbCBvZnRlbiB3b3JrIE9LIHdpdGggdW5tb2RpZmllZCBVbml4IChMRiBuZXdsaW5lcykKLXNvdXJjZSBmaWxlcywgc29tZXRpbWVzIGl0IHdpbGwgZ2l2ZSBib2d1cyBjb21waWxlIGVycm9ycy4KLSJJbGxlZ2FsIGNoYXJhY3RlciAnIyciIGlzIHRoZSBtb3N0IGNvbW1vbiBzdWNoIGVycm9yLiAgKFRoaXMgaXMgdHJ1ZSB3aXRoCi1Cb3JsYW5kIEMgMy4xLCBidXQgcGVyaGFwcyBpcyBmaXhlZCBpbiBuZXdlciByZWxlYXNlcy4pCi0KLUlmIHlvdSB3YW50IG9uZS1maWxlIGNvbW1hbmQgbGluZSBzdHlsZSwganVzdCB1bmRlZmluZSBUV09fRklMRV9DT01NQU5ETElORS4KLWpjb25maWcuYmNjIGFscmVhZHkgaW5jbHVkZXMgI2RlZmluZSBVU0VfU0VUTU9ERSB0byBtYWtlIHRoaXMgd29yay4KLShmZG9wZW4gZG9lcyBub3Qgd29yayBjb3JyZWN0bHkuKQotCi0KLU1TLURPUywgTWljcm9zb2Z0IEM6Ci0KLW1ha2VmaWxlLm1jNiB3b3JrcyB3aXRoIE1pY3Jvc29mdCBDLCBET1MgVmlzdWFsIEMrKywgZXRjLiAgSXQgc2hvdWxkIG9ubHkKLWJlIHVzZWQgaWYgeW91IHdhbnQgdG8gYnVpbGQgYSAxNi1iaXQgKHNtYWxsIG9yIG1lZGl1bSBtZW1vcnkgbW9kZWwpIHByb2dyYW0uCi0KLUlmIHlvdSB3YW50IG9uZS1maWxlIGNvbW1hbmQgbGluZSBzdHlsZSwganVzdCB1bmRlZmluZSBUV09fRklMRV9DT01NQU5ETElORS4KLWpjb25maWcubWM2IGFscmVhZHkgaW5jbHVkZXMgI2RlZmluZSBVU0VfU0VUTU9ERSB0byBtYWtlIHRoaXMgd29yay4KLShmZG9wZW4gZG9lcyBub3Qgd29yayBjb3JyZWN0bHkuKQotCi1Ob3RlIHRoYXQgdGhpcyBtYWtlZmlsZSBhc3N1bWVzIHRoYXQgdGhlIHdvcmtpbmcgY29weSBvZiBpdHNlbGYgaXMgY2FsbGVkCi0ibWFrZWZpbGUiLiAgSWYgeW91IHdhbnQgdG8gY2FsbCBpdCBzb21ldGhpbmcgZWxzZSwgc2F5ICJtYWtlZmlsZS5tYWsiLAotYmUgc3VyZSB0byBhZGp1c3QgdGhlIGRlcGVuZGVuY3kgbGluZSB0aGF0IHJlYWRzICIkKFJGSUxFKSA6IG1ha2VmaWxlIi4KLU90aGVyd2lzZSB0aGUgbWFrZSB3aWxsIGZhaWwgYmVjYXVzZSBpdCBkb2Vzbid0IGtub3cgaG93IHRvIGNyZWF0ZSAibWFrZWZpbGUiLgotV29yc2UsIHNvbWUgcmVsZWFzZXMgb2YgTWljcm9zb2Z0J3MgbWFrZSB1dGlsaXRpZXMgZ2l2ZSBhbiBpbmNvcnJlY3QgZXJyb3IKLW1lc3NhZ2UgaW4gdGhpcyBzaXR1YXRpb24uCi0KLU9sZCB2ZXJzaW9ucyBvZiBNUyBDIGZhaWwgd2l0aCBhbiAib3V0IG9mIG1hY3JvIGV4cGFuc2lvbiBzcGFjZSIgZXJyb3IKLWJlY2F1c2UgdGhleSBjYW4ndCBjb3BlIHdpdGggdGhlIG1hY3JvIFRSQUNFTVM4IChkZWZpbmVkIGluIGplcnJvci5oKS4KLUlmIHRoaXMgaGFwcGVucyB0byB5b3UsIHRoZSBlYXNpZXN0IHNvbHV0aW9uIGlzIHRvIGNoYW5nZSBUUkFDRU1TOCB0bwotZXhwYW5kIHRvIG5vdGhpbmcuICBZb3UnbGwgbG9zZSB0aGUgYWJpbGl0eSB0byBkdW1wIG91dCBKUEVHIGNvZWZmaWNpZW50Ci10YWJsZXMgd2l0aCBkanBlZyAtZGVidWcgLWRlYnVnLCBidXQgYXQgbGVhc3QgeW91IGNhbiBjb21waWxlLgotCi1PcmlnaW5hbCBNUyBDIDYuMCBpcyB2ZXJ5IGJ1Z2d5OyBpdCBjb21waWxlcyBpbmNvcnJlY3QgY29kZSB1bmxlc3MgeW91IHR1cm4KLW9mZiBvcHRpbWl6YXRpb24gZW50aXJlbHkgKHJlbW92ZSAtTyBmcm9tIENGTEFHUykuICA2LjAwQSBpcyBiZXR0ZXIsIGJ1dCBpdAotc3RpbGwgZ2VuZXJhdGVzIGJhZCBjb2RlIGlmIHlvdSBlbmFibGUgbG9vcCBvcHRpbWl6YXRpb25zICgtT2wgb3IgLU94KS4KLQotTVMgQyA4LjAgY3Jhc2hlcyB3aGVuIGNvbXBpbGluZyBqcXVhbnQxLmMgd2l0aCBvcHRpbWl6YXRpb24gc3dpdGNoIC9PbyAuLi4KLXdoaWNoIGlzIG9uIGJ5IGRlZmF1bHQuICBUbyB3b3JrIGFyb3VuZCB0aGlzIGJ1ZywgY29tcGlsZSB0aGF0IG9uZSBmaWxlCi13aXRoIC9Pby0uCi0KLQotTWljcm9zb2Z0IFdpbmRvd3MgKGFsbCB2ZXJzaW9ucyksIGdlbmVyaWMgY29tbWVudHM6Ci0KLVNvbWUgV2luZG93cyBzeXN0ZW0gaW5jbHVkZSBmaWxlcyBkZWZpbmUgdHlwZWRlZiBib29sZWFuIGFzICJ1bnNpZ25lZCBjaGFyIi4KLVRoZSBJSkcgY29kZSBhbHNvIGRlZmluZXMgdHlwZWRlZiBib29sZWFuLCBidXQgd2UgbWFrZSBpdCAiaW50IiBieSBkZWZhdWx0LgotVGhpcyBkb2Vzbid0IGFmZmVjdCB0aGUgSUpHIHByb2dyYW1zIGJlY2F1c2Ugd2UgZG9uJ3QgaW1wb3J0IHRob3NlIFdpbmRvd3MKLWluY2x1ZGUgZmlsZXMuICBCdXQgaWYgeW91IHVzZSB0aGUgSlBFRyBsaWJyYXJ5IGluIHlvdXIgb3duIHByb2dyYW0sIGFuZCBzb21lCi1vZiB5b3VyIHByb2dyYW0ncyBmaWxlcyBpbXBvcnQgb25lIGRlZmluaXRpb24gb2YgYm9vbGVhbiB3aGlsZSBzb21lIGltcG9ydCB0aGUKLW90aGVyLCB5b3UgY2FuIGdldCBhbGwgc29ydHMgb2YgbXlzdGVyaW91cyBwcm9ibGVtcy4gIEEgZ29vZCBwcmV2ZW50aXZlIHN0ZXAKLWlzIHRvIG1ha2UgdGhlIElKRyBsaWJyYXJ5IHVzZSAidW5zaWduZWQgY2hhciIgZm9yIGJvb2xlYW4uICBUbyBkbyB0aGF0LAotYWRkIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8geW91ciBqY29uZmlnLmggZmlsZToKLQkvKiBEZWZpbmUgImJvb2xlYW4iIGFzIHVuc2lnbmVkIGNoYXIsIG5vdCBpbnQsIHBlciBXaW5kb3dzIGN1c3RvbSAqLwotCSNpZm5kZWYgX19SUENORFJfSF9fCS8qIGRvbid0IGNvbmZsaWN0IGlmIHJwY25kci5oIGFscmVhZHkgcmVhZCAqLwotCXR5cGVkZWYgdW5zaWduZWQgY2hhciBib29sZWFuOwotCSNlbmRpZgotCSNkZWZpbmUgSEFWRV9CT09MRUFOCS8qIHByZXZlbnQgam1vcmVjZmcuaCBmcm9tIHJlZGVmaW5pbmcgaXQgKi8KLShUaGlzIGlzIGFscmVhZHkgaW4gamNvbmZpZy52YywgYnkgdGhlIHdheS4pCi0KLXdpbmRlZi5oIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMKLQkjZGVmaW5lIGZhcgotCSNkZWZpbmUgRkFSIGZhcgotU2luY2Ugam1vcmVjZmcuaCB0cmllcyB0byBkZWZpbmUgRkFSIGFzIGVtcHR5LCB5b3UgbWF5IGdldCBhIGNvbXBpbGVyCi13YXJuaW5nIGlmIHlvdSBpbmNsdWRlIGJvdGgganBlZ2xpYi5oIGFuZCB3aW5kZWYuaCAod2hpY2ggd2luZG93cy5oCi1pbmNsdWRlcykuICBUbyBzdXBwcmVzcyB0aGUgd2FybmluZywgeW91IGNhbiBwdXQgIiNpZm5kZWYgRkFSIi8iI2VuZGlmIgotYXJvdW5kIHRoZSBsaW5lICIjZGVmaW5lIEZBUiIgaW4gam1vcmVjZmcuaC4KLQotV2hlbiB1c2luZyB0aGUgbGlicmFyeSBpbiBhIFdpbmRvd3MgYXBwbGljYXRpb24sIHlvdSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkKLXdhbnQgdG8gbW9kaWZ5IG9yIHJlcGxhY2UgdGhlIGVycm9yIGhhbmRsZXIgbW9kdWxlIGplcnJvci5jLCBzaW5jZSBvdXIKLWRlZmF1bHQgZXJyb3IgaGFuZGxlciBkb2VzIGEgY291cGxlIG9mIGluYXBwcm9wcmlhdGUgdGhpbmdzOgotICAxLiBpdCB0cmllcyB0byB3cml0ZSBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcyBvbiBzdGRlcnI7Ci0gIDIuIGluIGV2ZW50IG9mIGEgZmF0YWwgZXJyb3IsIGl0IGV4aXRzIGJ5IGNhbGxpbmcgZXhpdCgpLgotCi1BIHNpbXBsZSBzdG9wZ2FwIHNvbHV0aW9uIGZvciBwcm9ibGVtIDEgaXMgdG8gcmVwbGFjZSB0aGUgbGluZQotCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGJ1ZmZlcik7Ci0oaW4gb3V0cHV0X21lc3NhZ2UgaW4gamVycm9yLmMpIHdpdGgKLQlNZXNzYWdlQm94KEdldEFjdGl2ZVdpbmRvdygpLGJ1ZmZlciwiSlBFRyBFcnJvciIsTUJfT0t8TUJfSUNPTkVSUk9SKTsKLUl0J3MgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IGF0IGxlYXN0IGRvIHRoYXQgbXVjaCwgc2luY2Ugb3RoZXJ3aXNlCi1lcnJvciBtZXNzYWdlcyB3aWxsIGRpc2FwcGVhciBpbnRvIG5vd2hlcmUuICAoQmVnaW5uaW5nIHdpdGggSUpHIHY2YiwgdGhpcwotY29kZSBpcyBhbHJlYWR5IHByZXNlbnQgaW4gamVycm9yLmM7IGp1c3QgZGVmaW5lIFVTRV9XSU5ET1dTX01FU1NBR0VCT1ggaW4KLWpjb25maWcuaCB0byBlbmFibGUgaXQuKQotCi1UaGUgcHJvcGVyIHNvbHV0aW9uIGZvciBwcm9ibGVtIDIgaXMgdG8gcmV0dXJuIGNvbnRyb2wgdG8geW91ciBjYWxsaW5nCi1hcHBsaWNhdGlvbiBhZnRlciBhIGxpYnJhcnkgZXJyb3IuICBUaGlzIGNhbiBiZSBkb25lIHdpdGggdGhlIHNldGptcC9sb25nam1wCi10ZWNobmlxdWUgZGlzY3Vzc2VkIGluIGxpYmpwZWcuZG9jIGFuZCBpbGx1c3RyYXRlZCBpbiBleGFtcGxlLmMuICAoTk9URToKLXNvbWUgb2xkZXIgV2luZG93cyBDIGNvbXBpbGVycyBwcm92aWRlIHZlcnNpb25zIG9mIHNldGptcC9sb25nam1wIHRoYXQKLWRvbid0IGFjdHVhbGx5IHdvcmsgdW5kZXIgV2luZG93cy4gIFlvdSBtYXkgbmVlZCB0byB1c2UgdGhlIFdpbmRvd3Mgc3lzdGVtCi1mdW5jdGlvbnMgQ2F0Y2ggYW5kIFRocm93IGluc3RlYWQuKQotCi1UaGUgcmVjb21tZW5kZWQgbWVtb3J5IG1hbmFnZXIgdW5kZXIgV2luZG93cyBpcyBqbWVtbm9icy5jOyBpbiBvdGhlciB3b3JkcywKLWxldCBXaW5kb3dzIGRvIGFueSB2aXJ0dWFsIG1lbW9yeSBtYW5hZ2VtZW50IG5lZWRlZC4gIFlvdSBzaG91bGQgTk9UIHVzZQotam1lbWRvcy5jIG5vciBqbWVtZG9zYS5hc20gdW5kZXIgV2luZG93cy4KLQotRm9yIFdpbmRvd3MgMy4xLCB3ZSByZWNvbW1lbmQgY29tcGlsaW5nIGluIG1lZGl1bSBvciBsYXJnZSBtZW1vcnkgbW9kZWw7Ci1mb3IgbmV3ZXIgV2luZG93cyB2ZXJzaW9ucywgdXNlIGEgMzItYml0IGZsYXQgbWVtb3J5IG1vZGVsLiAgKFNlZSB0aGUgTVMtRE9TCi1zZWN0aW9ucyBhYm92ZSBmb3IgbW9yZSBpbmZvIGFib3V0IG1lbW9yeSBtb2RlbHMuKSAgSW4gdGhlIDE2LWJpdCBtZW1vcnkKLW1vZGVscyBvbmx5LCB5b3UnbGwgbmVlZCB0byBwdXQKLQkjZGVmaW5lIE1BWF9BTExPQ19DSFVOSyA2NTUyMEwJLyogTWF4aW11bSByZXF1ZXN0IHRvIG1hbGxvYygpICovCi1pbnRvIGpjb25maWcuaCB0byBsaW1pdCBhbGxvY2F0aW9uIGNodW5rcyB0byA2NEtiLiAgKFdpdGhvdXQgdGhhdCwgeW91J2QKLWhhdmUgdG8gdXNlIGh1Z2UgbWVtb3J5IG1vZGVsLCB3aGljaCBzbG93cyB0aGluZ3MgZG93biB1bm5lY2Vzc2FyaWx5LikKLWptZW1ub2JzLmMgd29ya3Mgd2l0aG91dCBtb2RpZmljYXRpb24gaW4gbGFyZ2Ugb3IgZmxhdCBtZW1vcnkgbW9kZWxzLCBidXQgdG8KLXVzZSBtZWRpdW0gbW9kZWwsIHlvdSBuZWVkIHRvIG1vZGlmeSBpdHMganBlZ19nZXRfbGFyZ2UgYW5kIGpwZWdfZnJlZV9sYXJnZQotcm91dGluZXMgdG8gYWxsb2NhdGUgZmFyIG1lbW9yeS4gIEluIGFueSBjYXNlLCB5b3UgbWlnaHQgbGlrZSB0byByZXBsYWNlCi1pdHMgY2FsbHMgdG8gbWFsbG9jIGFuZCBmcmVlIHdpdGggZGlyZWN0IGNhbGxzIG9uIFdpbmRvd3MgbWVtb3J5IGFsbG9jYXRpb24KLWZ1bmN0aW9ucy4KLQotWW91IG1heSBhbHNvIHdhbnQgdG8gbW9kaWZ5IGpkYXRhc3JjLmMgYW5kIGpkYXRhZHN0LmMgdG8gdXNlIFdpbmRvd3MgZmlsZQotb3BlcmF0aW9ucyByYXRoZXIgdGhhbiBmcmVhZC9md3JpdGUuICBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdXIgQwotY29tcGlsZXIgZG9lc24ndCBwcm92aWRlIGEgY29tcGV0ZW50IGltcGxlbWVudGF0aW9uIG9mIEMgc3RkaW8gZnVuY3Rpb25zLgotCi1Zb3UgbWlnaHQgd2FudCB0byB0d2VhayB0aGUgUkdCX3h4eCBtYWNyb3MgaW4gam1vcmVjZmcuaCBzbyB0aGF0IHRoZSBsaWJyYXJ5Ci13aWxsIGFjY2VwdCBvciBkZWxpdmVyIGNvbG9yIHBpeGVscyBpbiBCR1Igc2FtcGxlIG9yZGVyLCBub3QgUkdCOyBCR1Igb3JkZXIKLWlzIHVzdWFsbHkgbW9yZSBjb252ZW5pZW50IHVuZGVyIFdpbmRvd3MuICBOb3RlIHRoYXQgdGhpcyBjaGFuZ2Ugd2lsbCBicmVhawotdGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMgY2pwZWcvZGpwZWcsIGJ1dCB0aGUgbGlicmFyeSBpdHNlbGYgd29ya3MgZmluZS4KLQotCi1NYW55IHBlb3BsZSB3YW50IHRvIGNvbnZlcnQgdGhlIElKRyBsaWJyYXJ5IGludG8gYSBETEwuICBUaGlzIGlzIHJlYXNvbmFibHkKLXN0cmFpZ2h0Zm9yd2FyZCwgYnV0IHdhdGNoIG91dCBmb3IgdGhlIGZvbGxvd2luZzoKLQotICAxLiBEb24ndCB0cnkgdG8gY29tcGlsZSBhcyBhIERMTCBpbiBzbWFsbCBvciBtZWRpdW0gbWVtb3J5IG1vZGVsOyB1c2UKLWxhcmdlIG1vZGVsLCBvciBldmVuIGJldHRlciwgMzItYml0IGZsYXQgbW9kZWwuICBNYW55IHBsYWNlcyBpbiB0aGUgSUpHIGNvZGUKLWFzc3VtZSB0aGUgYWRkcmVzcyBvZiBhIGxvY2FsIHZhcmlhYmxlIGlzIGFuIG9yZGluYXJ5IChub3QgRkFSKSBwb2ludGVyOwotdGhhdCBpc24ndCB0cnVlIGluIGEgbWVkaXVtLW1vZGVsIERMTC4KLQotICAyLiBNaWNyb3NvZnQgQyBjYW5ub3QgcGFzcyBmaWxlIHBvaW50ZXJzIGJldHdlZW4gYXBwbGljYXRpb25zIGFuZCBETExzLgotKFNlZSBNaWNyb3NvZnQgS25vd2xlZGdlIEJhc2UsIFBTUyBJRCBOdW1iZXIgUTUwMzM2LikgIFNvIGpkYXRhc3JjLmMgYW5kCi1qZGF0YWRzdC5jIGRvbid0IHdvcmsgaWYgeW91IG9wZW4gYSBmaWxlIGluIHlvdXIgYXBwbGljYXRpb24gYW5kIHRoZW4gcGFzcwotdGhlIHBvaW50ZXIgdG8gdGhlIERMTC4gIE9uZSB3b3JrYXJvdW5kIGlzIHRvIG1ha2UgamRhdGFzcmMuYy9qZGF0YWRzdC5jCi1wYXJ0IG9mIHlvdXIgbWFpbiBhcHBsaWNhdGlvbiByYXRoZXIgdGhhbiBwYXJ0IG9mIHRoZSBETEwuCi0KLSAgMy4gWW91J2xsIHByb2JhYmx5IG5lZWQgdG8gbW9kaWZ5IHRoZSBtYWNyb3MgR0xPQkFMKCkgYW5kIEVYVEVSTigpIHRvCi1hdHRhY2ggc3VpdGFibGUgbGlua2FnZSBrZXl3b3JkcyB0byB0aGUgZXhwb3J0ZWQgcm91dGluZSBuYW1lcy4gIFNpbWlsYXJseSwKLXlvdSdsbCB3YW50IHRvIG1vZGlmeSBNRVRIT0RERUYoKSBhbmQgSk1FVEhPRCgpIHRvIGVuc3VyZSBmdW5jdGlvbiBwb2ludGVycwotYXJlIGRlY2xhcmVkIGluIGEgd2F5IHRoYXQgbGV0cyBhcHBsaWNhdGlvbiByb3V0aW5lcyBiZSBjYWxsZWQgYmFjayB0aHJvdWdoCi10aGUgZnVuY3Rpb24gcG9pbnRlcnMuICBUaGVzZSBtYWNyb3MgYXJlIGluIGptb3JlY2ZnLmguICBUeXBpY2FsIGRlZmluaXRpb25zCi1mb3IgYSAxNi1iaXQgRExMIGFyZToKLQkjZGVmaW5lIEdMT0JBTCh0eXBlKQkJdHlwZSBfZmFyIF9wYXNjYWwgX2xvYWRkcyBfZXhwb3J0Ci0JI2RlZmluZSBFWFRFUk4odHlwZSkJCWV4dGVybiB0eXBlIF9mYXIgX3Bhc2NhbCBfbG9hZGRzCi0JI2RlZmluZSBNRVRIT0RERUYodHlwZSkJCXN0YXRpYyB0eXBlIF9mYXIgX3Bhc2NhbAotCSNkZWZpbmUgSk1FVEhPRCh0eXBlLG1ldGhvZG5hbWUsYXJnbGlzdCkgIFwKLQkJdHlwZSAoX2ZhciBfcGFzY2FsICptZXRob2RuYW1lKSBhcmdsaXN0Ci1Gb3IgYSAzMi1iaXQgRExMIHlvdSBtYXkgd2FudCBzb21ldGhpbmcgbGlrZQotCSNkZWZpbmUgR0xPQkFMKHR5cGUpCQlfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdHlwZQotCSNkZWZpbmUgRVhURVJOKHR5cGUpCQlleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpIHR5cGUKLUFsdGhvdWdoIG5vdCBhbGwgdGhlIEdMT0JBTCByb3V0aW5lcyBhcmUgYWN0dWFsbHkgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGJ5Ci10aGUgYXBwbGljYXRpb24sIHRoZSBwZXJmb3JtYW5jZSBjb3N0IG9mIG1ha2luZyB0aGVtIGFsbCBETEwgZW50cnkgcG9pbnRzIGlzCi1uZWdsaWdpYmxlLgotCi1UaGUgdW5tb2RpZmllZCBJSkcgbGlicmFyeSBwcmVzZW50cyBhIHZlcnkgQy1zcGVjaWZpYyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UsCi1zbyB0aGUgcmVzdWx0aW5nIERMTCBpcyBvbmx5IHVzYWJsZSBmcm9tIEMgb3IgQysrIGFwcGxpY2F0aW9ucy4gIFRoZXJlIGhhcwotYmVlbiBzb21lIHRhbGsgb2Ygd3JpdGluZyB3cmFwcGVyIGNvZGUgdGhhdCB3b3VsZCBwcmVzZW50IGEgc2ltcGxlciBpbnRlcmZhY2UKLXVzYWJsZSBmcm9tIG90aGVyIGxhbmd1YWdlcywgc3VjaCBhcyBWaXN1YWwgQmFzaWMuICBUaGlzIGlzIG9uIG91ciB0by1kbyBsaXN0Ci1idXQgaGFzbid0IGJlZW4gdmVyeSBoaWdoIHByaW9yaXR5IC0tLSBhbnkgdm9sdW50ZWVycyBvdXQgdGhlcmU/Ci0KLQotTWljcm9zb2Z0IFdpbmRvd3MsIEJvcmxhbmQgQzoKLQotVGhlIHByb3ZpZGVkIGpjb25maWcuYmNjIHNob3VsZCB3b3JrIE9LIGluIGEgMzItYml0IFdpbmRvd3MgZW52aXJvbm1lbnQsCi1idXQgeW91J2xsIG5lZWQgdG8gdHdlYWsgaXQgaW4gYSAxNi1iaXQgZW52aXJvbm1lbnQgKHlvdSdkIG5lZWQgdG8gZGVmaW5lCi1ORUVEX0ZBUl9QT0lOVEVSUyBhbmQgTUFYX0FMTE9DX0NIVU5LKS4gIEJld2FyZSB0aGF0IG1ha2VmaWxlLmJjYyB3aWxsIG5lZWQKLWFsdGVyYXRpb24gaWYgeW91IHdhbnQgdG8gdXNlIGl0IGZvciBXaW5kb3dzIC0tLSBpbiBwYXJ0aWN1bGFyLCB5b3Ugc2hvdWxkCi11c2Ugam1lbW5vYnMuYyBub3Qgam1lbWRvcy5jIHVuZGVyIFdpbmRvd3MuCi0KLUJvcmxhbmQgQysrIDQuNSBmYWlscyB3aXRoIGFuIGludGVybmFsIGNvbXBpbGVyIGVycm9yIHdoZW4gdHJ5aW5nIHRvIGNvbXBpbGUKLWpkbWVyZ2UuYyBpbiAzMi1iaXQgbW9kZS4gIElmIGVub3VnaCBwZW9wbGUgY29tcGxhaW4sIHBlcmhhcHMgQm9ybGFuZCB3aWxsIGZpeAotaXQuICBJbiB0aGUgbWVhbnRpbWUsIHRoZSBzaW1wbGVzdCBrbm93biB3b3JrYXJvdW5kIGlzIHRvIGFkZCBhIHJlZHVuZGFudAotZGVmaW5pdGlvbiBvZiB0aGUgdmFyaWFibGUgcmFuZ2VfbGltaXQgaW4gaDJ2MV9tZXJnZWRfdXBzYW1wbGUoKSwgYXQgdGhlIGhlYWQKLW9mIHRoZSBibG9jayB0aGF0IGhhbmRsZXMgb2RkIGltYWdlIHdpZHRoIChhYm91dCBsaW5lIDI2OCBpbiB2NiBqZG1lcmdlLmMpOgotICAvKiBJZiBpbWFnZSB3aWR0aCBpcyBvZGQsIGRvIHRoZSBsYXN0IG91dHB1dCBjb2x1bW4gc2VwYXJhdGVseSAqLwotICBpZiAoY2luZm8tPm91dHB1dF93aWR0aCAmIDEpIHsKLSAgICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OyAvKiBBREQgVEhJUyAqLwotICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKLVByZXR0eSBiaXphcnJlLCBlc3BlY2lhbGx5IHNpbmNlIHRoZSB2ZXJ5IHNpbWlsYXIgcm91dGluZSBoMnYyX21lcmdlZF91cHNhbXBsZQotZG9lc24ndCB0cmlnZ2VyIHRoZSBidWcuCi1SZWNlbnQgcmVwb3J0cyBzdWdnZXN0IHRoYXQgdGhpcyBidWcgZG9lcyBub3Qgb2NjdXIgd2l0aCAiYmNjMzJhIiAodGhlCi1QZW50aXVtLW9wdGltaXplZCB2ZXJzaW9uIG9mIHRoZSBjb21waWxlcikuCi0KLUFub3RoZXIgcmVwb3J0IGZyb20gYSB1c2VyIG9mIEJvcmxhbmQgQyA0LjUgd2FzIHRoYXQgaW5jb3JyZWN0IGNvZGUgKGxlYWRpbmcKLXRvIGEgY29sb3Igc2hpZnQgaW4gcHJvY2Vzc2VkIGltYWdlcykgd2FzIHByb2R1Y2VkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nCi1vcHRpbWl6YXRpb24gc3dpdGNoIGNvbWJpbmF0aW9ucyB3ZXJlIHVzZWQ6IAotCS1PdCAtT2cKLQktT3QgLU9wCi0JLU90IC1PbQotU28gdHJ5IGJhY2tpbmcgb2ZmIG9uIG9wdGltaXphdGlvbiBpZiB5b3Ugc2VlIHN1Y2ggYSBwcm9ibGVtLiAgKEFyZSB0aGVyZQotc2V2ZXJhbCBkaWZmZXJlbnQgcmVsZWFzZXMgYWxsIG51bWJlcmVkICI0LjUiPz8pCi0KLQotTWljcm9zb2Z0IFdpbmRvd3MsIE1pY3Jvc29mdCBWaXN1YWwgQysrOgotCi1qY29uZmlnLnZjIHNob3VsZCB3b3JrIE9LIHdpdGggYW55IE1pY3Jvc29mdCBjb21waWxlciBmb3IgYSAzMi1iaXQgbWVtb3J5Ci1tb2RlbC4gIG1ha2VmaWxlLnZjIGlzIGludGVuZGVkIGZvciBjb21tYW5kLWxpbmUgdXNlLiAgKElmIHlvdSBhcmUgdXNpbmcKLXRoZSBEZXZlbG9wZXIgU3R1ZGlvIGVudmlyb25tZW50LCB5b3UgbWF5IHByZWZlciB0aGUgRGV2U3R1ZGlvIHByb2plY3QKLWZpbGVzOyBzZWUgYmVsb3cuKQotCi1Tb21lIHVzZXJzIGZlZWwgdGhhdCBpdCdzIGVhc2llciB0byBjYWxsIHRoZSBsaWJyYXJ5IGZyb20gQysrIGNvZGUgaWYgeW91Ci1mb3JjZSBWQysrIHRvIHRyZWF0IHRoZSBsaWJyYXJ5IGFzIEMrKyBjb2RlLCB3aGljaCB5b3UgY2FuIGRvIGJ5IHJlbmFtaW5nCi1hbGwgdGhlICouYyBmaWxlcyB0byAqLmNwcCAoYW5kIGFkanVzdGluZyB0aGUgbWFrZWZpbGUgdG8gbWF0Y2gpLiAgVGhpcwotYXZvaWRzIHRoZSBuZWVkIHRvIHB1dCBleHRlcm4gIkMiIHsgLi4uIH0gYXJvdW5kICNpbmNsdWRlICJqcGVnbGliLmgiIGluCi15b3VyIEMrKyBhcHBsaWNhdGlvbi4KLQotCi1NaWNyb3NvZnQgV2luZG93cywgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW86Ci0KLVdlIGluY2x1ZGUgbWFrZWZpbGVzIHRoYXQgc2hvdWxkIHdvcmsgYXMgcHJvamVjdCBmaWxlcyBpbiBEZXZTdHVkaW8gNC4yIG9yCi1sYXRlci4gIFRoZXJlIGlzIGEgbGlicmFyeSBtYWtlZmlsZSB0aGF0IGJ1aWxkcyB0aGUgSUpHIGxpYnJhcnkgYXMgYSBzdGF0aWMKLVdpbjMyIGxpYnJhcnksIGFuZCBhbiBhcHBsaWNhdGlvbiBtYWtlZmlsZSB0aGF0IGJ1aWxkcyB0aGUgc2FtcGxlIGFwcGxpY2F0aW9ucwotYXMgV2luMzIgY29uc29sZSBhcHBsaWNhdGlvbnMuICAoRXZlbiBpZiB5b3Ugb25seSB3YW50IHRoZSBsaWJyYXJ5LCB3ZQotcmVjb21tZW5kIGJ1aWxkaW5nIHRoZSBhcHBsaWNhdGlvbnMgc28gdGhhdCB5b3UgY2FuIHJ1biB0aGUgc2VsZi10ZXN0LikKLQotVG8gdXNlOgotMS4gQ29weSBqY29uZmlnLnZjIHRvIGpjb25maWcuaCwgbWFrZWxpYi5kcyB0byBqcGVnLm1haywgYW5kCi0gICBtYWtlYXBwcy5kcyB0byBhcHBzLm1hay4gIChOb3RlIHRoYXQgdGhlIHJlbmFtaW5nIGlzIGNyaXRpY2FsISkKLTIuIENsaWNrIG9uIHRoZSAubWFrIGZpbGVzIHRvIGNvbnN0cnVjdCBwcm9qZWN0IHdvcmtzcGFjZXMuCi0gICAoSWYgeW91IGFyZSB1c2luZyBEZXZTdHVkaW8gbW9yZSByZWNlbnQgdGhhbiA0LjIsIHlvdSdsbCBwcm9iYWJseQotICAgZ2V0IGEgbWVzc2FnZSBzYXlpbmcgdGhhdCB0aGUgbWFrZWZpbGVzIGFyZSBiZWluZyB1cGRhdGVkLikKLTMuIEJ1aWxkIHRoZSBsaWJyYXJ5IHByb2plY3QsIHRoZW4gdGhlIGFwcGxpY2F0aW9ucyBwcm9qZWN0LgotNC4gTW92ZSB0aGUgYXBwbGljYXRpb24gLmV4ZSBmaWxlcyBmcm9tIGBhcHBgXFJlbGVhc2UgdG8gYW4KLSAgIGFwcHJvcHJpYXRlIGxvY2F0aW9uIG9uIHlvdXIgcGF0aC4KLTUuIFRvIHBlcmZvcm0gdGhlIHNlbGYtdGVzdCwgZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lCi0JTk1BS0UgL2YgbWFrZWZpbGUudmMgIHRlc3QKLQotCi1PUy8yLCBCb3JsYW5kIEMrKzoKLQotV2F0Y2ggb3V0IGZvciBvcHRpbWl6YXRpb24gYnVncyBpbiBvbGRlciBCb3JsYW5kIGNvbXBpbGVyczsgeW91IG1heSBuZWVkCi10byBiYWNrIG9mZiB0aGUgb3B0aW1pemF0aW9uIHN3aXRjaCBzZXR0aW5ncy4gIFNlZSB0aGUgY29tbWVudHMgaW4KLW1ha2VmaWxlLmJjYy4KLQotCi1TR0k6Ci0KLU9uIHNvbWUgU0dJIHN5c3RlbXMsIHlvdSBtYXkgbmVlZCB0byBzZXQgIkFSMj0gYXIgLXRzIiBpbiB0aGUgTWFrZWZpbGUuCi1JZiB5b3UgYXJlIHVzaW5nIGNvbmZpZ3VyZSwgeW91IGNhbiBkbyB0aGlzIGJ5IHNheWluZwotCS4vY29uZmlndXJlIFJBTkxJQj0nYXIgLXRzJwotVGhpcyBjaGFuZ2UgaXMgbm90IG5lZWRlZCBvbiBhbGwgU0dJcy4gIFVzZSBpdCBvbmx5IGlmIHRoZSBtYWtlIGZhaWxzIGF0IHRoZQotc3RhZ2Ugb2YgbGlua2luZyB0aGUgY29tcGxldGVkIHByb2dyYW1zLgotCi1PbiB0aGUgTUlQUyBSNDAwMCBhcmNoaXRlY3R1cmUgKEluZHksIGV0Yy4pLCB0aGUgY29tcGlsZXIgb3B0aW9uICItbWlwczIiCi1yZXBvcnRlZGx5IHNwZWVkcyB1cCB0aGUgZmxvYXQgRENUIG1ldGhvZCBzdWJzdGFudGlhbGx5LCBlbm91Z2ggdG8gbWFrZSBpdAotZmFzdGVyIHRoYW4gdGhlIGRlZmF1bHQgaW50IG1ldGhvZCAoYnV0IHN0aWxsIHNsb3dlciB0aGFuIHRoZSBmYXN0IGludAotbWV0aG9kKS4gIElmIHlvdSB1c2UgLW1pcHMyLCB5b3UgbWF5IHdhbnQgdG8gYWx0ZXIgdGhlIGRlZmF1bHQgRENUIG1ldGhvZCB0bwotYmUgZmxvYXQuICBUbyBkbyB0aGlzLCBwdXQgIiNkZWZpbmUgSkRDVF9ERUZBVUxUIEpEQ1RfRkxPQVQiIGluIGpjb25maWcuaC4KLQotCi1WTVM6Ci0KLU9uIGFuIEFscGhhL1ZNUyBzeXN0ZW0gd2l0aCBNTVMsIGJlIHN1cmUgdG8gdXNlIHRoZSAiL01hcmNvPUFscGhhPTEiCi1xdWFsaWZpZXIgd2l0aCBNTVMgd2hlbiBidWlsZGluZyB0aGUgSlBFRyBwYWNrYWdlLgotCi1WQVgvVk1TIHY1LjUtMSBtYXkgaGF2ZSBwcm9ibGVtcyB3aXRoIHRoZSB0ZXN0IHN0ZXAgb2YgdGhlIGJ1aWxkIHByb2NlZHVyZQotcmVwb3J0aW5nIGRpZmZlcmVuY2VzIHdoZW4gaXQgY29tcGFyZXMgdGhlIG9yaWdpbmFsIGFuZCB0ZXN0IGltYWdlcy4gIElmIHRoZQotZXJyb3IgcG9pbnRzIHRvIHRoZSBsYXN0IGJsb2NrIG9mIHRoZSBmaWxlcywgaXQgaXMgbW9zdCBsaWtlbHkgYm9ndXMgYW5kIG1heQotYmUgc2FmZWx5IGlnbm9yZWQuICBJdCBzZWVtcyB0byBiZSBiZWNhdXNlIHRoZSBmaWxlcyBhcmUgU3RyZWFtX0xGIGFuZAotQmFja3VwL0NvbXBhcmUgaGFzIGRpZmZpY3VsdHkgd2l0aCB0aGUgKHByZXN1bWFibHkpIG51bGwgcGFkZGVkIGZpbGVzLgotVGhpcyBwcm9ibGVtIHdhcyBub3Qgb2JzZXJ2ZWQgb24gVkFYL1ZNUyB2Ni4xIG9yIEFYUC9WTVMgdjYuMS4KZGlmZiAtLWdpdCBhL2pjY29sb3IuYyBiL2pjY29sb3IuYwppbmRleCA4NWYzMDgzLi4yNDA3NDU2IDEwMDY0NAotLS0gYS9qY2NvbG9yLmMKKysrIGIvamNjb2xvci5jCkBAIC0yLDIzICsyLDE3IEBACiAgKiBqY2NvbG9yLmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBDb3B5cmlnaHQgMjAwOSBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgogICoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgotICogVGhpcyBmaWxlIGhhcyBiZWVuIG1vZGlmaWVkIGZvciBTSU1EIGV4dGVuc2lvbi4KLSAqIExhc3QgTW9kaWZpZWQgOiBKYW51YXJ5IDUsIDIwMDYKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKICAqIFRoaXMgZmlsZSBjb250YWlucyBpbnB1dCBjb2xvcnNwYWNlIGNvbnZlcnNpb24gcm91dGluZXMuCiAgKi8KIAogI2RlZmluZSBKUEVHX0lOVEVSTkFMUwogI2luY2x1ZGUgImppbmNsdWRlLmgiCiAjaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpjb2xzYW1wLmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyAqLworI2luY2x1ZGUgImpzaW1kLmgiCiAKIAogLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KQEAgLTM2MCw3ICszNTQsNiBAQAogamluaXRfY29sb3JfY29udmVydGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKIHsKICAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0OwotICB1bnNpZ25lZCBpbnQgc2ltZCA9IGpwZWdfc2ltZF9zdXBwb3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKIAogICBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpCiAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKQEAgLTQyOSwyMCArNDIyLDkgQEAKICAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDMpCiAgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOwogICAgIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgewotI2lmIFJHQl9QSVhFTFNJWkUgPT0gMyB8fCBSR0JfUElYRUxTSVpFID09IDQKLSNpZmRlZiBKQ0NPTE9SX1JHQllDQ19TU0UyX1NVUFBPUlRFRAotICAgICAgaWYgKHNpbWQgJiBKU0lNRF9TU0UyICYmCi0gICAgICAgICAgSVNfQ09OU1RfQUxJR05FRF8xNihqY29uc3RfcmdiX3ljY19jb252ZXJ0X3NzZTIpKSB7Ci0gICAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGpwZWdfcmdiX3ljY19jb252ZXJ0X3NzZTI7Ci0gICAgICB9IGVsc2UKLSNlbmRpZgotI2lmZGVmIEpDQ09MT1JfUkdCWUNDX01NWF9TVVBQT1JURUQKLSAgICAgIGlmIChzaW1kICYgSlNJTURfTU1YKSB7Ci0gICAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGpwZWdfcmdiX3ljY19jb252ZXJ0X21teDsKLSAgICAgIH0gZWxzZQotI2VuZGlmCi0jZW5kaWYgLyogUkdCX1BJWEVMU0laRSA9PSAzIHx8IFJHQl9QSVhFTFNJWkUgPT0gNCAqLwotICAgICAgeworICAgICAgaWYgKGpzaW1kX2Nhbl9yZ2JfeWNjKCkpCisgICAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGpzaW1kX3JnYl95Y2NfY29udmVydDsKKyAgICAgIGVsc2UgewogICAgICAgICBjY29udmVydC0+cHViLnN0YXJ0X3Bhc3MgPSByZ2JfeWNjX3N0YXJ0OwogICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSByZ2JfeWNjX2NvbnZlcnQ7CiAgICAgICB9CkBAIC00ODEsMjggKzQ2MywzIEBACiAgICAgYnJlYWs7CiAgIH0KIH0KLQotCi0jaWZuZGVmIEpTSU1EX01PREVJTkZPX05PVF9TVVBQT1JURUQKLQotR0xPQkFMKHVuc2lnbmVkIGludCkKLWpwZWdfc2ltZF9jb2xvcl9jb252ZXJ0ZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICB1bnNpZ25lZCBpbnQgc2ltZCA9IGpwZWdfc2ltZF9zdXBwb3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLQotI2lmIFJHQl9QSVhFTFNJWkUgPT0gMyB8fCBSR0JfUElYRUxTSVpFID09IDQKLSNpZmRlZiBKQ0NPTE9SX1JHQllDQ19TU0UyX1NVUFBPUlRFRAotICBpZiAoc2ltZCAmIEpTSU1EX1NTRTIgJiYKLSAgICAgIElTX0NPTlNUX0FMSUdORURfMTYoamNvbnN0X3JnYl95Y2NfY29udmVydF9zc2UyKSkKLSAgICByZXR1cm4gSlNJTURfU1NFMjsKLSNlbmRpZgotI2lmZGVmIEpDQ09MT1JfUkdCWUNDX01NWF9TVVBQT1JURUQKLSAgaWYgKHNpbWQgJiBKU0lNRF9NTVgpCi0gICAgcmV0dXJuIEpTSU1EX01NWDsKLSNlbmRpZgotI2VuZGlmIC8qIFJHQl9QSVhFTFNJWkUgPT0gMyB8fCBSR0JfUElYRUxTSVpFID09IDQgKi8KLQotICByZXR1cm4gSlNJTURfTk9ORTsKLX0KLQotI2VuZGlmIC8qICFKU0lNRF9NT0RFSU5GT19OT1RfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qY2NvbHNzMi5hc20gYi9qY2NvbHNzMi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYWJkODkuLjAwMDAwMDAKLS0tIGEvamNjb2xzczIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNTQxICswLDAgQEAKLTsKLTsgamNjb2xzczIuYXNtIC0gY29sb3JzcGFjZSBjb252ZXJzaW9uIChTU0UyKQotOwotOyB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLTsgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KLTsgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGpzaW1kZXh0LmluYwotOwotOyBUaGlzIGZpbGUgc2hvdWxkIGJlIGFzc2VtYmxlZCB3aXRoIE5BU00gKE5ldHdpZGUgQXNzZW1ibGVyKSwKLTsgY2FuICpub3QqIGJlIGFzc2VtYmxlZCB3aXRoIE1pY3Jvc29mdCdzIE1BU00gb3IgYW55IGNvbXBhdGlibGUKLTsgYXNzZW1ibGVyIChpbmNsdWRpbmcgQm9ybGFuZCdzIFR1cmJvIEFzc2VtYmxlcikuCi07IE5BU00gaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL25hc20uc291cmNlZm9yZ2UubmV0LyBvcgotOyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD02MjA4Ci07Ci07IExhc3QgTW9kaWZpZWQgOiBGZWJydWFyeSA0LCAyMDA2Ci07Ci07IFtUQUI4XQotCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotJWluY2x1ZGUgImpjb2xzYW1wLmluYyIKLQotJWlmIFJHQl9QSVhFTFNJWkUgPT0gMyB8fCBSR0JfUElYRUxTSVpFID09IDQKLSVpZmRlZiBKQ0NPTE9SX1JHQllDQ19TU0UyX1NVUFBPUlRFRAotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSVkZWZpbmUgU0NBTEVCSVRTCTE2Ci0KLUZfMF8wODEJZXF1CSA1MzI5CQkJOyBGSVgoMC4wODEzMSkKLUZfMF8xMTQJZXF1CSA3NDcxCQkJOyBGSVgoMC4xMTQwMCkKLUZfMF8xNjgJZXF1CTExMDU5CQkJOyBGSVgoMC4xNjg3NCkKLUZfMF8yNTAJZXF1CTE2Mzg0CQkJOyBGSVgoMC4yNTAwMCkKLUZfMF8yOTkJZXF1CTE5NTk1CQkJOyBGSVgoMC4yOTkwMCkKLUZfMF8zMzEJZXF1CTIxNzA5CQkJOyBGSVgoMC4zMzEyNikKLUZfMF80MTgJZXF1CTI3NDM5CQkJOyBGSVgoMC40MTg2OSkKLUZfMF81ODcJZXF1CTM4NDcwCQkJOyBGSVgoMC41ODcwMCkKLUZfMF8zMzcJZXF1CShGXzBfNTg3IC0gRl8wXzI1MCkJOyBGSVgoMC41ODcwMCkgLSBGSVgoMC4yNTAwMCkKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX0NPTlNUCi0KLQlhbGlnbnoJMTYKLQlnbG9iYWwJRVhUTihqY29uc3RfcmdiX3ljY19jb252ZXJ0X3NzZTIpCi0KLUVYVE4oamNvbnN0X3JnYl95Y2NfY29udmVydF9zc2UyKToKLQotUFdfRjAyOTlfRjAzMzcJdGltZXMgNCBkdyAgRl8wXzI5OSwgRl8wXzMzNwotUFdfRjAxMTRfRjAyNTAJdGltZXMgNCBkdyAgRl8wXzExNCwgRl8wXzI1MAotUFdfTUYwMTZfTUYwMzMJdGltZXMgNCBkdyAtRl8wXzE2OCwtRl8wXzMzMQotUFdfTUYwMDhfTUYwNDEJdGltZXMgNCBkdyAtRl8wXzA4MSwtRl8wXzQxOAotUERfT05FSEFMRk0xX0NKCXRpbWVzIDQgZGQgICgxIDw8IChTQ0FMRUJJVFMtMSkpIC0gMSArIChDRU5URVJKU0FNUExFIDw8IFNDQUxFQklUUykKLVBEX09ORUhBTEYJdGltZXMgNCBkZCAgKDEgPDwgKFNDQUxFQklUUy0xKSkKLQotCWFsaWduegkxNgotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JU0VDVElPTglTRUdfVEVYVAotCUJJVFMJMzIKLTsKLTsgQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgb3V0cHV0IGNvbG9yc3BhY2UuCi07Ci07IEdMT0JBTCh2b2lkKQotOyBqcGVnX3JnYl95Y2NfY29udmVydF9zc2UyIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpOwotOwotCi0lZGVmaW5lIGNpbmZvKGIpCShiKSs4CQk7IGpfY29tcHJlc3NfcHRyIGNpbmZvCi0lZGVmaW5lIGlucHV0X2J1ZihiKQkoYikrMTIJCTsgSlNBTVBBUlJBWSBpbnB1dF9idWYKLSVkZWZpbmUgb3V0cHV0X2J1ZihiKQkoYikrMTYJCTsgSlNBTVBJTUFHRSBvdXRwdXRfYnVmCi0lZGVmaW5lIG91dHB1dF9yb3coYikJKGIpKzIwCQk7IEpESU1FTlNJT04gb3V0cHV0X3JvdwotJWRlZmluZSBudW1fcm93cyhiKQkoYikrMjQJCTsgaW50IG51bV9yb3dzCi0KLSVkZWZpbmUgb3JpZ2luYWxfZWJwCWVicCswCi0lZGVmaW5lIHdrKGkpCQllYnAtKFdLX05VTS0oaSkpKlNJWkVPRl9YTU1XT1JECTsgeG1td29yZCB3a1tXS19OVU1dCi0lZGVmaW5lIFdLX05VTQkJOAotJWRlZmluZSBnb3RwdHIJCXdrKDApLVNJWkVPRl9QT0lOVEVSCTsgdm9pZCAqIGdvdHB0cgotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX3JnYl95Y2NfY29udmVydF9zc2UyKQotCi1FWFROKGpwZWdfcmdiX3ljY19jb252ZXJ0X3NzZTIpOgotCXB1c2gJZWJwCi0JbW92CWVheCxlc3AJCQkJOyBlYXggPSBvcmlnaW5hbCBlYnAKLQlzdWIJZXNwLCBieXRlIDQKLQlhbmQJZXNwLCBieXRlICgtU0laRU9GX1hNTVdPUkQpCTsgYWxpZ24gdG8gMTI4IGJpdHMKLQltb3YJW2VzcF0sZWF4Ci0JbW92CWVicCxlc3AJCQkJOyBlYnAgPSBhbGlnbmVkIGVicAotCWxlYQllc3AsIFt3aygwKV0KLQlwdXNocGljCWVheAkJOyBtYWtlIGEgcm9vbSBmb3IgR09UIGFkZHJlc3MKLQlwdXNoCWVieAotOwlwdXNoCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcHVzaAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcHVzaAllc2kKLQlwdXNoCWVkaQotCi0JZ2V0X0dPVAllYngJCQk7IGdldCBHT1QgYWRkcmVzcwotCW1vdnBpYwlQT0lOVEVSIFtnb3RwdHJdLCBlYngJOyBzYXZlIEdPVCBhZGRyZXNzCi0KLQltb3YJZWN4LCBQT0lOVEVSIFtjaW5mbyhlYXgpXQotCW1vdgllY3gsIEpESU1FTlNJT04gW2pjc3RydWN0X2ltYWdlX3dpZHRoKGVjeCldCTsgbnVtX2NvbHMKLQl0ZXN0CWVjeCxlY3gKLQlqegluZWFyIC5yZXR1cm4KLQotCXB1c2gJZWN4Ci0KLQltb3YJZXNpLCBKU0FNUElNQUdFIFtvdXRwdXRfYnVmKGVheCldCi0JbW92CWVjeCwgSkRJTUVOU0lPTiBbb3V0cHV0X3JvdyhlYXgpXQotCW1vdgllZGksIEpTQU1QQVJSQVkgW2VzaSswKlNJWkVPRl9KU0FNUEFSUkFZXQotCW1vdgllYngsIEpTQU1QQVJSQVkgW2VzaSsxKlNJWkVPRl9KU0FNUEFSUkFZXQotCW1vdgllZHgsIEpTQU1QQVJSQVkgW2VzaSsyKlNJWkVPRl9KU0FNUEFSUkFZXQotCWxlYQllZGksIFtlZGkrZWN4KlNJWkVPRl9KU0FNUFJPV10KLQlsZWEJZWJ4LCBbZWJ4K2VjeCpTSVpFT0ZfSlNBTVBST1ddCi0JbGVhCWVkeCwgW2VkeCtlY3gqU0laRU9GX0pTQU1QUk9XXQotCi0JcG9wCWVjeAotCi0JbW92CWVzaSwgSlNBTVBBUlJBWSBbaW5wdXRfYnVmKGVheCldCi0JbW92CWVheCwgSU5UIFtudW1fcm93cyhlYXgpXQotCXRlc3QJZWF4LGVheAotCWpsZQluZWFyIC5yZXR1cm4KLQlhbGlnbngJMTYsNwotLnJvd2xvb3A6Ci0JcHVzaHBpYwllYXgKLQlwdXNoCWVkeAotCXB1c2gJZWJ4Ci0JcHVzaAllZGkKLQlwdXNoCWVzaQotCXB1c2gJZWN4CQkJOyBjb2wKLQotCW1vdgllc2ksIEpTQU1QUk9XIFtlc2ldCTsgaW5wdHIKLQltb3YJZWRpLCBKU0FNUFJPVyBbZWRpXQk7IG91dHB0cjAKLQltb3YJZWJ4LCBKU0FNUFJPVyBbZWJ4XQk7IG91dHB0cjEKLQltb3YJZWR4LCBKU0FNUFJPVyBbZWR4XQk7IG91dHB0cjIKLQltb3ZwaWMJZWF4LCBQT0lOVEVSIFtnb3RwdHJdCTsgbG9hZCBHT1QgYWRkcmVzcyAoZWF4KQotCi0JY21wCWVjeCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAotCWphZQluZWFyIC5jb2x1bW5sb29wCi0JYWxpZ254CTE2LDcKLQotJWlmIFJHQl9QSVhFTFNJWkUgPT0gMyA7IC0tLS0tLS0tLS0tLS0tLQotCi0uY29sdW1uX2xkMToKLQlwdXNoCWVheAotCXB1c2gJZWR4Ci0JbGVhCWVjeCxbZWN4K2VjeCoyXQkJOyBpbXVsIGVjeCxSR0JfUElYRUxTSVpFCi0JdGVzdAljbCwgU0laRU9GX0JZVEUKLQlqeglzaG9ydCAuY29sdW1uX2xkMgotCXN1YgllY3gsIGJ5dGUgU0laRU9GX0JZVEUKLQltb3Z6eAllYXgsIEJZVEUgW2VzaStlY3hdCi0uY29sdW1uX2xkMjoKLQl0ZXN0CWNsLCBTSVpFT0ZfV09SRAotCWp6CXNob3J0IC5jb2x1bW5fbGQ0Ci0Jc3ViCWVjeCwgYnl0ZSBTSVpFT0ZfV09SRAotCW1vdnp4CWVkeCwgV09SRCBbZXNpK2VjeF0KLQlzaGwJZWF4LCBXT1JEX0JJVAotCW9yCWVheCxlZHgKLS5jb2x1bW5fbGQ0OgotCW1vdmQJeG1tQSxlYXgKLQlwb3AJZWR4Ci0JcG9wCWVheAotCXRlc3QJY2wsIFNJWkVPRl9EV09SRAotCWp6CXNob3J0IC5jb2x1bW5fbGQ4Ci0Jc3ViCWVjeCwgYnl0ZSBTSVpFT0ZfRFdPUkQKLQltb3ZkCXhtbUYsIF9EV09SRCBbZXNpK2VjeF0KLQlwc2xsZHEJeG1tQSwgU0laRU9GX0RXT1JECi0JcG9yCXhtbUEseG1tRgotLmNvbHVtbl9sZDg6Ci0JdGVzdAljbCwgU0laRU9GX01NV09SRAotCWp6CXNob3J0IC5jb2x1bW5fbGQxNgotCXN1YgllY3gsIGJ5dGUgU0laRU9GX01NV09SRAotCW1vdnEJeG1tQiwgX01NV09SRCBbZXNpK2VjeF0KLQlwc2xsZHEJeG1tQSwgU0laRU9GX01NV09SRAotCXBvcgl4bW1BLHhtbUIKLS5jb2x1bW5fbGQxNjoKLQl0ZXN0CWNsLCBTSVpFT0ZfWE1NV09SRAotCWp6CXNob3J0IC5jb2x1bW5fbGQzMgotCW1vdmRxYQl4bW1GLHhtbUEKLQltb3ZkcXUJeG1tQSwgWE1NV09SRCBbZXNpKzAqU0laRU9GX1hNTVdPUkRdCi0JbW92CWVjeCwgU0laRU9GX1hNTVdPUkQKLQlqbXAJc2hvcnQgLnJnYl95Y2NfY252Ci0uY29sdW1uX2xkMzI6Ci0JdGVzdAljbCwgMipTSVpFT0ZfWE1NV09SRAotCW1vdgllY3gsIFNJWkVPRl9YTU1XT1JECi0JanoJc2hvcnQgLnJnYl95Y2NfY252Ci0JbW92ZHFhCXhtbUIseG1tQQotCW1vdmRxdQl4bW1BLCBYTU1XT1JEIFtlc2krMCpTSVpFT0ZfWE1NV09SRF0KLQltb3ZkcXUJeG1tRiwgWE1NV09SRCBbZXNpKzEqU0laRU9GX1hNTVdPUkRdCi0Jam1wCXNob3J0IC5yZ2JfeWNjX2NudgotCWFsaWdueAkxNiw3Ci0KLS5jb2x1bW5sb29wOgotCW1vdmRxdQl4bW1BLCBYTU1XT1JEIFtlc2krMCpTSVpFT0ZfWE1NV09SRF0KLQltb3ZkcXUJeG1tRiwgWE1NV09SRCBbZXNpKzEqU0laRU9GX1hNTVdPUkRdCi0JbW92ZHF1CXhtbUIsIFhNTVdPUkQgW2VzaSsyKlNJWkVPRl9YTU1XT1JEXQotCi0ucmdiX3ljY19jbnY6Ci0JOyB4bW1BPSgwMCAxMCAyMCAwMSAxMSAyMSAwMiAxMiAyMiAwMyAxMyAyMyAwNCAxNCAyNCAwNSkKLQk7IHhtbUY9KDE1IDI1IDA2IDE2IDI2IDA3IDE3IDI3IDA4IDE4IDI4IDA5IDE5IDI5IDBBIDFBKQotCTsgeG1tQj0oMkEgMEIgMUIgMkIgMEMgMUMgMkMgMEQgMUQgMkQgMEUgMUUgMkUgMEYgMUYgMkYpCi0KLQltb3ZkcWEgICAgeG1tRyx4bW1BCi0JcHNsbGRxICAgIHhtbUEsOAk7IHhtbUE9KC0tIC0tIC0tIC0tIC0tIC0tIC0tIC0tIDAwIDEwIDIwIDAxIDExIDIxIDAyIDEyKQotCXBzcmxkcSAgICB4bW1HLDgJOyB4bW1HPSgyMiAwMyAxMyAyMyAwNCAxNCAyNCAwNSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSkKLQotCXB1bnBja2hidyB4bW1BLHhtbUYJOyB4bW1BPSgwMCAwOCAxMCAxOCAyMCAyOCAwMSAwOSAxMSAxOSAyMSAyOSAwMiAwQSAxMiAxQSkKLQlwc2xsZHEgICAgeG1tRiw4CTsgeG1tRj0oLS0gLS0gLS0gLS0gLS0gLS0gLS0gLS0gMTUgMjUgMDYgMTYgMjYgMDcgMTcgMjcpCi0KLQlwdW5wY2tsYncgeG1tRyx4bW1CCTsgeG1tRz0oMjIgMkEgMDMgMEIgMTMgMUIgMjMgMkIgMDQgMEMgMTQgMUMgMjQgMkMgMDUgMEQpCi0JcHVucGNraGJ3IHhtbUYseG1tQgk7IHhtbUY9KDE1IDFEIDI1IDJEIDA2IDBFIDE2IDFFIDI2IDJFIDA3IDBGIDE3IDFGIDI3IDJGKQotCi0JbW92ZHFhICAgIHhtbUQseG1tQQotCXBzbGxkcSAgICB4bW1BLDgJOyB4bW1BPSgtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAwMCAwOCAxMCAxOCAyMCAyOCAwMSAwOSkKLQlwc3JsZHEgICAgeG1tRCw4CTsgeG1tRD0oMTEgMTkgMjEgMjkgMDIgMEEgMTIgMUEgLS0gLS0gLS0gLS0gLS0gLS0gLS0gLS0pCi0KLQlwdW5wY2toYncgeG1tQSx4bW1HCTsgeG1tQT0oMDAgMDQgMDggMEMgMTAgMTQgMTggMUMgMjAgMjQgMjggMkMgMDEgMDUgMDkgMEQpCi0JcHNsbGRxICAgIHhtbUcsOAk7IHhtbUc9KC0tIC0tIC0tIC0tIC0tIC0tIC0tIC0tIDIyIDJBIDAzIDBCIDEzIDFCIDIzIDJCKQotCi0JcHVucGNrbGJ3IHhtbUQseG1tRgk7IHhtbUQ9KDExIDE1IDE5IDFEIDIxIDI1IDI5IDJEIDAyIDA2IDBBIDBFIDEyIDE2IDFBIDFFKQotCXB1bnBja2hidyB4bW1HLHhtbUYJOyB4bW1HPSgyMiAyNiAyQSAyRSAwMyAwNyAwQiAwRiAxMyAxNyAxQiAxRiAyMyAyNyAyQiAyRikKLQotCW1vdmRxYSAgICB4bW1FLHhtbUEKLQlwc2xsZHEgICAgeG1tQSw4CTsgeG1tQT0oLS0gLS0gLS0gLS0gLS0gLS0gLS0gLS0gMDAgMDQgMDggMEMgMTAgMTQgMTggMUMpCi0JcHNybGRxICAgIHhtbUUsOAk7IHhtbUU9KDIwIDI0IDI4IDJDIDAxIDA1IDA5IDBEIC0tIC0tIC0tIC0tIC0tIC0tIC0tIC0tKQotCi0JcHVucGNraGJ3IHhtbUEseG1tRAk7IHhtbUE9KDAwIDAyIDA0IDA2IDA4IDBBIDBDIDBFIDEwIDEyIDE0IDE2IDE4IDFBIDFDIDFFKQotCXBzbGxkcSAgICB4bW1ELDgJOyB4bW1EPSgtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAxMSAxNSAxOSAxRCAyMSAyNSAyOSAyRCkKLQotCXB1bnBja2xidyB4bW1FLHhtbUcJOyB4bW1FPSgyMCAyMiAyNCAyNiAyOCAyQSAyQyAyRSAwMSAwMyAwNSAwNyAwOSAwQiAwRCAwRikKLQlwdW5wY2toYncgeG1tRCx4bW1HCTsgeG1tRD0oMTEgMTMgMTUgMTcgMTkgMUIgMUQgMUYgMjEgMjMgMjUgMjcgMjkgMkIgMkQgMkYpCi0KLQlweG9yICAgICAgeG1tSCx4bW1ICi0KLQltb3ZkcWEgICAgeG1tQyx4bW1BCi0JcHVucGNrbGJ3IHhtbUEseG1tSAk7IHhtbUE9KDAwIDAyIDA0IDA2IDA4IDBBIDBDIDBFKQotCXB1bnBja2hidyB4bW1DLHhtbUgJOyB4bW1DPSgxMCAxMiAxNCAxNiAxOCAxQSAxQyAxRSkKLQotCW1vdmRxYSAgICB4bW1CLHhtbUUKLQlwdW5wY2tsYncgeG1tRSx4bW1ICTsgeG1tRT0oMjAgMjIgMjQgMjYgMjggMkEgMkMgMkUpCi0JcHVucGNraGJ3IHhtbUIseG1tSAk7IHhtbUI9KDAxIDAzIDA1IDA3IDA5IDBCIDBEIDBGKQotCi0JbW92ZHFhICAgIHhtbUYseG1tRAotCXB1bnBja2xidyB4bW1ELHhtbUgJOyB4bW1EPSgxMSAxMyAxNSAxNyAxOSAxQiAxRCAxRikKLQlwdW5wY2toYncgeG1tRix4bW1ICTsgeG1tRj0oMjEgMjMgMjUgMjcgMjkgMkIgMkQgMkYpCi0KLSVlbHNlIDsgUkdCX1BJWEVMU0laRSA9PSA0IDsgLS0tLS0tLS0tLS0KLQotLmNvbHVtbl9sZDE6Ci0JdGVzdAljbCwgU0laRU9GX1hNTVdPUkQvMTYKLQlqeglzaG9ydCAuY29sdW1uX2xkMgotCXN1YgllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQvMTYKLQltb3ZkCXhtbUEsIF9EV09SRCBbZXNpK2VjeCpSR0JfUElYRUxTSVpFXQotLmNvbHVtbl9sZDI6Ci0JdGVzdAljbCwgU0laRU9GX1hNTVdPUkQvOAotCWp6CXNob3J0IC5jb2x1bW5fbGQ0Ci0Jc3ViCWVjeCwgYnl0ZSBTSVpFT0ZfWE1NV09SRC84Ci0JbW92cQl4bW1FLCBfTU1XT1JEIFtlc2krZWN4KlJHQl9QSVhFTFNJWkVdCi0JcHNsbGRxCXhtbUEsIFNJWkVPRl9NTVdPUkQKLQlwb3IJeG1tQSx4bW1FCi0uY29sdW1uX2xkNDoKLQl0ZXN0CWNsLCBTSVpFT0ZfWE1NV09SRC80Ci0JanoJc2hvcnQgLmNvbHVtbl9sZDgKLQlzdWIJZWN4LCBieXRlIFNJWkVPRl9YTU1XT1JELzQKLQltb3ZkcWEJeG1tRSx4bW1BCi0JbW92ZHF1CXhtbUEsIFhNTVdPUkQgW2VzaStlY3gqUkdCX1BJWEVMU0laRV0KLS5jb2x1bW5fbGQ4OgotCXRlc3QJY2wsIFNJWkVPRl9YTU1XT1JELzIKLQltb3YJZWN4LCBTSVpFT0ZfWE1NV09SRAotCWp6CXNob3J0IC5yZ2JfeWNjX2NudgotCW1vdmRxYQl4bW1GLHhtbUEKLQltb3ZkcWEJeG1tSCx4bW1FCi0JbW92ZHF1CXhtbUEsIFhNTVdPUkQgW2VzaSswKlNJWkVPRl9YTU1XT1JEXQotCW1vdmRxdQl4bW1FLCBYTU1XT1JEIFtlc2krMSpTSVpFT0ZfWE1NV09SRF0KLQlqbXAJc2hvcnQgLnJnYl95Y2NfY252Ci0JYWxpZ254CTE2LDcKLQotLmNvbHVtbmxvb3A6Ci0JbW92ZHF1CXhtbUEsIFhNTVdPUkQgW2VzaSswKlNJWkVPRl9YTU1XT1JEXQotCW1vdmRxdQl4bW1FLCBYTU1XT1JEIFtlc2krMSpTSVpFT0ZfWE1NV09SRF0KLQltb3ZkcXUJeG1tRiwgWE1NV09SRCBbZXNpKzIqU0laRU9GX1hNTVdPUkRdCi0JbW92ZHF1CXhtbUgsIFhNTVdPUkQgW2VzaSszKlNJWkVPRl9YTU1XT1JEXQotCi0ucmdiX3ljY19jbnY6Ci0JOyB4bW1BPSgwMCAxMCAyMCAzMCAwMSAxMSAyMSAzMSAwMiAxMiAyMiAzMiAwMyAxMyAyMyAzMykKLQk7IHhtbUU9KDA0IDE0IDI0IDM0IDA1IDE1IDI1IDM1IDA2IDE2IDI2IDM2IDA3IDE3IDI3IDM3KQotCTsgeG1tRj0oMDggMTggMjggMzggMDkgMTkgMjkgMzkgMEEgMUEgMkEgM0EgMEIgMUIgMkIgM0IpCi0JOyB4bW1IPSgwQyAxQyAyQyAzQyAwRCAxRCAyRCAzRCAwRSAxRSAyRSAzRSAwRiAxRiAyRiAzRikKLQotCW1vdmRxYSAgICB4bW1ELHhtbUEKLQlwdW5wY2tsYncgeG1tQSx4bW1FCTsgeG1tQT0oMDAgMDQgMTAgMTQgMjAgMjQgMzAgMzQgMDEgMDUgMTEgMTUgMjEgMjUgMzEgMzUpCi0JcHVucGNraGJ3IHhtbUQseG1tRQk7IHhtbUQ9KDAyIDA2IDEyIDE2IDIyIDI2IDMyIDM2IDAzIDA3IDEzIDE3IDIzIDI3IDMzIDM3KQotCi0JbW92ZHFhICAgIHhtbUMseG1tRgotCXB1bnBja2xidyB4bW1GLHhtbUgJOyB4bW1GPSgwOCAwQyAxOCAxQyAyOCAyQyAzOCAzQyAwOSAwRCAxOSAxRCAyOSAyRCAzOSAzRCkKLQlwdW5wY2toYncgeG1tQyx4bW1ICTsgeG1tQz0oMEEgMEUgMUEgMUUgMkEgMkUgM0EgM0UgMEIgMEYgMUIgMUYgMkIgMkYgM0IgM0YpCi0KLQltb3ZkcWEgICAgeG1tQix4bW1BCi0JcHVucGNrbHdkIHhtbUEseG1tRgk7IHhtbUE9KDAwIDA0IDA4IDBDIDEwIDE0IDE4IDFDIDIwIDI0IDI4IDJDIDMwIDM0IDM4IDNDKQotCXB1bnBja2h3ZCB4bW1CLHhtbUYJOyB4bW1CPSgwMSAwNSAwOSAwRCAxMSAxNSAxOSAxRCAyMSAyNSAyOSAyRCAzMSAzNSAzOSAzRCkKLQotCW1vdmRxYSAgICB4bW1HLHhtbUQKLQlwdW5wY2tsd2QgeG1tRCx4bW1DCTsgeG1tRD0oMDIgMDYgMEEgMEUgMTIgMTYgMUEgMUUgMjIgMjYgMkEgMkUgMzIgMzYgM0EgM0UpCi0JcHVucGNraHdkIHhtbUcseG1tQwk7IHhtbUc9KDAzIDA3IDBCIDBGIDEzIDE3IDFCIDFGIDIzIDI3IDJCIDJGIDMzIDM3IDNCIDNGKQotCi0JbW92ZHFhICAgIHhtbUUseG1tQQotCXB1bnBja2xidyB4bW1BLHhtbUQJOyB4bW1BPSgwMCAwMiAwNCAwNiAwOCAwQSAwQyAwRSAxMCAxMiAxNCAxNiAxOCAxQSAxQyAxRSkKLQlwdW5wY2toYncgeG1tRSx4bW1ECTsgeG1tRT0oMjAgMjIgMjQgMjYgMjggMkEgMkMgMkUgMzAgMzIgMzQgMzYgMzggM0EgM0MgM0UpCi0KLQltb3ZkcWEgICAgeG1tSCx4bW1CCi0JcHVucGNrbGJ3IHhtbUIseG1tRwk7IHhtbUI9KDAxIDAzIDA1IDA3IDA5IDBCIDBEIDBGIDExIDEzIDE1IDE3IDE5IDFCIDFEIDFGKQotCXB1bnBja2hidyB4bW1ILHhtbUcJOyB4bW1IPSgyMSAyMyAyNSAyNyAyOSAyQiAyRCAyRiAzMSAzMyAzNSAzNyAzOSAzQiAzRCAzRikKLQotCXB4b3IgICAgICB4bW1GLHhtbUYKLQotCW1vdmRxYSAgICB4bW1DLHhtbUEKLQlwdW5wY2tsYncgeG1tQSx4bW1GCTsgeG1tQT0oMDAgMDIgMDQgMDYgMDggMEEgMEMgMEUpCi0JcHVucGNraGJ3IHhtbUMseG1tRgk7IHhtbUM9KDEwIDEyIDE0IDE2IDE4IDFBIDFDIDFFKQotCi0JbW92ZHFhICAgIHhtbUQseG1tQgotCXB1bnBja2xidyB4bW1CLHhtbUYJOyB4bW1CPSgwMSAwMyAwNSAwNyAwOSAwQiAwRCAwRikKLQlwdW5wY2toYncgeG1tRCx4bW1GCTsgeG1tRD0oMTEgMTMgMTUgMTcgMTkgMUIgMUQgMUYpCi0KLQltb3ZkcWEgICAgeG1tRyx4bW1FCi0JcHVucGNrbGJ3IHhtbUUseG1tRgk7IHhtbUU9KDIwIDIyIDI0IDI2IDI4IDJBIDJDIDJFKQotCXB1bnBja2hidyB4bW1HLHhtbUYJOyB4bW1HPSgzMCAzMiAzNCAzNiAzOCAzQSAzQyAzRSkKLQotCXB1bnBja2xidyB4bW1GLHhtbUgKLQlwdW5wY2toYncgeG1tSCx4bW1ICi0JcHNybHcgICAgIHhtbUYsQllURV9CSVQJOyB4bW1GPSgyMSAyMyAyNSAyNyAyOSAyQiAyRCAyRikKLQlwc3JsdyAgICAgeG1tSCxCWVRFX0JJVAk7IHhtbUg9KDMxIDMzIDM1IDM3IDM5IDNCIDNEIDNGKQotCi0lZW5kaWYgOyBSR0JfUElYRUxTSVpFIDsgLS0tLS0tLS0tLS0tLS0tCi0KLQk7IHhtbTA9UigwMjQ2OEFDRSk9UkUsIHhtbTI9RygwMjQ2OEFDRSk9R0UsIHhtbTQ9QigwMjQ2OEFDRSk9QkUKLQk7IHhtbTE9UigxMzU3OUJERik9Uk8sIHhtbTM9RygxMzU3OUJERik9R08sIHhtbTU9QigxMzU3OUJERik9Qk8KLQotCTsgKE9yaWdpbmFsKQotCTsgWSAgPSAgMC4yOTkwMCAqIFIgKyAwLjU4NzAwICogRyArIDAuMTE0MDAgKiBCCi0JOyBDYiA9IC0wLjE2ODc0ICogUiAtIDAuMzMxMjYgKiBHICsgMC41MDAwMCAqIEIgKyBDRU5URVJKU0FNUExFCi0JOyBDciA9ICAwLjUwMDAwICogUiAtIDAuNDE4NjkgKiBHIC0gMC4wODEzMSAqIEIgKyBDRU5URVJKU0FNUExFCi0JOwotCTsgKFRoaXMgaW1wbGVtZW50YXRpb24pCi0JOyBZICA9ICAwLjI5OTAwICogUiArIDAuMzM3MDAgKiBHICsgMC4xMTQwMCAqIEIgKyAwLjI1MDAwICogRwotCTsgQ2IgPSAtMC4xNjg3NCAqIFIgLSAwLjMzMTI2ICogRyArIDAuNTAwMDAgKiBCICsgQ0VOVEVSSlNBTVBMRQotCTsgQ3IgPSAgMC41MDAwMCAqIFIgLSAwLjQxODY5ICogRyAtIDAuMDgxMzEgKiBCICsgQ0VOVEVSSlNBTVBMRQotCi0JbW92ZHFhICAgIFhNTVdPUkQgW3drKDApXSwgeG1tMAk7IHdrKDApPVJFCi0JbW92ZHFhICAgIFhNTVdPUkQgW3drKDEpXSwgeG1tMQk7IHdrKDEpPVJPCi0JbW92ZHFhICAgIFhNTVdPUkQgW3drKDIpXSwgeG1tNAk7IHdrKDIpPUJFCi0JbW92ZHFhICAgIFhNTVdPUkQgW3drKDMpXSwgeG1tNQk7IHdrKDMpPUJPCi0KLQltb3ZkcWEgICAgeG1tNix4bW0xCi0JcHVucGNrbHdkIHhtbTEseG1tMwotCXB1bnBja2h3ZCB4bW02LHhtbTMKLQltb3ZkcWEgICAgeG1tNyx4bW0xCi0JbW92ZHFhICAgIHhtbTQseG1tNgotCXBtYWRkd2QgICB4bW0xLFtHT1RPRkYoZWF4LFBXX0YwMjk5X0YwMzM3KV0gOyB4bW0xPVJPTCpGSVgoMC4yOTkpK0dPTCpGSVgoMC4zMzcpCi0JcG1hZGR3ZCAgIHhtbTYsW0dPVE9GRihlYXgsUFdfRjAyOTlfRjAzMzcpXSA7IHhtbTY9Uk9IKkZJWCgwLjI5OSkrR09IKkZJWCgwLjMzNykKLQlwbWFkZHdkICAgeG1tNyxbR09UT0ZGKGVheCxQV19NRjAxNl9NRjAzMyldIDsgeG1tNz1ST0wqLUZJWCgwLjE2OCkrR09MKi1GSVgoMC4zMzEpCi0JcG1hZGR3ZCAgIHhtbTQsW0dPVE9GRihlYXgsUFdfTUYwMTZfTUYwMzMpXSA7IHhtbTQ9Uk9IKi1GSVgoMC4xNjgpK0dPSCotRklYKDAuMzMxKQotCi0JbW92ZHFhICAgIFhNTVdPUkQgW3drKDQpXSwgeG1tMQk7IHdrKDQpPVJPTCpGSVgoMC4yOTkpK0dPTCpGSVgoMC4zMzcpCi0JbW92ZHFhICAgIFhNTVdPUkQgW3drKDUpXSwgeG1tNgk7IHdrKDUpPVJPSCpGSVgoMC4yOTkpK0dPSCpGSVgoMC4zMzcpCi0KLQlweG9yICAgICAgeG1tMSx4bW0xCi0JcHhvciAgICAgIHhtbTYseG1tNgotCXB1bnBja2x3ZCB4bW0xLHhtbTUJCTsgeG1tMT1CT0wKLQlwdW5wY2tod2QgeG1tNix4bW01CQk7IHhtbTY9Qk9ICi0JcHNybGQgICAgIHhtbTEsMQkJOyB4bW0xPUJPTCpGSVgoMC41MDApCi0JcHNybGQgICAgIHhtbTYsMQkJOyB4bW02PUJPSCpGSVgoMC41MDApCi0KLQltb3ZkcWEgICAgeG1tNSxbR09UT0ZGKGVheCxQRF9PTkVIQUxGTTFfQ0opXSA7IHhtbTU9W1BEX09ORUhBTEZNMV9DSl0KLQotCXBhZGRkICAgICB4bW03LHhtbTEKLQlwYWRkZCAgICAgeG1tNCx4bW02Ci0JcGFkZGQgICAgIHhtbTcseG1tNQotCXBhZGRkICAgICB4bW00LHhtbTUKLQlwc3JsZCAgICAgeG1tNyxTQ0FMRUJJVFMJOyB4bW03PUNiT0wKLQlwc3JsZCAgICAgeG1tNCxTQ0FMRUJJVFMJOyB4bW00PUNiT0gKLQlwYWNrc3NkdyAgeG1tNyx4bW00CQk7IHhtbTc9Q2JPCi0KLQltb3ZkcWEgICAgeG1tMSwgWE1NV09SRCBbd2soMildCTsgeG1tMT1CRQotCi0JbW92ZHFhICAgIHhtbTYseG1tMAotCXB1bnBja2x3ZCB4bW0wLHhtbTIKLQlwdW5wY2tod2QgeG1tNix4bW0yCi0JbW92ZHFhICAgIHhtbTUseG1tMAotCW1vdmRxYSAgICB4bW00LHhtbTYKLQlwbWFkZHdkICAgeG1tMCxbR09UT0ZGKGVheCxQV19GMDI5OV9GMDMzNyldIDsgeG1tMD1SRUwqRklYKDAuMjk5KStHRUwqRklYKDAuMzM3KQotCXBtYWRkd2QgICB4bW02LFtHT1RPRkYoZWF4LFBXX0YwMjk5X0YwMzM3KV0gOyB4bW02PVJFSCpGSVgoMC4yOTkpK0dFSCpGSVgoMC4zMzcpCi0JcG1hZGR3ZCAgIHhtbTUsW0dPVE9GRihlYXgsUFdfTUYwMTZfTUYwMzMpXSA7IHhtbTU9UkVMKi1GSVgoMC4xNjgpK0dFTCotRklYKDAuMzMxKQotCXBtYWRkd2QgICB4bW00LFtHT1RPRkYoZWF4LFBXX01GMDE2X01GMDMzKV0gOyB4bW00PVJFSCotRklYKDAuMTY4KStHRUgqLUZJWCgwLjMzMSkKLQotCW1vdmRxYSAgICBYTU1XT1JEIFt3ayg2KV0sIHhtbTAJOyB3ayg2KT1SRUwqRklYKDAuMjk5KStHRUwqRklYKDAuMzM3KQotCW1vdmRxYSAgICBYTU1XT1JEIFt3ayg3KV0sIHhtbTYJOyB3ayg3KT1SRUgqRklYKDAuMjk5KStHRUgqRklYKDAuMzM3KQotCi0JcHhvciAgICAgIHhtbTAseG1tMAotCXB4b3IgICAgICB4bW02LHhtbTYKLQlwdW5wY2tsd2QgeG1tMCx4bW0xCQk7IHhtbTA9QkVMCi0JcHVucGNraHdkIHhtbTYseG1tMQkJOyB4bW02PUJFSAotCXBzcmxkICAgICB4bW0wLDEJCTsgeG1tMD1CRUwqRklYKDAuNTAwKQotCXBzcmxkICAgICB4bW02LDEJCTsgeG1tNj1CRUgqRklYKDAuNTAwKQotCi0JbW92ZHFhICAgIHhtbTEsW0dPVE9GRihlYXgsUERfT05FSEFMRk0xX0NKKV0gOyB4bW0xPVtQRF9PTkVIQUxGTTFfQ0pdCi0KLQlwYWRkZCAgICAgeG1tNSx4bW0wCi0JcGFkZGQgICAgIHhtbTQseG1tNgotCXBhZGRkICAgICB4bW01LHhtbTEKLQlwYWRkZCAgICAgeG1tNCx4bW0xCi0JcHNybGQgICAgIHhtbTUsU0NBTEVCSVRTCTsgeG1tNT1DYkVMCi0JcHNybGQgICAgIHhtbTQsU0NBTEVCSVRTCTsgeG1tND1DYkVICi0JcGFja3NzZHcgIHhtbTUseG1tNAkJOyB4bW01PUNiRQotCi0JcHNsbHcgICAgIHhtbTcsQllURV9CSVQKLQlwb3IgICAgICAgeG1tNSx4bW03CQk7IHhtbTU9Q2IKLQltb3ZkcWEgICAgWE1NV09SRCBbZWJ4XSwgeG1tNQk7IFNhdmUgQ2IKLQotCW1vdmRxYSAgICB4bW0wLCBYTU1XT1JEIFt3aygzKV0JOyB4bW0wPUJPCi0JbW92ZHFhICAgIHhtbTYsIFhNTVdPUkQgW3drKDIpXQk7IHhtbTY9QkUKLQltb3ZkcWEgICAgeG1tMSwgWE1NV09SRCBbd2soMSldCTsgeG1tMT1STwotCi0JbW92ZHFhICAgIHhtbTQseG1tMAotCXB1bnBja2x3ZCB4bW0wLHhtbTMKLQlwdW5wY2tod2QgeG1tNCx4bW0zCi0JbW92ZHFhICAgIHhtbTcseG1tMAotCW1vdmRxYSAgICB4bW01LHhtbTQKLQlwbWFkZHdkICAgeG1tMCxbR09UT0ZGKGVheCxQV19GMDExNF9GMDI1MCldIDsgeG1tMD1CT0wqRklYKDAuMTE0KStHT0wqRklYKDAuMjUwKQotCXBtYWRkd2QgICB4bW00LFtHT1RPRkYoZWF4LFBXX0YwMTE0X0YwMjUwKV0gOyB4bW00PUJPSCpGSVgoMC4xMTQpK0dPSCpGSVgoMC4yNTApCi0JcG1hZGR3ZCAgIHhtbTcsW0dPVE9GRihlYXgsUFdfTUYwMDhfTUYwNDEpXSA7IHhtbTc9Qk9MKi1GSVgoMC4wODEpK0dPTCotRklYKDAuNDE4KQotCXBtYWRkd2QgICB4bW01LFtHT1RPRkYoZWF4LFBXX01GMDA4X01GMDQxKV0gOyB4bW01PUJPSCotRklYKDAuMDgxKStHT0gqLUZJWCgwLjQxOCkKLQotCW1vdmRxYSAgICB4bW0zLFtHT1RPRkYoZWF4LFBEX09ORUhBTEYpXQk7IHhtbTM9W1BEX09ORUhBTEZdCi0KLQlwYWRkZCAgICAgeG1tMCwgWE1NV09SRCBbd2soNCldCi0JcGFkZGQgICAgIHhtbTQsIFhNTVdPUkQgW3drKDUpXQotCXBhZGRkICAgICB4bW0wLHhtbTMKLQlwYWRkZCAgICAgeG1tNCx4bW0zCi0JcHNybGQgICAgIHhtbTAsU0NBTEVCSVRTCTsgeG1tMD1ZT0wKLQlwc3JsZCAgICAgeG1tNCxTQ0FMRUJJVFMJOyB4bW00PVlPSAotCXBhY2tzc2R3ICB4bW0wLHhtbTQJCTsgeG1tMD1ZTwotCi0JcHhvciAgICAgIHhtbTMseG1tMwotCXB4b3IgICAgICB4bW00LHhtbTQKLQlwdW5wY2tsd2QgeG1tMyx4bW0xCQk7IHhtbTM9Uk9MCi0JcHVucGNraHdkIHhtbTQseG1tMQkJOyB4bW00PVJPSAotCXBzcmxkICAgICB4bW0zLDEJCTsgeG1tMz1ST0wqRklYKDAuNTAwKQotCXBzcmxkICAgICB4bW00LDEJCTsgeG1tND1ST0gqRklYKDAuNTAwKQotCi0JbW92ZHFhICAgIHhtbTEsW0dPVE9GRihlYXgsUERfT05FSEFMRk0xX0NKKV0gOyB4bW0xPVtQRF9PTkVIQUxGTTFfQ0pdCi0KLQlwYWRkZCAgICAgeG1tNyx4bW0zCi0JcGFkZGQgICAgIHhtbTUseG1tNAotCXBhZGRkICAgICB4bW03LHhtbTEKLQlwYWRkZCAgICAgeG1tNSx4bW0xCi0JcHNybGQgICAgIHhtbTcsU0NBTEVCSVRTCTsgeG1tNz1Dck9MCi0JcHNybGQgICAgIHhtbTUsU0NBTEVCSVRTCTsgeG1tNT1Dck9ICi0JcGFja3NzZHcgIHhtbTcseG1tNQkJOyB4bW03PUNyTwotCi0JbW92ZHFhICAgIHhtbTMsIFhNTVdPUkQgW3drKDApXQk7IHhtbTM9UkUKLQotCW1vdmRxYSAgICB4bW00LHhtbTYKLQlwdW5wY2tsd2QgeG1tNix4bW0yCi0JcHVucGNraHdkIHhtbTQseG1tMgotCW1vdmRxYSAgICB4bW0xLHhtbTYKLQltb3ZkcWEgICAgeG1tNSx4bW00Ci0JcG1hZGR3ZCAgIHhtbTYsW0dPVE9GRihlYXgsUFdfRjAxMTRfRjAyNTApXSA7IHhtbTY9QkVMKkZJWCgwLjExNCkrR0VMKkZJWCgwLjI1MCkKLQlwbWFkZHdkICAgeG1tNCxbR09UT0ZGKGVheCxQV19GMDExNF9GMDI1MCldIDsgeG1tND1CRUgqRklYKDAuMTE0KStHRUgqRklYKDAuMjUwKQotCXBtYWRkd2QgICB4bW0xLFtHT1RPRkYoZWF4LFBXX01GMDA4X01GMDQxKV0gOyB4bW0xPUJFTCotRklYKDAuMDgxKStHRUwqLUZJWCgwLjQxOCkKLQlwbWFkZHdkICAgeG1tNSxbR09UT0ZGKGVheCxQV19NRjAwOF9NRjA0MSldIDsgeG1tNT1CRUgqLUZJWCgwLjA4MSkrR0VIKi1GSVgoMC40MTgpCi0KLQltb3ZkcWEgICAgeG1tMixbR09UT0ZGKGVheCxQRF9PTkVIQUxGKV0JOyB4bW0yPVtQRF9PTkVIQUxGXQotCi0JcGFkZGQgICAgIHhtbTYsIFhNTVdPUkQgW3drKDYpXQotCXBhZGRkICAgICB4bW00LCBYTU1XT1JEIFt3ayg3KV0KLQlwYWRkZCAgICAgeG1tNix4bW0yCi0JcGFkZGQgICAgIHhtbTQseG1tMgotCXBzcmxkICAgICB4bW02LFNDQUxFQklUUwk7IHhtbTY9WUVMCi0JcHNybGQgICAgIHhtbTQsU0NBTEVCSVRTCTsgeG1tND1ZRUgKLQlwYWNrc3NkdyAgeG1tNix4bW00CQk7IHhtbTY9WUUKLQotCXBzbGx3ICAgICB4bW0wLEJZVEVfQklUCi0JcG9yICAgICAgIHhtbTYseG1tMAkJOyB4bW02PVkKLQltb3ZkcWEgICAgWE1NV09SRCBbZWRpXSwgeG1tNgk7IFNhdmUgWQotCi0JcHhvciAgICAgIHhtbTIseG1tMgotCXB4b3IgICAgICB4bW00LHhtbTQKLQlwdW5wY2tsd2QgeG1tMix4bW0zCQk7IHhtbTI9UkVMCi0JcHVucGNraHdkIHhtbTQseG1tMwkJOyB4bW00PVJFSAotCXBzcmxkICAgICB4bW0yLDEJCTsgeG1tMj1SRUwqRklYKDAuNTAwKQotCXBzcmxkICAgICB4bW00LDEJCTsgeG1tND1SRUgqRklYKDAuNTAwKQotCi0JbW92ZHFhICAgIHhtbTAsW0dPVE9GRihlYXgsUERfT05FSEFMRk0xX0NKKV0gOyB4bW0wPVtQRF9PTkVIQUxGTTFfQ0pdCi0KLQlwYWRkZCAgICAgeG1tMSx4bW0yCi0JcGFkZGQgICAgIHhtbTUseG1tNAotCXBhZGRkICAgICB4bW0xLHhtbTAKLQlwYWRkZCAgICAgeG1tNSx4bW0wCi0JcHNybGQgICAgIHhtbTEsU0NBTEVCSVRTCTsgeG1tMT1DckVMCi0JcHNybGQgICAgIHhtbTUsU0NBTEVCSVRTCTsgeG1tNT1DckVICi0JcGFja3NzZHcgIHhtbTEseG1tNQkJOyB4bW0xPUNyRQotCi0JcHNsbHcgICAgIHhtbTcsQllURV9CSVQKLQlwb3IgICAgICAgeG1tMSx4bW03CQk7IHhtbTE9Q3IKLQltb3ZkcWEgICAgWE1NV09SRCBbZWR4XSwgeG1tMQk7IFNhdmUgQ3IKLQotCXN1YgllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQKLQlhZGQJZXNpLCBieXRlIFJHQl9QSVhFTFNJWkUqU0laRU9GX1hNTVdPUkQJOyBpbnB0cgotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJCTsgb3V0cHRyMAotCWFkZAllYngsIGJ5dGUgU0laRU9GX1hNTVdPUkQJCTsgb3V0cHRyMQotCWFkZAllZHgsIGJ5dGUgU0laRU9GX1hNTVdPUkQJCTsgb3V0cHRyMgotCWNtcAllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQKLQlqYWUJbmVhciAuY29sdW1ubG9vcAotCXRlc3QJZWN4LGVjeAotCWpuegluZWFyIC5jb2x1bW5fbGQxCi0KLQlwb3AJZWN4CQkJOyBjb2wKLQlwb3AJZXNpCi0JcG9wCWVkaQotCXBvcAllYngKLQlwb3AJZWR4Ci0JcG9wcGljCWVheAotCi0JYWRkCWVzaSwgYnl0ZSBTSVpFT0ZfSlNBTVBST1cJOyBpbnB1dF9idWYKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9KU0FNUFJPVwotCWFkZAllYngsIGJ5dGUgU0laRU9GX0pTQU1QUk9XCi0JYWRkCWVkeCwgYnl0ZSBTSVpFT0ZfSlNBTVBST1cKLQlkZWMJZWF4CQkJCTsgbnVtX3Jvd3MKLQlqZwluZWFyIC5yb3dsb29wCi0KLS5yZXR1cm46Ci0JcG9wCWVkaQotCXBvcAllc2kKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwb3AJZWJ4Ci0JbW92CWVzcCxlYnAJCTsgZXNwIDwtIGFsaWduZWQgZWJwCi0JcG9wCWVzcAkJOyBlc3AgPC0gb3JpZ2luYWwgZWJwCi0JcG9wCWVicAotCXJldAotCi0lZW5kaWYgOyBKQ0NPTE9SX1JHQllDQ19TU0UyX1NVUFBPUlRFRAotJWVuZGlmIDsgUkdCX1BJWEVMU0laRSA9PSAzIHx8IFJHQl9QSVhFTFNJWkUgPT0gNApkaWZmIC0tZ2l0IGEvamNkY3RtZ3IuYyBiL2pjZGN0bWdyLmMKaW5kZXggM2E4OWViNC4uNTM5Y2NjNCAxMDA2NDQKLS0tIGEvamNkY3RtZ3IuYworKysgYi9qY2RjdG1nci5jCkBAIC0yLDE2ICsyLDExIEBACiAgKiBqY2RjdG1nci5jCiAgKgogICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KKyAqIENvcHlyaWdodCAyMDA5IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi0gKiBUaGlzIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgZm9yIFNJTUQgZXh0ZW5zaW9uLgotICogTGFzdCBNb2RpZmllZCA6IERlY2VtYmVyIDI0LCAyMDA1Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCiAgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGZvcndhcmQtRENUIG1hbmFnZW1lbnQgbG9naWMuCiAgKiBUaGlzIGNvZGUgc2VsZWN0cyBhIHBhcnRpY3VsYXIgRENUIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQsCiAgKiBhbmQgaXQgcGVyZm9ybXMgcmVsYXRlZCBob3VzZWtlZXBpbmcgY2hvcmVzIGluY2x1ZGluZyBjb2VmZmljaWVudApAQCAtMjIsMTcgKzE3LDM1IEBACiAjaW5jbHVkZSAiamluY2x1ZGUuaCIKICNpbmNsdWRlICJqcGVnbGliLmgiCiAjaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KKyNpbmNsdWRlICJqc2ltZGRjdC5oIgogCiAKIC8qIFByaXZhdGUgc3Vib2JqZWN0IGZvciB0aGlzIG1vZHVsZSAqLwogCit0eXBlZGVmIEpNRVRIT0Qodm9pZCwgZm9yd2FyZF9EQ1RfbWV0aG9kX3B0ciwgKERDVEVMRU0gKiBkYXRhKSk7Cit0eXBlZGVmIEpNRVRIT0Qodm9pZCwgZmxvYXRfRENUX21ldGhvZF9wdHIsIChGQVNUX0ZMT0FUICogZGF0YSkpOworCit0eXBlZGVmIEpNRVRIT0Qodm9pZCwgY29udnNhbXBfbWV0aG9kX3B0ciwKKyAgICAgICAgICAgICAgICAoSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wsCisgICAgICAgICAgICAgICAgIERDVEVMRU0gKiB3b3Jrc3BhY2UpKTsKK3R5cGVkZWYgSk1FVEhPRCh2b2lkLCBmbG9hdF9jb252c2FtcF9tZXRob2RfcHRyLAorICAgICAgICAgICAgICAgIChKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCwKKyAgICAgICAgICAgICAgICAgRkFTVF9GTE9BVCAqd29ya3NwYWNlKSk7CisKK3R5cGVkZWYgSk1FVEhPRCh2b2lkLCBxdWFudGl6ZV9tZXRob2RfcHRyLAorICAgICAgICAgICAgICAgIChKQ09FRlBUUiBjb2VmX2Jsb2NrLCBEQ1RFTEVNICogZGl2aXNvcnMsCisgICAgICAgICAgICAgICAgIERDVEVMRU0gKiB3b3Jrc3BhY2UpKTsKK3R5cGVkZWYgSk1FVEhPRCh2b2lkLCBmbG9hdF9xdWFudGl6ZV9tZXRob2RfcHRyLAorICAgICAgICAgICAgICAgIChKQ09FRlBUUiBjb2VmX2Jsb2NrLCBGQVNUX0ZMT0FUICogZGl2aXNvcnMsCisgICAgICAgICAgICAgICAgIEZBU1RfRkxPQVQgKiB3b3Jrc3BhY2UpKTsKKwogdHlwZWRlZiBzdHJ1Y3QgewogICBzdHJ1Y3QganBlZ19mb3J3YXJkX2RjdCBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KIAogICAvKiBQb2ludGVyIHRvIHRoZSBEQ1Qgcm91dGluZSBhY3R1YWxseSBpbiB1c2UgKi8KLSAgZm9yd2FyZF9EQ1RfbWV0aG9kX3B0ciBkb19kY3Q7Ci0gIGNvbnZzYW1wX2ludF9tZXRob2RfcHRyIGNvbnZzYW1wOwotICBxdWFudGl6ZV9pbnRfbWV0aG9kX3B0ciBxdWFudGl6ZTsKKyAgZm9yd2FyZF9EQ1RfbWV0aG9kX3B0ciBkY3Q7CisgIGNvbnZzYW1wX21ldGhvZF9wdHIgY29udnNhbXA7CisgIHF1YW50aXplX21ldGhvZF9wdHIgcXVhbnRpemU7CiAKICAgLyogVGhlIGFjdHVhbCBwb3N0LURDVCBkaXZpc29ycyAtLS0gbm90IGlkZW50aWNhbCB0byB0aGUgcXVhbnQgdGFibGUKICAgICogZW50cmllcywgYmVjYXVzZSBvZiBzY2FsaW5nIChlc3BlY2lhbGx5IGZvciBhbiB1bm5vcm1hbGl6ZWQgRENUKS4KQEAgLTQyLDc3ICs1NSwxMzggQEAKIAogI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKICAgLyogU2FtZSBhcyBhYm92ZSBmb3IgdGhlIGZsb2F0aW5nLXBvaW50IGNhc2UuICovCi0gIGZsb2F0X0RDVF9tZXRob2RfcHRyIGRvX2Zsb2F0X2RjdDsKLSAgY29udnNhbXBfZmxvYXRfbWV0aG9kX3B0ciBmbG9hdF9jb252c2FtcDsKLSAgcXVhbnRpemVfZmxvYXRfbWV0aG9kX3B0ciBmbG9hdF9xdWFudGl6ZTsKKyAgZmxvYXRfRENUX21ldGhvZF9wdHIgZmxvYXRfZGN0OworICBmbG9hdF9jb252c2FtcF9tZXRob2RfcHRyIGZsb2F0X2NvbnZzYW1wOworICBmbG9hdF9xdWFudGl6ZV9tZXRob2RfcHRyIGZsb2F0X3F1YW50aXplOwogICBGQVNUX0ZMT0FUICogZmxvYXRfZGl2aXNvcnNbTlVNX1FVQU5UX1RCTFNdOwogI2VuZGlmCiB9IG15X2ZkY3RfY29udHJvbGxlcjsKIAogdHlwZWRlZiBteV9mZGN0X2NvbnRyb2xsZXIgKiBteV9mZGN0X3B0cjsKIAorCiAvKgotICogU0lNRCBFeHQ6IE1vc3Qgb2YgU1NFL1NTRTIgaW5zdHJ1Y3Rpb25zIHJlcXVpcmUgdGhhdCB0aGUgbWVtb3J5IGFkZHJlc3MKLSAqIGlzIGFsaWduZWQgdG8gYSAxNi1ieXRlIGJvdW5kYXJ5OyBpZiBub3QsIGEgZ2VuZXJhbC1wcm90ZWN0aW9uIGV4Y2VwdGlvbgotICogKCNHUCkgaXMgZ2VuZXJhdGVkLgorICogRmluZCB0aGUgaGlnaGVzdCBiaXQgaW4gYW4gaW50ZWdlciB0aHJvdWdoIGJpbmFyeSBzZWFyY2guCiAgKi8KK0xPQ0FMKGludCkKK2ZscyAoVUlOVDE2IHZhbCkKK3sKKyAgaW50IGJpdDsKIAotI2RlZmluZSBBTElHTl9TSVpFCTE2CQkvKiBzaXplb2YgU1NFL1NTRTIgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQUxJR05fTUVNKHAsYSkJKCh2b2lkICopICgoKHNpemVfdCkgKHApICsgKGEpIC0gMSkgJiAtKGEpKSkKKyAgYml0ID0gMTY7CiAKLSNpZmRlZiBKRkRDVF9JTlRfUVVBTlRJWkVfV0lUSF9ESVZJU0lPTgotI3VuZGVmIGpwZWdfcXVhbnRpemVfaW50Ci0jdW5kZWYganBlZ19xdWFudGl6ZV9pbnRfbW14Ci0jdW5kZWYganBlZ19xdWFudGl6ZV9pbnRfc3NlMgotI2RlZmluZSBqcGVnX3F1YW50aXplX2ludCAgICAgICBqcGVnX3F1YW50aXplX2lkaXYKLSNkZWZpbmUganBlZ19xdWFudGl6ZV9pbnRfbW14ICAganBlZ19xdWFudGl6ZV9pZGl2Ci0jZGVmaW5lIGpwZWdfcXVhbnRpemVfaW50X3NzZTIgIGpwZWdfcXVhbnRpemVfaWRpdgotI2VuZGlmCisgIGlmICghdmFsKQorICAgIHJldHVybiAwOwogCisgIGlmICghKHZhbCAmIDB4ZmYwMCkpIHsKKyAgICBiaXQgLT0gODsKKyAgICB2YWwgPDw9IDg7CisgIH0KKyAgaWYgKCEodmFsICYgMHhmMDAwKSkgeworICAgIGJpdCAtPSA0OworICAgIHZhbCA8PD0gNDsKKyAgfQorICBpZiAoISh2YWwgJiAweGMwMDApKSB7CisgICAgYml0IC09IDI7CisgICAgdmFsIDw8PSAyOworICB9CisgIGlmICghKHZhbCAmIDB4ODAwMCkpIHsKKyAgICBiaXQgLT0gMTsKKyAgICB2YWwgPDw9IDE7CisgIH0KIAotI2lmbmRlZiBKRkRDVF9JTlRfUVVBTlRJWkVfV0lUSF9ESVZJU0lPTgorICByZXR1cm4gYml0OworfQogCiAvKgotICogU0lNRCBFeHQ6IGNvbXB1dGUgdGhlIHJlY2lwcm9jYWwgb2YgdGhlIGRpdmlzb3IKKyAqIENvbXB1dGUgdmFsdWVzIHRvIGRvIGEgZGl2aXNpb24gdXNpbmcgcmVjaXByb2NhbC4KICAqCiAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGFuIGFsZ29yaXRobSBkZXNjcmliZWQgaW4KICAqICAgIkhvdyB0byBvcHRpbWl6ZSBmb3IgdGhlIFBlbnRpdW0gZmFtaWx5IG9mIG1pY3JvcHJvY2Vzc29ycyIKICAqICAgKGh0dHA6Ly93d3cuYWduZXIub3JnL2Fzc2VtLykuCisgKiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYXNpYyBhbGdvcml0aG0gY2FuIGJlIGZvdW5kIGluCisgKiB0aGUgcGFwZXIgIkludGVnZXIgRGl2aXNpb24gVXNpbmcgUmVjaXByb2NhbHMiIGJ5IFJvYmVydCBBbHZlcnNvbi4KKyAqCisgKiBUaGUgYmFzaWMgaWRlYSBpcyB0byByZXBsYWNlIHgvZCBieSB4ICogZF4tMS4gSW4gb3JkZXIgdG8gc3RvcmUKKyAqIGReLTEgd2l0aCBlbm91Z2ggcHJlY2lzaW9uIHdlIHNoaWZ0IGl0IGxlZnQgYSBmZXcgcGxhY2VzLiBJdCB0dXJucworICogb3V0IHRoYXQgdGhpcyBhbGdvcmlnaHQgZ2l2ZXMganVzdCBlbm91Z2ggcHJlY2lzaW9uLCBhbmQgYWxzbyBmaXRzCisgKiBpbnRvIERDVEVMRU06CisgKgorICogICBiID0gKHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYml0cyBpbiBkaXZpc29yKSAtIDEKKyAqICAgciA9ICh3b3JkIHNpemUpICsgYgorICogICBmID0gMl5yIC8gZGl2aXNvcgorICoKKyAqIGYgd2lsbCBub3QgYmUgYW4gaW50ZWdlciBmb3IgbW9zdCBjYXNlcywgc28gd2UgbmVlZCB0byBjb21wZW5zYXRlCisgKiBmb3IgdGhlIHJvdW5kaW5nIGVycm9yIGludHJvZHVjZWQ6CisgKgorICogICBubyBmcmFjdGlvbmFsIHBhcnQ6CisgKgorICogICAgICAgcmVzdWx0ID0gaW5wdXQgPj4gcgorICoKKyAqICAgZnJhY3Rpb25hbCBwYXJ0IG9mIGYgPCAwLjU6CisgKgorICogICAgICAgcm91bmQgZiBkb3duIHRvIG5lYXJlc3QgaW50ZWdlcgorICogICAgICAgcmVzdWx0ID0gKChpbnB1dCArIDEpICogZikgPj4gcgorICoKKyAqICAgZnJhY3Rpb25hbCBwYXJ0IG9mIGYgPiAwLjU6CisgKgorICogICAgICAgcm91bmQgZiB1cCB0byBuZWFyZXN0IGludGVnZXIKKyAqICAgICAgIHJlc3VsdCA9IChpbnB1dCAqIGYpID4+IHIKKyAqCisgKiBUaGlzIGlzIHRoZSBvcmlnaW5hbCBhbGdvcml0aG0gdGhhdCBnaXZlcyB0cnVuY2F0ZWQgcmVzdWx0cy4gQnV0IHdlCisgKiB3YW50IHByb3Blcmx5IHJvdW5kZWQgcmVzdWx0cywgc28gd2UgcmVwbGFjZSAiaW5wdXQiIHdpdGgKKyAqICJpbnB1dCArIGRpdmlzb3IvMiIuCisgKgorICogSW4gb3JkZXIgdG8gYWxsb3cgU0lNRCBpbXBsZW1lbnRhdGlvbnMgd2UgYWxzbyB0d2VhayB0aGUgdmFsdWVzIHRvCisgKiBhbGxvdyB0aGUgc2FtZSBjYWxjdWxhdGlvbiB0byBiZSBtYWRlIGF0IGFsbCB0aW1lczoKKyAqIAorICogICBkY3RibFswXSA9IGYgcm91bmRlZCB0byBuZWFyZXN0IGludGVnZXIKKyAqICAgZGN0YmxbMV0gPSBkaXZpc29yIC8gMiAoKyAxIGlmIGZyYWN0aW9uYWwgcGFydCBvZiBmIDwgMC41KQorICogICBkY3RibFsyXSA9IDEgPDwgKCh3b3JkIHNpemUpICogMiAtIHIpCisgKiAgIGRjdGJsWzNdID0gciAtICh3b3JkIHNpemUpCisgKgorICogZGN0YmxbMl0gaXMgZm9yIHN0dXBpZCBpbnN0cnVjdGlvbiBzZXRzIHdoZXJlIHRoZSBzaGlmdCBvcGVyYXRpb24KKyAqIGlzbid0IG1lbWJlciB3aXNlIChlLmcuIE1NWCkuCisgKgorICogVGhlIHJlYXNvbiBkY3RibFsyXSBhbmQgZGN0YmxbM10gcmVkdWNlIHRoZSBzaGlmdCB3aXRoICh3b3JkIHNpemUpCisgKiBpcyB0aGF0IG1vc3QgU0lNRCBpbXBsZW1lbnRhdGlvbnMgaGF2ZSBhICJtdWx0aXBseSBhbmQgc3RvcmUgdG9wCisgKiBoYWxmIiBvcGVyYXRpb24uCisgKgorICogTGFzdGx5LCB3ZSBzdG9yZSBlYWNoIG9mIHRoZSB2YWx1ZXMgaW4gdGhlaXIgb3duIHRhYmxlIGluc3RlYWQKKyAqIG9mIGluIGEgY29uc2VjdXRpdmUgbWFubmVyLCB5ZXQgYWdhaW4gaW4gb3JkZXIgdG8gYWxsb3cgU0lNRAorICogcm91dGluZXMuCiAgKi8KLQogTE9DQUwodm9pZCkKLWNvbXB1dGVfcmVjaXByb2NhbCAoRENURUxFTSBkaXZpc29yLCBEQ1RFTEVNICogZHRibCkKK2NvbXB1dGVfcmVjaXByb2NhbCAoVUlOVDE2IGRpdmlzb3IsIERDVEVMRU0gKiBkdGJsKQogewotICB1bnNpZ25lZCBsb25nIGQgPSAoKHVuc2lnbmVkIGxvbmcpIGRpdmlzb3IpICYgMHgwMDAwRkZGRjsKLSAgdW5zaWduZWQgbG9uZyBmcSwgZnI7Ci0gIGludCBiLCByLCBjOworICBVRENURUxFTTIgZnEsIGZyOworICBVRENURUxFTSBjOworICBpbnQgYiwgcjsKIAotICBmb3IgKGIgPSAwOyAoMVVMIDw8IGIpIDw9IGQ7IGIrKykgOworICBiID0gZmxzKGRpdmlzb3IpIC0gMTsKKyAgciAgPSBzaXplb2YoRENURUxFTSkgKiA4ICsgYjsKIAotICByICA9IDE2ICsgKC0tYik7Ci0gIGZxID0gKDFVTCA8PCByKSAvIGQ7Ci0gIGZyID0gKDFVTCA8PCByKSAlIGQ7Ci0gIHIgLT0gMTY7Ci0gIGMgID0gMDsKKyAgZnEgPSAoKFVEQ1RFTEVNMikxIDw8IHIpIC8gZGl2aXNvcjsKKyAgZnIgPSAoKFVEQ1RFTEVNMikxIDw8IHIpICUgZGl2aXNvcjsKIAotICBpZiAoZnIgPT0gMCkgeworICBjID0gZGl2aXNvciAvIDI7IC8qIGZvciByb3VuZGluZyAqLworCisgIGlmIChmciA9PSAwKSB7IC8qIGRpdmlzb3IgaXMgcG93ZXIgb2YgdHdvICovCisgICAgLyogZnEgd2lsbCBiZSBvbmUgYml0IHRvbyBsYXJnZSB0byBmaXQgaW4gRENURUxFTSwgc28gYWRqdXN0ICovCiAgICAgZnEgPj49IDE7CiAgICAgci0tOwotICB9IGVsc2UgaWYgKGZyIDw9IChkIC8gMikpIHsKKyAgfSBlbHNlIGlmIChmciA8PSAoZGl2aXNvciAvIDIpKSB7IC8qIGZyYWN0aW9uYWwgcGFydCBpcyA8IDAuNSAqLwogICAgIGMrKzsKLSAgfSBlbHNlIHsKKyAgfSBlbHNlIHsgLyogZnJhY3Rpb25hbCBwYXJ0IGlzID4gMC41ICovCiAgICAgZnErKzsKICAgfQogCi0gIGR0YmxbRENUU0laRTIgKiAwXSA9IChEQ1RFTEVNKSBmcTsJCS8qIHJlY2lwcm9jYWwgKi8KLSAgZHRibFtEQ1RTSVpFMiAqIDFdID0gKERDVEVMRU0pIChjICsgKGQgLyAyKSk7CS8qIGNvcnJlY3Rpb24gKyByb3VuZGZhY3RvciAqLwotICBkdGJsW0RDVFNJWkUyICogMl0gPSAoRENURUxFTSkgKDEgPDwgKDE2IC0gKHIgKyAxICsgMSkpKTsJLyogc2NhbGUgKi8KLSAgZHRibFtEQ1RTSVpFMiAqIDNdID0gKERDVEVMRU0pIChyICsgMSk7CQkJLyogc2hpZnQgKi8KKyAgZHRibFtEQ1RTSVpFMiAqIDBdID0gKERDVEVMRU0pIGZxOyAgICAgIC8qIHJlY2lwcm9jYWwgKi8KKyAgZHRibFtEQ1RTSVpFMiAqIDFdID0gKERDVEVMRU0pIGM7ICAgICAgIC8qIGNvcnJlY3Rpb24gKyByb3VuZGZhY3RvciAqLworICBkdGJsW0RDVFNJWkUyICogMl0gPSAoRENURUxFTSkgKDEgPDwgKHNpemVvZihEQ1RFTEVNKSo4KjIgLSByKSk7ICAvKiBzY2FsZSAqLworICBkdGJsW0RDVFNJWkUyICogM10gPSAoRENURUxFTSkgciAtIHNpemVvZihEQ1RFTEVNKSo4OyAvKiBzaGlmdCAqLwogfQogCi0jZW5kaWYgLyogSkZEQ1RfSU5UX1FVQU5USVpFX1dJVEhfRElWSVNJT04gKi8KLQotCiAvKgogICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCiAgKiBWZXJpZnkgdGhhdCBhbGwgcmVmZXJlbmNlZCBRLXRhYmxlcyBhcmUgcHJlc2VudCwgYW5kIHNldCB1cApAQCAtMTQ3LDcgKzIyMSw2IEBACiAgICAgICAvKiBGb3IgTEwmTSBJRENUIG1ldGhvZCwgZGl2aXNvcnMgYXJlIGVxdWFsIHRvIHJhdyBxdWFudGl6YXRpb24KICAgICAgICAqIGNvZWZmaWNpZW50cyBtdWx0aXBsaWVkIGJ5IDggKHRvIGNvdW50ZXJhY3Qgc2NhbGluZykuCiAgICAgICAgKi8KLSNpZm5kZWYgSkZEQ1RfSU5UX1FVQU5USVpFX1dJVEhfRElWSVNJT04KICAgICAgIGlmIChmZGN0LT5kaXZpc29yc1txdGJsbm9dID09IE5VTEwpIHsKIAlmZGN0LT5kaXZpc29yc1txdGJsbm9dID0gKERDVEVMRU0gKikKIAkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCkBAIC0xNTUsMjIgKzIyOCwxMCBAQAogICAgICAgfQogICAgICAgZHRibCA9IGZkY3QtPmRpdmlzb3JzW3F0Ymxub107CiAgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgewotCWNvbXB1dGVfcmVjaXByb2NhbCAoKERDVEVMRU0pIChxdGJsLT5xdWFudHZhbFtpXSA8PCAzKSwgJmR0YmxbaV0pOworCWNvbXB1dGVfcmVjaXByb2NhbChxdGJsLT5xdWFudHZhbFtpXSA8PCAzLCAmZHRibFtpXSk7CiAgICAgICB9CiAgICAgICBicmVhazsKLSNlbHNlICAvKiBKRkRDVF9JTlRfUVVBTlRJWkVfV0lUSF9ESVZJU0lPTiAqLwotICAgICAgaWYgKGZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPT0gTlVMTCkgewotCWZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPSAoRENURUxFTSAqKQotCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgICAgICBEQ1RTSVpFMiAqIFNJWkVPRihEQ1RFTEVNKSk7Ci0gICAgICB9Ci0gICAgICBkdGJsID0gZmRjdC0+ZGl2aXNvcnNbcXRibG5vXTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7Ci0JZHRibFtpXSA9ICgoRENURUxFTSkgcXRibC0+cXVhbnR2YWxbaV0pIDw8IDM7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSNlbmRpZiAvKiBKRkRDVF9JTlRfUVVBTlRJWkVfV0lUSF9ESVZJU0lPTiAqLwotI2VuZGlmIC8qIERDVF9JU0xPV19TVVBQT1JURUQgKi8KKyNlbmRpZgogI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKICAgICBjYXNlIEpEQ1RfSUZBU1Q6CiAgICAgICB7CkBAIC0xOTQsNyArMjU1LDYgQEAKIAl9OwogCVNISUZUX1RFTVBTCiAKLSNpZm5kZWYgSkZEQ1RfSU5UX1FVQU5USVpFX1dJVEhfRElWSVNJT04KIAlpZiAoZmRjdC0+ZGl2aXNvcnNbcXRibG5vXSA9PSBOVUxMKSB7CiAJICBmZGN0LT5kaXZpc29yc1txdGJsbm9dID0gKERDVEVMRU0gKikKIAkgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKQEAgLTIwMiwyOSArMjYyLDE0IEBACiAJfQogCWR0YmwgPSBmZGN0LT5kaXZpc29yc1txdGJsbm9dOwogCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7Ci0JICBjb21wdXRlX3JlY2lwcm9jYWwgKChEQ1RFTEVNKQotCQkJICAgICAgIERFU0NBTEUoTVVMVElQTFkxNlYxNigoSU5UMzIpIHF0YmwtPnF1YW50dmFsW2ldLAotCQkJCQkJICAgICAoSU5UMzIpIGFhbnNjYWxlc1tpXSksCi0JCQkJICAgICAgIENPTlNUX0JJVFMtMyksCi0JCQkgICAgICAmZHRibFtpXSk7Ci0JfQotI2Vsc2UgIC8qIEpGRENUX0lOVF9RVUFOVElaRV9XSVRIX0RJVklTSU9OICovCi0JaWYgKGZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPT0gTlVMTCkgewotCSAgZmRjdC0+ZGl2aXNvcnNbcXRibG5vXSA9IChEQ1RFTEVNICopCi0JICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJCURDVFNJWkUyICogU0laRU9GKERDVEVMRU0pKTsKLQl9Ci0JZHRibCA9IGZkY3QtPmRpdmlzb3JzW3F0Ymxub107Ci0JZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKLQkgIGR0YmxbaV0gPSAoRENURUxFTSkKKwkgIGNvbXB1dGVfcmVjaXByb2NhbCgKIAkgICAgREVTQ0FMRShNVUxUSVBMWTE2VjE2KChJTlQzMikgcXRibC0+cXVhbnR2YWxbaV0sCiAJCQkJICAoSU5UMzIpIGFhbnNjYWxlc1tpXSksCi0JCSAgICBDT05TVF9CSVRTLTMpOworCQkgICAgQ09OU1RfQklUUy0zKSwgJmR0YmxbaV0pOwogCX0KLSNlbmRpZiAvKiBKRkRDVF9JTlRfUVVBTlRJWkVfV0lUSF9ESVZJU0lPTiAqLwogICAgICAgfQogICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogRENUX0lGQVNUX1NVUFBPUlRFRCAqLworI2VuZGlmCiAjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAogICAgIGNhc2UgSkRDVF9GTE9BVDoKICAgICAgIHsKQEAgLTI3MCw2ICszMTUsNzcgQEAKIAogCiAvKgorICogTG9hZCBkYXRhIGludG8gd29ya3NwYWNlLCBhcHBseWluZyB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitjb252c2FtcCAoSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wsIERDVEVMRU0gKiB3b3Jrc3BhY2UpCit7CisgIHJlZ2lzdGVyIERDVEVMRU0gKndvcmtzcGFjZXB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgZWxlbXB0cjsKKyAgcmVnaXN0ZXIgaW50IGVsZW1yOworCisgIHdvcmtzcGFjZXB0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChlbGVtciA9IDA7IGVsZW1yIDwgRENUU0laRTsgZWxlbXIrKykgeworICAgIGVsZW1wdHIgPSBzYW1wbGVfZGF0YVtlbGVtcl0gKyBzdGFydF9jb2w7CisKKyNpZiBEQ1RTSVpFID09IDgJCS8qIHVucm9sbCB0aGUgaW5uZXIgbG9vcCAqLworICAgICp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworICAgICp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworICAgICp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworICAgICp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworICAgICp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworICAgICp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworICAgICp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworICAgICp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworI2Vsc2UKKyAgICB7CisgICAgICByZWdpc3RlciBpbnQgZWxlbWM7CisgICAgICBmb3IgKGVsZW1jID0gRENUU0laRTsgZWxlbWMgPiAwOyBlbGVtYy0tKQorICAgICAgICAqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKyAgICB9CisjZW5kaWYKKyAgfQorfQorCisKKy8qCisgKiBRdWFudGl6ZS9kZXNjYWxlIHRoZSBjb2VmZmljaWVudHMsIGFuZCBzdG9yZSBpbnRvIGNvZWZfYmxvY2tzW10uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitxdWFudGl6ZSAoSkNPRUZQVFIgY29lZl9ibG9jaywgRENURUxFTSAqIGRpdmlzb3JzLCBEQ1RFTEVNICogd29ya3NwYWNlKQoreworICBpbnQgaTsKKyAgRENURUxFTSB0ZW1wOworICBVRENURUxFTSByZWNpcCwgY29yciwgc2hpZnQ7CisgIFVEQ1RFTEVNMiBwcm9kdWN0OworICBKQ09FRlBUUiBvdXRwdXRfcHRyID0gY29lZl9ibG9jazsKKworICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworICAgIHRlbXAgPSB3b3Jrc3BhY2VbaV07CisgICAgcmVjaXAgPSBkaXZpc29yc1tpICsgRENUU0laRTIgKiAwXTsKKyAgICBjb3JyID0gIGRpdmlzb3JzW2kgKyBEQ1RTSVpFMiAqIDFdOworICAgIHNoaWZ0ID0gZGl2aXNvcnNbaSArIERDVFNJWkUyICogM107CisKKyAgICBpZiAodGVtcCA8IDApIHsKKyAgICAgIHRlbXAgPSAtdGVtcDsKKyAgICAgIHByb2R1Y3QgPSAoVURDVEVMRU0yKSh0ZW1wICsgY29ycikgKiByZWNpcDsKKyAgICAgIHByb2R1Y3QgPj49IHNoaWZ0ICsgc2l6ZW9mKERDVEVMRU0pKjg7CisgICAgICB0ZW1wID0gcHJvZHVjdDsKKyAgICAgIHRlbXAgPSAtdGVtcDsKKyAgICB9IGVsc2UgeworICAgICAgcHJvZHVjdCA9IChVRENURUxFTTIpKHRlbXAgKyBjb3JyKSAqIHJlY2lwOworICAgICAgcHJvZHVjdCA+Pj0gc2hpZnQgKyBzaXplb2YoRENURUxFTSkqODsKKyAgICAgIHRlbXAgPSBwcm9kdWN0OworICAgIH0KKworICAgIG91dHB1dF9wdHJbaV0gPSAoSkNPRUYpIHRlbXA7CisgIH0KK30KKworCisvKgogICogUGVyZm9ybSBmb3J3YXJkIERDVCBvbiBvbmUgb3IgbW9yZSBibG9ja3Mgb2YgYSBjb21wb25lbnQuCiAgKgogICogVGhlIGlucHV0IHNhbXBsZXMgYXJlIHRha2VuIGZyb20gdGhlIHNhbXBsZV9kYXRhW10gYXJyYXkgc3RhcnRpbmcgYXQKQEAgLTI4NCwyOSArNDAwLDg4IEBACiAJICAgICBKRElNRU5TSU9OIG51bV9ibG9ja3MpCiAvKiBUaGlzIHZlcnNpb24gaXMgdXNlZCBmb3IgaW50ZWdlciBEQ1QgaW1wbGVtZW50YXRpb25zLiAqLwogeworICAvKiBUaGlzIHJvdXRpbmUgaXMgaGVhdmlseSB1c2VkLCBzbyBpdCdzIHdvcnRoIGNvZGluZyBpdCB0aWdodGx5LiAqLwogICBteV9mZGN0X3B0ciBmZGN0ID0gKG15X2ZkY3RfcHRyKSBjaW5mby0+ZmRjdDsKICAgRENURUxFTSAqIGRpdmlzb3JzID0gZmRjdC0+ZGl2aXNvcnNbY29tcHB0ci0+cXVhbnRfdGJsX25vXTsKLSAgRENURUxFTSB3b3Jrc3BhY2VbRENUU0laRTIgKyBBTElHTl9TSVpFL3NpemVvZihEQ1RFTEVNKV07Ci0gIERDVEVMRU0gKiB3a3B0ciA9IChEQ1RFTEVNICopIEFMSUdOX01FTSh3b3Jrc3BhY2UsIEFMSUdOX1NJWkUpOworICBEQ1RFTEVNIHdvcmtzcGFjZVtEQ1RTSVpFMl07CS8qIHdvcmsgYXJlYSBmb3IgRkRDVCBzdWJyb3V0aW5lICovCiAgIEpESU1FTlNJT04gYmk7CiAKKyAgLyogTWFrZSBzdXJlIHRoZSBjb21waWxlciBkb2Vzbid0IGxvb2sgdXAgdGhlc2UgZXZlcnkgcGFzcyAqLworICBmb3J3YXJkX0RDVF9tZXRob2RfcHRyIGRvX2RjdCA9IGZkY3QtPmRjdDsKKyAgY29udnNhbXBfbWV0aG9kX3B0ciBkb19jb252c2FtcCA9IGZkY3QtPmNvbnZzYW1wOworICBxdWFudGl6ZV9tZXRob2RfcHRyIGRvX3F1YW50aXplID0gZmRjdC0+cXVhbnRpemU7CisKICAgc2FtcGxlX2RhdGEgKz0gc3RhcnRfcm93OwkvKiBmb2xkIGluIHRoZSB2ZXJ0aWNhbCBvZmZzZXQgb25jZSAqLwogCiAgIGZvciAoYmkgPSAwOyBiaSA8IG51bV9ibG9ja3M7IGJpKyssIHN0YXJ0X2NvbCArPSBEQ1RTSVpFKSB7CiAgICAgLyogTG9hZCBkYXRhIGludG8gd29ya3NwYWNlLCBhcHBseWluZyB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KLSAgICAoKmZkY3QtPmNvbnZzYW1wKSAoc2FtcGxlX2RhdGEsIHN0YXJ0X2NvbCwgd2twdHIpOworICAgICgqZG9fY29udnNhbXApIChzYW1wbGVfZGF0YSwgc3RhcnRfY29sLCB3b3Jrc3BhY2UpOwogCiAgICAgLyogUGVyZm9ybSB0aGUgRENUICovCi0gICAgKCpmZGN0LT5kb19kY3QpICh3a3B0cik7CisgICAgKCpkb19kY3QpICh3b3Jrc3BhY2UpOwogCiAgICAgLyogUXVhbnRpemUvZGVzY2FsZSB0aGUgY29lZmZpY2llbnRzLCBhbmQgc3RvcmUgaW50byBjb2VmX2Jsb2Nrc1tdICovCi0gICAgKCpmZGN0LT5xdWFudGl6ZSkgKGNvZWZfYmxvY2tzW2JpXSwgZGl2aXNvcnMsIHdrcHRyKTsKKyAgICAoKmRvX3F1YW50aXplKSAoY29lZl9ibG9ja3NbYmldLCBkaXZpc29ycywgd29ya3NwYWNlKTsKICAgfQogfQogCiAKICNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECiAKKworTUVUSE9EREVGKHZvaWQpCitjb252c2FtcF9mbG9hdCAoSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wsIEZBU1RfRkxPQVQgKiB3b3Jrc3BhY2UpCit7CisgIHJlZ2lzdGVyIEZBU1RfRkxPQVQgKndvcmtzcGFjZXB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgZWxlbXB0cjsKKyAgcmVnaXN0ZXIgaW50IGVsZW1yOworCisgIHdvcmtzcGFjZXB0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChlbGVtciA9IDA7IGVsZW1yIDwgRENUU0laRTsgZWxlbXIrKykgeworICAgIGVsZW1wdHIgPSBzYW1wbGVfZGF0YVtlbGVtcl0gKyBzdGFydF9jb2w7CisjaWYgRENUU0laRSA9PSA4CQkvKiB1bnJvbGwgdGhlIGlubmVyIGxvb3AgKi8KKyAgICAqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworICAgICp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7CisgICAgKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKyAgICAqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworICAgICp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7CisgICAgKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKyAgICAqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworICAgICp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7CisjZWxzZQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIGludCBlbGVtYzsKKyAgICAgIGZvciAoZWxlbWMgPSBEQ1RTSVpFOyBlbGVtYyA+IDA7IGVsZW1jLS0pCisgICAgICAgICp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworICAgIH0KKyNlbmRpZgorICB9Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitxdWFudGl6ZV9mbG9hdCAoSkNPRUZQVFIgY29lZl9ibG9jaywgRkFTVF9GTE9BVCAqIGRpdmlzb3JzLCBGQVNUX0ZMT0FUICogd29ya3NwYWNlKQoreworICByZWdpc3RlciBGQVNUX0ZMT0FUIHRlbXA7CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBKQ09FRlBUUiBvdXRwdXRfcHRyID0gY29lZl9ibG9jazsKKworICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworICAgIC8qIEFwcGx5IHRoZSBxdWFudGl6YXRpb24gYW5kIHNjYWxpbmcgZmFjdG9yICovCisgICAgdGVtcCA9IHdvcmtzcGFjZVtpXSAqIGRpdmlzb3JzW2ldOworCisgICAgLyogUm91bmQgdG8gbmVhcmVzdCBpbnRlZ2VyLgorICAgICAqIFNpbmNlIEMgZG9lcyBub3Qgc3BlY2lmeSB0aGUgZGlyZWN0aW9uIG9mIHJvdW5kaW5nIGZvciBuZWdhdGl2ZQorICAgICAqIHF1b3RpZW50cywgd2UgaGF2ZSB0byBmb3JjZSB0aGUgZGl2aWRlbmQgcG9zaXRpdmUgZm9yIHBvcnRhYmlsaXR5LgorICAgICAqIFRoZSBtYXhpbXVtIGNvZWZmaWNpZW50IHNpemUgaXMgKy0xNksgKGZvciAxMi1iaXQgZGF0YSksIHNvIHRoaXMKKyAgICAgKiBjb2RlIHNob3VsZCB3b3JrIGZvciBlaXRoZXIgMTYtYml0IG9yIDMyLWJpdCBpbnRzLgorICAgICAqLworICAgIG91dHB1dF9wdHJbaV0gPSAoSkNPRUYpICgoaW50KSAodGVtcCArIChGQVNUX0ZMT0FUKSAxNjM4NC41KSAtIDE2Mzg0KTsKKyAgfQorfQorCisKIE1FVEhPRERFRih2b2lkKQogZm9yd2FyZF9EQ1RfZmxvYXQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKIAkJICAgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkJMT0NLUk9XIGNvZWZfYmxvY2tzLApAQCAtMzE0LDIzICs0ODksMjggQEAKIAkJICAgSkRJTUVOU0lPTiBudW1fYmxvY2tzKQogLyogVGhpcyB2ZXJzaW9uIGlzIHVzZWQgZm9yIGZsb2F0aW5nLXBvaW50IERDVCBpbXBsZW1lbnRhdGlvbnMuICovCiB7CisgIC8qIFRoaXMgcm91dGluZSBpcyBoZWF2aWx5IHVzZWQsIHNvIGl0J3Mgd29ydGggY29kaW5nIGl0IHRpZ2h0bHkuICovCiAgIG15X2ZkY3RfcHRyIGZkY3QgPSAobXlfZmRjdF9wdHIpIGNpbmZvLT5mZGN0OwogICBGQVNUX0ZMT0FUICogZGl2aXNvcnMgPSBmZGN0LT5mbG9hdF9kaXZpc29yc1tjb21wcHRyLT5xdWFudF90Ymxfbm9dOwotICBGQVNUX0ZMT0FUIHdvcmtzcGFjZVtEQ1RTSVpFMiArIEFMSUdOX1NJWkUvc2l6ZW9mKEZBU1RfRkxPQVQpXTsKLSAgRkFTVF9GTE9BVCAqIHdrcHRyID0gKEZBU1RfRkxPQVQgKikgQUxJR05fTUVNKHdvcmtzcGFjZSwgQUxJR05fU0laRSk7CisgIEZBU1RfRkxPQVQgd29ya3NwYWNlW0RDVFNJWkUyXTsgLyogd29yayBhcmVhIGZvciBGRENUIHN1YnJvdXRpbmUgKi8KICAgSkRJTUVOU0lPTiBiaTsKIAorICAvKiBNYWtlIHN1cmUgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbG9vayB1cCB0aGVzZSBldmVyeSBwYXNzICovCisgIGZsb2F0X0RDVF9tZXRob2RfcHRyIGRvX2RjdCA9IGZkY3QtPmZsb2F0X2RjdDsKKyAgZmxvYXRfY29udnNhbXBfbWV0aG9kX3B0ciBkb19jb252c2FtcCA9IGZkY3QtPmZsb2F0X2NvbnZzYW1wOworICBmbG9hdF9xdWFudGl6ZV9tZXRob2RfcHRyIGRvX3F1YW50aXplID0gZmRjdC0+ZmxvYXRfcXVhbnRpemU7CisKICAgc2FtcGxlX2RhdGEgKz0gc3RhcnRfcm93OwkvKiBmb2xkIGluIHRoZSB2ZXJ0aWNhbCBvZmZzZXQgb25jZSAqLwogCiAgIGZvciAoYmkgPSAwOyBiaSA8IG51bV9ibG9ja3M7IGJpKyssIHN0YXJ0X2NvbCArPSBEQ1RTSVpFKSB7CiAgICAgLyogTG9hZCBkYXRhIGludG8gd29ya3NwYWNlLCBhcHBseWluZyB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KLSAgICAoKmZkY3QtPmZsb2F0X2NvbnZzYW1wKSAoc2FtcGxlX2RhdGEsIHN0YXJ0X2NvbCwgd2twdHIpOworICAgICgqZG9fY29udnNhbXApIChzYW1wbGVfZGF0YSwgc3RhcnRfY29sLCB3b3Jrc3BhY2UpOwogCiAgICAgLyogUGVyZm9ybSB0aGUgRENUICovCi0gICAgKCpmZGN0LT5kb19mbG9hdF9kY3QpICh3a3B0cik7CisgICAgKCpkb19kY3QpICh3b3Jrc3BhY2UpOwogCiAgICAgLyogUXVhbnRpemUvZGVzY2FsZSB0aGUgY29lZmZpY2llbnRzLCBhbmQgc3RvcmUgaW50byBjb2VmX2Jsb2Nrc1tdICovCi0gICAgKCpmZGN0LT5mbG9hdF9xdWFudGl6ZSkgKGNvZWZfYmxvY2tzW2JpXSwgZGl2aXNvcnMsIHdrcHRyKTsKKyAgICAoKmRvX3F1YW50aXplKSAoY29lZl9ibG9ja3NbYmldLCBkaXZpc29ycywgd29ya3NwYWNlKTsKICAgfQogfQogCkBAIC0zNDYsNyArNTI2LDYgQEAKIHsKICAgbXlfZmRjdF9wdHIgZmRjdDsKICAgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBzaW1kID0ganBlZ19zaW1kX3N1cHBvcnQoKGpfY29tbW9uX3B0cikgY2luZm8pOwogCiAgIGZkY3QgPSAobXlfZmRjdF9wdHIpCiAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKQEAgLTM1NCw5MCArNTMzLDcxIEBACiAgIGNpbmZvLT5mZGN0ID0gKHN0cnVjdCBqcGVnX2ZvcndhcmRfZGN0ICopIGZkY3Q7CiAgIGZkY3QtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19mZGN0bWdyOwogCisgIC8qIEZpcnN0IGRldGVybWluZSB0aGUgRENULi4uICovCiAgIHN3aXRjaCAoY2luZm8tPmRjdF9tZXRob2QpIHsKICNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECiAgIGNhc2UgSkRDVF9JU0xPVzoKICAgICBmZGN0LT5wdWIuZm9yd2FyZF9EQ1QgPSBmb3J3YXJkX0RDVDsKLSNpZmRlZiBKRkRDVF9JTlRfU1NFMl9TVVBQT1JURUQKLSAgICBpZiAoc2ltZCAmIEpTSU1EX1NTRTIgJiYKLSAgICAgICAgSVNfQ09OU1RfQUxJR05FRF8xNihqY29uc3RfZmRjdF9pc2xvd19zc2UyKSkgewotICAgICAgZmRjdC0+ZG9fZGN0ID0ganBlZ19mZGN0X2lzbG93X3NzZTI7Ci0gICAgICBmZGN0LT5jb252c2FtcCA9IGpwZWdfY29udnNhbXBfaW50X3NzZTI7Ci0gICAgICBmZGN0LT5xdWFudGl6ZSA9IGpwZWdfcXVhbnRpemVfaW50X3NzZTI7Ci0gICAgfSBlbHNlCi0jZW5kaWYKLSNpZmRlZiBKRkRDVF9JTlRfTU1YX1NVUFBPUlRFRAotICAgIGlmIChzaW1kICYgSlNJTURfTU1YKSB7Ci0gICAgICBmZGN0LT5kb19kY3QgPSBqcGVnX2ZkY3RfaXNsb3dfbW14OwotICAgICAgZmRjdC0+Y29udnNhbXAgPSBqcGVnX2NvbnZzYW1wX2ludF9tbXg7Ci0gICAgICBmZGN0LT5xdWFudGl6ZSA9IGpwZWdfcXVhbnRpemVfaW50X21teDsKLSAgICB9IGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgIGZkY3QtPmRvX2RjdCA9IGpwZWdfZmRjdF9pc2xvdzsKLSAgICAgIGZkY3QtPmNvbnZzYW1wID0ganBlZ19jb252c2FtcF9pbnQ7Ci0gICAgICBmZGN0LT5xdWFudGl6ZSA9IGpwZWdfcXVhbnRpemVfaW50OwotICAgIH0KKyAgICBpZiAoanNpbWRfY2FuX2ZkY3RfaXNsb3coKSkKKyAgICAgIGZkY3QtPmRjdCA9IGpzaW1kX2ZkY3RfaXNsb3c7CisgICAgZWxzZQorICAgICAgZmRjdC0+ZGN0ID0ganBlZ19mZGN0X2lzbG93OwogICAgIGJyZWFrOwotI2VuZGlmIC8qIERDVF9JU0xPV19TVVBQT1JURUQgKi8KKyNlbmRpZgogI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKICAgY2FzZSBKRENUX0lGQVNUOgogICAgIGZkY3QtPnB1Yi5mb3J3YXJkX0RDVCA9IGZvcndhcmRfRENUOwotI2lmZGVmIEpGRENUX0lOVF9TU0UyX1NVUFBPUlRFRAotICAgIGlmIChzaW1kICYgSlNJTURfU1NFMiAmJgotICAgICAgICBJU19DT05TVF9BTElHTkVEXzE2KGpjb25zdF9mZGN0X2lmYXN0X3NzZTIpKSB7Ci0gICAgICBmZGN0LT5kb19kY3QgPSBqcGVnX2ZkY3RfaWZhc3Rfc3NlMjsKLSAgICAgIGZkY3QtPmNvbnZzYW1wID0ganBlZ19jb252c2FtcF9pbnRfc3NlMjsKLSAgICAgIGZkY3QtPnF1YW50aXplID0ganBlZ19xdWFudGl6ZV9pbnRfc3NlMjsKLSAgICB9IGVsc2UKLSNlbmRpZgotI2lmZGVmIEpGRENUX0lOVF9NTVhfU1VQUE9SVEVECi0gICAgaWYgKHNpbWQgJiBKU0lNRF9NTVgpIHsKLSAgICAgIGZkY3QtPmRvX2RjdCA9IGpwZWdfZmRjdF9pZmFzdF9tbXg7Ci0gICAgICBmZGN0LT5jb252c2FtcCA9IGpwZWdfY29udnNhbXBfaW50X21teDsKLSAgICAgIGZkY3QtPnF1YW50aXplID0ganBlZ19xdWFudGl6ZV9pbnRfbW14OwotICAgIH0gZWxzZQotI2VuZGlmCi0gICAgewotICAgICAgZmRjdC0+ZG9fZGN0ID0ganBlZ19mZGN0X2lmYXN0OwotICAgICAgZmRjdC0+Y29udnNhbXAgPSBqcGVnX2NvbnZzYW1wX2ludDsKLSAgICAgIGZkY3QtPnF1YW50aXplID0ganBlZ19xdWFudGl6ZV9pbnQ7Ci0gICAgfQorICAgIGlmIChqc2ltZF9jYW5fZmRjdF9pZmFzdCgpKQorICAgICAgZmRjdC0+ZGN0ID0ganNpbWRfZmRjdF9pZmFzdDsKKyAgICBlbHNlCisgICAgICBmZGN0LT5kY3QgPSBqcGVnX2ZkY3RfaWZhc3Q7CiAgICAgYnJlYWs7Ci0jZW5kaWYgLyogRENUX0lGQVNUX1NVUFBPUlRFRCAqLworI2VuZGlmCiAjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAogICBjYXNlIEpEQ1RfRkxPQVQ6CiAgICAgZmRjdC0+cHViLmZvcndhcmRfRENUID0gZm9yd2FyZF9EQ1RfZmxvYXQ7Ci0jaWZkZWYgSkZEQ1RfRkxUX1NTRV9TU0UyX1NVUFBPUlRFRAotICAgIGlmIChzaW1kICYgSlNJTURfU1NFICYmIHNpbWQgJiBKU0lNRF9TU0UyICYmCi0gICAgICAgIElTX0NPTlNUX0FMSUdORURfMTYoamNvbnN0X2ZkY3RfZmxvYXRfc3NlKSkgewotICAgICAgZmRjdC0+ZG9fZmxvYXRfZGN0ID0ganBlZ19mZGN0X2Zsb2F0X3NzZTsKLSAgICAgIGZkY3QtPmZsb2F0X2NvbnZzYW1wID0ganBlZ19jb252c2FtcF9mbHRfc3NlMjsKLSAgICAgIGZkY3QtPmZsb2F0X3F1YW50aXplID0ganBlZ19xdWFudGl6ZV9mbHRfc3NlMjsKLSAgICB9IGVsc2UKLSNlbmRpZgotI2lmZGVmIEpGRENUX0ZMVF9TU0VfTU1YX1NVUFBPUlRFRAotICAgIGlmIChzaW1kICYgSlNJTURfU1NFICYmCi0gICAgICAgIElTX0NPTlNUX0FMSUdORURfMTYoamNvbnN0X2ZkY3RfZmxvYXRfc3NlKSkgewotICAgICAgZmRjdC0+ZG9fZmxvYXRfZGN0ID0ganBlZ19mZGN0X2Zsb2F0X3NzZTsKLSAgICAgIGZkY3QtPmZsb2F0X2NvbnZzYW1wID0ganBlZ19jb252c2FtcF9mbHRfc3NlOwotICAgICAgZmRjdC0+ZmxvYXRfcXVhbnRpemUgPSBqcGVnX3F1YW50aXplX2ZsdF9zc2U7Ci0gICAgfSBlbHNlCi0jZW5kaWYKLSNpZmRlZiBKRkRDVF9GTFRfM0ROT1dfTU1YX1NVUFBPUlRFRAotICAgIGlmIChzaW1kICYgSlNJTURfM0ROT1cpIHsKLSAgICAgIGZkY3QtPmRvX2Zsb2F0X2RjdCA9IGpwZWdfZmRjdF9mbG9hdF8zZG5vdzsKLSAgICAgIGZkY3QtPmZsb2F0X2NvbnZzYW1wID0ganBlZ19jb252c2FtcF9mbHRfM2Rub3c7Ci0gICAgICBmZGN0LT5mbG9hdF9xdWFudGl6ZSA9IGpwZWdfcXVhbnRpemVfZmx0XzNkbm93OwotICAgIH0gZWxzZQotI2VuZGlmCi0gICAgewotICAgICAgZmRjdC0+ZG9fZmxvYXRfZGN0ID0ganBlZ19mZGN0X2Zsb2F0OwotICAgICAgZmRjdC0+ZmxvYXRfY29udnNhbXAgPSBqcGVnX2NvbnZzYW1wX2Zsb2F0OwotICAgICAgZmRjdC0+ZmxvYXRfcXVhbnRpemUgPSBqcGVnX3F1YW50aXplX2Zsb2F0OwotICAgIH0KKyAgICBpZiAoanNpbWRfY2FuX2ZkY3RfZmxvYXQoKSkKKyAgICAgIGZkY3QtPmZsb2F0X2RjdCA9IGpzaW1kX2ZkY3RfZmxvYXQ7CisgICAgZWxzZQorICAgICAgZmRjdC0+ZmxvYXRfZGN0ID0ganBlZ19mZGN0X2Zsb2F0OwogICAgIGJyZWFrOwotI2VuZGlmIC8qIERDVF9GTE9BVF9TVVBQT1JURUQgKi8KKyNlbmRpZgorICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIC4uLnRoZW4gdGhlIHN1cHBvcnRpbmcgc3RhZ2VzLiAqLworICBzd2l0Y2ggKGNpbmZvLT5kY3RfbWV0aG9kKSB7CisjaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAorICBjYXNlIEpEQ1RfSVNMT1c6CisjZW5kaWYKKyNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECisgIGNhc2UgSkRDVF9JRkFTVDoKKyNlbmRpZgorI2lmIGRlZmluZWQoRENUX0lTTE9XX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChEQ1RfSUZBU1RfU1VQUE9SVEVEKQorICAgIGlmIChqc2ltZF9jYW5fY29udnNhbXAoKSkKKyAgICAgIGZkY3QtPmNvbnZzYW1wID0ganNpbWRfY29udnNhbXA7CisgICAgZWxzZQorICAgICAgZmRjdC0+Y29udnNhbXAgPSBjb252c2FtcDsKKyAgICBpZiAoanNpbWRfY2FuX3F1YW50aXplKCkpCisgICAgICBmZGN0LT5xdWFudGl6ZSA9IGpzaW1kX3F1YW50aXplOworICAgIGVsc2UKKyAgICAgIGZkY3QtPnF1YW50aXplID0gcXVhbnRpemU7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisgIGNhc2UgSkRDVF9GTE9BVDoKKyAgICBpZiAoanNpbWRfY2FuX2NvbnZzYW1wX2Zsb2F0KCkpCisgICAgICBmZGN0LT5mbG9hdF9jb252c2FtcCA9IGpzaW1kX2NvbnZzYW1wX2Zsb2F0OworICAgIGVsc2UKKyAgICAgIGZkY3QtPmZsb2F0X2NvbnZzYW1wID0gY29udnNhbXBfZmxvYXQ7CisgICAgaWYgKGpzaW1kX2Nhbl9xdWFudGl6ZV9mbG9hdCgpKQorICAgICAgZmRjdC0+ZmxvYXRfcXVhbnRpemUgPSBqc2ltZF9xdWFudGl6ZV9mbG9hdDsKKyAgICBlbHNlCisgICAgICBmZGN0LT5mbG9hdF9xdWFudGl6ZSA9IHF1YW50aXplX2Zsb2F0OworICAgIGJyZWFrOworI2VuZGlmCiAgIGRlZmF1bHQ6CiAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwogICAgIGJyZWFrOwpAQCAtNDUxLDY1ICs2MTEsMyBAQAogI2VuZGlmCiAgIH0KIH0KLQotCi0jaWZuZGVmIEpTSU1EX01PREVJTkZPX05PVF9TVVBQT1JURUQKLQotR0xPQkFMKHVuc2lnbmVkIGludCkKLWpwZWdfc2ltZF9mb3J3YXJkX2RjdCAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBtZXRob2QpCi17Ci0gIHVuc2lnbmVkIGludCBzaW1kID0ganBlZ19zaW1kX3N1cHBvcnQoKGpfY29tbW9uX3B0cikgY2luZm8pOwotCi0gIHN3aXRjaCAobWV0aG9kKSB7Ci0jaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotICBjYXNlIEpEQ1RfSVNMT1c6Ci0jaWZkZWYgSkZEQ1RfSU5UX1NTRTJfU1VQUE9SVEVECi0gICAgaWYgKHNpbWQgJiBKU0lNRF9TU0UyICYmCi0gICAgICAgIElTX0NPTlNUX0FMSUdORURfMTYoamNvbnN0X2ZkY3RfaXNsb3dfc3NlMikpCi0gICAgICByZXR1cm4gSlNJTURfU1NFMjsKLSNlbmRpZgotI2lmZGVmIEpGRENUX0lOVF9NTVhfU1VQUE9SVEVECi0gICAgaWYgKHNpbWQgJiBKU0lNRF9NTVgpCi0gICAgICByZXR1cm4gSlNJTURfTU1YOwotI2VuZGlmCi0gICAgcmV0dXJuIEpTSU1EX05PTkU7Ci0jZW5kaWYgLyogRENUX0lTTE9XX1NVUFBPUlRFRCAqLwotI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKLSAgY2FzZSBKRENUX0lGQVNUOgotI2lmZGVmIEpGRENUX0lOVF9TU0UyX1NVUFBPUlRFRAotICAgIGlmIChzaW1kICYgSlNJTURfU1NFMiAmJgotICAgICAgICBJU19DT05TVF9BTElHTkVEXzE2KGpjb25zdF9mZGN0X2lmYXN0X3NzZTIpKQotICAgICAgcmV0dXJuIEpTSU1EX1NTRTI7Ci0jZW5kaWYKLSNpZmRlZiBKRkRDVF9JTlRfTU1YX1NVUFBPUlRFRAotICAgIGlmIChzaW1kICYgSlNJTURfTU1YKQotICAgICAgcmV0dXJuIEpTSU1EX01NWDsKLSNlbmRpZgotICAgIHJldHVybiBKU0lNRF9OT05FOwotI2VuZGlmIC8qIERDVF9JRkFTVF9TVVBQT1JURUQgKi8KLSNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0gIGNhc2UgSkRDVF9GTE9BVDoKLSNpZmRlZiBKRkRDVF9GTFRfU1NFX1NTRTJfU1VQUE9SVEVECi0gICAgaWYgKHNpbWQgJiBKU0lNRF9TU0UgJiYgc2ltZCAmIEpTSU1EX1NTRTIgJiYKLSAgICAgICAgSVNfQ09OU1RfQUxJR05FRF8xNihqY29uc3RfZmRjdF9mbG9hdF9zc2UpKQotICAgICAgcmV0dXJuIEpTSU1EX1NTRTsJCS8qIChKU0lNRF9TU0UgfCBKU0lNRF9TU0UyKTsgKi8KLSNlbmRpZgotI2lmZGVmIEpGRENUX0ZMVF9TU0VfTU1YX1NVUFBPUlRFRAotICAgIGlmIChzaW1kICYgSlNJTURfU1NFICYmCi0gICAgICAgIElTX0NPTlNUX0FMSUdORURfMTYoamNvbnN0X2ZkY3RfZmxvYXRfc3NlKSkKLSAgICAgIHJldHVybiBKU0lNRF9TU0U7CQkvKiAoSlNJTURfU1NFIHwgSlNJTURfTU1YKTsgKi8KLSNlbmRpZgotI2lmZGVmIEpGRENUX0ZMVF8zRE5PV19NTVhfU1VQUE9SVEVECi0gICAgaWYgKHNpbWQgJiBKU0lNRF8zRE5PVykKLSAgICAgIHJldHVybiBKU0lNRF8zRE5PVzsJLyogKEpTSU1EXzNETk9XIHwgSlNJTURfTU1YKTsgKi8KLSNlbmRpZgotICAgIHJldHVybiBKU0lNRF9OT05FOwotI2VuZGlmIC8qIERDVF9GTE9BVF9TVVBQT1JURUQgKi8KLSAgZGVmYXVsdDoKLSAgICA7Ci0gIH0KLQotICByZXR1cm4gSlNJTURfTk9ORTsJLyogbm90IGNvbXBpbGVkICovCi19Ci0KLSNlbmRpZiAvKiAhSlNJTURfTU9ERUlORk9fTk9UX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvamNodWZmLmMgYi9qY2h1ZmYuYwppbmRleCBmMjM1MjUwLi4yMDM4OGJkIDEwMDY0NAotLS0gYS9qY2h1ZmYuYworKysgYi9qY2h1ZmYuYwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAgKiBiZXR3ZWVuIGNhbGxzLCBzbyAyNCBiaXRzIGFyZSBzdWZmaWNpZW50LgogICovCiAKLUlOTElORQoraW5saW5lCiBMT0NBTChib29sZWFuKQogZW1pdF9iaXRzICh3b3JraW5nX3N0YXRlICogc3RhdGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgc2l6ZSkKIC8qIEVtaXQgc29tZSBiaXRzOyByZXR1cm4gVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBpZiBtdXN0IHN1c3BlbmQgKi8KZGlmZiAtLWdpdCBhL2pjb2xzYW1wLmggYi9qY29sc2FtcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTI3YjUzLi4wMDAwMDAwCi0tLSBhL2pjb2xzYW1wLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIGpjb2xzYW1wLmggLSBwcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgY29sb3IgY29udmVyc2lvbiAmIHVwL2Rvd25zYW1wbGluZwotICoKLSAqIHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKLSAqCi0gKiBMYXN0IE1vZGlmaWVkIDogRmVicnVhcnkgNCwgMjAwNgotICoKLSAqIFtUQUI4XQotICovCi0KLQotLyogY29uZmlndXJhdGlvbiBjaGVjazogQklUU19JTl9KU0FNUExFPT04ICg4LWJpdCBzYW1wbGUgdmFsdWVzKSBpcyB0aGUgb25seQotICogdmFsaWQgc2V0dGluZyBvbiB0aGlzIFNJTUQgZXh0ZW5zaW9uLgotICovCi0jaWYgQklUU19JTl9KU0FNUExFICE9IDgKLSNlcnJvciAiU29ycnksIHRoaXMgU0lNRCBjb2RlIG9ubHkgY29wZXMgd2l0aCA4LWJpdCBzYW1wbGUgdmFsdWVzLiIKLSNlbmRpZgotCi0vKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4gKi8KLQotI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSNkZWZpbmUganBlZ19yZ2JfeWNjX2NvbnZlcnRfbW14CWpNUmdiWWNjQ252CS8qIGpjY29sbW14LmFzbSAqLwotI2RlZmluZSBqcGVnX3JnYl95Y2NfY29udmVydF9zc2UyCWpTUmdiWWNjQ252CS8qIGpjY29sc3MyLmFzbSAqLwotI2RlZmluZSBqcGVnX2gydjFfZG93bnNhbXBsZV9tbXgJak0yMURvd25zYW1wbGUJLyogamNzYW1tbXguYXNtICovCi0jZGVmaW5lIGpwZWdfaDJ2Ml9kb3duc2FtcGxlX21teAlqTTIyRG93bnNhbXBsZQkvKiBqY3NhbW1teC5hc20gKi8KLSNkZWZpbmUganBlZ19oMnYxX2Rvd25zYW1wbGVfc3NlMglqUzIxRG93bnNhbXBsZQkvKiBqY3NhbXNzMi5hc20gKi8KLSNkZWZpbmUganBlZ19oMnYyX2Rvd25zYW1wbGVfc3NlMglqUzIyRG93bnNhbXBsZQkvKiBqY3NhbXNzMi5hc20gKi8KLSNkZWZpbmUganBlZ195Y2NfcmdiX2NvbnZlcnRfbW14CWpNWWNjUmdiQ252CS8qIGpkY29sbW14LmFzbSAqLwotI2RlZmluZSBqcGVnX3ljY19yZ2JfY29udmVydF9zc2UyCWpTWWNjUmdiQ252CS8qIGpkY29sc3MyLmFzbSAqLwotI2RlZmluZSBqcGVnX2gydjFfbWVyZ2VkX3Vwc2FtcGxlX21teAlqTTIxTWVyVXBzYW1wbGUJLyogamRtZXJtbXguYXNtICovCi0jZGVmaW5lIGpwZWdfaDJ2Ml9tZXJnZWRfdXBzYW1wbGVfbW14CWpNMjJNZXJVcHNhbXBsZQkvKiBqZG1lcm1teC5hc20gKi8KLSNkZWZpbmUganBlZ19oMnYxX21lcmdlZF91cHNhbXBsZV9zc2UyCWpTMjFNZXJVcHNhbXBsZQkvKiBqZG1lcnNzMi5hc20gKi8KLSNkZWZpbmUganBlZ19oMnYyX21lcmdlZF91cHNhbXBsZV9zc2UyCWpTMjJNZXJVcHNhbXBsZQkvKiBqZG1lcnNzMi5hc20gKi8KLSNkZWZpbmUganBlZ19oMnYxX2ZhbmN5X3Vwc2FtcGxlX21teAlqTTIxRmFuVXBzYW1wbGUJLyogamRzYW1tbXguYXNtICovCi0jZGVmaW5lIGpwZWdfaDJ2Ml9mYW5jeV91cHNhbXBsZV9tbXgJak0yMkZhblVwc2FtcGxlCS8qIGpkc2FtbW14LmFzbSAqLwotI2RlZmluZSBqcGVnX2gxdjJfZmFuY3lfdXBzYW1wbGVfbW14CWpNMTJGYW5VcHNhbXBsZQkvKiBqZHNhbW1teC5hc20gKi8KLSNkZWZpbmUganBlZ19oMnYxX3Vwc2FtcGxlX21teAkJak0yMVVwc2FtcGxlCS8qIGpkc2FtbW14LmFzbSAqLwotI2RlZmluZSBqcGVnX2gydjJfdXBzYW1wbGVfbW14CQlqTTIyVXBzYW1wbGUJLyogamRzYW1tbXguYXNtICovCi0jZGVmaW5lIGpwZWdfaDJ2MV9mYW5jeV91cHNhbXBsZV9zc2UyCWpTMjFGYW5VcHNhbXBsZQkvKiBqZHNhbXNzMi5hc20gKi8KLSNkZWZpbmUganBlZ19oMnYyX2ZhbmN5X3Vwc2FtcGxlX3NzZTIJalMyMkZhblVwc2FtcGxlCS8qIGpkc2Ftc3MyLmFzbSAqLwotI2RlZmluZSBqcGVnX2gxdjJfZmFuY3lfdXBzYW1wbGVfc3NlMglqUzEyRmFuVXBzYW1wbGUJLyogamRzYW1zczIuYXNtICovCi0jZGVmaW5lIGpwZWdfaDJ2MV91cHNhbXBsZV9zc2UyCQlqUzIxVXBzYW1wbGUJLyogamRzYW1zczIuYXNtICovCi0jZGVmaW5lIGpwZWdfaDJ2Ml91cHNhbXBsZV9zc2UyCQlqUzIyVXBzYW1wbGUJLyogamRzYW1zczIuYXNtICovCi0jZGVmaW5lIGpjb25zdF9yZ2JfeWNjX2NvbnZlcnRfbW14CWpNQ1JnYlljY0NudgkvKiBqY2NvbG1teC5hc20gKi8KLSNkZWZpbmUgamNvbnN0X3JnYl95Y2NfY29udmVydF9zc2UyCWpTQ1JnYlljY0NudgkvKiBqY2NvbHNzMi5hc20gKi8KLSNkZWZpbmUgamNvbnN0X3ljY19yZ2JfY29udmVydF9tbXgJak1DWWNjUmdiQ252CS8qIGpkY29sbW14LmFzbSAqLwotI2RlZmluZSBqY29uc3RfeWNjX3JnYl9jb252ZXJ0X3NzZTIJalNDWWNjUmdiQ252CS8qIGpkY29sc3MyLmFzbSAqLwotI2RlZmluZSBqY29uc3RfbWVyZ2VkX3Vwc2FtcGxlX21teAlqTUNNZXJVcHNhbXBsZQkvKiBqZG1lcm1teC5hc20gKi8KLSNkZWZpbmUgamNvbnN0X21lcmdlZF91cHNhbXBsZV9zc2UyCWpTQ01lclVwc2FtcGxlCS8qIGpkbWVyc3MyLmFzbSAqLwotI2RlZmluZSBqY29uc3RfZmFuY3lfdXBzYW1wbGVfbW14CWpNQ0ZhblVwc2FtcGxlCS8qIGpkc2FtbW14LmFzbSAqLwotI2RlZmluZSBqY29uc3RfZmFuY3lfdXBzYW1wbGVfc3NlMglqU0NGYW5VcHNhbXBsZQkvKiBqZHNhbXNzMi5hc20gKi8KLSNpZm5kZWYgSlNJTURfTU9ERUlORk9fTk9UX1NVUFBPUlRFRAotI2RlZmluZSBqcGVnX3NpbWRfbWVyZ2VkX3Vwc2FtcGxlcglqU2lNVXBzYW1wbGVyCS8qIGpkbWVyZ2UuYyAgICAqLwotI2VuZGlmCi0jZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLwotCi0vKiBFeHRlcm4gZGVjbGFyYXRpb25zIGZvciBjb2xvciBjb252ZXJzaW9uICYgdXAvZG93bnNhbXBsaW5nIHJvdXRpbmVzLiAqLwotCi1FWFRFUk4odm9pZCkganBlZ19yZ2JfeWNjX2NvbnZlcnRfbW14Ci0gICAgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKLQkgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpKTsKLUVYVEVSTih2b2lkKSBqcGVnX3JnYl95Y2NfY29udmVydF9zc2UyCi0gICAgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKLQkgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpKTsKLQotRVhURVJOKHZvaWQpIGpwZWdfaDJ2MV9kb3duc2FtcGxlX21teAotICAgIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2gydjJfZG93bnNhbXBsZV9tbXgKLSAgICBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKSk7Ci1FWFRFUk4odm9pZCkganBlZ19oMnYxX2Rvd25zYW1wbGVfc3NlMgotICAgIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2gydjJfZG93bnNhbXBsZV9zc2UyCi0gICAgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkpOwotCi1FWFRFUk4odm9pZCkganBlZ195Y2NfcmdiX2NvbnZlcnRfbW14Ci0gICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCi0JIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKSk7Ci1FWFRFUk4odm9pZCkganBlZ195Y2NfcmdiX2NvbnZlcnRfc3NlMgotICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykpOwotCi1FWFRFUk4odm9pZCkganBlZ19oMnYxX21lcmdlZF91cHNhbXBsZV9tbXgKLSAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmLAotCSBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIsIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikpOwotRVhURVJOKHZvaWQpIGpwZWdfaDJ2Ml9tZXJnZWRfdXBzYW1wbGVfbW14Ci0gICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZiwKLQkgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLCBKU0FNUEFSUkFZIG91dHB1dF9idWYpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2gydjFfbWVyZ2VkX3Vwc2FtcGxlX3NzZTIKLSAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmLAotCSBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIsIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikpOwotRVhURVJOKHZvaWQpIGpwZWdfaDJ2Ml9tZXJnZWRfdXBzYW1wbGVfc3NlMgotICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYsCi0JIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwgSlNBTVBBUlJBWSBvdXRwdXRfYnVmKSk7Ci0KLUVYVEVSTih2b2lkKSBqcGVnX2gydjFfZmFuY3lfdXBzYW1wbGVfbW14Ci0gICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKSk7Ci1FWFRFUk4odm9pZCkganBlZ19oMnYyX2ZhbmN5X3Vwc2FtcGxlX21teAotICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikpOwotRVhURVJOKHZvaWQpIGpwZWdfaDF2Ml9mYW5jeV91cHNhbXBsZV9tbXgKLSAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2gydjFfdXBzYW1wbGVfbW14Ci0gICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKSk7Ci1FWFRFUk4odm9pZCkganBlZ19oMnYyX3Vwc2FtcGxlX21teAotICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikpOwotRVhURVJOKHZvaWQpIGpwZWdfaDJ2MV9mYW5jeV91cHNhbXBsZV9zc2UyCi0gICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKSk7Ci1FWFRFUk4odm9pZCkganBlZ19oMnYyX2ZhbmN5X3Vwc2FtcGxlX3NzZTIKLSAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2gxdjJfZmFuY3lfdXBzYW1wbGVfc3NlMgotICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikpOwotRVhURVJOKHZvaWQpIGpwZWdfaDJ2MV91cHNhbXBsZV9zc2UyCi0gICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKSk7Ci1FWFRFUk4odm9pZCkganBlZ19oMnYyX3Vwc2FtcGxlX3NzZTIKLSAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpKTsKLQotZXh0ZXJuIGNvbnN0IGludCBqY29uc3RfcmdiX3ljY19jb252ZXJ0X21teFtdOwotZXh0ZXJuIGNvbnN0IGludCBqY29uc3RfcmdiX3ljY19jb252ZXJ0X3NzZTJbXTsKLWV4dGVybiBjb25zdCBpbnQgamNvbnN0X3ljY19yZ2JfY29udmVydF9tbXhbXTsKLWV4dGVybiBjb25zdCBpbnQgamNvbnN0X3ljY19yZ2JfY29udmVydF9zc2UyW107Ci1leHRlcm4gY29uc3QgaW50IGpjb25zdF9tZXJnZWRfdXBzYW1wbGVfbW14W107Ci1leHRlcm4gY29uc3QgaW50IGpjb25zdF9tZXJnZWRfdXBzYW1wbGVfc3NlMltdOwotZXh0ZXJuIGNvbnN0IGludCBqY29uc3RfZmFuY3lfdXBzYW1wbGVfbW14W107Ci1leHRlcm4gY29uc3QgaW50IGpjb25zdF9mYW5jeV91cHNhbXBsZV9zc2UyW107Ci0KLSNpZm5kZWYgSlNJTURfTU9ERUlORk9fTk9UX1NVUFBPUlRFRAotRVhURVJOKHVuc2lnbmVkIGludCkganBlZ19zaW1kX21lcmdlZF91cHNhbXBsZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2pjb2xzYW1wLmluYyBiL2pjb2xzYW1wLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNmNWRiZC4uMDAwMDAwMAotLS0gYS9qY29sc2FtcC5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotOwotOyBqY29sc2FtcC5pbmMgLSBwcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgY29sb3IgY29udmVyc2lvbiAmIHVwL2Rvd25zYW1wbGluZwotOwotOyB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLTsgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KLTsgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGpzaW1kZXh0LmluYwotOwotOyBMYXN0IE1vZGlmaWVkIDogSmFudWFyeSA1LCAyMDA2Ci07Ci07IFtUQUI4XQotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ci07IGNvbmZpZ3VyYXRpb24gY2hlY2s6IEJJVFNfSU5fSlNBTVBMRT09OCAoOC1iaXQgc2FtcGxlIHZhbHVlcykgaXMgdGhlIG9ubHkKLTsgdmFsaWQgc2V0dGluZyBvbiB0aGlzIFNJTUQgZXh0ZW5zaW9uLgotOwotJWlmIEJJVFNfSU5fSlNBTVBMRSAhPSA4Ci0lZXJyb3IgIlNvcnJ5LCB0aGlzIFNJTUQgY29kZSBvbmx5IGNvcGVzIHdpdGggOC1iaXQgc2FtcGxlIHZhbHVlcy4iCi0lZW5kaWYKLQotOyBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4KLTsKLSVpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0lZGVmaW5lIGpwZWdfcmdiX3ljY19jb252ZXJ0X21teAlqTVJnYlljY0Nudgk7IGpjY29sbW14LmFzbQotJWRlZmluZSBqcGVnX3JnYl95Y2NfY29udmVydF9zc2UyCWpTUmdiWWNjQ252CTsgamNjb2xzczIuYXNtCi0lZGVmaW5lIGpwZWdfaDJ2MV9kb3duc2FtcGxlX21teAlqTTIxRG93bnNhbXBsZQk7IGpjc2FtbW14LmFzbQotJWRlZmluZSBqcGVnX2gydjJfZG93bnNhbXBsZV9tbXgJak0yMkRvd25zYW1wbGUJOyBqY3NhbW1teC5hc20KLSVkZWZpbmUganBlZ19oMnYxX2Rvd25zYW1wbGVfc3NlMglqUzIxRG93bnNhbXBsZQk7IGpjc2Ftc3MyLmFzbQotJWRlZmluZSBqcGVnX2gydjJfZG93bnNhbXBsZV9zc2UyCWpTMjJEb3duc2FtcGxlCTsgamNzYW1zczIuYXNtCi0lZGVmaW5lIGpwZWdfeWNjX3JnYl9jb252ZXJ0X21teAlqTVljY1JnYkNudgk7IGpkY29sbW14LmFzbQotJWRlZmluZSBqcGVnX3ljY19yZ2JfY29udmVydF9zc2UyCWpTWWNjUmdiQ252CTsgamRjb2xzczIuYXNtCi0lZGVmaW5lIGpwZWdfaDJ2MV9tZXJnZWRfdXBzYW1wbGVfbW14CWpNMjFNZXJVcHNhbXBsZQk7IGpkbWVybW14LmFzbQotJWRlZmluZSBqcGVnX2gydjJfbWVyZ2VkX3Vwc2FtcGxlX21teAlqTTIyTWVyVXBzYW1wbGUJOyBqZG1lcm1teC5hc20KLSVkZWZpbmUganBlZ19oMnYxX21lcmdlZF91cHNhbXBsZV9zc2UyCWpTMjFNZXJVcHNhbXBsZQk7IGpkbWVyc3MyLmFzbQotJWRlZmluZSBqcGVnX2gydjJfbWVyZ2VkX3Vwc2FtcGxlX3NzZTIJalMyMk1lclVwc2FtcGxlCTsgamRtZXJzczIuYXNtCi0lZGVmaW5lIGpwZWdfaDJ2MV9mYW5jeV91cHNhbXBsZV9tbXgJak0yMUZhblVwc2FtcGxlCTsgamRzYW1tbXguYXNtCi0lZGVmaW5lIGpwZWdfaDJ2Ml9mYW5jeV91cHNhbXBsZV9tbXgJak0yMkZhblVwc2FtcGxlCTsgamRzYW1tbXguYXNtCi0lZGVmaW5lIGpwZWdfaDF2Ml9mYW5jeV91cHNhbXBsZV9tbXgJak0xMkZhblVwc2FtcGxlCTsgamRzYW1tbXguYXNtCi0lZGVmaW5lIGpwZWdfaDJ2MV91cHNhbXBsZV9tbXgJCWpNMjFVcHNhbXBsZQk7IGpkc2FtbW14LmFzbQotJWRlZmluZSBqcGVnX2gydjJfdXBzYW1wbGVfbW14CQlqTTIyVXBzYW1wbGUJOyBqZHNhbW1teC5hc20KLSVkZWZpbmUganBlZ19oMnYxX2ZhbmN5X3Vwc2FtcGxlX3NzZTIJalMyMUZhblVwc2FtcGxlCTsgamRzYW1zczIuYXNtCi0lZGVmaW5lIGpwZWdfaDJ2Ml9mYW5jeV91cHNhbXBsZV9zc2UyCWpTMjJGYW5VcHNhbXBsZQk7IGpkc2Ftc3MyLmFzbQotJWRlZmluZSBqcGVnX2gxdjJfZmFuY3lfdXBzYW1wbGVfc3NlMglqUzEyRmFuVXBzYW1wbGUJOyBqZHNhbXNzMi5hc20KLSVkZWZpbmUganBlZ19oMnYxX3Vwc2FtcGxlX3NzZTIJCWpTMjFVcHNhbXBsZQk7IGpkc2Ftc3MyLmFzbQotJWRlZmluZSBqcGVnX2gydjJfdXBzYW1wbGVfc3NlMgkJalMyMlVwc2FtcGxlCTsgamRzYW1zczIuYXNtCi0lZGVmaW5lIGpjb25zdF9yZ2JfeWNjX2NvbnZlcnRfbW14CWpNQ1JnYlljY0Nudgk7IGpjY29sbW14LmFzbQotJWRlZmluZSBqY29uc3RfcmdiX3ljY19jb252ZXJ0X3NzZTIJalNDUmdiWWNjQ252CTsgamNjb2xzczIuYXNtCi0lZGVmaW5lIGpjb25zdF95Y2NfcmdiX2NvbnZlcnRfbW14CWpNQ1ljY1JnYkNudgk7IGpkY29sbW14LmFzbQotJWRlZmluZSBqY29uc3RfeWNjX3JnYl9jb252ZXJ0X3NzZTIJalNDWWNjUmdiQ252CTsgamRjb2xzczIuYXNtCi0lZGVmaW5lIGpjb25zdF9tZXJnZWRfdXBzYW1wbGVfbW14CWpNQ01lclVwc2FtcGxlCTsgamRtZXJtbXguYXNtCi0lZGVmaW5lIGpjb25zdF9tZXJnZWRfdXBzYW1wbGVfc3NlMglqU0NNZXJVcHNhbXBsZQk7IGpkbWVyc3MyLmFzbQotJWRlZmluZSBqY29uc3RfZmFuY3lfdXBzYW1wbGVfbW14CWpNQ0ZhblVwc2FtcGxlCTsgamRzYW1tbXguYXNtCi0lZGVmaW5lIGpjb25zdF9mYW5jeV91cHNhbXBsZV9zc2UyCWpTQ0ZhblVwc2FtcGxlCTsgamRzYW1zczIuYXNtCi0lZW5kaWYgOyBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotOyBwc2V1ZG8tcmVzaXN0ZXJzIHRvIG1ha2Ugb3JkZXJpbmcgb2YgUkdCIGNvbmZpZ3VyYWJsZQotOwotJWlmIFJHQl9QSVhFTFNJWkUgPT0gMyB8fCBSR0JfUElYRUxTSVpFID09IDQKLSVpZiBSR0JfUkVEIDwgMCB8fCBSR0JfUkVEID49IFJHQl9QSVhFTFNJWkUgfHwgUkdCX0dSRUVOIDwgMCB8fCBcCi0gICBSR0JfR1JFRU4gPj0gUkdCX1BJWEVMU0laRSB8fCBSR0JfQkxVRSA8IDAgfHwgUkdCX0JMVUUgPj0gUkdCX1BJWEVMU0laRSB8fCBcCi0gICBSR0JfUkVEID09IFJHQl9HUkVFTiB8fCBSR0JfR1JFRU4gPT0gUkdCX0JMVUUgfHwgUkdCX1JFRCA9PSBSR0JfQkxVRQotJWVycm9yICJJbmNvcnJlY3QgUkdCIHBpeGVsIG9mZnNldC4iCi0lZW5kaWYKLQotJWlmIFJHQl9SRUQgPT0gMAotJWRlZmluZSAgbW1BICBtbTAKLSVkZWZpbmUgIG1tQiAgbW0xCi0lZGVmaW5lIHhtbUEgeG1tMAotJWRlZmluZSB4bW1CIHhtbTEKLSVlbGlmIFJHQl9HUkVFTiA9PSAwCi0lZGVmaW5lICBtbUEgIG1tMgotJWRlZmluZSAgbW1CICBtbTMKLSVkZWZpbmUgeG1tQSB4bW0yCi0lZGVmaW5lIHhtbUIgeG1tMwotJWVsaWYgUkdCX0JMVUUgPT0gMAotJWRlZmluZSAgbW1BICBtbTQKLSVkZWZpbmUgIG1tQiAgbW01Ci0lZGVmaW5lIHhtbUEgeG1tNAotJWRlZmluZSB4bW1CIHhtbTUKLSVlbHNlCi0lZGVmaW5lICBtbUEgIG1tNgotJWRlZmluZSAgbW1CICBtbTcKLSVkZWZpbmUgeG1tQSB4bW02Ci0lZGVmaW5lIHhtbUIgeG1tNwotJWVuZGlmCi0KLSVpZiBSR0JfUkVEID09IDEKLSVkZWZpbmUgIG1tQyAgbW0wCi0lZGVmaW5lICBtbUQgIG1tMQotJWRlZmluZSB4bW1DIHhtbTAKLSVkZWZpbmUgeG1tRCB4bW0xCi0lZWxpZiBSR0JfR1JFRU4gPT0gMQotJWRlZmluZSAgbW1DICBtbTIKLSVkZWZpbmUgIG1tRCAgbW0zCi0lZGVmaW5lIHhtbUMgeG1tMgotJWRlZmluZSB4bW1EIHhtbTMKLSVlbGlmIFJHQl9CTFVFID09IDEKLSVkZWZpbmUgIG1tQyAgbW00Ci0lZGVmaW5lICBtbUQgIG1tNQotJWRlZmluZSB4bW1DIHhtbTQKLSVkZWZpbmUgeG1tRCB4bW01Ci0lZWxzZQotJWRlZmluZSAgbW1DICBtbTYKLSVkZWZpbmUgIG1tRCAgbW03Ci0lZGVmaW5lIHhtbUMgeG1tNgotJWRlZmluZSB4bW1EIHhtbTcKLSVlbmRpZgotCi0laWYgUkdCX1JFRCA9PSAyCi0lZGVmaW5lICBtbUUgIG1tMAotJWRlZmluZSAgbW1GICBtbTEKLSVkZWZpbmUgeG1tRSB4bW0wCi0lZGVmaW5lIHhtbUYgeG1tMQotJWVsaWYgUkdCX0dSRUVOID09IDIKLSVkZWZpbmUgIG1tRSAgbW0yCi0lZGVmaW5lICBtbUYgIG1tMwotJWRlZmluZSB4bW1FIHhtbTIKLSVkZWZpbmUgeG1tRiB4bW0zCi0lZWxpZiBSR0JfQkxVRSA9PSAyCi0lZGVmaW5lICBtbUUgIG1tNAotJWRlZmluZSAgbW1GICBtbTUKLSVkZWZpbmUgeG1tRSB4bW00Ci0lZGVmaW5lIHhtbUYgeG1tNQotJWVsc2UKLSVkZWZpbmUgIG1tRSAgbW02Ci0lZGVmaW5lICBtbUYgIG1tNwotJWRlZmluZSB4bW1FIHhtbTYKLSVkZWZpbmUgeG1tRiB4bW03Ci0lZW5kaWYKLQotJWlmIFJHQl9SRUQgPT0gMwotJWRlZmluZSAgbW1HICBtbTAKLSVkZWZpbmUgIG1tSCAgbW0xCi0lZGVmaW5lIHhtbUcgeG1tMAotJWRlZmluZSB4bW1IIHhtbTEKLSVlbGlmIFJHQl9HUkVFTiA9PSAzCi0lZGVmaW5lICBtbUcgIG1tMgotJWRlZmluZSAgbW1IICBtbTMKLSVkZWZpbmUgeG1tRyB4bW0yCi0lZGVmaW5lIHhtbUggeG1tMwotJWVsaWYgUkdCX0JMVUUgPT0gMwotJWRlZmluZSAgbW1HICBtbTQKLSVkZWZpbmUgIG1tSCAgbW01Ci0lZGVmaW5lIHhtbUcgeG1tNAotJWRlZmluZSB4bW1IIHhtbTUKLSVlbHNlCi0lZGVmaW5lICBtbUcgIG1tNgotJWRlZmluZSAgbW1IICBtbTcKLSVkZWZpbmUgeG1tRyB4bW02Ci0lZGVmaW5lIHhtbUggeG1tNwotJWVuZGlmCi0lZW5kaWYgOyBSR0JfUElYRUxTSVpFID09IDMgfHwgUkdCX1BJWEVMU0laRSA9PSA0Ci0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2pjb21hcGkuYyBiL2pjb21hcGkuYwppbmRleCBlNDIzNWMwLi45YjFmYTc1IDEwMDY0NAotLS0gYS9qY29tYXBpLmMKKysrIGIvamNvbWFwaS5jCkBAIC01LDEzICs1LDYgQEAKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi0gKiBUaGlzIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgZm9yIFNJTUQgZXh0ZW5zaW9uLgotICogTGFzdCBNb2RpZmllZCA6IE1hcmNoIDExLCAyMDA1Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCiAgKiBUaGlzIGZpbGUgY29udGFpbnMgYXBwbGljYXRpb24gaW50ZXJmYWNlIHJvdXRpbmVzIHRoYXQgYXJlIHVzZWQgZm9yIGJvdGgKICAqIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLgogICovCkBAIC0xMTEsNTQgKzEwNCwzIEBACiAgIHRibC0+c2VudF90YWJsZSA9IEZBTFNFOwkvKiBtYWtlIHN1cmUgdGhpcyBpcyBmYWxzZSBpbiBhbnkgbmV3IHRhYmxlICovCiAgIHJldHVybiB0Ymw7CiB9Ci0KLQotLyoKLSAqIFNJTUQgRXh0OiBDaGVja2luZyBmb3Igc3VwcG9ydCBvZiBTSU1EIGluc3RydWN0aW9uIHNldC4KLSAqLwotCi1HTE9CQUwodW5zaWduZWQgaW50KQotanBlZ19zaW1kX3N1cHBvcnQgKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgZW51bSB7IEpTSU1EX0lOVkFMSUQgPSB+MCB9OwotICBzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgaW50IHNpbWRfc3VwcG9ydGVkID0gSlNJTURfSU5WQUxJRDsKLQotICBpZiAoc2ltZF9zdXBwb3J0ZWQgPT0gSlNJTURfSU5WQUxJRCkKLSAgICBzaW1kX3N1cHBvcnRlZCA9IGpwZWdfc2ltZF9vc19zdXBwb3J0KGpwZWdfc2ltZF9jcHVfc3VwcG9ydCgpKTsKLQotI2lmbmRlZiBKU0lNRF9NQVNLRlVOQ19OT1RfU1VQUE9SVEVECi0gIGlmIChjaW5mbyAhPSBOVUxMKQkvKiBUdXJuIG9mZiB0aGUgbWFza2VkIGZsYWdzICovCi0gICAgcmV0dXJuIHNpbWRfc3VwcG9ydGVkICYgfmpwZWdfc2ltZF9tYXNrKGNpbmZvLCBKU0lNRF9OT05FLCBKU0lNRF9OT05FKTsKLSNlbmRpZgotICByZXR1cm4gc2ltZF9zdXBwb3J0ZWQ7Ci19Ci0KLSNpZm5kZWYgSlNJTURfTUFTS0ZVTkNfTk9UX1NVUFBPUlRFRAotCi0vKgotICogU0lNRCBFeHQ6IG1vZGlmeS9yZXRyaWV2ZSBTSU1EIGluc3RydWN0aW9uIG1hc2sKLSAqLwotCi1HTE9CQUwodW5zaWduZWQgaW50KQotanBlZ19zaW1kX21hc2sgKGpfY29tbW9uX3B0ciBjaW5mbywgdW5zaWduZWQgaW50IHJlbW92ZSwgdW5zaWduZWQgaW50IGFkZCkKLXsKLSAgdW5zaWduZWQgbG9uZyAqZ3A7Ci0gIHVuc2lnbmVkIGludCBvbGRtYXNrOwotCi0gIGlmIChjaW5mby0+aXNfZGVjb21wcmVzc29yKQotICAgIGdwID0gKHVuc2lnbmVkIGxvbmcgKikgJigoal9kZWNvbXByZXNzX3B0cikgY2luZm8pLT5vdXRwdXRfZ2FtbWE7Ci0gIGVsc2UJLyogY29tcHJlc3NvciAqLwotICAgIGdwID0gKHVuc2lnbmVkIGxvbmcgKikgJigoal9jb21wcmVzc19wdHIpIGNpbmZvKS0+aW5wdXRfZ2FtbWE7Ci0KLSAgaWYgKChncFsxXSA9PSAweDNGRjAwMDAwIHx8IGdwWzFdID09IDB4MDAwMDAwMDApICYmCS8qICsxLjAgb3IgKzAuMCAqLwotICAgICAgKGdwWzBdICYgfkpTSU1EX0FMTCkgPT0gMCkgewotICAgIG9sZG1hc2sgPSBncFswXTsKLSAgICBpZiAoKChyZW1vdmUgfCBhZGQpICYgfkpTSU1EX0FMTCkgPT0gMCkKLSAgICAgIGdwWzBdID0gKG9sZG1hc2sgJiB+cmVtb3ZlKSB8IGFkZDsKLSAgfSBlbHNlIHsKLSAgICBvbGRtYXNrID0gMDsJLyogZXJyb3IgKi8KLSAgfQotICByZXR1cm4gb2xkbWFzazsKLX0KLQotI2VuZGlmIC8qICFKU0lNRF9NQVNLRlVOQ19OT1RfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qY29uZmlnLmJjNSBiL2pjb25maWcuYmM1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGMzMDlkLi4wMDAwMDAwCi0tLSBhL2pjb25maWcuYmM1CisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogamNvbmZpZy5iYzUgLS0tIGpjb25maWcuaCBmb3IgQm9ybGFuZCBDKysgQ29tcGlsZXIgNS41ICh3aW4zMikgKi8KLS8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCi0KLSNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgotI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCi0vKiAjZGVmaW5lIHZvaWQgY2hhciAqLwotLyogI2RlZmluZSBjb25zdCAqLwotI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKLSNkZWZpbmUgSEFWRV9TVERERUZfSAotI2RlZmluZSBIQVZFX1NURExJQl9ICi0jdW5kZWYgTkVFRF9CU0RfU1RSSU5HUwotI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKLSN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUwkvKiB3ZSBwcmVzdW1lIGEgMzItYml0IGZsYXQgbWVtb3J5IG1vZGVsICovCi0jdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCS8qIHRoaXMgYXNzdW1lcyB5b3UgaGF2ZSAtdy1zdHUgaW4gQ0ZMQUdTICovCi0KLS8qIERlZmluZSAiYm9vbGVhbiIgYXMgdW5zaWduZWQgY2hhciwgbm90IGludCwgcGVyIFdpbmRvd3MgY3VzdG9tICovCi0jZGVmaW5lIFRZUEVERUZfVUNIQVJfQk9PTEVBTgotCi0jaWZkZWYgSlBFR19JTlRFUk5BTFMKLQotI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECi0KLSNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLwotCi0jaWYgZGVmaW5lZChKUEVHX0lOVEVSTkFMUykgfHwgZGVmaW5lZChKUEVHX0lOVEVSTkFMX09QVElPTlMpCi0jdW5kZWYgSlNJTURfTU1YX05PVF9TVVBQT1JURUQKLSN1bmRlZiBKU0lNRF8zRE5PV19OT1RfU1VQUE9SVEVECi0jdW5kZWYgSlNJTURfU1NFX05PVF9TVVBQT1JURUQKLSN1bmRlZiBKU0lNRF9TU0UyX05PVF9TVVBQT1JURUQKLSNlbmRpZgotCi0jaWZkZWYgSlBFR19DSlBFR19ESlBFRwotCi0jZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotCi0jZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCi0jZGVmaW5lIFVTRV9TRVRNT0RFCQkvKiBCb3JsYW5kIGhhcyBzZXRtb2RlKCkgKi8KLSN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCS8qIERlZmluZSB0aGlzIGlmIHlvdSB1c2Ugam1lbW5hbWUuYyAqLwotI3VuZGVmIERPTlRfVVNFX0JfTU9ERQotI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KLQotI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2pjb25maWcuY2ZnIGIvamNvbmZpZy5jZmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0N2NiNmIuLjAwMDAwMDAKLS0tIGEvamNvbmZpZy5jZmcKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKiBqY29uZmlnLmNmZyAtLS0gc291cmNlIGZpbGUgZWRpdGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHQgKi8KLS8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCi0KLSN1bmRlZiBIQVZFX1BST1RPVFlQRVMKLSN1bmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKLSN1bmRlZiBIQVZFX1VOU0lHTkVEX1NIT1JUCi0jdW5kZWYgdm9pZAotI3VuZGVmIGNvbnN0Ci0jdW5kZWYgQ0hBUl9JU19VTlNJR05FRAotI3VuZGVmIEhBVkVfU1REREVGX0gKLSN1bmRlZiBIQVZFX1NURExJQl9ICi0jdW5kZWYgTkVFRF9CU0RfU1RSSU5HUwotI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKLSN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUwotI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLS8qIERlZmluZSB0aGlzIGlmIHlvdSBnZXQgd2FybmluZ3MgYWJvdXQgdW5kZWZpbmVkIHN0cnVjdHVyZXMuICovCi0jdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLQotLyogRGVmaW5lICJib29sZWFuIiBhcyB1bnNpZ25lZCBjaGFyLCBub3QgaW50LCBwZXIgV2luZG93cyBjdXN0b20gKi8KLSN1bmRlZiBUWVBFREVGX1VDSEFSX0JPT0xFQU4KLQotI2lmZGVmIEpQRUdfSU5URVJOQUxTCi0KLSN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotI3VuZGVmIElOTElORQotLyogVGhlc2UgYXJlIGZvciBjb25maWd1cmluZyB0aGUgSlBFRyBtZW1vcnkgbWFuYWdlci4gKi8KLSN1bmRlZiBERUZBVUxUX01BWF9NRU0KLSN1bmRlZiBOT19NS1RFTVAKLQotI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCi0KLSNpZiBkZWZpbmVkKEpQRUdfSU5URVJOQUxTKSB8fCBkZWZpbmVkKEpQRUdfSU5URVJOQUxfT1BUSU9OUykKLSN1bmRlZiBKU0lNRF9NTVhfTk9UX1NVUFBPUlRFRAotI3VuZGVmIEpTSU1EXzNETk9XX05PVF9TVVBQT1JURUQKLSN1bmRlZiBKU0lNRF9TU0VfTk9UX1NVUFBPUlRFRAotI3VuZGVmIEpTSU1EX1NTRTJfTk9UX1NVUFBPUlRFRAotI2VuZGlmCi0KLSNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCi0KLSNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCi0KLSN1bmRlZiBUV09fRklMRV9DT01NQU5ETElORQotI3VuZGVmIFVTRV9TRVRNT0RFCi0jdW5kZWYgVVNFX0ZET1BFTgotI3VuZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKLSN1bmRlZiBET05UX1VTRV9CX01PREUKLQotLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgcGVyY2VudC1kb25lIHByb2dyZXNzIHJlcG9ydHMgZnJvbSBjanBlZy9kanBlZy4gKi8KLSN1bmRlZiBQUk9HUkVTU19SRVBPUlQKLQotI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2pjb25maWcuZGogYi9qY29uZmlnLmRqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWEyZTQ3Li4wMDAwMDAwCi0tLSBhL2pjb25maWcuZGoKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKiBqY29uZmlnLmRqIC0tLSBqY29uZmlnLmggZm9yIERKR1BQIChEZWxvcmllJ3MgR05VIEMgcG9ydCkgb24gTVMtRE9TLiAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KLQotI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKLS8qICNkZWZpbmUgdm9pZCBjaGFyICovCi0vKiAjZGVmaW5lIGNvbnN0ICovCi0jdW5kZWYgQ0hBUl9JU19VTlNJR05FRAotI2RlZmluZSBIQVZFX1NURERFRl9ICi0jZGVmaW5lIEhBVkVfU1RETElCX0gKLSN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCi0jdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAotI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCS8qIERKR1BQIHVzZXMgZmxhdCAzMi1iaXQgYWRkcmVzc2luZyAqLwotI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgotCi0jaWZkZWYgSlBFR19JTlRFUk5BTFMKLQotI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECi0KLSNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLwotCi0jaWYgZGVmaW5lZChKUEVHX0lOVEVSTkFMUykgfHwgZGVmaW5lZChKUEVHX0lOVEVSTkFMX09QVElPTlMpCi0jdW5kZWYgSlNJTURfTU1YX05PVF9TVVBQT1JURUQKLSN1bmRlZiBKU0lNRF8zRE5PV19OT1RfU1VQUE9SVEVECi0jdW5kZWYgSlNJTURfU1NFX05PVF9TVVBQT1JURUQKLSN1bmRlZiBKU0lNRF9TU0UyX05PVF9TVVBQT1JURUQKLSNlbmRpZgotCi0jaWZkZWYgSlBFR19DSlBFR19ESlBFRwotCi0jZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotCi0jdW5kZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUJLyogb3B0aW9uYWwgKi8KLSNkZWZpbmUgVVNFX1NFVE1PREUJCS8qIE5lZWRlZCB0byBtYWtlIG9uZS1maWxlIHN0eWxlIHdvcmsgaW4gREpHUFAgKi8KLSN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCS8qIERlZmluZSB0aGlzIGlmIHlvdSB1c2Ugam1lbW5hbWUuYyAqLwotI3VuZGVmIERPTlRfVVNFX0JfTU9ERQotI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KLQotI2RlZmluZSBGUkVFX01FTV9FU1RJTUFURQkwCS8qIGZvciBhbHRlcm5hdGUgY2pwZWcvZGpwZWcgKi8KLQotI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2pjb25maWcuaC5pbiBiL2pjb25maWcuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTVlODBlCi0tLSAvZGV2L251bGwKKysrIGIvamNvbmZpZy5oLmluCkBAIC0wLDAgKzEsNDkgQEAKKy8qIERlZmluZSBpZiB5b3VyIGNvbXBpbGVyIHN1cHBvcnRzIHByb3RvdHlwZXMgKi8KKyN1bmRlZiBIQVZFX1BST1RPVFlQRVMKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRkZWYuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERERUZfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGB1bnNpZ25lZCBjaGFyJy4gKi8KKyN1bmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHVuc2lnbmVkIHNob3J0Jy4gKi8KKyN1bmRlZiBIQVZFX1VOU0lHTkVEX1NIT1JUCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCB1c2UgY29tcGxldGUgdHlwZXMgKi8KKyN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgQlNELWxpa2UgYnplcm8gYW5kIGJjb3B5ICovCisjdW5kZWYgTkVFRF9CU0RfU1RSSU5HUworCisvKiBEZWZpbmUgaWYgeW91IG5lZWQgc2hvcnQgZnVuY3Rpb24gbmFtZXMgKi8KKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBzeXMvdHlwZXMuaCAqLworI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKKworLyogRGVmaW5lIGlmIHNoaWZ0IGlzIHVuc2lnbmVkICovCisjdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKKworLyogVXNlIGFjY2VsZXJhdGVkIFNJTUQgcm91dGluZXMuICovCisjdW5kZWYgV0lUSF9TSU1ECisKKy8qIERlZmluZSB0byAxIGlmIHR5cGUgYGNoYXInIGlzIHVuc2lnbmVkIGFuZCB5b3UgYXJlIG5vdCB1c2luZyBnY2MuICAqLworI2lmbmRlZiBfX0NIQVJfVU5TSUdORURfXworIyB1bmRlZiBfX0NIQVJfVU5TSUdORURfXworI2VuZGlmCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiBgY29uc3QnIGRvZXMgbm90IGNvbmZvcm0gdG8gQU5TSSBDLiAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBgX19pbmxpbmVfXycgb3IgYF9faW5saW5lJyBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlcgorICAgY2FsbHMgaXQsIG9yIHRvIG5vdGhpbmcgaWYgJ2lubGluZScgaXMgbm90IHN1cHBvcnRlZCB1bmRlciBhbnkgbmFtZS4gICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCisjdW5kZWYgaW5saW5lCisjZW5kaWYKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworI3VuZGVmIHNpemVfdApkaWZmIC0tZ2l0IGEvamNvbmZpZy5saW51eCBiL2pjb25maWcubGludXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMzhlZDUuLjAwMDAwMDAKLS0tIGEvamNvbmZpZy5saW51eAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIGpjb25maWcubGludXggLS0tIGpjb25maWcuaCBmb3IgTGludXggRUxGIHdpdGggZ2NjICovCi0vKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLwotCi0jZGVmaW5lIEhBVkVfUFJPVE9UWVBFUwotI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAotLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KLS8qICNkZWZpbmUgY29uc3QgKi8KLSN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECi0jZGVmaW5lIEhBVkVfU1REREVGX0gKLSNkZWZpbmUgSEFWRV9TVERMSUJfSAotI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKLSN1bmRlZiBORUVEX1NZU19UWVBFU19ICi0jdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKLSN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLQotI2lmZGVmIEpQRUdfSU5URVJOQUxTCi0KLSN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotCi0jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KLQotI2lmIGRlZmluZWQoSlBFR19JTlRFUk5BTFMpIHx8IGRlZmluZWQoSlBFR19JTlRFUk5BTF9PUFRJT05TKQotI3VuZGVmIEpTSU1EX01NWF9OT1RfU1VQUE9SVEVECi0jdW5kZWYgSlNJTURfM0ROT1dfTk9UX1NVUFBPUlRFRAotI3VuZGVmIEpTSU1EX1NTRV9OT1RfU1VQUE9SVEVECi0jdW5kZWYgSlNJTURfU1NFMl9OT1RfU1VQUE9SVEVECi0jZW5kaWYKLQotI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKLQotI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLQotI3VuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCi0jdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1uYW1lLmMgKi8KLSN1bmRlZiBET05UX1VTRV9CX01PREUKLSN1bmRlZiBQUk9HUkVTU19SRVBPUlQJCS8qIG9wdGlvbmFsICovCi0KLSNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS9qY29uZmlnLm1ndyBiL2pjb25maWcubWd3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2RmZTFkLi4wMDAwMDAwCi0tLSBhL2pjb25maWcubWd3CisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogamNvbmZpZy5tZ3cgLS0tIGpjb25maWcuaCBmb3IgTWluR1cgKi8KLS8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCi0KLSNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgotI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCi0vKiAjZGVmaW5lIHZvaWQgY2hhciAqLwotLyogI2RlZmluZSBjb25zdCAqLwotI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKLSNkZWZpbmUgSEFWRV9TVERERUZfSAotI2RlZmluZSBIQVZFX1NURExJQl9ICi0jdW5kZWYgTkVFRF9CU0RfU1RSSU5HUwotI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKLSN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUwotI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgotCi0vKiBEZWZpbmUgImJvb2xlYW4iIGFzIHVuc2lnbmVkIGNoYXIsIG5vdCBpbnQsIHBlciBXaW5kb3dzIGN1c3RvbSAqLwotI2RlZmluZSBUWVBFREVGX1VDSEFSX0JPT0xFQU4KLQotI2lmZGVmIEpQRUdfSU5URVJOQUxTCi0KLSN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotCi0jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KLQotI2lmIGRlZmluZWQoSlBFR19JTlRFUk5BTFMpIHx8IGRlZmluZWQoSlBFR19JTlRFUk5BTF9PUFRJT05TKQotI3VuZGVmIEpTSU1EX01NWF9OT1RfU1VQUE9SVEVECi0jdW5kZWYgSlNJTURfM0ROT1dfTk9UX1NVUFBPUlRFRAotI3VuZGVmIEpTSU1EX1NTRV9OT1RfU1VQUE9SVEVECi0jdW5kZWYgSlNJTURfU1NFMl9OT1RfU1VQUE9SVEVECi0jZW5kaWYKLQotI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKLQotI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLQotI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORQkvKiBvcHRpb25hbCAqLwotI2RlZmluZSBVU0VfU0VUTU9ERQkJLyogTWluR1cgaGFzIHNldG1vZGUoKSAqLwotI3VuZGVmIE5FRURfU0lHTkFMX0NBVENIRVIJLyogRGVmaW5lIHRoaXMgaWYgeW91IHVzZSBqbWVtbmFtZS5jICovCi0jdW5kZWYgRE9OVF9VU0VfQl9NT0RFCi0jdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLwotCi0jZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvamNwaHVmZi5jIGIvamNwaHVmZi5jCmluZGV4IDA3ZjkxNzguLjdiMjM1ZDcgMTAwNjQ0Ci0tLSBhL2pjcGh1ZmYuYworKysgYi9qY3BodWZmLmMKQEAgLTIyMyw3ICsyMjMsNyBAQAogICogYmV0d2VlbiBjYWxscywgc28gMjQgYml0cyBhcmUgc3VmZmljaWVudC4KICAqLwogCi1JTkxJTkUKK2lubGluZQogTE9DQUwodm9pZCkKIGVtaXRfYml0cyAocGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSwgdW5zaWduZWQgaW50IGNvZGUsIGludCBzaXplKQogLyogRW1pdCBzb21lIGJpdHMsIHVubGVzcyB3ZSBhcmUgaW4gZ2F0aGVyIG1vZGUgKi8KQEAgLTI3Niw3ICsyNzYsNyBAQAogICogRW1pdCAob3IganVzdCBjb3VudCkgYSBIdWZmbWFuIHN5bWJvbC4KICAqLwogCi1JTkxJTkUKK2lubGluZQogTE9DQUwodm9pZCkKIGVtaXRfc3ltYm9sIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBpbnQgdGJsX25vLCBpbnQgc3ltYm9sKQogewpkaWZmIC0tZ2l0IGEvamNxbnQzZG4uYXNtIGIvamNxbnQzZG4uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTk3ODU4Li4wMDAwMDAwCi0tLSBhL2pjcW50M2RuLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi07Ci07IGpjcW50M2RuLmFzbSAtIHNhbXBsZSBkYXRhIGNvbnZlcnNpb24gYW5kIHF1YW50aXphdGlvbiAoM0ROb3chICYgTU1YKQotOwotOyB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLTsgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KLTsgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGpzaW1kZXh0LmluYwotOwotOyBUaGlzIGZpbGUgc2hvdWxkIGJlIGFzc2VtYmxlZCB3aXRoIE5BU00gKE5ldHdpZGUgQXNzZW1ibGVyKSwKLTsgY2FuICpub3QqIGJlIGFzc2VtYmxlZCB3aXRoIE1pY3Jvc29mdCdzIE1BU00gb3IgYW55IGNvbXBhdGlibGUKLTsgYXNzZW1ibGVyIChpbmNsdWRpbmcgQm9ybGFuZCdzIFR1cmJvIEFzc2VtYmxlcikuCi07IE5BU00gaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL25hc20uc291cmNlZm9yZ2UubmV0LyBvcgotOyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD02MjA4Ci07Ci07IExhc3QgTW9kaWZpZWQgOiBKYW51YXJ5IDIzLCAyMDA2Ci07Ci07IFtUQUI4XQotCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotJWluY2x1ZGUgImpkY3QuaW5jIgotCi0laWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotJWlmZGVmIEpGRENUX0ZMVF8zRE5PV19NTVhfU1VQUE9SVEVECi0KLTsgVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCi07Ci0laWYgRENUU0laRSAhPSA4Ci0lZXJyb3IgIlNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiIKLSVlbmRpZgotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JU0VDVElPTglTRUdfVEVYVAotCUJJVFMJMzIKLTsKLTsgTG9hZCBkYXRhIGludG8gd29ya3NwYWNlLCBhcHBseWluZyB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24KLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfY29udnNhbXBfZmx0XzNkbm93IChKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgIEZBU1RfRkxPQVQgKiB3b3Jrc3BhY2UpOwotOwotCi0lZGVmaW5lIHNhbXBsZV9kYXRhCWVicCs4CQk7IEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEKLSVkZWZpbmUgc3RhcnRfY29sCWVicCsxMgkJOyBKRElNRU5TSU9OIHN0YXJ0X2NvbAotJWRlZmluZSB3b3Jrc3BhY2UJZWJwKzE2CQk7IEZBU1RfRkxPQVQgKiB3b3Jrc3BhY2UKLQotCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19jb252c2FtcF9mbHRfM2Rub3cpCi0KLUVYVE4oanBlZ19jb252c2FtcF9mbHRfM2Rub3cpOgotCXB1c2gJZWJwCi0JbW92CWVicCxlc3AKLQlwdXNoCWVieAotOwlwdXNoCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcHVzaAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcHVzaAllc2kKLQlwdXNoCWVkaQotCi0JcGNtcGVxdyAgbW03LG1tNwotCXBzbGx3ICAgIG1tNyw3Ci0JcGFja3Nzd2IgbW03LG1tNwkJOyBtbTcgPSBQQl9DRU5URVJKU0FNUExFICgweDgwODA4MC4uKQotCi0JbW92CWVzaSwgSlNBTVBBUlJBWSBbc2FtcGxlX2RhdGFdCTsgKEpTQU1QUk9XICopCi0JbW92CWVheCwgSkRJTUVOU0lPTiBbc3RhcnRfY29sXQotCW1vdgllZGksIFBPSU5URVIgW3dvcmtzcGFjZV0JOyAoRENURUxFTSAqKQotCW1vdgllY3gsIERDVFNJWkUvMgotCWFsaWdueAkxNiw3Ci0uY29udmxvb3A6Ci0JbW92CWVieCwgSlNBTVBST1cgW2VzaSswKlNJWkVPRl9KU0FNUFJPV10JOyAoSlNBTVBMRSAqKQotCW1vdgllZHgsIEpTQU1QUk9XIFtlc2krMSpTSVpFT0ZfSlNBTVBST1ddCTsgKEpTQU1QTEUgKikKLQotCW1vdnEJbW0wLCBNTVdPUkQgW2VieCtlYXgqU0laRU9GX0pTQU1QTEVdCi0JbW92cQltbTEsIE1NV09SRCBbZWR4K2VheCpTSVpFT0ZfSlNBTVBMRV0KLQotCXBzdWJiCW1tMCxtbTcJCQkJOyBtbTA9KDAxMjM0NTY3KQotCXBzdWJiCW1tMSxtbTcJCQkJOyBtbTE9KDg5QUJDREVGKQotCi0JcHVucGNrbGJ3IG1tMixtbTAJCQk7IG1tMj0oKjAqMSoyKjMpCi0JcHVucGNraGJ3IG1tMCxtbTAJCQk7IG1tMD0oKjQqNSo2KjcpCi0JcHVucGNrbGJ3IG1tMyxtbTEJCQk7IG1tMz0oKjgqOSpBKkIpCi0JcHVucGNraGJ3IG1tMSxtbTEJCQk7IG1tMT0oKkMqRCpFKkYpCi0KLQlwdW5wY2tsd2QgbW00LG1tMgkJCTsgbW00PSgqKiowKioqMSkKLQlwdW5wY2tod2QgbW0yLG1tMgkJCTsgbW0yPSgqKioyKioqMykKLQlwdW5wY2tsd2QgbW01LG1tMAkJCTsgbW01PSgqKio0KioqNSkKLQlwdW5wY2tod2QgbW0wLG1tMAkJCTsgbW0wPSgqKio2KioqNykKLQotCXBzcmFkCW1tNCwoRFdPUkRfQklULUJZVEVfQklUKQk7IG1tND0oMDEpCi0JcHNyYWQJbW0yLChEV09SRF9CSVQtQllURV9CSVQpCTsgbW0yPSgyMykKLQlwaTJmZAltbTQsbW00Ci0JcGkyZmQJbW0yLG1tMgotCXBzcmFkCW1tNSwoRFdPUkRfQklULUJZVEVfQklUKQk7IG1tNT0oNDUpCi0JcHNyYWQJbW0wLChEV09SRF9CSVQtQllURV9CSVQpCTsgbW0wPSg2NykKLQlwaTJmZAltbTUsbW01Ci0JcGkyZmQJbW0wLG1tMAotCi0JbW92cQlNTVdPUkQgW01NQkxPQ0soMCwwLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCBtbTQKLQltb3ZxCU1NV09SRCBbTU1CTE9DSygwLDEsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIG1tMgotCW1vdnEJTU1XT1JEIFtNTUJMT0NLKDAsMixlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgbW01Ci0JbW92cQlNTVdPUkQgW01NQkxPQ0soMCwzLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCBtbTAKLQotCXB1bnBja2x3ZCBtbTYsbW0zCQkJOyBtbTY9KCoqKjgqKio5KQotCXB1bnBja2h3ZCBtbTMsbW0zCQkJOyBtbTM9KCoqKkEqKipCKQotCXB1bnBja2x3ZCBtbTQsbW0xCQkJOyBtbTQ9KCoqKkMqKipEKQotCXB1bnBja2h3ZCBtbTEsbW0xCQkJOyBtbTE9KCoqKkUqKipGKQotCi0JcHNyYWQJbW02LChEV09SRF9CSVQtQllURV9CSVQpCTsgbW02PSg4OSkKLQlwc3JhZAltbTMsKERXT1JEX0JJVC1CWVRFX0JJVCkJOyBtbTM9KEFCKQotCXBpMmZkCW1tNixtbTYKLQlwaTJmZAltbTMsbW0zCi0JcHNyYWQJbW00LChEV09SRF9CSVQtQllURV9CSVQpCTsgbW00PShDRCkKLQlwc3JhZAltbTEsKERXT1JEX0JJVC1CWVRFX0JJVCkJOyBtbTE9KEVGKQotCXBpMmZkCW1tNCxtbTQKLQlwaTJmZAltbTEsbW0xCi0KLQltb3ZxCU1NV09SRCBbTU1CTE9DSygxLDAsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIG1tNgotCW1vdnEJTU1XT1JEIFtNTUJMT0NLKDEsMSxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgbW0zCi0JbW92cQlNTVdPUkQgW01NQkxPQ0soMSwyLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCBtbTQKLQltb3ZxCU1NV09SRCBbTU1CTE9DSygxLDMsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIG1tMQotCi0JYWRkCWVzaSwgYnl0ZSAyKlNJWkVPRl9KU0FNUFJPVwotCWFkZAllZGksIGJ5dGUgMipEQ1RTSVpFKlNJWkVPRl9GQVNUX0ZMT0FUCi0JZGVjCWVjeAotCWpuegluZWFyIC5jb252bG9vcAotCi0JZmVtbXMJCTsgZW1wdHkgTU1YLzNETm93ISBzdGF0ZQotCi0JcG9wCWVkaQotCXBvcAllc2kKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwb3AJZWJ4Ci0JcG9wCWVicAotCXJldAotCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsKLTsgUXVhbnRpemUvZGVzY2FsZSB0aGUgY29lZmZpY2llbnRzLCBhbmQgc3RvcmUgaW50byBjb2VmX2Jsb2NrCi07Ci07IEdMT0JBTCh2b2lkKQotOyBqcGVnX3F1YW50aXplX2ZsdF8zZG5vdyAoSkNPRUZQVFIgY29lZl9ibG9jaywgRkFTVF9GTE9BVCAqIGRpdmlzb3JzLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgRkFTVF9GTE9BVCAqIHdvcmtzcGFjZSk7Ci07Ci0KLSVkZWZpbmUgY29lZl9ibG9jawllYnArOAkJOyBKQ09FRlBUUiBjb2VmX2Jsb2NrCi0lZGVmaW5lIGRpdmlzb3JzCWVicCsxMgkJOyBGQVNUX0ZMT0FUICogZGl2aXNvcnMKLSVkZWZpbmUgd29ya3NwYWNlCWVicCsxNgkJOyBGQVNUX0ZMT0FUICogd29ya3NwYWNlCi0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfcXVhbnRpemVfZmx0XzNkbm93KQotCi1FWFROKGpwZWdfcXVhbnRpemVfZmx0XzNkbm93KToKLQlwdXNoCWVicAotCW1vdgllYnAsZXNwCi07CXB1c2gJZWJ4CQk7IHVudXNlZAotOwlwdXNoCWVjeAkJOyB1bnVzZWQKLTsJcHVzaAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcHVzaAllc2kKLQlwdXNoCWVkaQotCi0JbW92ICAgICAgIGVheCwgMHg0QjQwMDAwMAk7IChmbG9hdCkweDAwQzAwMDAwIChybmRpbnRfbWFnaWMpCi0JbW92ZCAgICAgIG1tNyxlYXgKLQlwdW5wY2tsZHEgbW03LG1tNwkJOyBtbTc9ezEyNTgyOTEyLjBGIDEyNTgyOTEyLjBGfQotCi0JbW92CWVzaSwgUE9JTlRFUiBbd29ya3NwYWNlXQotCW1vdgllZHgsIFBPSU5URVIgW2Rpdmlzb3JzXQotCW1vdgllZGksIEpDT0VGUFRSIFtjb2VmX2Jsb2NrXQotCW1vdgllYXgsIERDVFNJWkUyLzE2Ci0JYWxpZ254CTE2LDcKLS5xdWFudGxvb3A6Ci0JbW92cQltbTAsIE1NV09SRCBbTU1CTE9DSygwLDAsZXNpLFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQltb3ZxCW1tMSwgTU1XT1JEIFtNTUJMT0NLKDAsMSxlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCXBmbXVsCW1tMCwgTU1XT1JEIFtNTUJMT0NLKDAsMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCXBmbXVsCW1tMSwgTU1XT1JEIFtNTUJMT0NLKDAsMSxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCW1vdnEJbW0yLCBNTVdPUkQgW01NQkxPQ0soMCwyLGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92cQltbTMsIE1NV09SRCBbTU1CTE9DSygwLDMsZXNpLFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlwZm11bAltbTIsIE1NV09SRCBbTU1CTE9DSygwLDIsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlwZm11bAltbTMsIE1NV09SRCBbTU1CTE9DSygwLDMsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQotCXBmYWRkCW1tMCxtbTcJCQk7IG1tMD0oMDAgKiogMDEgKiopCi0JcGZhZGQJbW0xLG1tNwkJCTsgbW0xPSgwMiAqKiAwMyAqKikKLQlwZmFkZAltbTIsbW03CQkJOyBtbTA9KDA0ICoqIDA1ICoqKQotCXBmYWRkCW1tMyxtbTcJCQk7IG1tMT0oMDYgKiogMDcgKiopCi0KLQltb3ZxICAgICAgbW00LG1tMAotCXB1bnBja2x3ZCBtbTAsbW0xCQk7IG1tMD0oMDAgMDIgKiogKiopCi0JcHVucGNraHdkIG1tNCxtbTEJCTsgbW00PSgwMSAwMyAqKiAqKikKLQltb3ZxICAgICAgbW01LG1tMgotCXB1bnBja2x3ZCBtbTIsbW0zCQk7IG1tMj0oMDQgMDYgKiogKiopCi0JcHVucGNraHdkIG1tNSxtbTMJCTsgbW01PSgwNSAwNyAqKiAqKikKLQotCXB1bnBja2x3ZCBtbTAsbW00CQk7IG1tMD0oMDAgMDEgMDIgMDMpCi0JcHVucGNrbHdkIG1tMixtbTUJCTsgbW0yPSgwNCAwNSAwNiAwNykKLQotCW1vdnEJbW02LCBNTVdPUkQgW01NQkxPQ0soMSwwLGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92cQltbTEsIE1NV09SRCBbTU1CTE9DSygxLDEsZXNpLFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlwZm11bAltbTYsIE1NV09SRCBbTU1CTE9DSygxLDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlwZm11bAltbTEsIE1NV09SRCBbTU1CTE9DSygxLDEsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQltb3ZxCW1tMywgTU1XT1JEIFtNTUJMT0NLKDEsMixlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCW1vdnEJbW00LCBNTVdPUkQgW01NQkxPQ0soMSwzLGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JcGZtdWwJbW0zLCBNTVdPUkQgW01NQkxPQ0soMSwyLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JcGZtdWwJbW00LCBNTVdPUkQgW01NQkxPQ0soMSwzLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0KLQlwZmFkZAltbTYsbW03CQkJOyBtbTA9KDEwICoqIDExICoqKQotCXBmYWRkCW1tMSxtbTcJCQk7IG1tND0oMTIgKiogMTMgKiopCi0JcGZhZGQJbW0zLG1tNwkJCTsgbW0wPSgxNCAqKiAxNSAqKikKLQlwZmFkZAltbTQsbW03CQkJOyBtbTQ9KDE2ICoqIDE3ICoqKQotCi0JbW92cSAgICAgIG1tNSxtbTYKLQlwdW5wY2tsd2QgbW02LG1tMQkJOyBtbTY9KDEwIDEyICoqICoqKQotCXB1bnBja2h3ZCBtbTUsbW0xCQk7IG1tNT0oMTEgMTMgKiogKiopCi0JbW92cSAgICAgIG1tMSxtbTMKLQlwdW5wY2tsd2QgbW0zLG1tNAkJOyBtbTM9KDE0IDE2ICoqICoqKQotCXB1bnBja2h3ZCBtbTEsbW00CQk7IG1tMT0oMTUgMTcgKiogKiopCi0KLQlwdW5wY2tsd2QgbW02LG1tNQkJOyBtbTY9KDEwIDExIDEyIDEzKQotCXB1bnBja2x3ZCBtbTMsbW0xCQk7IG1tMz0oMTQgMTUgMTYgMTcpCi0KLQltb3ZxCU1NV09SRCBbTU1CTE9DSygwLDAsZWRpLFNJWkVPRl9KQ09FRildLCBtbTAKLQltb3ZxCU1NV09SRCBbTU1CTE9DSygwLDEsZWRpLFNJWkVPRl9KQ09FRildLCBtbTIKLQltb3ZxCU1NV09SRCBbTU1CTE9DSygxLDAsZWRpLFNJWkVPRl9KQ09FRildLCBtbTYKLQltb3ZxCU1NV09SRCBbTU1CTE9DSygxLDEsZWRpLFNJWkVPRl9KQ09FRildLCBtbTMKLQotCWFkZAllc2ksIGJ5dGUgMTYqU0laRU9GX0ZBU1RfRkxPQVQKLQlhZGQJZWR4LCBieXRlIDE2KlNJWkVPRl9GQVNUX0ZMT0FUCi0JYWRkCWVkaSwgYnl0ZSAxNipTSVpFT0ZfSkNPRUYKLQlkZWMJZWF4Ci0Jam56CW5lYXIgLnF1YW50bG9vcAotCi0JZmVtbXMJCTsgZW1wdHkgTU1YLzNETm93ISBzdGF0ZQotCi0JcG9wCWVkaQotCXBvcAllc2kKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyB1bnVzZWQKLTsJcG9wCWVieAkJOyB1bnVzZWQKLQlwb3AJZWJwCi0JcmV0Ci0KLSVlbmRpZiA7IEpGRENUX0ZMVF8zRE5PV19NTVhfU1VQUE9SVEVECi0lZW5kaWYgOyBEQ1RfRkxPQVRfU1VQUE9SVEVECmRpZmYgLS1naXQgYS9qY3FudGZsdC5hc20gYi9qY3FudGZsdC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MzFhMDYuLjAwMDAwMDAKLS0tIGEvamNxbnRmbHQuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLTsKLTsgamNxbnRmbHQuYXNtIC0gc2FtcGxlIGRhdGEgY29udmVyc2lvbiBhbmQgcXVhbnRpemF0aW9uIChub24tU0lNRCwgRlApCi07Ci07IHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotOyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgotOyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4ganNpbWRleHQuaW5jCi07Ci07IFRoaXMgZmlsZSBzaG91bGQgYmUgYXNzZW1ibGVkIHdpdGggTkFTTSAoTmV0d2lkZSBBc3NlbWJsZXIpLAotOyBjYW4gKm5vdCogYmUgYXNzZW1ibGVkIHdpdGggTWljcm9zb2Z0J3MgTUFTTSBvciBhbnkgY29tcGF0aWJsZQotOyBhc3NlbWJsZXIgKGluY2x1ZGluZyBCb3JsYW5kJ3MgVHVyYm8gQXNzZW1ibGVyKS4KLTsgTkFTTSBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vbmFzbS5zb3VyY2Vmb3JnZS5uZXQvIG9yCi07IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTYyMDgKLTsKLTsgTGFzdCBNb2RpZmllZCA6IE1hcmNoIDIxLCAyMDA0Ci07Ci07IFtUQUI4XQotCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotJWluY2x1ZGUgImpkY3QuaW5jIgotCi0laWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotCi07IFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotOwotJWlmIERDVFNJWkUgIT0gOAotJWVycm9yICJTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4iCi0lZW5kaWYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX1RFWFQKLQlCSVRTCTMyCi07Ci07IExvYWQgZGF0YSBpbnRvIHdvcmtzcGFjZSwgYXBwbHlpbmcgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uCi07Ci07IEdMT0JBTCh2b2lkKQotOyBqcGVnX2NvbnZzYW1wX2Zsb2F0IChKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCwKLTsgICAgICAgICAgICAgICAgICAgICAgRkFTVF9GTE9BVCAqIHdvcmtzcGFjZSk7Ci07Ci0KLSVkZWZpbmUgc2FtcGxlX2RhdGEJZWJwKzgJCTsgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YQotJWRlZmluZSBzdGFydF9jb2wJZWJwKzEyCQk7IEpESU1FTlNJT04gc3RhcnRfY29sCi0lZGVmaW5lIHdvcmtzcGFjZQllYnArMTYJCTsgRkFTVF9GTE9BVCAqIHdvcmtzcGFjZQotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2NvbnZzYW1wX2Zsb2F0KQotCi1FWFROKGpwZWdfY29udnNhbXBfZmxvYXQpOgotCXB1c2gJZWJwCi0JbW92CWVicCxlc3AKLQlwdXNoCWVieAotOwlwdXNoCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcHVzaAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcHVzaAllc2kKLQlwdXNoCWVkaQotCi0JbW92CWVzaSwgSlNBTVBBUlJBWSBbc2FtcGxlX2RhdGFdCTsgKEpTQU1QUk9XICopCi0JbW92CWVkaSwgUE9JTlRFUiBbd29ya3NwYWNlXQk7IChEQ1RFTEVNICopCi0JbW92CWVjeCwgRENUU0laRQotCWFsaWdueAkxNiw3Ci0uY29udmxvb3A6Ci0JbW92CWVieCwgSlNBTVBST1cgW2VzaV0JCTsgKEpTQU1QTEUgKikKLQlhZGQJZWJ4LCBKRElNRU5TSU9OIFtzdGFydF9jb2xdCi0KLSVhc3NpZ24gaSAwCTsgaT0wCi0lcmVwIDQJOyAtLSByZXBlYXQgNCB0aW1lcyAtLS0KLQl4b3IJZWF4LGVheAotCXhvcgllZHgsZWR4Ci0JbW92CWFsLCBKU0FNUExFIFtlYngrKGkrMCkqU0laRU9GX0pTQU1QTEVdCi0JbW92CWRsLCBKU0FNUExFIFtlYngrKGkrMSkqU0laRU9GX0pTQU1QTEVdCi0JYWRkCWVheCwgYnl0ZSAtQ0VOVEVSSlNBTVBMRQotCWFkZAllZHgsIGJ5dGUgLUNFTlRFUkpTQU1QTEUKLQlwdXNoCWVheAotCXB1c2gJZWR4Ci0lYXNzaWduIGkgaSsyCTsgaSs9MgotJWVuZHJlcAk7IC0tIHJlcGVhdCBlbmQgLS0tCi0KLQlmaWxkCUlOVDMyIFtlc3ArMCpTSVpFT0ZfSU5UMzJdCi0JZmlsZAlJTlQzMiBbZXNwKzEqU0laRU9GX0lOVDMyXQotCWZpbGQJSU5UMzIgW2VzcCsyKlNJWkVPRl9JTlQzMl0KLQlmaWxkCUlOVDMyIFtlc3ArMypTSVpFT0ZfSU5UMzJdCi0JZmlsZAlJTlQzMiBbZXNwKzQqU0laRU9GX0lOVDMyXQotCWZpbGQJSU5UMzIgW2VzcCs1KlNJWkVPRl9JTlQzMl0KLQlmaWxkCUlOVDMyIFtlc3ArNipTSVpFT0ZfSU5UMzJdCi0JZmlsZAlJTlQzMiBbZXNwKzcqU0laRU9GX0lOVDMyXQotCi0JYWRkCWVzcCwgYnl0ZSBEQ1RTSVpFKlNJWkVPRl9JTlQzMgotCi0JZnN0cAlGQVNUX0ZMT0FUIFtlZGkrMCpTSVpFT0ZfRkFTVF9GTE9BVF0KLQlmc3RwCUZBU1RfRkxPQVQgW2VkaSsxKlNJWkVPRl9GQVNUX0ZMT0FUXQotCWZzdHAJRkFTVF9GTE9BVCBbZWRpKzIqU0laRU9GX0ZBU1RfRkxPQVRdCi0JZnN0cAlGQVNUX0ZMT0FUIFtlZGkrMypTSVpFT0ZfRkFTVF9GTE9BVF0KLQlmc3RwCUZBU1RfRkxPQVQgW2VkaSs0KlNJWkVPRl9GQVNUX0ZMT0FUXQotCWZzdHAJRkFTVF9GTE9BVCBbZWRpKzUqU0laRU9GX0ZBU1RfRkxPQVRdCi0JZnN0cAlGQVNUX0ZMT0FUIFtlZGkrNipTSVpFT0ZfRkFTVF9GTE9BVF0KLQlmc3RwCUZBU1RfRkxPQVQgW2VkaSs3KlNJWkVPRl9GQVNUX0ZMT0FUXQotCi0JYWRkCWVzaSwgYnl0ZSBTSVpFT0ZfSlNBTVBST1cKLQlhZGQJZWRpLCBieXRlIERDVFNJWkUqU0laRU9GX0ZBU1RfRkxPQVQKLQlkZWMJZWN4Ci0Jam56CW5lYXIgLmNvbnZsb29wCi0KLQlwb3AJZWRpCi0JcG9wCWVzaQotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXBvcAllYngKLQlwb3AJZWJwCi0JcmV0Ci0KLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOwotOyBRdWFudGl6ZS9kZXNjYWxlIHRoZSBjb2VmZmljaWVudHMsIGFuZCBzdG9yZSBpbnRvIGNvZWZfYmxvY2sKLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfcXVhbnRpemVfZmxvYXQgKEpDT0VGUFRSIGNvZWZfYmxvY2ssIEZBU1RfRkxPQVQgKiBkaXZpc29ycywKLTsgICAgICAgICAgICAgICAgICAgICAgRkFTVF9GTE9BVCAqIHdvcmtzcGFjZSk7Ci07Ci0KLSVkZWZpbmUgY29lZl9ibG9jawllYnArOAkJOyBKQ09FRlBUUiBjb2VmX2Jsb2NrCi0lZGVmaW5lIGRpdmlzb3JzCWVicCsxMgkJOyBGQVNUX0ZMT0FUICogZGl2aXNvcnMKLSVkZWZpbmUgd29ya3NwYWNlCWVicCsxNgkJOyBGQVNUX0ZMT0FUICogd29ya3NwYWNlCi0KLSVkZWZpbmUgRkxUX1JPVU5EUwkxCQk7IGZyb20gPGZsb2F0Lmg+Ci0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfcXVhbnRpemVfZmxvYXQpCi0KLUVYVE4oanBlZ19xdWFudGl6ZV9mbG9hdCk6Ci0JcHVzaAllYnAKLQltb3YJZWJwLGVzcAotCXB1c2gJZWJ4Ci07CXB1c2gJZWN4CQk7IHVudXNlZAotOwlwdXNoCWVkeAkJOyB1bnVzZWQKLQlwdXNoCWVzaQotCXB1c2gJZWRpCi0KLSVpZiAoRkxUX1JPVU5EUyAhPSAxKQotCXB1c2gJZWF4Ci0JZm5zdGN3CXdvcmQgW2VzcF0KLQltb3YJZWF4LCBbZXNwXQotCWFuZAllYXgsICh+MHgwQzAwKQkJOyByb3VuZCB0byBuZWFyZXN0IGludGVnZXIKLQlwdXNoCWVheAotCWZsZGN3CXdvcmQgW2VzcF0KLQlwb3AJZWF4Ci0lZW5kaWYKLQltb3YJZXNpLCBQT0lOVEVSIFt3b3Jrc3BhY2VdCi0JbW92CWVieCwgUE9JTlRFUiBbZGl2aXNvcnNdCi0JbW92CWVkaSwgSkNPRUZQVFIgW2NvZWZfYmxvY2tdCi0JbW92CWVheCwgRENUU0laRTIvOAotCWFsaWdueAkxNiw3Ci0ucXVhbnRsb29wOgotCWZsZAlGQVNUX0ZMT0FUIFtlc2krMCpTSVpFT0ZfRkFTVF9GTE9BVF0KLQlmbXVsCUZBU1RfRkxPQVQgW2VieCswKlNJWkVPRl9GQVNUX0ZMT0FUXQotCWZsZAlGQVNUX0ZMT0FUIFtlc2krMSpTSVpFT0ZfRkFTVF9GTE9BVF0KLQlmbXVsCUZBU1RfRkxPQVQgW2VieCsxKlNJWkVPRl9GQVNUX0ZMT0FUXQotCWZsZAlGQVNUX0ZMT0FUIFtlc2krMipTSVpFT0ZfRkFTVF9GTE9BVF0KLQlmbXVsCUZBU1RfRkxPQVQgW2VieCsyKlNJWkVPRl9GQVNUX0ZMT0FUXQotCWZsZAlGQVNUX0ZMT0FUIFtlc2krMypTSVpFT0ZfRkFTVF9GTE9BVF0KLQlmbXVsCUZBU1RfRkxPQVQgW2VieCszKlNJWkVPRl9GQVNUX0ZMT0FUXQotCi0JZmxkCUZBU1RfRkxPQVQgW2VzaSs0KlNJWkVPRl9GQVNUX0ZMT0FUXQotCWZtdWwJRkFTVF9GTE9BVCBbZWJ4KzQqU0laRU9GX0ZBU1RfRkxPQVRdCi0JZnhjaAlzdDAsc3QxCi0JZmxkCUZBU1RfRkxPQVQgW2VzaSs1KlNJWkVPRl9GQVNUX0ZMT0FUXQotCWZtdWwJRkFTVF9GTE9BVCBbZWJ4KzUqU0laRU9GX0ZBU1RfRkxPQVRdCi0JZnhjaAlzdDAsc3QzCi0JZmxkCUZBU1RfRkxPQVQgW2VzaSs2KlNJWkVPRl9GQVNUX0ZMT0FUXQotCWZtdWwJRkFTVF9GTE9BVCBbZWJ4KzYqU0laRU9GX0ZBU1RfRkxPQVRdCi0JZnhjaAlzdDAsc3Q1Ci0JZmxkCUZBU1RfRkxPQVQgW2VzaSs3KlNJWkVPRl9GQVNUX0ZMT0FUXQotCWZtdWwJRkFTVF9GTE9BVCBbZWJ4KzcqU0laRU9GX0ZBU1RfRkxPQVRdCi0JZnhjaAlzdDAsc3Q3Ci0KLQlmaXN0cAlKQ09FRiBbZWRpKzAqU0laRU9GX0pDT0VGXQotCWZpc3RwCUpDT0VGIFtlZGkrMSpTSVpFT0ZfSkNPRUZdCi0JZmlzdHAJSkNPRUYgW2VkaSsyKlNJWkVPRl9KQ09FRl0KLQlmaXN0cAlKQ09FRiBbZWRpKzMqU0laRU9GX0pDT0VGXQotCWZpc3RwCUpDT0VGIFtlZGkrNCpTSVpFT0ZfSkNPRUZdCi0JZmlzdHAJSkNPRUYgW2VkaSs1KlNJWkVPRl9KQ09FRl0KLQlmaXN0cAlKQ09FRiBbZWRpKzYqU0laRU9GX0pDT0VGXQotCWZpc3RwCUpDT0VGIFtlZGkrNypTSVpFT0ZfSkNPRUZdCi0KLQlhZGQJZXNpLCBieXRlIDgqU0laRU9GX0ZBU1RfRkxPQVQKLQlhZGQJZWJ4LCBieXRlIDgqU0laRU9GX0ZBU1RfRkxPQVQKLQlhZGQJZWRpLCBieXRlIDgqU0laRU9GX0pDT0VGCi0JZGVjCWVheAotCWpueglzaG9ydCAucXVhbnRsb29wCi0KLSVpZiAoRkxUX1JPVU5EUyAhPSAxKQotCWZsZGN3CXdvcmQgW2VzcF0KLQlwb3AJZWF4CQk7IHBvcCBvbGQgY29udHJvbCB3b3JkCi0lZW5kaWYKLQlwb3AJZWRpCi0JcG9wCWVzaQotOwlwb3AJZWR4CQk7IHVudXNlZAotOwlwb3AJZWN4CQk7IHVudXNlZAotCXBvcAllYngKLQlwb3AJZWJwCi0JcmV0Ci0KLSVlbmRpZiA7IERDVF9GTE9BVF9TVVBQT1JURUQKZGlmZiAtLWdpdCBhL2pjcW50aW50LmFzbSBiL2pjcW50aW50LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBkZTFjYi4uMDAwMDAwMAotLS0gYS9qY3FudGludC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotOwotOyBqY3FudGludC5hc20gLSBzYW1wbGUgZGF0YSBjb252ZXJzaW9uIGFuZCBxdWFudGl6YXRpb24gKG5vbi1TSU1ELCBpbnRlZ2VyKQotOwotOyB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLTsgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KLTsgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGpzaW1kZXh0LmluYwotOwotOyBUaGlzIGZpbGUgc2hvdWxkIGJlIGFzc2VtYmxlZCB3aXRoIE5BU00gKE5ldHdpZGUgQXNzZW1ibGVyKSwKLTsgY2FuICpub3QqIGJlIGFzc2VtYmxlZCB3aXRoIE1pY3Jvc29mdCdzIE1BU00gb3IgYW55IGNvbXBhdGlibGUKLTsgYXNzZW1ibGVyIChpbmNsdWRpbmcgQm9ybGFuZCdzIFR1cmJvIEFzc2VtYmxlcikuCi07IE5BU00gaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL25hc20uc291cmNlZm9yZ2UubmV0LyBvcgotOyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD02MjA4Ci07Ci07IExhc3QgTW9kaWZpZWQgOiBKYW51YXJ5IDI3LCAyMDA1Ci07Ci07IFtUQUI4XQotCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotJWluY2x1ZGUgImpkY3QuaW5jIgotCi07IFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotOwotJWlmIERDVFNJWkUgIT0gOAotJWVycm9yICJTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4iCi0lZW5kaWYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX1RFWFQKLQlCSVRTCTMyCi07Ci07IExvYWQgZGF0YSBpbnRvIHdvcmtzcGFjZSwgYXBwbHlpbmcgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uCi07Ci07IEdMT0JBTCh2b2lkKQotOyBqcGVnX2NvbnZzYW1wX2ludCAoSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wsCi07ICAgICAgICAgICAgICAgICAgICBEQ1RFTEVNICogd29ya3NwYWNlKTsKLTsKLQotJWRlZmluZSBzYW1wbGVfZGF0YQllYnArOAkJOyBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhCi0lZGVmaW5lIHN0YXJ0X2NvbAllYnArMTIJCTsgSkRJTUVOU0lPTiBzdGFydF9jb2wKLSVkZWZpbmUgd29ya3NwYWNlCWVicCsxNgkJOyBEQ1RFTEVNICogd29ya3NwYWNlCi0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfY29udnNhbXBfaW50KQotCi1FWFROKGpwZWdfY29udnNhbXBfaW50KToKLQlwdXNoCWVicAotCW1vdgllYnAsZXNwCi0JcHVzaAllYngKLTsJcHVzaAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXB1c2gJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXB1c2gJZXNpCi0JcHVzaAllZGkKLQotCW1vdgllc2ksIEpTQU1QQVJSQVkgW3NhbXBsZV9kYXRhXQk7IChKU0FNUFJPVyAqKQotCW1vdgllZGksIFBPSU5URVIgW3dvcmtzcGFjZV0JOyAoRENURUxFTSAqKQotCW1vdgllY3gsIERDVFNJWkUKLQlhbGlnbngJMTYsNwotLmNvbnZsb29wOgotCW1vdgllYngsIEpTQU1QUk9XIFtlc2ldCQk7IChKU0FNUExFICopCi0JYWRkCWVieCwgSkRJTUVOU0lPTiBbc3RhcnRfY29sXQotCi0lYXNzaWduIGkgMAk7IGk9MAotJXJlcCA0CTsgLS0gcmVwZWF0IDQgdGltZXMgLS0tCi0JeG9yCWVheCxlYXgKLQl4b3IJZWR4LGVkeAotCW1vdglhbCwgSlNBTVBMRSBbZWJ4KyhpKzApKlNJWkVPRl9KU0FNUExFXQotCW1vdglkbCwgSlNBTVBMRSBbZWJ4KyhpKzEpKlNJWkVPRl9KU0FNUExFXQotCWFkZAllYXgsIGJ5dGUgLUNFTlRFUkpTQU1QTEUKLQlhZGQJZWR4LCBieXRlIC1DRU5URVJKU0FNUExFCi0JbW92CURDVEVMRU0gW2VkaSsoaSswKSpTSVpFT0ZfRENURUxFTV0sIGF4Ci0JbW92CURDVEVMRU0gW2VkaSsoaSsxKSpTSVpFT0ZfRENURUxFTV0sIGR4Ci0lYXNzaWduIGkgaSsyCTsgaSs9MgotJWVuZHJlcAk7IC0tIHJlcGVhdCBlbmQgLS0tCi0KLQlhZGQJZXNpLCBieXRlIFNJWkVPRl9KU0FNUFJPVwotCWFkZAllZGksIGJ5dGUgRENUU0laRSpTSVpFT0ZfRENURUxFTQotCWRlYwllY3gKLQlqbnoJc2hvcnQgLmNvbnZsb29wCi0KLQlwb3AJZWRpCi0JcG9wCWVzaQotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXBvcAllYngKLQlwb3AJZWJwCi0JcmV0Ci0KLSVpZm5kZWYgSkZEQ1RfSU5UX1FVQU5USVpFX1dJVEhfRElWSVNJT04KLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOwotOyBRdWFudGl6ZS9kZXNjYWxlIHRoZSBjb2VmZmljaWVudHMsIGFuZCBzdG9yZSBpbnRvIGNvZWZfYmxvY2sKLTsKLTsgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBhbiBhbGdvcml0aG0gZGVzY3JpYmVkIGluCi07ICAgIkhvdyB0byBvcHRpbWl6ZSBmb3IgdGhlIFBlbnRpdW0gZmFtaWx5IG9mIG1pY3JvcHJvY2Vzc29ycyIKLTsgICAoaHR0cDovL3d3dy5hZ25lci5vcmcvYXNzZW0vKS4KLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfcXVhbnRpemVfaW50IChKQ09FRlBUUiBjb2VmX2Jsb2NrLCBEQ1RFTEVNICogZGl2aXNvcnMsCi07ICAgICAgICAgICAgICAgICAgICBEQ1RFTEVNICogd29ya3NwYWNlKTsKLTsKLQotJWRlZmluZSBSRUNJUFJPQ0FMKGksYikJKChiKSsoKGkpK0RDVFNJWkUyKjApKlNJWkVPRl9EQ1RFTEVNKQotJWRlZmluZSBDT1JSRUNUSU9OKGksYikJKChiKSsoKGkpK0RDVFNJWkUyKjEpKlNJWkVPRl9EQ1RFTEVNKQotJWRlZmluZSBTSElGVChpLGIpCSgoYikrKChpKStEQ1RTSVpFMiozKSpTSVpFT0ZfRENURUxFTSkKLQotJWRlZmluZSBjb2VmX2Jsb2NrCWVicCs4CQk7IEpDT0VGUFRSIGNvZWZfYmxvY2sKLSVkZWZpbmUgZGl2aXNvcnMJZWJwKzEyCQk7IERDVEVMRU0gKiBkaXZpc29ycwotJWRlZmluZSB3b3Jrc3BhY2UJZWJwKzE2CQk7IERDVEVMRU0gKiB3b3Jrc3BhY2UKLQotJWRlZmluZSBVTlJPTEwJMgotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX3F1YW50aXplX2ludCkKLQotRVhUTihqcGVnX3F1YW50aXplX2ludCk6Ci0JcHVzaAllYnAKLQltb3YJZWJwLGVzcAotCXB1c2gJZWJ4Ci07CXB1c2gJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwdXNoCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwdXNoCWVzaQotCXB1c2gJZWRpCi0KLQltb3YJZXNpLCBQT0lOVEVSIFt3b3Jrc3BhY2VdCi0JbW92CWVieCwgUE9JTlRFUiBbZGl2aXNvcnNdCi0JbW92CWVkaSwgSkNPRUZQVFIgW2NvZWZfYmxvY2tdCi0JbW92CWVjeCwgRENUU0laRTIvVU5ST0xMCi0JYWxpZ254CTE2LDcKLS5xdWFudGxvb3A6Ci0JcHVzaAllY3gKLQotJWFzc2lnbiBpIDAJOyBpPTA7Ci0lcmVwIFVOUk9MTAk7IC0tLS0gcmVwZWF0IChVTlJPTEwpIHRpbWVzIC0tLS0KLQltb3YJY3gsIERDVEVMRU0gW2VzaSsoaSkqU0laRU9GX0RDVEVMRU1dCi0JbW92CWF4LGN4Ci0Jc2FyCWN4LChXT1JEX0JJVC0xKQotCXhvcglheCxjeAkJOyBpZiAoYXggPCAwKSBheCA9IC1heDsKLQlzdWIJYXgsY3gKLQlhZGQJYXgsIERDVEVMRU0gW0NPUlJFQ1RJT04oaSxlYngpXQk7IGNvcnJlY3Rpb24gKyByb3VuZGZhY3RvcgotCXNobAlheCwxCi0JbXVsCURDVEVMRU0gW1JFQ0lQUk9DQUwoaSxlYngpXQk7IHJlY2lwcm9jYWwKLQltb3YJYXgsY3gKLQltb3YJY3gsIERDVEVMRU0gW1NISUZUKGksZWJ4KV0JOyBzaGlmdAotCXNocglkeCxjbAotCXhvcglkeCxheAotCXN1YglkeCxheAotCW1vdglKQ09FRiBbZWRpKyhpKSpTSVpFT0ZfSkNPRUZdLCBkeAotJWFzc2lnbiBpIGkrMQk7IGkrKzsKLSVlbmRyZXAJCTsgLS0tLSByZXBlYXQgZW5kIC0tLS0KLQotCXBvcAllY3gKLQotCWFkZAllc2ksIGJ5dGUgVU5ST0xMKlNJWkVPRl9EQ1RFTEVNCi0JYWRkCWVieCwgYnl0ZSBVTlJPTEwqU0laRU9GX0RDVEVMRU0KLQlhZGQJZWRpLCBieXRlIFVOUk9MTCpTSVpFT0ZfSkNPRUYKLQlkZWMJZWN4Ci0Jam56CS5xdWFudGxvb3AKLQotCXBvcAllZGkKLQlwb3AJZXNpCi07CXBvcAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXBvcAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcG9wCWVieAotCXBvcAllYnAKLQlyZXQKLQotJWVsc2UgOyBKRkRDVF9JTlRfUVVBTlRJWkVfV0lUSF9ESVZJU0lPTgotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ci07IFF1YW50aXplL2Rlc2NhbGUgdGhlIGNvZWZmaWNpZW50cywgYW5kIHN0b3JlIGludG8gY29lZl9ibG9jawotOwotOyBHTE9CQUwodm9pZCkKLTsganBlZ19xdWFudGl6ZV9pZGl2IChKQ09FRlBUUiBjb2VmX2Jsb2NrLCBEQ1RFTEVNICogZGl2aXNvcnMsCi07ICAgICAgICAgICAgICAgICAgICAgRENURUxFTSAqIHdvcmtzcGFjZSk7Ci07Ci0KLSVkZWZpbmUgY29lZl9ibG9jawllYnArOAkJOyBKQ09FRlBUUiBjb2VmX2Jsb2NrCi0lZGVmaW5lIGRpdmlzb3JzCWVicCsxMgkJOyBEQ1RFTEVNICogZGl2aXNvcnMKLSVkZWZpbmUgd29ya3NwYWNlCWVicCsxNgkJOyBEQ1RFTEVNICogd29ya3NwYWNlCi0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfcXVhbnRpemVfaWRpdikKLQotRVhUTihqcGVnX3F1YW50aXplX2lkaXYpOgotCXB1c2gJZWJwCi0JbW92CWVicCxlc3AKLQlwdXNoCWVieAotOwlwdXNoCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcHVzaAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcHVzaAllc2kKLQlwdXNoCWVkaQotCi0JbW92CWVzaSwgUE9JTlRFUiBbd29ya3NwYWNlXQotCW1vdgllYngsIFBPSU5URVIgW2Rpdmlzb3JzXQotCW1vdgllZGksIEpDT0VGUFRSIFtjb2VmX2Jsb2NrXQotCW1vdgllY3gsIERDVFNJWkUyCi0JYWxpZ254CTE2LDcKLS5xdWFudGxvb3A6Ci0JcHVzaAllY3gKLQotCW1vdnN4CWVjeCwgRENURUxFTSBbZXNpXQk7IHRlbXAKLQltb3YJZWF4LGVjeAotCXNhcgllY3gsKERXT1JEX0JJVC0xKQotCXhvcgllZHgsZWR4Ci0JbW92CWR4LCBEQ1RFTEVNIFtlYnhdCTsgcXZhbAotCXhvcgllYXgsZWN4CQkJOyBpZiAoZWF4IDwgMCkgZWF4ID0gLWVheDsKLQlzaHIJZWR4LDEKLQlzdWIJZWF4LGVjeAotCWNtcAllYXgsZWR4CQkJOyBpZiAodGVtcCArIHF2YWwvMiA+PSBxdmFsKQotCWpnZQlzaG9ydCAucXVhbnQKLQk7IC0tLS0gaWYgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudCBpcyB6ZXJvCi0JeG9yCWVheCxlYXgKLQlqbXAJc2hvcnQgLm91dHB1dAotCWFsaWdueAkxNiw3Ci0ucXVhbnQ6CTsgLS0tLSBkbyBxdWFudGl6YXRpb24KLQlhZGQJZWF4LGVkeAotCXhvcgllZHgsZWR4Ci0JZGl2CURDVEVMRU0gW2VieF0JCTsgUTpheCxSOmR4Ci0JeG9yCWF4LGN4Ci0Jc3ViCWF4LGN4Ci0JYWxpZ254CTE2LDcKLS5vdXRwdXQ6Ci0JbW92CUpDT0VGIFtlZGldLCBheAotCi0JcG9wCWVjeAotCi0JYWRkCWVzaSwgYnl0ZSBTSVpFT0ZfRENURUxFTQotCWFkZAllYngsIGJ5dGUgU0laRU9GX0RDVEVMRU0KLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9KQ09FRgotCWRlYwllY3gKLQlqbnoJc2hvcnQgLnF1YW50bG9vcAotCi0JcG9wCWVkaQotCXBvcAllc2kKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwb3AJZWJ4Ci0JcG9wCWVicAotCXJldAotCi0lZW5kaWYgOyAhSkZEQ1RfSU5UX1FVQU5USVpFX1dJVEhfRElWSVNJT04KZGlmZiAtLWdpdCBhL2pjcW50czJmLmFzbSBiL2pjcW50czJmLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFmNjYzZS4uMDAwMDAwMAotLS0gYS9qY3FudHMyZi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotOwotOyBqY3FudHMyZi5hc20gLSBzYW1wbGUgZGF0YSBjb252ZXJzaW9uIGFuZCBxdWFudGl6YXRpb24gKFNTRSAmIFNTRTIpCi07Ci07IHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotOyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgotOyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4ganNpbWRleHQuaW5jCi07Ci07IFRoaXMgZmlsZSBzaG91bGQgYmUgYXNzZW1ibGVkIHdpdGggTkFTTSAoTmV0d2lkZSBBc3NlbWJsZXIpLAotOyBjYW4gKm5vdCogYmUgYXNzZW1ibGVkIHdpdGggTWljcm9zb2Z0J3MgTUFTTSBvciBhbnkgY29tcGF0aWJsZQotOyBhc3NlbWJsZXIgKGluY2x1ZGluZyBCb3JsYW5kJ3MgVHVyYm8gQXNzZW1ibGVyKS4KLTsgTkFTTSBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vbmFzbS5zb3VyY2Vmb3JnZS5uZXQvIG9yCi07IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTYyMDgKLTsKLTsgTGFzdCBNb2RpZmllZCA6IEphbnVhcnkgMTgsIDIwMDUKLTsKLTsgW1RBQjhdCi0KLSVpbmNsdWRlICJqc2ltZGV4dC5pbmMiCi0laW5jbHVkZSAiamRjdC5pbmMiCi0KLSVpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0laWZkZWYgSkZEQ1RfRkxUX1NTRV9TU0UyX1NVUFBPUlRFRAotCi07IFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotOwotJWlmIERDVFNJWkUgIT0gOAotJWVycm9yICJTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4iCi0lZW5kaWYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX1RFWFQKLQlCSVRTCTMyCi07Ci07IExvYWQgZGF0YSBpbnRvIHdvcmtzcGFjZSwgYXBwbHlpbmcgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uCi07Ci07IEdMT0JBTCh2b2lkKQotOyBqcGVnX2NvbnZzYW1wX2ZsdF9zc2UyIChKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgRkFTVF9GTE9BVCAqIHdvcmtzcGFjZSk7Ci07Ci0KLSVkZWZpbmUgc2FtcGxlX2RhdGEJZWJwKzgJCTsgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YQotJWRlZmluZSBzdGFydF9jb2wJZWJwKzEyCQk7IEpESU1FTlNJT04gc3RhcnRfY29sCi0lZGVmaW5lIHdvcmtzcGFjZQllYnArMTYJCTsgRkFTVF9GTE9BVCAqIHdvcmtzcGFjZQotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2NvbnZzYW1wX2ZsdF9zc2UyKQotCi1FWFROKGpwZWdfY29udnNhbXBfZmx0X3NzZTIpOgotCXB1c2gJZWJwCi0JbW92CWVicCxlc3AKLQlwdXNoCWVieAotOwlwdXNoCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcHVzaAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcHVzaAllc2kKLQlwdXNoCWVkaQotCi0JcGNtcGVxdyAgeG1tNyx4bW03Ci0JcHNsbHcgICAgeG1tNyw3Ci0JcGFja3Nzd2IgeG1tNyx4bW03CQk7IHhtbTcgPSBQQl9DRU5URVJKU0FNUExFICgweDgwODA4MC4uKQotCi0JbW92CWVzaSwgSlNBTVBBUlJBWSBbc2FtcGxlX2RhdGFdCTsgKEpTQU1QUk9XICopCi0JbW92CWVheCwgSkRJTUVOU0lPTiBbc3RhcnRfY29sXQotCW1vdgllZGksIFBPSU5URVIgW3dvcmtzcGFjZV0JOyAoRENURUxFTSAqKQotCW1vdgllY3gsIERDVFNJWkUvMgotCWFsaWdueAkxNiw3Ci0uY29udmxvb3A6Ci0JbW92CWVieCwgSlNBTVBST1cgW2VzaSswKlNJWkVPRl9KU0FNUFJPV10JOyAoSlNBTVBMRSAqKQotCW1vdgllZHgsIEpTQU1QUk9XIFtlc2krMSpTSVpFT0ZfSlNBTVBST1ddCTsgKEpTQU1QTEUgKikKLQotCW1vdnEJeG1tMCwgX01NV09SRCBbZWJ4K2VheCpTSVpFT0ZfSlNBTVBMRV0KLQltb3ZxCXhtbTEsIF9NTVdPUkQgW2VkeCtlYXgqU0laRU9GX0pTQU1QTEVdCi0KLQlwc3ViYgl4bW0wLHhtbTcJCQk7IHhtbTA9KDAxMjM0NTY3KQotCXBzdWJiCXhtbTEseG1tNwkJCTsgeG1tMT0oODlBQkNERUYpCi0KLQlwdW5wY2tsYncgeG1tMCx4bW0wCQkJOyB4bW0wPSgqMCoxKjIqMyo0KjUqNio3KQotCXB1bnBja2xidyB4bW0xLHhtbTEJCQk7IHhtbTE9KCo4KjkqQSpCKkMqRCpFKkYpCi0KLQlwdW5wY2tsd2QgeG1tMix4bW0wCQkJOyB4bW0yPSgqKiowKioqMSoqKjIqKiozKQotCXB1bnBja2h3ZCB4bW0wLHhtbTAJCQk7IHhtbTA9KCoqKjQqKio1KioqNioqKjcpCi0JcHVucGNrbHdkIHhtbTMseG1tMQkJCTsgeG1tMz0oKioqOCoqKjkqKipBKioqQikKLQlwdW5wY2tod2QgeG1tMSx4bW0xCQkJOyB4bW0xPSgqKipDKioqRCoqKkUqKipGKQotCi0JcHNyYWQgICAgIHhtbTIsKERXT1JEX0JJVC1CWVRFX0JJVCkJOyB4bW0yPSgwMTIzKQotCXBzcmFkICAgICB4bW0wLChEV09SRF9CSVQtQllURV9CSVQpCTsgeG1tMD0oNDU2NykKLQljdnRkcTJwcyAgeG1tMix4bW0yCQkJOyB4bW0yPSgwMTIzKQotCWN2dGRxMnBzICB4bW0wLHhtbTAJCQk7IHhtbTA9KDQ1NjcpCi0JcHNyYWQgICAgIHhtbTMsKERXT1JEX0JJVC1CWVRFX0JJVCkJOyB4bW0zPSg4OUFCKQotCXBzcmFkICAgICB4bW0xLChEV09SRF9CSVQtQllURV9CSVQpCTsgeG1tMT0oQ0RFRikKLQljdnRkcTJwcyAgeG1tMyx4bW0zCQkJOyB4bW0zPSg4OUFCKQotCWN2dGRxMnBzICB4bW0xLHhtbTEJCQk7IHhtbTE9KENERUYpCi0KLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soMCwwLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW0yCi0JbW92YXBzCVhNTVdPUkQgW1hNTUJMT0NLKDAsMSxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgeG1tMAotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSygxLDAsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTMKLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soMSwxLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW0xCi0KLQlhZGQJZXNpLCBieXRlIDIqU0laRU9GX0pTQU1QUk9XCi0JYWRkCWVkaSwgYnl0ZSAyKkRDVFNJWkUqU0laRU9GX0ZBU1RfRkxPQVQKLQlkZWMJZWN4Ci0Jam56CXNob3J0IC5jb252bG9vcAotCi0JcG9wCWVkaQotCXBvcAllc2kKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwb3AJZWJ4Ci0JcG9wCWVicAotCXJldAotCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsKLTsgUXVhbnRpemUvZGVzY2FsZSB0aGUgY29lZmZpY2llbnRzLCBhbmQgc3RvcmUgaW50byBjb2VmX2Jsb2NrCi07Ci07IEdMT0JBTCh2b2lkKQotOyBqcGVnX3F1YW50aXplX2ZsdF9zc2UyIChKQ09FRlBUUiBjb2VmX2Jsb2NrLCBGQVNUX0ZMT0FUICogZGl2aXNvcnMsCi07ICAgICAgICAgICAgICAgICAgICAgICAgIEZBU1RfRkxPQVQgKiB3b3Jrc3BhY2UpOwotOwotCi0lZGVmaW5lIGNvZWZfYmxvY2sJZWJwKzgJCTsgSkNPRUZQVFIgY29lZl9ibG9jawotJWRlZmluZSBkaXZpc29ycwllYnArMTIJCTsgRkFTVF9GTE9BVCAqIGRpdmlzb3JzCi0lZGVmaW5lIHdvcmtzcGFjZQllYnArMTYJCTsgRkFTVF9GTE9BVCAqIHdvcmtzcGFjZQotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX3F1YW50aXplX2ZsdF9zc2UyKQotCi1FWFROKGpwZWdfcXVhbnRpemVfZmx0X3NzZTIpOgotCXB1c2gJZWJwCi0JbW92CWVicCxlc3AKLTsJcHVzaAllYngJCTsgdW51c2VkCi07CXB1c2gJZWN4CQk7IHVudXNlZAotOwlwdXNoCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwdXNoCWVzaQotCXB1c2gJZWRpCi0KLQltb3YJZXNpLCBQT0lOVEVSIFt3b3Jrc3BhY2VdCi0JbW92CWVkeCwgUE9JTlRFUiBbZGl2aXNvcnNdCi0JbW92CWVkaSwgSkNPRUZQVFIgW2NvZWZfYmxvY2tdCi0JbW92CWVheCwgRENUU0laRTIvMTYKLQlhbGlnbngJMTYsNwotLnF1YW50bG9vcDoKLQltb3ZhcHMJeG1tMCwgWE1NV09SRCBbWE1NQkxPQ0soMCwwLGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92YXBzCXhtbTEsIFhNTVdPUkQgW1hNTUJMT0NLKDAsMSxlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCW11bHBzCXhtbTAsIFhNTVdPUkQgW1hNTUJMT0NLKDAsMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCW11bHBzCXhtbTEsIFhNTVdPUkQgW1hNTUJMT0NLKDAsMSxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCW1vdmFwcwl4bW0yLCBYTU1XT1JEIFtYTU1CTE9DSygxLDAsZXNpLFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQltb3ZhcHMJeG1tMywgWE1NV09SRCBbWE1NQkxPQ0soMSwxLGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbXVscHMJeG1tMiwgWE1NV09SRCBbWE1NQkxPQ0soMSwwLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbXVscHMJeG1tMywgWE1NV09SRCBbWE1NQkxPQ0soMSwxLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0KLQljdnRwczJkcSB4bW0wLHhtbTAKLQljdnRwczJkcSB4bW0xLHhtbTEKLQljdnRwczJkcSB4bW0yLHhtbTIKLQljdnRwczJkcSB4bW0zLHhtbTMKLQotCXBhY2tzc2R3IHhtbTAseG1tMQotCXBhY2tzc2R3IHhtbTIseG1tMwotCi0JbW92ZHFhCVhNTVdPUkQgW1hNTUJMT0NLKDAsMCxlZGksU0laRU9GX0pDT0VGKV0sIHhtbTAKLQltb3ZkcWEJWE1NV09SRCBbWE1NQkxPQ0soMSwwLGVkaSxTSVpFT0ZfSkNPRUYpXSwgeG1tMgotCi0JYWRkCWVzaSwgYnl0ZSAxNipTSVpFT0ZfRkFTVF9GTE9BVAotCWFkZAllZHgsIGJ5dGUgMTYqU0laRU9GX0ZBU1RfRkxPQVQKLQlhZGQJZWRpLCBieXRlIDE2KlNJWkVPRl9KQ09FRgotCWRlYwllYXgKLQlqbnoJc2hvcnQgLnF1YW50bG9vcAotCi0JcG9wCWVkaQotCXBvcAllc2kKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyB1bnVzZWQKLTsJcG9wCWVieAkJOyB1bnVzZWQKLQlwb3AJZWJwCi0JcmV0Ci0KLSVlbmRpZiA7IEpGRENUX0ZMVF9TU0VfU1NFMl9TVVBQT1JURUQKLSVlbmRpZiA7IERDVF9GTE9BVF9TVVBQT1JURUQKZGlmZiAtLWdpdCBhL2pjcW50czJpLmFzbSBiL2pjcW50czJpLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFiYWUyYy4uMDAwMDAwMAotLS0gYS9qY3FudHMyaS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotOwotOyBqY3FudHMyaS5hc20gLSBzYW1wbGUgZGF0YSBjb252ZXJzaW9uIGFuZCBxdWFudGl6YXRpb24gKFNTRTIpCi07Ci07IHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotOyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgotOyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4ganNpbWRleHQuaW5jCi07Ci07IFRoaXMgZmlsZSBzaG91bGQgYmUgYXNzZW1ibGVkIHdpdGggTkFTTSAoTmV0d2lkZSBBc3NlbWJsZXIpLAotOyBjYW4gKm5vdCogYmUgYXNzZW1ibGVkIHdpdGggTWljcm9zb2Z0J3MgTUFTTSBvciBhbnkgY29tcGF0aWJsZQotOyBhc3NlbWJsZXIgKGluY2x1ZGluZyBCb3JsYW5kJ3MgVHVyYm8gQXNzZW1ibGVyKS4KLTsgTkFTTSBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vbmFzbS5zb3VyY2Vmb3JnZS5uZXQvIG9yCi07IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTYyMDgKLTsKLTsgTGFzdCBNb2RpZmllZCA6IEphbnVhcnkgMjcsIDIwMDUKLTsKLTsgW1RBQjhdCi0KLSVpbmNsdWRlICJqc2ltZGV4dC5pbmMiCi0laW5jbHVkZSAiamRjdC5pbmMiCi0KLSVpZmRlZiBKRkRDVF9JTlRfU1NFMl9TVVBQT1JURUQKLQotOyBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLTsKLSVpZiBEQ1RTSVpFICE9IDgKLSVlcnJvciAiU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIgotJWVuZGlmCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19URVhUCi0JQklUUwkzMgotOwotOyBMb2FkIGRhdGEgaW50byB3b3Jrc3BhY2UsIGFwcGx5aW5nIHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbgotOwotOyBHTE9CQUwodm9pZCkKLTsganBlZ19jb252c2FtcF9pbnRfc3NlMiAoSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wsCi07ICAgICAgICAgICAgICAgICAgICAgICAgIERDVEVMRU0gKiB3b3Jrc3BhY2UpOwotOwotCi0lZGVmaW5lIHNhbXBsZV9kYXRhCWVicCs4CQk7IEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEKLSVkZWZpbmUgc3RhcnRfY29sCWVicCsxMgkJOyBKRElNRU5TSU9OIHN0YXJ0X2NvbAotJWRlZmluZSB3b3Jrc3BhY2UJZWJwKzE2CQk7IERDVEVMRU0gKiB3b3Jrc3BhY2UKLQotCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19jb252c2FtcF9pbnRfc3NlMikKLQotRVhUTihqcGVnX2NvbnZzYW1wX2ludF9zc2UyKToKLQlwdXNoCWVicAotCW1vdgllYnAsZXNwCi0JcHVzaAllYngKLTsJcHVzaAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXB1c2gJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXB1c2gJZXNpCi0JcHVzaAllZGkKLQotCXB4b3IJeG1tNix4bW02CQk7IHhtbTY9KGFsbCAwJ3MpCi0JcGNtcGVxdwl4bW03LHhtbTcKLQlwc2xsdwl4bW03LDcJCQk7IHhtbTc9ezB4RkY4MCAweEZGODAgMHhGRjgwIDB4RkY4MCAuLn0KLQotCW1vdgllc2ksIEpTQU1QQVJSQVkgW3NhbXBsZV9kYXRhXQk7IChKU0FNUFJPVyAqKQotCW1vdgllYXgsIEpESU1FTlNJT04gW3N0YXJ0X2NvbF0KLQltb3YJZWRpLCBQT0lOVEVSIFt3b3Jrc3BhY2VdCTsgKERDVEVMRU0gKikKLQltb3YJZWN4LCBEQ1RTSVpFLzQKLQlhbGlnbngJMTYsNwotLmNvbnZsb29wOgotCW1vdgllYngsIEpTQU1QUk9XIFtlc2krMCpTSVpFT0ZfSlNBTVBST1ddCTsgKEpTQU1QTEUgKikKLQltb3YJZWR4LCBKU0FNUFJPVyBbZXNpKzEqU0laRU9GX0pTQU1QUk9XXQk7IChKU0FNUExFICopCi0KLQltb3ZxCXhtbTAsIF9NTVdPUkQgW2VieCtlYXgqU0laRU9GX0pTQU1QTEVdCTsgeG1tMD0oMDEyMzQ1NjcpCi0JbW92cQl4bW0xLCBfTU1XT1JEIFtlZHgrZWF4KlNJWkVPRl9KU0FNUExFXQk7IHhtbTE9KDg5QUJDREVGKQotCi0JbW92CWVieCwgSlNBTVBST1cgW2VzaSsyKlNJWkVPRl9KU0FNUFJPV10JOyAoSlNBTVBMRSAqKQotCW1vdgllZHgsIEpTQU1QUk9XIFtlc2krMypTSVpFT0ZfSlNBTVBST1ddCTsgKEpTQU1QTEUgKikKLQotCW1vdnEJeG1tMiwgX01NV09SRCBbZWJ4K2VheCpTSVpFT0ZfSlNBTVBMRV0JOyB4bW0yPShHSElKS0xNTikKLQltb3ZxCXhtbTMsIF9NTVdPUkQgW2VkeCtlYXgqU0laRU9GX0pTQU1QTEVdCTsgeG1tMz0oT1BRUlNUVVYpCi0KLQlwdW5wY2tsYncgeG1tMCx4bW02CQk7IHhtbTA9KDAxMjM0NTY3KQotCXB1bnBja2xidyB4bW0xLHhtbTYJCTsgeG1tMT0oODlBQkNERUYpCi0JcGFkZHcgICAgIHhtbTAseG1tNwotCXBhZGR3ICAgICB4bW0xLHhtbTcKLQlwdW5wY2tsYncgeG1tMix4bW02CQk7IHhtbTI9KEdISUpLTE1OKQotCXB1bnBja2xidyB4bW0zLHhtbTYJCTsgeG1tMz0oT1BRUlNUVVYpCi0JcGFkZHcgICAgIHhtbTIseG1tNwotCXBhZGR3ICAgICB4bW0zLHhtbTcKLQotCW1vdmRxYQlYTU1XT1JEIFtYTU1CTE9DSygwLDAsZWRpLFNJWkVPRl9EQ1RFTEVNKV0sIHhtbTAKLQltb3ZkcWEJWE1NV09SRCBbWE1NQkxPQ0soMSwwLGVkaSxTSVpFT0ZfRENURUxFTSldLCB4bW0xCi0JbW92ZHFhCVhNTVdPUkQgW1hNTUJMT0NLKDIsMCxlZGksU0laRU9GX0RDVEVMRU0pXSwgeG1tMgotCW1vdmRxYQlYTU1XT1JEIFtYTU1CTE9DSygzLDAsZWRpLFNJWkVPRl9EQ1RFTEVNKV0sIHhtbTMKLQotCWFkZAllc2ksIGJ5dGUgNCpTSVpFT0ZfSlNBTVBST1cKLQlhZGQJZWRpLCBieXRlIDQqRENUU0laRSpTSVpFT0ZfRENURUxFTQotCWRlYwllY3gKLQlqbnoJc2hvcnQgLmNvbnZsb29wCi0KLQlwb3AJZWRpCi0JcG9wCWVzaQotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXBvcAllYngKLQlwb3AJZWJwCi0JcmV0Ci0KLSVpZm5kZWYgSkZEQ1RfSU5UX1FVQU5USVpFX1dJVEhfRElWSVNJT04KLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOwotOyBRdWFudGl6ZS9kZXNjYWxlIHRoZSBjb2VmZmljaWVudHMsIGFuZCBzdG9yZSBpbnRvIGNvZWZfYmxvY2sKLTsKLTsgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBhbiBhbGdvcml0aG0gZGVzY3JpYmVkIGluCi07ICAgIkhvdyB0byBvcHRpbWl6ZSBmb3IgdGhlIFBlbnRpdW0gZmFtaWx5IG9mIG1pY3JvcHJvY2Vzc29ycyIKLTsgICAoaHR0cDovL3d3dy5hZ25lci5vcmcvYXNzZW0vKS4KLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfcXVhbnRpemVfaW50X3NzZTIgKEpDT0VGUFRSIGNvZWZfYmxvY2ssIERDVEVMRU0gKiBkaXZpc29ycywKLTsgICAgICAgICAgICAgICAgICAgICAgICAgRENURUxFTSAqIHdvcmtzcGFjZSk7Ci07Ci0KLSVkZWZpbmUgUkVDSVBST0NBTChtLG4sYikgWE1NQkxPQ0soRENUU0laRSowKyhtKSwobiksKGIpLFNJWkVPRl9EQ1RFTEVNKQotJWRlZmluZSBDT1JSRUNUSU9OKG0sbixiKSBYTU1CTE9DSyhEQ1RTSVpFKjErKG0pLChuKSwoYiksU0laRU9GX0RDVEVMRU0pCi0lZGVmaW5lIFNDQUxFKG0sbixiKSAgICAgIFhNTUJMT0NLKERDVFNJWkUqMisobSksKG4pLChiKSxTSVpFT0ZfRENURUxFTSkKLQotJWRlZmluZSBjb2VmX2Jsb2NrCWVicCs4CQk7IEpDT0VGUFRSIGNvZWZfYmxvY2sKLSVkZWZpbmUgZGl2aXNvcnMJZWJwKzEyCQk7IERDVEVMRU0gKiBkaXZpc29ycwotJWRlZmluZSB3b3Jrc3BhY2UJZWJwKzE2CQk7IERDVEVMRU0gKiB3b3Jrc3BhY2UKLQotCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19xdWFudGl6ZV9pbnRfc3NlMikKLQotRVhUTihqcGVnX3F1YW50aXplX2ludF9zc2UyKToKLQlwdXNoCWVicAotCW1vdgllYnAsZXNwCi07CXB1c2gJZWJ4CQk7IHVudXNlZAotOwlwdXNoCWVjeAkJOyB1bnVzZWQKLTsJcHVzaAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcHVzaAllc2kKLQlwdXNoCWVkaQotCi0JbW92CWVzaSwgUE9JTlRFUiBbd29ya3NwYWNlXQotCW1vdgllZHgsIFBPSU5URVIgW2Rpdmlzb3JzXQotCW1vdgllZGksIEpDT0VGUFRSIFtjb2VmX2Jsb2NrXQotCW1vdgllYXgsIERDVFNJWkUyLzMyCi0JYWxpZ254CTE2LDcKLS5xdWFudGxvb3A6Ci0JbW92ZHFhCXhtbTQsIFhNTVdPUkQgW1hNTUJMT0NLKDAsMCxlc2ksU0laRU9GX0RDVEVMRU0pXQotCW1vdmRxYQl4bW01LCBYTU1XT1JEIFtYTU1CTE9DSygxLDAsZXNpLFNJWkVPRl9EQ1RFTEVNKV0KLQltb3ZkcWEJeG1tNiwgWE1NV09SRCBbWE1NQkxPQ0soMiwwLGVzaSxTSVpFT0ZfRENURUxFTSldCi0JbW92ZHFhCXhtbTcsIFhNTVdPUkQgW1hNTUJMT0NLKDMsMCxlc2ksU0laRU9GX0RDVEVMRU0pXQotCW1vdmRxYQl4bW0wLHhtbTQKLQltb3ZkcWEJeG1tMSx4bW01Ci0JbW92ZHFhCXhtbTIseG1tNgotCW1vdmRxYQl4bW0zLHhtbTcKLQlwc3Jhdwl4bW00LChXT1JEX0JJVC0xKQotCXBzcmF3CXhtbTUsKFdPUkRfQklULTEpCi0JcHNyYXcJeG1tNiwoV09SRF9CSVQtMSkKLQlwc3Jhdwl4bW03LChXT1JEX0JJVC0xKQotCXB4b3IJeG1tMCx4bW00Ci0JcHhvcgl4bW0xLHhtbTUKLQlweG9yCXhtbTIseG1tNgotCXB4b3IJeG1tMyx4bW03Ci0JcHN1YncJeG1tMCx4bW00CQk7IGlmICh4bW0wIDwgMCkgeG1tMCA9IC14bW0wOwotCXBzdWJ3CXhtbTEseG1tNQkJOyBpZiAoeG1tMSA8IDApIHhtbTEgPSAteG1tMTsKLQlwc3Vidwl4bW0yLHhtbTYJCTsgaWYgKHhtbTIgPCAwKSB4bW0yID0gLXhtbTI7Ci0JcHN1YncJeG1tMyx4bW03CQk7IGlmICh4bW0zIDwgMCkgeG1tMyA9IC14bW0zOwotCi0JcGFkZHcJeG1tMCwgWE1NV09SRCBbQ09SUkVDVElPTigwLDAsZWR4KV0gIDsgY29ycmVjdGlvbiArIHJvdW5kZmFjdG9yCi0JcGFkZHcJeG1tMSwgWE1NV09SRCBbQ09SUkVDVElPTigxLDAsZWR4KV0KLQlwYWRkdwl4bW0yLCBYTU1XT1JEIFtDT1JSRUNUSU9OKDIsMCxlZHgpXQotCXBhZGR3CXhtbTMsIFhNTVdPUkQgW0NPUlJFQ1RJT04oMywwLGVkeCldCi0JcHNsbHcJeG1tMCwxCi0JcHNsbHcJeG1tMSwxCi0JcHNsbHcJeG1tMiwxCi0JcHNsbHcJeG1tMywxCi0JcG11bGh1dwl4bW0wLCBYTU1XT1JEIFtSRUNJUFJPQ0FMKDAsMCxlZHgpXSAgOyByZWNpcHJvY2FsCi0JcG11bGh1dwl4bW0xLCBYTU1XT1JEIFtSRUNJUFJPQ0FMKDEsMCxlZHgpXQotCXBtdWxodXcJeG1tMiwgWE1NV09SRCBbUkVDSVBST0NBTCgyLDAsZWR4KV0KLQlwbXVsaHV3CXhtbTMsIFhNTVdPUkQgW1JFQ0lQUk9DQUwoMywwLGVkeCldCi0JcHNsbHcJeG1tMCwxCi0JcHNsbHcJeG1tMSwxCi0JcHNsbHcJeG1tMiwxCi0JcHNsbHcJeG1tMywxCi0JcG11bGh1dwl4bW0wLCBYTU1XT1JEIFtTQ0FMRSgwLDAsZWR4KV0JOyBzY2FsZQotCXBtdWxodXcJeG1tMSwgWE1NV09SRCBbU0NBTEUoMSwwLGVkeCldCi0JcG11bGh1dwl4bW0yLCBYTU1XT1JEIFtTQ0FMRSgyLDAsZWR4KV0KLQlwbXVsaHV3CXhtbTMsIFhNTVdPUkQgW1NDQUxFKDMsMCxlZHgpXQotCi0JcHhvcgl4bW0wLHhtbTQKLQlweG9yCXhtbTEseG1tNQotCXB4b3IJeG1tMix4bW02Ci0JcHhvcgl4bW0zLHhtbTcKLQlwc3Vidwl4bW0wLHhtbTQKLQlwc3Vidwl4bW0xLHhtbTUKLQlwc3Vidwl4bW0yLHhtbTYKLQlwc3Vidwl4bW0zLHhtbTcKLQltb3ZkcWEJWE1NV09SRCBbWE1NQkxPQ0soMCwwLGVkaSxTSVpFT0ZfRENURUxFTSldLCB4bW0wCi0JbW92ZHFhCVhNTVdPUkQgW1hNTUJMT0NLKDEsMCxlZGksU0laRU9GX0RDVEVMRU0pXSwgeG1tMQotCW1vdmRxYQlYTU1XT1JEIFtYTU1CTE9DSygyLDAsZWRpLFNJWkVPRl9EQ1RFTEVNKV0sIHhtbTIKLQltb3ZkcWEJWE1NV09SRCBbWE1NQkxPQ0soMywwLGVkaSxTSVpFT0ZfRENURUxFTSldLCB4bW0zCi0KLQlhZGQJZXNpLCBieXRlIDMyKlNJWkVPRl9EQ1RFTEVNCi0JYWRkCWVkeCwgYnl0ZSAzMipTSVpFT0ZfRENURUxFTQotCWFkZAllZGksIGJ5dGUgMzIqU0laRU9GX0pDT0VGCi0JZGVjCWVheAotCWpuegluZWFyIC5xdWFudGxvb3AKLQotCXBvcAllZGkKLQlwb3AJZXNpCi07CXBvcAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXBvcAllY3gJCTsgdW51c2VkCi07CXBvcAllYngJCTsgdW51c2VkCi0JcG9wCWVicAotCXJldAotCi0lZW5kaWYgOyAhSkZEQ1RfSU5UX1FVQU5USVpFX1dJVEhfRElWSVNJT04KLSVlbmRpZiA7IEpGRENUX0lOVF9TU0UyX1NVUFBPUlRFRApkaWZmIC0tZ2l0IGEvamNxbnRzc2UuYXNtIGIvamNxbnRzc2UuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTk5YTIwLi4wMDAwMDAwCi0tLSBhL2pjcW50c3NlLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi07Ci07IGpjcW50c3NlLmFzbSAtIHNhbXBsZSBkYXRhIGNvbnZlcnNpb24gYW5kIHF1YW50aXphdGlvbiAoU1NFICYgTU1YKQotOwotOyB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLTsgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KLTsgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGpzaW1kZXh0LmluYwotOwotOyBUaGlzIGZpbGUgc2hvdWxkIGJlIGFzc2VtYmxlZCB3aXRoIE5BU00gKE5ldHdpZGUgQXNzZW1ibGVyKSwKLTsgY2FuICpub3QqIGJlIGFzc2VtYmxlZCB3aXRoIE1pY3Jvc29mdCdzIE1BU00gb3IgYW55IGNvbXBhdGlibGUKLTsgYXNzZW1ibGVyIChpbmNsdWRpbmcgQm9ybGFuZCdzIFR1cmJvIEFzc2VtYmxlcikuCi07IE5BU00gaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL25hc20uc291cmNlZm9yZ2UubmV0LyBvcgotOyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD02MjA4Ci07Ci07IExhc3QgTW9kaWZpZWQgOiBKYW51YXJ5IDEyLCAyMDA1Ci07Ci07IFtUQUI4XQotCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotJWluY2x1ZGUgImpkY3QuaW5jIgotCi0laWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotJWlmZGVmIEpGRENUX0ZMVF9TU0VfTU1YX1NVUFBPUlRFRAotCi07IFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotOwotJWlmIERDVFNJWkUgIT0gOAotJWVycm9yICJTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4iCi0lZW5kaWYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX1RFWFQKLQlCSVRTCTMyCi07Ci07IExvYWQgZGF0YSBpbnRvIHdvcmtzcGFjZSwgYXBwbHlpbmcgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uCi07Ci07IEdMT0JBTCh2b2lkKQotOyBqcGVnX2NvbnZzYW1wX2ZsdF9zc2UgKEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sLAotOyAgICAgICAgICAgICAgICAgICAgICAgIEZBU1RfRkxPQVQgKiB3b3Jrc3BhY2UpOwotOwotCi0lZGVmaW5lIHNhbXBsZV9kYXRhCWVicCs4CQk7IEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEKLSVkZWZpbmUgc3RhcnRfY29sCWVicCsxMgkJOyBKRElNRU5TSU9OIHN0YXJ0X2NvbAotJWRlZmluZSB3b3Jrc3BhY2UJZWJwKzE2CQk7IEZBU1RfRkxPQVQgKiB3b3Jrc3BhY2UKLQotCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19jb252c2FtcF9mbHRfc3NlKQotCi1FWFROKGpwZWdfY29udnNhbXBfZmx0X3NzZSk6Ci0JcHVzaAllYnAKLQltb3YJZWJwLGVzcAotCXB1c2gJZWJ4Ci07CXB1c2gJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwdXNoCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwdXNoCWVzaQotCXB1c2gJZWRpCi0KLQlwY21wZXF3ICBtbTcsbW03Ci0JcHNsbHcgICAgbW03LDcKLQlwYWNrc3N3YiBtbTcsbW03CQk7IG1tNyA9IFBCX0NFTlRFUkpTQU1QTEUgKDB4ODA4MDgwLi4pCi0KLQltb3YJZXNpLCBKU0FNUEFSUkFZIFtzYW1wbGVfZGF0YV0JOyAoSlNBTVBST1cgKikKLQltb3YJZWF4LCBKRElNRU5TSU9OIFtzdGFydF9jb2xdCi0JbW92CWVkaSwgUE9JTlRFUiBbd29ya3NwYWNlXQk7IChEQ1RFTEVNICopCi0JbW92CWVjeCwgRENUU0laRS8yCi0JYWxpZ254CTE2LDcKLS5jb252bG9vcDoKLQltb3YJZWJ4LCBKU0FNUFJPVyBbZXNpKzAqU0laRU9GX0pTQU1QUk9XXQk7IChKU0FNUExFICopCi0JbW92CWVkeCwgSlNBTVBST1cgW2VzaSsxKlNJWkVPRl9KU0FNUFJPV10JOyAoSlNBTVBMRSAqKQotCi0JbW92cQltbTAsIE1NV09SRCBbZWJ4K2VheCpTSVpFT0ZfSlNBTVBMRV0KLQltb3ZxCW1tMSwgTU1XT1JEIFtlZHgrZWF4KlNJWkVPRl9KU0FNUExFXQotCi0JcHN1YmIJbW0wLG1tNwkJCQk7IG1tMD0oMDEyMzQ1NjcpCi0JcHN1YmIJbW0xLG1tNwkJCQk7IG1tMT0oODlBQkNERUYpCi0KLQlwdW5wY2tsYncgbW0yLG1tMAkJCTsgbW0yPSgqMCoxKjIqMykKLQlwdW5wY2toYncgbW0wLG1tMAkJCTsgbW0wPSgqNCo1KjYqNykKLQlwdW5wY2tsYncgbW0zLG1tMQkJCTsgbW0zPSgqOCo5KkEqQikKLQlwdW5wY2toYncgbW0xLG1tMQkJCTsgbW0xPSgqQypEKkUqRikKLQotCXB1bnBja2x3ZCBtbTQsbW0yCQkJOyBtbTQ9KCoqKjAqKioxKQotCXB1bnBja2h3ZCBtbTIsbW0yCQkJOyBtbTI9KCoqKjIqKiozKQotCXB1bnBja2x3ZCBtbTUsbW0wCQkJOyBtbTU9KCoqKjQqKio1KQotCXB1bnBja2h3ZCBtbTAsbW0wCQkJOyBtbTA9KCoqKjYqKio3KQotCi0JcHNyYWQgICAgIG1tNCwoRFdPUkRfQklULUJZVEVfQklUKQk7IG1tND0oMDEpCi0JcHNyYWQgICAgIG1tMiwoRFdPUkRfQklULUJZVEVfQklUKQk7IG1tMj0oMjMpCi0JY3Z0cGkycHMgIHhtbTAsbW00CQkJOyB4bW0wPSgwMSoqKQotCWN2dHBpMnBzICB4bW0xLG1tMgkJCTsgeG1tMT0oMjMqKikKLQlwc3JhZCAgICAgbW01LChEV09SRF9CSVQtQllURV9CSVQpCTsgbW01PSg0NSkKLQlwc3JhZCAgICAgbW0wLChEV09SRF9CSVQtQllURV9CSVQpCTsgbW0wPSg2NykKLQljdnRwaTJwcyAgeG1tMixtbTUJCQk7IHhtbTI9KDQ1KiopCi0JY3Z0cGkycHMgIHhtbTMsbW0wCQkJOyB4bW0zPSg2NyoqKQotCi0JcHVucGNrbHdkIG1tNixtbTMJCQk7IG1tNj0oKioqOCoqKjkpCi0JcHVucGNraHdkIG1tMyxtbTMJCQk7IG1tMz0oKioqQSoqKkIpCi0JcHVucGNrbHdkIG1tNCxtbTEJCQk7IG1tND0oKioqQyoqKkQpCi0JcHVucGNraHdkIG1tMSxtbTEJCQk7IG1tMT0oKioqRSoqKkYpCi0KLQlwc3JhZCAgICAgbW02LChEV09SRF9CSVQtQllURV9CSVQpCTsgbW02PSg4OSkKLQlwc3JhZCAgICAgbW0zLChEV09SRF9CSVQtQllURV9CSVQpCTsgbW0zPShBQikKLQljdnRwaTJwcyAgeG1tNCxtbTYJCQk7IHhtbTQ9KDg5KiopCi0JY3Z0cGkycHMgIHhtbTUsbW0zCQkJOyB4bW01PShBQioqKQotCXBzcmFkICAgICBtbTQsKERXT1JEX0JJVC1CWVRFX0JJVCkJOyBtbTQ9KENEKQotCXBzcmFkICAgICBtbTEsKERXT1JEX0JJVC1CWVRFX0JJVCkJOyBtbTE9KEVGKQotCWN2dHBpMnBzICB4bW02LG1tNAkJCTsgeG1tNj0oQ0QqKikKLQljdnRwaTJwcyAgeG1tNyxtbTEJCQk7IHhtbTc9KEVGKiopCi0KLQltb3ZsaHBzICAgeG1tMCx4bW0xCQkJOyB4bW0wPSgwMTIzKQotCW1vdmxocHMgICB4bW0yLHhtbTMJCQk7IHhtbTI9KDQ1NjcpCi0JbW92bGhwcyAgIHhtbTQseG1tNQkJCTsgeG1tND0oODlBQikKLQltb3ZsaHBzICAgeG1tNix4bW03CQkJOyB4bW02PShDREVGKQotCi0JbW92YXBzCVhNTVdPUkQgW1hNTUJMT0NLKDAsMCxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgeG1tMAotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSygwLDEsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTIKLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soMSwwLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW00Ci0JbW92YXBzCVhNTVdPUkQgW1hNTUJMT0NLKDEsMSxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgeG1tNgotCi0JYWRkCWVzaSwgYnl0ZSAyKlNJWkVPRl9KU0FNUFJPVwotCWFkZAllZGksIGJ5dGUgMipEQ1RTSVpFKlNJWkVPRl9GQVNUX0ZMT0FUCi0JZGVjCWVjeAotCWpuegluZWFyIC5jb252bG9vcAotCi0JZW1tcwkJOyBlbXB0eSBNTVggc3RhdGUKLQotCXBvcAllZGkKLQlwb3AJZXNpCi07CXBvcAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXBvcAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcG9wCWVieAotCXBvcAllYnAKLQlyZXQKLQotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ci07IFF1YW50aXplL2Rlc2NhbGUgdGhlIGNvZWZmaWNpZW50cywgYW5kIHN0b3JlIGludG8gY29lZl9ibG9jawotOwotOyBHTE9CQUwodm9pZCkKLTsganBlZ19xdWFudGl6ZV9mbHRfc3NlIChKQ09FRlBUUiBjb2VmX2Jsb2NrLCBGQVNUX0ZMT0FUICogZGl2aXNvcnMsCi07ICAgICAgICAgICAgICAgICAgICAgICAgRkFTVF9GTE9BVCAqIHdvcmtzcGFjZSk7Ci07Ci0KLSVkZWZpbmUgY29lZl9ibG9jawllYnArOAkJOyBKQ09FRlBUUiBjb2VmX2Jsb2NrCi0lZGVmaW5lIGRpdmlzb3JzCWVicCsxMgkJOyBGQVNUX0ZMT0FUICogZGl2aXNvcnMKLSVkZWZpbmUgd29ya3NwYWNlCWVicCsxNgkJOyBGQVNUX0ZMT0FUICogd29ya3NwYWNlCi0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfcXVhbnRpemVfZmx0X3NzZSkKLQotRVhUTihqcGVnX3F1YW50aXplX2ZsdF9zc2UpOgotCXB1c2gJZWJwCi0JbW92CWVicCxlc3AKLTsJcHVzaAllYngJCTsgdW51c2VkCi07CXB1c2gJZWN4CQk7IHVudXNlZAotOwlwdXNoCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwdXNoCWVzaQotCXB1c2gJZWRpCi0KLQltb3YJZXNpLCBQT0lOVEVSIFt3b3Jrc3BhY2VdCi0JbW92CWVkeCwgUE9JTlRFUiBbZGl2aXNvcnNdCi0JbW92CWVkaSwgSkNPRUZQVFIgW2NvZWZfYmxvY2tdCi0JbW92CWVheCwgRENUU0laRTIvMTYKLQlhbGlnbngJMTYsNwotLnF1YW50bG9vcDoKLQltb3ZhcHMJeG1tMCwgWE1NV09SRCBbWE1NQkxPQ0soMCwwLGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92YXBzCXhtbTEsIFhNTVdPUkQgW1hNTUJMT0NLKDAsMSxlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCW11bHBzCXhtbTAsIFhNTVdPUkQgW1hNTUJMT0NLKDAsMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCW11bHBzCXhtbTEsIFhNTVdPUkQgW1hNTUJMT0NLKDAsMSxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCW1vdmFwcwl4bW0yLCBYTU1XT1JEIFtYTU1CTE9DSygxLDAsZXNpLFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQltb3ZhcHMJeG1tMywgWE1NV09SRCBbWE1NQkxPQ0soMSwxLGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbXVscHMJeG1tMiwgWE1NV09SRCBbWE1NQkxPQ0soMSwwLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbXVscHMJeG1tMywgWE1NV09SRCBbWE1NQkxPQ0soMSwxLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0KLQltb3ZobHBzICB4bW00LHhtbTAKLQltb3ZobHBzICB4bW01LHhtbTEKLQotCWN2dHBzMnBpIG1tMCx4bW0wCi0JY3Z0cHMycGkgbW0xLHhtbTEKLQljdnRwczJwaSBtbTQseG1tNAotCWN2dHBzMnBpIG1tNSx4bW01Ci0KLQltb3ZobHBzICB4bW02LHhtbTIKLQltb3ZobHBzICB4bW03LHhtbTMKLQotCWN2dHBzMnBpIG1tMix4bW0yCi0JY3Z0cHMycGkgbW0zLHhtbTMKLQljdnRwczJwaSBtbTYseG1tNgotCWN2dHBzMnBpIG1tNyx4bW03Ci0KLQlwYWNrc3NkdyBtbTAsbW00Ci0JcGFja3NzZHcgbW0xLG1tNQotCXBhY2tzc2R3IG1tMixtbTYKLQlwYWNrc3NkdyBtbTMsbW03Ci0KLQltb3ZxCU1NV09SRCBbTU1CTE9DSygwLDAsZWRpLFNJWkVPRl9KQ09FRildLCBtbTAKLQltb3ZxCU1NV09SRCBbTU1CTE9DSygwLDEsZWRpLFNJWkVPRl9KQ09FRildLCBtbTEKLQltb3ZxCU1NV09SRCBbTU1CTE9DSygxLDAsZWRpLFNJWkVPRl9KQ09FRildLCBtbTIKLQltb3ZxCU1NV09SRCBbTU1CTE9DSygxLDEsZWRpLFNJWkVPRl9KQ09FRildLCBtbTMKLQotCWFkZAllc2ksIGJ5dGUgMTYqU0laRU9GX0ZBU1RfRkxPQVQKLQlhZGQJZWR4LCBieXRlIDE2KlNJWkVPRl9GQVNUX0ZMT0FUCi0JYWRkCWVkaSwgYnl0ZSAxNipTSVpFT0ZfSkNPRUYKLQlkZWMJZWF4Ci0Jam56CXNob3J0IC5xdWFudGxvb3AKLQotCWVtbXMJCTsgZW1wdHkgTU1YIHN0YXRlCi0KLQlwb3AJZWRpCi0JcG9wCWVzaQotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IHVudXNlZAotOwlwb3AJZWJ4CQk7IHVudXNlZAotCXBvcAllYnAKLQlyZXQKLQotJWVuZGlmIDsgSkZEQ1RfRkxUX1NTRV9NTVhfU1VQUE9SVEVECi0lZW5kaWYgOyBEQ1RfRkxPQVRfU1VQUE9SVEVECmRpZmYgLS1naXQgYS9qY3NhbXBsZS5jIGIvamNzYW1wbGUuYwppbmRleCA5YWY3ZjE1Li5lZWEzNzZmIDEwMDY0NAotLS0gYS9qY3NhbXBsZS5jCisrKyBiL2pjc2FtcGxlLmMKQEAgLTIsMTYgKzIsMTAgQEAKICAqIGpjc2FtcGxlLmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBDb3B5cmlnaHQgMjAwOSBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgogICoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgotICogVGhpcyBmaWxlIGhhcyBiZWVuIG1vZGlmaWVkIGZvciBTSU1EIGV4dGVuc2lvbi4KLSAqIExhc3QgTW9kaWZpZWQgOiBKYW51YXJ5IDUsIDIwMDYKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKICAqIFRoaXMgZmlsZSBjb250YWlucyBkb3duc2FtcGxpbmcgcm91dGluZXMuCiAgKgogICogRG93bnNhbXBsaW5nIGlucHV0IGRhdGEgaXMgY291bnRlZCBpbiAicm93IGdyb3VwcyIuICBBIHJvdyBncm91cApAQCAtNTUsNyArNDksNyBAQAogI2RlZmluZSBKUEVHX0lOVEVSTkFMUwogI2luY2x1ZGUgImppbmNsdWRlLmgiCiAjaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpjb2xzYW1wLmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyAqLworI2luY2x1ZGUgImpzaW1kLmgiCiAKIAogLyogUG9pbnRlciB0byByb3V0aW5lIHRvIGRvd25zYW1wbGUgYSBzaW5nbGUgY29tcG9uZW50ICovCkBAIC00NzUsNyArNDY5LDYgQEAKICAgaW50IGNpOwogICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKICAgYm9vbGVhbiBzbW9vdGhvayA9IFRSVUU7Ci0gIHVuc2lnbmVkIGludCBzaW1kID0ganBlZ19zaW1kX3N1cHBvcnQoKGpfY29tbW9uX3B0cikgY2luZm8pOwogCiAgIGRvd25zYW1wbGUgPSAobXlfZG93bnNhbXBsZV9wdHIpCiAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKQEAgLTUwMywxNyArNDk2LDEwIEBACiAgICAgfSBlbHNlIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogMiA9PSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgJiYKIAkgICAgICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKICAgICAgIHNtb290aG9rID0gRkFMU0U7Ci0jaWZkZWYgSkNTQU1QTEVfU1NFMl9TVVBQT1JURUQKLSAgICAgIGlmIChzaW1kICYgSlNJTURfU1NFMikKLQlkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGpwZWdfaDJ2MV9kb3duc2FtcGxlX3NzZTI7CisgICAgICBpZiAoanNpbWRfY2FuX2gydjFfZG93bnNhbXBsZSgpKQorICAgICAgICBkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGpzaW1kX2gydjFfZG93bnNhbXBsZTsKICAgICAgIGVsc2UKLSNlbmRpZgotI2lmZGVmIEpDU0FNUExFX01NWF9TVVBQT1JURUQKLSAgICAgIGlmIChzaW1kICYgSlNJTURfTU1YKQotCWRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0ganBlZ19oMnYxX2Rvd25zYW1wbGVfbW14OwotICAgICAgZWxzZQotI2VuZGlmCi0JZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYxX2Rvd25zYW1wbGU7CisgICAgICAgIGRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2MV9kb3duc2FtcGxlOwogICAgIH0gZWxzZSBpZiAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIDIgPT0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICYmCiAJICAgICAgIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiAyID09IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgewogI2lmZGVmIElOUFVUX1NNT09USElOR19TVVBQT1JURUQKQEAgLTUyMiwxNyArNTA4LDEwIEBACiAJZG93bnNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gVFJVRTsKICAgICAgIH0gZWxzZQogI2VuZGlmCi0jaWZkZWYgSkNTQU1QTEVfU1NFMl9TVVBQT1JURUQKLSAgICAgIGlmIChzaW1kICYgSlNJTURfU1NFMikKLQlkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGpwZWdfaDJ2Ml9kb3duc2FtcGxlX3NzZTI7Ci0gICAgICBlbHNlCi0jZW5kaWYKLSNpZmRlZiBKQ1NBTVBMRV9NTVhfU1VQUE9SVEVECi0gICAgICBpZiAoc2ltZCAmIEpTSU1EX01NWCkKLQlkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGpwZWdfaDJ2Ml9kb3duc2FtcGxlX21teDsKLSAgICAgIGVsc2UKLSNlbmRpZgotCWRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2Ml9kb3duc2FtcGxlOworCWlmIChqc2ltZF9jYW5faDJ2Ml9kb3duc2FtcGxlKCkpCisJICBkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGpzaW1kX2gydjJfZG93bnNhbXBsZTsKKwllbHNlCisJICBkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjJfZG93bnNhbXBsZTsKICAgICB9IGVsc2UgaWYgKChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgJSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSA9PSAwICYmCiAJICAgICAgIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgJSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSA9PSAwKSB7CiAgICAgICBzbW9vdGhvayA9IEZBTFNFOwpAQCAtNTQ2LDI1ICs1MjUsMyBAQAogICAgIFRSQUNFTVMoY2luZm8sIDAsIEpUUkNfU01PT1RIX05PVElNUEwpOwogI2VuZGlmCiB9Ci0KLQotI2lmbmRlZiBKU0lNRF9NT0RFSU5GT19OT1RfU1VQUE9SVEVECi0KLUdMT0JBTCh1bnNpZ25lZCBpbnQpCi1qcGVnX3NpbWRfZG93bnNhbXBsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICB1bnNpZ25lZCBpbnQgc2ltZCA9IGpwZWdfc2ltZF9zdXBwb3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLQotI2lmZGVmIEpDU0FNUExFX1NTRTJfU1VQUE9SVEVECi0gIGlmIChzaW1kICYgSlNJTURfU1NFMikKLSAgICByZXR1cm4gSlNJTURfU1NFMjsKLSNlbmRpZgotI2lmZGVmIEpDU0FNUExFX01NWF9TVVBQT1JURUQKLSAgaWYgKHNpbWQgJiBKU0lNRF9NTVgpCi0gICAgcmV0dXJuIEpTSU1EX01NWDsKLSNlbmRpZgotCi0gIHJldHVybiBKU0lNRF9OT05FOwotfQotCi0jZW5kaWYgLyogIUpTSU1EX01PREVJTkZPX05PVF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2pjc2Ftc3MyLmFzbSBiL2pjc2Ftc3MyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE4N2Q2My4uMDAwMDAwMAotLS0gYS9qY3NhbXNzMi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotOwotOyBqY3NhbXNzMi5hc20gLSBkb3duc2FtcGxpbmcgKFNTRTIpCi07Ci07IHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotOyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgotOyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4ganNpbWRleHQuaW5jCi07Ci07IFRoaXMgZmlsZSBzaG91bGQgYmUgYXNzZW1ibGVkIHdpdGggTkFTTSAoTmV0d2lkZSBBc3NlbWJsZXIpLAotOyBjYW4gKm5vdCogYmUgYXNzZW1ibGVkIHdpdGggTWljcm9zb2Z0J3MgTUFTTSBvciBhbnkgY29tcGF0aWJsZQotOyBhc3NlbWJsZXIgKGluY2x1ZGluZyBCb3JsYW5kJ3MgVHVyYm8gQXNzZW1ibGVyKS4KLTsgTkFTTSBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vbmFzbS5zb3VyY2Vmb3JnZS5uZXQvIG9yCi07IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTYyMDgKLTsKLTsgTGFzdCBNb2RpZmllZCA6IEphbnVhcnkgMjMsIDIwMDYKLTsKLTsgW1RBQjhdCi0KLSVpbmNsdWRlICJqc2ltZGV4dC5pbmMiCi0laW5jbHVkZSAiamNvbHNhbXAuaW5jIgotCi0laWZkZWYgSkNTQU1QTEVfU1NFMl9TVVBQT1JURUQKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX1RFWFQKLQlCSVRTCTMyCi07Ci07IERvd25zYW1wbGUgcGl4ZWwgdmFsdWVzIG9mIGEgc2luZ2xlIGNvbXBvbmVudC4KLTsgVGhpcyB2ZXJzaW9uIGhhbmRsZXMgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAxOjEgdmVydGljYWwsCi07IHdpdGhvdXQgc21vb3RoaW5nLgotOwotOyBHTE9CQUwodm9pZCkKLTsganBlZ19oMnYxX2Rvd25zYW1wbGVfc3NlMiAoal9jb21wcmVzc19wdHIgY2luZm8sCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpOwotOwotCi0lZGVmaW5lIGNpbmZvKGIpCShiKSs4CQk7IGpfY29tcHJlc3NfcHRyIGNpbmZvCi0lZGVmaW5lIGNvbXBwdHIoYikJKGIpKzEyCQk7IGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyCi0lZGVmaW5lIGlucHV0X2RhdGEoYikJKGIpKzE2CQk7IEpTQU1QQVJSQVkgaW5wdXRfZGF0YQotJWRlZmluZSBvdXRwdXRfZGF0YShiKQkoYikrMjAJCTsgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YQotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2gydjFfZG93bnNhbXBsZV9zc2UyKQotCi1FWFROKGpwZWdfaDJ2MV9kb3duc2FtcGxlX3NzZTIpOgotCXB1c2gJZWJwCi0JbW92CWVicCxlc3AKLTsJcHVzaAllYngJCTsgdW51c2VkCi07CXB1c2gJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwdXNoCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwdXNoCWVzaQotCXB1c2gJZWRpCi0KLQltb3YJZWN4LCBQT0lOVEVSIFtjb21wcHRyKGVicCldCi0JbW92CWVjeCwgSkRJTUVOU0lPTiBbamNvbXBpbmZvX3dpZHRoX2luX2Jsb2NrcyhlY3gpXQotCXNobAllY3gsMwkJCTsgaW11bCBlY3gsRENUU0laRSAoZWN4ID0gb3V0cHV0X2NvbHMpCi0JanoJbmVhciAucmV0dXJuCi0KLQltb3YJZWR4LCBQT0lOVEVSIFtjaW5mbyhlYnApXQotCW1vdgllZHgsIEpESU1FTlNJT04gW2pjc3RydWN0X2ltYWdlX3dpZHRoKGVkeCldCi0KLQk7IC0tIGV4cGFuZF9yaWdodF9lZGdlCi0KLQlwdXNoCWVjeAotCXNobAllY3gsMQkJCQk7IG91dHB1dF9jb2xzICogMgotCXN1YgllY3gsZWR4Ci0JamxlCXNob3J0IC5leHBhbmRfZW5kCi0KLQltb3YJZWF4LCBQT0lOVEVSIFtjaW5mbyhlYnApXQotCW1vdgllYXgsIElOVCBbamNzdHJ1Y3RfbWF4X3Zfc2FtcF9mYWN0b3IoZWF4KV0KLQl0ZXN0CWVheCxlYXgKLQlqbGUJc2hvcnQgLmV4cGFuZF9lbmQKLQotCWNsZAotCW1vdgllc2ksIEpTQU1QQVJSQVkgW2lucHV0X2RhdGEoZWJwKV0JOyBpbnB1dF9kYXRhCi0JYWxpZ254CTE2LDcKLS5leHBhbmRsb29wOgotCXB1c2gJZWF4Ci0JcHVzaAllY3gKLQotCW1vdgllZGksIEpTQU1QUk9XIFtlc2ldCi0JYWRkCWVkaSxlZHgKLQltb3YJYWwsIEpTQU1QTEUgW2VkaS0xXQotCi0JcmVwIHN0b3NiCi0KLQlwb3AJZWN4Ci0JcG9wCWVheAotCi0JYWRkCWVzaSwgYnl0ZSBTSVpFT0ZfSlNBTVBST1cKLQlkZWMJZWF4Ci0JamcJc2hvcnQgLmV4cGFuZGxvb3AKLQotLmV4cGFuZF9lbmQ6Ci0JcG9wCWVjeAkJCQk7IG91dHB1dF9jb2xzCi0KLQk7IC0tIGgydjFfZG93bnNhbXBsZQotCi0JbW92CWVheCwgUE9JTlRFUiBbY29tcHB0cihlYnApXQotCW1vdgllYXgsIEpESU1FTlNJT04gW2pjb21waW5mb192X3NhbXBfZmFjdG9yKGVheCldCTsgcm93Y3RyCi0JdGVzdAllYXgsZWF4Ci0JamxlCW5lYXIgLnJldHVybgotCi0JbW92CWVkeCwgMHgwMDAxMDAwMAkJOyBiaWFzIHBhdHRlcm4KLQltb3ZkCXhtbTcsZWR4Ci0JcGNtcGVxdwl4bW02LHhtbTYKLQlwc2h1ZmQJeG1tNyx4bW03LDB4MDAJCTsgeG1tNz17MCwgMSwgMCwgMSwgMCwgMSwgMCwgMX0KLQlwc3Jsdwl4bW02LEJZVEVfQklUCQk7IHhtbTY9ezB4RkYgMHgwMCAweEZGIDB4MDAgLi59Ci0KLQltb3YJZXNpLCBKU0FNUEFSUkFZIFtpbnB1dF9kYXRhKGVicCldCTsgaW5wdXRfZGF0YQotCW1vdgllZGksIEpTQU1QQVJSQVkgW291dHB1dF9kYXRhKGVicCldCTsgb3V0cHV0X2RhdGEKLQlhbGlnbngJMTYsNwotLnJvd2xvb3A6Ci0JcHVzaAllY3gKLQlwdXNoCWVkaQotCXB1c2gJZXNpCi0KLQltb3YJZXNpLCBKU0FNUFJPVyBbZXNpXQkJOyBpbnB0cgotCW1vdgllZGksIEpTQU1QUk9XIFtlZGldCQk7IG91dHB0cgotCi0JY21wCWVjeCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAotCWphZQlzaG9ydCAuY29sdW1ubG9vcAotCWFsaWdueAkxNiw3Ci0KLS5jb2x1bW5sb29wX3I4OgotCW1vdmRxYQl4bW0wLCBYTU1XT1JEIFtlc2krMCpTSVpFT0ZfWE1NV09SRF0KLQlweG9yCXhtbTEseG1tMQotCW1vdgllY3gsIFNJWkVPRl9YTU1XT1JECi0Jam1wCXNob3J0IC5kb3duc2FtcGxlCi0JYWxpZ254CTE2LDcKLQotLmNvbHVtbmxvb3A6Ci0JbW92ZHFhCXhtbTAsIFhNTVdPUkQgW2VzaSswKlNJWkVPRl9YTU1XT1JEXQotCW1vdmRxYQl4bW0xLCBYTU1XT1JEIFtlc2krMSpTSVpFT0ZfWE1NV09SRF0KLQotLmRvd25zYW1wbGU6Ci0JbW92ZHFhCXhtbTIseG1tMAotCW1vdmRxYQl4bW0zLHhtbTEKLQotCXBhbmQJeG1tMCx4bW02Ci0JcHNybHcJeG1tMixCWVRFX0JJVAotCXBhbmQJeG1tMSx4bW02Ci0JcHNybHcJeG1tMyxCWVRFX0JJVAotCi0JcGFkZHcJeG1tMCx4bW0yCi0JcGFkZHcJeG1tMSx4bW0zCi0JcGFkZHcJeG1tMCx4bW03Ci0JcGFkZHcJeG1tMSx4bW03Ci0JcHNybHcJeG1tMCwxCi0JcHNybHcJeG1tMSwxCi0KLQlwYWNrdXN3YiB4bW0wLHhtbTEKLQotCW1vdmRxYQlYTU1XT1JEIFtlZGkrMCpTSVpFT0ZfWE1NV09SRF0sIHhtbTAKLQotCXN1YgllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRjb2wKLQlhZGQJZXNpLCBieXRlIDIqU0laRU9GX1hNTVdPUkQJOyBpbnB0cgotCWFkZAllZGksIGJ5dGUgMSpTSVpFT0ZfWE1NV09SRAk7IG91dHB0cgotCWNtcAllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQKLQlqYWUJc2hvcnQgLmNvbHVtbmxvb3AKLQl0ZXN0CWVjeCxlY3gKLQlqbnoJc2hvcnQgLmNvbHVtbmxvb3BfcjgKLQotCXBvcAllc2kKLQlwb3AJZWRpCi0JcG9wCWVjeAotCi0JYWRkCWVzaSwgYnl0ZSBTSVpFT0ZfSlNBTVBST1cJOyBpbnB1dF9kYXRhCi0JYWRkCWVkaSwgYnl0ZSBTSVpFT0ZfSlNBTVBST1cJOyBvdXRwdXRfZGF0YQotCWRlYwllYXgJCQkJOyByb3djdHIKLQlqZwluZWFyIC5yb3dsb29wCi0KLS5yZXR1cm46Ci0JcG9wCWVkaQotCXBvcAllc2kKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVieAkJOyB1bnVzZWQKLQlwb3AJZWJwCi0JcmV0Ci0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsKLTsgRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgotOyBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgc3RhbmRhcmQgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLAotOyB3aXRob3V0IHNtb290aGluZy4KLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfaDJ2Ml9kb3duc2FtcGxlX3NzZTIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKTsKLTsKLQotJWRlZmluZSBjaW5mbyhiKQkoYikrOAkJOyBqX2NvbXByZXNzX3B0ciBjaW5mbwotJWRlZmluZSBjb21wcHRyKGIpCShiKSsxMgkJOyBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cgotJWRlZmluZSBpbnB1dF9kYXRhKGIpCShiKSsxNgkJOyBKU0FNUEFSUkFZIGlucHV0X2RhdGEKLSVkZWZpbmUgb3V0cHV0X2RhdGEoYikJKGIpKzIwCQk7IEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEKLQotCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19oMnYyX2Rvd25zYW1wbGVfc3NlMikKLQotRVhUTihqcGVnX2gydjJfZG93bnNhbXBsZV9zc2UyKToKLQlwdXNoCWVicAotCW1vdgllYnAsZXNwCi07CXB1c2gJZWJ4CQk7IHVudXNlZAotOwlwdXNoCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcHVzaAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcHVzaAllc2kKLQlwdXNoCWVkaQotCi0JbW92CWVjeCwgUE9JTlRFUiBbY29tcHB0cihlYnApXQotCW1vdgllY3gsIEpESU1FTlNJT04gW2pjb21waW5mb193aWR0aF9pbl9ibG9ja3MoZWN4KV0KLQlzaGwJZWN4LDMJCQk7IGltdWwgZWN4LERDVFNJWkUgKGVjeCA9IG91dHB1dF9jb2xzKQotCWp6CW5lYXIgLnJldHVybgotCi0JbW92CWVkeCwgUE9JTlRFUiBbY2luZm8oZWJwKV0KLQltb3YJZWR4LCBKRElNRU5TSU9OIFtqY3N0cnVjdF9pbWFnZV93aWR0aChlZHgpXQotCi0JOyAtLSBleHBhbmRfcmlnaHRfZWRnZQotCi0JcHVzaAllY3gKLQlzaGwJZWN4LDEJCQkJOyBvdXRwdXRfY29scyAqIDIKLQlzdWIJZWN4LGVkeAotCWpsZQlzaG9ydCAuZXhwYW5kX2VuZAotCi0JbW92CWVheCwgUE9JTlRFUiBbY2luZm8oZWJwKV0KLQltb3YJZWF4LCBJTlQgW2pjc3RydWN0X21heF92X3NhbXBfZmFjdG9yKGVheCldCi0JdGVzdAllYXgsZWF4Ci0JamxlCXNob3J0IC5leHBhbmRfZW5kCi0KLQljbGQKLQltb3YJZXNpLCBKU0FNUEFSUkFZIFtpbnB1dF9kYXRhKGVicCldCTsgaW5wdXRfZGF0YQotCWFsaWdueAkxNiw3Ci0uZXhwYW5kbG9vcDoKLQlwdXNoCWVheAotCXB1c2gJZWN4Ci0KLQltb3YJZWRpLCBKU0FNUFJPVyBbZXNpXQotCWFkZAllZGksZWR4Ci0JbW92CWFsLCBKU0FNUExFIFtlZGktMV0KLQotCXJlcCBzdG9zYgotCi0JcG9wCWVjeAotCXBvcAllYXgKLQotCWFkZAllc2ksIGJ5dGUgU0laRU9GX0pTQU1QUk9XCi0JZGVjCWVheAotCWpnCXNob3J0IC5leHBhbmRsb29wCi0KLS5leHBhbmRfZW5kOgotCXBvcAllY3gJCQkJOyBvdXRwdXRfY29scwotCi0JOyAtLSBoMnYyX2Rvd25zYW1wbGUKLQotCW1vdgllYXgsIFBPSU5URVIgW2NvbXBwdHIoZWJwKV0KLQltb3YJZWF4LCBKRElNRU5TSU9OIFtqY29tcGluZm9fdl9zYW1wX2ZhY3RvcihlYXgpXQk7IHJvd2N0cgotCXRlc3QJZWF4LGVheAotCWpsZQluZWFyIC5yZXR1cm4KLQotCW1vdgllZHgsIDB4MDAwMjAwMDEJCTsgYmlhcyBwYXR0ZXJuCi0JbW92ZAl4bW03LGVkeAotCXBjbXBlcXcJeG1tNix4bW02Ci0JcHNodWZkCXhtbTcseG1tNywweDAwCQk7IHhtbTc9ezEsIDIsIDEsIDIsIDEsIDIsIDEsIDJ9Ci0JcHNybHcJeG1tNixCWVRFX0JJVAkJOyB4bW02PXsweEZGIDB4MDAgMHhGRiAweDAwIC4ufQotCi0JbW92CWVzaSwgSlNBTVBBUlJBWSBbaW5wdXRfZGF0YShlYnApXQk7IGlucHV0X2RhdGEKLQltb3YJZWRpLCBKU0FNUEFSUkFZIFtvdXRwdXRfZGF0YShlYnApXQk7IG91dHB1dF9kYXRhCi0JYWxpZ254CTE2LDcKLS5yb3dsb29wOgotCXB1c2gJZWN4Ci0JcHVzaAllZGkKLQlwdXNoCWVzaQotCi0JbW92CWVkeCwgSlNBTVBST1cgW2VzaSswKlNJWkVPRl9KU0FNUFJPV10JOyBpbnB0cjAKLQltb3YJZXNpLCBKU0FNUFJPVyBbZXNpKzEqU0laRU9GX0pTQU1QUk9XXQk7IGlucHRyMQotCW1vdgllZGksIEpTQU1QUk9XIFtlZGldCQkJOyBvdXRwdHIKLQotCWNtcAllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQKLQlqYWUJc2hvcnQgLmNvbHVtbmxvb3AKLQlhbGlnbngJMTYsNwotCi0uY29sdW1ubG9vcF9yODoKLQltb3ZkcWEJeG1tMCwgWE1NV09SRCBbZWR4KzAqU0laRU9GX1hNTVdPUkRdCi0JbW92ZHFhCXhtbTEsIFhNTVdPUkQgW2VzaSswKlNJWkVPRl9YTU1XT1JEXQotCXB4b3IJeG1tMix4bW0yCi0JcHhvcgl4bW0zLHhtbTMKLQltb3YJZWN4LCBTSVpFT0ZfWE1NV09SRAotCWptcAlzaG9ydCAuZG93bnNhbXBsZQotCWFsaWdueAkxNiw3Ci0KLS5jb2x1bW5sb29wOgotCW1vdmRxYQl4bW0wLCBYTU1XT1JEIFtlZHgrMCpTSVpFT0ZfWE1NV09SRF0KLQltb3ZkcWEJeG1tMSwgWE1NV09SRCBbZXNpKzAqU0laRU9GX1hNTVdPUkRdCi0JbW92ZHFhCXhtbTIsIFhNTVdPUkQgW2VkeCsxKlNJWkVPRl9YTU1XT1JEXQotCW1vdmRxYQl4bW0zLCBYTU1XT1JEIFtlc2krMSpTSVpFT0ZfWE1NV09SRF0KLQotLmRvd25zYW1wbGU6Ci0JbW92ZHFhCXhtbTQseG1tMAotCW1vdmRxYQl4bW01LHhtbTEKLQlwYW5kCXhtbTAseG1tNgotCXBzcmx3CXhtbTQsQllURV9CSVQKLQlwYW5kCXhtbTEseG1tNgotCXBzcmx3CXhtbTUsQllURV9CSVQKLQlwYWRkdwl4bW0wLHhtbTQKLQlwYWRkdwl4bW0xLHhtbTUKLQotCW1vdmRxYQl4bW00LHhtbTIKLQltb3ZkcWEJeG1tNSx4bW0zCi0JcGFuZAl4bW0yLHhtbTYKLQlwc3Jsdwl4bW00LEJZVEVfQklUCi0JcGFuZAl4bW0zLHhtbTYKLQlwc3Jsdwl4bW01LEJZVEVfQklUCi0JcGFkZHcJeG1tMix4bW00Ci0JcGFkZHcJeG1tMyx4bW01Ci0KLQlwYWRkdwl4bW0wLHhtbTEKLQlwYWRkdwl4bW0yLHhtbTMKLQlwYWRkdwl4bW0wLHhtbTcKLQlwYWRkdwl4bW0yLHhtbTcKLQlwc3Jsdwl4bW0wLDIKLQlwc3Jsdwl4bW0yLDIKLQotCXBhY2t1c3diIHhtbTAseG1tMgotCi0JbW92ZHFhCVhNTVdPUkQgW2VkaSswKlNJWkVPRl9YTU1XT1JEXSwgeG1tMAotCi0Jc3ViCWVjeCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAk7IG91dGNvbAotCWFkZAllZHgsIGJ5dGUgMipTSVpFT0ZfWE1NV09SRAk7IGlucHRyMAotCWFkZAllc2ksIGJ5dGUgMipTSVpFT0ZfWE1NV09SRAk7IGlucHRyMQotCWFkZAllZGksIGJ5dGUgMSpTSVpFT0ZfWE1NV09SRAk7IG91dHB0cgotCWNtcAllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQKLQlqYWUJbmVhciAuY29sdW1ubG9vcAotCXRlc3QJZWN4LGVjeAotCWpuegluZWFyIC5jb2x1bW5sb29wX3I4Ci0KLQlwb3AJZXNpCi0JcG9wCWVkaQotCXBvcAllY3gKLQotCWFkZAllc2ksIGJ5dGUgMipTSVpFT0ZfSlNBTVBST1cJOyBpbnB1dF9kYXRhCi0JYWRkCWVkaSwgYnl0ZSAxKlNJWkVPRl9KU0FNUFJPVwk7IG91dHB1dF9kYXRhCi0JZGVjCWVheAkJCQk7IHJvd2N0cgotCWpnCW5lYXIgLnJvd2xvb3AKLQotLnJldHVybjoKLQlwb3AJZWRpCi0JcG9wCWVzaQotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWJ4CQk7IHVudXNlZAotCXBvcAllYnAKLQlyZXQKLQotJWVuZGlmIDsgSkNTQU1QTEVfU1NFMl9TVVBQT1JURUQKZGlmZiAtLWdpdCBhL2pkY29lZmN0LmMgYi9qZGNvZWZjdC5jCmluZGV4IDFhNTE1ZDMuLjQ5MzhkMjAgMTAwNjQ0Ci0tLSBhL2pkY29lZmN0LmMKKysrIGIvamRjb2VmY3QuYwpAQCAtNSwxMyArNSw2IEBACiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgogICoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgotICogVGhpcyBmaWxlIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuCi0gKiBMYXN0IE1vZGlmaWVkIDogRGVjZW1iZXIgMTgsIDIwMDUKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKICAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2xsZXIgZm9yIGRlY29tcHJlc3Npb24uCiAgKiBUaGlzIGNvbnRyb2xsZXIgaXMgdGhlIHRvcCBsZXZlbCBvZiB0aGUgSlBFRyBkZWNvbXByZXNzb3IgcHJvcGVyLgogICogVGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBsaWVzIGJldHdlZW4gZW50cm9weSBkZWNvZGluZyBhbmQgaW52ZXJzZS1EQ1Qgc3RlcHMuCkBAIC0xNDAsMTEgKzEzMyw2IEBACiB9CiAKIAotI2lmbmRlZiBORUVEX0ZBUl9QT0lOVEVSUwotI3VuZGVmIGp6ZXJvX2ZhcgotI2RlZmluZSBqemVyb19mYXIodGFyZ2V0LCBieXRlc3RvemVybykgIE1FTVpFUk8odGFyZ2V0LCBieXRlc3RvemVybykKLSNlbmRpZgotCiAvKgogICogRGVjb21wcmVzcyBhbmQgcmV0dXJuIHNvbWUgZGF0YSBpbiB0aGUgc2luZ2xlLXBhc3MgY2FzZS4KICAqIEFsd2F5cyBhdHRlbXB0cyB0byBlbWl0IG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KS4KQEAgLTE2Miw2MSArMTUwLDE1IEBACiAgIEpESU1FTlNJT04gTUNVX2NvbF9udW07CS8qIGluZGV4IG9mIGN1cnJlbnQgTUNVIHdpdGhpbiByb3cgKi8KICAgSkRJTUVOU0lPTiBsYXN0X01DVV9jb2wgPSBjaW5mby0+TUNVc19wZXJfcm93IC0gMTsKICAgSkRJTUVOU0lPTiBsYXN0X2lNQ1Vfcm93ID0gY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAtIDE7Ci0gIGludCBibGtuLCBjaSwgY3RyLCB4aW5kZXgsIHlpbmRleCwgeW9mZnNldDsKKyAgaW50IGJsa24sIGNpLCB4aW5kZXgsIHlpbmRleCwgeW9mZnNldCwgdXNlZnVsX3dpZHRoOwogICBKU0FNUEFSUkFZIG91dHB1dF9wdHI7Ci0gIEpESU1FTlNJT04gb3V0cHV0X2NvbDsKKyAgSkRJTUVOU0lPTiBzdGFydF9jb2wsIG91dHB1dF9jb2w7CiAgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CiAgIGludmVyc2VfRENUX21ldGhvZF9wdHIgaW52ZXJzZV9EQ1Q7Ci0gIEpTQU1QQVJSQVkgb3V0cHV0X3B0cl9ibGtbRF9NQVhfQkxPQ0tTX0lOX01DVV07Ci0gIEpESU1FTlNJT04gb3V0cHV0X2NvbF9vZmZbRF9NQVhfQkxPQ0tTX0lOX01DVV07Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHJfYmxrW0RfTUFYX0JMT0NLU19JTl9NQ1VdOwotICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIGludmVyc2VfRENUX2Jsa18xW0RfTUFYX0JMT0NLU19JTl9NQ1VdOwotICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIGludmVyc2VfRENUX2Jsa18yW0RfTUFYX0JMT0NLU19JTl9NQ1VdOwotICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyICppbnZlcnNlX0RDVF9ibGs7CiAKICAgLyogTG9vcCB0byBwcm9jZXNzIGFzIG11Y2ggYXMgb25lIHdob2xlIGlNQ1Ugcm93ICovCiAgIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKICAgICAgICB5b2Zmc2V0KyspIHsKLSAgICAvKiBEZXRlcm1pbmUgd2hlcmUgZGF0YSBzaG91bGQgZ28gaW4gb3V0cHV0X2J1ZiBhbmQgZG8gdGhlIElEQ1QgdGhpbmcuCi0gICAgICogV2Ugc2tpcCBkdW1teSBibG9ja3MgYXQgdGhlIHJpZ2h0IGFuZCBib3R0b20gZWRnZXMgKGJ1dCBibGtuIGdldHMKLSAgICAgKiBpbmNyZW1lbnRlZCBwYXN0IHRoZW0hKS4gIE5vdGUgdGhlIGlubmVyIGxvb3AgcmVsaWVzIG9uIGhhdmluZwotICAgICAqIGFsbG9jYXRlZCB0aGUgTUNVX2J1ZmZlcltdIGJsb2NrcyBzZXF1ZW50aWFsbHkuCi0gICAgICovCi0gICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLwotICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgICAgLyogRG9uJ3QgYm90aGVyIHRvIElEQ1QgYW4gdW5pbnRlcmVzdGluZyBjb21wb25lbnQuICovCi0gICAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7Ci0JZm9yIChjdHIgPSBjb21wcHRyLT5NQ1VfYmxvY2tzOyBjdHIgPiAwOyBjdHItLSkgewotCSAgaW52ZXJzZV9EQ1RfYmxrXzFbYmxrbl0gPSBpbnZlcnNlX0RDVF9ibGtfMltibGtuXSA9IE5VTEw7Ci0JICBibGtuKys7Ci0JfQotCWNvbnRpbnVlOwotICAgICAgfQotICAgICAgaW52ZXJzZV9EQ1QgPSBjaW5mby0+aWRjdC0+aW52ZXJzZV9EQ1RbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XTsKLSAgICAgIG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF0gKwotCXlvZmZzZXQgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgICBmb3IgKHlpbmRleCA9IDA7IHlpbmRleCA8IGNvbXBwdHItPk1DVV9oZWlnaHQ7IHlpbmRleCsrKSB7Ci0JaWYgKGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA8IGxhc3RfaU1DVV9yb3cgfHwKLQkgICAgeW9mZnNldCt5aW5kZXggPCBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQpIHsKLQkgIGZvciAoeGluZGV4ID0gMDsgeGluZGV4IDwgY29tcHB0ci0+TUNVX3dpZHRoOyB4aW5kZXgrKykgewotCSAgICBjb21wcHRyX2Jsa1tibGtuXSA9IGNvbXBwdHI7Ci0JICAgIG91dHB1dF9wdHJfYmxrW2Jsa25dID0gb3V0cHV0X3B0cjsKLQkgICAgb3V0cHV0X2NvbF9vZmZbYmxrbl0gPSB4aW5kZXggKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0JICAgIGludmVyc2VfRENUX2Jsa18xW2Jsa25dID0gaW52ZXJzZV9EQ1Q7Ci0JICAgIGludmVyc2VfRENUX2Jsa18yW2Jsa25dID0gKHhpbmRleCA8IGNvbXBwdHItPmxhc3RfY29sX3dpZHRoKSA/Ci0JCQkJICAgICAgaW52ZXJzZV9EQ1QgOiBOVUxMOwotCSAgICBibGtuKys7Ci0JICB9Ci0JfSBlbHNlIHsKLQkgIGZvciAoY3RyID0gY29tcHB0ci0+TUNVX3dpZHRoOyBjdHIgPiAwOyBjdHItLSkgewotCSAgICBpbnZlcnNlX0RDVF9ibGtfMVtibGtuXSA9IGludmVyc2VfRENUX2Jsa18yW2Jsa25dID0gTlVMTDsKLQkgICAgYmxrbisrOwotCSAgfQotCX0KLQlvdXRwdXRfcHRyICs9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKLSAgICAgIH0KLSAgICB9CiAgICAgZm9yIChNQ1VfY29sX251bSA9IGNvZWYtPk1DVV9jdHI7IE1DVV9jb2xfbnVtIDw9IGxhc3RfTUNVX2NvbDsKIAkgTUNVX2NvbF9udW0rKykgewogICAgICAgLyogVHJ5IHRvIGZldGNoIGFuIE1DVS4gIEVudHJvcHkgZGVjb2RlciBleHBlY3RzIGJ1ZmZlciB0byBiZSB6ZXJvZWQuICovCkBAIC0yMjgsMTcgKzE3MCwzOSBAQAogCWNvZWYtPk1DVV9jdHIgPSBNQ1VfY29sX251bTsKIAlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CiAgICAgICB9Ci0gICAgICBpbnZlcnNlX0RDVF9ibGsgPSAoTUNVX2NvbF9udW0gPCBsYXN0X01DVV9jb2wpID8gaW52ZXJzZV9EQ1RfYmxrXzEKLQkJCQkJCSAgICAgOiBpbnZlcnNlX0RDVF9ibGtfMjsKLSAgICAgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7Ci0JaW52ZXJzZV9EQ1QgPSBpbnZlcnNlX0RDVF9ibGtbYmxrbl07Ci0JaWYgKGludmVyc2VfRENUID09IE5VTEwpCisgICAgICAvKiBEZXRlcm1pbmUgd2hlcmUgZGF0YSBzaG91bGQgZ28gaW4gb3V0cHV0X2J1ZiBhbmQgZG8gdGhlIElEQ1QgdGhpbmcuCisgICAgICAgKiBXZSBza2lwIGR1bW15IGJsb2NrcyBhdCB0aGUgcmlnaHQgYW5kIGJvdHRvbSBlZGdlcyAoYnV0IGJsa24gZ2V0cworICAgICAgICogaW5jcmVtZW50ZWQgcGFzdCB0aGVtISkuICBOb3RlIHRoZSBpbm5lciBsb29wIHJlbGllcyBvbiBoYXZpbmcKKyAgICAgICAqIGFsbG9jYXRlZCB0aGUgTUNVX2J1ZmZlcltdIGJsb2NrcyBzZXF1ZW50aWFsbHkuCisgICAgICAgKi8KKyAgICAgIGJsa24gPSAwOwkJCS8qIGluZGV4IG9mIGN1cnJlbnQgRENUIGJsb2NrIHdpdGhpbiBNQ1UgKi8KKyAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisJY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKwkvKiBEb24ndCBib3RoZXIgdG8gSURDVCBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KKwlpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7CisJICBibGtuICs9IGNvbXBwdHItPk1DVV9ibG9ja3M7CiAJICBjb250aW51ZTsKLQljb21wcHRyID0gY29tcHB0cl9ibGtbYmxrbl07Ci0Jb3V0cHV0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3NhbXBsZV93aWR0aCArCi0JCSAgICAgb3V0cHV0X2NvbF9vZmZbYmxrbl07Ci0JKCppbnZlcnNlX0RDVCkgKGNpbmZvLCBjb21wcHRyLCAoSkNPRUZQVFIpIGNvZWYtPk1DVV9idWZmZXJbYmxrbl0sCi0JCQlvdXRwdXRfcHRyX2Jsa1tibGtuXSwgb3V0cHV0X2NvbCk7CisJfQorCWludmVyc2VfRENUID0gY2luZm8tPmlkY3QtPmludmVyc2VfRENUW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF07CisJdXNlZnVsX3dpZHRoID0gKE1DVV9jb2xfbnVtIDwgbGFzdF9NQ1VfY29sKSA/IGNvbXBwdHItPk1DVV93aWR0aAorCQkJCQkJICAgIDogY29tcHB0ci0+bGFzdF9jb2xfd2lkdGg7CisJb3V0cHV0X3B0ciA9IG91dHB1dF9idWZbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSArCisJICB5b2Zmc2V0ICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworCXN0YXJ0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3NhbXBsZV93aWR0aDsKKwlmb3IgKHlpbmRleCA9IDA7IHlpbmRleCA8IGNvbXBwdHItPk1DVV9oZWlnaHQ7IHlpbmRleCsrKSB7CisJICBpZiAoY2luZm8tPmlucHV0X2lNQ1Vfcm93IDwgbGFzdF9pTUNVX3JvdyB8fAorCSAgICAgIHlvZmZzZXQreWluZGV4IDwgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0KSB7CisJICAgIG91dHB1dF9jb2wgPSBzdGFydF9jb2w7CisJICAgIGZvciAoeGluZGV4ID0gMDsgeGluZGV4IDwgdXNlZnVsX3dpZHRoOyB4aW5kZXgrKykgeworCSAgICAgICgqaW52ZXJzZV9EQ1QpIChjaW5mbywgY29tcHB0ciwKKwkJCSAgICAgIChKQ09FRlBUUikgY29lZi0+TUNVX2J1ZmZlcltibGtuK3hpbmRleF0sCisJCQkgICAgICBvdXRwdXRfcHRyLCBvdXRwdXRfY29sKTsKKwkgICAgICBvdXRwdXRfY29sICs9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKwkgICAgfQorCSAgfQorCSAgYmxrbiArPSBjb21wcHRyLT5NQ1Vfd2lkdGg7CisJICBvdXRwdXRfcHRyICs9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKwl9CiAgICAgICB9CiAgICAgfQogICAgIC8qIENvbXBsZXRlZCBhbiBNQ1Ugcm93LCBidXQgcGVyaGFwcyBub3QgYW4gaU1DVSByb3cgKi8KQEAgLTI4Niw4ICsyNTAsNiBAQAogICBKQkxPQ0tBUlJBWSBidWZmZXJbTUFYX0NPTVBTX0lOX1NDQU5dOwogICBKQkxPQ0tST1cgYnVmZmVyX3B0cjsKICAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgaW50IE1DVV93aWR0aFtEX01BWF9CTE9DS1NfSU5fTUNVXTsKLSAgSkJMT0NLUk9XIE1DVV9idWZmZXJfYmFzZVtEX01BWF9CTE9DS1NfSU5fTUNVXTsKIAogICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4gKi8KICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKQEAgLTMwNSwyNCArMjY3LDE5IEBACiAgIC8qIExvb3AgdG8gcHJvY2VzcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KICAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OwogICAgICAgIHlvZmZzZXQrKykgewotICAgIC8qIENvbnN0cnVjdCBsaXN0IG9mIHBvaW50ZXJzIHRvIERDVCBibG9ja3MgYmVsb25naW5nIHRvIHRoaXMgTUNVICovCi0gICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLwotICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgICAgZm9yICh5aW5kZXggPSAwOyB5aW5kZXggPCBjb21wcHRyLT5NQ1VfaGVpZ2h0OyB5aW5kZXgrKykgewotCWJ1ZmZlcl9wdHIgPSBidWZmZXJbY2ldW3lpbmRleCt5b2Zmc2V0XTsKLQlmb3IgKHhpbmRleCA9IDA7IHhpbmRleCA8IGNvbXBwdHItPk1DVV93aWR0aDsgeGluZGV4KyspIHsKLQkgIE1DVV93aWR0aFtibGtuXSA9IGNvbXBwdHItPk1DVV93aWR0aDsKLQkgIE1DVV9idWZmZXJfYmFzZVtibGtuXSA9IGJ1ZmZlcl9wdHIrKzsKLQkgIGJsa24rKzsKLQl9Ci0gICAgICB9Ci0gICAgfQogICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5NQ1VfY3RyOyBNQ1VfY29sX251bSA8IGNpbmZvLT5NQ1VzX3Blcl9yb3c7CiAJIE1DVV9jb2xfbnVtKyspIHsKLSAgICAgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7Ci0Jc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBNQ1Vfd2lkdGhbYmxrbl07Ci0JY29lZi0+TUNVX2J1ZmZlcltibGtuXSA9IE1DVV9idWZmZXJfYmFzZVtibGtuXSArIHN0YXJ0X2NvbDsKKyAgICAgIC8qIENvbnN0cnVjdCBsaXN0IG9mIHBvaW50ZXJzIHRvIERDVCBibG9ja3MgYmVsb25naW5nIHRvIHRoaXMgTUNVICovCisgICAgICBibGtuID0gMDsJCQkvKiBpbmRleCBvZiBjdXJyZW50IERDVCBibG9jayB3aXRoaW4gTUNVICovCisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworCWNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisJc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfd2lkdGg7CisJZm9yICh5aW5kZXggPSAwOyB5aW5kZXggPCBjb21wcHRyLT5NQ1VfaGVpZ2h0OyB5aW5kZXgrKykgeworCSAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltjaV1beWluZGV4K3lvZmZzZXRdICsgc3RhcnRfY29sOworCSAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IHhpbmRleCsrKSB7CisJICAgIGNvZWYtPk1DVV9idWZmZXJbYmxrbisrXSA9IGJ1ZmZlcl9wdHIrKzsKKwkgIH0KKwl9CiAgICAgICB9CiAgICAgICAvKiBUcnkgdG8gZmV0Y2ggdGhlIE1DVS4gKi8KICAgICAgIGlmICghICgqY2luZm8tPmVudHJvcHktPmRlY29kZV9tY3UpIChjaW5mbywgY29lZi0+TUNVX2J1ZmZlcikpIHsKQEAgLTQ5NywxNSArNDU0LDYgQEAKIAogCiAvKgotICogU0lNRCBFeHQ6IE1vc3Qgb2YgU1NFL1NTRTIgaW5zdHJ1Y3Rpb25zIHJlcXVpcmUgdGhhdCB0aGUgbWVtb3J5IGFkZHJlc3MKLSAqIGlzIGFsaWduZWQgdG8gYSAxNi1ieXRlIGJvdW5kYXJ5OyBpZiBub3QsIGEgZ2VuZXJhbC1wcm90ZWN0aW9uIGV4Y2VwdGlvbgotICogKCNHUCkgaXMgZ2VuZXJhdGVkLgotICovCi0KLSNkZWZpbmUgQUxJR05fU0laRQkxNgkJLyogc2l6ZW9mIFNTRS9TU0UyIHJlZ2lzdGVyICovCi0jZGVmaW5lIEFMSUdOX01FTShwLGEpCSgodm9pZCAqKSAoKChzaXplX3QpIChwKSArIChhKSAtIDEpICYgLShhKSkpCi0KLS8qCiAgKiBWYXJpYW50IG9mIGRlY29tcHJlc3NfZGF0YSBmb3IgdXNlIHdoZW4gZG9pbmcgYmxvY2sgc21vb3RoaW5nLgogICovCiAKQEAgLTUyMyw4ICs0NzEsNyBAQAogICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwogICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIGludmVyc2VfRENUOwogICBib29sZWFuIGZpcnN0X3JvdywgbGFzdF9yb3c7Ci0gIEpDT0VGIHdvcmtzcGFjZVtEQ1RTSVpFMiArIEFMSUdOX1NJWkUvc2l6ZW9mKEpDT0VGKV07Ci0gIEpDT0VGICogd29ya3B0ciA9IChKQ09FRiAqKSBBTElHTl9NRU0od29ya3NwYWNlLCBBTElHTl9TSVpFKTsKKyAgSkJMT0NLIHdvcmtzcGFjZTsKICAgaW50ICpjb2VmX2JpdHM7CiAgIEpRVUFOVF9UQkwgKnF1YW50dGJsOwogICBJTlQzMiBRMDAsUTAxLFEwMixRMTAsUTExLFEyMCwgbnVtOwpAQCAtNjEzLDcgKzU2MCw3IEBACiAgICAgICBsYXN0X2Jsb2NrX2NvbHVtbiA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAtIDE7CiAgICAgICBmb3IgKGJsb2NrX251bSA9IDA7IGJsb2NrX251bSA8PSBsYXN0X2Jsb2NrX2NvbHVtbjsgYmxvY2tfbnVtKyspIHsKIAkvKiBGZXRjaCBjdXJyZW50IERDVCBibG9jayBpbnRvIHdvcmtzcGFjZSBzbyB3ZSBjYW4gbW9kaWZ5IGl0LiAqLwotCWpjb3B5X2Jsb2NrX3JvdyhidWZmZXJfcHRyLCAoSkJMT0NLUk9XKSB3b3JrcHRyLCAoSkRJTUVOU0lPTikgMSk7CisJamNvcHlfYmxvY2tfcm93KGJ1ZmZlcl9wdHIsIChKQkxPQ0tST1cpIHdvcmtzcGFjZSwgKEpESU1FTlNJT04pIDEpOwogCS8qIFVwZGF0ZSBEQyB2YWx1ZXMgKi8KIAlpZiAoYmxvY2tfbnVtIDwgbGFzdF9ibG9ja19jb2x1bW4pIHsKIAkgIERDMyA9IChpbnQpIHByZXZfYmxvY2tfcm93WzFdWzBdOwpAQCAtNjI1LDcgKzU3Miw3IEBACiAJICogYW5kIGlzIG5vdCBrbm93biB0byBiZSBmdWxseSBhY2N1cmF0ZS4KIAkgKi8KIAkvKiBBQzAxICovCi0JaWYgKChBbD1jb2VmX2JpdHNbMV0pICE9IDAgJiYgd29ya3B0clsxXSA9PSAwKSB7CisJaWYgKChBbD1jb2VmX2JpdHNbMV0pICE9IDAgJiYgd29ya3NwYWNlWzFdID09IDApIHsKIAkgIG51bSA9IDM2ICogUTAwICogKERDNCAtIERDNik7CiAJICBpZiAobnVtID49IDApIHsKIAkgICAgcHJlZCA9IChpbnQpICgoKFEwMTw8NykgKyBudW0pIC8gKFEwMTw8OCkpOwpAQCAtNjM3LDEwICs1ODQsMTAgQEAKIAkgICAgICBwcmVkID0gKDE8PEFsKS0xOwogCSAgICBwcmVkID0gLXByZWQ7CiAJICB9Ci0JICB3b3JrcHRyWzFdID0gKEpDT0VGKSBwcmVkOworCSAgd29ya3NwYWNlWzFdID0gKEpDT0VGKSBwcmVkOwogCX0KIAkvKiBBQzEwICovCi0JaWYgKChBbD1jb2VmX2JpdHNbMl0pICE9IDAgJiYgd29ya3B0cls4XSA9PSAwKSB7CisJaWYgKChBbD1jb2VmX2JpdHNbMl0pICE9IDAgJiYgd29ya3NwYWNlWzhdID09IDApIHsKIAkgIG51bSA9IDM2ICogUTAwICogKERDMiAtIERDOCk7CiAJICBpZiAobnVtID49IDApIHsKIAkgICAgcHJlZCA9IChpbnQpICgoKFExMDw8NykgKyBudW0pIC8gKFExMDw8OCkpOwpAQCAtNjUyLDEwICs1OTksMTAgQEAKIAkgICAgICBwcmVkID0gKDE8PEFsKS0xOwogCSAgICBwcmVkID0gLXByZWQ7CiAJICB9Ci0JICB3b3JrcHRyWzhdID0gKEpDT0VGKSBwcmVkOworCSAgd29ya3NwYWNlWzhdID0gKEpDT0VGKSBwcmVkOwogCX0KIAkvKiBBQzIwICovCi0JaWYgKChBbD1jb2VmX2JpdHNbM10pICE9IDAgJiYgd29ya3B0clsxNl0gPT0gMCkgeworCWlmICgoQWw9Y29lZl9iaXRzWzNdKSAhPSAwICYmIHdvcmtzcGFjZVsxNl0gPT0gMCkgewogCSAgbnVtID0gOSAqIFEwMCAqIChEQzIgKyBEQzggLSAyKkRDNSk7CiAJICBpZiAobnVtID49IDApIHsKIAkgICAgcHJlZCA9IChpbnQpICgoKFEyMDw8NykgKyBudW0pIC8gKFEyMDw8OCkpOwpAQCAtNjY3LDEwICs2MTQsMTAgQEAKIAkgICAgICBwcmVkID0gKDE8PEFsKS0xOwogCSAgICBwcmVkID0gLXByZWQ7CiAJICB9Ci0JICB3b3JrcHRyWzE2XSA9IChKQ09FRikgcHJlZDsKKwkgIHdvcmtzcGFjZVsxNl0gPSAoSkNPRUYpIHByZWQ7CiAJfQogCS8qIEFDMTEgKi8KLQlpZiAoKEFsPWNvZWZfYml0c1s0XSkgIT0gMCAmJiB3b3JrcHRyWzldID09IDApIHsKKwlpZiAoKEFsPWNvZWZfYml0c1s0XSkgIT0gMCAmJiB3b3Jrc3BhY2VbOV0gPT0gMCkgewogCSAgbnVtID0gNSAqIFEwMCAqIChEQzEgLSBEQzMgLSBEQzcgKyBEQzkpOwogCSAgaWYgKG51bSA+PSAwKSB7CiAJICAgIHByZWQgPSAoaW50KSAoKChRMTE8PDcpICsgbnVtKSAvIChRMTE8PDgpKTsKQEAgLTY4MiwxMCArNjI5LDEwIEBACiAJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKIAkgICAgcHJlZCA9IC1wcmVkOwogCSAgfQotCSAgd29ya3B0cls5XSA9IChKQ09FRikgcHJlZDsKKwkgIHdvcmtzcGFjZVs5XSA9IChKQ09FRikgcHJlZDsKIAl9CiAJLyogQUMwMiAqLwotCWlmICgoQWw9Y29lZl9iaXRzWzVdKSAhPSAwICYmIHdvcmtwdHJbMl0gPT0gMCkgeworCWlmICgoQWw9Y29lZl9iaXRzWzVdKSAhPSAwICYmIHdvcmtzcGFjZVsyXSA9PSAwKSB7CiAJICBudW0gPSA5ICogUTAwICogKERDNCArIERDNiAtIDIqREM1KTsKIAkgIGlmIChudW0gPj0gMCkgewogCSAgICBwcmVkID0gKGludCkgKCgoUTAyPDw3KSArIG51bSkgLyAoUTAyPDw4KSk7CkBAIC02OTcsMTAgKzY0NCwxMCBAQAogCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7CiAJICAgIHByZWQgPSAtcHJlZDsKIAkgIH0KLQkgIHdvcmtwdHJbMl0gPSAoSkNPRUYpIHByZWQ7CisJICB3b3Jrc3BhY2VbMl0gPSAoSkNPRUYpIHByZWQ7CiAJfQogCS8qIE9LLCBkbyB0aGUgSURDVCAqLwotCSgqaW52ZXJzZV9EQ1QpIChjaW5mbywgY29tcHB0ciwgKEpDT0VGUFRSKSB3b3JrcHRyLAorCSgqaW52ZXJzZV9EQ1QpIChjaW5mbywgY29tcHB0ciwgKEpDT0VGUFRSKSB3b3Jrc3BhY2UsCiAJCQlvdXRwdXRfcHRyLCBvdXRwdXRfY29sKTsKIAkvKiBBZHZhbmNlIGZvciBuZXh0IGNvbHVtbiAqLwogCURDMSA9IERDMjsgREMyID0gREMzOwpkaWZmIC0tZ2l0IGEvamRjb2xvci5jIGIvamRjb2xvci5jCmluZGV4IDlhOGM3ZWEuLmQyZDE0ODMgMTAwNjQ0Ci0tLSBhL2pkY29sb3IuYworKysgYi9qZGNvbG9yLmMKQEAgLTIsMjMgKzIsMTcgQEAKICAqIGpkY29sb3IuYwogICoKICAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIENvcHlyaWdodCAyMDA5IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi0gKiBUaGlzIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgZm9yIFNJTUQgZXh0ZW5zaW9uLgotICogTGFzdCBNb2RpZmllZCA6IEphbnVhcnkgNSwgMjAwNgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgogICogVGhpcyBmaWxlIGNvbnRhaW5zIG91dHB1dCBjb2xvcnNwYWNlIGNvbnZlcnNpb24gcm91dGluZXMuCiAgKi8KIAogI2RlZmluZSBKUEVHX0lOVEVSTkFMUwogI2luY2x1ZGUgImppbmNsdWRlLmgiCiAjaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpjb2xzYW1wLmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyAqLworI2luY2x1ZGUgImpzaW1kLmgiCiAKIAogLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KQEAgLTExMywxNyArMTA3LDYgQEAKIH0KIAogCi0jaWYgUkdCX1BJWEVMU0laRSA9PSA0Ci0vKiBvZmZzZXQgb2YgZmlsbGVyIGJ5dGUgKi8KLSNkZWZpbmUgUkdCX0ZJTExFUiAgKDYgLSAoUkdCX1JFRCkgLSAoUkdCX0dSRUVOKSAtIChSR0JfQkxVRSkpCi0vKiBieXRlIHBhdHRlcm4gdG8gZmlsbCB3aXRoICovCi0jaWZkZWYgUkdCWF9GSUxMRVJfMFhGRgotI2RlZmluZSBSR0JfRklMTEVSX0JZVEUgMHhGRgotI2Vsc2UKLSNkZWZpbmUgUkdCX0ZJTExFUl9CWVRFIDB4MDAKLSNlbmRpZgotI2VuZGlmIC8qIFJHQl9QSVhFTFNJWkUgPT0gNCAqLwotCiAvKgogICogQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgb3V0cHV0IGNvbG9yc3BhY2UuCiAgKgpAQCAtMTcwLDkgKzE1Myw2IEBACiAJCQkgICAgICAoKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sCiAJCQkJCQkgU0NBTEVCSVRTKSldOwogICAgICAgb3V0cHRyW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgQ2JidGFiW2NiXV07Ci0jaWYgUkdCX1BJWEVMU0laRSA9PSA0Ci0gICAgICBvdXRwdHJbUkdCX0ZJTExFUl0gPSBSR0JfRklMTEVSX0JZVEU7Ci0jZW5kaWYKICAgICAgIG91dHB0ciArPSBSR0JfUElYRUxTSVpFOwogICAgIH0KICAgfQpAQCAtMjUwLDkgKzIzMCw2IEBACiAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKICAgICAgIC8qIFdlIGNhbiBkaXNwZW5zZSB3aXRoIEdFVEpTQU1QTEUoKSBoZXJlICovCiAgICAgICBvdXRwdHJbUkdCX1JFRF0gPSBvdXRwdHJbUkdCX0dSRUVOXSA9IG91dHB0cltSR0JfQkxVRV0gPSBpbnB0cltjb2xdOwotI2lmIFJHQl9QSVhFTFNJWkUgPT0gNAotICAgICAgb3V0cHRyW1JHQl9GSUxMRVJdID0gUkdCX0ZJTExFUl9CWVRFOwotI2VuZGlmCiAgICAgICBvdXRwdHIgKz0gUkdCX1BJWEVMU0laRTsKICAgICB9CiAgIH0KQEAgLTMzMCw3ICszMDcsNiBAQAogewogICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQ7CiAgIGludCBjaTsKLSAgdW5zaWduZWQgaW50IHNpbWQgPSBqcGVnX3NpbWRfc3VwcG9ydCgoal9jb21tb25fcHRyKSBjaW5mbyk7CiAKICAgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKQogICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCkBAIC0zODQsMjAgKzM2MCw5IEBACiAgIGNhc2UgSkNTX1JHQjoKICAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSBSR0JfUElYRUxTSVpFOwogICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKLSNpZiBSR0JfUElYRUxTSVpFID09IDMgfHwgUkdCX1BJWEVMU0laRSA9PSA0Ci0jaWZkZWYgSkRDT0xPUl9ZQ0NSR0JfU1NFMl9TVVBQT1JURUQKLSAgICAgIGlmIChzaW1kICYgSlNJTURfU1NFMiAmJgotICAgICAgICAgIElTX0NPTlNUX0FMSUdORURfMTYoamNvbnN0X3ljY19yZ2JfY29udmVydF9zc2UyKSkgewotICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBqcGVnX3ljY19yZ2JfY29udmVydF9zc2UyOwotICAgICAgfSBlbHNlCi0jZW5kaWYKLSNpZmRlZiBKRENPTE9SX1lDQ1JHQl9NTVhfU1VQUE9SVEVECi0gICAgICBpZiAoc2ltZCAmIEpTSU1EX01NWCkgewotICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBqcGVnX3ljY19yZ2JfY29udmVydF9tbXg7Ci0gICAgICB9IGVsc2UKLSNlbmRpZgotI2VuZGlmIC8qIFJHQl9QSVhFTFNJWkUgPT0gMyB8fCBSR0JfUElYRUxTSVpFID09IDQgKi8KLSAgICAgIHsKKyAgICAgIGlmIChqc2ltZF9jYW5feWNjX3JnYigpKQorICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBqc2ltZF95Y2NfcmdiX2NvbnZlcnQ7CisgICAgICBlbHNlIHsKICAgICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0geWNjX3JnYl9jb252ZXJ0OwogICAgICAgICBidWlsZF95Y2NfcmdiX3RhYmxlKGNpbmZvKTsKICAgICAgIH0KQEAgLTQzNSwyOCArNDAwLDMgQEAKICAgZWxzZQogICAgIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKIH0KLQotCi0jaWZuZGVmIEpTSU1EX01PREVJTkZPX05PVF9TVVBQT1JURUQKLQotR0xPQkFMKHVuc2lnbmVkIGludCkKLWpwZWdfc2ltZF9jb2xvcl9kZWNvbnZlcnRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgdW5zaWduZWQgaW50IHNpbWQgPSBqcGVnX3NpbWRfc3VwcG9ydCgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0KLSNpZiBSR0JfUElYRUxTSVpFID09IDMgfHwgUkdCX1BJWEVMU0laRSA9PSA0Ci0jaWZkZWYgSkRDT0xPUl9ZQ0NSR0JfU1NFMl9TVVBQT1JURUQKLSAgaWYgKHNpbWQgJiBKU0lNRF9TU0UyICYmCi0gICAgICBJU19DT05TVF9BTElHTkVEXzE2KGpjb25zdF95Y2NfcmdiX2NvbnZlcnRfc3NlMikpCi0gICAgcmV0dXJuIEpTSU1EX1NTRTI7Ci0jZW5kaWYKLSNpZmRlZiBKRENPTE9SX1lDQ1JHQl9NTVhfU1VQUE9SVEVECi0gIGlmIChzaW1kICYgSlNJTURfTU1YKQotICAgIHJldHVybiBKU0lNRF9NTVg7Ci0jZW5kaWYKLSNlbmRpZiAvKiBSR0JfUElYRUxTSVpFID09IDMgfHwgUkdCX1BJWEVMU0laRSA9PSA0ICovCi0KLSAgcmV0dXJuIEpTSU1EX05PTkU7Ci19Ci0KLSNlbmRpZiAvKiAhSlNJTURfTU9ERUlORk9fTk9UX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvamRjb2xzczIuYXNtIGIvamRjb2xzczIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDZmMDRkLi4wMDAwMDAwCi0tLSBhL2pkY29sc3MyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDUzNiArMCwwIEBACi07Ci07IGpkY29sc3MyLmFzbSAtIGNvbG9yc3BhY2UgY29udmVyc2lvbiAoU1NFMikKLTsKLTsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Ci07IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi07IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKLTsKLTsgVGhpcyBmaWxlIHNob3VsZCBiZSBhc3NlbWJsZWQgd2l0aCBOQVNNIChOZXR3aWRlIEFzc2VtYmxlciksCi07IGNhbiAqbm90KiBiZSBhc3NlbWJsZWQgd2l0aCBNaWNyb3NvZnQncyBNQVNNIG9yIGFueSBjb21wYXRpYmxlCi07IGFzc2VtYmxlciAoaW5jbHVkaW5nIEJvcmxhbmQncyBUdXJibyBBc3NlbWJsZXIpLgotOyBOQVNNIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9uYXNtLnNvdXJjZWZvcmdlLm5ldC8gb3IKLTsgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NjIwOAotOwotOyBMYXN0IE1vZGlmaWVkIDogRmVicnVhcnkgNCwgMjAwNgotOwotOyBbVEFCOF0KLQotJWluY2x1ZGUgImpzaW1kZXh0LmluYyIKLSVpbmNsdWRlICJqY29sc2FtcC5pbmMiCi0KLSVpZiBSR0JfUElYRUxTSVpFID09IDMgfHwgUkdCX1BJWEVMU0laRSA9PSA0Ci0laWZkZWYgSkRDT0xPUl9ZQ0NSR0JfU1NFMl9TVVBQT1JURUQKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0lZGVmaW5lIFNDQUxFQklUUwkxNgotCi1GXzBfMzQ0CWVxdQkgMjI1NTQJCQk7IEZJWCgwLjM0NDE0KQotRl8wXzcxNAllcXUJIDQ2ODAyCQkJOyBGSVgoMC43MTQxNCkKLUZfMV80MDIJZXF1CSA5MTg4MQkJCTsgRklYKDEuNDAyMDApCi1GXzFfNzcyCWVxdQkxMTYxMzAJCQk7IEZJWCgxLjc3MjAwKQotRl8wXzQwMgllcXUJKEZfMV80MDIgLSA2NTUzNikJOyBGSVgoMS40MDIwMCkgLSBGSVgoMSkKLUZfMF8yODUJZXF1CSggNjU1MzYgLSBGXzBfNzE0KQk7IEZJWCgxKSAtIEZJWCgwLjcxNDE0KQotRl8wXzIyOAllcXUJKDEzMTA3MiAtIEZfMV83NzIpCTsgRklYKDIpIC0gRklYKDEuNzcyMDApCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19DT05TVAotCi0JYWxpZ256CTE2Ci0JZ2xvYmFsCUVYVE4oamNvbnN0X3ljY19yZ2JfY29udmVydF9zc2UyKQotCi1FWFROKGpjb25zdF95Y2NfcmdiX2NvbnZlcnRfc3NlMik6Ci0KLVBXX0YwNDAyCXRpbWVzIDggZHcgIEZfMF80MDIKLVBXX01GMDIyOAl0aW1lcyA4IGR3IC1GXzBfMjI4Ci1QV19NRjAzNDRfRjAyODUJdGltZXMgNCBkdyAtRl8wXzM0NCwgRl8wXzI4NQotUFdfT05FCQl0aW1lcyA4IGR3ICAxCi1QRF9PTkVIQUxGCXRpbWVzIDQgZGQgIDEgPDwgKFNDQUxFQklUUy0xKQotCi0JYWxpZ256CTE2Ci0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19URVhUCi0JQklUUwkzMgotOwotOyBDb252ZXJ0IHNvbWUgcm93cyBvZiBzYW1wbGVzIHRvIHRoZSBvdXRwdXQgY29sb3JzcGFjZS4KLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfeWNjX3JnYl9jb252ZXJ0X3NzZTIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi07Ci0KLSVkZWZpbmUgY2luZm8oYikJKGIpKzgJCTsgal9kZWNvbXByZXNzX3B0ciBjaW5mbwotJWRlZmluZSBpbnB1dF9idWYoYikJKGIpKzEyCQk7IEpTQU1QSU1BR0UgaW5wdXRfYnVmCi0lZGVmaW5lIGlucHV0X3JvdyhiKQkoYikrMTYJCTsgSkRJTUVOU0lPTiBpbnB1dF9yb3cKLSVkZWZpbmUgb3V0cHV0X2J1ZihiKQkoYikrMjAJCTsgSlNBTVBBUlJBWSBvdXRwdXRfYnVmCi0lZGVmaW5lIG51bV9yb3dzKGIpCShiKSsyNAkJOyBpbnQgbnVtX3Jvd3MKLQotJWRlZmluZSBvcmlnaW5hbF9lYnAJZWJwKzAKLSVkZWZpbmUgd2soaSkJCWVicC0oV0tfTlVNLShpKSkqU0laRU9GX1hNTVdPUkQJOyB4bW13b3JkIHdrW1dLX05VTV0KLSVkZWZpbmUgV0tfTlVNCQkyCi0lZGVmaW5lIGdvdHB0cgkJd2soMCktU0laRU9GX1BPSU5URVIJOyB2b2lkICogZ290cHRyCi0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfeWNjX3JnYl9jb252ZXJ0X3NzZTIpCi0KLUVYVE4oanBlZ195Y2NfcmdiX2NvbnZlcnRfc3NlMik6Ci0JcHVzaAllYnAKLQltb3YJZWF4LGVzcAkJCQk7IGVheCA9IG9yaWdpbmFsIGVicAotCXN1Ygllc3AsIGJ5dGUgNAotCWFuZAllc3AsIGJ5dGUgKC1TSVpFT0ZfWE1NV09SRCkJOyBhbGlnbiB0byAxMjggYml0cwotCW1vdglbZXNwXSxlYXgKLQltb3YJZWJwLGVzcAkJCQk7IGVicCA9IGFsaWduZWQgZWJwCi0JbGVhCWVzcCwgW3drKDApXQotCXB1c2hwaWMJZWF4CQk7IG1ha2UgYSByb29tIGZvciBHT1QgYWRkcmVzcwotCXB1c2gJZWJ4Ci07CXB1c2gJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwdXNoCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwdXNoCWVzaQotCXB1c2gJZWRpCi0KLQlnZXRfR09UCWVieAkJCTsgZ2V0IEdPVCBhZGRyZXNzCi0JbW92cGljCVBPSU5URVIgW2dvdHB0cl0sIGVieAk7IHNhdmUgR09UIGFkZHJlc3MKLQotCW1vdgllY3gsIFBPSU5URVIgW2NpbmZvKGVheCldCi0JbW92CWVjeCwgSkRJTUVOU0lPTiBbamRzdHJ1Y3Rfb3V0cHV0X3dpZHRoKGVjeCldCTsgbnVtX2NvbHMKLQl0ZXN0CWVjeCxlY3gKLQlqegluZWFyIC5yZXR1cm4KLQotCXB1c2gJZWN4Ci0KLQltb3YJZWRpLCBKU0FNUElNQUdFIFtpbnB1dF9idWYoZWF4KV0KLQltb3YJZWN4LCBKRElNRU5TSU9OIFtpbnB1dF9yb3coZWF4KV0KLQltb3YJZXNpLCBKU0FNUEFSUkFZIFtlZGkrMCpTSVpFT0ZfSlNBTVBBUlJBWV0KLQltb3YJZWJ4LCBKU0FNUEFSUkFZIFtlZGkrMSpTSVpFT0ZfSlNBTVBBUlJBWV0KLQltb3YJZWR4LCBKU0FNUEFSUkFZIFtlZGkrMipTSVpFT0ZfSlNBTVBBUlJBWV0KLQlsZWEJZXNpLCBbZXNpK2VjeCpTSVpFT0ZfSlNBTVBST1ddCi0JbGVhCWVieCwgW2VieCtlY3gqU0laRU9GX0pTQU1QUk9XXQotCWxlYQllZHgsIFtlZHgrZWN4KlNJWkVPRl9KU0FNUFJPV10KLQotCXBvcAllY3gKLQotCW1vdgllZGksIEpTQU1QQVJSQVkgW291dHB1dF9idWYoZWF4KV0KLQltb3YJZWF4LCBJTlQgW251bV9yb3dzKGVheCldCi0JdGVzdAllYXgsZWF4Ci0JamxlCW5lYXIgLnJldHVybgotCWFsaWdueAkxNiw3Ci0ucm93bG9vcDoKLQlwdXNoCWVheAotCXB1c2gJZWRpCi0JcHVzaAllZHgKLQlwdXNoCWVieAotCXB1c2gJZXNpCi0JcHVzaAllY3gJCQk7IGNvbAotCi0JbW92CWVzaSwgSlNBTVBST1cgW2VzaV0JOyBpbnB0cjAKLQltb3YJZWJ4LCBKU0FNUFJPVyBbZWJ4XQk7IGlucHRyMQotCW1vdgllZHgsIEpTQU1QUk9XIFtlZHhdCTsgaW5wdHIyCi0JbW92CWVkaSwgSlNBTVBST1cgW2VkaV0JOyBvdXRwdHIKLQltb3ZwaWMJZWF4LCBQT0lOVEVSIFtnb3RwdHJdCTsgbG9hZCBHT1QgYWRkcmVzcyAoZWF4KQotCWFsaWdueAkxNiw3Ci0uY29sdW1ubG9vcDoKLQotCW1vdmRxYQl4bW01LCBYTU1XT1JEIFtlYnhdCTsgeG1tNT1DYigwMTIzNDU2Nzg5QUJDREVGKQotCW1vdmRxYQl4bW0xLCBYTU1XT1JEIFtlZHhdCTsgeG1tMT1DcigwMTIzNDU2Nzg5QUJDREVGKQotCi0JcGNtcGVxdwl4bW00LHhtbTQKLQlwY21wZXF3CXhtbTcseG1tNwotCXBzcmx3CXhtbTQsQllURV9CSVQKLQlwc2xsdwl4bW03LDcJCQk7IHhtbTc9ezB4RkY4MCAweEZGODAgMHhGRjgwIDB4RkY4MCAuLn0KLQltb3ZkcWEJeG1tMCx4bW00CQk7IHhtbTA9eG1tND17MHhGRiAweDAwIDB4RkYgMHgwMCAuLn0KLQotCXBhbmQJeG1tNCx4bW01CQk7IHhtbTQ9Q2IoMDI0NjhBQ0UpPUNiRQotCXBzcmx3CXhtbTUsQllURV9CSVQJCTsgeG1tNT1DYigxMzU3OUJERik9Q2JPCi0JcGFuZAl4bW0wLHhtbTEJCTsgeG1tMD1DcigwMjQ2OEFDRSk9Q3JFCi0JcHNybHcJeG1tMSxCWVRFX0JJVAkJOyB4bW0xPUNyKDEzNTc5QkRGKT1Dck8KLQotCXBhZGR3CXhtbTQseG1tNwotCXBhZGR3CXhtbTUseG1tNwotCXBhZGR3CXhtbTAseG1tNwotCXBhZGR3CXhtbTEseG1tNwotCi0JOyAoT3JpZ2luYWwpCi0JOyBSID0gWSAgICAgICAgICAgICAgICArIDEuNDAyMDAgKiBDcgotCTsgRyA9IFkgLSAwLjM0NDE0ICogQ2IgLSAwLjcxNDE0ICogQ3IKLQk7IEIgPSBZICsgMS43NzIwMCAqIENiCi0JOwotCTsgKFRoaXMgaW1wbGVtZW50YXRpb24pCi0JOyBSID0gWSAgICAgICAgICAgICAgICArIDAuNDAyMDAgKiBDciArIENyCi0JOyBHID0gWSAtIDAuMzQ0MTQgKiBDYiArIDAuMjg1ODYgKiBDciAtIENyCi0JOyBCID0gWSAtIDAuMjI4MDAgKiBDYiArIENiICsgQ2IKLQotCW1vdmRxYQl4bW0yLHhtbTQJCTsgeG1tMj1DYkUKLQltb3ZkcWEJeG1tMyx4bW01CQk7IHhtbTM9Q2JPCi0JcGFkZHcJeG1tNCx4bW00CQk7IHhtbTQ9MipDYkUKLQlwYWRkdwl4bW01LHhtbTUJCTsgeG1tNT0yKkNiTwotCW1vdmRxYQl4bW02LHhtbTAJCTsgeG1tNj1DckUKLQltb3ZkcWEJeG1tNyx4bW0xCQk7IHhtbTc9Q3JPCi0JcGFkZHcJeG1tMCx4bW0wCQk7IHhtbTA9MipDckUKLQlwYWRkdwl4bW0xLHhtbTEJCTsgeG1tMT0yKkNyTwotCi0JcG11bGh3CXhtbTQsW0dPVE9GRihlYXgsUFdfTUYwMjI4KV0JOyB4bW00PSgyKkNiRSAqIC1GSVgoMC4yMjgwMCkpCi0JcG11bGh3CXhtbTUsW0dPVE9GRihlYXgsUFdfTUYwMjI4KV0JOyB4bW01PSgyKkNiTyAqIC1GSVgoMC4yMjgwMCkpCi0JcG11bGh3CXhtbTAsW0dPVE9GRihlYXgsUFdfRjA0MDIpXQk7IHhtbTA9KDIqQ3JFICogRklYKDAuNDAyMDApKQotCXBtdWxodwl4bW0xLFtHT1RPRkYoZWF4LFBXX0YwNDAyKV0JOyB4bW0xPSgyKkNyTyAqIEZJWCgwLjQwMjAwKSkKLQotCXBhZGR3CXhtbTQsW0dPVE9GRihlYXgsUFdfT05FKV0KLQlwYWRkdwl4bW01LFtHT1RPRkYoZWF4LFBXX09ORSldCi0JcHNyYXcJeG1tNCwxCQkJOyB4bW00PShDYkUgKiAtRklYKDAuMjI4MDApKQotCXBzcmF3CXhtbTUsMQkJCTsgeG1tNT0oQ2JPICogLUZJWCgwLjIyODAwKSkKLQlwYWRkdwl4bW0wLFtHT1RPRkYoZWF4LFBXX09ORSldCi0JcGFkZHcJeG1tMSxbR09UT0ZGKGVheCxQV19PTkUpXQotCXBzcmF3CXhtbTAsMQkJCTsgeG1tMD0oQ3JFICogRklYKDAuNDAyMDApKQotCXBzcmF3CXhtbTEsMQkJCTsgeG1tMT0oQ3JPICogRklYKDAuNDAyMDApKQotCi0JcGFkZHcJeG1tNCx4bW0yCi0JcGFkZHcJeG1tNSx4bW0zCi0JcGFkZHcJeG1tNCx4bW0yCQk7IHhtbTQ9KENiRSAqIEZJWCgxLjc3MjAwKSk9KEItWSlFCi0JcGFkZHcJeG1tNSx4bW0zCQk7IHhtbTU9KENiTyAqIEZJWCgxLjc3MjAwKSk9KEItWSlPCi0JcGFkZHcJeG1tMCx4bW02CQk7IHhtbTA9KENyRSAqIEZJWCgxLjQwMjAwKSk9KFItWSlFCi0JcGFkZHcJeG1tMSx4bW03CQk7IHhtbTE9KENyTyAqIEZJWCgxLjQwMjAwKSk9KFItWSlPCi0KLQltb3ZkcWEJWE1NV09SRCBbd2soMCldLCB4bW00CTsgd2soMCk9KEItWSlFCi0JbW92ZHFhCVhNTVdPUkQgW3drKDEpXSwgeG1tNQk7IHdrKDEpPShCLVkpTwotCi0JbW92ZHFhICAgIHhtbTQseG1tMgotCW1vdmRxYSAgICB4bW01LHhtbTMKLQlwdW5wY2tsd2QgeG1tMix4bW02Ci0JcHVucGNraHdkIHhtbTQseG1tNgotCXBtYWRkd2QgICB4bW0yLFtHT1RPRkYoZWF4LFBXX01GMDM0NF9GMDI4NSldCi0JcG1hZGR3ZCAgIHhtbTQsW0dPVE9GRihlYXgsUFdfTUYwMzQ0X0YwMjg1KV0KLQlwdW5wY2tsd2QgeG1tMyx4bW03Ci0JcHVucGNraHdkIHhtbTUseG1tNwotCXBtYWRkd2QgICB4bW0zLFtHT1RPRkYoZWF4LFBXX01GMDM0NF9GMDI4NSldCi0JcG1hZGR3ZCAgIHhtbTUsW0dPVE9GRihlYXgsUFdfTUYwMzQ0X0YwMjg1KV0KLQotCXBhZGRkICAgICB4bW0yLFtHT1RPRkYoZWF4LFBEX09ORUhBTEYpXQotCXBhZGRkICAgICB4bW00LFtHT1RPRkYoZWF4LFBEX09ORUhBTEYpXQotCXBzcmFkICAgICB4bW0yLFNDQUxFQklUUwotCXBzcmFkICAgICB4bW00LFNDQUxFQklUUwotCXBhZGRkICAgICB4bW0zLFtHT1RPRkYoZWF4LFBEX09ORUhBTEYpXQotCXBhZGRkICAgICB4bW01LFtHT1RPRkYoZWF4LFBEX09ORUhBTEYpXQotCXBzcmFkICAgICB4bW0zLFNDQUxFQklUUwotCXBzcmFkICAgICB4bW01LFNDQUxFQklUUwotCi0JcGFja3NzZHcgIHhtbTIseG1tNAk7IHhtbTI9Q2JFKi1GSVgoMC4zNDQpK0NyRSpGSVgoMC4yODUpCi0JcGFja3NzZHcgIHhtbTMseG1tNQk7IHhtbTM9Q2JPKi1GSVgoMC4zNDQpK0NyTypGSVgoMC4yODUpCi0JcHN1YncgICAgIHhtbTIseG1tNgk7IHhtbTI9Q2JFKi1GSVgoMC4zNDQpK0NyRSotRklYKDAuNzE0KT0oRy1ZKUUKLQlwc3VidyAgICAgeG1tMyx4bW03CTsgeG1tMz1DYk8qLUZJWCgwLjM0NCkrQ3JPKi1GSVgoMC43MTQpPShHLVkpTwotCi0JbW92ZHFhICAgIHhtbTUsIFhNTVdPUkQgW2VzaV0JOyB4bW01PVkoMDEyMzQ1Njc4OUFCQ0RFRikKLQotCXBjbXBlcXcgICB4bW00LHhtbTQKLQlwc3JsdyAgICAgeG1tNCxCWVRFX0JJVAkJOyB4bW00PXsweEZGIDB4MDAgMHhGRiAweDAwIC4ufQotCXBhbmQgICAgICB4bW00LHhtbTUJCTsgeG1tND1ZKDAyNDY4QUNFKT1ZRQotCXBzcmx3ICAgICB4bW01LEJZVEVfQklUCQk7IHhtbTU9WSgxMzU3OUJERik9WU8KLQotCXBhZGR3ICAgICB4bW0wLHhtbTQJCTsgeG1tMD0oKFItWSlFK1lFKT1SRT1SKDAyNDY4QUNFKQotCXBhZGR3ICAgICB4bW0xLHhtbTUJCTsgeG1tMT0oKFItWSlPK1lPKT1STz1SKDEzNTc5QkRGKQotCXBhY2t1c3diICB4bW0wLHhtbTAJCTsgeG1tMD1SKDAyNDY4QUNFKioqKioqKiopCi0JcGFja3Vzd2IgIHhtbTEseG1tMQkJOyB4bW0xPVIoMTM1NzlCREYqKioqKioqKikKLQotCXBhZGR3ICAgICB4bW0yLHhtbTQJCTsgeG1tMj0oKEctWSlFK1lFKT1HRT1HKDAyNDY4QUNFKQotCXBhZGR3ICAgICB4bW0zLHhtbTUJCTsgeG1tMz0oKEctWSlPK1lPKT1HTz1HKDEzNTc5QkRGKQotCXBhY2t1c3diICB4bW0yLHhtbTIJCTsgeG1tMj1HKDAyNDY4QUNFKioqKioqKiopCi0JcGFja3Vzd2IgIHhtbTMseG1tMwkJOyB4bW0zPUcoMTM1NzlCREYqKioqKioqKikKLQotCXBhZGR3ICAgICB4bW00LCBYTU1XT1JEIFt3aygwKV0JOyB4bW00PShZRSsoQi1ZKUUpPUJFPUIoMDI0NjhBQ0UpCi0JcGFkZHcgICAgIHhtbTUsIFhNTVdPUkQgW3drKDEpXQk7IHhtbTU9KFlPKyhCLVkpTyk9Qk89QigxMzU3OUJERikKLQlwYWNrdXN3YiAgeG1tNCx4bW00CQk7IHhtbTQ9QigwMjQ2OEFDRSoqKioqKioqKQotCXBhY2t1c3diICB4bW01LHhtbTUJCTsgeG1tNT1CKDEzNTc5QkRGKioqKioqKiopCi0KLSVpZiBSR0JfUElYRUxTSVpFID09IDMgOyAtLS0tLS0tLS0tLS0tLS0KLQotCTsgeG1tQT0oMDAgMDIgMDQgMDYgMDggMEEgMEMgMEUgKiopLCB4bW1CPSgwMSAwMyAwNSAwNyAwOSAwQiAwRCAwRiAqKikKLQk7IHhtbUM9KDEwIDEyIDE0IDE2IDE4IDFBIDFDIDFFICoqKSwgeG1tRD0oMTEgMTMgMTUgMTcgMTkgMUIgMUQgMUYgKiopCi0JOyB4bW1FPSgyMCAyMiAyNCAyNiAyOCAyQSAyQyAyRSAqKiksIHhtbUY9KDIxIDIzIDI1IDI3IDI5IDJCIDJEIDJGICoqKQotCTsgeG1tRz0oKiogKiogKiogKiogKiogKiogKiogKiogKiopLCB4bW1IPSgqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKikKLQotCXB1bnBja2xidyB4bW1BLHhtbUMJOyB4bW1BPSgwMCAxMCAwMiAxMiAwNCAxNCAwNiAxNiAwOCAxOCAwQSAxQSAwQyAxQyAwRSAxRSkKLQlwdW5wY2tsYncgeG1tRSx4bW1CCTsgeG1tRT0oMjAgMDEgMjIgMDMgMjQgMDUgMjYgMDcgMjggMDkgMkEgMEIgMkMgMEQgMkUgMEYpCi0JcHVucGNrbGJ3IHhtbUQseG1tRgk7IHhtbUQ9KDExIDIxIDEzIDIzIDE1IDI1IDE3IDI3IDE5IDI5IDFCIDJCIDFEIDJEIDFGIDJGKQotCi0JbW92ZHFhICAgIHhtbUcseG1tQQotCW1vdmRxYSAgICB4bW1ILHhtbUEKLQlwdW5wY2tsd2QgeG1tQSx4bW1FCTsgeG1tQT0oMDAgMTAgMjAgMDEgMDIgMTIgMjIgMDMgMDQgMTQgMjQgMDUgMDYgMTYgMjYgMDcpCi0JcHVucGNraHdkIHhtbUcseG1tRQk7IHhtbUc9KDA4IDE4IDI4IDA5IDBBIDFBIDJBIDBCIDBDIDFDIDJDIDBEIDBFIDFFIDJFIDBGKQotCi0JcHNybGRxICAgIHhtbUgsMgk7IHhtbUg9KDAyIDEyIDA0IDE0IDA2IDE2IDA4IDE4IDBBIDFBIDBDIDFDIDBFIDFFIC0tIC0tKQotCXBzcmxkcSAgICB4bW1FLDIJOyB4bW1FPSgyMiAwMyAyNCAwNSAyNiAwNyAyOCAwOSAyQSAwQiAyQyAwRCAyRSAwRiAtLSAtLSkKLQotCW1vdmRxYSAgICB4bW1DLHhtbUQKLQltb3ZkcWEgICAgeG1tQix4bW1ECi0JcHVucGNrbHdkIHhtbUQseG1tSAk7IHhtbUQ9KDExIDIxIDAyIDEyIDEzIDIzIDA0IDE0IDE1IDI1IDA2IDE2IDE3IDI3IDA4IDE4KQotCXB1bnBja2h3ZCB4bW1DLHhtbUgJOyB4bW1DPSgxOSAyOSAwQSAxQSAxQiAyQiAwQyAxQyAxRCAyRCAwRSAxRSAxRiAyRiAtLSAtLSkKLQotCXBzcmxkcSAgICB4bW1CLDIJOyB4bW1CPSgxMyAyMyAxNSAyNSAxNyAyNyAxOSAyOSAxQiAyQiAxRCAyRCAxRiAyRiAtLSAtLSkKLQotCW1vdmRxYSAgICB4bW1GLHhtbUUKLQlwdW5wY2tsd2QgeG1tRSx4bW1CCTsgeG1tRT0oMjIgMDMgMTMgMjMgMjQgMDUgMTUgMjUgMjYgMDcgMTcgMjcgMjggMDkgMTkgMjkpCi0JcHVucGNraHdkIHhtbUYseG1tQgk7IHhtbUY9KDJBIDBCIDFCIDJCIDJDIDBEIDFEIDJEIDJFIDBGIDFGIDJGIC0tIC0tIC0tIC0tKQotCi0JcHNodWZkICAgIHhtbUgseG1tQSwweDRFOyB4bW1IPSgwNCAxNCAyNCAwNSAwNiAxNiAyNiAwNyAwMCAxMCAyMCAwMSAwMiAxMiAyMiAwMykKLQltb3ZkcWEgICAgeG1tQix4bW1FCi0JcHVucGNrbGRxIHhtbUEseG1tRAk7IHhtbUE9KDAwIDEwIDIwIDAxIDExIDIxIDAyIDEyIDAyIDEyIDIyIDAzIDEzIDIzIDA0IDE0KQotCXB1bnBja2xkcSB4bW1FLHhtbUgJOyB4bW1FPSgyMiAwMyAxMyAyMyAwNCAxNCAyNCAwNSAyNCAwNSAxNSAyNSAwNiAxNiAyNiAwNykKLQlwdW5wY2toZHEgeG1tRCx4bW1CCTsgeG1tRD0oMTUgMjUgMDYgMTYgMjYgMDcgMTcgMjcgMTcgMjcgMDggMTggMjggMDkgMTkgMjkpCi0KLQlwc2h1ZmQgICAgeG1tSCx4bW1HLDB4NEU7IHhtbUg9KDBDIDFDIDJDIDBEIDBFIDFFIDJFIDBGIDA4IDE4IDI4IDA5IDBBIDFBIDJBIDBCKQotCW1vdmRxYSAgICB4bW1CLHhtbUYKLQlwdW5wY2tsZHEgeG1tRyx4bW1DCTsgeG1tRz0oMDggMTggMjggMDkgMTkgMjkgMEEgMUEgMEEgMUEgMkEgMEIgMUIgMkIgMEMgMUMpCi0JcHVucGNrbGRxIHhtbUYseG1tSAk7IHhtbUY9KDJBIDBCIDFCIDJCIDBDIDFDIDJDIDBEIDJDIDBEIDFEIDJEIDBFIDFFIDJFIDBGKQotCXB1bnBja2hkcSB4bW1DLHhtbUIJOyB4bW1DPSgxRCAyRCAwRSAxRSAyRSAwRiAxRiAyRiAxRiAyRiAtLSAtLSAtLSAtLSAtLSAtLSkKLQotCXB1bnBja2xxZHEgeG1tQSx4bW1FCTsgeG1tQT0oMDAgMTAgMjAgMDEgMTEgMjEgMDIgMTIgMjIgMDMgMTMgMjMgMDQgMTQgMjQgMDUpCi0JcHVucGNrbHFkcSB4bW1ELHhtbUcJOyB4bW1EPSgxNSAyNSAwNiAxNiAyNiAwNyAxNyAyNyAwOCAxOCAyOCAwOSAxOSAyOSAwQSAxQSkKLQlwdW5wY2tscWRxIHhtbUYseG1tQwk7IHhtbUY9KDJBIDBCIDFCIDJCIDBDIDFDIDJDIDBEIDFEIDJEIDBFIDFFIDJFIDBGIDFGIDJGKQotCi0JY21wCWVjeCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAotCWpiCXNob3J0IC5jb2x1bW5fc3QzMgotCi0JdGVzdAllZGksIFNJWkVPRl9YTU1XT1JELTEKLQlqbnoJc2hvcnQgLm91dDEKLQk7IC0tKGFsaWduZWQpLS0tLS0tLS0tLS0tLS0tLS0tLQotCW1vdm50ZHEJWE1NV09SRCBbZWRpKzAqU0laRU9GX1hNTVdPUkRdLCB4bW1BCi0JbW92bnRkcQlYTU1XT1JEIFtlZGkrMSpTSVpFT0ZfWE1NV09SRF0sIHhtbUQKLQltb3ZudGRxCVhNTVdPUkQgW2VkaSsyKlNJWkVPRl9YTU1XT1JEXSwgeG1tRgotCWFkZAllZGksIGJ5dGUgUkdCX1BJWEVMU0laRSpTSVpFT0ZfWE1NV09SRAk7IG91dHB0cgotCWptcAlzaG9ydCAub3V0MAotLm91dDE6CTsgLS0odW5hbGlnbmVkKS0tLS0tLS0tLS0tLS0tLS0tCi0JcGNtcGVxYiAgICB4bW1ILHhtbUgJCQk7IHhtbUg9KGFsbCAxJ3MpCi0JbWFza21vdmRxdSB4bW1BLHhtbUgJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUEKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyCi0JbWFza21vdmRxdSB4bW1ELHhtbUgJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUQKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyCi0JbWFza21vdmRxdSB4bW1GLHhtbUgJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUYKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyCi0ub3V0MDoKLQlzdWIJZWN4LCBieXRlIFNJWkVPRl9YTU1XT1JECi0JanoJbmVhciAubmV4dHJvdwotCi0JYWRkCWVzaSwgYnl0ZSBTSVpFT0ZfWE1NV09SRAk7IGlucHRyMAotCWFkZAllYngsIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBpbnB0cjEKLQlhZGQJZWR4LCBieXRlIFNJWkVPRl9YTU1XT1JECTsgaW5wdHIyCi0Jam1wCW5lYXIgLmNvbHVtbmxvb3AKLQlhbGlnbngJMTYsNwotCi0uY29sdW1uX3N0MzI6Ci0JcGNtcGVxYgl4bW1ILHhtbUgJCQk7IHhtbUg9KGFsbCAxJ3MpCi0JbGVhCWVjeCwgW2VjeCtlY3gqMl0JCTsgaW11bCBlY3gsIFJHQl9QSVhFTFNJWkUKLQljbXAJZWN4LCBieXRlIDIqU0laRU9GX1hNTVdPUkQKLQlqYglzaG9ydCAuY29sdW1uX3N0MTYKLQltYXNrbW92ZHF1IHhtbUEseG1tSAkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tQQotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIKLQltYXNrbW92ZHF1IHhtbUQseG1tSAkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tRAotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIKLQltb3ZkcWEJeG1tQSx4bW1GCi0Jc3ViCWVjeCwgYnl0ZSAyKlNJWkVPRl9YTU1XT1JECi0Jam1wCXNob3J0IC5jb2x1bW5fc3QxNQotLmNvbHVtbl9zdDE2OgotCWNtcAllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQKLQlqYglzaG9ydCAuY29sdW1uX3N0MTUKLQltYXNrbW92ZHF1IHhtbUEseG1tSAkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tQQotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIKLQltb3ZkcWEJeG1tQSx4bW1ECi0Jc3ViCWVjeCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAotLmNvbHVtbl9zdDE1OgotCW1vdgllYXgsZWN4Ci0JeG9yCWVjeCwgYnl0ZSAweDBGCi0Jc2hsCWVjeCwgMgotCW1vdmQJeG1tQixlY3gKLQlwc3JscQl4bW1ILDQKLQlwY21wZXFiCXhtbUUseG1tRQotCXBzcmxxCXhtbUgseG1tQgotCXBzcmxxCXhtbUUseG1tQgotCXB1bnBja2xidyB4bW1FLHhtbUgKLQk7IC0tLS0tLS0tLS0tLS0tLS0KLQltb3YJZWN4LGVkaQotCWFuZAllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQtMQotCWp6CXNob3J0IC5hZGowCi0JYWRkCWVheCxlY3gKLQljbXAJZWF4LCBieXRlIFNJWkVPRl9YTU1XT1JECi0JamEJc2hvcnQgLmFkajAKLQlhbmQJZWRpLCBieXRlICgtU0laRU9GX1hNTVdPUkQpCTsgYWxpZ24gdG8gMTYtYnl0ZSBib3VuZGFyeQotCXNobAllY3gsIDMJCQk7IHBzbGxkcSB4bW1BLGVjeCAmIHBzbGxkcSB4bW1FLGVjeAotCW1vdmRxYQl4bW1HLHhtbUEKLQltb3ZkcWEJeG1tQyx4bW1FCi0JcHNsbGRxCXhtbUEsIFNJWkVPRl9YTU1XT1JELzIKLQlwc2xsZHEJeG1tRSwgU0laRU9GX1hNTVdPUkQvMgotCW1vdmQJeG1tRCxlY3gKLQlzdWIJZWN4LCBieXRlIChTSVpFT0ZfWE1NV09SRC8yKSpCWVRFX0JJVAotCWpiCXNob3J0IC5hZGoxCi0JbW92ZAl4bW1GLGVjeAotCXBzbGxxCXhtbUEseG1tRgotCXBzbGxxCXhtbUUseG1tRgotCWptcAlzaG9ydCAuYWRqMAotLmFkajE6CW5lZwllY3gKLQltb3ZkCXhtbUYsZWN4Ci0JcHNybHEJeG1tQSx4bW1GCi0JcHNybHEJeG1tRSx4bW1GCi0JcHNsbHEJeG1tRyx4bW1ECi0JcHNsbHEJeG1tQyx4bW1ECi0JcG9yCXhtbUEseG1tRwotCXBvcgl4bW1FLHhtbUMKLS5hZGowOgk7IC0tLS0tLS0tLS0tLS0tLS0KLQltYXNrbW92ZHF1IHhtbUEseG1tRQkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tQQotCi0lZWxzZSA7IFJHQl9QSVhFTFNJWkUgPT0gNCA7IC0tLS0tLS0tLS0tCi0KLSVpZmRlZiBSR0JYX0ZJTExFUl8wWEZGCi0JcGNtcGVxYiAgIHhtbTYseG1tNgkJOyB4bW02PVhFPVgoMDI0NjhBQ0UqKioqKioqKikKLQlwY21wZXFiICAgeG1tNyx4bW03CQk7IHhtbTc9WE89WCgxMzU3OUJERioqKioqKioqKQotJWVsc2UKLQlweG9yICAgICAgeG1tNix4bW02CQk7IHhtbTY9WEU9WCgwMjQ2OEFDRSoqKioqKioqKQotCXB4b3IgICAgICB4bW03LHhtbTcJCTsgeG1tNz1YTz1YKDEzNTc5QkRGKioqKioqKiopCi0lZW5kaWYKLQk7IHhtbUE9KDAwIDAyIDA0IDA2IDA4IDBBIDBDIDBFICoqKSwgeG1tQj0oMDEgMDMgMDUgMDcgMDkgMEIgMEQgMEYgKiopCi0JOyB4bW1DPSgxMCAxMiAxNCAxNiAxOCAxQSAxQyAxRSAqKiksIHhtbUQ9KDExIDEzIDE1IDE3IDE5IDFCIDFEIDFGICoqKQotCTsgeG1tRT0oMjAgMjIgMjQgMjYgMjggMkEgMkMgMkUgKiopLCB4bW1GPSgyMSAyMyAyNSAyNyAyOSAyQiAyRCAyRiAqKikKLQk7IHhtbUc9KDMwIDMyIDM0IDM2IDM4IDNBIDNDIDNFICoqKSwgeG1tSD0oMzEgMzMgMzUgMzcgMzkgM0IgM0QgM0YgKiopCi0KLQlwdW5wY2tsYncgeG1tQSx4bW1DCTsgeG1tQT0oMDAgMTAgMDIgMTIgMDQgMTQgMDYgMTYgMDggMTggMEEgMUEgMEMgMUMgMEUgMUUpCi0JcHVucGNrbGJ3IHhtbUUseG1tRwk7IHhtbUU9KDIwIDMwIDIyIDMyIDI0IDM0IDI2IDM2IDI4IDM4IDJBIDNBIDJDIDNDIDJFIDNFKQotCXB1bnBja2xidyB4bW1CLHhtbUQJOyB4bW1CPSgwMSAxMSAwMyAxMyAwNSAxNSAwNyAxNyAwOSAxOSAwQiAxQiAwRCAxRCAwRiAxRikKLQlwdW5wY2tsYncgeG1tRix4bW1ICTsgeG1tRj0oMjEgMzEgMjMgMzMgMjUgMzUgMjcgMzcgMjkgMzkgMkIgM0IgMkQgM0QgMkYgM0YpCi0KLQltb3ZkcWEgICAgeG1tQyx4bW1BCi0JcHVucGNrbHdkIHhtbUEseG1tRQk7IHhtbUE9KDAwIDEwIDIwIDMwIDAyIDEyIDIyIDMyIDA0IDE0IDI0IDM0IDA2IDE2IDI2IDM2KQotCXB1bnBja2h3ZCB4bW1DLHhtbUUJOyB4bW1DPSgwOCAxOCAyOCAzOCAwQSAxQSAyQSAzQSAwQyAxQyAyQyAzQyAwRSAxRSAyRSAzRSkKLQltb3ZkcWEgICAgeG1tRyx4bW1CCi0JcHVucGNrbHdkIHhtbUIseG1tRgk7IHhtbUI9KDAxIDExIDIxIDMxIDAzIDEzIDIzIDMzIDA1IDE1IDI1IDM1IDA3IDE3IDI3IDM3KQotCXB1bnBja2h3ZCB4bW1HLHhtbUYJOyB4bW1HPSgwOSAxOSAyOSAzOSAwQiAxQiAyQiAzQiAwRCAxRCAyRCAzRCAwRiAxRiAyRiAzRikKLQotCW1vdmRxYSAgICB4bW1ELHhtbUEKLQlwdW5wY2tsZHEgeG1tQSx4bW1CCTsgeG1tQT0oMDAgMTAgMjAgMzAgMDEgMTEgMjEgMzEgMDIgMTIgMjIgMzIgMDMgMTMgMjMgMzMpCi0JcHVucGNraGRxIHhtbUQseG1tQgk7IHhtbUQ9KDA0IDE0IDI0IDM0IDA1IDE1IDI1IDM1IDA2IDE2IDI2IDM2IDA3IDE3IDI3IDM3KQotCW1vdmRxYSAgICB4bW1ILHhtbUMKLQlwdW5wY2tsZHEgeG1tQyx4bW1HCTsgeG1tQz0oMDggMTggMjggMzggMDkgMTkgMjkgMzkgMEEgMUEgMkEgM0EgMEIgMUIgMkIgM0IpCi0JcHVucGNraGRxIHhtbUgseG1tRwk7IHhtbUg9KDBDIDFDIDJDIDNDIDBEIDFEIDJEIDNEIDBFIDFFIDJFIDNFIDBGIDFGIDJGIDNGKQotCi0JY21wCWVjeCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAotCWpiCXNob3J0IC5jb2x1bW5fc3QzMgotCi0JdGVzdAllZGksIFNJWkVPRl9YTU1XT1JELTEKLQlqbnoJc2hvcnQgLm91dDEKLQk7IC0tKGFsaWduZWQpLS0tLS0tLS0tLS0tLS0tLS0tLQotCW1vdm50ZHEJWE1NV09SRCBbZWRpKzAqU0laRU9GX1hNTVdPUkRdLCB4bW1BCi0JbW92bnRkcQlYTU1XT1JEIFtlZGkrMSpTSVpFT0ZfWE1NV09SRF0sIHhtbUQKLQltb3ZudGRxCVhNTVdPUkQgW2VkaSsyKlNJWkVPRl9YTU1XT1JEXSwgeG1tQwotCW1vdm50ZHEJWE1NV09SRCBbZWRpKzMqU0laRU9GX1hNTVdPUkRdLCB4bW1ICi0JYWRkCWVkaSwgYnl0ZSBSR0JfUElYRUxTSVpFKlNJWkVPRl9YTU1XT1JECTsgb3V0cHRyCi0Jam1wCXNob3J0IC5vdXQwCi0ub3V0MToJOyAtLSh1bmFsaWduZWQpLS0tLS0tLS0tLS0tLS0tLS0KLQlwY21wZXFiICAgIHhtbUUseG1tRQkJCTsgeG1tRT0oYWxsIDEncykKLQltYXNrbW92ZHF1IHhtbUEseG1tRQkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tQQotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIKLQltYXNrbW92ZHF1IHhtbUQseG1tRQkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tRAotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIKLQltYXNrbW92ZHF1IHhtbUMseG1tRQkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tQwotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIKLQltYXNrbW92ZHF1IHhtbUgseG1tRQkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tSAotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIKLS5vdXQwOgotCXN1YgllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQKLQlqegluZWFyIC5uZXh0cm93Ci0KLQlhZGQJZXNpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgaW5wdHIwCi0JYWRkCWVieCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAk7IGlucHRyMQotCWFkZAllZHgsIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBpbnB0cjIKLQlqbXAJbmVhciAuY29sdW1ubG9vcAotCWFsaWdueAkxNiw3Ci0KLS5jb2x1bW5fc3QzMjoKLQlwY21wZXFiCXhtbUUseG1tRQkJCTsgeG1tRT0oYWxsIDEncykKLQljbXAJZWN4LCBieXRlIFNJWkVPRl9YTU1XT1JELzIKLQlqYglzaG9ydCAuY29sdW1uX3N0MTYKLQltYXNrbW92ZHF1IHhtbUEseG1tRQkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tQQotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIKLQltYXNrbW92ZHF1IHhtbUQseG1tRQkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tRAotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIKLQltb3ZkcWEJeG1tQSx4bW1DCi0JbW92ZHFhCXhtbUQseG1tSAotCXN1YgllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQvMgotLmNvbHVtbl9zdDE2OgotCWNtcAllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQvNAotCWpiCXNob3J0IC5jb2x1bW5fc3QxNQotCW1hc2ttb3ZkcXUgeG1tQSx4bW1FCQkJOyBtb3ZudGRxdSBYTU1XT1JEIFtlZGldLCB4bW1BCi0JYWRkCWVkaSwgYnl0ZSBTSVpFT0ZfWE1NV09SRAk7IG91dHB0cgotCW1vdmRxYQl4bW1BLHhtbUQKLQlzdWIJZWN4LCBieXRlIFNJWkVPRl9YTU1XT1JELzQKLS5jb2x1bW5fc3QxNToKLQljbXAJZWN4LCBieXRlIFNJWkVPRl9YTU1XT1JELzE2Ci0JamIJc2hvcnQgLm5leHRyb3cKLQltb3YJZWF4LGVjeAotCXhvcgllY3gsIGJ5dGUgMHgwMwotCWluYwllY3gKLQlzaGwJZWN4LCA0Ci0JbW92ZAl4bW1GLGVjeAotCXBzcmxxCXhtbUUseG1tRgotCXB1bnBja2xidyB4bW1FLHhtbUUKLQk7IC0tLS0tLS0tLS0tLS0tLS0KLQltb3YJZWN4LGVkaQotCWFuZAllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQtMQotCWp6CXNob3J0IC5hZGowCi0JbGVhCWVheCwgW2VjeCtlYXgqNF0JOyBSR0JfUElYRUxTSVpFCi0JY21wCWVheCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAotCWphCXNob3J0IC5hZGowCi0JYW5kCWVkaSwgYnl0ZSAoLVNJWkVPRl9YTU1XT1JEKQk7IGFsaWduIHRvIDE2LWJ5dGUgYm91bmRhcnkKLQlzaGwJZWN4LCAzCQkJOyBwc2xsZHEgeG1tQSxlY3ggJiBwc2xsZHEgeG1tRSxlY3gKLQltb3ZkcWEJeG1tQix4bW1BCi0JbW92ZHFhCXhtbUcseG1tRQotCXBzbGxkcQl4bW1BLCBTSVpFT0ZfWE1NV09SRC8yCi0JcHNsbGRxCXhtbUUsIFNJWkVPRl9YTU1XT1JELzIKLQltb3ZkCXhtbUMsZWN4Ci0Jc3ViCWVjeCwgYnl0ZSAoU0laRU9GX1hNTVdPUkQvMikqQllURV9CSVQKLQlqYglzaG9ydCAuYWRqMQotCW1vdmQJeG1tSCxlY3gKLQlwc2xscQl4bW1BLHhtbUgKLQlwc2xscQl4bW1FLHhtbUgKLQlqbXAJc2hvcnQgLmFkajAKLS5hZGoxOgluZWcJZWN4Ci0JbW92ZAl4bW1ILGVjeAotCXBzcmxxCXhtbUEseG1tSAotCXBzcmxxCXhtbUUseG1tSAotCXBzbGxxCXhtbUIseG1tQwotCXBzbGxxCXhtbUcseG1tQwotCXBvcgl4bW1BLHhtbUIKLQlwb3IJeG1tRSx4bW1HCi0uYWRqMDoJOyAtLS0tLS0tLS0tLS0tLS0tCi0JbWFza21vdmRxdSB4bW1BLHhtbUUJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUEKLQotJWVuZGlmIDsgUkdCX1BJWEVMU0laRSA7IC0tLS0tLS0tLS0tLS0tLQotCi0JYWxpZ254CTE2LDcKLQotLm5leHRyb3c6Ci0JcG9wCWVjeAotCXBvcAllc2kKLQlwb3AJZWJ4Ci0JcG9wCWVkeAotCXBvcAllZGkKLQlwb3AJZWF4Ci0KLQlhZGQJZXNpLCBieXRlIFNJWkVPRl9KU0FNUFJPVwotCWFkZAllYngsIGJ5dGUgU0laRU9GX0pTQU1QUk9XCi0JYWRkCWVkeCwgYnl0ZSBTSVpFT0ZfSlNBTVBST1cKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9KU0FNUFJPVwk7IG91dHB1dF9idWYKLQlkZWMJZWF4CQkJCTsgbnVtX3Jvd3MKLQlqZwluZWFyIC5yb3dsb29wCi0KLQlzZmVuY2UJCTsgZmx1c2ggdGhlIHdyaXRlIGJ1ZmZlcgotCi0ucmV0dXJuOgotCXBvcAllZGkKLQlwb3AJZXNpCi07CXBvcAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXBvcAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcG9wCWVieAotCW1vdgllc3AsZWJwCQk7IGVzcCA8LSBhbGlnbmVkIGVicAotCXBvcAllc3AJCTsgZXNwIDwtIG9yaWdpbmFsIGVicAotCXBvcAllYnAKLQlyZXQKLQotJWVuZGlmIDsgSkRDT0xPUl9ZQ0NSR0JfU1NFMl9TVVBQT1JURUQKLSVlbmRpZiA7IFJHQl9QSVhFTFNJWkUgPT0gMyB8fCBSR0JfUElYRUxTSVpFID09IDQKZGlmZiAtLWdpdCBhL2pkY3QuaCBiL2pkY3QuaAppbmRleCA2NzhhM2QxLi43YjQ5YTk3IDEwMDY0NAotLS0gYS9qZGN0LmgKKysrIGIvamRjdC5oCkBAIC01LDEzICs1LDYgQEAKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi0gKiBUaGlzIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgZm9yIFNJTUQgZXh0ZW5zaW9uLgotICogTGFzdCBNb2RpZmllZCA6IEphbnVhcnkgNSwgMjAwNgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgogICogVGhpcyBpbmNsdWRlIGZpbGUgY29udGFpbnMgY29tbW9uIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGZvcndhcmQgYW5kCiAgKiBpbnZlcnNlIERDVCBtb2R1bGVzLiAgVGhlc2UgZGVjbGFyYXRpb25zIGFyZSBwcml2YXRlIHRvIHRoZSBEQ1QgbWFuYWdlcnMKICAqIChqY2RjdG1nci5jLCBqZGRjdG1nci5jKSBhbmQgdGhlIGluZGl2aWR1YWwgRENUIGFsZ29yaXRobXMuCkBAIC0yMCwxMyArMTMsNiBAQAogICovCiAKIAotLyogU0lNRCBFeHQ6IGNvbmZpZ3VyYXRpb24gY2hlY2sgKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSAhPSA4Ci0jZXJyb3IgIlNvcnJ5LCB0aGlzIFNJTUQgY29kZSBvbmx5IGNvcGVzIHdpdGggOC1iaXQgc2FtcGxlIHZhbHVlcy4iCi0jZW5kaWYKLQotCiAvKgogICogQSBmb3J3YXJkIERDVCByb3V0aW5lIGlzIGdpdmVuIGEgcG9pbnRlciB0byBhIHdvcmsgYXJlYSBvZiB0eXBlIERDVEVMRU1bXTsKICAqIHRoZSBEQ1QgaXMgdG8gYmUgcGVyZm9ybWVkIGluLXBsYWNlIGluIHRoYXQgYnVmZmVyLiAgVHlwZSBEQ1RFTEVNIGlzIGludApAQCAtMzcsMjggKzIzLDI1IEBACiAgKiBoYXZlIGEgcmFuZ2Ugb2YgKy04SyBmb3IgOC1iaXQgZGF0YSwgKy0xMjhLIGZvciAxMi1iaXQgZGF0YS4gIFRoaXMKICAqIGNvbnZlbnRpb24gaW1wcm92ZXMgYWNjdXJhY3kgaW4gaW50ZWdlciBpbXBsZW1lbnRhdGlvbnMgYW5kIHNhdmVzIHNvbWUKICAqIHdvcmsgaW4gZmxvYXRpbmctcG9pbnQgb25lcy4KLSAqIFF1YW50aXphdGlvbiBvZiB0aGUgb3V0cHV0IGNvZWZmaWNpZW50cyBpcyBkb25lIGJ5IGpjZGN0bWdyLmMuCisgKiBRdWFudGl6YXRpb24gb2YgdGhlIG91dHB1dCBjb2VmZmljaWVudHMgaXMgZG9uZSBieSBqY2RjdG1nci5jLiBUaGlzCisgKiBzdGVwIHJlcXVpcmVzIGFuIHVuc2lnbmVkIHR5cGUgYW5kIGFsc28gb25lIHdpdGggdHdpY2UgdGhlIGJpdHMuCiAgKi8KIAotLyogU0lNRCBFeHQ6IFRvIG1heGltaXplIHBhcmFsbGVsaXNtLCBUeXBlIERDVEVMRU0gaXMgY2hhbmdlZCB0byBzaG9ydAotICogKG9yaWdpbmFsbHksIGludCkuCi0gKi8KLXR5cGVkZWYgc2hvcnQgRENURUxFTTsJCS8qIFNJTUQgRXh0OiBtdXN0IGJlIHNob3J0ICovCi0KLXR5cGVkZWYgSk1FVEhPRCh2b2lkLCBmb3J3YXJkX0RDVF9tZXRob2RfcHRyLCAoRENURUxFTSAqIGRhdGEpKTsKLXR5cGVkZWYgSk1FVEhPRCh2b2lkLCBmbG9hdF9EQ1RfbWV0aG9kX3B0ciwgKEZBU1RfRkxPQVQgKiBkYXRhKSk7Ci10eXBlZGVmIEpNRVRIT0Qodm9pZCwgY29udnNhbXBfaW50X21ldGhvZF9wdHIsCi0JCShKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCwKLQkJIERDVEVMRU0gKiB3b3Jrc3BhY2UpKTsKLXR5cGVkZWYgSk1FVEhPRCh2b2lkLCBjb252c2FtcF9mbG9hdF9tZXRob2RfcHRyLAotCQkoSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wsCi0JCSBGQVNUX0ZMT0FUICp3b3Jrc3BhY2UpKTsKLXR5cGVkZWYgSk1FVEhPRCh2b2lkLCBxdWFudGl6ZV9pbnRfbWV0aG9kX3B0ciwKLQkJKEpDT0VGUFRSIGNvZWZfYmxvY2ssIERDVEVMRU0gKiBkaXZpc29ycywKLQkJIERDVEVMRU0gKiB3b3Jrc3BhY2UpKTsKLXR5cGVkZWYgSk1FVEhPRCh2b2lkLCBxdWFudGl6ZV9mbG9hdF9tZXRob2RfcHRyLAotCQkoSkNPRUZQVFIgY29lZl9ibG9jaywgRkFTVF9GTE9BVCAqIGRpdmlzb3JzLAotCQkgRkFTVF9GTE9BVCAqIHdvcmtzcGFjZSkpOworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjaWZuZGVmIFdJVEhfU0lNRAordHlwZWRlZiBpbnQgRENURUxFTTsJCS8qIDE2IG9yIDMyIGJpdHMgaXMgZmluZSAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgVURDVEVMRU07Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBVRENURUxFTTI7CisjZWxzZQordHlwZWRlZiBzaG9ydCBEQ1RFTEVNOyAgLyogcHJlZmVyIDE2IGJpdCB3aXRoIFNJTUQgZm9yIHBhcmVsbGVsaXNtICovCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVEQ1RFTEVNOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgVURDVEVMRU0yOworI2VuZGlmCisjZWxzZQordHlwZWRlZiBJTlQzMiBEQ1RFTEVNOwkJLyogbXVzdCBoYXZlIDMyIGJpdHMgKi8KK3R5cGVkZWYgVUlOVDMyIFVEQ1RFTEVNOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVURDVEVMRU0yOworI2VuZGlmCiAKIAogLyoKQEAgLTc0LDIyICs1NywxOSBAQAogCiAvKiB0eXBlZGVmIGludmVyc2VfRENUX21ldGhvZF9wdHIgaXMgZGVjbGFyZWQgaW4ganBlZ2ludC5oICovCiAKLS8qIFNJTUQgRXh0OiBUbyBtYXhpbWl6ZSBwYXJhbGxlbGlzbSwgVHlwZSBNVUxUSVBMSUVSIGlzIGNoYW5nZWQgdG8gc2hvcnQuCi0gKiBNYWNybyBkZWZpbml0aW9ucyBvZiBNVUxUSVBMSUVSIGFuZCBGQVNUX0ZMT0FUIGluIGptb3JlY2ZnLmggYXJlIGlnbm9yZWQuCi0gKi8KLSN1bmRlZiBNVUxUSVBMSUVSCi0jZGVmaW5lIE1VTFRJUExJRVIgIHNob3J0CS8qIFNJTUQgRXh0OiBtdXN0IGJlIHNob3J0ICovCi0jdW5kZWYgRkFTVF9GTE9BVAotI2RlZmluZSBGQVNUX0ZMT0FUICBmbG9hdAkvKiBTSU1EIEV4dDogbXVzdCBiZSBmbG9hdCAqLwotCiAvKgogICogRWFjaCBJRENUIHJvdXRpbmUgaGFzIGl0cyBvd24gaWRlYXMgYWJvdXQgdGhlIGJlc3QgZGN0X3RhYmxlIGVsZW1lbnQgdHlwZS4KICAqLwogCi10eXBlZGVmIE1VTFRJUExJRVIgSVNMT1dfTVVMVF9UWVBFOwkvKiBTSU1EIEV4dDogbXVzdCBiZSBzaG9ydCAqLwotdHlwZWRlZiBNVUxUSVBMSUVSIElGQVNUX01VTFRfVFlQRTsJLyogU0lNRCBFeHQ6IG11c3QgYmUgc2hvcnQgKi8KK3R5cGVkZWYgTVVMVElQTElFUiBJU0xPV19NVUxUX1RZUEU7IC8qIHNob3J0IG9yIGludCwgd2hpY2hldmVyIGlzIGZhc3RlciAqLworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Cit0eXBlZGVmIE1VTFRJUExJRVIgSUZBU1RfTVVMVF9UWVBFOyAvKiAxNiBiaXRzIGlzIE9LLCB1c2Ugc2hvcnQgaWYgZmFzdGVyICovCiAjZGVmaW5lIElGQVNUX1NDQUxFX0JJVFMgIDIJLyogZnJhY3Rpb25hbCBiaXRzIGluIHNjYWxlIGZhY3RvcnMgKi8KLXR5cGVkZWYgRkFTVF9GTE9BVCBGTE9BVF9NVUxUX1RZUEU7CS8qIFNJTUQgRXh0OiBtdXN0IGJlIGZsb2F0ICovCisjZWxzZQordHlwZWRlZiBJTlQzMiBJRkFTVF9NVUxUX1RZUEU7CS8qIG5lZWQgMzIgYml0cyBmb3Igc2NhbGVkIHF1YW50aXplcnMgKi8KKyNkZWZpbmUgSUZBU1RfU0NBTEVfQklUUyAgMTMJLyogZnJhY3Rpb25hbCBiaXRzIGluIHNjYWxlIGZhY3RvcnMgKi8KKyNlbmRpZgordHlwZWRlZiBGQVNUX0ZMT0FUIEZMT0FUX01VTFRfVFlQRTsgLyogcHJlZmVycmVkIGZsb2F0aW5nIHR5cGUgKi8KIAogCiAvKgpAQCAtMTA5LDY0ICs4OSwxNSBAQAogLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCiAKICNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jZGVmaW5lIGpwZWdfZmRjdF9pc2xvdwkJakZEaXNsb3cJCS8qIGpmZGN0aW50LmFzbSAqLwotI2RlZmluZSBqcGVnX2ZkY3RfaWZhc3QJCWpGRGlmYXN0CQkvKiBqZmRjdGZzdC5hc20gKi8KLSNkZWZpbmUganBlZ19mZGN0X2Zsb2F0CQlqRkRmbG9hdAkJLyogamZkY3RmbHQuYXNtICovCi0jZGVmaW5lIGpwZWdfZmRjdF9pc2xvd19tbXgJakZETWlzbG93CQkvKiBqZm1teGludC5hc20gKi8KLSNkZWZpbmUganBlZ19mZGN0X2lmYXN0X21teAlqRkRNaWZhc3QJCS8qIGpmbW14ZnN0LmFzbSAqLwotI2RlZmluZSBqcGVnX2ZkY3RfZmxvYXRfM2Rub3cJakZEM2Zsb2F0CQkvKiBqZjNkbmZsdC5hc20gKi8KLSNkZWZpbmUganBlZ19mZGN0X2lzbG93X3NzZTIJakZEU2lzbG93CQkvKiBqZnNzMmludC5hc20gKi8KLSNkZWZpbmUganBlZ19mZGN0X2lmYXN0X3NzZTIJakZEU2lmYXN0CQkvKiBqZnNzMmZzdC5hc20gKi8KLSNkZWZpbmUganBlZ19mZGN0X2Zsb2F0X3NzZQlqRkRTZmxvYXQJCS8qIGpmc3NlZmx0LmFzbSAqLwotI2RlZmluZSBqcGVnX2NvbnZzYW1wX2ludAlqQ252SW50CQkJLyogamNxbnRpbnQuYXNtICovCi0jZGVmaW5lIGpwZWdfcXVhbnRpemVfaW50CWpRbnRJbnQJCQkvKiBqY3FudGludC5hc20gKi8KLSNkZWZpbmUganBlZ19xdWFudGl6ZV9pZGl2CWpRbnRJRGl2CQkvKiBqY3FudGludC5hc20gKi8KLSNkZWZpbmUganBlZ19jb252c2FtcF9mbG9hdAlqQ252RmxvYXQJCS8qIGpjcW50Zmx0LmFzbSAqLwotI2RlZmluZSBqcGVnX3F1YW50aXplX2Zsb2F0CWpRbnRGbG9hdAkJLyogamNxbnRmbHQuYXNtICovCi0jZGVmaW5lIGpwZWdfY29udnNhbXBfaW50X21teAlqQ252TW14CQkJLyogamNxbnRtbXguYXNtICovCi0jZGVmaW5lIGpwZWdfcXVhbnRpemVfaW50X21teAlqUW50TW14CQkJLyogamNxbnRtbXguYXNtICovCi0jZGVmaW5lIGpwZWdfY29udnNhbXBfZmx0XzNkbm93CWpDbnYzZG5vdwkJLyogamNxbnQzZG4uYXNtICovCi0jZGVmaW5lIGpwZWdfcXVhbnRpemVfZmx0XzNkbm93CWpRbnQzZG5vdwkJLyogamNxbnQzZG4uYXNtICovCi0jZGVmaW5lIGpwZWdfY29udnNhbXBfaW50X3NzZTIJakNudklTc2UyCQkvKiBqY3FudHMyaS5hc20gKi8KLSNkZWZpbmUganBlZ19xdWFudGl6ZV9pbnRfc3NlMglqUW50SVNzZTIJCS8qIGpjcW50czJpLmFzbSAqLwotI2RlZmluZSBqcGVnX2NvbnZzYW1wX2ZsdF9zc2UJakNudlNzZQkJCS8qIGpjcW50c3NlLmFzbSAqLwotI2RlZmluZSBqcGVnX3F1YW50aXplX2ZsdF9zc2UJalFudFNzZQkJCS8qIGpjcW50c3NlLmFzbSAqLwotI2RlZmluZSBqcGVnX2NvbnZzYW1wX2ZsdF9zc2UyCWpDbnZGU3NlMgkJLyogamNxbnRzMmYuYXNtICovCi0jZGVmaW5lIGpwZWdfcXVhbnRpemVfZmx0X3NzZTIJalFudEZTc2UyCQkvKiBqY3FudHMyZi5hc20gKi8KLSNkZWZpbmUganBlZ19pZGN0X2lzbG93CQlqUkRpc2xvdwkJLyogamlkY3RpbnQuYXNtICovCi0jZGVmaW5lIGpwZWdfaWRjdF9pZmFzdAkJalJEaWZhc3QJCS8qIGppZGN0ZnN0LmFzbSAqLwotI2RlZmluZSBqcGVnX2lkY3RfZmxvYXQJCWpSRGZsb2F0CQkvKiBqaWRjdGZsdC5hc20gKi8KLSNkZWZpbmUganBlZ19pZGN0XzR4NAkJalJENHg0CQkJLyogamlkY3RyZWQuYXNtICovCi0jZGVmaW5lIGpwZWdfaWRjdF8yeDIJCWpSRDJ4MgkJCS8qIGppZGN0cmVkLmFzbSAqLwotI2RlZmluZSBqcGVnX2lkY3RfMXgxCQlqUkQxeDEJCQkvKiBqaWRjdHJlZC5hc20gKi8KLSNkZWZpbmUganBlZ19pZGN0X2lzbG93X21teAlqUkRNaXNsb3cJCS8qIGppbW14aW50LmFzbSAqLwotI2RlZmluZSBqcGVnX2lkY3RfaWZhc3RfbW14CWpSRE1pZmFzdAkJLyogamltbXhmc3QuYXNtICovCi0jZGVmaW5lIGpwZWdfaWRjdF9mbG9hdF8zZG5vdwlqUkQzZmxvYXQJCS8qIGppM2RuZmx0LmFzbSAqLwotI2RlZmluZSBqcGVnX2lkY3RfNHg0X21teAlqUkRNNHg0CQkJLyogamltbXhyZWQuYXNtICovCi0jZGVmaW5lIGpwZWdfaWRjdF8yeDJfbW14CWpSRE0yeDIJCQkvKiBqaW1teHJlZC5hc20gKi8KLSNkZWZpbmUganBlZ19pZGN0X2lzbG93X3NzZTIJalJEU2lzbG93CQkvKiBqaXNzMmludC5hc20gKi8KLSNkZWZpbmUganBlZ19pZGN0X2lmYXN0X3NzZTIJalJEU2lmYXN0CQkvKiBqaXNzMmZzdC5hc20gKi8KLSNkZWZpbmUganBlZ19pZGN0X2Zsb2F0X3NzZQlqUkRTZmxvYXQJCS8qIGppc3NlZmx0LmFzbSAqLwotI2RlZmluZSBqcGVnX2lkY3RfZmxvYXRfc3NlMglqUkQyZmxvYXQJCS8qIGppc3MyZmx0LmFzbSAqLwotI2RlZmluZSBqcGVnX2lkY3RfNHg0X3NzZTIJalJEUzR4NAkJCS8qIGppc3MycmVkLmFzbSAqLwotI2RlZmluZSBqcGVnX2lkY3RfMngyX3NzZTIJalJEUzJ4MgkJCS8qIGppc3MycmVkLmFzbSAqLwotI2RlZmluZSBqY29uc3RfZmRjdF9mbG9hdAlqRkNmbG9hdAkJLyogamZkY3RmbHQuYXNtICovCi0jZGVmaW5lIGpjb25zdF9mZGN0X2lzbG93X21teAlqRkNNaXNsb3cJCS8qIGpmbW14aW50LmFzbSAqLwotI2RlZmluZSBqY29uc3RfZmRjdF9pZmFzdF9tbXgJakZDTWlmYXN0CQkvKiBqZm1teGZzdC5hc20gKi8KLSNkZWZpbmUgamNvbnN0X2ZkY3RfZmxvYXRfM2Rub3cJakZDM2Zsb2F0CQkvKiBqZjNkbmZsdC5hc20gKi8KLSNkZWZpbmUgamNvbnN0X2ZkY3RfaXNsb3dfc3NlMglqRkNTaXNsb3cJCS8qIGpmc3MyaW50LmFzbSAqLwotI2RlZmluZSBqY29uc3RfZmRjdF9pZmFzdF9zc2UyCWpGQ1NpZmFzdAkJLyogamZzczJmc3QuYXNtICovCi0jZGVmaW5lIGpjb25zdF9mZGN0X2Zsb2F0X3NzZQlqRkNTZmxvYXQJCS8qIGpmc3NlZmx0LmFzbSAqLwotI2RlZmluZSBqY29uc3RfaWRjdF9mbG9hdAlqUkNmbG9hdAkJLyogamlkY3RmbHQuYXNtICovCi0jZGVmaW5lIGpjb25zdF9pZGN0X2lzbG93X21teAlqUkNNaXNsb3cJCS8qIGppbW14aW50LmFzbSAqLwotI2RlZmluZSBqY29uc3RfaWRjdF9pZmFzdF9tbXgJalJDTWlmYXN0CQkvKiBqaW1teGZzdC5hc20gKi8KLSNkZWZpbmUgamNvbnN0X2lkY3RfZmxvYXRfM2Rub3cJalJDM2Zsb2F0CQkvKiBqaTNkbmZsdC5hc20gKi8KLSNkZWZpbmUgamNvbnN0X2lkY3RfcmVkX21teAlqUkNNcmVkCQkJLyogamltbXhyZWQuYXNtICovCi0jZGVmaW5lIGpjb25zdF9pZGN0X2lzbG93X3NzZTIJalJDU2lzbG93CQkvKiBqaXNzMmludC5hc20gKi8KLSNkZWZpbmUgamNvbnN0X2lkY3RfaWZhc3Rfc3NlMglqUkNTaWZhc3QJCS8qIGppc3MyZnN0LmFzbSAqLwotI2RlZmluZSBqY29uc3RfaWRjdF9mbG9hdF9zc2UJalJDU2Zsb2F0CQkvKiBqaXNzZWZsdC5hc20gKi8KLSNkZWZpbmUgamNvbnN0X2lkY3RfZmxvYXRfc3NlMglqUkMyZmxvYXQJCS8qIGppc3MyZmx0LmFzbSAqLwotI2RlZmluZSBqY29uc3RfaWRjdF9yZWRfc3NlMglqUkNTcmVkCQkJLyogamlzczJyZWQuYXNtICovCisjZGVmaW5lIGpwZWdfZmRjdF9pc2xvdwkJakZEaXNsb3cKKyNkZWZpbmUganBlZ19mZGN0X2lmYXN0CQlqRkRpZmFzdAorI2RlZmluZSBqcGVnX2ZkY3RfZmxvYXQJCWpGRGZsb2F0CisjZGVmaW5lIGpwZWdfaWRjdF9pc2xvdwkJalJEaXNsb3cKKyNkZWZpbmUganBlZ19pZGN0X2lmYXN0CQlqUkRpZmFzdAorI2RlZmluZSBqcGVnX2lkY3RfZmxvYXQJCWpSRGZsb2F0CisjZGVmaW5lIGpwZWdfaWRjdF80eDQJCWpSRDR4NAorI2RlZmluZSBqcGVnX2lkY3RfMngyCQlqUkQyeDIKKyNkZWZpbmUganBlZ19pZGN0XzF4MQkJalJEMXgxCiAjZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLwogCiAvKiBFeHRlcm4gZGVjbGFyYXRpb25zIGZvciB0aGUgZm9yd2FyZCBhbmQgaW52ZXJzZSBEQ1Qgcm91dGluZXMuICovCkBAIC0xNzUsNDcgKzEwNiw2IEBACiBFWFRFUk4odm9pZCkganBlZ19mZGN0X2lmYXN0IEpQUCgoRENURUxFTSAqIGRhdGEpKTsKIEVYVEVSTih2b2lkKSBqcGVnX2ZkY3RfZmxvYXQgSlBQKChGQVNUX0ZMT0FUICogZGF0YSkpOwogCi1FWFRFUk4odm9pZCkganBlZ19mZGN0X2lzbG93X21teCBKUFAoKERDVEVMRU0gKiBkYXRhKSk7Ci1FWFRFUk4odm9pZCkganBlZ19mZGN0X2lmYXN0X21teCBKUFAoKERDVEVMRU0gKiBkYXRhKSk7Ci1FWFRFUk4odm9pZCkganBlZ19mZGN0X2Zsb2F0XzNkbm93IEpQUCgoRkFTVF9GTE9BVCAqIGRhdGEpKTsKLQotRVhURVJOKHZvaWQpIGpwZWdfZmRjdF9pc2xvd19zc2UyIEpQUCgoRENURUxFTSAqIGRhdGEpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2ZkY3RfaWZhc3Rfc3NlMiBKUFAoKERDVEVMRU0gKiBkYXRhKSk7Ci1FWFRFUk4odm9pZCkganBlZ19mZGN0X2Zsb2F0X3NzZSBKUFAoKEZBU1RfRkxPQVQgKiBkYXRhKSk7Ci0KLUVYVEVSTih2b2lkKSBqcGVnX2NvbnZzYW1wX2ludAotICAgIEpQUCgoSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wsIERDVEVMRU0gKiB3b3Jrc3BhY2UpKTsKLUVYVEVSTih2b2lkKSBqcGVnX3F1YW50aXplX2ludAotICAgIEpQUCgoSkNPRUZQVFIgY29lZl9ibG9jaywgRENURUxFTSAqIGRpdmlzb3JzLCBEQ1RFTEVNICogd29ya3NwYWNlKSk7Ci1FWFRFUk4odm9pZCkganBlZ19xdWFudGl6ZV9pZGl2Ci0gICAgSlBQKChKQ09FRlBUUiBjb2VmX2Jsb2NrLCBEQ1RFTEVNICogZGl2aXNvcnMsIERDVEVMRU0gKiB3b3Jrc3BhY2UpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2NvbnZzYW1wX2Zsb2F0Ci0gICAgSlBQKChKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCwgRkFTVF9GTE9BVCAqd29ya3NwYWNlKSk7Ci1FWFRFUk4odm9pZCkganBlZ19xdWFudGl6ZV9mbG9hdAotICAgIEpQUCgoSkNPRUZQVFIgY29lZl9ibG9jaywgRkFTVF9GTE9BVCAqIGRpdmlzb3JzLCBGQVNUX0ZMT0FUICogd29ya3NwYWNlKSk7Ci0KLUVYVEVSTih2b2lkKSBqcGVnX2NvbnZzYW1wX2ludF9tbXgKLSAgICBKUFAoKEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sLCBEQ1RFTEVNICogd29ya3NwYWNlKSk7Ci1FWFRFUk4odm9pZCkganBlZ19xdWFudGl6ZV9pbnRfbW14Ci0gICAgSlBQKChKQ09FRlBUUiBjb2VmX2Jsb2NrLCBEQ1RFTEVNICogZGl2aXNvcnMsIERDVEVMRU0gKiB3b3Jrc3BhY2UpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2NvbnZzYW1wX2ZsdF8zZG5vdwotICAgIEpQUCgoSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wsIEZBU1RfRkxPQVQgKndvcmtzcGFjZSkpOwotRVhURVJOKHZvaWQpIGpwZWdfcXVhbnRpemVfZmx0XzNkbm93Ci0gICAgSlBQKChKQ09FRlBUUiBjb2VmX2Jsb2NrLCBGQVNUX0ZMT0FUICogZGl2aXNvcnMsIEZBU1RfRkxPQVQgKiB3b3Jrc3BhY2UpKTsKLQotRVhURVJOKHZvaWQpIGpwZWdfY29udnNhbXBfaW50X3NzZTIKLSAgICBKUFAoKEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sLCBEQ1RFTEVNICogd29ya3NwYWNlKSk7Ci1FWFRFUk4odm9pZCkganBlZ19xdWFudGl6ZV9pbnRfc3NlMgotICAgIEpQUCgoSkNPRUZQVFIgY29lZl9ibG9jaywgRENURUxFTSAqIGRpdmlzb3JzLCBEQ1RFTEVNICogd29ya3NwYWNlKSk7Ci1FWFRFUk4odm9pZCkganBlZ19jb252c2FtcF9mbHRfc3NlCi0gICAgSlBQKChKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCwgRkFTVF9GTE9BVCAqd29ya3NwYWNlKSk7Ci1FWFRFUk4odm9pZCkganBlZ19xdWFudGl6ZV9mbHRfc3NlCi0gICAgSlBQKChKQ09FRlBUUiBjb2VmX2Jsb2NrLCBGQVNUX0ZMT0FUICogZGl2aXNvcnMsIEZBU1RfRkxPQVQgKiB3b3Jrc3BhY2UpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2NvbnZzYW1wX2ZsdF9zc2UyCi0gICAgSlBQKChKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCwgRkFTVF9GTE9BVCAqd29ya3NwYWNlKSk7Ci1FWFRFUk4odm9pZCkganBlZ19xdWFudGl6ZV9mbHRfc3NlMgotICAgIEpQUCgoSkNPRUZQVFIgY29lZl9ibG9jaywgRkFTVF9GTE9BVCAqIGRpdmlzb3JzLCBGQVNUX0ZMT0FUICogd29ya3NwYWNlKSk7Ci0KIEVYVEVSTih2b2lkKSBqcGVnX2lkY3RfaXNsb3cKICAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAogCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOwpAQCAtMjM1LDYwICsxMjUsNiBAQAogICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCiAJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CiAKLUVYVEVSTih2b2lkKSBqcGVnX2lkY3RfaXNsb3dfbW14Ci0gICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2lkY3RfaWZhc3RfbW14Ci0gICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2lkY3RfNHg0X21teAotICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7Ci1FWFRFUk4odm9pZCkganBlZ19pZGN0XzJ4Ml9tbXgKLSAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOwotCi1FWFRFUk4odm9pZCkganBlZ19pZGN0X2Zsb2F0XzNkbm93Ci0gICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2lkY3RfZmxvYXRfc3NlCi0gICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2lkY3RfZmxvYXRfc3NlMgotICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7Ci0KLUVYVEVSTih2b2lkKSBqcGVnX2lkY3RfaXNsb3dfc3NlMgotICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7Ci1FWFRFUk4odm9pZCkganBlZ19pZGN0X2lmYXN0X3NzZTIKLSAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOwotRVhURVJOKHZvaWQpIGpwZWdfaWRjdF80eDRfc3NlMgotICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7Ci1FWFRFUk4odm9pZCkganBlZ19pZGN0XzJ4Ml9zc2UyCi0gICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKLQotZXh0ZXJuIGNvbnN0IGludCBqY29uc3RfZmRjdF9mbG9hdFtdOwotZXh0ZXJuIGNvbnN0IGludCBqY29uc3RfZmRjdF9pc2xvd19tbXhbXTsKLWV4dGVybiBjb25zdCBpbnQgamNvbnN0X2ZkY3RfaWZhc3RfbW14W107Ci1leHRlcm4gY29uc3QgaW50IGpjb25zdF9mZGN0X2Zsb2F0XzNkbm93W107Ci1leHRlcm4gY29uc3QgaW50IGpjb25zdF9mZGN0X2lzbG93X3NzZTJbXTsKLWV4dGVybiBjb25zdCBpbnQgamNvbnN0X2ZkY3RfaWZhc3Rfc3NlMltdOwotZXh0ZXJuIGNvbnN0IGludCBqY29uc3RfZmRjdF9mbG9hdF9zc2VbXTsKLWV4dGVybiBjb25zdCBpbnQgamNvbnN0X2lkY3RfZmxvYXRbXTsKLWV4dGVybiBjb25zdCBpbnQgamNvbnN0X2lkY3RfaXNsb3dfbW14W107Ci1leHRlcm4gY29uc3QgaW50IGpjb25zdF9pZGN0X2lmYXN0X21teFtdOwotZXh0ZXJuIGNvbnN0IGludCBqY29uc3RfaWRjdF9mbG9hdF8zZG5vd1tdOwotZXh0ZXJuIGNvbnN0IGludCBqY29uc3RfaWRjdF9yZWRfbW14W107Ci1leHRlcm4gY29uc3QgaW50IGpjb25zdF9pZGN0X2lzbG93X3NzZTJbXTsKLWV4dGVybiBjb25zdCBpbnQgamNvbnN0X2lkY3RfaWZhc3Rfc3NlMltdOwotZXh0ZXJuIGNvbnN0IGludCBqY29uc3RfaWRjdF9mbG9hdF9zc2VbXTsKLWV4dGVybiBjb25zdCBpbnQgamNvbnN0X2lkY3RfZmxvYXRfc3NlMltdOwotZXh0ZXJuIGNvbnN0IGludCBqY29uc3RfaWRjdF9yZWRfc3NlMltdOwotCiAKIC8qCiAgKiBNYWNyb3MgZm9yIGhhbmRsaW5nIGZpeGVkLXBvaW50IGFyaXRobWV0aWM7IHRoZXNlIGFyZSB1c2VkIGJ5IG1hbnkKZGlmZiAtLWdpdCBhL2pkY3QuaW5jIGIvamRjdC5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZmIwZWQuLjAwMDAwMDAKLS0tIGEvamRjdC5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotOwotOyBqZGN0LmluYyAtIHByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBmb3J3YXJkICYgcmV2ZXJzZSBEQ1Qgc3Vic3lzdGVtcwotOwotOyB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLTsgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KLTsgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGpzaW1kZXh0LmluYwotOwotOyBMYXN0IE1vZGlmaWVkIDogSmFudWFyeSA1LCAyMDA2Ci07Ci07IFtUQUI4XQotCi07IC0tLS0gamRjdC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ci07IGNvbmZpZ3VyYXRpb24gY2hlY2s6IEJJVFNfSU5fSlNBTVBMRT09OCAoOC1iaXQgc2FtcGxlIHZhbHVlcykgaXMgdGhlIG9ubHkKLTsgdmFsaWQgc2V0dGluZyBvbiB0aGlzIFNJTUQgZXh0ZW5zaW9uLgotOwotJWlmIEJJVFNfSU5fSlNBTVBMRSAhPSA4Ci0lZXJyb3IgIlNvcnJ5LCB0aGlzIFNJTUQgY29kZSBvbmx5IGNvcGVzIHdpdGggOC1iaXQgc2FtcGxlIHZhbHVlcy4iCi0lZW5kaWYKLQotOyBBIGZvcndhcmQgRENUIHJvdXRpbmUgaXMgZ2l2ZW4gYSBwb2ludGVyIHRvIGEgd29yayBhcmVhIG9mIHR5cGUgRENURUxFTVtdOwotOyB0aGUgRENUIGlzIHRvIGJlIHBlcmZvcm1lZCBpbi1wbGFjZSBpbiB0aGF0IGJ1ZmZlci4KLTsgVG8gbWF4aW1pemUgcGFyYWxsZWxpc20sIFR5cGUgRENURUxFTSBpcyBjaGFuZ2VkIHRvIHNob3J0IChvcmlnaW5hbGx5LCBpbnQpLgotOwotJWRlZmluZSBEQ1RFTEVNCQkJd29yZAkJOyBzaG9ydAotJWRlZmluZSBTSVpFT0ZfRENURUxFTQkJU0laRU9GX1dPUkQJOyBzaXplb2YoRENURUxFTSkKLQotOyBUbyBtYXhpbWl6ZSBwYXJhbGxlbGlzbSwgVHlwZSBNVUxUSVBMSUVSIGlzIGNoYW5nZWQgdG8gc2hvcnQuCi07Ci0lZGVmaW5lIE1VTFRJUExJRVIJCXdvcmQJCTsgc2hvcnQKLSVkZWZpbmUgU0laRU9GX01VTFRJUExJRVIJU0laRU9GX1dPUkQJOyBzaXplb2YoTVVMVElQTElFUikKLSVkZWZpbmUgRkFTVF9GTE9BVAkJRlAzMgkJOyBmbG9hdAotJWRlZmluZSBTSVpFT0ZfRkFTVF9GTE9BVAlTSVpFT0ZfRlAzMgk7IHNpemVvZihGQVNUX0ZMT0FUKQotCi07IEVhY2ggSURDVCByb3V0aW5lIGhhcyBpdHMgb3duIGlkZWFzIGFib3V0IHRoZSBiZXN0IGRjdF90YWJsZSBlbGVtZW50IHR5cGUuCi07Ci0lZGVmaW5lIElTTE9XX01VTFRfVFlQRSAJTVVMVElQTElFUiAgICAgICAgICA7IG11c3QgYmUgc2hvcnQKLSVkZWZpbmUgU0laRU9GX0lTTE9XX01VTFRfVFlQRQlTSVpFT0ZfTVVMVElQTElFUiAgIDsgc2l6ZW9mKElTTE9XX01VTFRfVFlQRSkKLSVkZWZpbmUgSUZBU1RfTVVMVF9UWVBFIAlNVUxUSVBMSUVSICAgICAgICAgIDsgbXVzdCBiZSBzaG9ydAotJWRlZmluZSBTSVpFT0ZfSUZBU1RfTVVMVF9UWVBFCVNJWkVPRl9NVUxUSVBMSUVSICAgOyBzaXplb2YoSUZBU1RfTVVMVF9UWVBFKQotJWRlZmluZSBJRkFTVF9TQ0FMRV9CSVRTCTIJOyBmcmFjdGlvbmFsIGJpdHMgaW4gc2NhbGUgZmFjdG9ycwotJWRlZmluZSBGTE9BVF9NVUxUX1RZUEUgCUZBU1RfRkxPQVQgICAgICAgICAgOyBtdXN0IGJlIGZsb2F0Ci0lZGVmaW5lIFNJWkVPRl9GTE9BVF9NVUxUX1RZUEUJU0laRU9GX0ZBU1RfRkxPQVQgICA7IHNpemVvZihGTE9BVF9NVUxUX1RZUEUpCi0KLTsgRWFjaCBJRENUIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHJhbmdlLWxpbWl0aW5nIGl0cyByZXN1bHRzIGFuZAotOyBjb252ZXJ0aW5nIHRoZW0gdG8gdW5zaWduZWQgZm9ybSAoMC4uTUFYSlNBTVBMRSkuICBUaGUgcmF3IG91dHB1dHMgY291bGQKLTsgYmUgcXVpdGUgZmFyIG91dCBvZiByYW5nZSBpZiB0aGUgaW5wdXQgZGF0YSBpcyBjb3JydXB0LCBzbyBhIGJ1bGxldHByb29mCi07IHJhbmdlLWxpbWl0aW5nIHN0ZXAgaXMgcmVxdWlyZWQuICBXZSB1c2UgYSBtYXNrLWFuZC10YWJsZS1sb29rdXAgbWV0aG9kCi07IHRvIGRvIHRoZSBjb21iaW5lZCBvcGVyYXRpb25zIHF1aWNrbHkuCi07Ci0lZGVmaW5lIFJBTkdFX01BU0sgIChNQVhKU0FNUExFICogNCArIDMpICA7IDIgYml0cyB3aWRlciB0aGFuIGxlZ2FsIHNhbXBsZXMKLQotOyBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4KLTsKLSVpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0lZGVmaW5lIGpwZWdfZmRjdF9pc2xvdwkJakZEaXNsb3cJOyBqZmRjdGludC5hc20KLSVkZWZpbmUganBlZ19mZGN0X2lmYXN0CQlqRkRpZmFzdAk7IGpmZGN0ZnN0LmFzbQotJWRlZmluZSBqcGVnX2ZkY3RfZmxvYXQJCWpGRGZsb2F0CTsgamZkY3RmbHQuYXNtCi0lZGVmaW5lIGpwZWdfZmRjdF9pc2xvd19tbXgJakZETWlzbG93CTsgamZtbXhpbnQuYXNtCi0lZGVmaW5lIGpwZWdfZmRjdF9pZmFzdF9tbXgJakZETWlmYXN0CTsgamZtbXhmc3QuYXNtCi0lZGVmaW5lIGpwZWdfZmRjdF9mbG9hdF8zZG5vdwlqRkQzZmxvYXQJOyBqZjNkbmZsdC5hc20KLSVkZWZpbmUganBlZ19mZGN0X2lzbG93X3NzZTIJakZEU2lzbG93CTsgamZzczJpbnQuYXNtCi0lZGVmaW5lIGpwZWdfZmRjdF9pZmFzdF9zc2UyCWpGRFNpZmFzdAk7IGpmc3MyZnN0LmFzbQotJWRlZmluZSBqcGVnX2ZkY3RfZmxvYXRfc3NlCWpGRFNmbG9hdAk7IGpmc3NlZmx0LmFzbQotJWRlZmluZSBqcGVnX2NvbnZzYW1wX2ludAlqQ252SW50CQk7IGpjcW50aW50LmFzbQotJWRlZmluZSBqcGVnX3F1YW50aXplX2ludAlqUW50SW50CQk7IGpjcW50aW50LmFzbQotJWRlZmluZSBqcGVnX3F1YW50aXplX2lkaXYJalFudElEaXYJOyBqY3FudGludC5hc20KLSVkZWZpbmUganBlZ19jb252c2FtcF9mbG9hdAlqQ252RmxvYXQJOyBqY3FudGZsdC5hc20KLSVkZWZpbmUganBlZ19xdWFudGl6ZV9mbG9hdAlqUW50RmxvYXQJOyBqY3FudGZsdC5hc20KLSVkZWZpbmUganBlZ19jb252c2FtcF9pbnRfbW14CWpDbnZNbXgJCTsgamNxbnRtbXguYXNtCi0lZGVmaW5lIGpwZWdfcXVhbnRpemVfaW50X21teAlqUW50TW14CQk7IGpjcW50bW14LmFzbQotJWRlZmluZSBqcGVnX2NvbnZzYW1wX2ZsdF8zZG5vdwlqQ252M2Rub3cJOyBqY3FudDNkbi5hc20KLSVkZWZpbmUganBlZ19xdWFudGl6ZV9mbHRfM2Rub3cJalFudDNkbm93CTsgamNxbnQzZG4uYXNtCi0lZGVmaW5lIGpwZWdfY29udnNhbXBfaW50X3NzZTIJakNudklTc2UyCTsgamNxbnRzMmkuYXNtCi0lZGVmaW5lIGpwZWdfcXVhbnRpemVfaW50X3NzZTIJalFudElTc2UyCTsgamNxbnRzMmkuYXNtCi0lZGVmaW5lIGpwZWdfY29udnNhbXBfZmx0X3NzZQlqQ252U3NlCQk7IGpjcW50c3NlLmFzbQotJWRlZmluZSBqcGVnX3F1YW50aXplX2ZsdF9zc2UJalFudFNzZQkJOyBqY3FudHNzZS5hc20KLSVkZWZpbmUganBlZ19jb252c2FtcF9mbHRfc3NlMglqQ252RlNzZTIJOyBqY3FudHMyZi5hc20KLSVkZWZpbmUganBlZ19xdWFudGl6ZV9mbHRfc3NlMglqUW50RlNzZTIJOyBqY3FudHMyZi5hc20KLSVkZWZpbmUganBlZ19pZGN0X2lzbG93CQlqUkRpc2xvdwk7IGppZGN0aW50LmFzbQotJWRlZmluZSBqcGVnX2lkY3RfaWZhc3QJCWpSRGlmYXN0CTsgamlkY3Rmc3QuYXNtCi0lZGVmaW5lIGpwZWdfaWRjdF9mbG9hdAkJalJEZmxvYXQJOyBqaWRjdGZsdC5hc20KLSVkZWZpbmUganBlZ19pZGN0XzR4NAkJalJENHg0CQk7IGppZGN0cmVkLmFzbQotJWRlZmluZSBqcGVnX2lkY3RfMngyCQlqUkQyeDIJCTsgamlkY3RyZWQuYXNtCi0lZGVmaW5lIGpwZWdfaWRjdF8xeDEJCWpSRDF4MQkJOyBqaWRjdHJlZC5hc20KLSVkZWZpbmUganBlZ19pZGN0X2lzbG93X21teAlqUkRNaXNsb3cJOyBqaW1teGludC5hc20KLSVkZWZpbmUganBlZ19pZGN0X2lmYXN0X21teAlqUkRNaWZhc3QJOyBqaW1teGZzdC5hc20KLSVkZWZpbmUganBlZ19pZGN0X2Zsb2F0XzNkbm93CWpSRDNmbG9hdAk7IGppM2RuZmx0LmFzbQotJWRlZmluZSBqcGVnX2lkY3RfNHg0X21teAlqUkRNNHg0CQk7IGppbW14cmVkLmFzbQotJWRlZmluZSBqcGVnX2lkY3RfMngyX21teAlqUkRNMngyCQk7IGppbW14cmVkLmFzbQotJWRlZmluZSBqcGVnX2lkY3RfaXNsb3dfc3NlMglqUkRTaXNsb3cJOyBqaXNzMmludC5hc20KLSVkZWZpbmUganBlZ19pZGN0X2lmYXN0X3NzZTIJalJEU2lmYXN0CTsgamlzczJmc3QuYXNtCi0lZGVmaW5lIGpwZWdfaWRjdF9mbG9hdF9zc2UJalJEU2Zsb2F0CTsgamlzc2VmbHQuYXNtCi0lZGVmaW5lIGpwZWdfaWRjdF9mbG9hdF9zc2UyCWpSRDJmbG9hdAk7IGppc3MyZmx0LmFzbQotJWRlZmluZSBqcGVnX2lkY3RfNHg0X3NzZTIJalJEUzR4NAkJOyBqaXNzMnJlZC5hc20KLSVkZWZpbmUganBlZ19pZGN0XzJ4Ml9zc2UyCWpSRFMyeDIJCTsgamlzczJyZWQuYXNtCi0lZGVmaW5lIGpjb25zdF9mZGN0X2Zsb2F0CWpGQ2Zsb2F0CTsgamZkY3RmbHQuYXNtCi0lZGVmaW5lIGpjb25zdF9mZGN0X2lzbG93X21teAlqRkNNaXNsb3cJOyBqZm1teGludC5hc20KLSVkZWZpbmUgamNvbnN0X2ZkY3RfaWZhc3RfbW14CWpGQ01pZmFzdAk7IGpmbW14ZnN0LmFzbQotJWRlZmluZSBqY29uc3RfZmRjdF9mbG9hdF8zZG5vdwlqRkMzZmxvYXQJOyBqZjNkbmZsdC5hc20KLSVkZWZpbmUgamNvbnN0X2ZkY3RfaXNsb3dfc3NlMglqRkNTaXNsb3cJOyBqZnNzMmludC5hc20KLSVkZWZpbmUgamNvbnN0X2ZkY3RfaWZhc3Rfc3NlMglqRkNTaWZhc3QJOyBqZnNzMmZzdC5hc20KLSVkZWZpbmUgamNvbnN0X2ZkY3RfZmxvYXRfc3NlCWpGQ1NmbG9hdAk7IGpmc3NlZmx0LmFzbQotJWRlZmluZSBqY29uc3RfaWRjdF9mbG9hdAlqUkNmbG9hdAk7IGppZGN0Zmx0LmFzbQotJWRlZmluZSBqY29uc3RfaWRjdF9pc2xvd19tbXgJalJDTWlzbG93CTsgamltbXhpbnQuYXNtCi0lZGVmaW5lIGpjb25zdF9pZGN0X2lmYXN0X21teAlqUkNNaWZhc3QJOyBqaW1teGZzdC5hc20KLSVkZWZpbmUgamNvbnN0X2lkY3RfZmxvYXRfM2Rub3cJalJDM2Zsb2F0CTsgamkzZG5mbHQuYXNtCi0lZGVmaW5lIGpjb25zdF9pZGN0X3JlZF9tbXgJalJDTXJlZAkJOyBqaW1teHJlZC5hc20KLSVkZWZpbmUgamNvbnN0X2lkY3RfaXNsb3dfc3NlMglqUkNTaXNsb3cJOyBqaXNzMmludC5hc20KLSVkZWZpbmUgamNvbnN0X2lkY3RfaWZhc3Rfc3NlMglqUkNTaWZhc3QJOyBqaXNzMmZzdC5hc20KLSVkZWZpbmUgamNvbnN0X2lkY3RfZmxvYXRfc3NlCWpSQ1NmbG9hdAk7IGppc3NlZmx0LmFzbQotJWRlZmluZSBqY29uc3RfaWRjdF9mbG9hdF9zc2UyCWpSQzJmbG9hdAk7IGppc3MyZmx0LmFzbQotJWRlZmluZSBqY29uc3RfaWRjdF9yZWRfc3NlMglqUkNTcmVkCQk7IGppc3MycmVkLmFzbQotJWVuZGlmIDsgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSVkZWZpbmUgUk9XKG4sYixzKQkJKChiKSsobikqKHMpKQotJWRlZmluZSBDT0wobixiLHMpCQkoKGIpKyhuKSoocykqRENUU0laRSkKLQotJWRlZmluZSBEV0JMT0NLKG0sbixiLHMpCSgoYikrKG0pKkRDVFNJWkUqKHMpKyhuKSpTSVpFT0ZfRFdPUkQpCi0lZGVmaW5lIE1NQkxPQ0sobSxuLGIscykJKChiKSsobSkqRENUU0laRSoocykrKG4pKlNJWkVPRl9NTVdPUkQpCi0lZGVmaW5lIFhNTUJMT0NLKG0sbixiLHMpCSgoYikrKG0pKkRDVFNJWkUqKHMpKyhuKSpTSVpFT0ZfWE1NV09SRCkKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvamRkY3RtZ3IuYyBiL2pkZGN0bWdyLmMKaW5kZXggZGU2ZGY4ZC4uNTJmNTA5MCAxMDA2NDQKLS0tIGEvamRkY3RtZ3IuYworKysgYi9qZGRjdG1nci5jCkBAIC0yLDE2ICsyLDEwIEBACiAgKiBqZGRjdG1nci5jCiAgKgogICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogQ29weXJpZ2h0IDIwMDkgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KICAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KLSAqIFRoaXMgZmlsZSBoYXMgYmVlbiBtb2RpZmllZCBmb3IgU0lNRCBleHRlbnNpb24uCi0gKiBMYXN0IE1vZGlmaWVkIDogRGVjZW1iZXIgMjQsIDIwMDUKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKICAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW52ZXJzZS1EQ1QgbWFuYWdlbWVudCBsb2dpYy4KICAqIFRoaXMgY29kZSBzZWxlY3RzIGEgcGFydGljdWxhciBJRENUIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQsCiAgKiBhbmQgaXQgcGVyZm9ybXMgcmVsYXRlZCBob3VzZWtlZXBpbmcgY2hvcmVzLiAgTm8gY29kZSBpbiB0aGlzIGZpbGUKQEAgLTI2LDYgKzIwLDcgQEAKICNpbmNsdWRlICJqaW5jbHVkZS5oIgogI2luY2x1ZGUgImpwZWdsaWIuaCIKICNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworI2luY2x1ZGUgImpzaW1kZGN0LmgiCiAKIAogLyoKQEAgLTEwMSw3ICs5Niw2IEBACiAgIGludCBtZXRob2QgPSAwOwogICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIG1ldGhvZF9wdHIgPSBOVUxMOwogICBKUVVBTlRfVEJMICogcXRibDsKLSAgdW5zaWduZWQgaW50IHNpbWQgPSBqcGVnX3NpbWRfc3VwcG9ydCgoal9jb21tb25fcHRyKSBjaW5mbyk7CiAKICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKICAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKQEAgLTExMyw5NSArMTA3LDQ5IEBACiAgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdHJlZCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCiAgICAgICBicmVhazsKICAgICBjYXNlIDI6Ci0jaWZkZWYgSklEQ1RfSU5UX1NTRTJfU1VQUE9SVEVECi0gICAgICBpZiAoc2ltZCAmIEpTSU1EX1NTRTIgJiYKLSAgICAgICAgICBJU19DT05TVF9BTElHTkVEXzE2KGpjb25zdF9pZGN0X3JlZF9zc2UyKSkKLQltZXRob2RfcHRyID0ganBlZ19pZGN0XzJ4Ml9zc2UyOworICAgICAgaWYgKGpzaW1kX2Nhbl9pZGN0XzJ4MigpKQorICAgICAgICBtZXRob2RfcHRyID0ganNpbWRfaWRjdF8yeDI7CiAgICAgICBlbHNlCi0jZW5kaWYKLSNpZmRlZiBKSURDVF9JTlRfTU1YX1NVUFBPUlRFRAotICAgICAgaWYgKHNpbWQgJiBKU0lNRF9NTVgpCi0JbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF8yeDJfbW14OwotICAgICAgZWxzZQotI2VuZGlmCi0JbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF8yeDI7CisgICAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfMngyOwogICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RyZWQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLwogICAgICAgYnJlYWs7CiAgICAgY2FzZSA0OgotI2lmZGVmIEpJRENUX0lOVF9TU0UyX1NVUFBPUlRFRAotICAgICAgaWYgKHNpbWQgJiBKU0lNRF9TU0UyICYmCi0gICAgICAgICAgSVNfQ09OU1RfQUxJR05FRF8xNihqY29uc3RfaWRjdF9yZWRfc3NlMikpCi0JbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF80eDRfc3NlMjsKKyAgICAgIGlmIChqc2ltZF9jYW5faWRjdF80eDQoKSkKKyAgICAgICAgbWV0aG9kX3B0ciA9IGpzaW1kX2lkY3RfNHg0OwogICAgICAgZWxzZQotI2VuZGlmCi0jaWZkZWYgSklEQ1RfSU5UX01NWF9TVVBQT1JURUQKLSAgICAgIGlmIChzaW1kICYgSlNJTURfTU1YKQotCW1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfNHg0X21teDsKLSAgICAgIGVsc2UKLSNlbmRpZgotCW1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfNHg0OworICAgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzR4NDsKICAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0cmVkIHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KICAgICAgIGJyZWFrOwotI2VuZGlmIC8qIElEQ1RfU0NBTElOR19TVVBQT1JURUQgKi8KKyNlbmRpZgogICAgIGNhc2UgRENUU0laRToKICAgICAgIHN3aXRjaCAoY2luZm8tPmRjdF9tZXRob2QpIHsKICNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECiAgICAgICBjYXNlIEpEQ1RfSVNMT1c6Ci0jaWZkZWYgSklEQ1RfSU5UX1NTRTJfU1VQUE9SVEVECi0JaWYgKHNpbWQgJiBKU0lNRF9TU0UyICYmCi0JICAgIElTX0NPTlNUX0FMSUdORURfMTYoamNvbnN0X2lkY3RfaXNsb3dfc3NlMikpCi0JICBtZXRob2RfcHRyID0ganBlZ19pZGN0X2lzbG93X3NzZTI7CisJaWYgKGpzaW1kX2Nhbl9pZGN0X2lzbG93KCkpCisJICBtZXRob2RfcHRyID0ganNpbWRfaWRjdF9pc2xvdzsKIAllbHNlCi0jZW5kaWYKLSNpZmRlZiBKSURDVF9JTlRfTU1YX1NVUFBPUlRFRAotCWlmIChzaW1kICYgSlNJTURfTU1YKQotCSAgbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF9pc2xvd19tbXg7Ci0JZWxzZQotI2VuZGlmCiAJICBtZXRob2RfcHRyID0ganBlZ19pZGN0X2lzbG93OwogCW1ldGhvZCA9IEpEQ1RfSVNMT1c7CiAJYnJlYWs7Ci0jZW5kaWYgLyogRENUX0lTTE9XX1NVUFBPUlRFRCAqLworI2VuZGlmCiAjaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAogICAgICAgY2FzZSBKRENUX0lGQVNUOgotI2lmZGVmIEpJRENUX0lOVF9TU0UyX1NVUFBPUlRFRAotCWlmIChzaW1kICYgSlNJTURfU1NFMiAmJgotCSAgICBJU19DT05TVF9BTElHTkVEXzE2KGpjb25zdF9pZGN0X2lmYXN0X3NzZTIpKQotCSAgbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF9pZmFzdF9zc2UyOworCWlmIChqc2ltZF9jYW5faWRjdF9pZmFzdCgpKQorCSAgbWV0aG9kX3B0ciA9IGpzaW1kX2lkY3RfaWZhc3Q7CiAJZWxzZQotI2VuZGlmCi0jaWZkZWYgSklEQ1RfSU5UX01NWF9TVVBQT1JURUQKLQlpZiAoc2ltZCAmIEpTSU1EX01NWCkKLQkgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfaWZhc3RfbW14OwotCWVsc2UKLSNlbmRpZgogCSAgbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF9pZmFzdDsKIAltZXRob2QgPSBKRENUX0lGQVNUOwogCWJyZWFrOwotI2VuZGlmIC8qIERDVF9JRkFTVF9TVVBQT1JURUQgKi8KKyNlbmRpZgogI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKICAgICAgIGNhc2UgSkRDVF9GTE9BVDoKLSNpZmRlZiBKSURDVF9GTFRfU1NFX1NTRTJfU1VQUE9SVEVECi0JaWYgKHNpbWQgJiBKU0lNRF9TU0UgJiYgc2ltZCAmIEpTSU1EX1NTRTIgJiYKLQkgICAgSVNfQ09OU1RfQUxJR05FRF8xNihqY29uc3RfaWRjdF9mbG9hdF9zc2UyKSkKLQkgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfZmxvYXRfc3NlMjsKKwlpZiAoanNpbWRfY2FuX2lkY3RfZmxvYXQoKSkKKwkgIG1ldGhvZF9wdHIgPSBqc2ltZF9pZGN0X2Zsb2F0OwogCWVsc2UKLSNlbmRpZgotI2lmZGVmIEpJRENUX0ZMVF9TU0VfTU1YX1NVUFBPUlRFRAotCWlmIChzaW1kICYgSlNJTURfU1NFICYmCi0JICAgIElTX0NPTlNUX0FMSUdORURfMTYoamNvbnN0X2lkY3RfZmxvYXRfc3NlKSkKLQkgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfZmxvYXRfc3NlOwotCWVsc2UKLSNlbmRpZgotI2lmZGVmIEpJRENUX0ZMVF8zRE5PV19NTVhfU1VQUE9SVEVECi0JaWYgKHNpbWQgJiBKU0lNRF8zRE5PVykKLQkgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfZmxvYXRfM2Rub3c7Ci0JZWxzZQotI2VuZGlmCiAJICBtZXRob2RfcHRyID0ganBlZ19pZGN0X2Zsb2F0OwogCW1ldGhvZCA9IEpEQ1RfRkxPQVQ7CiAJYnJlYWs7Ci0jZW5kaWYgLyogRENUX0ZMT0FUX1NVUFBPUlRFRCAqLworI2VuZGlmCiAgICAgICBkZWZhdWx0OgogCUVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKIAlicmVhazsKQEAgLTMzNiw3OCArMjg0LDMgQEAKICAgICBpZGN0LT5jdXJfbWV0aG9kW2NpXSA9IC0xOwogICB9CiB9Ci0KLQotI2lmbmRlZiBKU0lNRF9NT0RFSU5GT19OT1RfU1VQUE9SVEVECi0KLUdMT0JBTCh1bnNpZ25lZCBpbnQpCi1qcGVnX3NpbWRfaW52ZXJzZV9kY3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBtZXRob2QpCi17Ci0gIHVuc2lnbmVkIGludCBzaW1kID0ganBlZ19zaW1kX3N1cHBvcnQoKGpfY29tbW9uX3B0cikgY2luZm8pOwotCi0gIHN3aXRjaCAobWV0aG9kKSB7Ci0jaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotICBjYXNlIEpEQ1RfSVNMT1c6Ci0jaWZkZWYgSklEQ1RfSU5UX1NTRTJfU1VQUE9SVEVECi0gICAgaWYgKHNpbWQgJiBKU0lNRF9TU0UyICYmCi0gICAgICAgIElTX0NPTlNUX0FMSUdORURfMTYoamNvbnN0X2lkY3RfaXNsb3dfc3NlMikpCi0gICAgICByZXR1cm4gSlNJTURfU1NFMjsKLSNlbmRpZgotI2lmZGVmIEpJRENUX0lOVF9NTVhfU1VQUE9SVEVECi0gICAgaWYgKHNpbWQgJiBKU0lNRF9NTVgpCi0gICAgICByZXR1cm4gSlNJTURfTU1YOwotI2VuZGlmCi0gICAgcmV0dXJuIEpTSU1EX05PTkU7Ci0jZW5kaWYgLyogRENUX0lTTE9XX1NVUFBPUlRFRCAqLwotI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKLSAgY2FzZSBKRENUX0lGQVNUOgotI2lmZGVmIEpJRENUX0lOVF9TU0UyX1NVUFBPUlRFRAotICAgIGlmIChzaW1kICYgSlNJTURfU1NFMiAmJgotICAgICAgICBJU19DT05TVF9BTElHTkVEXzE2KGpjb25zdF9pZGN0X2lmYXN0X3NzZTIpKQotICAgICAgcmV0dXJuIEpTSU1EX1NTRTI7Ci0jZW5kaWYKLSNpZmRlZiBKSURDVF9JTlRfTU1YX1NVUFBPUlRFRAotICAgIGlmIChzaW1kICYgSlNJTURfTU1YKQotICAgICAgcmV0dXJuIEpTSU1EX01NWDsKLSNlbmRpZgotICAgIHJldHVybiBKU0lNRF9OT05FOwotI2VuZGlmIC8qIERDVF9JRkFTVF9TVVBQT1JURUQgKi8KLSNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0gIGNhc2UgSkRDVF9GTE9BVDoKLSNpZmRlZiBKSURDVF9GTFRfU1NFX1NTRTJfU1VQUE9SVEVECi0gICAgaWYgKHNpbWQgJiBKU0lNRF9TU0UgJiYgc2ltZCAmIEpTSU1EX1NTRTIgJiYKLSAgICAgICAgSVNfQ09OU1RfQUxJR05FRF8xNihqY29uc3RfaWRjdF9mbG9hdF9zc2UyKSkKLSAgICAgIHJldHVybiBKU0lNRF9TU0U7CQkvKiAoSlNJTURfU1NFIHwgSlNJTURfU1NFMik7ICovCi0jZW5kaWYKLSNpZmRlZiBKSURDVF9GTFRfU1NFX01NWF9TVVBQT1JURUQKLSAgICBpZiAoc2ltZCAmIEpTSU1EX1NTRSAmJgotICAgICAgICBJU19DT05TVF9BTElHTkVEXzE2KGpjb25zdF9pZGN0X2Zsb2F0X3NzZSkpCi0gICAgICByZXR1cm4gSlNJTURfU1NFOwkJLyogKEpTSU1EX1NTRSB8IEpTSU1EX01NWCk7ICovCi0jZW5kaWYKLSNpZmRlZiBKSURDVF9GTFRfM0ROT1dfTU1YX1NVUFBPUlRFRAotICAgIGlmIChzaW1kICYgSlNJTURfM0ROT1cpCi0gICAgICByZXR1cm4gSlNJTURfM0ROT1c7CS8qIChKU0lNRF8zRE5PVyB8IEpTSU1EX01NWCk7ICovCi0jZW5kaWYKLSAgICByZXR1cm4gSlNJTURfTk9ORTsKLSNlbmRpZiAvKiBEQ1RfRkxPQVRfU1VQUE9SVEVEICovCi0jaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAotICBjYXNlIEpEQ1RfRkxPQVQgKyAxOgotI2lmZGVmIEpJRENUX0lOVF9TU0UyX1NVUFBPUlRFRAotICAgIGlmIChzaW1kICYgSlNJTURfU1NFMiAmJgotICAgICAgICBJU19DT05TVF9BTElHTkVEXzE2KGpjb25zdF9pZGN0X3JlZF9zc2UyKSkKLSAgICAgIHJldHVybiBKU0lNRF9TU0UyOwotI2VuZGlmCi0jaWZkZWYgSklEQ1RfSU5UX01NWF9TVVBQT1JURUQKLSAgICBpZiAoc2ltZCAmIEpTSU1EX01NWCkKLSAgICAgIHJldHVybiBKU0lNRF9NTVg7Ci0jZW5kaWYKLSAgICByZXR1cm4gSlNJTURfTk9ORTsKLSNlbmRpZiAvKiBJRENUX1NDQUxJTkdfU1VQUE9SVEVEICovCi0gIGRlZmF1bHQ6Ci0gICAgOwotICB9Ci0KLSAgcmV0dXJuIEpTSU1EX05PTkU7CS8qIG5vdCBjb21waWxlZCAqLwotfQotCi0jZW5kaWYgLyogIUpTSU1EX01PREVJTkZPX05PVF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2pkaHVmZi5jIGIvamRodWZmLmMKaW5kZXggNGY3NWViZS4uYjViYTM5ZiAxMDA2NDQKLS0tIGEvamRodWZmLmMKKysrIGIvamRodWZmLmMKQEAgLTUsMTMgKzUsNiBAQAogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KICAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KLSAqIFRoaXMgZmlsZSBoYXMgYmVlbiBtb2RpZmllZCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLgotICogTGFzdCBNb2RpZmllZCA6IE9jdG9iZXIgMzEsIDIwMDQKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKICAqIFRoaXMgZmlsZSBjb250YWlucyBIdWZmbWFuIGVudHJvcHkgZGVjb2Rpbmcgcm91dGluZXMuCiAgKgogICogTXVjaCBvZiB0aGUgY29tcGxleGl0eSBoZXJlIGhhcyB0byBkbyB3aXRoIHN1cHBvcnRpbmcgaW5wdXQgc3VzcGVuc2lvbi4KQEAgLTE1OCw4ICsxNTEsOCBAQAogewogICBKSFVGRl9UQkwgKmh0Ymw7CiAgIGRfZGVyaXZlZF90YmwgKmR0Ymw7Ci0gIGludCBwLCBpLCBsLCBsYSwgbHgsIHNpLCBudW1zeW1ib2xzOwotICBpbnQgbG9va2JpdHMsIGxvb2tfZW5kLCBzeW0sIHZhbCwgY3RyOworICBpbnQgcCwgaSwgbCwgc2ksIG51bXN5bWJvbHM7CisgIGludCBsb29rYml0cywgY3RyOwogICBjaGFyIGh1ZmZzaXplWzI1N107CiAgIHVuc2lnbmVkIGludCBodWZmY29kZVsyNTddOwogICB1bnNpZ25lZCBpbnQgY29kZTsKQEAgLTI0MSwzNCArMjM0LDE4IEBACiAgICAqIHdpdGggdGhhdCBjb2RlLgogICAgKi8KIAotICBNRU1aRVJPKGR0YmwtPmxvb2t4X25iaXRzLCBTSVpFT0YoZHRibC0+bG9va3hfbmJpdHMpKTsKKyAgTUVNWkVSTyhkdGJsLT5sb29rX25iaXRzLCBTSVpFT0YoZHRibC0+bG9va19uYml0cykpOwogCiAgIHAgPSAwOwotICBmb3IgKGwgPSAxOyBsIDw9IEhVRkZYX0xPT0tBSEVBRC0xOyBsKyspIHsKKyAgZm9yIChsID0gMTsgbCA8PSBIVUZGX0xPT0tBSEVBRDsgbCsrKSB7CiAgICAgZm9yIChpID0gMTsgaSA8PSAoaW50KSBodGJsLT5iaXRzW2xdOyBpKyssIHArKykgewogICAgICAgLyogbCA9IGN1cnJlbnQgY29kZSdzIGxlbmd0aCwgcCA9IGl0cyBpbmRleCBpbiBodWZmY29kZVtdICYgaHVmZnZhbFtdLiAqLwogICAgICAgLyogR2VuZXJhdGUgbGVmdC1qdXN0aWZpZWQgY29kZSBmb2xsb3dlZCBieSBhbGwgcG9zc2libGUgYml0IHNlcXVlbmNlcyAqLwotICAgICAgc3ltID0gaHRibC0+aHVmZnZhbFtwXTsJCS8qIGN1cnJlbnQgc3ltYm9sICovCi0gICAgICBsYSA9IHN5bSAmIDE1OwkJCS8qIGxlbmd0aCBvZiBhZGRpdGlvbmFsIGJpdHMgZmllbGQgKi8KLSAgICAgIGx4ID0gSFVGRlhfTE9PS0FIRUFEIC0gbDsKLSAgICAgIGxvb2tiaXRzID0gaHVmZmNvZGVbcF0gPDwgbHg7Ci0gICAgICBsb29rX2VuZCA9IGxvb2tiaXRzICsgKDEgPDwgbHgpOwotICAgICAgbHggLT0gbGE7Ci0gICAgICB3aGlsZSAobG9va2JpdHMgPCBsb29rX2VuZCkgewotCWlmIChseCA+PSAwKSB7Ci0JICB2YWwgPSAobG9va2JpdHMgPj4gIGx4KSAmICgoMSA8PCBsYSkgLSAxKTsKLQkgIGN0ciA9IDEgPDwgbHg7Ci0JfSBlbHNlIHsKLQkgIHZhbCA9IChsb29rYml0cyA8PCAtbHgpICYgKCgxIDw8IGxhKSAtIDEpOwotCSAgY3RyID0gMTsKLQl9Ci0JdmFsID0gSFVGRl9FWFRFTkQodmFsLCBsYSk7Ci0JZm9yICg7IGN0ciA+IDA7IGN0ci0tKSB7Ci0JICBkdGJsLT5sb29reF9uYml0c1tsb29rYml0c10gPSBsICsgbGE7Ci0JICBkdGJsLT5sb29reF92YWxbbG9va2JpdHNdID0gdmFsOwotCSAgZHRibC0+bG9va3hfc3ltW2xvb2tiaXRzXSA9IHN5bTsKLQkgIGxvb2tiaXRzKys7Ci0JfQorICAgICAgbG9va2JpdHMgPSBodWZmY29kZVtwXSA8PCAoSFVGRl9MT09LQUhFQUQtbCk7CisgICAgICBmb3IgKGN0ciA9IDEgPDwgKEhVRkZfTE9PS0FIRUFELWwpOyBjdHIgPiAwOyBjdHItLSkgeworCWR0YmwtPmxvb2tfbmJpdHNbbG9va2JpdHNdID0gbDsKKwlkdGJsLT5sb29rX3N5bVtsb29rYml0c10gPSBodGJsLT5odWZmdmFsW3BdOworCWxvb2tiaXRzKys7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC0yOTQsOCArMjcxLDIzIEBACiAgKiBTZWUgamRodWZmLmggZm9yIGluZm8gYWJvdXQgdXNhZ2UuCiAgKiBOb3RlOiBjdXJyZW50IHZhbHVlcyBvZiBnZXRfYnVmZmVyIGFuZCBiaXRzX2xlZnQgYXJlIHBhc3NlZCBhcyBwYXJhbWV0ZXJzLAogICogYnV0IGFyZSByZXR1cm5lZCBpbiB0aGUgY29ycmVzcG9uZGluZyBmaWVsZHMgb2YgdGhlIHN0YXRlIHN0cnVjdC4KKyAqCisgKiBPbiBtb3N0IG1hY2hpbmVzIE1JTl9HRVRfQklUUyBzaG91bGQgYmUgMjUgdG8gYWxsb3cgdGhlIGZ1bGwgMzItYml0IHdpZHRoCisgKiBvZiBnZXRfYnVmZmVyIHRvIGJlIHVzZWQuICAoT24gbWFjaGluZXMgd2l0aCB3aWRlciB3b3JkcywgYW4gZXZlbiBsYXJnZXIKKyAqIGJ1ZmZlciBjb3VsZCBiZSB1c2VkLikgIEhvd2V2ZXIsIG9uIHNvbWUgbWFjaGluZXMgMzItYml0IHNoaWZ0cyBhcmUKKyAqIHF1aXRlIHNsb3cgYW5kIHRha2UgdGltZSBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlciBvZiBwbGFjZXMgc2hpZnRlZC4KKyAqIChUaGlzIGlzIHRydWUgd2l0aCBtb3N0IFBDIGNvbXBpbGVycywgZm9yIGluc3RhbmNlLikgIEluIHRoaXMgY2FzZSBpdCBtYXkKKyAqIGJlIGEgd2luIHRvIHNldCBNSU5fR0VUX0JJVFMgdG8gdGhlIG1pbmltdW0gdmFsdWUgb2YgMTUuICBUaGlzIHJlZHVjZXMgdGhlCisgKiBhdmVyYWdlIHNoaWZ0IGRpc3RhbmNlIGF0IHRoZSBjb3N0IG9mIG1vcmUgY2FsbHMgdG8ganBlZ19maWxsX2JpdF9idWZmZXIuCiAgKi8KIAorI2lmZGVmIFNMT1dfU0hJRlRfMzIKKyNkZWZpbmUgTUlOX0dFVF9CSVRTICAxNQkvKiBtaW5pbXVtIGFsbG93YWJsZSB2YWx1ZSAqLworI2Vsc2UKKyNkZWZpbmUgTUlOX0dFVF9CSVRTICAoQklUX0JVRl9TSVpFLTcpCisjZW5kaWYKKworCiBHTE9CQUwoYm9vbGVhbikKIGpwZWdfZmlsbF9iaXRfYnVmZmVyIChiaXRyZWFkX3dvcmtpbmdfc3RhdGUgKiBzdGF0ZSwKIAkJICAgICAgcmVnaXN0ZXIgYml0X2J1Zl90eXBlIGdldF9idWZmZXIsIHJlZ2lzdGVyIGludCBiaXRzX2xlZnQsCkBAIC00NDIsNiArNDM0LDMyIEBACiAKIAogLyoKKyAqIEZpZ3VyZSBGLjEyOiBleHRlbmQgc2lnbiBiaXQuCisgKiBPbiBzb21lIG1hY2hpbmVzLCBhIHNoaWZ0IGFuZCBhZGQgd2lsbCBiZSBmYXN0ZXIgdGhhbiBhIHRhYmxlIGxvb2t1cC4KKyAqLworCisjaWZkZWYgQVZPSURfVEFCTEVTCisKKyNkZWZpbmUgSFVGRl9FWFRFTkQoeCxzKSAgKCh4KSA8ICgxPDwoKHMpLTEpKSA/ICh4KSArICgoKC0xKTw8KHMpKSArIDEpIDogKHgpKQorCisjZWxzZQorCisjZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCBleHRlbmRfdGVzdFtzXSA/ICh4KSArIGV4dGVuZF9vZmZzZXRbc10gOiAoeCkpCisKK3N0YXRpYyBjb25zdCBpbnQgZXh0ZW5kX3Rlc3RbMTZdID0gICAvKiBlbnRyeSBuIGlzIDIqKihuLTEpICovCisgIHsgMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCisgICAgMHgwMTAwLCAweDAyMDAsIDB4MDQwMCwgMHgwODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwIH07CisKK3N0YXRpYyBjb25zdCBpbnQgZXh0ZW5kX29mZnNldFsxNl0gPSAvKiBlbnRyeSBuIGlzICgtMSA8PCBuKSArIDEgKi8KKyAgeyAwLCAoKC0xKTw8MSkgKyAxLCAoKC0xKTw8MikgKyAxLCAoKC0xKTw8MykgKyAxLCAoKC0xKTw8NCkgKyAxLAorICAgICgoLTEpPDw1KSArIDEsICgoLTEpPDw2KSArIDEsICgoLTEpPDw3KSArIDEsICgoLTEpPDw4KSArIDEsCisgICAgKCgtMSk8PDkpICsgMSwgKCgtMSk8PDEwKSArIDEsICgoLTEpPDwxMSkgKyAxLCAoKC0xKTw8MTIpICsgMSwKKyAgICAoKC0xKTw8MTMpICsgMSwgKCgtMSk8PDE0KSArIDEsICgoLTEpPDwxNSkgKyAxIH07CisKKyNlbmRpZiAvKiBBVk9JRF9UQUJMRVMgKi8KKworCisvKgogICogQ2hlY2sgZm9yIGEgcmVzdGFydCBtYXJrZXIgJiByZXN5bmNocm9uaXplIGRlY29kZXIuCiAgKiBSZXR1cm5zIEZBTFNFIGlmIG11c3Qgc3VzcGVuZC4KICAqLwpAQCAtNTMwLDU5ICs1NDgsMTMgQEAKICAgICAgIC8qIERlY29kZSBhIHNpbmdsZSBibG9jaydzIHdvcnRoIG9mIGNvZWZmaWNpZW50cyAqLwogCiAgICAgICAvKiBTZWN0aW9uIEYuMi4yLjE6IGRlY29kZSB0aGUgREMgY29lZmZpY2llbnQgZGlmZmVyZW5jZSAqLwotICAgICAgewkJLyogSFVGRlhfREVDT0RFICovCi0JcmVnaXN0ZXIgaW50IG5iLCBsb29rLCB0OwotCWlmIChiaXRzX2xlZnQgPCBIVUZGWF9MT09LQUhFQUQpIHsKLQkgIHJlZ2lzdGVyIGNvbnN0IEpPQ1RFVCAqIG5leHRfaW5wdXRfYnl0ZSA9IGJyX3N0YXRlLm5leHRfaW5wdXRfYnl0ZTsKLQkgIHJlZ2lzdGVyIHNpemVfdCAgICAgICAgIGJ5dGVzX2luX2J1ZmZlciA9IGJyX3N0YXRlLmJ5dGVzX2luX2J1ZmZlcjsKLQkgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKSB7Ci0JICAgIHdoaWxlIChiaXRzX2xlZnQgPCBNSU5fR0VUX0JJVFMpIHsKLQkgICAgICByZWdpc3RlciBpbnQgYzsKLQkgICAgICBpZiAoYnl0ZXNfaW5fYnVmZmVyID09IDAgfHwKLQkJICAoYyA9IEdFVEpPQ1RFVCgqbmV4dF9pbnB1dF9ieXRlKSkgPT0gMHhGRikgewotCQlnb3RvIGxhYmVsMTE7IH0KLQkgICAgICBieXRlc19pbl9idWZmZXItLTsgbmV4dF9pbnB1dF9ieXRlKys7Ci0JICAgICAgZ2V0X2J1ZmZlciA9IChnZXRfYnVmZmVyIDw8IDgpIHwgYzsKLQkgICAgICBiaXRzX2xlZnQgKz0gODsKLQkgICAgfQotCSAgICBicl9zdGF0ZS5uZXh0X2lucHV0X2J5dGUgPSBuZXh0X2lucHV0X2J5dGU7Ci0JICAgIGJyX3N0YXRlLmJ5dGVzX2luX2J1ZmZlciA9IGJ5dGVzX2luX2J1ZmZlcjsKLQkgIH0gZWxzZSB7Ci0JbGFiZWwxMToKLQkgICAgYnJfc3RhdGUubmV4dF9pbnB1dF9ieXRlID0gbmV4dF9pbnB1dF9ieXRlOwotCSAgICBicl9zdGF0ZS5ieXRlc19pbl9idWZmZXIgPSBieXRlc19pbl9idWZmZXI7Ci0JICAgIGlmICghIGpwZWdfZmlsbF9iaXRfYnVmZmVyKCZicl9zdGF0ZSxnZXRfYnVmZmVyLGJpdHNfbGVmdCwgMCkpIHsKLQkgICAgICByZXR1cm4gRkFMU0U7IH0KLQkgICAgZ2V0X2J1ZmZlciA9IGJyX3N0YXRlLmdldF9idWZmZXI7IGJpdHNfbGVmdCA9IGJyX3N0YXRlLmJpdHNfbGVmdDsKLQkgICAgaWYgKGJpdHNfbGVmdCA8IEhVRkZYX0xPT0tBSEVBRCkgewotCSAgICAgIG5iID0gMTsgZ290byBsYWJlbDE7Ci0JICAgIH0KLQkgIH0KLQl9Ci0JbG9vayA9IFBFRUtfQklUUyhIVUZGWF9MT09LQUhFQUQpOwotCWlmICgobmIgPSBkY3RibC0+bG9va3hfbmJpdHNbbG9va10pICE9IDApIHsKLQkgIHMgPSBkY3RibC0+bG9va3hfdmFsW2xvb2tdOwotCSAgaWYgKG5iIDw9IEhVRkZYX0xPT0tBSEVBRCkgewotCSAgICBEUk9QX0JJVFMobmIpOwotCSAgfSBlbHNlIHsKLQkgICAgRFJPUF9CSVRTKEhVRkZYX0xPT0tBSEVBRCk7Ci0JICAgIG5iIC09IEhVRkZYX0xPT0tBSEVBRDsKLQkgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgbmIsIHJldHVybiBGQUxTRSk7Ci0JICAgIHMgKz0gR0VUX0JJVFMobmIpOwotCSAgfQotCX0gZWxzZSB7Ci0JICBuYiA9IEhVRkZYX0xPT0tBSEVBRDsKLSAgICAgIGxhYmVsMToKLQkgIGlmICgocz1qcGVnX2h1ZmZfZGVjb2RlKCZicl9zdGF0ZSxnZXRfYnVmZmVyLGJpdHNfbGVmdCxkY3RibCxuYikpCi0JICAgICAgIDwgMCkgeyByZXR1cm4gRkFMU0U7IH0KLQkgIGdldF9idWZmZXIgPSBicl9zdGF0ZS5nZXRfYnVmZmVyOyBiaXRzX2xlZnQgPSBicl9zdGF0ZS5iaXRzX2xlZnQ7Ci0JICBpZiAocykgewotCSAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOwotCSAgICB0ID0gR0VUX0JJVFMocyk7Ci0JICAgIHMgPSBIVUZGX0VYVEVORCh0LCBzKTsKLQkgIH0KLQl9CisgICAgICBIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgZGN0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwxKTsKKyAgICAgIGlmIChzKSB7CisJQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKKwlyID0gR0VUX0JJVFMocyk7CisJcyA9IEhVRkZfRVhURU5EKHIsIHMpOwogICAgICAgfQorCiAgICAgICBpZiAoZW50cm9weS0+ZGNfbmVlZGVkW2Jsa25dKSB7CiAJLyogQ29udmVydCBEQyBkaWZmZXJlbmNlIHRvIGFjdHVhbCB2YWx1ZSwgdXBkYXRlIGxhc3RfZGNfdmFsICovCiAJaW50IGNpID0gY2luZm8tPk1DVV9tZW1iZXJzaGlwW2Jsa25dOwpAQCAtNTk3LDY1ICs1NjksMTYgQEAKIAkvKiBTZWN0aW9uIEYuMi4yLjI6IGRlY29kZSB0aGUgQUMgY29lZmZpY2llbnRzICovCiAJLyogU2luY2UgemVyb2VzIGFyZSBza2lwcGVkLCBvdXRwdXQgYXJlYSBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlaGFuZCAqLwogCWZvciAoayA9IDE7IGsgPCBEQ1RTSVpFMjsgaysrKSB7Ci0JICB7CS8qIEhVRkZYX0RFQ09ERSAqLwotCSAgICByZWdpc3RlciBpbnQgbmIsIGxvb2ssIHQ7Ci0JICAgIGlmIChiaXRzX2xlZnQgPCBIVUZGWF9MT09LQUhFQUQpIHsKLQkgICAgICByZWdpc3RlciBjb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGUKLQkJCQkJICAgICAgPSBicl9zdGF0ZS5uZXh0X2lucHV0X2J5dGU7Ci0JICAgICAgcmVnaXN0ZXIgc2l6ZV90IGJ5dGVzX2luX2J1ZmZlciA9IGJyX3N0YXRlLmJ5dGVzX2luX2J1ZmZlcjsKLQkgICAgICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gMCkgewotCQl3aGlsZSAoYml0c19sZWZ0IDwgTUlOX0dFVF9CSVRTKSB7Ci0JCSAgcmVnaXN0ZXIgaW50IGM7Ci0JCSAgaWYgKGJ5dGVzX2luX2J1ZmZlciA9PSAwIHx8Ci0JCSAgICAgIChjID0gR0VUSk9DVEVUKCpuZXh0X2lucHV0X2J5dGUpKSA9PSAweEZGKSB7Ci0JCSAgICBnb3RvIGxhYmVsMjE7IH0KLQkJICBieXRlc19pbl9idWZmZXItLTsgbmV4dF9pbnB1dF9ieXRlKys7Ci0JCSAgZ2V0X2J1ZmZlciA9IChnZXRfYnVmZmVyIDw8IDgpIHwgYzsKLQkJICBiaXRzX2xlZnQgKz0gODsKLQkJfQotCQlicl9zdGF0ZS5uZXh0X2lucHV0X2J5dGUgPSBuZXh0X2lucHV0X2J5dGU7Ci0JCWJyX3N0YXRlLmJ5dGVzX2luX2J1ZmZlciA9IGJ5dGVzX2luX2J1ZmZlcjsKLQkgICAgICB9IGVsc2UgewotCSAgICBsYWJlbDIxOgotCQlicl9zdGF0ZS5uZXh0X2lucHV0X2J5dGUgPSBuZXh0X2lucHV0X2J5dGU7Ci0JCWJyX3N0YXRlLmJ5dGVzX2luX2J1ZmZlciA9IGJ5dGVzX2luX2J1ZmZlcjsKLQkJaWYgKCEganBlZ19maWxsX2JpdF9idWZmZXIoJmJyX3N0YXRlLGdldF9idWZmZXIsYml0c19sZWZ0LDApKSB7Ci0JCSAgcmV0dXJuIEZBTFNFOyB9Ci0JCWdldF9idWZmZXIgPSBicl9zdGF0ZS5nZXRfYnVmZmVyOwotCQliaXRzX2xlZnQgID0gYnJfc3RhdGUuYml0c19sZWZ0OwotCQlpZiAoYml0c19sZWZ0IDwgSFVGRlhfTE9PS0FIRUFEKSB7Ci0JCSAgbmIgPSAxOyBnb3RvIGxhYmVsMjsKLQkJfQotCSAgICAgIH0KLQkgICAgfQotCSAgICBsb29rID0gUEVFS19CSVRTKEhVRkZYX0xPT0tBSEVBRCk7Ci0JICAgIGlmICgobmIgPSBhY3RibC0+bG9va3hfbmJpdHNbbG9va10pICE9IDApIHsKLQkgICAgICBzID0gYWN0YmwtPmxvb2t4X3ZhbFtsb29rXTsKLQkgICAgICByID0gYWN0YmwtPmxvb2t4X3N5bVtsb29rXSA+PiA0OwotCSAgICAgIGlmIChuYiA8PSBIVUZGWF9MT09LQUhFQUQpIHsKLQkJRFJPUF9CSVRTKG5iKTsKLQkgICAgICB9IGVsc2UgewotCQlEUk9QX0JJVFMoSFVGRlhfTE9PS0FIRUFEKTsKLQkJbmIgLT0gSFVGRlhfTE9PS0FIRUFEOwotCQlDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBuYiwgcmV0dXJuIEZBTFNFKTsKLQkJcyArPSBHRVRfQklUUyhuYik7Ci0JICAgICAgfQotCSAgICB9IGVsc2UgewotCSAgICAgIG5iID0gSFVGRlhfTE9PS0FIRUFEOwotCSAgbGFiZWwyOgotCSAgICAgIGlmICgocz1qcGVnX2h1ZmZfZGVjb2RlKCZicl9zdGF0ZSxnZXRfYnVmZmVyLGJpdHNfbGVmdCxhY3RibCxuYikpCi0JCSAgIDwgMCkgeyByZXR1cm4gRkFMU0U7IH0KLQkgICAgICBnZXRfYnVmZmVyID0gYnJfc3RhdGUuZ2V0X2J1ZmZlcjsgYml0c19sZWZ0ID0gYnJfc3RhdGUuYml0c19sZWZ0OwotCSAgICAgIHIgPSBzID4+IDQ7IHMgJj0gMTU7Ci0JICAgICAgaWYgKHMpIHsKLQkJQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKLQkJdCA9IEdFVF9CSVRTKHMpOwotCQlzID0gSFVGRl9FWFRFTkQodCwgcyk7Ci0JICAgICAgfQotCSAgICB9Ci0JICB9CisJICBIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgYWN0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwyKTsKKyAgICAgIAorCSAgciA9IHMgPj4gNDsKKwkgIHMgJj0gMTU7CisgICAgICAKIAkgIGlmIChzKSB7CiAJICAgIGsgKz0gcjsKKwkgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKKwkgICAgciA9IEdFVF9CSVRTKHMpOworCSAgICBzID0gSFVGRl9FWFRFTkQociwgcyk7CiAJICAgIC8qIE91dHB1dCBjb2VmZmljaWVudCBpbiBuYXR1cmFsIChkZXppZ3phZ2dlZCkgb3JkZXIuCiAJICAgICAqIE5vdGU6IHRoZSBleHRyYSBlbnRyaWVzIGluIGpwZWdfbmF0dXJhbF9vcmRlcltdIHdpbGwgc2F2ZSB1cwogCSAgICAgKiBpZiBrID49IERDVFNJWkUyLCB3aGljaCBjb3VsZCBoYXBwZW4gaWYgdGhlIGRhdGEgaXMgY29ycnVwdGVkLgpAQCAtNjczLDY0ICs1OTYsMTUgQEAKIAkvKiBTZWN0aW9uIEYuMi4yLjI6IGRlY29kZSB0aGUgQUMgY29lZmZpY2llbnRzICovCiAJLyogSW4gdGhpcyBwYXRoIHdlIGp1c3QgZGlzY2FyZCB0aGUgdmFsdWVzICovCiAJZm9yIChrID0gMTsgayA8IERDVFNJWkUyOyBrKyspIHsKLQkgIHsJLyogSFVGRlhfREVDT0RFICovCi0JICAgIHJlZ2lzdGVyIGludCBuYiwgbG9vazsKLQkgICAgaWYgKGJpdHNfbGVmdCA8IEhVRkZYX0xPT0tBSEVBRCkgewotCSAgICAgIHJlZ2lzdGVyIGNvbnN0IEpPQ1RFVCAqIG5leHRfaW5wdXRfYnl0ZQotCQkJCQkgICAgICA9IGJyX3N0YXRlLm5leHRfaW5wdXRfYnl0ZTsKLQkgICAgICByZWdpc3RlciBzaXplX3QgYnl0ZXNfaW5fYnVmZmVyID0gYnJfc3RhdGUuYnl0ZXNfaW5fYnVmZmVyOwotCSAgICAgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKSB7Ci0JCXdoaWxlIChiaXRzX2xlZnQgPCBNSU5fR0VUX0JJVFMpIHsKLQkJICByZWdpc3RlciBpbnQgYzsKLQkJICBpZiAoYnl0ZXNfaW5fYnVmZmVyID09IDAgfHwKLQkJICAgICAgKGMgPSBHRVRKT0NURVQoKm5leHRfaW5wdXRfYnl0ZSkpID09IDB4RkYpIHsKLQkJICAgIGdvdG8gbGFiZWwzMTsgfQotCQkgIGJ5dGVzX2luX2J1ZmZlci0tOyBuZXh0X2lucHV0X2J5dGUrKzsKLQkJICBnZXRfYnVmZmVyID0gKGdldF9idWZmZXIgPDwgOCkgfCBjOwotCQkgIGJpdHNfbGVmdCArPSA4OwotCQl9Ci0JCWJyX3N0YXRlLm5leHRfaW5wdXRfYnl0ZSA9IG5leHRfaW5wdXRfYnl0ZTsKLQkJYnJfc3RhdGUuYnl0ZXNfaW5fYnVmZmVyID0gYnl0ZXNfaW5fYnVmZmVyOwotCSAgICAgIH0gZWxzZSB7Ci0JICAgIGxhYmVsMzE6Ci0JCWJyX3N0YXRlLm5leHRfaW5wdXRfYnl0ZSA9IG5leHRfaW5wdXRfYnl0ZTsKLQkJYnJfc3RhdGUuYnl0ZXNfaW5fYnVmZmVyID0gYnl0ZXNfaW5fYnVmZmVyOwotCQlpZiAoISBqcGVnX2ZpbGxfYml0X2J1ZmZlcigmYnJfc3RhdGUsZ2V0X2J1ZmZlcixiaXRzX2xlZnQsMCkpIHsKLQkJICByZXR1cm4gRkFMU0U7IH0KLQkJZ2V0X2J1ZmZlciA9IGJyX3N0YXRlLmdldF9idWZmZXI7Ci0JCWJpdHNfbGVmdCAgPSBicl9zdGF0ZS5iaXRzX2xlZnQ7Ci0JCWlmIChiaXRzX2xlZnQgPCBIVUZGWF9MT09LQUhFQUQpIHsKLQkJICBuYiA9IDE7IGdvdG8gbGFiZWwzOwotCQl9Ci0JICAgICAgfQotCSAgICB9Ci0JICAgIGxvb2sgPSBQRUVLX0JJVFMoSFVGRlhfTE9PS0FIRUFEKTsKLQkgICAgaWYgKChuYiA9IGFjdGJsLT5sb29reF9uYml0c1tsb29rXSkgIT0gMCkgewotCSAgICAgIHMgPSBhY3RibC0+bG9va3hfc3ltW2xvb2tdOwotCSAgICAgIHIgPSBzID4+IDQ7IHMgJj0gMTU7Ci0JICAgICAgaWYgKG5iIDw9IEhVRkZYX0xPT0tBSEVBRCkgewotCQlEUk9QX0JJVFMobmIpOwotCSAgICAgIH0gZWxzZSB7Ci0JCURST1BfQklUUyhIVUZGWF9MT09LQUhFQUQpOwotCQluYiAtPSBIVUZGWF9MT09LQUhFQUQ7Ci0JCUNIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIG5iLCByZXR1cm4gRkFMU0UpOwotCQlEUk9QX0JJVFMobmIpOwotCSAgICAgIH0KLQkgICAgfSBlbHNlIHsKLQkgICAgICBuYiA9IEhVRkZYX0xPT0tBSEVBRDsKLQkgIGxhYmVsMzoKLQkgICAgICBpZiAoKHM9anBlZ19odWZmX2RlY29kZSgmYnJfc3RhdGUsZ2V0X2J1ZmZlcixiaXRzX2xlZnQsYWN0YmwsbmIpKQotCQkgICA8IDApIHsgcmV0dXJuIEZBTFNFOyB9Ci0JICAgICAgZ2V0X2J1ZmZlciA9IGJyX3N0YXRlLmdldF9idWZmZXI7IGJpdHNfbGVmdCA9IGJyX3N0YXRlLmJpdHNfbGVmdDsKLQkgICAgICByID0gcyA+PiA0OyBzICY9IDE1OwotCSAgICAgIGlmIChzKSB7Ci0JCUNIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7Ci0JCURST1BfQklUUyhzKTsKLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KKwkgIEhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCBhY3RibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDMpOworICAgICAgCisJICByID0gcyA+PiA0OworCSAgcyAmPSAxNTsKKyAgICAgIAogCSAgaWYgKHMpIHsKIAkgICAgayArPSByOworCSAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOworCSAgICBEUk9QX0JJVFMocyk7CiAJICB9IGVsc2UgewogCSAgICBpZiAociAhPSAxNSkKIAkgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL2pkaHVmZi5oIGIvamRodWZmLmgKaW5kZXggYjVlMTkzZS4uYWUxOWI2YyAxMDA2NDQKLS0tIGEvamRodWZmLmgKKysrIGIvamRodWZmLmgKQEAgLTUsMTMgKzUsNiBAQAogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KICAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KLSAqIFRoaXMgZmlsZSBoYXMgYmVlbiBtb2RpZmllZCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLgotICogTGFzdCBNb2RpZmllZCA6IE9jdG9iZXIgMzEsIDIwMDQKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKICAqIFRoaXMgZmlsZSBjb250YWlucyBkZWNsYXJhdGlvbnMgZm9yIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZyByb3V0aW5lcwogICogdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4gdGhlIHNlcXVlbnRpYWwgZGVjb2RlciAoamRodWZmLmMpIGFuZCB0aGUKICAqIHByb2dyZXNzaXZlIGRlY29kZXIgKGpkcGh1ZmYuYykuICBObyBvdGhlciBtb2R1bGVzIG5lZWQgdG8gc2VlIHRoZXNlLgpAQCAtMjgsNyArMjEsNyBAQAogCiAvKiBEZXJpdmVkIGRhdGEgY29uc3RydWN0ZWQgZm9yIGVhY2ggSHVmZm1hbiB0YWJsZSAqLwogCi0jZGVmaW5lIEhVRkZYX0xPT0tBSEVBRAk5CS8qICMgb2YgYml0cyBvZiBsb29rYWhlYWQgKi8KKyNkZWZpbmUgSFVGRl9MT09LQUhFQUQJOAkvKiAjIG9mIGJpdHMgb2YgbG9va2FoZWFkICovCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgLyogQmFzaWMgdGFibGVzOiAoZWxlbWVudCBbMF0gb2YgZWFjaCBhcnJheSBpcyB1bnVzZWQpICovCkBAIC00MywxNSArMzYsMTMgQEAKICAgLyogTGluayB0byBwdWJsaWMgSHVmZm1hbiB0YWJsZSAobmVlZGVkIG9ubHkgaW4ganBlZ19odWZmX2RlY29kZSkgKi8KICAgSkhVRkZfVEJMICpwdWI7CiAKLSAgLyogTG9va2FoZWFkIHRhYmxlczogaW5kZXhlZCBieSB0aGUgbmV4dCBIVUZGWF9MT09LQUhFQUQgYml0cyBvZgorICAvKiBMb29rYWhlYWQgdGFibGVzOiBpbmRleGVkIGJ5IHRoZSBuZXh0IEhVRkZfTE9PS0FIRUFEIGJpdHMgb2YKICAgICogdGhlIGlucHV0IGRhdGEgc3RyZWFtLiAgSWYgdGhlIG5leHQgSHVmZm1hbiBjb2RlIGlzIG5vIG1vcmUKLSAgICogdGhhbiBIVUZGWF9MT09LQUhFQUQtMSBiaXRzIGxvbmcsIHdlIGNhbiBvYnRhaW4gaXRzIGxlbmd0aCwKLSAgICogdGhlIGNvcnJlc3BvbmRpbmcgc3ltYm9sLCBhbmQgdGhlIGVuY29kZWQgY29lZmZpY2llbnQgdmFsdWUKLSAgICogZGlyZWN0bHkgZnJvbSB0aGVzZSB0YWJsZXMuCisgICAqIHRoYW4gSFVGRl9MT09LQUhFQUQgYml0cyBsb25nLCB3ZSBjYW4gb2J0YWluIGl0cyBsZW5ndGggYW5kCisgICAqIHRoZSBjb3JyZXNwb25kaW5nIHN5bWJvbCBkaXJlY3RseSBmcm9tIHRoZXNlIHRhYmxlcy4KICAgICovCi0gIFVJTlQ4IGxvb2t4X25iaXRzWzE8PEhVRkZYX0xPT0tBSEVBRF07ICAvKiAjIGJpdHMsIG9yIDAgaWYgdG9vIGxvbmcgKi8KLSAgSU5UMTYgbG9va3hfdmFsWzE8PEhVRkZYX0xPT0tBSEVBRF07ICAvKiBjb2VmZmljaWVudCB2YWx1ZSwgb3IgdW51c2VkICovCi0gIFVJTlQ4IGxvb2t4X3N5bVsxPDxIVUZGWF9MT09LQUhFQURdOyAgLyogc3ltYm9sLCBvciB1bnVzZWQgKi8KKyAgaW50IGxvb2tfbmJpdHNbMTw8SFVGRl9MT09LQUhFQURdOyAvKiAjIGJpdHMsIG9yIDAgaWYgdG9vIGxvbmcgKi8KKyAgVUlOVDggbG9va19zeW1bMTw8SFVGRl9MT09LQUhFQURdOyAvKiBzeW1ib2wsIG9yIHVudXNlZCAqLwogfSBkX2Rlcml2ZWRfdGJsOwogCiAvKiBFeHBhbmQgYSBIdWZmbWFuIHRhYmxlIGRlZmluaXRpb24gaW50byB0aGUgZGVyaXZlZCBmb3JtYXQgKi8KQEAgLTg4LDIxICs3OSw2IEBACiAgKiBiZWNhdXNlIG5vdCBhbGwgbWFjaGluZXMgbWVhc3VyZSBzaXplb2YgaW4gOC1iaXQgYnl0ZXMuCiAgKi8KIAotI2lmZGVmIFNMT1dfU0hJRlRfMzIKLSNkZWZpbmUgTUlOX0dFVF9CSVRTICAxNQkvKiBtaW5pbXVtIGFsbG93YWJsZSB2YWx1ZSAqLwotI2Vsc2UKLSNkZWZpbmUgTUlOX0dFVF9CSVRTICAoQklUX0JVRl9TSVpFLTcpCi0jZW5kaWYKLQotLyogT24gbW9zdCBtYWNoaW5lcyBNSU5fR0VUX0JJVFMgc2hvdWxkIGJlIDI1IHRvIGFsbG93IHRoZSBmdWxsIDMyLWJpdCB3aWR0aAotICogb2YgZ2V0X2J1ZmZlciB0byBiZSB1c2VkLiAgKE9uIG1hY2hpbmVzIHdpdGggd2lkZXIgd29yZHMsIGFuIGV2ZW4gbGFyZ2VyCi0gKiBidWZmZXIgY291bGQgYmUgdXNlZC4pICBIb3dldmVyLCBvbiBzb21lIG1hY2hpbmVzIDMyLWJpdCBzaGlmdHMgYXJlCi0gKiBxdWl0ZSBzbG93IGFuZCB0YWtlIHRpbWUgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgcGxhY2VzIHNoaWZ0ZWQuCi0gKiAoVGhpcyBpcyB0cnVlIHdpdGggbW9zdCBQQyBjb21waWxlcnMsIGZvciBpbnN0YW5jZS4pICBJbiB0aGlzIGNhc2UgaXQgbWF5Ci0gKiBiZSBhIHdpbiB0byBzZXQgTUlOX0dFVF9CSVRTIHRvIHRoZSBtaW5pbXVtIHZhbHVlIG9mIDE1LiAgVGhpcyByZWR1Y2VzIHRoZQotICogYXZlcmFnZSBzaGlmdCBkaXN0YW5jZSBhdCB0aGUgY29zdCBvZiBtb3JlIGNhbGxzIHRvIGpwZWdfZmlsbF9iaXRfYnVmZmVyLgotICovCi0KIHR5cGVkZWYgc3RydWN0IHsJCS8qIEJpdHJlYWRpbmcgc3RhdGUgc2F2ZWQgYWNyb3NzIE1DVXMgKi8KICAgYml0X2J1Zl90eXBlIGdldF9idWZmZXI7CS8qIGN1cnJlbnQgYml0LWV4dHJhY3Rpb24gYnVmZmVyICovCiAgIGludCBiaXRzX2xlZnQ7CQkvKiAjIG9mIHVudXNlZCBiaXRzIGluIGl0ICovCkBAIC0xMzMsNyArMTA5LDcgQEAKIAlicl9zdGF0ZS5uZXh0X2lucHV0X2J5dGUgPSBjaW5mb3AtPnNyYy0+bmV4dF9pbnB1dF9ieXRlOyBcCiAJYnJfc3RhdGUuYnl0ZXNfaW5fYnVmZmVyID0gY2luZm9wLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcjsgXAogCWdldF9idWZmZXIgPSBwZXJtc3RhdGUuZ2V0X2J1ZmZlcjsgXAotCWJpdHNfbGVmdCA9IHBlcm1zdGF0ZS5iaXRzX2xlZnQKKwliaXRzX2xlZnQgPSBwZXJtc3RhdGUuYml0c19sZWZ0OwogCiAjZGVmaW5lIEJJVFJFQURfU0FWRV9TVEFURShjaW5mb3AscGVybXN0YXRlKSAgXAogCWNpbmZvcC0+c3JjLT5uZXh0X2lucHV0X2J5dGUgPSBicl9zdGF0ZS5uZXh0X2lucHV0X2J5dGU7IFwKQEAgLTE3OSwxNCArMTU1LDQ3IEBACiAJSlBQKChiaXRyZWFkX3dvcmtpbmdfc3RhdGUgKiBzdGF0ZSwgcmVnaXN0ZXIgYml0X2J1Zl90eXBlIGdldF9idWZmZXIsCiAJICAgICByZWdpc3RlciBpbnQgYml0c19sZWZ0LCBpbnQgbmJpdHMpKTsKIAorCisvKgorICogQ29kZSBmb3IgZXh0cmFjdGluZyBuZXh0IEh1ZmZtYW4tY29kZWQgc3ltYm9sIGZyb20gaW5wdXQgYml0IHN0cmVhbS4KKyAqIEFnYWluLCB0aGlzIGlzIHRpbWUtY3JpdGljYWwgYW5kIHdlIG1ha2UgdGhlIG1haW4gcGF0aHMgYmUgbWFjcm9zLgorICoKKyAqIFdlIHVzZSBhIGxvb2thaGVhZCB0YWJsZSB0byBwcm9jZXNzIGNvZGVzIG9mIHVwIHRvIEhVRkZfTE9PS0FIRUFEIGJpdHMKKyAqIHdpdGhvdXQgbG9vcGluZy4gIFVzdWFsbHksIG1vcmUgdGhhbiA5NSUgb2YgdGhlIEh1ZmZtYW4gY29kZXMgd2lsbCBiZSA4CisgKiBvciBmZXdlciBiaXRzIGxvbmcuICBUaGUgZmV3IG92ZXJsZW5ndGggY29kZXMgYXJlIGhhbmRsZWQgd2l0aCBhIGxvb3AsCisgKiB3aGljaCBuZWVkIG5vdCBiZSBpbmxpbmUgY29kZS4KKyAqCisgKiBOb3RlcyBhYm91dCB0aGUgSFVGRl9ERUNPREUgbWFjcm86CisgKiAxLiBOZWFyIHRoZSBlbmQgb2YgdGhlIGRhdGEgc2VnbWVudCwgd2UgbWF5IGZhaWwgdG8gZ2V0IGVub3VnaCBiaXRzCisgKiAgICBmb3IgYSBsb29rYWhlYWQuICBJbiB0aGF0IGNhc2UsIHdlIGRvIGl0IHRoZSBoYXJkIHdheS4KKyAqIDIuIElmIHRoZSBsb29rYWhlYWQgdGFibGUgY29udGFpbnMgbm8gZW50cnksIHRoZSBuZXh0IGNvZGUgbXVzdCBiZQorICogICAgbW9yZSB0aGFuIEhVRkZfTE9PS0FIRUFEIGJpdHMgbG9uZy4KKyAqIDMuIGpwZWdfaHVmZl9kZWNvZGUgcmV0dXJucyAtMSBpZiBmb3JjZWQgdG8gc3VzcGVuZC4KKyAqLworCisjZGVmaW5lIEhVRkZfREVDT0RFKHJlc3VsdCxzdGF0ZSxodGJsLGZhaWxhY3Rpb24sc2xvd2xhYmVsKSBcCit7IHJlZ2lzdGVyIGludCBuYiwgbG9vazsgXAorICBpZiAoYml0c19sZWZ0IDwgSFVGRl9MT09LQUhFQUQpIHsgXAorICAgIGlmICghIGpwZWdfZmlsbF9iaXRfYnVmZmVyKCZzdGF0ZSxnZXRfYnVmZmVyLGJpdHNfbGVmdCwgMCkpIHtmYWlsYWN0aW9uO30gXAorICAgIGdldF9idWZmZXIgPSBzdGF0ZS5nZXRfYnVmZmVyOyBiaXRzX2xlZnQgPSBzdGF0ZS5iaXRzX2xlZnQ7IFwKKyAgICBpZiAoYml0c19sZWZ0IDwgSFVGRl9MT09LQUhFQUQpIHsgXAorICAgICAgbmIgPSAxOyBnb3RvIHNsb3dsYWJlbDsgXAorICAgIH0gXAorICB9IFwKKyAgbG9vayA9IFBFRUtfQklUUyhIVUZGX0xPT0tBSEVBRCk7IFwKKyAgaWYgKChuYiA9IGh0YmwtPmxvb2tfbmJpdHNbbG9va10pICE9IDApIHsgXAorICAgIERST1BfQklUUyhuYik7IFwKKyAgICByZXN1bHQgPSBodGJsLT5sb29rX3N5bVtsb29rXTsgXAorICB9IGVsc2UgeyBcCisgICAgbmIgPSBIVUZGX0xPT0tBSEVBRCsxOyBcCitzbG93bGFiZWw6IFwKKyAgICBpZiAoKHJlc3VsdD1qcGVnX2h1ZmZfZGVjb2RlKCZzdGF0ZSxnZXRfYnVmZmVyLGJpdHNfbGVmdCxodGJsLG5iKSkgPCAwKSBcCisJeyBmYWlsYWN0aW9uOyB9IFwKKyAgICBnZXRfYnVmZmVyID0gc3RhdGUuZ2V0X2J1ZmZlcjsgYml0c19sZWZ0ID0gc3RhdGUuYml0c19sZWZ0OyBcCisgIH0gXAorfQorCiAvKiBPdXQtb2YtbGluZSBjYXNlIGZvciBIdWZmbWFuIGNvZGUgZmV0Y2hpbmcgKi8KIEVYVEVSTihpbnQpIGpwZWdfaHVmZl9kZWNvZGUKIAlKUFAoKGJpdHJlYWRfd29ya2luZ19zdGF0ZSAqIHN0YXRlLCByZWdpc3RlciBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlciwKIAkgICAgIHJlZ2lzdGVyIGludCBiaXRzX2xlZnQsIGRfZGVyaXZlZF90YmwgKiBodGJsLCBpbnQgbWluX2JpdHMpKTsKLQotCi0vKgotICogRmlndXJlIEYuMTI6IGV4dGVuZCBzaWduIGJpdC4KLSAqLwotCi0jZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCAoMTw8KChzKS0xKSkgPyAoeCkgKyAoKCgtMSk8PChzKSkgKyAxKSA6ICh4KSkKZGlmZiAtLWdpdCBhL2pkbWVyZ2UuYyBiL2pkbWVyZ2UuYwppbmRleCBmNDQwZDQwLi43NzQyOTQxIDEwMDY0NAotLS0gYS9qZG1lcmdlLmMKKysrIGIvamRtZXJnZS5jCkBAIC0yLDE2ICsyLDEwIEBACiAgKiBqZG1lcmdlLmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBDb3B5cmlnaHQgMjAwOSBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgogICoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgotICogVGhpcyBmaWxlIGhhcyBiZWVuIG1vZGlmaWVkIGZvciBTSU1EIGV4dGVuc2lvbi4KLSAqIExhc3QgTW9kaWZpZWQgOiBKYW51YXJ5IDUsIDIwMDYKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKICAqIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZvciBtZXJnZWQgdXBzYW1wbGluZy9jb2xvciBjb252ZXJzaW9uLgogICoKICAqIFRoaXMgZmlsZSBjb21iaW5lcyBmdW5jdGlvbnMgZnJvbSBqZHNhbXBsZS5jIGFuZCBqZGNvbG9yLmM7CkBAIC00Miw3ICszNiw3IEBACiAjZGVmaW5lIEpQRUdfSU5URVJOQUxTCiAjaW5jbHVkZSAiamluY2x1ZGUuaCIKICNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamNvbHNhbXAuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zICovCisjaW5jbHVkZSAianNpbWQuaCIKIAogI2lmZGVmIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVECiAKQEAgLTIyNiwxNyArMjIwLDYgQEAKICAqLwogCiAKLSNpZiBSR0JfUElYRUxTSVpFID09IDQKLS8qIG9mZnNldCBvZiBmaWxsZXIgYnl0ZSAqLwotI2RlZmluZSBSR0JfRklMTEVSICAoNiAtIChSR0JfUkVEKSAtIChSR0JfR1JFRU4pIC0gKFJHQl9CTFVFKSkKLS8qIGJ5dGUgcGF0dGVybiB0byBmaWxsIHdpdGggKi8KLSNpZmRlZiBSR0JYX0ZJTExFUl8wWEZGCi0jZGVmaW5lIFJHQl9GSUxMRVJfQllURSAweEZGCi0jZWxzZQotI2RlZmluZSBSR0JfRklMTEVSX0JZVEUgMHgwMAotI2VuZGlmCi0jZW5kaWYgLyogUkdCX1BJWEVMU0laRSA9PSA0ICovCi0KIC8qCiAgKiBVcHNhbXBsZSBhbmQgY29sb3IgY29udmVydCBmb3IgdGhlIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDE6MSB2ZXJ0aWNhbC4KICAqLwpAQCAtMjc3LDE3ICsyNjAsMTEgQEAKICAgICBvdXRwdHJbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKICAgICBvdXRwdHJbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwogICAgIG91dHB0cltSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSNpZiBSR0JfUElYRUxTSVpFID09IDQKLSAgICBvdXRwdHJbUkdCX0ZJTExFUl0gPSBSR0JfRklMTEVSX0JZVEU7Ci0jZW5kaWYKICAgICBvdXRwdHIgKz0gUkdCX1BJWEVMU0laRTsKICAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKICAgICBvdXRwdHJbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKICAgICBvdXRwdHJbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwogICAgIG91dHB0cltSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSNpZiBSR0JfUElYRUxTSVpFID09IDQKLSAgICBvdXRwdHJbUkdCX0ZJTExFUl0gPSBSR0JfRklMTEVSX0JZVEU7Ci0jZW5kaWYKICAgICBvdXRwdHIgKz0gUkdCX1BJWEVMU0laRTsKICAgfQogICAvKiBJZiBpbWFnZSB3aWR0aCBpcyBvZGQsIGRvIHRoZSBsYXN0IG91dHB1dCBjb2x1bW4gc2VwYXJhdGVseSAqLwpAQCAtMzAxLDkgKzI3OCw2IEBACiAgICAgb3V0cHRyW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgY3JlZF07CiAgICAgb3V0cHRyW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKICAgICBvdXRwdHJbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0jaWYgUkdCX1BJWEVMU0laRSA9PSA0Ci0gICAgb3V0cHRyW1JHQl9GSUxMRVJdID0gUkdCX0ZJTExFUl9CWVRFOwotI2VuZGlmCiAgIH0KIH0KIApAQCAtMzUwLDMzICszMjQsMjEgQEAKICAgICBvdXRwdHIwW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgY3JlZF07CiAgICAgb3V0cHRyMFtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CiAgICAgb3V0cHRyMFtSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSNpZiBSR0JfUElYRUxTSVpFID09IDQKLSAgICBvdXRwdHIwW1JHQl9GSUxMRVJdID0gUkdCX0ZJTExFUl9CWVRFOwotI2VuZGlmCiAgICAgb3V0cHRyMCArPSBSR0JfUElYRUxTSVpFOwogICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCsrKTsKICAgICBvdXRwdHIwW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgY3JlZF07CiAgICAgb3V0cHRyMFtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CiAgICAgb3V0cHRyMFtSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSNpZiBSR0JfUElYRUxTSVpFID09IDQKLSAgICBvdXRwdHIwW1JHQl9GSUxMRVJdID0gUkdCX0ZJTExFUl9CWVRFOwotI2VuZGlmCiAgICAgb3V0cHRyMCArPSBSR0JfUElYRUxTSVpFOwogICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSsrKTsKICAgICBvdXRwdHIxW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgY3JlZF07CiAgICAgb3V0cHRyMVtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CiAgICAgb3V0cHRyMVtSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSNpZiBSR0JfUElYRUxTSVpFID09IDQKLSAgICBvdXRwdHIxW1JHQl9GSUxMRVJdID0gUkdCX0ZJTExFUl9CWVRFOwotI2VuZGlmCiAgICAgb3V0cHRyMSArPSBSR0JfUElYRUxTSVpFOwogICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSsrKTsKICAgICBvdXRwdHIxW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgY3JlZF07CiAgICAgb3V0cHRyMVtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CiAgICAgb3V0cHRyMVtSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSNpZiBSR0JfUElYRUxTSVpFID09IDQKLSAgICBvdXRwdHIxW1JHQl9GSUxMRVJdID0gUkdCX0ZJTExFUl9CWVRFOwotI2VuZGlmCiAgICAgb3V0cHRyMSArPSBSR0JfUElYRUxTSVpFOwogICB9CiAgIC8qIElmIGltYWdlIHdpZHRoIGlzIG9kZCwgZG8gdGhlIGxhc3Qgb3V0cHV0IGNvbHVtbiBzZXBhcmF0ZWx5ICovCkBAIC0zOTAsMTYgKzM1MiwxMCBAQAogICAgIG91dHB0cjBbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKICAgICBvdXRwdHIwW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKICAgICBvdXRwdHIwW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotI2lmIFJHQl9QSVhFTFNJWkUgPT0gNAotICAgIG91dHB0cjBbUkdCX0ZJTExFUl0gPSBSR0JfRklMTEVSX0JZVEU7Ci0jZW5kaWYKICAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDEpOwogICAgIG91dHB0cjFbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKICAgICBvdXRwdHIxW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKICAgICBvdXRwdHIxW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotI2lmIFJHQl9QSVhFTFNJWkUgPT0gNAotICAgIG91dHB0cjFbUkdCX0ZJTExFUl0gPSBSR0JfRklMTEVSX0JZVEU7Ci0jZW5kaWYKICAgfQogfQogCkBAIC00MTYsNyArMzcyLDYgQEAKIGppbml0X21lcmdlZF91cHNhbXBsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCiB7CiAgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZTsKLSAgdW5zaWduZWQgaW50IHNpbWQgPSBqcGVnX3NpbWRfc3VwcG9ydCgoal9jb21tb25fcHRyKSBjaW5mbyk7CiAKICAgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKQogICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCkBAIC00MjksNzMgKzM4NCwyNSBAQAogCiAgIGlmIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgPT0gMikgewogICAgIHVwc2FtcGxlLT5wdWIudXBzYW1wbGUgPSBtZXJnZWRfMnZfdXBzYW1wbGU7Ci0jaWYgUkdCX1BJWEVMU0laRSA9PSAzIHx8IFJHQl9QSVhFTFNJWkUgPT0gNAotI2lmZGVmIEpETUVSR0VfU1NFMl9TVVBQT1JURUQKLSAgICBpZiAoc2ltZCAmIEpTSU1EX1NTRTIgJiYKLSAgICAgICAgSVNfQ09OU1RfQUxJR05FRF8xNihqY29uc3RfbWVyZ2VkX3Vwc2FtcGxlX3NzZTIpKSB7Ci0gICAgICB1cHNhbXBsZS0+dXBtZXRob2QgPSBqcGVnX2gydjJfbWVyZ2VkX3Vwc2FtcGxlX3NzZTI7Ci0gICAgfSBlbHNlCi0jZW5kaWYKLSNpZmRlZiBKRE1FUkdFX01NWF9TVVBQT1JURUQKLSAgICBpZiAoc2ltZCAmIEpTSU1EX01NWCkgewotICAgICAgdXBzYW1wbGUtPnVwbWV0aG9kID0ganBlZ19oMnYyX21lcmdlZF91cHNhbXBsZV9tbXg7Ci0gICAgfSBlbHNlCi0jZW5kaWYKLSNlbmRpZiAvKiBSR0JfUElYRUxTSVpFID09IDMgfHwgUkdCX1BJWEVMU0laRSA9PSA0ICovCi0gICAgeworICAgIGlmIChqc2ltZF9jYW5faDJ2Ml9tZXJnZWRfdXBzYW1wbGUoKSkKKyAgICAgIHVwc2FtcGxlLT51cG1ldGhvZCA9IGpzaW1kX2gydjJfbWVyZ2VkX3Vwc2FtcGxlOworICAgIGVsc2UKICAgICAgIHVwc2FtcGxlLT51cG1ldGhvZCA9IGgydjJfbWVyZ2VkX3Vwc2FtcGxlOwotICAgICAgYnVpbGRfeWNjX3JnYl90YWJsZShjaW5mbyk7Ci0gICAgfQogICAgIC8qIEFsbG9jYXRlIGEgc3BhcmUgcm93IGJ1ZmZlciAqLwogICAgIHVwc2FtcGxlLT5zcGFyZV9yb3cgPSAoSlNBTVBST1cpCiAgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAogCQkoc2l6ZV90KSAodXBzYW1wbGUtPm91dF9yb3dfd2lkdGggKiBTSVpFT0YoSlNBTVBMRSkpKTsKICAgfSBlbHNlIHsKICAgICB1cHNhbXBsZS0+cHViLnVwc2FtcGxlID0gbWVyZ2VkXzF2X3Vwc2FtcGxlOwotI2lmIFJHQl9QSVhFTFNJWkUgPT0gMyB8fCBSR0JfUElYRUxTSVpFID09IDQKLSNpZmRlZiBKRE1FUkdFX1NTRTJfU1VQUE9SVEVECi0gICAgaWYgKHNpbWQgJiBKU0lNRF9TU0UyICYmCi0gICAgICAgIElTX0NPTlNUX0FMSUdORURfMTYoamNvbnN0X21lcmdlZF91cHNhbXBsZV9zc2UyKSkgewotICAgICAgdXBzYW1wbGUtPnVwbWV0aG9kID0ganBlZ19oMnYxX21lcmdlZF91cHNhbXBsZV9zc2UyOwotICAgIH0gZWxzZQotI2VuZGlmCi0jaWZkZWYgSkRNRVJHRV9NTVhfU1VQUE9SVEVECi0gICAgaWYgKHNpbWQgJiBKU0lNRF9NTVgpIHsKLSAgICAgIHVwc2FtcGxlLT51cG1ldGhvZCA9IGpwZWdfaDJ2MV9tZXJnZWRfdXBzYW1wbGVfbW14OwotICAgIH0gZWxzZQotI2VuZGlmCi0jZW5kaWYgLyogUkdCX1BJWEVMU0laRSA9PSAzIHx8IFJHQl9QSVhFTFNJWkUgPT0gNCAqLwotICAgIHsKKyAgICBpZiAoanNpbWRfY2FuX2gydjFfbWVyZ2VkX3Vwc2FtcGxlKCkpCisgICAgICB1cHNhbXBsZS0+dXBtZXRob2QgPSBqc2ltZF9oMnYxX21lcmdlZF91cHNhbXBsZTsKKyAgICBlbHNlCiAgICAgICB1cHNhbXBsZS0+dXBtZXRob2QgPSBoMnYxX21lcmdlZF91cHNhbXBsZTsKLSAgICAgIGJ1aWxkX3ljY19yZ2JfdGFibGUoY2luZm8pOwotICAgIH0KICAgICAvKiBObyBzcGFyZSByb3cgbmVlZGVkICovCiAgICAgdXBzYW1wbGUtPnNwYXJlX3JvdyA9IE5VTEw7CiAgIH0KKworICBidWlsZF95Y2NfcmdiX3RhYmxlKGNpbmZvKTsKIH0KIAotCi0jaWZuZGVmIEpTSU1EX01PREVJTkZPX05PVF9TVVBQT1JURUQKLQotR0xPQkFMKHVuc2lnbmVkIGludCkKLWpwZWdfc2ltZF9tZXJnZWRfdXBzYW1wbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICB1bnNpZ25lZCBpbnQgc2ltZCA9IGpwZWdfc2ltZF9zdXBwb3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLQotI2lmIFJHQl9QSVhFTFNJWkUgPT0gMyB8fCBSR0JfUElYRUxTSVpFID09IDQKLSNpZmRlZiBKRE1FUkdFX1NTRTJfU1VQUE9SVEVECi0gIGlmIChzaW1kICYgSlNJTURfU1NFMiAmJgotICAgICAgSVNfQ09OU1RfQUxJR05FRF8xNihqY29uc3RfbWVyZ2VkX3Vwc2FtcGxlX3NzZTIpKQotICAgIHJldHVybiBKU0lNRF9TU0UyOwotI2VuZGlmCi0jaWZkZWYgSkRNRVJHRV9NTVhfU1VQUE9SVEVECi0gIGlmIChzaW1kICYgSlNJTURfTU1YKQotICAgIHJldHVybiBKU0lNRF9NTVg7Ci0jZW5kaWYKLSNlbmRpZiAvKiBSR0JfUElYRUxTSVpFID09IDMgfHwgUkdCX1BJWEVMU0laRSA9PSA0ICovCi0KLSAgcmV0dXJuIEpTSU1EX05PTkU7Ci19Ci0KLSNlbmRpZiAvKiAhSlNJTURfTU9ERUlORk9fTk9UX1NVUFBPUlRFRCAqLwogI2VuZGlmIC8qIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qZG1lcm1teC5hc20gYi9qZG1lcm1teC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjODg1MTUuLjAwMDAwMDAKLS0tIGEvamRtZXJtbXguYXNtCisrKyAvZGV2L251bGwKQEAgLTEsOTgxICswLDAgQEAKLTsKLTsgamRtZXJtbXguYXNtIC0gbWVyZ2VkIHVwc2FtcGxpbmcvY29sb3IgY29udmVyc2lvbiAoTU1YKQotOwotOyB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLTsgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KLTsgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGpzaW1kZXh0LmluYwotOwotOyBUaGlzIGZpbGUgc2hvdWxkIGJlIGFzc2VtYmxlZCB3aXRoIE5BU00gKE5ldHdpZGUgQXNzZW1ibGVyKSwKLTsgY2FuICpub3QqIGJlIGFzc2VtYmxlZCB3aXRoIE1pY3Jvc29mdCdzIE1BU00gb3IgYW55IGNvbXBhdGlibGUKLTsgYXNzZW1ibGVyIChpbmNsdWRpbmcgQm9ybGFuZCdzIFR1cmJvIEFzc2VtYmxlcikuCi07IE5BU00gaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL25hc20uc291cmNlZm9yZ2UubmV0LyBvcgotOyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD02MjA4Ci07Ci07IExhc3QgTW9kaWZpZWQgOiBGZWJydWFyeSA0LCAyMDA2Ci07Ci07IFtUQUI4XQotCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotJWluY2x1ZGUgImpjb2xzYW1wLmluYyIKLQotJWlmIFJHQl9QSVhFTFNJWkUgPT0gMyB8fCBSR0JfUElYRUxTSVpFID09IDQKLSVpZmRlZiBVUFNBTVBMRV9NRVJHSU5HX1NVUFBPUlRFRAotJWlmZGVmIEpETUVSR0VfTU1YX1NVUFBPUlRFRAotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSVkZWZpbmUgU0NBTEVCSVRTCTE2Ci0KLUZfMF8zNDQJZXF1CSAyMjU1NAkJCTsgRklYKDAuMzQ0MTQpCi1GXzBfNzE0CWVxdQkgNDY4MDIJCQk7IEZJWCgwLjcxNDE0KQotRl8xXzQwMgllcXUJIDkxODgxCQkJOyBGSVgoMS40MDIwMCkKLUZfMV83NzIJZXF1CTExNjEzMAkJCTsgRklYKDEuNzcyMDApCi1GXzBfNDAyCWVxdQkoRl8xXzQwMiAtIDY1NTM2KQk7IEZJWCgxLjQwMjAwKSAtIEZJWCgxKQotRl8wXzI4NQllcXUJKCA2NTUzNiAtIEZfMF83MTQpCTsgRklYKDEpIC0gRklYKDAuNzE0MTQpCi1GXzBfMjI4CWVxdQkoMTMxMDcyIC0gRl8xXzc3MikJOyBGSVgoMikgLSBGSVgoMS43NzIwMCkKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX0NPTlNUCi0KLQlhbGlnbnoJMTYKLQlnbG9iYWwJRVhUTihqY29uc3RfbWVyZ2VkX3Vwc2FtcGxlX21teCkKLQotRVhUTihqY29uc3RfbWVyZ2VkX3Vwc2FtcGxlX21teCk6Ci0KLVBXX0YwNDAyCXRpbWVzIDQgZHcgIEZfMF80MDIKLVBXX01GMDIyOAl0aW1lcyA0IGR3IC1GXzBfMjI4Ci1QV19NRjAzNDRfRjAyODUJdGltZXMgMiBkdyAtRl8wXzM0NCwgRl8wXzI4NQotUFdfT05FCQl0aW1lcyA0IGR3ICAxCi1QRF9PTkVIQUxGCXRpbWVzIDIgZGQgIDEgPDwgKFNDQUxFQklUUy0xKQotCi0JYWxpZ256CTE2Ci0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19URVhUCi0JQklUUwkzMgotOwotOyBVcHNhbXBsZSBhbmQgY29sb3IgY29udmVydCBmb3IgdGhlIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDE6MSB2ZXJ0aWNhbC4KLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfaDJ2MV9tZXJnZWRfdXBzYW1wbGVfbW14IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1Zik7Ci07Ci0KLSVkZWZpbmUgY2luZm8oYikJCShiKSs4CQk7IGpfZGVjb21wcmVzc19wdHIgY2luZm8KLSVkZWZpbmUgaW5wdXRfYnVmKGIpCQkoYikrMTIJCTsgSlNBTVBJTUFHRSBpbnB1dF9idWYKLSVkZWZpbmUgaW5fcm93X2dyb3VwX2N0cihiKQkoYikrMTYJCTsgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyCi0lZGVmaW5lIG91dHB1dF9idWYoYikJCShiKSsyMAkJOyBKU0FNUEFSUkFZIG91dHB1dF9idWYKLQotJWRlZmluZSBvcmlnaW5hbF9lYnAJZWJwKzAKLSVkZWZpbmUgd2soaSkJCWVicC0oV0tfTlVNLShpKSkqU0laRU9GX01NV09SRAk7IG1td29yZCB3a1tXS19OVU1dCi0lZGVmaW5lIFdLX05VTQkJMwotJWRlZmluZSBnb3RwdHIJCXdrKDApLVNJWkVPRl9QT0lOVEVSCTsgdm9pZCAqIGdvdHB0cgotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2gydjFfbWVyZ2VkX3Vwc2FtcGxlX21teCkKLQotRVhUTihqcGVnX2gydjFfbWVyZ2VkX3Vwc2FtcGxlX21teCk6Ci0JcHVzaAllYnAKLQltb3YJZWF4LGVzcAkJCQk7IGVheCA9IG9yaWdpbmFsIGVicAotCXN1Ygllc3AsIGJ5dGUgNAotCWFuZAllc3AsIGJ5dGUgKC1TSVpFT0ZfTU1XT1JEKQk7IGFsaWduIHRvIDY0IGJpdHMKLQltb3YJW2VzcF0sZWF4Ci0JbW92CWVicCxlc3AJCQkJOyBlYnAgPSBhbGlnbmVkIGVicAotCWxlYQllc3AsIFt3aygwKV0KLQlwdXNocGljCWVheAkJOyBtYWtlIGEgcm9vbSBmb3IgR09UIGFkZHJlc3MKLQlwdXNoCWVieAotOwlwdXNoCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcHVzaAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcHVzaAllc2kKLQlwdXNoCWVkaQotCi0JZ2V0X0dPVAllYngJCQk7IGdldCBHT1QgYWRkcmVzcwotCW1vdnBpYwlQT0lOVEVSIFtnb3RwdHJdLCBlYngJOyBzYXZlIEdPVCBhZGRyZXNzCi0KLQltb3YJZWN4LCBQT0lOVEVSIFtjaW5mbyhlYXgpXQotCW1vdgllY3gsIEpESU1FTlNJT04gW2pkc3RydWN0X291dHB1dF93aWR0aChlY3gpXQk7IGNvbAotCXRlc3QJZWN4LGVjeAotCWp6CW5lYXIgLnJldHVybgotCi0JcHVzaAllY3gKLQotCW1vdgllZGksIEpTQU1QSU1BR0UgW2lucHV0X2J1ZihlYXgpXQotCW1vdgllY3gsIEpESU1FTlNJT04gW2luX3Jvd19ncm91cF9jdHIoZWF4KV0KLQltb3YJZXNpLCBKU0FNUEFSUkFZIFtlZGkrMCpTSVpFT0ZfSlNBTVBBUlJBWV0KLQltb3YJZWJ4LCBKU0FNUEFSUkFZIFtlZGkrMSpTSVpFT0ZfSlNBTVBBUlJBWV0KLQltb3YJZWR4LCBKU0FNUEFSUkFZIFtlZGkrMipTSVpFT0ZfSlNBTVBBUlJBWV0KLQltb3YJZWRpLCBKU0FNUEFSUkFZIFtvdXRwdXRfYnVmKGVheCldCi0JbW92CWVzaSwgSlNBTVBST1cgW2VzaStlY3gqU0laRU9GX0pTQU1QUk9XXQkJOyBpbnB0cjAKLQltb3YJZWJ4LCBKU0FNUFJPVyBbZWJ4K2VjeCpTSVpFT0ZfSlNBTVBST1ddCQk7IGlucHRyMQotCW1vdgllZHgsIEpTQU1QUk9XIFtlZHgrZWN4KlNJWkVPRl9KU0FNUFJPV10JCTsgaW5wdHIyCi0JbW92CWVkaSwgSlNBTVBST1cgW2VkaV0JCQkJOyBvdXRwdHIKLQotCXBvcAllY3gJCQk7IGNvbAotCi0JYWxpZ254CTE2LDcKLS5jb2x1bW5sb29wOgotCW1vdnBpYwllYXgsIFBPSU5URVIgW2dvdHB0cl0JOyBsb2FkIEdPVCBhZGRyZXNzIChlYXgpCi0KLQltb3ZxICAgICAgbW02LCBNTVdPUkQgW2VieF0JOyBtbTY9Q2IoMDEyMzQ1NjcpCi0JbW92cSAgICAgIG1tNywgTU1XT1JEIFtlZHhdCTsgbW03PUNyKDAxMjM0NTY3KQotCi0JcHhvciAgICAgIG1tMSxtbTEJCTsgbW0xPShhbGwgMCdzKQotCXBjbXBlcXcgICBtbTMsbW0zCi0JcHNsbHcgICAgIG1tMyw3CQkJOyBtbTM9ezB4RkY4MCAweEZGODAgMHhGRjgwIDB4RkY4MH0KLQotCW1vdnEgICAgICBtbTQsbW02Ci0JcHVucGNraGJ3IG1tNixtbTEJCTsgbW02PUNiKDQ1NjcpPUNiSAotCXB1bnBja2xidyBtbTQsbW0xCQk7IG1tND1DYigwMTIzKT1DYkwKLQltb3ZxICAgICAgbW0wLG1tNwotCXB1bnBja2hidyBtbTcsbW0xCQk7IG1tNz1Dcig0NTY3KT1DckgKLQlwdW5wY2tsYncgbW0wLG1tMQkJOyBtbTA9Q3IoMDEyMyk9Q3JMCi0KLQlwYWRkdyAgICAgbW02LG1tMwotCXBhZGR3ICAgICBtbTQsbW0zCi0JcGFkZHcgICAgIG1tNyxtbTMKLQlwYWRkdyAgICAgbW0wLG1tMwotCi0JOyAoT3JpZ2luYWwpCi0JOyBSID0gWSAgICAgICAgICAgICAgICArIDEuNDAyMDAgKiBDcgotCTsgRyA9IFkgLSAwLjM0NDE0ICogQ2IgLSAwLjcxNDE0ICogQ3IKLQk7IEIgPSBZICsgMS43NzIwMCAqIENiCi0JOwotCTsgKFRoaXMgaW1wbGVtZW50YXRpb24pCi0JOyBSID0gWSAgICAgICAgICAgICAgICArIDAuNDAyMDAgKiBDciArIENyCi0JOyBHID0gWSAtIDAuMzQ0MTQgKiBDYiArIDAuMjg1ODYgKiBDciAtIENyCi0JOyBCID0gWSAtIDAuMjI4MDAgKiBDYiArIENiICsgQ2IKLQotCW1vdnEJbW01LG1tNgkJCTsgbW01PUNiSAotCW1vdnEJbW0yLG1tNAkJCTsgbW0yPUNiTAotCXBhZGR3CW1tNixtbTYJCQk7IG1tNj0yKkNiSAotCXBhZGR3CW1tNCxtbTQJCQk7IG1tND0yKkNiTAotCW1vdnEJbW0xLG1tNwkJCTsgbW0xPUNySAotCW1vdnEJbW0zLG1tMAkJCTsgbW0zPUNyTAotCXBhZGR3CW1tNyxtbTcJCQk7IG1tNz0yKkNySAotCXBhZGR3CW1tMCxtbTAJCQk7IG1tMD0yKkNyTAotCi0JcG11bGh3CW1tNixbR09UT0ZGKGVheCxQV19NRjAyMjgpXQk7IG1tNj0oMipDYkggKiAtRklYKDAuMjI4MDApKQotCXBtdWxodwltbTQsW0dPVE9GRihlYXgsUFdfTUYwMjI4KV0JOyBtbTQ9KDIqQ2JMICogLUZJWCgwLjIyODAwKSkKLQlwbXVsaHcJbW03LFtHT1RPRkYoZWF4LFBXX0YwNDAyKV0JOyBtbTc9KDIqQ3JIICogRklYKDAuNDAyMDApKQotCXBtdWxodwltbTAsW0dPVE9GRihlYXgsUFdfRjA0MDIpXQk7IG1tMD0oMipDckwgKiBGSVgoMC40MDIwMCkpCi0KLQlwYWRkdwltbTYsW0dPVE9GRihlYXgsUFdfT05FKV0KLQlwYWRkdwltbTQsW0dPVE9GRihlYXgsUFdfT05FKV0KLQlwc3JhdwltbTYsMQkJCTsgbW02PShDYkggKiAtRklYKDAuMjI4MDApKQotCXBzcmF3CW1tNCwxCQkJOyBtbTQ9KENiTCAqIC1GSVgoMC4yMjgwMCkpCi0JcGFkZHcJbW03LFtHT1RPRkYoZWF4LFBXX09ORSldCi0JcGFkZHcJbW0wLFtHT1RPRkYoZWF4LFBXX09ORSldCi0JcHNyYXcJbW03LDEJCQk7IG1tNz0oQ3JIICogRklYKDAuNDAyMDApKQotCXBzcmF3CW1tMCwxCQkJOyBtbTA9KENyTCAqIEZJWCgwLjQwMjAwKSkKLQotCXBhZGR3CW1tNixtbTUKLQlwYWRkdwltbTQsbW0yCi0JcGFkZHcJbW02LG1tNQkJCTsgbW02PShDYkggKiBGSVgoMS43NzIwMCkpPShCLVkpSAotCXBhZGR3CW1tNCxtbTIJCQk7IG1tND0oQ2JMICogRklYKDEuNzcyMDApKT0oQi1ZKUwKLQlwYWRkdwltbTcsbW0xCQkJOyBtbTc9KENySCAqIEZJWCgxLjQwMjAwKSk9KFItWSlICi0JcGFkZHcJbW0wLG1tMwkJCTsgbW0wPShDckwgKiBGSVgoMS40MDIwMCkpPShSLVkpTAotCi0JbW92cQlNTVdPUkQgW3drKDApXSwgbW02CTsgd2soMCk9KEItWSlICi0JbW92cQlNTVdPUkQgW3drKDEpXSwgbW03CTsgd2soMSk9KFItWSlICi0KLQltb3ZxICAgICAgbW02LG1tNQotCW1vdnEgICAgICBtbTcsbW0yCi0JcHVucGNrbHdkIG1tNSxtbTEKLQlwdW5wY2tod2QgbW02LG1tMQotCXBtYWRkd2QgICBtbTUsW0dPVE9GRihlYXgsUFdfTUYwMzQ0X0YwMjg1KV0KLQlwbWFkZHdkICAgbW02LFtHT1RPRkYoZWF4LFBXX01GMDM0NF9GMDI4NSldCi0JcHVucGNrbHdkIG1tMixtbTMKLQlwdW5wY2tod2QgbW03LG1tMwotCXBtYWRkd2QgICBtbTIsW0dPVE9GRihlYXgsUFdfTUYwMzQ0X0YwMjg1KV0KLQlwbWFkZHdkICAgbW03LFtHT1RPRkYoZWF4LFBXX01GMDM0NF9GMDI4NSldCi0KLQlwYWRkZCAgICAgbW01LFtHT1RPRkYoZWF4LFBEX09ORUhBTEYpXQotCXBhZGRkICAgICBtbTYsW0dPVE9GRihlYXgsUERfT05FSEFMRildCi0JcHNyYWQgICAgIG1tNSxTQ0FMRUJJVFMKLQlwc3JhZCAgICAgbW02LFNDQUxFQklUUwotCXBhZGRkICAgICBtbTIsW0dPVE9GRihlYXgsUERfT05FSEFMRildCi0JcGFkZGQgICAgIG1tNyxbR09UT0ZGKGVheCxQRF9PTkVIQUxGKV0KLQlwc3JhZCAgICAgbW0yLFNDQUxFQklUUwotCXBzcmFkICAgICBtbTcsU0NBTEVCSVRTCi0KLQlwYWNrc3NkdyAgbW01LG1tNgk7IG1tNT1DYkgqLUZJWCgwLjM0NCkrQ3JIKkZJWCgwLjI4NSkKLQlwYWNrc3NkdyAgbW0yLG1tNwk7IG1tMj1DYkwqLUZJWCgwLjM0NCkrQ3JMKkZJWCgwLjI4NSkKLQlwc3VidyAgICAgbW01LG1tMQk7IG1tNT1DYkgqLUZJWCgwLjM0NCkrQ3JIKi1GSVgoMC43MTQpPShHLVkpSAotCXBzdWJ3ICAgICBtbTIsbW0zCTsgbW0yPUNiTCotRklYKDAuMzQ0KStDckwqLUZJWCgwLjcxNCk9KEctWSlMCi0KLQltb3ZxCU1NV09SRCBbd2soMildLCBtbTUJOyB3aygyKT0oRy1ZKUgKLQotCW1vdglhbCwyCQkJOyBZY3RyCi0Jam1wCXNob3J0IC5ZbG9vcF8xc3QKLQlhbGlnbngJMTYsNwotCi0uWWxvb3BfMm5kOgotCW1vdnEJbW0wLCBNTVdPUkQgW3drKDEpXQk7IG1tMD0oUi1ZKUgKLQltb3ZxCW1tMiwgTU1XT1JEIFt3aygyKV0JOyBtbTI9KEctWSlICi0JbW92cQltbTQsIE1NV09SRCBbd2soMCldCTsgbW00PShCLVkpSAotCWFsaWdueAkxNiw3Ci0KLS5ZbG9vcF8xc3Q6Ci0JbW92cQltbTcsIE1NV09SRCBbZXNpXQk7IG1tNz1ZKDAxMjM0NTY3KQotCi0JcGNtcGVxdwltbTYsbW02Ci0JcHNybHcJbW02LEJZVEVfQklUCQk7IG1tNj17MHhGRiAweDAwIDB4RkYgMHgwMCAuLn0KLQlwYW5kCW1tNixtbTcJCQk7IG1tNj1ZKDAyNDYpPVlFCi0JcHNybHcJbW03LEJZVEVfQklUCQk7IG1tNz1ZKDEzNTcpPVlPCi0KLQltb3ZxCW1tMSxtbTAJCQk7IG1tMT1tbTA9KFItWSkoTC9IKQotCW1vdnEJbW0zLG1tMgkJCTsgbW0zPW1tMj0oRy1ZKShML0gpCi0JbW92cQltbTUsbW00CQkJOyBtbTU9bW00PShCLVkpKEwvSCkKLQotCXBhZGR3ICAgICBtbTAsbW02CQk7IG1tMD0oKFItWSkrWUUpPVJFPShSMCBSMiBSNCBSNikKLQlwYWRkdyAgICAgbW0xLG1tNwkJOyBtbTE9KChSLVkpK1lPKT1STz0oUjEgUjMgUjUgUjcpCi0JcGFja3Vzd2IgIG1tMCxtbTAJCTsgbW0wPShSMCBSMiBSNCBSNiAqKiAqKiAqKiAqKikKLQlwYWNrdXN3YiAgbW0xLG1tMQkJOyBtbTE9KFIxIFIzIFI1IFI3ICoqICoqICoqICoqKQotCi0JcGFkZHcgICAgIG1tMixtbTYJCTsgbW0yPSgoRy1ZKStZRSk9R0U9KEcwIEcyIEc0IEc2KQotCXBhZGR3ICAgICBtbTMsbW03CQk7IG1tMz0oKEctWSkrWU8pPUdPPShHMSBHMyBHNSBHNykKLQlwYWNrdXN3YiAgbW0yLG1tMgkJOyBtbTI9KEcwIEcyIEc0IEc2ICoqICoqICoqICoqKQotCXBhY2t1c3diICBtbTMsbW0zCQk7IG1tMz0oRzEgRzMgRzUgRzcgKiogKiogKiogKiopCi0KLQlwYWRkdyAgICAgbW00LG1tNgkJOyBtbTQ9KChCLVkpK1lFKT1CRT0oQjAgQjIgQjQgQjYpCi0JcGFkZHcgICAgIG1tNSxtbTcJCTsgbW01PSgoQi1ZKStZTyk9Qk89KEIxIEIzIEI1IEI3KQotCXBhY2t1c3diICBtbTQsbW00CQk7IG1tND0oQjAgQjIgQjQgQjYgKiogKiogKiogKiopCi0JcGFja3Vzd2IgIG1tNSxtbTUJCTsgbW01PShCMSBCMyBCNSBCNyAqKiAqKiAqKiAqKikKLQotJWlmIFJHQl9QSVhFTFNJWkUgPT0gMyA7IC0tLS0tLS0tLS0tLS0tLQotCi0JOyBtbUE9KDAwIDAyIDA0IDA2ICoqICoqICoqICoqKSwgbW1CPSgwMSAwMyAwNSAwNyAqKiAqKiAqKiAqKikKLQk7IG1tQz0oMTAgMTIgMTQgMTYgKiogKiogKiogKiopLCBtbUQ9KDExIDEzIDE1IDE3ICoqICoqICoqICoqKQotCTsgbW1FPSgyMCAyMiAyNCAyNiAqKiAqKiAqKiAqKiksIG1tRj0oMjEgMjMgMjUgMjcgKiogKiogKiogKiopCi0JOyBtbUc9KCoqICoqICoqICoqICoqICoqICoqICoqKSwgbW1IPSgqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKikKLQotCXB1bnBja2xidyBtbUEsbW1DCQk7IG1tQT0oMDAgMTAgMDIgMTIgMDQgMTQgMDYgMTYpCi0JcHVucGNrbGJ3IG1tRSxtbUIJCTsgbW1FPSgyMCAwMSAyMiAwMyAyNCAwNSAyNiAwNykKLQlwdW5wY2tsYncgbW1ELG1tRgkJOyBtbUQ9KDExIDIxIDEzIDIzIDE1IDI1IDE3IDI3KQotCi0JbW92cSAgICAgIG1tRyxtbUEKLQltb3ZxICAgICAgbW1ILG1tQQotCXB1bnBja2x3ZCBtbUEsbW1FCQk7IG1tQT0oMDAgMTAgMjAgMDEgMDIgMTIgMjIgMDMpCi0JcHVucGNraHdkIG1tRyxtbUUJCTsgbW1HPSgwNCAxNCAyNCAwNSAwNiAxNiAyNiAwNykKLQotCXBzcmxxICAgICBtbUgsMipCWVRFX0JJVAk7IG1tSD0oMDIgMTIgMDQgMTQgMDYgMTYgLS0gLS0pCi0JcHNybHEgICAgIG1tRSwyKkJZVEVfQklUCTsgbW1FPSgyMiAwMyAyNCAwNSAyNiAwNyAtLSAtLSkKLQotCW1vdnEgICAgICBtbUMsbW1ECi0JbW92cSAgICAgIG1tQixtbUQKLQlwdW5wY2tsd2QgbW1ELG1tSAkJOyBtbUQ9KDExIDIxIDAyIDEyIDEzIDIzIDA0IDE0KQotCXB1bnBja2h3ZCBtbUMsbW1ICQk7IG1tQz0oMTUgMjUgMDYgMTYgMTcgMjcgLS0gLS0pCi0KLQlwc3JscSAgICAgbW1CLDIqQllURV9CSVQJOyBtbUI9KDEzIDIzIDE1IDI1IDE3IDI3IC0tIC0tKQotCi0JbW92cSAgICAgIG1tRixtbUUKLQlwdW5wY2tsd2QgbW1FLG1tQgkJOyBtbUU9KDIyIDAzIDEzIDIzIDI0IDA1IDE1IDI1KQotCXB1bnBja2h3ZCBtbUYsbW1CCQk7IG1tRj0oMjYgMDcgMTcgMjcgLS0gLS0gLS0gLS0pCi0KLQlwdW5wY2tsZHEgbW1BLG1tRAkJOyBtbUE9KDAwIDEwIDIwIDAxIDExIDIxIDAyIDEyKQotCXB1bnBja2xkcSBtbUUsbW1HCQk7IG1tRT0oMjIgMDMgMTMgMjMgMDQgMTQgMjQgMDUpCi0JcHVucGNrbGRxIG1tQyxtbUYJCTsgbW1DPSgxNSAyNSAwNiAxNiAyNiAwNyAxNyAyNykKLQotCWNtcAllY3gsIGJ5dGUgU0laRU9GX01NV09SRAotCWpiCXNob3J0IC5jb2x1bW5fc3QxNgotCi0JbW92cQlNTVdPUkQgW2VkaSswKlNJWkVPRl9NTVdPUkRdLCBtbUEKLQltb3ZxCU1NV09SRCBbZWRpKzEqU0laRU9GX01NV09SRF0sIG1tRQotCW1vdnEJTU1XT1JEIFtlZGkrMipTSVpFT0ZfTU1XT1JEXSwgbW1DCi0KLQlzdWIJZWN4LCBieXRlIFNJWkVPRl9NTVdPUkQKLQlqeglzaG9ydCAuZW5kY29sdW1uCi0KLQlhZGQJZWRpLCBieXRlIFJHQl9QSVhFTFNJWkUqU0laRU9GX01NV09SRAk7IG91dHB0cgotCWFkZAllc2ksIGJ5dGUgU0laRU9GX01NV09SRAkJCTsgaW5wdHIwCi0JZGVjCWFsCQkJOyBZY3RyCi0Jam56CW5lYXIgLllsb29wXzJuZAotCi0JYWRkCWVieCwgYnl0ZSBTSVpFT0ZfTU1XT1JECQkJOyBpbnB0cjEKLQlhZGQJZWR4LCBieXRlIFNJWkVPRl9NTVdPUkQJCQk7IGlucHRyMgotCWptcAluZWFyIC5jb2x1bW5sb29wCi0JYWxpZ254CTE2LDcKLQotLmNvbHVtbl9zdDE2OgotCWxlYQllY3gsIFtlY3grZWN4KjJdCTsgaW11bCBlY3gsIFJHQl9QSVhFTFNJWkUKLQljbXAJZWN4LCBieXRlIDIqU0laRU9GX01NV09SRAotCWpiCXNob3J0IC5jb2x1bW5fc3Q4Ci0JbW92cQlNTVdPUkQgW2VkaSswKlNJWkVPRl9NTVdPUkRdLCBtbUEKLQltb3ZxCU1NV09SRCBbZWRpKzEqU0laRU9GX01NV09SRF0sIG1tRQotCW1vdnEJbW1BLG1tQwotCXN1YgllY3gsIGJ5dGUgMipTSVpFT0ZfTU1XT1JECi0JYWRkCWVkaSwgYnl0ZSAyKlNJWkVPRl9NTVdPUkQKLQlqbXAJc2hvcnQgLmNvbHVtbl9zdDQKLS5jb2x1bW5fc3Q4OgotCWNtcAllY3gsIGJ5dGUgU0laRU9GX01NV09SRAotCWpiCXNob3J0IC5jb2x1bW5fc3Q0Ci0JbW92cQlNTVdPUkQgW2VkaSswKlNJWkVPRl9NTVdPUkRdLCBtbUEKLQltb3ZxCW1tQSxtbUUKLQlzdWIJZWN4LCBieXRlIFNJWkVPRl9NTVdPUkQKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9NTVdPUkQKLS5jb2x1bW5fc3Q0OgotCW1vdmQJZWF4LG1tQQotCWNtcAllY3gsIGJ5dGUgU0laRU9GX0RXT1JECi0JamIJc2hvcnQgLmNvbHVtbl9zdDIKLQltb3YJRFdPUkQgW2VkaSswKlNJWkVPRl9EV09SRF0sIGVheAotCXBzcmxxCW1tQSxEV09SRF9CSVQKLQltb3ZkCWVheCxtbUEKLQlzdWIJZWN4LCBieXRlIFNJWkVPRl9EV09SRAotCWFkZAllZGksIGJ5dGUgU0laRU9GX0RXT1JECi0uY29sdW1uX3N0MjoKLQljbXAJZWN4LCBieXRlIFNJWkVPRl9XT1JECi0JamIJc2hvcnQgLmNvbHVtbl9zdDEKLQltb3YJV09SRCBbZWRpKzAqU0laRU9GX1dPUkRdLCBheAotCXNocgllYXgsV09SRF9CSVQKLQlzdWIJZWN4LCBieXRlIFNJWkVPRl9XT1JECi0JYWRkCWVkaSwgYnl0ZSBTSVpFT0ZfV09SRAotLmNvbHVtbl9zdDE6Ci0JY21wCWVjeCwgYnl0ZSBTSVpFT0ZfQllURQotCWpiCXNob3J0IC5lbmRjb2x1bW4KLQltb3YJQllURSBbZWRpKzAqU0laRU9GX0JZVEVdLCBhbAotCi0lZWxzZSA7IFJHQl9QSVhFTFNJWkUgPT0gNCA7IC0tLS0tLS0tLS0tCi0KLSVpZmRlZiBSR0JYX0ZJTExFUl8wWEZGCi0JcGNtcGVxYiAgIG1tNixtbTYJCTsgbW02PShYMCBYMiBYNCBYNiAqKiAqKiAqKiAqKikKLQlwY21wZXFiICAgbW03LG1tNwkJOyBtbTc9KFgxIFgzIFg1IFg3ICoqICoqICoqICoqKQotJWVsc2UKLQlweG9yICAgICAgbW02LG1tNgkJOyBtbTY9KFgwIFgyIFg0IFg2ICoqICoqICoqICoqKQotCXB4b3IgICAgICBtbTcsbW03CQk7IG1tNz0oWDEgWDMgWDUgWDcgKiogKiogKiogKiopCi0lZW5kaWYKLQk7IG1tQT0oMDAgMDIgMDQgMDYgKiogKiogKiogKiopLCBtbUI9KDAxIDAzIDA1IDA3ICoqICoqICoqICoqKQotCTsgbW1DPSgxMCAxMiAxNCAxNiAqKiAqKiAqKiAqKiksIG1tRD0oMTEgMTMgMTUgMTcgKiogKiogKiogKiopCi0JOyBtbUU9KDIwIDIyIDI0IDI2ICoqICoqICoqICoqKSwgbW1GPSgyMSAyMyAyNSAyNyAqKiAqKiAqKiAqKikKLQk7IG1tRz0oMzAgMzIgMzQgMzYgKiogKiogKiogKiopLCBtbUg9KDMxIDMzIDM1IDM3ICoqICoqICoqICoqKQotCi0JcHVucGNrbGJ3IG1tQSxtbUMJCTsgbW1BPSgwMCAxMCAwMiAxMiAwNCAxNCAwNiAxNikKLQlwdW5wY2tsYncgbW1FLG1tRwkJOyBtbUU9KDIwIDMwIDIyIDMyIDI0IDM0IDI2IDM2KQotCXB1bnBja2xidyBtbUIsbW1ECQk7IG1tQj0oMDEgMTEgMDMgMTMgMDUgMTUgMDcgMTcpCi0JcHVucGNrbGJ3IG1tRixtbUgJCTsgbW1GPSgyMSAzMSAyMyAzMyAyNSAzNSAyNyAzNykKLQotCW1vdnEgICAgICBtbUMsbW1BCi0JcHVucGNrbHdkIG1tQSxtbUUJCTsgbW1BPSgwMCAxMCAyMCAzMCAwMiAxMiAyMiAzMikKLQlwdW5wY2tod2QgbW1DLG1tRQkJOyBtbUM9KDA0IDE0IDI0IDM0IDA2IDE2IDI2IDM2KQotCW1vdnEgICAgICBtbUcsbW1CCi0JcHVucGNrbHdkIG1tQixtbUYJCTsgbW1CPSgwMSAxMSAyMSAzMSAwMyAxMyAyMyAzMykKLQlwdW5wY2tod2QgbW1HLG1tRgkJOyBtbUc9KDA1IDE1IDI1IDM1IDA3IDE3IDI3IDM3KQotCi0JbW92cSAgICAgIG1tRCxtbUEKLQlwdW5wY2tsZHEgbW1BLG1tQgkJOyBtbUE9KDAwIDEwIDIwIDMwIDAxIDExIDIxIDMxKQotCXB1bnBja2hkcSBtbUQsbW1CCQk7IG1tRD0oMDIgMTIgMjIgMzIgMDMgMTMgMjMgMzMpCi0JbW92cSAgICAgIG1tSCxtbUMKLQlwdW5wY2tsZHEgbW1DLG1tRwkJOyBtbUM9KDA0IDE0IDI0IDM0IDA1IDE1IDI1IDM1KQotCXB1bnBja2hkcSBtbUgsbW1HCQk7IG1tSD0oMDYgMTYgMjYgMzYgMDcgMTcgMjcgMzcpCi0KLQljbXAJZWN4LCBieXRlIFNJWkVPRl9NTVdPUkQKLQlqYglzaG9ydCAuY29sdW1uX3N0MTYKLQotCW1vdnEJTU1XT1JEIFtlZGkrMCpTSVpFT0ZfTU1XT1JEXSwgbW1BCi0JbW92cQlNTVdPUkQgW2VkaSsxKlNJWkVPRl9NTVdPUkRdLCBtbUQKLQltb3ZxCU1NV09SRCBbZWRpKzIqU0laRU9GX01NV09SRF0sIG1tQwotCW1vdnEJTU1XT1JEIFtlZGkrMypTSVpFT0ZfTU1XT1JEXSwgbW1ICi0KLQlzdWIJZWN4LCBieXRlIFNJWkVPRl9NTVdPUkQKLQlqeglzaG9ydCAuZW5kY29sdW1uCi0KLQlhZGQJZWRpLCBieXRlIFJHQl9QSVhFTFNJWkUqU0laRU9GX01NV09SRAk7IG91dHB0cgotCWFkZAllc2ksIGJ5dGUgU0laRU9GX01NV09SRAkJCTsgaW5wdHIwCi0JZGVjCWFsCQkJOyBZY3RyCi0Jam56CW5lYXIgLllsb29wXzJuZAotCi0JYWRkCWVieCwgYnl0ZSBTSVpFT0ZfTU1XT1JECQkJOyBpbnB0cjEKLQlhZGQJZWR4LCBieXRlIFNJWkVPRl9NTVdPUkQJCQk7IGlucHRyMgotCWptcAluZWFyIC5jb2x1bW5sb29wCi0JYWxpZ254CTE2LDcKLQotLmNvbHVtbl9zdDE2OgotCWNtcAllY3gsIGJ5dGUgU0laRU9GX01NV09SRC8yCi0JamIJc2hvcnQgLmNvbHVtbl9zdDgKLQltb3ZxCU1NV09SRCBbZWRpKzAqU0laRU9GX01NV09SRF0sIG1tQQotCW1vdnEJTU1XT1JEIFtlZGkrMSpTSVpFT0ZfTU1XT1JEXSwgbW1ECi0JbW92cQltbUEsbW1DCi0JbW92cQltbUQsbW1ICi0Jc3ViCWVjeCwgYnl0ZSBTSVpFT0ZfTU1XT1JELzIKLQlhZGQJZWRpLCBieXRlIDIqU0laRU9GX01NV09SRAotLmNvbHVtbl9zdDg6Ci0JY21wCWVjeCwgYnl0ZSBTSVpFT0ZfTU1XT1JELzQKLQlqYglzaG9ydCAuY29sdW1uX3N0NAotCW1vdnEJTU1XT1JEIFtlZGkrMCpTSVpFT0ZfTU1XT1JEXSwgbW1BCi0JbW92cQltbUEsbW1ECi0Jc3ViCWVjeCwgYnl0ZSBTSVpFT0ZfTU1XT1JELzQKLQlhZGQJZWRpLCBieXRlIDEqU0laRU9GX01NV09SRAotLmNvbHVtbl9zdDQ6Ci0JY21wCWVjeCwgYnl0ZSBTSVpFT0ZfTU1XT1JELzgKLQlqYglzaG9ydCAuZW5kY29sdW1uCi0JbW92ZAlEV09SRCBbZWRpKzAqU0laRU9GX0RXT1JEXSwgbW1BCi0KLSVlbmRpZiA7IFJHQl9QSVhFTFNJWkUgOyAtLS0tLS0tLS0tLS0tLS0KLQotLmVuZGNvbHVtbjoKLQllbW1zCQk7IGVtcHR5IE1NWCBzdGF0ZQotCi0ucmV0dXJuOgotCXBvcAllZGkKLQlwb3AJZXNpCi07CXBvcAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXBvcAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcG9wCWVieAotCW1vdgllc3AsZWJwCQk7IGVzcCA8LSBhbGlnbmVkIGVicAotCXBvcAllc3AJCTsgZXNwIDwtIG9yaWdpbmFsIGVicAotCXBvcAllYnAKLQlyZXQKLQotJWlmbmRlZiBVU0VfREVESUNBVEVEX0gyVjJfTUVSR0VEX1VQU0FNUExFX01NWAotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ci07IFVwc2FtcGxlIGFuZCBjb2xvciBjb252ZXJ0IGZvciB0aGUgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLgotOwotOyBHTE9CQUwodm9pZCkKLTsganBlZ19oMnYyX21lcmdlZF91cHNhbXBsZV9tbXggKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmKTsKLTsKLQotJWRlZmluZSBjaW5mbyhiKQkJKGIpKzgJCTsgal9kZWNvbXByZXNzX3B0ciBjaW5mbwotJWRlZmluZSBpbnB1dF9idWYoYikJCShiKSsxMgkJOyBKU0FNUElNQUdFIGlucHV0X2J1ZgotJWRlZmluZSBpbl9yb3dfZ3JvdXBfY3RyKGIpCShiKSsxNgkJOyBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIKLSVkZWZpbmUgb3V0cHV0X2J1ZihiKQkJKGIpKzIwCQk7IEpTQU1QQVJSQVkgb3V0cHV0X2J1ZgotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2gydjJfbWVyZ2VkX3Vwc2FtcGxlX21teCkKLQotRVhUTihqcGVnX2gydjJfbWVyZ2VkX3Vwc2FtcGxlX21teCk6Ci0JcHVzaAllYnAKLQltb3YJZWJwLGVzcAotCXB1c2gJZWJ4Ci07CXB1c2gJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwdXNoCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwdXNoCWVzaQotCXB1c2gJZWRpCi0KLQltb3YJZWF4LCBQT0lOVEVSIFtjaW5mbyhlYnApXQotCi0JbW92CWVkaSwgSlNBTVBJTUFHRSBbaW5wdXRfYnVmKGVicCldCi0JbW92CWVjeCwgSkRJTUVOU0lPTiBbaW5fcm93X2dyb3VwX2N0cihlYnApXQotCW1vdgllc2ksIEpTQU1QQVJSQVkgW2VkaSswKlNJWkVPRl9KU0FNUEFSUkFZXQotCW1vdgllYngsIEpTQU1QQVJSQVkgW2VkaSsxKlNJWkVPRl9KU0FNUEFSUkFZXQotCW1vdgllZHgsIEpTQU1QQVJSQVkgW2VkaSsyKlNJWkVPRl9KU0FNUEFSUkFZXQotCW1vdgllZGksIEpTQU1QQVJSQVkgW291dHB1dF9idWYoZWJwKV0KLQlsZWEJZXNpLCBbZXNpK2VjeCpTSVpFT0ZfSlNBTVBST1ddCi0KLQlwdXNoCWVkeAkJCTsgaW5wdHIyCi0JcHVzaAllYngJCQk7IGlucHRyMQotCXB1c2gJZXNpCQkJOyBpbnB0cjAwCi0JbW92CWVieCxlc3AKLQotCXB1c2gJZWRpCQkJOyBvdXRwdXRfYnVmIChvdXRwdHIwKQotCXB1c2gJZWN4CQkJOyBpbl9yb3dfZ3JvdXBfY3RyCi0JcHVzaAllYngJCQk7IGlucHV0X2J1ZgotCXB1c2gJZWF4CQkJOyBjaW5mbwotCi0JY2FsbAluZWFyIEVYVE4oanBlZ19oMnYxX21lcmdlZF91cHNhbXBsZV9tbXgpCi0KLQlhZGQJZXNpLCBieXRlIFNJWkVPRl9KU0FNUFJPVwk7IGlucHRyMDEKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9KU0FNUFJPVwk7IG91dHB0cjEKLQltb3YJUE9JTlRFUiBbZWJ4KzAqU0laRU9GX1BPSU5URVJdLCBlc2kKLQltb3YJUE9JTlRFUiBbZWJ4LTEqU0laRU9GX1BPSU5URVJdLCBlZGkKLQotCWNhbGwJbmVhciBFWFROKGpwZWdfaDJ2MV9tZXJnZWRfdXBzYW1wbGVfbW14KQotCi0JYWRkCWVzcCwgYnl0ZSA3KlNJWkVPRl9EV09SRAotCi0JcG9wCWVkaQotCXBvcAllc2kKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwb3AJZWJ4Ci0JcG9wCWVicAotCXJldAotCi0lZWxzZSAgOyBVU0VfREVESUNBVEVEX0gyVjJfTUVSR0VEX1VQU0FNUExFX01NWAotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ci07IFVwc2FtcGxlIGFuZCBjb2xvciBjb252ZXJ0IGZvciB0aGUgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLgotOwotOyBHTE9CQUwodm9pZCkKLTsganBlZ19oMnYyX21lcmdlZF91cHNhbXBsZV9tbXggKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmKTsKLTsKLQotJWRlZmluZSBjaW5mbyhiKQkJKGIpKzgJCTsgal9kZWNvbXByZXNzX3B0ciBjaW5mbwotJWRlZmluZSBpbnB1dF9idWYoYikJCShiKSsxMgkJOyBKU0FNUElNQUdFIGlucHV0X2J1ZgotJWRlZmluZSBpbl9yb3dfZ3JvdXBfY3RyKGIpCShiKSsxNgkJOyBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIKLSVkZWZpbmUgb3V0cHV0X2J1ZihiKQkJKGIpKzIwCQk7IEpTQU1QQVJSQVkgb3V0cHV0X2J1ZgotCi0lZGVmaW5lIG9yaWdpbmFsX2VicAllYnArMAotJWRlZmluZSB3ayhpKQkJZWJwLShXS19OVU0tKGkpKSpTSVpFT0ZfTU1XT1JECTsgbW13b3JkIHdrW1dLX05VTV0KLSVkZWZpbmUgV0tfTlVNCQkxMAotJWRlZmluZSBpbnB0cjEJCXdrKDApLVNJWkVPRl9KU0FNUFJPVwk7IEpTQU1QUk9XIGlucHRyMQotJWRlZmluZSBpbnB0cjIJCWlucHRyMS1TSVpFT0ZfSlNBTVBST1cJOyBKU0FNUFJPVyBpbnB0cjIKLSVkZWZpbmUgZ290cHRyCQlpbnB0cjItU0laRU9GX1BPSU5URVIJOyB2b2lkICogZ290cHRyCi0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfaDJ2Ml9tZXJnZWRfdXBzYW1wbGVfbW14KQotCi1FWFROKGpwZWdfaDJ2Ml9tZXJnZWRfdXBzYW1wbGVfbW14KToKLQlwdXNoCWVicAotCW1vdgllYXgsZXNwCQkJCTsgZWF4ID0gb3JpZ2luYWwgZWJwCi0Jc3ViCWVzcCwgYnl0ZSA0Ci0JYW5kCWVzcCwgYnl0ZSAoLVNJWkVPRl9NTVdPUkQpCTsgYWxpZ24gdG8gNjQgYml0cwotCW1vdglbZXNwXSxlYXgKLQltb3YJZWJwLGVzcAkJCQk7IGVicCA9IGFsaWduZWQgZWJwCi0JbGVhCWVzcCwgW2lucHRyMl0KLQlwdXNocGljCWVheAkJOyBtYWtlIGEgcm9vbSBmb3IgR09UIGFkZHJlc3MKLQlwdXNoCWVieAotOwlwdXNoCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcHVzaAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcHVzaAllc2kKLQlwdXNoCWVkaQotCi0JZ2V0X0dPVAllYngJCQk7IGdldCBHT1QgYWRkcmVzcwotCW1vdnBpYwlQT0lOVEVSIFtnb3RwdHJdLCBlYngJOyBzYXZlIEdPVCBhZGRyZXNzCi0KLQltb3YJZWN4LCBQT0lOVEVSIFtjaW5mbyhlYXgpXQotCW1vdgllY3gsIEpESU1FTlNJT04gW2pkc3RydWN0X291dHB1dF93aWR0aChlY3gpXQk7IGNvbAotCXRlc3QJZWN4LGVjeAotCWp6CW5lYXIgLnJldHVybgotCi0JcHVzaAllY3gKLQotCW1vdgllZGksIEpTQU1QSU1BR0UgW2lucHV0X2J1ZihlYXgpXQotCW1vdgllY3gsIEpESU1FTlNJT04gW2luX3Jvd19ncm91cF9jdHIoZWF4KV0KLQltb3YJZXNpLCBKU0FNUEFSUkFZIFtlZGkrMCpTSVpFT0ZfSlNBTVBBUlJBWV0KLQltb3YJZWJ4LCBKU0FNUEFSUkFZIFtlZGkrMSpTSVpFT0ZfSlNBTVBBUlJBWV0KLQltb3YJZWR4LCBKU0FNUEFSUkFZIFtlZGkrMipTSVpFT0ZfSlNBTVBBUlJBWV0KLQltb3YJZWRpLCBKU0FNUEFSUkFZIFtvdXRwdXRfYnVmKGVheCldCi0JbW92CWVheCwgSlNBTVBST1cgW2VzaSsoZWN4KjIrMCkqU0laRU9GX0pTQU1QUk9XXQk7IGlucHRyMDAKLQltb3YJZXNpLCBKU0FNUFJPVyBbZXNpKyhlY3gqMisxKSpTSVpFT0ZfSlNBTVBST1ddCTsgaW5wdHIwMQotCW1vdgllYngsIEpTQU1QUk9XIFtlYngrZWN4KlNJWkVPRl9KU0FNUFJPV10JCTsgaW5wdHIxCi0JbW92CWVkeCwgSlNBTVBST1cgW2VkeCtlY3gqU0laRU9GX0pTQU1QUk9XXQkJOyBpbnB0cjIKLQotCXBvcAllY3gJCTsgY29sCi0JcHVzaAllYXgJCTsgaW5wdHIwMAotCXB1c2gJZXNpCQk7IGlucHRyMDEKLQotCW1vdgllc2ksIEpTQU1QUk9XIFtlZGkrMCpTSVpFT0ZfSlNBTVBST1ddCQk7IG91dHB0cjAKLQltb3YJZWRpLCBKU0FNUFJPVyBbZWRpKzEqU0laRU9GX0pTQU1QUk9XXQkJOyBvdXRwdHIxCi0JYWxpZ254CTE2LDcKLS5jb2x1bW5sb29wOgotCW1vdnBpYwllYXgsIFBPSU5URVIgW2dvdHB0cl0JOyBsb2FkIEdPVCBhZGRyZXNzIChlYXgpCi0KLQltb3ZxCW1tNiwgTU1XT1JEIFtlYnhdCTsgbW02PUNiKDAxMjM0NTY3KQotCW1vdnEJbW03LCBNTVdPUkQgW2VkeF0JOyBtbTc9Q3IoMDEyMzQ1NjcpCi0KLQltb3YJSlNBTVBST1cgW2lucHRyMV0sIGVieAk7IGlucHRyMQotCW1vdglKU0FNUFJPVyBbaW5wdHIyXSwgZWR4CTsgaW5wdHIyCi0JcG9wCWVkeAkJCTsgZWR4PWlucHRyMDEKLQlwb3AJZWJ4CQkJOyBlYng9aW5wdHIwMAotCi0JcHhvciAgICAgIG1tMSxtbTEJCTsgbW0xPShhbGwgMCdzKQotCXBjbXBlcXcgICBtbTMsbW0zCi0JcHNsbHcgICAgIG1tMyw3CQkJOyBtbTM9ezB4RkY4MCAweEZGODAgMHhGRjgwIDB4RkY4MH0KLQotCW1vdnEgICAgICBtbTQsbW02Ci0JcHVucGNraGJ3IG1tNixtbTEJCTsgbW02PUNiKDQ1NjcpPUNiSAotCXB1bnBja2xidyBtbTQsbW0xCQk7IG1tND1DYigwMTIzKT1DYkwKLQltb3ZxICAgICAgbW0wLG1tNwotCXB1bnBja2hidyBtbTcsbW0xCQk7IG1tNz1Dcig0NTY3KT1DckgKLQlwdW5wY2tsYncgbW0wLG1tMQkJOyBtbTA9Q3IoMDEyMyk9Q3JMCi0KLQlwYWRkdyAgICAgbW02LG1tMwotCXBhZGR3ICAgICBtbTQsbW0zCi0JcGFkZHcgICAgIG1tNyxtbTMKLQlwYWRkdyAgICAgbW0wLG1tMwotCi0JOyAoT3JpZ2luYWwpCi0JOyBSID0gWSAgICAgICAgICAgICAgICArIDEuNDAyMDAgKiBDcgotCTsgRyA9IFkgLSAwLjM0NDE0ICogQ2IgLSAwLjcxNDE0ICogQ3IKLQk7IEIgPSBZICsgMS43NzIwMCAqIENiCi0JOwotCTsgKFRoaXMgaW1wbGVtZW50YXRpb24pCi0JOyBSID0gWSAgICAgICAgICAgICAgICArIDAuNDAyMDAgKiBDciArIENyCi0JOyBHID0gWSAtIDAuMzQ0MTQgKiBDYiArIDAuMjg1ODYgKiBDciAtIENyCi0JOyBCID0gWSAtIDAuMjI4MDAgKiBDYiArIENiICsgQ2IKLQotCW1vdnEJbW01LG1tNgkJCTsgbW01PUNiSAotCW1vdnEJbW0yLG1tNAkJCTsgbW0yPUNiTAotCXBhZGR3CW1tNixtbTYJCQk7IG1tNj0yKkNiSAotCXBhZGR3CW1tNCxtbTQJCQk7IG1tND0yKkNiTAotCW1vdnEJbW0xLG1tNwkJCTsgbW0xPUNySAotCW1vdnEJbW0zLG1tMAkJCTsgbW0zPUNyTAotCXBhZGR3CW1tNyxtbTcJCQk7IG1tNz0yKkNySAotCXBhZGR3CW1tMCxtbTAJCQk7IG1tMD0yKkNyTAotCi0JcG11bGh3CW1tNixbR09UT0ZGKGVheCxQV19NRjAyMjgpXQk7IG1tNj0oMipDYkggKiAtRklYKDAuMjI4MDApKQotCXBtdWxodwltbTQsW0dPVE9GRihlYXgsUFdfTUYwMjI4KV0JOyBtbTQ9KDIqQ2JMICogLUZJWCgwLjIyODAwKSkKLQlwbXVsaHcJbW03LFtHT1RPRkYoZWF4LFBXX0YwNDAyKV0JOyBtbTc9KDIqQ3JIICogRklYKDAuNDAyMDApKQotCXBtdWxodwltbTAsW0dPVE9GRihlYXgsUFdfRjA0MDIpXQk7IG1tMD0oMipDckwgKiBGSVgoMC40MDIwMCkpCi0KLQlwYWRkdwltbTYsW0dPVE9GRihlYXgsUFdfT05FKV0KLQlwYWRkdwltbTQsW0dPVE9GRihlYXgsUFdfT05FKV0KLQlwc3JhdwltbTYsMQkJCTsgbW02PShDYkggKiAtRklYKDAuMjI4MDApKQotCXBzcmF3CW1tNCwxCQkJOyBtbTQ9KENiTCAqIC1GSVgoMC4yMjgwMCkpCi0JcGFkZHcJbW03LFtHT1RPRkYoZWF4LFBXX09ORSldCi0JcGFkZHcJbW0wLFtHT1RPRkYoZWF4LFBXX09ORSldCi0JcHNyYXcJbW03LDEJCQk7IG1tNz0oQ3JIICogRklYKDAuNDAyMDApKQotCXBzcmF3CW1tMCwxCQkJOyBtbTA9KENyTCAqIEZJWCgwLjQwMjAwKSkKLQotCXBhZGR3CW1tNixtbTUKLQlwYWRkdwltbTQsbW0yCi0JcGFkZHcJbW02LG1tNQkJCTsgbW02PShDYkggKiBGSVgoMS43NzIwMCkpPShCLVkpSAotCXBhZGR3CW1tNCxtbTIJCQk7IG1tND0oQ2JMICogRklYKDEuNzcyMDApKT0oQi1ZKUwKLQlwYWRkdwltbTcsbW0xCQkJOyBtbTc9KENySCAqIEZJWCgxLjQwMjAwKSk9KFItWSlICi0JcGFkZHcJbW0wLG1tMwkJCTsgbW0wPShDckwgKiBGSVgoMS40MDIwMCkpPShSLVkpTAotCi0JbW92cQlNTVdPUkQgW3drKDApXSwgbW02CTsgd2soMCk9KEItWSlICi0JbW92cQlNTVdPUkQgW3drKDEpXSwgbW03CTsgd2soMSk9KFItWSlICi0KLQltb3ZxICAgICAgbW02LG1tNQotCW1vdnEgICAgICBtbTcsbW0yCi0JcHVucGNrbHdkIG1tNSxtbTEKLQlwdW5wY2tod2QgbW02LG1tMQotCXBtYWRkd2QgICBtbTUsW0dPVE9GRihlYXgsUFdfTUYwMzQ0X0YwMjg1KV0KLQlwbWFkZHdkICAgbW02LFtHT1RPRkYoZWF4LFBXX01GMDM0NF9GMDI4NSldCi0JcHVucGNrbHdkIG1tMixtbTMKLQlwdW5wY2tod2QgbW03LG1tMwotCXBtYWRkd2QgICBtbTIsW0dPVE9GRihlYXgsUFdfTUYwMzQ0X0YwMjg1KV0KLQlwbWFkZHdkICAgbW03LFtHT1RPRkYoZWF4LFBXX01GMDM0NF9GMDI4NSldCi0KLQlwYWRkZCAgICAgbW01LFtHT1RPRkYoZWF4LFBEX09ORUhBTEYpXQotCXBhZGRkICAgICBtbTYsW0dPVE9GRihlYXgsUERfT05FSEFMRildCi0JcHNyYWQgICAgIG1tNSxTQ0FMRUJJVFMKLQlwc3JhZCAgICAgbW02LFNDQUxFQklUUwotCXBhZGRkICAgICBtbTIsW0dPVE9GRihlYXgsUERfT05FSEFMRildCi0JcGFkZGQgICAgIG1tNyxbR09UT0ZGKGVheCxQRF9PTkVIQUxGKV0KLQlwc3JhZCAgICAgbW0yLFNDQUxFQklUUwotCXBzcmFkICAgICBtbTcsU0NBTEVCSVRTCi0KLQlwYWNrc3NkdyAgbW01LG1tNgk7IG1tNT1DYkgqLUZJWCgwLjM0NCkrQ3JIKkZJWCgwLjI4NSkKLQlwYWNrc3NkdyAgbW0yLG1tNwk7IG1tMj1DYkwqLUZJWCgwLjM0NCkrQ3JMKkZJWCgwLjI4NSkKLQlwc3VidyAgICAgbW01LG1tMQk7IG1tNT1DYkgqLUZJWCgwLjM0NCkrQ3JIKi1GSVgoMC43MTQpPShHLVkpSAotCXBzdWJ3ICAgICBtbTIsbW0zCTsgbW0yPUNiTCotRklYKDAuMzQ0KStDckwqLUZJWCgwLjcxNCk9KEctWSlMCi0KLQltb3ZxCU1NV09SRCBbd2soMildLCBtbTUJOyB3aygyKT0oRy1ZKUgKLQotCW1vdglhaCwyCQkJOyBZSGN0cgotCWptcAlzaG9ydCAuWUhsb29wXzFzdAotCWFsaWdueAkxNiw3Ci0KLS5ZSGxvb3BfMm5kOgotCW1vdnEJbW0wLCBNTVdPUkQgW3drKDEpXQk7IG1tMD0oUi1ZKUgKLQltb3ZxCW1tMiwgTU1XT1JEIFt3aygyKV0JOyBtbTI9KEctWSlICi0JbW92cQltbTQsIE1NV09SRCBbd2soMCldCTsgbW00PShCLVkpSAotCWFsaWdueAkxNiw3Ci0KLS5ZSGxvb3BfMXN0OgotCW1vdnEJTU1XT1JEIFt3aygzKV0sIG1tMAk7IHdrKDMpPShSLVkpKEwvSCkKLQltb3ZxCU1NV09SRCBbd2soNCldLCBtbTIJOyB3ayg0KT0oRy1ZKShML0gpCi0JbW92cQlNTVdPUkQgW3drKDUpXSwgbW00CTsgd2soNSk9KEItWSkoTC9IKQotCi0JbW92cQltbTcsIE1NV09SRCBbZWJ4XQk7IG1tNz1ZKDAxMjM0NTY3KQotCi0JbW92CWFsLDIJCQk7IFlWY3RyCi0Jam1wCXNob3J0IC5ZVmxvb3BfMXN0Ci0JYWxpZ254CTE2LDcKLQotLllWbG9vcF8ybmQ6Ci0JbW92cQltbTAsIE1NV09SRCBbd2soMyldCTsgbW0wPShSLVkpKEwvSCkKLQltb3ZxCW1tMiwgTU1XT1JEIFt3ayg0KV0JOyBtbTI9KEctWSkoTC9IKQotCW1vdnEJbW00LCBNTVdPUkQgW3drKDUpXQk7IG1tND0oQi1ZKShML0gpCi0KLQltb3ZxCW1tNywgTU1XT1JEIFtlZHhdCTsgbW03PVkoMDEyMzQ1NjcpCi0JYWxpZ254CTE2LDcKLQotLllWbG9vcF8xc3Q6Ci0JcGNtcGVxdwltbTYsbW02Ci0JcHNybHcJbW02LEJZVEVfQklUCQk7IG1tNj17MHhGRiAweDAwIDB4RkYgMHgwMCAuLn0KLQlwYW5kCW1tNixtbTcJCQk7IG1tNj1ZKDAyNDYpPVlFCi0JcHNybHcJbW03LEJZVEVfQklUCQk7IG1tNz1ZKDEzNTcpPVlPCi0KLQltb3ZxCW1tMSxtbTAJCQk7IG1tMT1tbTA9KFItWSkoTC9IKQotCW1vdnEJbW0zLG1tMgkJCTsgbW0zPW1tMj0oRy1ZKShML0gpCi0JbW92cQltbTUsbW00CQkJOyBtbTU9bW00PShCLVkpKEwvSCkKLQotCXBhZGR3ICAgICBtbTAsbW02CQk7IG1tMD0oKFItWSkrWUUpPVJFPShSMCBSMiBSNCBSNikKLQlwYWRkdyAgICAgbW0xLG1tNwkJOyBtbTE9KChSLVkpK1lPKT1STz0oUjEgUjMgUjUgUjcpCi0JcGFja3Vzd2IgIG1tMCxtbTAJCTsgbW0wPShSMCBSMiBSNCBSNiAqKiAqKiAqKiAqKikKLQlwYWNrdXN3YiAgbW0xLG1tMQkJOyBtbTE9KFIxIFIzIFI1IFI3ICoqICoqICoqICoqKQotCi0JcGFkZHcgICAgIG1tMixtbTYJCTsgbW0yPSgoRy1ZKStZRSk9R0U9KEcwIEcyIEc0IEc2KQotCXBhZGR3ICAgICBtbTMsbW03CQk7IG1tMz0oKEctWSkrWU8pPUdPPShHMSBHMyBHNSBHNykKLQlwYWNrdXN3YiAgbW0yLG1tMgkJOyBtbTI9KEcwIEcyIEc0IEc2ICoqICoqICoqICoqKQotCXBhY2t1c3diICBtbTMsbW0zCQk7IG1tMz0oRzEgRzMgRzUgRzcgKiogKiogKiogKiopCi0KLQlwYWRkdyAgICAgbW00LG1tNgkJOyBtbTQ9KChCLVkpK1lFKT1CRT0oQjAgQjIgQjQgQjYpCi0JcGFkZHcgICAgIG1tNSxtbTcJCTsgbW01PSgoQi1ZKStZTyk9Qk89KEIxIEIzIEI1IEI3KQotCXBhY2t1c3diICBtbTQsbW00CQk7IG1tND0oQjAgQjIgQjQgQjYgKiogKiogKiogKiopCi0JcGFja3Vzd2IgIG1tNSxtbTUJCTsgbW01PShCMSBCMyBCNSBCNyAqKiAqKiAqKiAqKikKLQotJWlmIFJHQl9QSVhFTFNJWkUgPT0gMyA7IC0tLS0tLS0tLS0tLS0tLQotCi0JOyBtbUE9KDAwIDAyIDA0IDA2ICoqICoqICoqICoqKSwgbW1CPSgwMSAwMyAwNSAwNyAqKiAqKiAqKiAqKikKLQk7IG1tQz0oMTAgMTIgMTQgMTYgKiogKiogKiogKiopLCBtbUQ9KDExIDEzIDE1IDE3ICoqICoqICoqICoqKQotCTsgbW1FPSgyMCAyMiAyNCAyNiAqKiAqKiAqKiAqKiksIG1tRj0oMjEgMjMgMjUgMjcgKiogKiogKiogKiopCi0JOyBtbUc9KCoqICoqICoqICoqICoqICoqICoqICoqKSwgbW1IPSgqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKikKLQotCXB1bnBja2xidyBtbUEsbW1DCQk7IG1tQT0oMDAgMTAgMDIgMTIgMDQgMTQgMDYgMTYpCi0JcHVucGNrbGJ3IG1tRSxtbUIJCTsgbW1FPSgyMCAwMSAyMiAwMyAyNCAwNSAyNiAwNykKLQlwdW5wY2tsYncgbW1ELG1tRgkJOyBtbUQ9KDExIDIxIDEzIDIzIDE1IDI1IDE3IDI3KQotCi0JbW92cSAgICAgIG1tRyxtbUEKLQltb3ZxICAgICAgbW1ILG1tQQotCXB1bnBja2x3ZCBtbUEsbW1FCQk7IG1tQT0oMDAgMTAgMjAgMDEgMDIgMTIgMjIgMDMpCi0JcHVucGNraHdkIG1tRyxtbUUJCTsgbW1HPSgwNCAxNCAyNCAwNSAwNiAxNiAyNiAwNykKLQotCXBzcmxxICAgICBtbUgsMipCWVRFX0JJVAk7IG1tSD0oMDIgMTIgMDQgMTQgMDYgMTYgLS0gLS0pCi0JcHNybHEgICAgIG1tRSwyKkJZVEVfQklUCTsgbW1FPSgyMiAwMyAyNCAwNSAyNiAwNyAtLSAtLSkKLQotCW1vdnEgICAgICBtbUMsbW1ECi0JbW92cSAgICAgIG1tQixtbUQKLQlwdW5wY2tsd2QgbW1ELG1tSAkJOyBtbUQ9KDExIDIxIDAyIDEyIDEzIDIzIDA0IDE0KQotCXB1bnBja2h3ZCBtbUMsbW1ICQk7IG1tQz0oMTUgMjUgMDYgMTYgMTcgMjcgLS0gLS0pCi0KLQlwc3JscSAgICAgbW1CLDIqQllURV9CSVQJOyBtbUI9KDEzIDIzIDE1IDI1IDE3IDI3IC0tIC0tKQotCi0JbW92cSAgICAgIG1tRixtbUUKLQlwdW5wY2tsd2QgbW1FLG1tQgkJOyBtbUU9KDIyIDAzIDEzIDIzIDI0IDA1IDE1IDI1KQotCXB1bnBja2h3ZCBtbUYsbW1CCQk7IG1tRj0oMjYgMDcgMTcgMjcgLS0gLS0gLS0gLS0pCi0KLQlwdW5wY2tsZHEgbW1BLG1tRAkJOyBtbUE9KDAwIDEwIDIwIDAxIDExIDIxIDAyIDEyKQotCXB1bnBja2xkcSBtbUUsbW1HCQk7IG1tRT0oMjIgMDMgMTMgMjMgMDQgMTQgMjQgMDUpCi0JcHVucGNrbGRxIG1tQyxtbUYJCTsgbW1DPSgxNSAyNSAwNiAxNiAyNiAwNyAxNyAyNykKLQotCWRlYwlhbAkJCTsgWVZjdHIKLQlqeglzaG9ydCAuWVZsb29wX2JyZWFrCi0KLQltb3ZxCU1NV09SRCBbd2soNildLCBtbUEKLQltb3ZxCU1NV09SRCBbd2soNyldLCBtbUUKLQltb3ZxCU1NV09SRCBbd2soOCldLCBtbUMKLQotCWptcAluZWFyIC5ZVmxvb3BfMm5kCi0JYWxpZ254CTE2LDcKLQotLllWbG9vcF9icmVhazoKLQltb3ZxCW1tSCwgTU1XT1JEIFt3ayg2KV0KLQltb3ZxCW1tQiwgTU1XT1JEIFt3ayg3KV0KLQltb3ZxCW1tRCwgTU1XT1JEIFt3ayg4KV0KLQotCWNtcAllY3gsIGJ5dGUgU0laRU9GX01NV09SRAotCWpiCXNob3J0IC5jb2x1bW5fc3QxNgotCi0JbW92cQlNTVdPUkQgW2VzaSswKlNJWkVPRl9NTVdPUkRdLCBtbUgKLQltb3ZxCU1NV09SRCBbZXNpKzEqU0laRU9GX01NV09SRF0sIG1tQgotCW1vdnEJTU1XT1JEIFtlc2krMipTSVpFT0ZfTU1XT1JEXSwgbW1ECi0JbW92cQlNTVdPUkQgW2VkaSswKlNJWkVPRl9NTVdPUkRdLCBtbUEKLQltb3ZxCU1NV09SRCBbZWRpKzEqU0laRU9GX01NV09SRF0sIG1tRQotCW1vdnEJTU1XT1JEIFtlZGkrMipTSVpFT0ZfTU1XT1JEXSwgbW1DCi0KLQlzdWIJZWN4LCBieXRlIFNJWkVPRl9NTVdPUkQKLQlqegluZWFyIC5lbmRjb2x1bW4KLQotCWFkZAllc2ksIGJ5dGUgUkdCX1BJWEVMU0laRSpTSVpFT0ZfTU1XT1JECTsgb3V0cHRyMAotCWFkZAllZGksIGJ5dGUgUkdCX1BJWEVMU0laRSpTSVpFT0ZfTU1XT1JECTsgb3V0cHRyMQotCWFkZAllYngsIGJ5dGUgU0laRU9GX01NV09SRAkJCTsgaW5wdHIwMAotCWFkZAllZHgsIGJ5dGUgU0laRU9GX01NV09SRAkJCTsgaW5wdHIwMQotCWRlYwlhaAkJCTsgWUhjdHIKLQlqbnoJbmVhciAuWUhsb29wXzJuZAotCi0JcHVzaAllYngJCQk7IGlucHRyMDAKLQlwdXNoCWVkeAkJCTsgaW5wdHIwMQotCW1vdgllYngsIEpTQU1QUk9XIFtpbnB0cjFdCTsgZWJ4PWlucHRyMQotCW1vdgllZHgsIEpTQU1QUk9XIFtpbnB0cjJdCTsgZWR4PWlucHRyMgotCWFkZAllYngsIGJ5dGUgU0laRU9GX01NV09SRAk7IGlucHRyMQotCWFkZAllZHgsIGJ5dGUgU0laRU9GX01NV09SRAk7IGlucHRyMgotCWptcAluZWFyIC5jb2x1bW5sb29wCi0JYWxpZ254CTE2LDcKLQotLmNvbHVtbl9zdDE2OgotCWxlYQllY3gsIFtlY3grZWN4KjJdCTsgaW11bCBlY3gsIFJHQl9QSVhFTFNJWkUKLQljbXAJZWN4LCBieXRlIDIqU0laRU9GX01NV09SRAotCWpiCXNob3J0IC5jb2x1bW5fc3Q4Ci0JbW92cQlNTVdPUkQgW2VzaSswKlNJWkVPRl9NTVdPUkRdLCBtbUgKLQltb3ZxCU1NV09SRCBbZXNpKzEqU0laRU9GX01NV09SRF0sIG1tQgotCW1vdnEJTU1XT1JEIFtlZGkrMCpTSVpFT0ZfTU1XT1JEXSwgbW1BCi0JbW92cQlNTVdPUkQgW2VkaSsxKlNJWkVPRl9NTVdPUkRdLCBtbUUKLQltb3ZxCW1tSCxtbUQKLQltb3ZxCW1tQSxtbUMKLQlzdWIJZWN4LCBieXRlIDIqU0laRU9GX01NV09SRAotCWFkZAllc2ksIGJ5dGUgMipTSVpFT0ZfTU1XT1JECi0JYWRkCWVkaSwgYnl0ZSAyKlNJWkVPRl9NTVdPUkQKLQlqbXAJc2hvcnQgLmNvbHVtbl9zdDQKLS5jb2x1bW5fc3Q4OgotCWNtcAllY3gsIGJ5dGUgU0laRU9GX01NV09SRAotCWpiCXNob3J0IC5jb2x1bW5fc3Q0Ci0JbW92cQlNTVdPUkQgW2VzaSswKlNJWkVPRl9NTVdPUkRdLCBtbUgKLQltb3ZxCU1NV09SRCBbZWRpKzAqU0laRU9GX01NV09SRF0sIG1tQQotCW1vdnEJbW1ILG1tQgotCW1vdnEJbW1BLG1tRQotCXN1YgllY3gsIGJ5dGUgU0laRU9GX01NV09SRAotCWFkZAllc2ksIGJ5dGUgU0laRU9GX01NV09SRAotCWFkZAllZGksIGJ5dGUgU0laRU9GX01NV09SRAotLmNvbHVtbl9zdDQ6Ci0JbW92ZAllYXgsbW1ICi0JbW92ZAllZHgsbW1BCi0JY21wCWVjeCwgYnl0ZSBTSVpFT0ZfRFdPUkQKLQlqYglzaG9ydCAuY29sdW1uX3N0MgotCW1vdglEV09SRCBbZXNpKzAqU0laRU9GX0RXT1JEXSwgZWF4Ci0JbW92CURXT1JEIFtlZGkrMCpTSVpFT0ZfRFdPUkRdLCBlZHgKLQlwc3JscQltbUgsRFdPUkRfQklUCi0JcHNybHEJbW1BLERXT1JEX0JJVAotCW1vdmQJZWF4LG1tSAotCW1vdmQJZWR4LG1tQQotCXN1YgllY3gsIGJ5dGUgU0laRU9GX0RXT1JECi0JYWRkCWVzaSwgYnl0ZSBTSVpFT0ZfRFdPUkQKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9EV09SRAotLmNvbHVtbl9zdDI6Ci0JY21wCWVjeCwgYnl0ZSBTSVpFT0ZfV09SRAotCWpiCXNob3J0IC5jb2x1bW5fc3QxCi0JbW92CVdPUkQgW2VzaSswKlNJWkVPRl9XT1JEXSwgYXgKLQltb3YJV09SRCBbZWRpKzAqU0laRU9GX1dPUkRdLCBkeAotCXNocgllYXgsV09SRF9CSVQKLQlzaHIJZWR4LFdPUkRfQklUCi0Jc3ViCWVjeCwgYnl0ZSBTSVpFT0ZfV09SRAotCWFkZAllc2ksIGJ5dGUgU0laRU9GX1dPUkQKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9XT1JECi0uY29sdW1uX3N0MToKLQljbXAJZWN4LCBieXRlIFNJWkVPRl9CWVRFCi0JamIJc2hvcnQgLmVuZGNvbHVtbgotCW1vdglCWVRFIFtlc2krMCpTSVpFT0ZfQllURV0sIGFsCi0JbW92CUJZVEUgW2VkaSswKlNJWkVPRl9CWVRFXSwgZGwKLQotJWVsc2UgOyBSR0JfUElYRUxTSVpFID09IDQgOyAtLS0tLS0tLS0tLQotCi0laWZkZWYgUkdCWF9GSUxMRVJfMFhGRgotCXBjbXBlcWIgICBtbTYsbW02CQk7IG1tNj0oWDAgWDIgWDQgWDYgKiogKiogKiogKiopCi0JcGNtcGVxYiAgIG1tNyxtbTcJCTsgbW03PShYMSBYMyBYNSBYNyAqKiAqKiAqKiAqKikKLSVlbHNlCi0JcHhvciAgICAgIG1tNixtbTYJCTsgbW02PShYMCBYMiBYNCBYNiAqKiAqKiAqKiAqKikKLQlweG9yICAgICAgbW03LG1tNwkJOyBtbTc9KFgxIFgzIFg1IFg3ICoqICoqICoqICoqKQotJWVuZGlmCi0JOyBtbUE9KDAwIDAyIDA0IDA2ICoqICoqICoqICoqKSwgbW1CPSgwMSAwMyAwNSAwNyAqKiAqKiAqKiAqKikKLQk7IG1tQz0oMTAgMTIgMTQgMTYgKiogKiogKiogKiopLCBtbUQ9KDExIDEzIDE1IDE3ICoqICoqICoqICoqKQotCTsgbW1FPSgyMCAyMiAyNCAyNiAqKiAqKiAqKiAqKiksIG1tRj0oMjEgMjMgMjUgMjcgKiogKiogKiogKiopCi0JOyBtbUc9KDMwIDMyIDM0IDM2ICoqICoqICoqICoqKSwgbW1IPSgzMSAzMyAzNSAzNyAqKiAqKiAqKiAqKikKLQotCXB1bnBja2xidyBtbUEsbW1DCQk7IG1tQT0oMDAgMTAgMDIgMTIgMDQgMTQgMDYgMTYpCi0JcHVucGNrbGJ3IG1tRSxtbUcJCTsgbW1FPSgyMCAzMCAyMiAzMiAyNCAzNCAyNiAzNikKLQlwdW5wY2tsYncgbW1CLG1tRAkJOyBtbUI9KDAxIDExIDAzIDEzIDA1IDE1IDA3IDE3KQotCXB1bnBja2xidyBtbUYsbW1ICQk7IG1tRj0oMjEgMzEgMjMgMzMgMjUgMzUgMjcgMzcpCi0KLQltb3ZxICAgICAgbW1DLG1tQQotCXB1bnBja2x3ZCBtbUEsbW1FCQk7IG1tQT0oMDAgMTAgMjAgMzAgMDIgMTIgMjIgMzIpCi0JcHVucGNraHdkIG1tQyxtbUUJCTsgbW1DPSgwNCAxNCAyNCAzNCAwNiAxNiAyNiAzNikKLQltb3ZxICAgICAgbW1HLG1tQgotCXB1bnBja2x3ZCBtbUIsbW1GCQk7IG1tQj0oMDEgMTEgMjEgMzEgMDMgMTMgMjMgMzMpCi0JcHVucGNraHdkIG1tRyxtbUYJCTsgbW1HPSgwNSAxNSAyNSAzNSAwNyAxNyAyNyAzNykKLQotCW1vdnEgICAgICBtbUQsbW1BCi0JcHVucGNrbGRxIG1tQSxtbUIJCTsgbW1BPSgwMCAxMCAyMCAzMCAwMSAxMSAyMSAzMSkKLQlwdW5wY2toZHEgbW1ELG1tQgkJOyBtbUQ9KDAyIDEyIDIyIDMyIDAzIDEzIDIzIDMzKQotCW1vdnEgICAgICBtbUgsbW1DCi0JcHVucGNrbGRxIG1tQyxtbUcJCTsgbW1DPSgwNCAxNCAyNCAzNCAwNSAxNSAyNSAzNSkKLQlwdW5wY2toZHEgbW1ILG1tRwkJOyBtbUg9KDA2IDE2IDI2IDM2IDA3IDE3IDI3IDM3KQotCi0JZGVjCWFsCQkJOyBZVmN0cgotCWp6CXNob3J0IC5ZVmxvb3BfYnJlYWsKLQotCW1vdnEJTU1XT1JEIFt3ayg2KV0sIG1tQQotCW1vdnEJTU1XT1JEIFt3ayg3KV0sIG1tRAotCW1vdnEJTU1XT1JEIFt3ayg4KV0sIG1tQwotCW1vdnEJTU1XT1JEIFt3ayg5KV0sIG1tSAotCi0Jam1wCW5lYXIgLllWbG9vcF8ybmQKLQlhbGlnbngJMTYsNwotCi0uWVZsb29wX2JyZWFrOgotCW1vdnEJbW1FLCBNTVdPUkQgW3drKDYpXQotCW1vdnEJbW1GLCBNTVdPUkQgW3drKDcpXQotCW1vdnEJbW1CLCBNTVdPUkQgW3drKDgpXQotCW1vdnEJbW1HLCBNTVdPUkQgW3drKDkpXQotCi0JY21wCWVjeCwgYnl0ZSBTSVpFT0ZfTU1XT1JECi0JamIJc2hvcnQgLmNvbHVtbl9zdDE2Ci0KLQltb3ZxCU1NV09SRCBbZXNpKzAqU0laRU9GX01NV09SRF0sIG1tRQotCW1vdnEJTU1XT1JEIFtlc2krMSpTSVpFT0ZfTU1XT1JEXSwgbW1GCi0JbW92cQlNTVdPUkQgW2VzaSsyKlNJWkVPRl9NTVdPUkRdLCBtbUIKLQltb3ZxCU1NV09SRCBbZXNpKzMqU0laRU9GX01NV09SRF0sIG1tRwotCW1vdnEJTU1XT1JEIFtlZGkrMCpTSVpFT0ZfTU1XT1JEXSwgbW1BCi0JbW92cQlNTVdPUkQgW2VkaSsxKlNJWkVPRl9NTVdPUkRdLCBtbUQKLQltb3ZxCU1NV09SRCBbZWRpKzIqU0laRU9GX01NV09SRF0sIG1tQwotCW1vdnEJTU1XT1JEIFtlZGkrMypTSVpFT0ZfTU1XT1JEXSwgbW1ICi0KLQlzdWIJZWN4LCBieXRlIFNJWkVPRl9NTVdPUkQKLQlqeglzaG9ydCAuZW5kY29sdW1uCi0KLQlhZGQJZXNpLCBieXRlIFJHQl9QSVhFTFNJWkUqU0laRU9GX01NV09SRAk7IG91dHB0cjAKLQlhZGQJZWRpLCBieXRlIFJHQl9QSVhFTFNJWkUqU0laRU9GX01NV09SRAk7IG91dHB0cjEKLQlhZGQJZWJ4LCBieXRlIFNJWkVPRl9NTVdPUkQJCQk7IGlucHRyMDAKLQlhZGQJZWR4LCBieXRlIFNJWkVPRl9NTVdPUkQJCQk7IGlucHRyMDEKLQlkZWMJYWgJCQk7IFlIY3RyCi0Jam56CW5lYXIgLllIbG9vcF8ybmQKLQotCXB1c2gJZWJ4CQkJOyBpbnB0cjAwCi0JcHVzaAllZHgJCQk7IGlucHRyMDEKLQltb3YJZWJ4LCBKU0FNUFJPVyBbaW5wdHIxXQk7IGVieD1pbnB0cjEKLQltb3YJZWR4LCBKU0FNUFJPVyBbaW5wdHIyXQk7IGVkeD1pbnB0cjIKLQlhZGQJZWJ4LCBieXRlIFNJWkVPRl9NTVdPUkQJOyBpbnB0cjEKLQlhZGQJZWR4LCBieXRlIFNJWkVPRl9NTVdPUkQJOyBpbnB0cjIKLQlqbXAJbmVhciAuY29sdW1ubG9vcAotCWFsaWdueAkxNiw3Ci0KLS5jb2x1bW5fc3QxNjoKLQljbXAJZWN4LCBieXRlIFNJWkVPRl9NTVdPUkQvMgotCWpiCXNob3J0IC5jb2x1bW5fc3Q4Ci0JbW92cQlNTVdPUkQgW2VzaSswKlNJWkVPRl9NTVdPUkRdLCBtbUUKLQltb3ZxCU1NV09SRCBbZXNpKzEqU0laRU9GX01NV09SRF0sIG1tRgotCW1vdnEJTU1XT1JEIFtlZGkrMCpTSVpFT0ZfTU1XT1JEXSwgbW1BCi0JbW92cQlNTVdPUkQgW2VkaSsxKlNJWkVPRl9NTVdPUkRdLCBtbUQKLQltb3ZxCW1tRSxtbUIKLQltb3ZxCW1tRixtbUcKLQltb3ZxCW1tQSxtbUMKLQltb3ZxCW1tRCxtbUgKLQlzdWIJZWN4LCBieXRlIFNJWkVPRl9NTVdPUkQvMgotCWFkZAllc2ksIGJ5dGUgMipTSVpFT0ZfTU1XT1JECi0JYWRkCWVkaSwgYnl0ZSAyKlNJWkVPRl9NTVdPUkQKLS5jb2x1bW5fc3Q4OgotCWNtcAllY3gsIGJ5dGUgU0laRU9GX01NV09SRC80Ci0JamIJc2hvcnQgLmNvbHVtbl9zdDQKLQltb3ZxCU1NV09SRCBbZXNpKzAqU0laRU9GX01NV09SRF0sIG1tRQotCW1vdnEJTU1XT1JEIFtlZGkrMCpTSVpFT0ZfTU1XT1JEXSwgbW1BCi0JbW92cQltbUUsbW1GCi0JbW92cQltbUEsbW1ECi0Jc3ViCWVjeCwgYnl0ZSBTSVpFT0ZfTU1XT1JELzQKLQlhZGQJZXNpLCBieXRlIDEqU0laRU9GX01NV09SRAotCWFkZAllZGksIGJ5dGUgMSpTSVpFT0ZfTU1XT1JECi0uY29sdW1uX3N0NDoKLQljbXAJZWN4LCBieXRlIFNJWkVPRl9NTVdPUkQvOAotCWpiCXNob3J0IC5lbmRjb2x1bW4KLQltb3ZkCURXT1JEIFtlc2krMCpTSVpFT0ZfRFdPUkRdLCBtbUUKLQltb3ZkCURXT1JEIFtlZGkrMCpTSVpFT0ZfRFdPUkRdLCBtbUEKLQotJWVuZGlmIDsgUkdCX1BJWEVMU0laRSA7IC0tLS0tLS0tLS0tLS0tLQotCi0uZW5kY29sdW1uOgotCWVtbXMJCTsgZW1wdHkgTU1YIHN0YXRlCi0KLS5yZXR1cm46Ci0JcG9wCWVkaQotCXBvcAllc2kKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwb3AJZWJ4Ci0JbW92CWVzcCxlYnAJCTsgZXNwIDwtIGFsaWduZWQgZWJwCi0JcG9wCWVzcAkJOyBlc3AgPC0gb3JpZ2luYWwgZWJwCi0JcG9wCWVicAotCXJldAotCi0lZW5kaWYgOyAhVVNFX0RFRElDQVRFRF9IMlYyX01FUkdFRF9VUFNBTVBMRV9NTVgKLQotJWVuZGlmIDsgSkRNRVJHRV9NTVhfU1VQUE9SVEVECi0lZW5kaWYgOyBVUFNBTVBMRV9NRVJHSU5HX1NVUFBPUlRFRAotJWVuZGlmIDsgUkdCX1BJWEVMU0laRSA9PSAzIHx8IFJHQl9QSVhFTFNJWkUgPT0gNApkaWZmIC0tZ2l0IGEvamRtZXJzczIuYXNtIGIvamRtZXJzczIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmY1MWM4Li4wMDAwMDAwCi0tLSBhL2pkbWVyc3MyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEyNzIgKzAsMCBAQAotOwotOyBqZG1lcnNzMi5hc20gLSBtZXJnZWQgdXBzYW1wbGluZy9jb2xvciBjb252ZXJzaW9uIChTU0UyKQotOwotOyB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLTsgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KLTsgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGpzaW1kZXh0LmluYwotOwotOyBUaGlzIGZpbGUgc2hvdWxkIGJlIGFzc2VtYmxlZCB3aXRoIE5BU00gKE5ldHdpZGUgQXNzZW1ibGVyKSwKLTsgY2FuICpub3QqIGJlIGFzc2VtYmxlZCB3aXRoIE1pY3Jvc29mdCdzIE1BU00gb3IgYW55IGNvbXBhdGlibGUKLTsgYXNzZW1ibGVyIChpbmNsdWRpbmcgQm9ybGFuZCdzIFR1cmJvIEFzc2VtYmxlcikuCi07IE5BU00gaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL25hc20uc291cmNlZm9yZ2UubmV0LyBvcgotOyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD02MjA4Ci07Ci07IExhc3QgTW9kaWZpZWQgOiBGZWJydWFyeSA0LCAyMDA2Ci07Ci07IFtUQUI4XQotCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotJWluY2x1ZGUgImpjb2xzYW1wLmluYyIKLQotJWlmIFJHQl9QSVhFTFNJWkUgPT0gMyB8fCBSR0JfUElYRUxTSVpFID09IDQKLSVpZmRlZiBVUFNBTVBMRV9NRVJHSU5HX1NVUFBPUlRFRAotJWlmZGVmIEpETUVSR0VfU1NFMl9TVVBQT1JURUQKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0lZGVmaW5lIFNDQUxFQklUUwkxNgotCi1GXzBfMzQ0CWVxdQkgMjI1NTQJCQk7IEZJWCgwLjM0NDE0KQotRl8wXzcxNAllcXUJIDQ2ODAyCQkJOyBGSVgoMC43MTQxNCkKLUZfMV80MDIJZXF1CSA5MTg4MQkJCTsgRklYKDEuNDAyMDApCi1GXzFfNzcyCWVxdQkxMTYxMzAJCQk7IEZJWCgxLjc3MjAwKQotRl8wXzQwMgllcXUJKEZfMV80MDIgLSA2NTUzNikJOyBGSVgoMS40MDIwMCkgLSBGSVgoMSkKLUZfMF8yODUJZXF1CSggNjU1MzYgLSBGXzBfNzE0KQk7IEZJWCgxKSAtIEZJWCgwLjcxNDE0KQotRl8wXzIyOAllcXUJKDEzMTA3MiAtIEZfMV83NzIpCTsgRklYKDIpIC0gRklYKDEuNzcyMDApCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19DT05TVAotCi0JYWxpZ256CTE2Ci0JZ2xvYmFsCUVYVE4oamNvbnN0X21lcmdlZF91cHNhbXBsZV9zc2UyKQotCi1FWFROKGpjb25zdF9tZXJnZWRfdXBzYW1wbGVfc3NlMik6Ci0KLVBXX0YwNDAyCXRpbWVzIDggZHcgIEZfMF80MDIKLVBXX01GMDIyOAl0aW1lcyA4IGR3IC1GXzBfMjI4Ci1QV19NRjAzNDRfRjAyODUJdGltZXMgNCBkdyAtRl8wXzM0NCwgRl8wXzI4NQotUFdfT05FCQl0aW1lcyA4IGR3ICAxCi1QRF9PTkVIQUxGCXRpbWVzIDQgZGQgIDEgPDwgKFNDQUxFQklUUy0xKQotCi0JYWxpZ256CTE2Ci0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19URVhUCi0JQklUUwkzMgotOwotOyBVcHNhbXBsZSBhbmQgY29sb3IgY29udmVydCBmb3IgdGhlIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDE6MSB2ZXJ0aWNhbC4KLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfaDJ2MV9tZXJnZWRfdXBzYW1wbGVfc3NlMiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1Zik7Ci07Ci0KLSVkZWZpbmUgY2luZm8oYikJCShiKSs4CQk7IGpfZGVjb21wcmVzc19wdHIgY2luZm8KLSVkZWZpbmUgaW5wdXRfYnVmKGIpCQkoYikrMTIJCTsgSlNBTVBJTUFHRSBpbnB1dF9idWYKLSVkZWZpbmUgaW5fcm93X2dyb3VwX2N0cihiKQkoYikrMTYJCTsgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyCi0lZGVmaW5lIG91dHB1dF9idWYoYikJCShiKSsyMAkJOyBKU0FNUEFSUkFZIG91dHB1dF9idWYKLQotJWRlZmluZSBvcmlnaW5hbF9lYnAJZWJwKzAKLSVkZWZpbmUgd2soaSkJCWVicC0oV0tfTlVNLShpKSkqU0laRU9GX1hNTVdPUkQJOyB4bW13b3JkIHdrW1dLX05VTV0KLSVkZWZpbmUgV0tfTlVNCQkzCi0lZGVmaW5lIGdvdHB0cgkJd2soMCktU0laRU9GX1BPSU5URVIJOyB2b2lkICogZ290cHRyCi0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfaDJ2MV9tZXJnZWRfdXBzYW1wbGVfc3NlMikKLQotRVhUTihqcGVnX2gydjFfbWVyZ2VkX3Vwc2FtcGxlX3NzZTIpOgotCXB1c2gJZWJwCi0JbW92CWVheCxlc3AJCQkJOyBlYXggPSBvcmlnaW5hbCBlYnAKLQlzdWIJZXNwLCBieXRlIDQKLQlhbmQJZXNwLCBieXRlICgtU0laRU9GX1hNTVdPUkQpCTsgYWxpZ24gdG8gMTI4IGJpdHMKLQltb3YJW2VzcF0sZWF4Ci0JbW92CWVicCxlc3AJCQkJOyBlYnAgPSBhbGlnbmVkIGVicAotCWxlYQllc3AsIFt3aygwKV0KLQlwdXNocGljCWVheAkJOyBtYWtlIGEgcm9vbSBmb3IgR09UIGFkZHJlc3MKLQlwdXNoCWVieAotOwlwdXNoCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcHVzaAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcHVzaAllc2kKLQlwdXNoCWVkaQotCi0JZ2V0X0dPVAllYngJCQk7IGdldCBHT1QgYWRkcmVzcwotCW1vdnBpYwlQT0lOVEVSIFtnb3RwdHJdLCBlYngJOyBzYXZlIEdPVCBhZGRyZXNzCi0KLQltb3YJZWN4LCBQT0lOVEVSIFtjaW5mbyhlYXgpXQotCW1vdgllY3gsIEpESU1FTlNJT04gW2pkc3RydWN0X291dHB1dF93aWR0aChlY3gpXQk7IGNvbAotCXRlc3QJZWN4LGVjeAotCWp6CW5lYXIgLnJldHVybgotCi0JcHVzaAllY3gKLQotCW1vdgllZGksIEpTQU1QSU1BR0UgW2lucHV0X2J1ZihlYXgpXQotCW1vdgllY3gsIEpESU1FTlNJT04gW2luX3Jvd19ncm91cF9jdHIoZWF4KV0KLQltb3YJZXNpLCBKU0FNUEFSUkFZIFtlZGkrMCpTSVpFT0ZfSlNBTVBBUlJBWV0KLQltb3YJZWJ4LCBKU0FNUEFSUkFZIFtlZGkrMSpTSVpFT0ZfSlNBTVBBUlJBWV0KLQltb3YJZWR4LCBKU0FNUEFSUkFZIFtlZGkrMipTSVpFT0ZfSlNBTVBBUlJBWV0KLQltb3YJZWRpLCBKU0FNUEFSUkFZIFtvdXRwdXRfYnVmKGVheCldCi0JbW92CWVzaSwgSlNBTVBST1cgW2VzaStlY3gqU0laRU9GX0pTQU1QUk9XXQkJOyBpbnB0cjAKLQltb3YJZWJ4LCBKU0FNUFJPVyBbZWJ4K2VjeCpTSVpFT0ZfSlNBTVBST1ddCQk7IGlucHRyMQotCW1vdgllZHgsIEpTQU1QUk9XIFtlZHgrZWN4KlNJWkVPRl9KU0FNUFJPV10JCTsgaW5wdHIyCi0JbW92CWVkaSwgSlNBTVBST1cgW2VkaV0JCQkJOyBvdXRwdHIKLQotCXBvcAllY3gJCQk7IGNvbAotCi0JYWxpZ254CTE2LDcKLS5jb2x1bW5sb29wOgotCW1vdnBpYwllYXgsIFBPSU5URVIgW2dvdHB0cl0JOyBsb2FkIEdPVCBhZGRyZXNzIChlYXgpCi0KLQltb3ZkcWEgICAgeG1tNiwgWE1NV09SRCBbZWJ4XQk7IHhtbTY9Q2IoMDEyMzQ1Njc4OUFCQ0RFRikKLQltb3ZkcWEgICAgeG1tNywgWE1NV09SRCBbZWR4XQk7IHhtbTc9Q3IoMDEyMzQ1Njc4OUFCQ0RFRikKLQotCXB4b3IgICAgICB4bW0xLHhtbTEJCTsgeG1tMT0oYWxsIDAncykKLQlwY21wZXF3ICAgeG1tMyx4bW0zCi0JcHNsbHcgICAgIHhtbTMsNwkJOyB4bW0zPXsweEZGODAgMHhGRjgwIDB4RkY4MCAweEZGODAgLi59Ci0KLQltb3ZkcWEgICAgeG1tNCx4bW02Ci0JcHVucGNraGJ3IHhtbTYseG1tMQkJOyB4bW02PUNiKDg5QUJDREVGKT1DYkgKLQlwdW5wY2tsYncgeG1tNCx4bW0xCQk7IHhtbTQ9Q2IoMDEyMzQ1NjcpPUNiTAotCW1vdmRxYSAgICB4bW0wLHhtbTcKLQlwdW5wY2toYncgeG1tNyx4bW0xCQk7IHhtbTc9Q3IoODlBQkNERUYpPUNySAotCXB1bnBja2xidyB4bW0wLHhtbTEJCTsgeG1tMD1DcigwMTIzNDU2Nyk9Q3JMCi0KLQlwYWRkdyAgICAgeG1tNix4bW0zCi0JcGFkZHcgICAgIHhtbTQseG1tMwotCXBhZGR3ICAgICB4bW03LHhtbTMKLQlwYWRkdyAgICAgeG1tMCx4bW0zCi0KLQk7IChPcmlnaW5hbCkKLQk7IFIgPSBZICAgICAgICAgICAgICAgICsgMS40MDIwMCAqIENyCi0JOyBHID0gWSAtIDAuMzQ0MTQgKiBDYiAtIDAuNzE0MTQgKiBDcgotCTsgQiA9IFkgKyAxLjc3MjAwICogQ2IKLQk7Ci0JOyAoVGhpcyBpbXBsZW1lbnRhdGlvbikKLQk7IFIgPSBZICAgICAgICAgICAgICAgICsgMC40MDIwMCAqIENyICsgQ3IKLQk7IEcgPSBZIC0gMC4zNDQxNCAqIENiICsgMC4yODU4NiAqIENyIC0gQ3IKLQk7IEIgPSBZIC0gMC4yMjgwMCAqIENiICsgQ2IgKyBDYgotCi0JbW92ZHFhCXhtbTUseG1tNgkJOyB4bW01PUNiSAotCW1vdmRxYQl4bW0yLHhtbTQJCTsgeG1tMj1DYkwKLQlwYWRkdwl4bW02LHhtbTYJCTsgeG1tNj0yKkNiSAotCXBhZGR3CXhtbTQseG1tNAkJOyB4bW00PTIqQ2JMCi0JbW92ZHFhCXhtbTEseG1tNwkJOyB4bW0xPUNySAotCW1vdmRxYQl4bW0zLHhtbTAJCTsgeG1tMz1DckwKLQlwYWRkdwl4bW03LHhtbTcJCTsgeG1tNz0yKkNySAotCXBhZGR3CXhtbTAseG1tMAkJOyB4bW0wPTIqQ3JMCi0KLQlwbXVsaHcJeG1tNixbR09UT0ZGKGVheCxQV19NRjAyMjgpXQk7IHhtbTY9KDIqQ2JIICogLUZJWCgwLjIyODAwKSkKLQlwbXVsaHcJeG1tNCxbR09UT0ZGKGVheCxQV19NRjAyMjgpXQk7IHhtbTQ9KDIqQ2JMICogLUZJWCgwLjIyODAwKSkKLQlwbXVsaHcJeG1tNyxbR09UT0ZGKGVheCxQV19GMDQwMildCTsgeG1tNz0oMipDckggKiBGSVgoMC40MDIwMCkpCi0JcG11bGh3CXhtbTAsW0dPVE9GRihlYXgsUFdfRjA0MDIpXQk7IHhtbTA9KDIqQ3JMICogRklYKDAuNDAyMDApKQotCi0JcGFkZHcJeG1tNixbR09UT0ZGKGVheCxQV19PTkUpXQotCXBhZGR3CXhtbTQsW0dPVE9GRihlYXgsUFdfT05FKV0KLQlwc3Jhdwl4bW02LDEJCQk7IHhtbTY9KENiSCAqIC1GSVgoMC4yMjgwMCkpCi0JcHNyYXcJeG1tNCwxCQkJOyB4bW00PShDYkwgKiAtRklYKDAuMjI4MDApKQotCXBhZGR3CXhtbTcsW0dPVE9GRihlYXgsUFdfT05FKV0KLQlwYWRkdwl4bW0wLFtHT1RPRkYoZWF4LFBXX09ORSldCi0JcHNyYXcJeG1tNywxCQkJOyB4bW03PShDckggKiBGSVgoMC40MDIwMCkpCi0JcHNyYXcJeG1tMCwxCQkJOyB4bW0wPShDckwgKiBGSVgoMC40MDIwMCkpCi0KLQlwYWRkdwl4bW02LHhtbTUKLQlwYWRkdwl4bW00LHhtbTIKLQlwYWRkdwl4bW02LHhtbTUJCTsgeG1tNj0oQ2JIICogRklYKDEuNzcyMDApKT0oQi1ZKUgKLQlwYWRkdwl4bW00LHhtbTIJCTsgeG1tND0oQ2JMICogRklYKDEuNzcyMDApKT0oQi1ZKUwKLQlwYWRkdwl4bW03LHhtbTEJCTsgeG1tNz0oQ3JIICogRklYKDEuNDAyMDApKT0oUi1ZKUgKLQlwYWRkdwl4bW0wLHhtbTMJCTsgeG1tMD0oQ3JMICogRklYKDEuNDAyMDApKT0oUi1ZKUwKLQotCW1vdmRxYQlYTU1XT1JEIFt3aygwKV0sIHhtbTYJOyB3aygwKT0oQi1ZKUgKLQltb3ZkcWEJWE1NV09SRCBbd2soMSldLCB4bW03CTsgd2soMSk9KFItWSlICi0KLQltb3ZkcWEgICAgeG1tNix4bW01Ci0JbW92ZHFhICAgIHhtbTcseG1tMgotCXB1bnBja2x3ZCB4bW01LHhtbTEKLQlwdW5wY2tod2QgeG1tNix4bW0xCi0JcG1hZGR3ZCAgIHhtbTUsW0dPVE9GRihlYXgsUFdfTUYwMzQ0X0YwMjg1KV0KLQlwbWFkZHdkICAgeG1tNixbR09UT0ZGKGVheCxQV19NRjAzNDRfRjAyODUpXQotCXB1bnBja2x3ZCB4bW0yLHhtbTMKLQlwdW5wY2tod2QgeG1tNyx4bW0zCi0JcG1hZGR3ZCAgIHhtbTIsW0dPVE9GRihlYXgsUFdfTUYwMzQ0X0YwMjg1KV0KLQlwbWFkZHdkICAgeG1tNyxbR09UT0ZGKGVheCxQV19NRjAzNDRfRjAyODUpXQotCi0JcGFkZGQgICAgIHhtbTUsW0dPVE9GRihlYXgsUERfT05FSEFMRildCi0JcGFkZGQgICAgIHhtbTYsW0dPVE9GRihlYXgsUERfT05FSEFMRildCi0JcHNyYWQgICAgIHhtbTUsU0NBTEVCSVRTCi0JcHNyYWQgICAgIHhtbTYsU0NBTEVCSVRTCi0JcGFkZGQgICAgIHhtbTIsW0dPVE9GRihlYXgsUERfT05FSEFMRildCi0JcGFkZGQgICAgIHhtbTcsW0dPVE9GRihlYXgsUERfT05FSEFMRildCi0JcHNyYWQgICAgIHhtbTIsU0NBTEVCSVRTCi0JcHNyYWQgICAgIHhtbTcsU0NBTEVCSVRTCi0KLQlwYWNrc3NkdyAgeG1tNSx4bW02CTsgeG1tNT1DYkgqLUZJWCgwLjM0NCkrQ3JIKkZJWCgwLjI4NSkKLQlwYWNrc3NkdyAgeG1tMix4bW03CTsgeG1tMj1DYkwqLUZJWCgwLjM0NCkrQ3JMKkZJWCgwLjI4NSkKLQlwc3VidyAgICAgeG1tNSx4bW0xCTsgeG1tNT1DYkgqLUZJWCgwLjM0NCkrQ3JIKi1GSVgoMC43MTQpPShHLVkpSAotCXBzdWJ3ICAgICB4bW0yLHhtbTMJOyB4bW0yPUNiTCotRklYKDAuMzQ0KStDckwqLUZJWCgwLjcxNCk9KEctWSlMCi0KLQltb3ZkcWEJWE1NV09SRCBbd2soMildLCB4bW01CTsgd2soMik9KEctWSlICi0KLQltb3YJYWwsMgkJCTsgWWN0cgotCWptcAlzaG9ydCAuWWxvb3BfMXN0Ci0JYWxpZ254CTE2LDcKLQotLllsb29wXzJuZDoKLQltb3ZkcWEJeG1tMCwgWE1NV09SRCBbd2soMSldCTsgeG1tMD0oUi1ZKUgKLQltb3ZkcWEJeG1tMiwgWE1NV09SRCBbd2soMildCTsgeG1tMj0oRy1ZKUgKLQltb3ZkcWEJeG1tNCwgWE1NV09SRCBbd2soMCldCTsgeG1tND0oQi1ZKUgKLQlhbGlnbngJMTYsNwotCi0uWWxvb3BfMXN0OgotCW1vdmRxYQl4bW03LCBYTU1XT1JEIFtlc2ldCTsgeG1tNz1ZKDAxMjM0NTY3ODlBQkNERUYpCi0KLQlwY21wZXF3CXhtbTYseG1tNgotCXBzcmx3CXhtbTYsQllURV9CSVQJCTsgeG1tNj17MHhGRiAweDAwIDB4RkYgMHgwMCAuLn0KLQlwYW5kCXhtbTYseG1tNwkJOyB4bW02PVkoMDI0NjhBQ0UpPVlFCi0JcHNybHcJeG1tNyxCWVRFX0JJVAkJOyB4bW03PVkoMTM1NzlCREYpPVlPCi0KLQltb3ZkcWEJeG1tMSx4bW0wCQk7IHhtbTE9eG1tMD0oUi1ZKShML0gpCi0JbW92ZHFhCXhtbTMseG1tMgkJOyB4bW0zPXhtbTI9KEctWSkoTC9IKQotCW1vdmRxYQl4bW01LHhtbTQJCTsgeG1tNT14bW00PShCLVkpKEwvSCkKLQotCXBhZGR3ICAgICB4bW0wLHhtbTYJCTsgeG1tMD0oKFItWSkrWUUpPVJFPVIoMDI0NjhBQ0UpCi0JcGFkZHcgICAgIHhtbTEseG1tNwkJOyB4bW0xPSgoUi1ZKStZTyk9Uk89UigxMzU3OUJERikKLQlwYWNrdXN3YiAgeG1tMCx4bW0wCQk7IHhtbTA9UigwMjQ2OEFDRSoqKioqKioqKQotCXBhY2t1c3diICB4bW0xLHhtbTEJCTsgeG1tMT1SKDEzNTc5QkRGKioqKioqKiopCi0KLQlwYWRkdyAgICAgeG1tMix4bW02CQk7IHhtbTI9KChHLVkpK1lFKT1HRT1HKDAyNDY4QUNFKQotCXBhZGR3ICAgICB4bW0zLHhtbTcJCTsgeG1tMz0oKEctWSkrWU8pPUdPPUcoMTM1NzlCREYpCi0JcGFja3Vzd2IgIHhtbTIseG1tMgkJOyB4bW0yPUcoMDI0NjhBQ0UqKioqKioqKikKLQlwYWNrdXN3YiAgeG1tMyx4bW0zCQk7IHhtbTM9RygxMzU3OUJERioqKioqKioqKQotCi0JcGFkZHcgICAgIHhtbTQseG1tNgkJOyB4bW00PSgoQi1ZKStZRSk9QkU9QigwMjQ2OEFDRSkKLQlwYWRkdyAgICAgeG1tNSx4bW03CQk7IHhtbTU9KChCLVkpK1lPKT1CTz1CKDEzNTc5QkRGKQotCXBhY2t1c3diICB4bW00LHhtbTQJCTsgeG1tND1CKDAyNDY4QUNFKioqKioqKiopCi0JcGFja3Vzd2IgIHhtbTUseG1tNQkJOyB4bW01PUIoMTM1NzlCREYqKioqKioqKikKLQotJWlmIFJHQl9QSVhFTFNJWkUgPT0gMyA7IC0tLS0tLS0tLS0tLS0tLQotCi0JOyB4bW1BPSgwMCAwMiAwNCAwNiAwOCAwQSAwQyAwRSAqKiksIHhtbUI9KDAxIDAzIDA1IDA3IDA5IDBCIDBEIDBGICoqKQotCTsgeG1tQz0oMTAgMTIgMTQgMTYgMTggMUEgMUMgMUUgKiopLCB4bW1EPSgxMSAxMyAxNSAxNyAxOSAxQiAxRCAxRiAqKikKLQk7IHhtbUU9KDIwIDIyIDI0IDI2IDI4IDJBIDJDIDJFICoqKSwgeG1tRj0oMjEgMjMgMjUgMjcgMjkgMkIgMkQgMkYgKiopCi0JOyB4bW1HPSgqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiksIHhtbUg9KCoqICoqICoqICoqICoqICoqICoqICoqICoqKQotCi0JcHVucGNrbGJ3IHhtbUEseG1tQwk7IHhtbUE9KDAwIDEwIDAyIDEyIDA0IDE0IDA2IDE2IDA4IDE4IDBBIDFBIDBDIDFDIDBFIDFFKQotCXB1bnBja2xidyB4bW1FLHhtbUIJOyB4bW1FPSgyMCAwMSAyMiAwMyAyNCAwNSAyNiAwNyAyOCAwOSAyQSAwQiAyQyAwRCAyRSAwRikKLQlwdW5wY2tsYncgeG1tRCx4bW1GCTsgeG1tRD0oMTEgMjEgMTMgMjMgMTUgMjUgMTcgMjcgMTkgMjkgMUIgMkIgMUQgMkQgMUYgMkYpCi0KLQltb3ZkcWEgICAgeG1tRyx4bW1BCi0JbW92ZHFhICAgIHhtbUgseG1tQQotCXB1bnBja2x3ZCB4bW1BLHhtbUUJOyB4bW1BPSgwMCAxMCAyMCAwMSAwMiAxMiAyMiAwMyAwNCAxNCAyNCAwNSAwNiAxNiAyNiAwNykKLQlwdW5wY2tod2QgeG1tRyx4bW1FCTsgeG1tRz0oMDggMTggMjggMDkgMEEgMUEgMkEgMEIgMEMgMUMgMkMgMEQgMEUgMUUgMkUgMEYpCi0KLQlwc3JsZHEgICAgeG1tSCwyCTsgeG1tSD0oMDIgMTIgMDQgMTQgMDYgMTYgMDggMTggMEEgMUEgMEMgMUMgMEUgMUUgLS0gLS0pCi0JcHNybGRxICAgIHhtbUUsMgk7IHhtbUU9KDIyIDAzIDI0IDA1IDI2IDA3IDI4IDA5IDJBIDBCIDJDIDBEIDJFIDBGIC0tIC0tKQotCi0JbW92ZHFhICAgIHhtbUMseG1tRAotCW1vdmRxYSAgICB4bW1CLHhtbUQKLQlwdW5wY2tsd2QgeG1tRCx4bW1ICTsgeG1tRD0oMTEgMjEgMDIgMTIgMTMgMjMgMDQgMTQgMTUgMjUgMDYgMTYgMTcgMjcgMDggMTgpCi0JcHVucGNraHdkIHhtbUMseG1tSAk7IHhtbUM9KDE5IDI5IDBBIDFBIDFCIDJCIDBDIDFDIDFEIDJEIDBFIDFFIDFGIDJGIC0tIC0tKQotCi0JcHNybGRxICAgIHhtbUIsMgk7IHhtbUI9KDEzIDIzIDE1IDI1IDE3IDI3IDE5IDI5IDFCIDJCIDFEIDJEIDFGIDJGIC0tIC0tKQotCi0JbW92ZHFhICAgIHhtbUYseG1tRQotCXB1bnBja2x3ZCB4bW1FLHhtbUIJOyB4bW1FPSgyMiAwMyAxMyAyMyAyNCAwNSAxNSAyNSAyNiAwNyAxNyAyNyAyOCAwOSAxOSAyOSkKLQlwdW5wY2tod2QgeG1tRix4bW1CCTsgeG1tRj0oMkEgMEIgMUIgMkIgMkMgMEQgMUQgMkQgMkUgMEYgMUYgMkYgLS0gLS0gLS0gLS0pCi0KLQlwc2h1ZmQgICAgeG1tSCx4bW1BLDB4NEU7IHhtbUg9KDA0IDE0IDI0IDA1IDA2IDE2IDI2IDA3IDAwIDEwIDIwIDAxIDAyIDEyIDIyIDAzKQotCW1vdmRxYSAgICB4bW1CLHhtbUUKLQlwdW5wY2tsZHEgeG1tQSx4bW1ECTsgeG1tQT0oMDAgMTAgMjAgMDEgMTEgMjEgMDIgMTIgMDIgMTIgMjIgMDMgMTMgMjMgMDQgMTQpCi0JcHVucGNrbGRxIHhtbUUseG1tSAk7IHhtbUU9KDIyIDAzIDEzIDIzIDA0IDE0IDI0IDA1IDI0IDA1IDE1IDI1IDA2IDE2IDI2IDA3KQotCXB1bnBja2hkcSB4bW1ELHhtbUIJOyB4bW1EPSgxNSAyNSAwNiAxNiAyNiAwNyAxNyAyNyAxNyAyNyAwOCAxOCAyOCAwOSAxOSAyOSkKLQotCXBzaHVmZCAgICB4bW1ILHhtbUcsMHg0RTsgeG1tSD0oMEMgMUMgMkMgMEQgMEUgMUUgMkUgMEYgMDggMTggMjggMDkgMEEgMUEgMkEgMEIpCi0JbW92ZHFhICAgIHhtbUIseG1tRgotCXB1bnBja2xkcSB4bW1HLHhtbUMJOyB4bW1HPSgwOCAxOCAyOCAwOSAxOSAyOSAwQSAxQSAwQSAxQSAyQSAwQiAxQiAyQiAwQyAxQykKLQlwdW5wY2tsZHEgeG1tRix4bW1ICTsgeG1tRj0oMkEgMEIgMUIgMkIgMEMgMUMgMkMgMEQgMkMgMEQgMUQgMkQgMEUgMUUgMkUgMEYpCi0JcHVucGNraGRxIHhtbUMseG1tQgk7IHhtbUM9KDFEIDJEIDBFIDFFIDJFIDBGIDFGIDJGIDFGIDJGIC0tIC0tIC0tIC0tIC0tIC0tKQotCi0JcHVucGNrbHFkcSB4bW1BLHhtbUUJOyB4bW1BPSgwMCAxMCAyMCAwMSAxMSAyMSAwMiAxMiAyMiAwMyAxMyAyMyAwNCAxNCAyNCAwNSkKLQlwdW5wY2tscWRxIHhtbUQseG1tRwk7IHhtbUQ9KDE1IDI1IDA2IDE2IDI2IDA3IDE3IDI3IDA4IDE4IDI4IDA5IDE5IDI5IDBBIDFBKQotCXB1bnBja2xxZHEgeG1tRix4bW1DCTsgeG1tRj0oMkEgMEIgMUIgMkIgMEMgMUMgMkMgMEQgMUQgMkQgMEUgMUUgMkUgMEYgMUYgMkYpCi0KLQljbXAJZWN4LCBieXRlIFNJWkVPRl9YTU1XT1JECi0JamIJc2hvcnQgLmNvbHVtbl9zdDMyCi0KLQl0ZXN0CWVkaSwgU0laRU9GX1hNTVdPUkQtMQotCWpueglzaG9ydCAub3V0MQotCTsgLS0oYWxpZ25lZCktLS0tLS0tLS0tLS0tLS0tLS0tCi0JbW92bnRkcQlYTU1XT1JEIFtlZGkrMCpTSVpFT0ZfWE1NV09SRF0sIHhtbUEKLQltb3ZudGRxCVhNTVdPUkQgW2VkaSsxKlNJWkVPRl9YTU1XT1JEXSwgeG1tRAotCW1vdm50ZHEJWE1NV09SRCBbZWRpKzIqU0laRU9GX1hNTVdPUkRdLCB4bW1GCi0JYWRkCWVkaSwgYnl0ZSBSR0JfUElYRUxTSVpFKlNJWkVPRl9YTU1XT1JECTsgb3V0cHRyCi0Jam1wCXNob3J0IC5vdXQwCi0ub3V0MToJOyAtLSh1bmFsaWduZWQpLS0tLS0tLS0tLS0tLS0tLS0KLQlwY21wZXFiICAgIHhtbUgseG1tSAkJCTsgeG1tSD0oYWxsIDEncykKLQltYXNrbW92ZHF1IHhtbUEseG1tSAkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tQQotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIKLQltYXNrbW92ZHF1IHhtbUQseG1tSAkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tRAotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIKLQltYXNrbW92ZHF1IHhtbUYseG1tSAkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tRgotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIKLS5vdXQwOgotCXN1YgllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQKLQlqegluZWFyIC5lbmRjb2x1bW4KLQotCWFkZAllc2ksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBpbnB0cjAKLQlkZWMJYWwJCQk7IFljdHIKLQlqbnoJbmVhciAuWWxvb3BfMm5kCi0KLQlhZGQJZWJ4LCBieXRlIFNJWkVPRl9YTU1XT1JECTsgaW5wdHIxCi0JYWRkCWVkeCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAk7IGlucHRyMgotCWptcAluZWFyIC5jb2x1bW5sb29wCi0JYWxpZ254CTE2LDcKLQotLmNvbHVtbl9zdDMyOgotCXBjbXBlcWIJeG1tSCx4bW1ICQkJOyB4bW1IPShhbGwgMSdzKQotCWxlYQllY3gsIFtlY3grZWN4KjJdCQk7IGltdWwgZWN4LCBSR0JfUElYRUxTSVpFCi0JY21wCWVjeCwgYnl0ZSAyKlNJWkVPRl9YTU1XT1JECi0JamIJc2hvcnQgLmNvbHVtbl9zdDE2Ci0JbWFza21vdmRxdSB4bW1BLHhtbUgJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUEKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyCi0JbWFza21vdmRxdSB4bW1ELHhtbUgJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUQKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyCi0JbW92ZHFhCXhtbUEseG1tRgotCXN1YgllY3gsIGJ5dGUgMipTSVpFT0ZfWE1NV09SRAotCWptcAlzaG9ydCAuY29sdW1uX3N0MTUKLS5jb2x1bW5fc3QxNjoKLQljbXAJZWN4LCBieXRlIFNJWkVPRl9YTU1XT1JECi0JamIJc2hvcnQgLmNvbHVtbl9zdDE1Ci0JbWFza21vdmRxdSB4bW1BLHhtbUgJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUEKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyCi0JbW92ZHFhCXhtbUEseG1tRAotCXN1YgllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQKLS5jb2x1bW5fc3QxNToKLQltb3YJZWF4LGVjeAotCXhvcgllY3gsIGJ5dGUgMHgwRgotCXNobAllY3gsIDIKLQltb3ZkCXhtbUIsZWN4Ci0JcHNybHEJeG1tSCw0Ci0JcGNtcGVxYgl4bW1FLHhtbUUKLQlwc3JscQl4bW1ILHhtbUIKLQlwc3JscQl4bW1FLHhtbUIKLQlwdW5wY2tsYncgeG1tRSx4bW1ICi0JOyAtLS0tLS0tLS0tLS0tLS0tCi0JbW92CWVjeCxlZGkKLQlhbmQJZWN4LCBieXRlIFNJWkVPRl9YTU1XT1JELTEKLQlqeglzaG9ydCAuYWRqMAotCWFkZAllYXgsZWN4Ci0JY21wCWVheCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAotCWphCXNob3J0IC5hZGowCi0JYW5kCWVkaSwgYnl0ZSAoLVNJWkVPRl9YTU1XT1JEKQk7IGFsaWduIHRvIDE2LWJ5dGUgYm91bmRhcnkKLQlzaGwJZWN4LCAzCQkJOyBwc2xsZHEgeG1tQSxlY3ggJiBwc2xsZHEgeG1tRSxlY3gKLQltb3ZkcWEJeG1tRyx4bW1BCi0JbW92ZHFhCXhtbUMseG1tRQotCXBzbGxkcQl4bW1BLCBTSVpFT0ZfWE1NV09SRC8yCi0JcHNsbGRxCXhtbUUsIFNJWkVPRl9YTU1XT1JELzIKLQltb3ZkCXhtbUQsZWN4Ci0Jc3ViCWVjeCwgYnl0ZSAoU0laRU9GX1hNTVdPUkQvMikqQllURV9CSVQKLQlqYglzaG9ydCAuYWRqMQotCW1vdmQJeG1tRixlY3gKLQlwc2xscQl4bW1BLHhtbUYKLQlwc2xscQl4bW1FLHhtbUYKLQlqbXAJc2hvcnQgLmFkajAKLS5hZGoxOgluZWcJZWN4Ci0JbW92ZAl4bW1GLGVjeAotCXBzcmxxCXhtbUEseG1tRgotCXBzcmxxCXhtbUUseG1tRgotCXBzbGxxCXhtbUcseG1tRAotCXBzbGxxCXhtbUMseG1tRAotCXBvcgl4bW1BLHhtbUcKLQlwb3IJeG1tRSx4bW1DCi0uYWRqMDoJOyAtLS0tLS0tLS0tLS0tLS0tCi0JbWFza21vdmRxdSB4bW1BLHhtbUUJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUEKLQotJWVsc2UgOyBSR0JfUElYRUxTSVpFID09IDQgOyAtLS0tLS0tLS0tLQotCi0laWZkZWYgUkdCWF9GSUxMRVJfMFhGRgotCXBjbXBlcWIgICB4bW02LHhtbTYJCTsgeG1tNj1YRT1YKDAyNDY4QUNFKioqKioqKiopCi0JcGNtcGVxYiAgIHhtbTcseG1tNwkJOyB4bW03PVhPPVgoMTM1NzlCREYqKioqKioqKikKLSVlbHNlCi0JcHhvciAgICAgIHhtbTYseG1tNgkJOyB4bW02PVhFPVgoMDI0NjhBQ0UqKioqKioqKikKLQlweG9yICAgICAgeG1tNyx4bW03CQk7IHhtbTc9WE89WCgxMzU3OUJERioqKioqKioqKQotJWVuZGlmCi0JOyB4bW1BPSgwMCAwMiAwNCAwNiAwOCAwQSAwQyAwRSAqKiksIHhtbUI9KDAxIDAzIDA1IDA3IDA5IDBCIDBEIDBGICoqKQotCTsgeG1tQz0oMTAgMTIgMTQgMTYgMTggMUEgMUMgMUUgKiopLCB4bW1EPSgxMSAxMyAxNSAxNyAxOSAxQiAxRCAxRiAqKikKLQk7IHhtbUU9KDIwIDIyIDI0IDI2IDI4IDJBIDJDIDJFICoqKSwgeG1tRj0oMjEgMjMgMjUgMjcgMjkgMkIgMkQgMkYgKiopCi0JOyB4bW1HPSgzMCAzMiAzNCAzNiAzOCAzQSAzQyAzRSAqKiksIHhtbUg9KDMxIDMzIDM1IDM3IDM5IDNCIDNEIDNGICoqKQotCi0JcHVucGNrbGJ3IHhtbUEseG1tQwk7IHhtbUE9KDAwIDEwIDAyIDEyIDA0IDE0IDA2IDE2IDA4IDE4IDBBIDFBIDBDIDFDIDBFIDFFKQotCXB1bnBja2xidyB4bW1FLHhtbUcJOyB4bW1FPSgyMCAzMCAyMiAzMiAyNCAzNCAyNiAzNiAyOCAzOCAyQSAzQSAyQyAzQyAyRSAzRSkKLQlwdW5wY2tsYncgeG1tQix4bW1ECTsgeG1tQj0oMDEgMTEgMDMgMTMgMDUgMTUgMDcgMTcgMDkgMTkgMEIgMUIgMEQgMUQgMEYgMUYpCi0JcHVucGNrbGJ3IHhtbUYseG1tSAk7IHhtbUY9KDIxIDMxIDIzIDMzIDI1IDM1IDI3IDM3IDI5IDM5IDJCIDNCIDJEIDNEIDJGIDNGKQotCi0JbW92ZHFhICAgIHhtbUMseG1tQQotCXB1bnBja2x3ZCB4bW1BLHhtbUUJOyB4bW1BPSgwMCAxMCAyMCAzMCAwMiAxMiAyMiAzMiAwNCAxNCAyNCAzNCAwNiAxNiAyNiAzNikKLQlwdW5wY2tod2QgeG1tQyx4bW1FCTsgeG1tQz0oMDggMTggMjggMzggMEEgMUEgMkEgM0EgMEMgMUMgMkMgM0MgMEUgMUUgMkUgM0UpCi0JbW92ZHFhICAgIHhtbUcseG1tQgotCXB1bnBja2x3ZCB4bW1CLHhtbUYJOyB4bW1CPSgwMSAxMSAyMSAzMSAwMyAxMyAyMyAzMyAwNSAxNSAyNSAzNSAwNyAxNyAyNyAzNykKLQlwdW5wY2tod2QgeG1tRyx4bW1GCTsgeG1tRz0oMDkgMTkgMjkgMzkgMEIgMUIgMkIgM0IgMEQgMUQgMkQgM0QgMEYgMUYgMkYgM0YpCi0KLQltb3ZkcWEgICAgeG1tRCx4bW1BCi0JcHVucGNrbGRxIHhtbUEseG1tQgk7IHhtbUE9KDAwIDEwIDIwIDMwIDAxIDExIDIxIDMxIDAyIDEyIDIyIDMyIDAzIDEzIDIzIDMzKQotCXB1bnBja2hkcSB4bW1ELHhtbUIJOyB4bW1EPSgwNCAxNCAyNCAzNCAwNSAxNSAyNSAzNSAwNiAxNiAyNiAzNiAwNyAxNyAyNyAzNykKLQltb3ZkcWEgICAgeG1tSCx4bW1DCi0JcHVucGNrbGRxIHhtbUMseG1tRwk7IHhtbUM9KDA4IDE4IDI4IDM4IDA5IDE5IDI5IDM5IDBBIDFBIDJBIDNBIDBCIDFCIDJCIDNCKQotCXB1bnBja2hkcSB4bW1ILHhtbUcJOyB4bW1IPSgwQyAxQyAyQyAzQyAwRCAxRCAyRCAzRCAwRSAxRSAyRSAzRSAwRiAxRiAyRiAzRikKLQotCWNtcAllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQKLQlqYglzaG9ydCAuY29sdW1uX3N0MzIKLQotCXRlc3QJZWRpLCBTSVpFT0ZfWE1NV09SRC0xCi0Jam56CXNob3J0IC5vdXQxCi0JOyAtLShhbGlnbmVkKS0tLS0tLS0tLS0tLS0tLS0tLS0KLQltb3ZudGRxCVhNTVdPUkQgW2VkaSswKlNJWkVPRl9YTU1XT1JEXSwgeG1tQQotCW1vdm50ZHEJWE1NV09SRCBbZWRpKzEqU0laRU9GX1hNTVdPUkRdLCB4bW1ECi0JbW92bnRkcQlYTU1XT1JEIFtlZGkrMipTSVpFT0ZfWE1NV09SRF0sIHhtbUMKLQltb3ZudGRxCVhNTVdPUkQgW2VkaSszKlNJWkVPRl9YTU1XT1JEXSwgeG1tSAotCWFkZAllZGksIGJ5dGUgUkdCX1BJWEVMU0laRSpTSVpFT0ZfWE1NV09SRAk7IG91dHB0cgotCWptcAlzaG9ydCAub3V0MAotLm91dDE6CTsgLS0odW5hbGlnbmVkKS0tLS0tLS0tLS0tLS0tLS0tCi0JcGNtcGVxYiAgICB4bW1FLHhtbUUJCQk7IHhtbUU9KGFsbCAxJ3MpCi0JbWFza21vdmRxdSB4bW1BLHhtbUUJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUEKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyCi0JbWFza21vdmRxdSB4bW1ELHhtbUUJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUQKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyCi0JbWFza21vdmRxdSB4bW1DLHhtbUUJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUMKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyCi0JbWFza21vdmRxdSB4bW1ILHhtbUUJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUgKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyCi0ub3V0MDoKLQlzdWIJZWN4LCBieXRlIFNJWkVPRl9YTU1XT1JECi0JanoJbmVhciAuZW5kY29sdW1uCi0KLQlhZGQJZXNpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgaW5wdHIwCi0JZGVjCWFsCQkJOyBZY3RyCi0Jam56CW5lYXIgLllsb29wXzJuZAotCi0JYWRkCWVieCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAk7IGlucHRyMQotCWFkZAllZHgsIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBpbnB0cjIKLQlqbXAJbmVhciAuY29sdW1ubG9vcAotCWFsaWdueAkxNiw3Ci0KLS5jb2x1bW5fc3QzMjoKLQlwY21wZXFiCXhtbUUseG1tRQkJCTsgeG1tRT0oYWxsIDEncykKLQljbXAJZWN4LCBieXRlIFNJWkVPRl9YTU1XT1JELzIKLQlqYglzaG9ydCAuY29sdW1uX3N0MTYKLQltYXNrbW92ZHF1IHhtbUEseG1tRQkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tQQotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIKLQltYXNrbW92ZHF1IHhtbUQseG1tRQkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tRAotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIKLQltb3ZkcWEJeG1tQSx4bW1DCi0JbW92ZHFhCXhtbUQseG1tSAotCXN1YgllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQvMgotLmNvbHVtbl9zdDE2OgotCWNtcAllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQvNAotCWpiCXNob3J0IC5jb2x1bW5fc3QxNQotCW1hc2ttb3ZkcXUgeG1tQSx4bW1FCQkJOyBtb3ZudGRxdSBYTU1XT1JEIFtlZGldLCB4bW1BCi0JYWRkCWVkaSwgYnl0ZSBTSVpFT0ZfWE1NV09SRAk7IG91dHB0cgotCW1vdmRxYQl4bW1BLHhtbUQKLQlzdWIJZWN4LCBieXRlIFNJWkVPRl9YTU1XT1JELzQKLS5jb2x1bW5fc3QxNToKLQljbXAJZWN4LCBieXRlIFNJWkVPRl9YTU1XT1JELzE2Ci0JamIJc2hvcnQgLmVuZGNvbHVtbgotCW1vdgllYXgsZWN4Ci0JeG9yCWVjeCwgYnl0ZSAweDAzCi0JaW5jCWVjeAotCXNobAllY3gsIDQKLQltb3ZkCXhtbUYsZWN4Ci0JcHNybHEJeG1tRSx4bW1GCi0JcHVucGNrbGJ3IHhtbUUseG1tRQotCTsgLS0tLS0tLS0tLS0tLS0tLQotCW1vdgllY3gsZWRpCi0JYW5kCWVjeCwgYnl0ZSBTSVpFT0ZfWE1NV09SRC0xCi0JanoJc2hvcnQgLmFkajAKLQlsZWEJZWF4LCBbZWN4K2VheCo0XQk7IFJHQl9QSVhFTFNJWkUKLQljbXAJZWF4LCBieXRlIFNJWkVPRl9YTU1XT1JECi0JamEJc2hvcnQgLmFkajAKLQlhbmQJZWRpLCBieXRlICgtU0laRU9GX1hNTVdPUkQpCTsgYWxpZ24gdG8gMTYtYnl0ZSBib3VuZGFyeQotCXNobAllY3gsIDMJCQk7IHBzbGxkcSB4bW1BLGVjeCAmIHBzbGxkcSB4bW1FLGVjeAotCW1vdmRxYQl4bW1CLHhtbUEKLQltb3ZkcWEJeG1tRyx4bW1FCi0JcHNsbGRxCXhtbUEsIFNJWkVPRl9YTU1XT1JELzIKLQlwc2xsZHEJeG1tRSwgU0laRU9GX1hNTVdPUkQvMgotCW1vdmQJeG1tQyxlY3gKLQlzdWIJZWN4LCBieXRlIChTSVpFT0ZfWE1NV09SRC8yKSpCWVRFX0JJVAotCWpiCXNob3J0IC5hZGoxCi0JbW92ZAl4bW1ILGVjeAotCXBzbGxxCXhtbUEseG1tSAotCXBzbGxxCXhtbUUseG1tSAotCWptcAlzaG9ydCAuYWRqMAotLmFkajE6CW5lZwllY3gKLQltb3ZkCXhtbUgsZWN4Ci0JcHNybHEJeG1tQSx4bW1ICi0JcHNybHEJeG1tRSx4bW1ICi0JcHNsbHEJeG1tQix4bW1DCi0JcHNsbHEJeG1tRyx4bW1DCi0JcG9yCXhtbUEseG1tQgotCXBvcgl4bW1FLHhtbUcKLS5hZGowOgk7IC0tLS0tLS0tLS0tLS0tLS0KLQltYXNrbW92ZHF1IHhtbUEseG1tRQkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tQQotCi0lZW5kaWYgOyBSR0JfUElYRUxTSVpFIDsgLS0tLS0tLS0tLS0tLS0tCi0KLS5lbmRjb2x1bW46Ci0Jc2ZlbmNlCQk7IGZsdXNoIHRoZSB3cml0ZSBidWZmZXIKLQotLnJldHVybjoKLQlwb3AJZWRpCi0JcG9wCWVzaQotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXBvcAllYngKLQltb3YJZXNwLGVicAkJOyBlc3AgPC0gYWxpZ25lZCBlYnAKLQlwb3AJZXNwCQk7IGVzcCA8LSBvcmlnaW5hbCBlYnAKLQlwb3AJZWJwCi0JcmV0Ci0KLSVpZm5kZWYgVVNFX0RFRElDQVRFRF9IMlYyX01FUkdFRF9VUFNBTVBMRV9TU0UyCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsKLTsgVXBzYW1wbGUgYW5kIGNvbG9yIGNvbnZlcnQgZm9yIHRoZSBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAyOjEgdmVydGljYWwuCi07Ci07IEdMT0JBTCh2b2lkKQotOyBqcGVnX2gydjJfbWVyZ2VkX3Vwc2FtcGxlX3NzZTIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYpOwotOwotCi0lZGVmaW5lIGNpbmZvKGIpCQkoYikrOAkJOyBqX2RlY29tcHJlc3NfcHRyIGNpbmZvCi0lZGVmaW5lIGlucHV0X2J1ZihiKQkJKGIpKzEyCQk7IEpTQU1QSU1BR0UgaW5wdXRfYnVmCi0lZGVmaW5lIGluX3Jvd19ncm91cF9jdHIoYikJKGIpKzE2CQk7IEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0cgotJWRlZmluZSBvdXRwdXRfYnVmKGIpCQkoYikrMjAJCTsgSlNBTVBBUlJBWSBvdXRwdXRfYnVmCi0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfaDJ2Ml9tZXJnZWRfdXBzYW1wbGVfc3NlMikKLQotRVhUTihqcGVnX2gydjJfbWVyZ2VkX3Vwc2FtcGxlX3NzZTIpOgotCXB1c2gJZWJwCi0JbW92CWVicCxlc3AKLQlwdXNoCWVieAotOwlwdXNoCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcHVzaAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcHVzaAllc2kKLQlwdXNoCWVkaQotCi0JbW92CWVheCwgUE9JTlRFUiBbY2luZm8oZWJwKV0KLQotCW1vdgllZGksIEpTQU1QSU1BR0UgW2lucHV0X2J1ZihlYnApXQotCW1vdgllY3gsIEpESU1FTlNJT04gW2luX3Jvd19ncm91cF9jdHIoZWJwKV0KLQltb3YJZXNpLCBKU0FNUEFSUkFZIFtlZGkrMCpTSVpFT0ZfSlNBTVBBUlJBWV0KLQltb3YJZWJ4LCBKU0FNUEFSUkFZIFtlZGkrMSpTSVpFT0ZfSlNBTVBBUlJBWV0KLQltb3YJZWR4LCBKU0FNUEFSUkFZIFtlZGkrMipTSVpFT0ZfSlNBTVBBUlJBWV0KLQltb3YJZWRpLCBKU0FNUEFSUkFZIFtvdXRwdXRfYnVmKGVicCldCi0JbGVhCWVzaSwgW2VzaStlY3gqU0laRU9GX0pTQU1QUk9XXQotCi0JcHVzaAllZHgJCQk7IGlucHRyMgotCXB1c2gJZWJ4CQkJOyBpbnB0cjEKLQlwdXNoCWVzaQkJCTsgaW5wdHIwMAotCW1vdgllYngsZXNwCi0KLQlwdXNoCWVkaQkJCTsgb3V0cHV0X2J1ZiAob3V0cHRyMCkKLQlwdXNoCWVjeAkJCTsgaW5fcm93X2dyb3VwX2N0cgotCXB1c2gJZWJ4CQkJOyBpbnB1dF9idWYKLQlwdXNoCWVheAkJCTsgY2luZm8KLQotCWNhbGwJbmVhciBFWFROKGpwZWdfaDJ2MV9tZXJnZWRfdXBzYW1wbGVfc3NlMikKLQotCWFkZAllc2ksIGJ5dGUgU0laRU9GX0pTQU1QUk9XCTsgaW5wdHIwMQotCWFkZAllZGksIGJ5dGUgU0laRU9GX0pTQU1QUk9XCTsgb3V0cHRyMQotCW1vdglQT0lOVEVSIFtlYngrMCpTSVpFT0ZfUE9JTlRFUl0sIGVzaQotCW1vdglQT0lOVEVSIFtlYngtMSpTSVpFT0ZfUE9JTlRFUl0sIGVkaQotCi0JY2FsbAluZWFyIEVYVE4oanBlZ19oMnYxX21lcmdlZF91cHNhbXBsZV9zc2UyKQotCi0JYWRkCWVzcCwgYnl0ZSA3KlNJWkVPRl9EV09SRAotCi0JcG9wCWVkaQotCXBvcAllc2kKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwb3AJZWJ4Ci0JcG9wCWVicAotCXJldAotCi0lZWxzZSAgOyBVU0VfREVESUNBVEVEX0gyVjJfTUVSR0VEX1VQU0FNUExFX1NTRTIKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOwotOyBVcHNhbXBsZSBhbmQgY29sb3IgY29udmVydCBmb3IgdGhlIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDI6MSB2ZXJ0aWNhbC4KLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfaDJ2Ml9tZXJnZWRfdXBzYW1wbGVfc3NlMiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1Zik7Ci07Ci0KLSVkZWZpbmUgY2luZm8oYikJCShiKSs4CQk7IGpfZGVjb21wcmVzc19wdHIgY2luZm8KLSVkZWZpbmUgaW5wdXRfYnVmKGIpCQkoYikrMTIJCTsgSlNBTVBJTUFHRSBpbnB1dF9idWYKLSVkZWZpbmUgaW5fcm93X2dyb3VwX2N0cihiKQkoYikrMTYJCTsgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyCi0lZGVmaW5lIG91dHB1dF9idWYoYikJCShiKSsyMAkJOyBKU0FNUEFSUkFZIG91dHB1dF9idWYKLQotJWRlZmluZSBvcmlnaW5hbF9lYnAJZWJwKzAKLSVkZWZpbmUgd2soaSkJCWVicC0oV0tfTlVNLShpKSkqU0laRU9GX1hNTVdPUkQJOyB4bW13b3JkIHdrW1dLX05VTV0KLSVkZWZpbmUgV0tfTlVNCQkxMAotJWRlZmluZSBpbnB0cjEJCXdrKDApLVNJWkVPRl9KU0FNUFJPVwk7IEpTQU1QUk9XIGlucHRyMQotJWRlZmluZSBpbnB0cjIJCWlucHRyMS1TSVpFT0ZfSlNBTVBST1cJOyBKU0FNUFJPVyBpbnB0cjIKLSVkZWZpbmUgZ290cHRyCQlpbnB0cjItU0laRU9GX1BPSU5URVIJOyB2b2lkICogZ290cHRyCi0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfaDJ2Ml9tZXJnZWRfdXBzYW1wbGVfc3NlMikKLQotRVhUTihqcGVnX2gydjJfbWVyZ2VkX3Vwc2FtcGxlX3NzZTIpOgotCXB1c2gJZWJwCi0JbW92CWVheCxlc3AJCQkJOyBlYXggPSBvcmlnaW5hbCBlYnAKLQlzdWIJZXNwLCBieXRlIDQKLQlhbmQJZXNwLCBieXRlICgtU0laRU9GX1hNTVdPUkQpCTsgYWxpZ24gdG8gMTI4IGJpdHMKLQltb3YJW2VzcF0sZWF4Ci0JbW92CWVicCxlc3AJCQkJOyBlYnAgPSBhbGlnbmVkIGVicAotCWxlYQllc3AsIFtpbnB0cjJdCi0JcHVzaHBpYwllYXgJCTsgbWFrZSBhIHJvb20gZm9yIEdPVCBhZGRyZXNzCi0JcHVzaAllYngKLTsJcHVzaAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXB1c2gJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXB1c2gJZXNpCi0JcHVzaAllZGkKLQotCWdldF9HT1QJZWJ4CQkJOyBnZXQgR09UIGFkZHJlc3MKLQltb3ZwaWMJUE9JTlRFUiBbZ290cHRyXSwgZWJ4CTsgc2F2ZSBHT1QgYWRkcmVzcwotCi0JbW92CWVjeCwgUE9JTlRFUiBbY2luZm8oZWF4KV0KLQltb3YJZWN4LCBKRElNRU5TSU9OIFtqZHN0cnVjdF9vdXRwdXRfd2lkdGgoZWN4KV0JOyBjb2wKLQl0ZXN0CWVjeCxlY3gKLQlqegluZWFyIC5yZXR1cm4KLQotCXB1c2gJZWN4Ci0KLQltb3YJZWRpLCBKU0FNUElNQUdFIFtpbnB1dF9idWYoZWF4KV0KLQltb3YJZWN4LCBKRElNRU5TSU9OIFtpbl9yb3dfZ3JvdXBfY3RyKGVheCldCi0JbW92CWVzaSwgSlNBTVBBUlJBWSBbZWRpKzAqU0laRU9GX0pTQU1QQVJSQVldCi0JbW92CWVieCwgSlNBTVBBUlJBWSBbZWRpKzEqU0laRU9GX0pTQU1QQVJSQVldCi0JbW92CWVkeCwgSlNBTVBBUlJBWSBbZWRpKzIqU0laRU9GX0pTQU1QQVJSQVldCi0JbW92CWVkaSwgSlNBTVBBUlJBWSBbb3V0cHV0X2J1ZihlYXgpXQotCW1vdgllYXgsIEpTQU1QUk9XIFtlc2krKGVjeCoyKzApKlNJWkVPRl9KU0FNUFJPV10JOyBpbnB0cjAwCi0JbW92CWVzaSwgSlNBTVBST1cgW2VzaSsoZWN4KjIrMSkqU0laRU9GX0pTQU1QUk9XXQk7IGlucHRyMDEKLQltb3YJZWJ4LCBKU0FNUFJPVyBbZWJ4K2VjeCpTSVpFT0ZfSlNBTVBST1ddCQk7IGlucHRyMQotCW1vdgllZHgsIEpTQU1QUk9XIFtlZHgrZWN4KlNJWkVPRl9KU0FNUFJPV10JCTsgaW5wdHIyCi0KLQlwb3AJZWN4CQk7IGNvbAotCXB1c2gJZWF4CQk7IGlucHRyMDAKLQlwdXNoCWVzaQkJOyBpbnB0cjAxCi0KLQltb3YJZXNpLCBKU0FNUFJPVyBbZWRpKzAqU0laRU9GX0pTQU1QUk9XXQkJOyBvdXRwdHIwCi0JbW92CWVkaSwgSlNBTVBST1cgW2VkaSsxKlNJWkVPRl9KU0FNUFJPV10JCTsgb3V0cHRyMQotCWFsaWdueAkxNiw3Ci0uY29sdW1ubG9vcDoKLQltb3ZwaWMJZWF4LCBQT0lOVEVSIFtnb3RwdHJdCTsgbG9hZCBHT1QgYWRkcmVzcyAoZWF4KQotCi0JbW92ZHFhCXhtbTYsIFhNTVdPUkQgW2VieF0JOyB4bW02PUNiKDAxMjM0NTY3ODlBQkNERUYpCi0JbW92ZHFhCXhtbTcsIFhNTVdPUkQgW2VkeF0JOyB4bW03PUNyKDAxMjM0NTY3ODlBQkNERUYpCi0KLQltb3YJSlNBTVBST1cgW2lucHRyMV0sIGVieAk7IGlucHRyMQotCW1vdglKU0FNUFJPVyBbaW5wdHIyXSwgZWR4CTsgaW5wdHIyCi0JcG9wCWVkeAkJCTsgZWR4PWlucHRyMDEKLQlwb3AJZWJ4CQkJOyBlYng9aW5wdHIwMAotCi0JcHhvciAgICAgIHhtbTEseG1tMQkJOyB4bW0xPShhbGwgMCdzKQotCXBjbXBlcXcgICB4bW0zLHhtbTMKLQlwc2xsdyAgICAgeG1tMyw3CQk7IHhtbTM9ezB4RkY4MCAweEZGODAgMHhGRjgwIDB4RkY4MCAuLn0KLQotCW1vdmRxYSAgICB4bW00LHhtbTYKLQlwdW5wY2toYncgeG1tNix4bW0xCQk7IHhtbTY9Q2IoODlBQkNERUYpPUNiSAotCXB1bnBja2xidyB4bW00LHhtbTEJCTsgeG1tND1DYigwMTIzNDU2Nyk9Q2JMCi0JbW92ZHFhICAgIHhtbTAseG1tNwotCXB1bnBja2hidyB4bW03LHhtbTEJCTsgeG1tNz1Dcig4OUFCQ0RFRik9Q3JICi0JcHVucGNrbGJ3IHhtbTAseG1tMQkJOyB4bW0wPUNyKDAxMjM0NTY3KT1DckwKLQotCXBhZGR3ICAgICB4bW02LHhtbTMKLQlwYWRkdyAgICAgeG1tNCx4bW0zCi0JcGFkZHcgICAgIHhtbTcseG1tMwotCXBhZGR3ICAgICB4bW0wLHhtbTMKLQotCTsgKE9yaWdpbmFsKQotCTsgUiA9IFkgICAgICAgICAgICAgICAgKyAxLjQwMjAwICogQ3IKLQk7IEcgPSBZIC0gMC4zNDQxNCAqIENiIC0gMC43MTQxNCAqIENyCi0JOyBCID0gWSArIDEuNzcyMDAgKiBDYgotCTsKLQk7IChUaGlzIGltcGxlbWVudGF0aW9uKQotCTsgUiA9IFkgICAgICAgICAgICAgICAgKyAwLjQwMjAwICogQ3IgKyBDcgotCTsgRyA9IFkgLSAwLjM0NDE0ICogQ2IgKyAwLjI4NTg2ICogQ3IgLSBDcgotCTsgQiA9IFkgLSAwLjIyODAwICogQ2IgKyBDYiArIENiCi0KLQltb3ZkcWEJeG1tNSx4bW02CQk7IHhtbTU9Q2JICi0JbW92ZHFhCXhtbTIseG1tNAkJOyB4bW0yPUNiTAotCXBhZGR3CXhtbTYseG1tNgkJOyB4bW02PTIqQ2JICi0JcGFkZHcJeG1tNCx4bW00CQk7IHhtbTQ9MipDYkwKLQltb3ZkcWEJeG1tMSx4bW03CQk7IHhtbTE9Q3JICi0JbW92ZHFhCXhtbTMseG1tMAkJOyB4bW0zPUNyTAotCXBhZGR3CXhtbTcseG1tNwkJOyB4bW03PTIqQ3JICi0JcGFkZHcJeG1tMCx4bW0wCQk7IHhtbTA9MipDckwKLQotCXBtdWxodwl4bW02LFtHT1RPRkYoZWF4LFBXX01GMDIyOCldCTsgeG1tNj0oMipDYkggKiAtRklYKDAuMjI4MDApKQotCXBtdWxodwl4bW00LFtHT1RPRkYoZWF4LFBXX01GMDIyOCldCTsgeG1tND0oMipDYkwgKiAtRklYKDAuMjI4MDApKQotCXBtdWxodwl4bW03LFtHT1RPRkYoZWF4LFBXX0YwNDAyKV0JOyB4bW03PSgyKkNySCAqIEZJWCgwLjQwMjAwKSkKLQlwbXVsaHcJeG1tMCxbR09UT0ZGKGVheCxQV19GMDQwMildCTsgeG1tMD0oMipDckwgKiBGSVgoMC40MDIwMCkpCi0KLQlwYWRkdwl4bW02LFtHT1RPRkYoZWF4LFBXX09ORSldCi0JcGFkZHcJeG1tNCxbR09UT0ZGKGVheCxQV19PTkUpXQotCXBzcmF3CXhtbTYsMQkJCTsgeG1tNj0oQ2JIICogLUZJWCgwLjIyODAwKSkKLQlwc3Jhdwl4bW00LDEJCQk7IHhtbTQ9KENiTCAqIC1GSVgoMC4yMjgwMCkpCi0JcGFkZHcJeG1tNyxbR09UT0ZGKGVheCxQV19PTkUpXQotCXBhZGR3CXhtbTAsW0dPVE9GRihlYXgsUFdfT05FKV0KLQlwc3Jhdwl4bW03LDEJCQk7IHhtbTc9KENySCAqIEZJWCgwLjQwMjAwKSkKLQlwc3Jhdwl4bW0wLDEJCQk7IHhtbTA9KENyTCAqIEZJWCgwLjQwMjAwKSkKLQotCXBhZGR3CXhtbTYseG1tNQotCXBhZGR3CXhtbTQseG1tMgotCXBhZGR3CXhtbTYseG1tNQkJOyB4bW02PShDYkggKiBGSVgoMS43NzIwMCkpPShCLVkpSAotCXBhZGR3CXhtbTQseG1tMgkJOyB4bW00PShDYkwgKiBGSVgoMS43NzIwMCkpPShCLVkpTAotCXBhZGR3CXhtbTcseG1tMQkJOyB4bW03PShDckggKiBGSVgoMS40MDIwMCkpPShSLVkpSAotCXBhZGR3CXhtbTAseG1tMwkJOyB4bW0wPShDckwgKiBGSVgoMS40MDIwMCkpPShSLVkpTAotCi0JbW92ZHFhCVhNTVdPUkQgW3drKDApXSwgeG1tNgk7IHdrKDApPShCLVkpSAotCW1vdmRxYQlYTU1XT1JEIFt3aygxKV0sIHhtbTcJOyB3aygxKT0oUi1ZKUgKLQotCW1vdmRxYSAgICB4bW02LHhtbTUKLQltb3ZkcWEgICAgeG1tNyx4bW0yCi0JcHVucGNrbHdkIHhtbTUseG1tMQotCXB1bnBja2h3ZCB4bW02LHhtbTEKLQlwbWFkZHdkICAgeG1tNSxbR09UT0ZGKGVheCxQV19NRjAzNDRfRjAyODUpXQotCXBtYWRkd2QgICB4bW02LFtHT1RPRkYoZWF4LFBXX01GMDM0NF9GMDI4NSldCi0JcHVucGNrbHdkIHhtbTIseG1tMwotCXB1bnBja2h3ZCB4bW03LHhtbTMKLQlwbWFkZHdkICAgeG1tMixbR09UT0ZGKGVheCxQV19NRjAzNDRfRjAyODUpXQotCXBtYWRkd2QgICB4bW03LFtHT1RPRkYoZWF4LFBXX01GMDM0NF9GMDI4NSldCi0KLQlwYWRkZCAgICAgeG1tNSxbR09UT0ZGKGVheCxQRF9PTkVIQUxGKV0KLQlwYWRkZCAgICAgeG1tNixbR09UT0ZGKGVheCxQRF9PTkVIQUxGKV0KLQlwc3JhZCAgICAgeG1tNSxTQ0FMRUJJVFMKLQlwc3JhZCAgICAgeG1tNixTQ0FMRUJJVFMKLQlwYWRkZCAgICAgeG1tMixbR09UT0ZGKGVheCxQRF9PTkVIQUxGKV0KLQlwYWRkZCAgICAgeG1tNyxbR09UT0ZGKGVheCxQRF9PTkVIQUxGKV0KLQlwc3JhZCAgICAgeG1tMixTQ0FMRUJJVFMKLQlwc3JhZCAgICAgeG1tNyxTQ0FMRUJJVFMKLQotCXBhY2tzc2R3ICB4bW01LHhtbTYJOyB4bW01PUNiSCotRklYKDAuMzQ0KStDckgqRklYKDAuMjg1KQotCXBhY2tzc2R3ICB4bW0yLHhtbTcJOyB4bW0yPUNiTCotRklYKDAuMzQ0KStDckwqRklYKDAuMjg1KQotCXBzdWJ3ICAgICB4bW01LHhtbTEJOyB4bW01PUNiSCotRklYKDAuMzQ0KStDckgqLUZJWCgwLjcxNCk9KEctWSlICi0JcHN1YncgICAgIHhtbTIseG1tMwk7IHhtbTI9Q2JMKi1GSVgoMC4zNDQpK0NyTCotRklYKDAuNzE0KT0oRy1ZKUwKLQotCW1vdmRxYQlYTU1XT1JEIFt3aygyKV0sIHhtbTUJOyB3aygyKT0oRy1ZKUgKLQotCW1vdglhaCwyCQkJOyBZSGN0cgotCWptcAlzaG9ydCAuWUhsb29wXzFzdAotCWFsaWdueAkxNiw3Ci0KLS5ZSGxvb3BfMm5kOgotCW1vdmRxYQl4bW0wLCBYTU1XT1JEIFt3aygxKV0JOyB4bW0wPShSLVkpSAotCW1vdmRxYQl4bW0yLCBYTU1XT1JEIFt3aygyKV0JOyB4bW0yPShHLVkpSAotCW1vdmRxYQl4bW00LCBYTU1XT1JEIFt3aygwKV0JOyB4bW00PShCLVkpSAotCWFsaWdueAkxNiw3Ci0KLS5ZSGxvb3BfMXN0OgotCW1vdmRxYQlYTU1XT1JEIFt3aygzKV0sIHhtbTAJOyB3aygzKT0oUi1ZKShML0gpCi0JbW92ZHFhCVhNTVdPUkQgW3drKDQpXSwgeG1tMgk7IHdrKDQpPShHLVkpKEwvSCkKLQltb3ZkcWEJWE1NV09SRCBbd2soNSldLCB4bW00CTsgd2soNSk9KEItWSkoTC9IKQotCi0JbW92ZHFhCXhtbTcsIFhNTVdPUkQgW2VieF0JOyB4bW03PVkoMDEyMzQ1Njc4OUFCQ0RFRikKLQotCW1vdglhbCwyCQkJOyBZVmN0cgotCWptcAlzaG9ydCAuWVZsb29wXzFzdAotCWFsaWdueAkxNiw3Ci0KLS5ZVmxvb3BfMm5kOgotCW1vdmRxYQl4bW0wLCBYTU1XT1JEIFt3aygzKV0JOyB4bW0wPShSLVkpKEwvSCkKLQltb3ZkcWEJeG1tMiwgWE1NV09SRCBbd2soNCldCTsgeG1tMj0oRy1ZKShML0gpCi0JbW92ZHFhCXhtbTQsIFhNTVdPUkQgW3drKDUpXQk7IHhtbTQ9KEItWSkoTC9IKQotCi0JbW92ZHFhCXhtbTcsIFhNTVdPUkQgW2VkeF0JOyB4bW03PVkoMDEyMzQ1Njc4OUFCQ0RFRikKLQlhbGlnbngJMTYsNwotCi0uWVZsb29wXzFzdDoKLQlwY21wZXF3CXhtbTYseG1tNgotCXBzcmx3CXhtbTYsQllURV9CSVQJCTsgeG1tNj17MHhGRiAweDAwIDB4RkYgMHgwMCAuLn0KLQlwYW5kCXhtbTYseG1tNwkJOyB4bW02PVkoMDI0NjhBQ0UpPVlFCi0JcHNybHcJeG1tNyxCWVRFX0JJVAkJOyB4bW03PVkoMTM1NzlCREYpPVlPCi0KLQltb3ZkcWEJeG1tMSx4bW0wCQk7IHhtbTE9eG1tMD0oUi1ZKShML0gpCi0JbW92ZHFhCXhtbTMseG1tMgkJOyB4bW0zPXhtbTI9KEctWSkoTC9IKQotCW1vdmRxYQl4bW01LHhtbTQJCTsgeG1tNT14bW00PShCLVkpKEwvSCkKLQotCXBhZGR3ICAgICB4bW0wLHhtbTYJCTsgeG1tMD0oKFItWSkrWUUpPVJFPVIoMDI0NjhBQ0UpCi0JcGFkZHcgICAgIHhtbTEseG1tNwkJOyB4bW0xPSgoUi1ZKStZTyk9Uk89UigxMzU3OUJERikKLQlwYWNrdXN3YiAgeG1tMCx4bW0wCQk7IHhtbTA9UigwMjQ2OEFDRSoqKioqKioqKQotCXBhY2t1c3diICB4bW0xLHhtbTEJCTsgeG1tMT1SKDEzNTc5QkRGKioqKioqKiopCi0KLQlwYWRkdyAgICAgeG1tMix4bW02CQk7IHhtbTI9KChHLVkpK1lFKT1HRT1HKDAyNDY4QUNFKQotCXBhZGR3ICAgICB4bW0zLHhtbTcJCTsgeG1tMz0oKEctWSkrWU8pPUdPPUcoMTM1NzlCREYpCi0JcGFja3Vzd2IgIHhtbTIseG1tMgkJOyB4bW0yPUcoMDI0NjhBQ0UqKioqKioqKikKLQlwYWNrdXN3YiAgeG1tMyx4bW0zCQk7IHhtbTM9RygxMzU3OUJERioqKioqKioqKQotCi0JcGFkZHcgICAgIHhtbTQseG1tNgkJOyB4bW00PSgoQi1ZKStZRSk9QkU9QigwMjQ2OEFDRSkKLQlwYWRkdyAgICAgeG1tNSx4bW03CQk7IHhtbTU9KChCLVkpK1lPKT1CTz1CKDEzNTc5QkRGKQotCXBhY2t1c3diICB4bW00LHhtbTQJCTsgeG1tND1CKDAyNDY4QUNFKioqKioqKiopCi0JcGFja3Vzd2IgIHhtbTUseG1tNQkJOyB4bW01PUIoMTM1NzlCREYqKioqKioqKikKLQotJWlmIFJHQl9QSVhFTFNJWkUgPT0gMyA7IC0tLS0tLS0tLS0tLS0tLQotCi0JOyB4bW1BPSgwMCAwMiAwNCAwNiAwOCAwQSAwQyAwRSAqKiksIHhtbUI9KDAxIDAzIDA1IDA3IDA5IDBCIDBEIDBGICoqKQotCTsgeG1tQz0oMTAgMTIgMTQgMTYgMTggMUEgMUMgMUUgKiopLCB4bW1EPSgxMSAxMyAxNSAxNyAxOSAxQiAxRCAxRiAqKikKLQk7IHhtbUU9KDIwIDIyIDI0IDI2IDI4IDJBIDJDIDJFICoqKSwgeG1tRj0oMjEgMjMgMjUgMjcgMjkgMkIgMkQgMkYgKiopCi0JOyB4bW1HPSgqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiksIHhtbUg9KCoqICoqICoqICoqICoqICoqICoqICoqICoqKQotCi0JcHVucGNrbGJ3IHhtbUEseG1tQwk7IHhtbUE9KDAwIDEwIDAyIDEyIDA0IDE0IDA2IDE2IDA4IDE4IDBBIDFBIDBDIDFDIDBFIDFFKQotCXB1bnBja2xidyB4bW1FLHhtbUIJOyB4bW1FPSgyMCAwMSAyMiAwMyAyNCAwNSAyNiAwNyAyOCAwOSAyQSAwQiAyQyAwRCAyRSAwRikKLQlwdW5wY2tsYncgeG1tRCx4bW1GCTsgeG1tRD0oMTEgMjEgMTMgMjMgMTUgMjUgMTcgMjcgMTkgMjkgMUIgMkIgMUQgMkQgMUYgMkYpCi0KLQltb3ZkcWEgICAgeG1tRyx4bW1BCi0JbW92ZHFhICAgIHhtbUgseG1tQQotCXB1bnBja2x3ZCB4bW1BLHhtbUUJOyB4bW1BPSgwMCAxMCAyMCAwMSAwMiAxMiAyMiAwMyAwNCAxNCAyNCAwNSAwNiAxNiAyNiAwNykKLQlwdW5wY2tod2QgeG1tRyx4bW1FCTsgeG1tRz0oMDggMTggMjggMDkgMEEgMUEgMkEgMEIgMEMgMUMgMkMgMEQgMEUgMUUgMkUgMEYpCi0KLQlwc3JsZHEgICAgeG1tSCwyCTsgeG1tSD0oMDIgMTIgMDQgMTQgMDYgMTYgMDggMTggMEEgMUEgMEMgMUMgMEUgMUUgLS0gLS0pCi0JcHNybGRxICAgIHhtbUUsMgk7IHhtbUU9KDIyIDAzIDI0IDA1IDI2IDA3IDI4IDA5IDJBIDBCIDJDIDBEIDJFIDBGIC0tIC0tKQotCi0JbW92ZHFhICAgIHhtbUMseG1tRAotCW1vdmRxYSAgICB4bW1CLHhtbUQKLQlwdW5wY2tsd2QgeG1tRCx4bW1ICTsgeG1tRD0oMTEgMjEgMDIgMTIgMTMgMjMgMDQgMTQgMTUgMjUgMDYgMTYgMTcgMjcgMDggMTgpCi0JcHVucGNraHdkIHhtbUMseG1tSAk7IHhtbUM9KDE5IDI5IDBBIDFBIDFCIDJCIDBDIDFDIDFEIDJEIDBFIDFFIDFGIDJGIC0tIC0tKQotCi0JcHNybGRxICAgIHhtbUIsMgk7IHhtbUI9KDEzIDIzIDE1IDI1IDE3IDI3IDE5IDI5IDFCIDJCIDFEIDJEIDFGIDJGIC0tIC0tKQotCi0JbW92ZHFhICAgIHhtbUYseG1tRQotCXB1bnBja2x3ZCB4bW1FLHhtbUIJOyB4bW1FPSgyMiAwMyAxMyAyMyAyNCAwNSAxNSAyNSAyNiAwNyAxNyAyNyAyOCAwOSAxOSAyOSkKLQlwdW5wY2tod2QgeG1tRix4bW1CCTsgeG1tRj0oMkEgMEIgMUIgMkIgMkMgMEQgMUQgMkQgMkUgMEYgMUYgMkYgLS0gLS0gLS0gLS0pCi0KLQlwc2h1ZmQgICAgeG1tSCx4bW1BLDB4NEU7IHhtbUg9KDA0IDE0IDI0IDA1IDA2IDE2IDI2IDA3IDAwIDEwIDIwIDAxIDAyIDEyIDIyIDAzKQotCW1vdmRxYSAgICB4bW1CLHhtbUUKLQlwdW5wY2tsZHEgeG1tQSx4bW1ECTsgeG1tQT0oMDAgMTAgMjAgMDEgMTEgMjEgMDIgMTIgMDIgMTIgMjIgMDMgMTMgMjMgMDQgMTQpCi0JcHVucGNrbGRxIHhtbUUseG1tSAk7IHhtbUU9KDIyIDAzIDEzIDIzIDA0IDE0IDI0IDA1IDI0IDA1IDE1IDI1IDA2IDE2IDI2IDA3KQotCXB1bnBja2hkcSB4bW1ELHhtbUIJOyB4bW1EPSgxNSAyNSAwNiAxNiAyNiAwNyAxNyAyNyAxNyAyNyAwOCAxOCAyOCAwOSAxOSAyOSkKLQotCXBzaHVmZCAgICB4bW1ILHhtbUcsMHg0RTsgeG1tSD0oMEMgMUMgMkMgMEQgMEUgMUUgMkUgMEYgMDggMTggMjggMDkgMEEgMUEgMkEgMEIpCi0JbW92ZHFhICAgIHhtbUIseG1tRgotCXB1bnBja2xkcSB4bW1HLHhtbUMJOyB4bW1HPSgwOCAxOCAyOCAwOSAxOSAyOSAwQSAxQSAwQSAxQSAyQSAwQiAxQiAyQiAwQyAxQykKLQlwdW5wY2tsZHEgeG1tRix4bW1ICTsgeG1tRj0oMkEgMEIgMUIgMkIgMEMgMUMgMkMgMEQgMkMgMEQgMUQgMkQgMEUgMUUgMkUgMEYpCi0JcHVucGNraGRxIHhtbUMseG1tQgk7IHhtbUM9KDFEIDJEIDBFIDFFIDJFIDBGIDFGIDJGIDFGIDJGIC0tIC0tIC0tIC0tIC0tIC0tKQotCi0JcHVucGNrbHFkcSB4bW1BLHhtbUUJOyB4bW1BPSgwMCAxMCAyMCAwMSAxMSAyMSAwMiAxMiAyMiAwMyAxMyAyMyAwNCAxNCAyNCAwNSkKLQlwdW5wY2tscWRxIHhtbUQseG1tRwk7IHhtbUQ9KDE1IDI1IDA2IDE2IDI2IDA3IDE3IDI3IDA4IDE4IDI4IDA5IDE5IDI5IDBBIDFBKQotCXB1bnBja2xxZHEgeG1tRix4bW1DCTsgeG1tRj0oMkEgMEIgMUIgMkIgMEMgMUMgMkMgMEQgMUQgMkQgMEUgMUUgMkUgMEYgMUYgMkYpCi0KLQlkZWMJYWwJCQk7IFlWY3RyCi0JanoJc2hvcnQgLllWbG9vcF9icmVhawotCi0JbW92ZHFhCVhNTVdPUkQgW3drKDYpXSwgeG1tQQotCW1vdmRxYQlYTU1XT1JEIFt3ayg3KV0sIHhtbUQKLQltb3ZkcWEJWE1NV09SRCBbd2soOCldLCB4bW1GCi0KLQlqbXAJbmVhciAuWVZsb29wXzJuZAotCWFsaWdueAkxNiw3Ci0KLS5ZVmxvb3BfYnJlYWs6Ci0JbW92ZHFhCXhtbUgsIFhNTVdPUkQgW3drKDYpXQotCW1vdmRxYQl4bW1CLCBYTU1XT1JEIFt3ayg3KV0KLQltb3ZkcWEJeG1tRSwgWE1NV09SRCBbd2soOCldCi0KLQlwY21wZXFiCXhtbUcseG1tRwk7IHhtbUc9KGFsbCAxJ3MpCi0KLQljbXAJZWN4LCBieXRlIFNJWkVPRl9YTU1XT1JECi0JamIJbmVhciAuY29sdW1uX3N0MzIKLQotCXRlc3QJZWRpLCBTSVpFT0ZfWE1NV09SRC0xCi0Jam56CXNob3J0IC5vdXQwMQotCTsgLS0oYWxpZ25lZCktLS0tLS0tLS0tLS0tLS0tLS0tCi0JbW92bnRkcQlYTU1XT1JEIFtlZGkrMCpTSVpFT0ZfWE1NV09SRF0sIHhtbUEKLQltb3ZudGRxCVhNTVdPUkQgW2VkaSsxKlNJWkVPRl9YTU1XT1JEXSwgeG1tRAotCW1vdm50ZHEJWE1NV09SRCBbZWRpKzIqU0laRU9GX1hNTVdPUkRdLCB4bW1GCi0JYWRkCWVkaSwgYnl0ZSBSR0JfUElYRUxTSVpFKlNJWkVPRl9YTU1XT1JECTsgb3V0cHRyMQotCWptcAlzaG9ydCAub3V0MDAKLS5vdXQwMToJOyAtLSh1bmFsaWduZWQpLS0tLS0tLS0tLS0tLS0tLS0KLQltYXNrbW92ZHF1IHhtbUEseG1tRwkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tQQotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIxCi0JbWFza21vdmRxdSB4bW1ELHhtbUcJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUQKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyMQotCW1hc2ttb3ZkcXUgeG1tRix4bW1HCQkJOyBtb3ZudGRxdSBYTU1XT1JEIFtlZGldLCB4bW1GCi0JYWRkCWVkaSwgYnl0ZSBTSVpFT0ZfWE1NV09SRAk7IG91dHB0cjEKLS5vdXQwMDoKLQl0ZXN0CWVzaSwgU0laRU9GX1hNTVdPUkQtMQotCWpueglzaG9ydCAub3V0MTEKLQk7IC0tKGFsaWduZWQpLS0tLS0tLS0tLS0tLS0tLS0tLQotCW1vdm50ZHEJWE1NV09SRCBbZXNpKzAqU0laRU9GX1hNTVdPUkRdLCB4bW1ICi0JbW92bnRkcQlYTU1XT1JEIFtlc2krMSpTSVpFT0ZfWE1NV09SRF0sIHhtbUIKLQltb3ZudGRxCVhNTVdPUkQgW2VzaSsyKlNJWkVPRl9YTU1XT1JEXSwgeG1tRQotCWFkZAllc2ksIGJ5dGUgUkdCX1BJWEVMU0laRSpTSVpFT0ZfWE1NV09SRAk7IG91dHB0cjAKLQlqbXAJc2hvcnQgLm91dDEwCi0ub3V0MTE6CTsgLS0odW5hbGlnbmVkKS0tLS0tLS0tLS0tLS0tLS0tCi0JeGNoZwllZGksZXNpCQkJCTsgZWRpPW91dHB0cjAsIGVzaT1vdXRwdHIxCi0JbWFza21vdmRxdSB4bW1ILHhtbUcJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUgKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyMAotCW1hc2ttb3ZkcXUgeG1tQix4bW1HCQkJOyBtb3ZudGRxdSBYTU1XT1JEIFtlZGldLCB4bW1CCi0JYWRkCWVkaSwgYnl0ZSBTSVpFT0ZfWE1NV09SRAk7IG91dHB0cjAKLQltYXNrbW92ZHF1IHhtbUUseG1tRwkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tRQotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIwCi0JeGNoZwllZGksZXNpCQkJCTsgZWRpPW91dHB0cjEsIGVzaT1vdXRwdHIwCi0ub3V0MTA6Ci0Jc3ViCWVjeCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAotCWp6CW5lYXIgLmVuZGNvbHVtbgotCi0JYWRkCWVieCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAk7IGlucHRyMDAKLQlhZGQJZWR4LCBieXRlIFNJWkVPRl9YTU1XT1JECTsgaW5wdHIwMQotCWRlYwlhaAkJCTsgWUhjdHIKLQlqbnoJbmVhciAuWUhsb29wXzJuZAotCi0JcHVzaAllYngJCQkJOyBpbnB0cjAwCi0JcHVzaAllZHgJCQkJOyBpbnB0cjAxCi0JbW92CWVieCwgSlNBTVBST1cgW2lucHRyMV0JCTsgZWJ4PWlucHRyMQotCW1vdgllZHgsIEpTQU1QUk9XIFtpbnB0cjJdCQk7IGVkeD1pbnB0cjIKLQlhZGQJZWJ4LCBieXRlIFNJWkVPRl9YTU1XT1JECTsgaW5wdHIxCi0JYWRkCWVkeCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAk7IGlucHRyMgotCWptcAluZWFyIC5jb2x1bW5sb29wCi0JYWxpZ254CTE2LDcKLQotLmNvbHVtbl9zdDMyOgotCWxlYQllY3gsIFtlY3grZWN4KjJdCQk7IGltdWwgZWN4LCBSR0JfUElYRUxTSVpFCi0JY21wCWVjeCwgYnl0ZSAyKlNJWkVPRl9YTU1XT1JECi0JamIJc2hvcnQgLmNvbHVtbl9zdDE2Ci0JbWFza21vdmRxdSB4bW1BLHhtbUcJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUEKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyMQotCW1hc2ttb3ZkcXUgeG1tRCx4bW1HCQkJOyBtb3ZudGRxdSBYTU1XT1JEIFtlZGldLCB4bW1ECi0JYWRkCWVkaSwgYnl0ZSBTSVpFT0ZfWE1NV09SRAk7IG91dHB0cjEKLQl4Y2hnCWVkaSxlc2kJCQkJOyBlZGk9b3V0cHRyMCwgZXNpPW91dHB0cjEKLQltYXNrbW92ZHF1IHhtbUgseG1tRwkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tSAotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIwCi0JbWFza21vdmRxdSB4bW1CLHhtbUcJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUIKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyMAotCXhjaGcJZWRpLGVzaQkJCQk7IGVkaT1vdXRwdHIxLCBlc2k9b3V0cHRyMAotCW1vdmRxYQl4bW1BLHhtbUYKLQltb3ZkcWEJeG1tSCx4bW1FCi0Jc3ViCWVjeCwgYnl0ZSAyKlNJWkVPRl9YTU1XT1JECi0Jam1wCXNob3J0IC5jb2x1bW5fc3QxNQotLmNvbHVtbl9zdDE2OgotCWNtcAllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQKLQlqYglzaG9ydCAuY29sdW1uX3N0MTUKLQltYXNrbW92ZHF1IHhtbUEseG1tRwkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tQQotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIxCi0JeGNoZwllZGksZXNpCQkJCTsgZWRpPW91dHB0cjAsIGVzaT1vdXRwdHIxCi0JbWFza21vdmRxdSB4bW1ILHhtbUcJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUgKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyMAotCXhjaGcJZWRpLGVzaQkJCQk7IGVkaT1vdXRwdHIxLCBlc2k9b3V0cHRyMAotCW1vdmRxYQl4bW1BLHhtbUQKLQltb3ZkcWEJeG1tSCx4bW1CCi0Jc3ViCWVjeCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAotLmNvbHVtbl9zdDE1OgotCW1vdgllZHgsZWN4Ci0JeG9yCWVjeCwgYnl0ZSAweDBGCi0Jc2hsCWVjeCwgMgotCW1vdmQJeG1tQyxlY3gKLQlwc3JscQl4bW1HLDQKLQlwY21wZXFiCXhtbUQseG1tRAotCXBzcmxxCXhtbUcseG1tQwotCXBzcmxxCXhtbUQseG1tQwotCXB1bnBja2xidyB4bW1ELHhtbUcKLQltb3ZkcWEgICAgeG1tQix4bW1ECi0JOyA9PT09PT09PT09PT09PT09Ci0JbW92CWVjeCxlZGkKLQlhbmQJZWN4LCBieXRlIFNJWkVPRl9YTU1XT1JELTEKLQlqeglzaG9ydCAuYWRqMGEKLQlsZWEJZWF4LCBbZWN4K2VkeF0KLQljbXAJZWF4LCBieXRlIFNJWkVPRl9YTU1XT1JECi0JamEJc2hvcnQgLmFkajBhCi0JYW5kCWVkaSwgYnl0ZSAoLVNJWkVPRl9YTU1XT1JEKQk7IGFsaWduIHRvIDE2LWJ5dGUgYm91bmRhcnkKLQlzaGwJZWN4LCAzCQkJOyBwc2xsZHEgeG1tQSxlY3ggJiBwc2xsZHEgeG1tRCxlY3gKLQltb3ZkcWEJeG1tRix4bW1BCi0JbW92ZHFhCXhtbUUseG1tRAotCXBzbGxkcQl4bW1BLCBTSVpFT0ZfWE1NV09SRC8yCi0JcHNsbGRxCXhtbUQsIFNJWkVPRl9YTU1XT1JELzIKLQltb3ZkCXhtbUMsZWN4Ci0Jc3ViCWVjeCwgYnl0ZSAoU0laRU9GX1hNTVdPUkQvMikqQllURV9CSVQKLQlqYglzaG9ydCAuYWRqMWEKLQltb3ZkCXhtbUcsZWN4Ci0JcHNsbHEJeG1tQSx4bW1HCi0JcHNsbHEJeG1tRCx4bW1HCi0Jam1wCXNob3J0IC5hZGowYQotLmFkajFhOgluZWcJZWN4Ci0JbW92ZAl4bW1HLGVjeAotCXBzcmxxCXhtbUEseG1tRwotCXBzcmxxCXhtbUQseG1tRwotCXBzbGxxCXhtbUYseG1tQwotCXBzbGxxCXhtbUUseG1tQwotCXBvcgl4bW1BLHhtbUYKLQlwb3IJeG1tRCx4bW1FCi0uYWRqMGE6CTsgLS0tLS0tLS0tLS0tLS0tLQotCW1hc2ttb3ZkcXUgeG1tQSx4bW1ECQkJOyBtb3ZudGRxdSBYTU1XT1JEIFtlZGldLCB4bW1BCi0JeGNoZwllZGksZXNpCQkJCTsgZWRpPW91dHB0cjAsIGVzaT1vdXRwdHIxCi0JOyA9PT09PT09PT09PT09PT09Ci0JbW92CWVjeCxlZGkKLQlhbmQJZWN4LCBieXRlIFNJWkVPRl9YTU1XT1JELTEKLQlqeglzaG9ydCAuYWRqMGIKLQlsZWEJZWF4LCBbZWN4K2VkeF0KLQljbXAJZWF4LCBieXRlIFNJWkVPRl9YTU1XT1JECi0JamEJc2hvcnQgLmFkajBiCi0JYW5kCWVkaSwgYnl0ZSAoLVNJWkVPRl9YTU1XT1JEKQk7IGFsaWduIHRvIDE2LWJ5dGUgYm91bmRhcnkKLQlzaGwJZWN4LCAzCQkJOyBwc2xsZHEgeG1tSCxlY3ggJiBwc2xsZHEgeG1tQixlY3gKLQltb3ZkcWEJeG1tRyx4bW1ICi0JbW92ZHFhCXhtbUMseG1tQgotCXBzbGxkcQl4bW1ILCBTSVpFT0ZfWE1NV09SRC8yCi0JcHNsbGRxCXhtbUIsIFNJWkVPRl9YTU1XT1JELzIKLQltb3ZkCXhtbUYsZWN4Ci0Jc3ViCWVjeCwgYnl0ZSAoU0laRU9GX1hNTVdPUkQvMikqQllURV9CSVQKLQlqYglzaG9ydCAuYWRqMWIKLQltb3ZkCXhtbUUsZWN4Ci0JcHNsbHEJeG1tSCx4bW1FCi0JcHNsbHEJeG1tQix4bW1FCi0Jam1wCXNob3J0IC5hZGowYgotLmFkajFiOgluZWcJZWN4Ci0JbW92ZAl4bW1FLGVjeAotCXBzcmxxCXhtbUgseG1tRQotCXBzcmxxCXhtbUIseG1tRQotCXBzbGxxCXhtbUcseG1tRgotCXBzbGxxCXhtbUMseG1tRgotCXBvcgl4bW1ILHhtbUcKLQlwb3IJeG1tQix4bW1DCi0uYWRqMGI6CTsgLS0tLS0tLS0tLS0tLS0tLQotCW1hc2ttb3ZkcXUgeG1tSCx4bW1CCQkJOyBtb3ZudGRxdSBYTU1XT1JEIFtlZGldLCB4bW1ICi0KLSVlbHNlIDsgUkdCX1BJWEVMU0laRSA9PSA0IDsgLS0tLS0tLS0tLS0KLQotJWlmZGVmIFJHQlhfRklMTEVSXzBYRkYKLQlwY21wZXFiICAgeG1tNix4bW02CQk7IHhtbTY9WEU9WCgwMjQ2OEFDRSoqKioqKioqKQotCXBjbXBlcWIgICB4bW03LHhtbTcJCTsgeG1tNz1YTz1YKDEzNTc5QkRGKioqKioqKiopCi0lZWxzZQotCXB4b3IgICAgICB4bW02LHhtbTYJCTsgeG1tNj1YRT1YKDAyNDY4QUNFKioqKioqKiopCi0JcHhvciAgICAgIHhtbTcseG1tNwkJOyB4bW03PVhPPVgoMTM1NzlCREYqKioqKioqKikKLSVlbmRpZgotCTsgeG1tQT0oMDAgMDIgMDQgMDYgMDggMEEgMEMgMEUgKiopLCB4bW1CPSgwMSAwMyAwNSAwNyAwOSAwQiAwRCAwRiAqKikKLQk7IHhtbUM9KDEwIDEyIDE0IDE2IDE4IDFBIDFDIDFFICoqKSwgeG1tRD0oMTEgMTMgMTUgMTcgMTkgMUIgMUQgMUYgKiopCi0JOyB4bW1FPSgyMCAyMiAyNCAyNiAyOCAyQSAyQyAyRSAqKiksIHhtbUY9KDIxIDIzIDI1IDI3IDI5IDJCIDJEIDJGICoqKQotCTsgeG1tRz0oMzAgMzIgMzQgMzYgMzggM0EgM0MgM0UgKiopLCB4bW1IPSgzMSAzMyAzNSAzNyAzOSAzQiAzRCAzRiAqKikKLQotCXB1bnBja2xidyB4bW1BLHhtbUMJOyB4bW1BPSgwMCAxMCAwMiAxMiAwNCAxNCAwNiAxNiAwOCAxOCAwQSAxQSAwQyAxQyAwRSAxRSkKLQlwdW5wY2tsYncgeG1tRSx4bW1HCTsgeG1tRT0oMjAgMzAgMjIgMzIgMjQgMzQgMjYgMzYgMjggMzggMkEgM0EgMkMgM0MgMkUgM0UpCi0JcHVucGNrbGJ3IHhtbUIseG1tRAk7IHhtbUI9KDAxIDExIDAzIDEzIDA1IDE1IDA3IDE3IDA5IDE5IDBCIDFCIDBEIDFEIDBGIDFGKQotCXB1bnBja2xidyB4bW1GLHhtbUgJOyB4bW1GPSgyMSAzMSAyMyAzMyAyNSAzNSAyNyAzNyAyOSAzOSAyQiAzQiAyRCAzRCAyRiAzRikKLQotCW1vdmRxYSAgICB4bW1DLHhtbUEKLQlwdW5wY2tsd2QgeG1tQSx4bW1FCTsgeG1tQT0oMDAgMTAgMjAgMzAgMDIgMTIgMjIgMzIgMDQgMTQgMjQgMzQgMDYgMTYgMjYgMzYpCi0JcHVucGNraHdkIHhtbUMseG1tRQk7IHhtbUM9KDA4IDE4IDI4IDM4IDBBIDFBIDJBIDNBIDBDIDFDIDJDIDNDIDBFIDFFIDJFIDNFKQotCW1vdmRxYSAgICB4bW1HLHhtbUIKLQlwdW5wY2tsd2QgeG1tQix4bW1GCTsgeG1tQj0oMDEgMTEgMjEgMzEgMDMgMTMgMjMgMzMgMDUgMTUgMjUgMzUgMDcgMTcgMjcgMzcpCi0JcHVucGNraHdkIHhtbUcseG1tRgk7IHhtbUc9KDA5IDE5IDI5IDM5IDBCIDFCIDJCIDNCIDBEIDFEIDJEIDNEIDBGIDFGIDJGIDNGKQotCi0JbW92ZHFhICAgIHhtbUQseG1tQQotCXB1bnBja2xkcSB4bW1BLHhtbUIJOyB4bW1BPSgwMCAxMCAyMCAzMCAwMSAxMSAyMSAzMSAwMiAxMiAyMiAzMiAwMyAxMyAyMyAzMykKLQlwdW5wY2toZHEgeG1tRCx4bW1CCTsgeG1tRD0oMDQgMTQgMjQgMzQgMDUgMTUgMjUgMzUgMDYgMTYgMjYgMzYgMDcgMTcgMjcgMzcpCi0JbW92ZHFhICAgIHhtbUgseG1tQwotCXB1bnBja2xkcSB4bW1DLHhtbUcJOyB4bW1DPSgwOCAxOCAyOCAzOCAwOSAxOSAyOSAzOSAwQSAxQSAyQSAzQSAwQiAxQiAyQiAzQikKLQlwdW5wY2toZHEgeG1tSCx4bW1HCTsgeG1tSD0oMEMgMUMgMkMgM0MgMEQgMUQgMkQgM0QgMEUgMUUgMkUgM0UgMEYgMUYgMkYgM0YpCi0KLQlkZWMJYWwJCQk7IFlWY3RyCi0JanoJc2hvcnQgLllWbG9vcF9icmVhawotCi0JbW92ZHFhCVhNTVdPUkQgW3drKDYpXSwgeG1tQQotCW1vdmRxYQlYTU1XT1JEIFt3ayg3KV0sIHhtbUQKLQltb3ZkcWEJWE1NV09SRCBbd2soOCldLCB4bW1DCi0JbW92ZHFhCVhNTVdPUkQgW3drKDkpXSwgeG1tSAotCi0Jam1wCW5lYXIgLllWbG9vcF8ybmQKLQlhbGlnbngJMTYsNwotCi0uWVZsb29wX2JyZWFrOgotCW1vdmRxYQl4bW1FLCBYTU1XT1JEIFt3ayg2KV0KLQltb3ZkcWEJeG1tRiwgWE1NV09SRCBbd2soNyldCi0JbW92ZHFhCXhtbUIsIFhNTVdPUkQgW3drKDgpXQotCi0JcGNtcGVxYgl4bW1HLHhtbUcJOyB4bW1HPShhbGwgMSdzKQotCi0JY21wCWVjeCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAotCWpiCW5lYXIgLmNvbHVtbl9zdDMyCi0KLQl0ZXN0CWVkaSwgU0laRU9GX1hNTVdPUkQtMQotCWpueglzaG9ydCAub3V0MDEKLQk7IC0tKGFsaWduZWQpLS0tLS0tLS0tLS0tLS0tLS0tLQotCW1vdm50ZHEJWE1NV09SRCBbZWRpKzAqU0laRU9GX1hNTVdPUkRdLCB4bW1BCi0JbW92bnRkcQlYTU1XT1JEIFtlZGkrMSpTSVpFT0ZfWE1NV09SRF0sIHhtbUQKLQltb3ZudGRxCVhNTVdPUkQgW2VkaSsyKlNJWkVPRl9YTU1XT1JEXSwgeG1tQwotCW1vdm50ZHEJWE1NV09SRCBbZWRpKzMqU0laRU9GX1hNTVdPUkRdLCB4bW1ICi0JYWRkCWVkaSwgYnl0ZSBSR0JfUElYRUxTSVpFKlNJWkVPRl9YTU1XT1JECTsgb3V0cHRyMQotCWptcAlzaG9ydCAub3V0MDAKLS5vdXQwMToJOyAtLSh1bmFsaWduZWQpLS0tLS0tLS0tLS0tLS0tLS0KLQltYXNrbW92ZHF1IHhtbUEseG1tRwkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tQQotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIxCi0JbWFza21vdmRxdSB4bW1ELHhtbUcJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUQKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyMQotCW1hc2ttb3ZkcXUgeG1tQyx4bW1HCQkJOyBtb3ZudGRxdSBYTU1XT1JEIFtlZGldLCB4bW1DCi0JYWRkCWVkaSwgYnl0ZSBTSVpFT0ZfWE1NV09SRAk7IG91dHB0cjEKLQltYXNrbW92ZHF1IHhtbUgseG1tRwkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tSAotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIxCi0ub3V0MDA6Ci0JbW92ZHFhCXhtbUEsIFhNTVdPUkQgW3drKDkpXQotCi0JdGVzdAllc2ksIFNJWkVPRl9YTU1XT1JELTEKLQlqbnoJc2hvcnQgLm91dDExCi0JOyAtLShhbGlnbmVkKS0tLS0tLS0tLS0tLS0tLS0tLS0KLQltb3ZudGRxCVhNTVdPUkQgW2VzaSswKlNJWkVPRl9YTU1XT1JEXSwgeG1tRQotCW1vdm50ZHEJWE1NV09SRCBbZXNpKzEqU0laRU9GX1hNTVdPUkRdLCB4bW1GCi0JbW92bnRkcQlYTU1XT1JEIFtlc2krMipTSVpFT0ZfWE1NV09SRF0sIHhtbUIKLQltb3ZudGRxCVhNTVdPUkQgW2VzaSszKlNJWkVPRl9YTU1XT1JEXSwgeG1tQQotCWFkZAllc2ksIGJ5dGUgUkdCX1BJWEVMU0laRSpTSVpFT0ZfWE1NV09SRAk7IG91dHB0cjAKLQlqbXAJc2hvcnQgLm91dDEwCi0ub3V0MTE6CTsgLS0odW5hbGlnbmVkKS0tLS0tLS0tLS0tLS0tLS0tCi0JeGNoZwllZGksZXNpCQkJCTsgZWRpPW91dHB0cjAsIGVzaT1vdXRwdHIxCi0JbWFza21vdmRxdSB4bW1FLHhtbUcJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUUKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyMAotCW1hc2ttb3ZkcXUgeG1tRix4bW1HCQkJOyBtb3ZudGRxdSBYTU1XT1JEIFtlZGldLCB4bW1GCi0JYWRkCWVkaSwgYnl0ZSBTSVpFT0ZfWE1NV09SRAk7IG91dHB0cjAKLQltYXNrbW92ZHF1IHhtbUIseG1tRwkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tQgotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIwCi0JbWFza21vdmRxdSB4bW1BLHhtbUcJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUEKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyMAotCXhjaGcJZWRpLGVzaQkJCQk7IGVkaT1vdXRwdHIxLCBlc2k9b3V0cHRyMAotLm91dDEwOgotCXN1YgllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQKLQlqegluZWFyIC5lbmRjb2x1bW4KLQotCWFkZAllYngsIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBpbnB0cjAwCi0JYWRkCWVkeCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAk7IGlucHRyMDEKLQlkZWMJYWgJCQk7IFlIY3RyCi0Jam56CW5lYXIgLllIbG9vcF8ybmQKLQotCXB1c2gJZWJ4CQkJCTsgaW5wdHIwMAotCXB1c2gJZWR4CQkJCTsgaW5wdHIwMQotCW1vdgllYngsIEpTQU1QUk9XIFtpbnB0cjFdCQk7IGVieD1pbnB0cjEKLQltb3YJZWR4LCBKU0FNUFJPVyBbaW5wdHIyXQkJOyBlZHg9aW5wdHIyCi0JYWRkCWVieCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAk7IGlucHRyMQotCWFkZAllZHgsIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBpbnB0cjIKLQlqbXAJbmVhciAuY29sdW1ubG9vcAotCWFsaWdueAkxNiw3Ci0KLS5jb2x1bW5fc3QzMjoKLQljbXAJZWN4LCBieXRlIFNJWkVPRl9YTU1XT1JELzIKLQlqYglzaG9ydCAuY29sdW1uX3N0MTYKLQltYXNrbW92ZHF1IHhtbUEseG1tRwkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tQQotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIxCi0JbWFza21vdmRxdSB4bW1ELHhtbUcJCQk7IG1vdm50ZHF1IFhNTVdPUkQgW2VkaV0sIHhtbUQKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9YTU1XT1JECTsgb3V0cHRyMQotCXhjaGcJZWRpLGVzaQkJCQk7IGVkaT1vdXRwdHIwLCBlc2k9b3V0cHRyMQotCW1hc2ttb3ZkcXUgeG1tRSx4bW1HCQkJOyBtb3ZudGRxdSBYTU1XT1JEIFtlZGldLCB4bW1FCi0JYWRkCWVkaSwgYnl0ZSBTSVpFT0ZfWE1NV09SRAk7IG91dHB0cjAKLQltYXNrbW92ZHF1IHhtbUYseG1tRwkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tRgotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIwCi0JeGNoZwllZGksZXNpCQkJCTsgZWRpPW91dHB0cjEsIGVzaT1vdXRwdHIwCi0JbW92ZHFhCXhtbUEseG1tQwotCW1vdmRxYQl4bW1ELHhtbUgKLQltb3ZkcWEJeG1tRSx4bW1CCi0JbW92ZHFhCXhtbUYsIFhNTVdPUkQgW3drKDkpXQotCXN1YgllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQvMgotLmNvbHVtbl9zdDE2OgotCWNtcAllY3gsIGJ5dGUgU0laRU9GX1hNTVdPUkQvNAotCWpiCXNob3J0IC5jb2x1bW5fc3QxNQotCW1hc2ttb3ZkcXUgeG1tQSx4bW1HCQkJOyBtb3ZudGRxdSBYTU1XT1JEIFtlZGldLCB4bW1BCi0JYWRkCWVkaSwgYnl0ZSBTSVpFT0ZfWE1NV09SRAk7IG91dHB0cjEKLQl4Y2hnCWVkaSxlc2kJCQkJOyBlZGk9b3V0cHRyMCwgZXNpPW91dHB0cjEKLQltYXNrbW92ZHF1IHhtbUUseG1tRwkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tRQotCWFkZAllZGksIGJ5dGUgU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIwCi0JeGNoZwllZGksZXNpCQkJCTsgZWRpPW91dHB0cjEsIGVzaT1vdXRwdHIwCi0JbW92ZHFhCXhtbUEseG1tRAotCW1vdmRxYQl4bW1FLHhtbUYKLQlzdWIJZWN4LCBieXRlIFNJWkVPRl9YTU1XT1JELzQKLS5jb2x1bW5fc3QxNToKLQljbXAJZWN4LCBieXRlIFNJWkVPRl9YTU1XT1JELzE2Ci0JamIJbmVhciAuZW5kY29sdW1uCi0JbW92CWVkeCxlY3gKLQl4b3IJZWN4LCBieXRlIDB4MDMKLQlpbmMJZWN4Ci0Jc2hsCWVjeCwgNAotCW1vdmQJeG1tQyxlY3gKLQlwc3JscQl4bW1HLHhtbUMKLQlwdW5wY2tsYncgeG1tRyx4bW1HCi0JbW92ZHFhICAgIHhtbUgseG1tRwotCTsgPT09PT09PT09PT09PT09PQotCW1vdgllY3gsZWRpCi0JYW5kCWVjeCwgYnl0ZSBTSVpFT0ZfWE1NV09SRC0xCi0JanoJc2hvcnQgLmFkajBhCi0JbGVhCWVheCwgW2VjeCtlZHgqNF0JOyBSR0JfUElYRUxTSVpFCi0JY21wCWVheCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAotCWphCXNob3J0IC5hZGowYQotCWFuZAllZGksIGJ5dGUgKC1TSVpFT0ZfWE1NV09SRCkJOyBhbGlnbiB0byAxNi1ieXRlIGJvdW5kYXJ5Ci0Jc2hsCWVjeCwgMwkJCTsgcHNsbGRxIHhtbUEsZWN4ICYgcHNsbGRxIHhtbUcsZWN4Ci0JbW92ZHFhCXhtbUIseG1tQQotCW1vdmRxYQl4bW1ELHhtbUcKLQlwc2xsZHEJeG1tQSwgU0laRU9GX1hNTVdPUkQvMgotCXBzbGxkcQl4bW1HLCBTSVpFT0ZfWE1NV09SRC8yCi0JbW92ZAl4bW1GLGVjeAotCXN1YgllY3gsIGJ5dGUgKFNJWkVPRl9YTU1XT1JELzIpKkJZVEVfQklUCi0JamIJc2hvcnQgLmFkajFhCi0JbW92ZAl4bW1DLGVjeAotCXBzbGxxCXhtbUEseG1tQwotCXBzbGxxCXhtbUcseG1tQwotCWptcAlzaG9ydCAuYWRqMGEKLS5hZGoxYToJbmVnCWVjeAotCW1vdmQJeG1tQyxlY3gKLQlwc3JscQl4bW1BLHhtbUMKLQlwc3JscQl4bW1HLHhtbUMKLQlwc2xscQl4bW1CLHhtbUYKLQlwc2xscQl4bW1ELHhtbUYKLQlwb3IJeG1tQSx4bW1CCi0JcG9yCXhtbUcseG1tRAotLmFkajBhOgk7IC0tLS0tLS0tLS0tLS0tLS0KLQltYXNrbW92ZHF1IHhtbUEseG1tRwkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tQQotCXhjaGcJZWRpLGVzaQkJCQk7IGVkaT1vdXRwdHIwLCBlc2k9b3V0cHRyMQotCTsgPT09PT09PT09PT09PT09PQotCW1vdgllY3gsZWRpCi0JYW5kCWVjeCwgYnl0ZSBTSVpFT0ZfWE1NV09SRC0xCi0JanoJc2hvcnQgLmFkajBiCi0JbGVhCWVheCwgW2VjeCtlZHgqNF0JOyBSR0JfUElYRUxTSVpFCi0JY21wCWVheCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAotCWphCXNob3J0IC5hZGowYgotCWFuZAllZGksIGJ5dGUgKC1TSVpFT0ZfWE1NV09SRCkJOyBhbGlnbiB0byAxNi1ieXRlIGJvdW5kYXJ5Ci0Jc2hsCWVjeCwgMwkJCTsgcHNsbGRxIHhtbUUsZWN4ICYgcHNsbGRxIHhtbUgsZWN4Ci0JbW92ZHFhCXhtbUMseG1tRQotCW1vdmRxYQl4bW1GLHhtbUgKLQlwc2xsZHEJeG1tRSwgU0laRU9GX1hNTVdPUkQvMgotCXBzbGxkcQl4bW1ILCBTSVpFT0ZfWE1NV09SRC8yCi0JbW92ZAl4bW1CLGVjeAotCXN1YgllY3gsIGJ5dGUgKFNJWkVPRl9YTU1XT1JELzIpKkJZVEVfQklUCi0JamIJc2hvcnQgLmFkajFiCi0JbW92ZAl4bW1ELGVjeAotCXBzbGxxCXhtbUUseG1tRAotCXBzbGxxCXhtbUgseG1tRAotCWptcAlzaG9ydCAuYWRqMGIKLS5hZGoxYjoJbmVnCWVjeAotCW1vdmQJeG1tRCxlY3gKLQlwc3JscQl4bW1FLHhtbUQKLQlwc3JscQl4bW1ILHhtbUQKLQlwc2xscQl4bW1DLHhtbUIKLQlwc2xscQl4bW1GLHhtbUIKLQlwb3IJeG1tRSx4bW1DCi0JcG9yCXhtbUgseG1tRgotLmFkajBiOgk7IC0tLS0tLS0tLS0tLS0tLS0KLQltYXNrbW92ZHF1IHhtbUUseG1tSAkJCTsgbW92bnRkcXUgWE1NV09SRCBbZWRpXSwgeG1tRQotCi0lZW5kaWYgOyBSR0JfUElYRUxTSVpFIDsgLS0tLS0tLS0tLS0tLS0tCi0KLS5lbmRjb2x1bW46Ci0Jc2ZlbmNlCQk7IGZsdXNoIHRoZSB3cml0ZSBidWZmZXIKLQotLnJldHVybjoKLQlwb3AJZWRpCi0JcG9wCWVzaQotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXBvcAllYngKLQltb3YJZXNwLGVicAkJOyBlc3AgPC0gYWxpZ25lZCBlYnAKLQlwb3AJZXNwCQk7IGVzcCA8LSBvcmlnaW5hbCBlYnAKLQlwb3AJZWJwCi0JcmV0Ci0KLSVlbmRpZiA7ICFVU0VfREVESUNBVEVEX0gyVjJfTUVSR0VEX1VQU0FNUExFX1NTRTIKLQotJWVuZGlmIDsgSkRNRVJHRV9TU0UyX1NVUFBPUlRFRAotJWVuZGlmIDsgVVBTQU1QTEVfTUVSR0lOR19TVVBQT1JURUQKLSVlbmRpZiA7IFJHQl9QSVhFTFNJWkUgPT0gMyB8fCBSR0JfUElYRUxTSVpFID09IDQKZGlmZiAtLWdpdCBhL2pkcGh1ZmYuYyBiL2pkcGh1ZmYuYwppbmRleCBhMWQ5MmI3Li4yMjY3ODA5IDEwMDY0NAotLS0gYS9qZHBodWZmLmMKKysrIGIvamRwaHVmZi5jCkBAIC01LDEzICs1LDYgQEAKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi0gKiBUaGlzIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KLSAqIExhc3QgTW9kaWZpZWQgOiBPY3RvYmVyIDMxLCAyMDA0Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCiAgKiBUaGlzIGZpbGUgY29udGFpbnMgSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nIHJvdXRpbmVzIGZvciBwcm9ncmVzc2l2ZSBKUEVHLgogICoKICAqIE11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgaGVyZSBoYXMgdG8gZG8gd2l0aCBzdXBwb3J0aW5nIGlucHV0IHN1c3BlbnNpb24uCkBAIC03Niw3ICs2OSw2IEBACiAgIGRfZGVyaXZlZF90YmwgKiBkZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107CiAKICAgZF9kZXJpdmVkX3RibCAqIGFjX2Rlcml2ZWRfdGJsOyAvKiBhY3RpdmUgdGFibGUgZHVyaW5nIGFuIEFDIHNjYW4gKi8KLSAgZF9kZXJpdmVkX3RibCAqIGRjX2Rlcml2ZWRfdGJsc1tNQVhfQ09NUFNfSU5fU0NBTl07CiB9IHBodWZmX2VudHJvcHlfZGVjb2RlcjsKIAogdHlwZWRlZiBwaHVmZl9lbnRyb3B5X2RlY29kZXIgKiBwaHVmZl9lbnRyb3B5X3B0cjsKQEAgLTE3Niw3ICsxNjgsNiBAQAogCXRibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKIAlqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgVFJVRSwgdGJsLAogCQkJCSYgZW50cm9weS0+ZGVyaXZlZF90YmxzW3RibF0pOwotCWVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tjaV0gPSBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXTsKICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOwpAQCAtMjAzLDYgKzE5NCwzMiBAQAogCiAKIC8qCisgKiBGaWd1cmUgRi4xMjogZXh0ZW5kIHNpZ24gYml0LgorICogT24gc29tZSBtYWNoaW5lcywgYSBzaGlmdCBhbmQgYWRkIHdpbGwgYmUgZmFzdGVyIHRoYW4gYSB0YWJsZSBsb29rdXAuCisgKi8KKworI2lmZGVmIEFWT0lEX1RBQkxFUworCisjZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCAoMTw8KChzKS0xKSkgPyAoeCkgKyAoKCgtMSk8PChzKSkgKyAxKSA6ICh4KSkKKworI2Vsc2UKKworI2RlZmluZSBIVUZGX0VYVEVORCh4LHMpICAoKHgpIDwgZXh0ZW5kX3Rlc3Rbc10gPyAoeCkgKyBleHRlbmRfb2Zmc2V0W3NdIDogKHgpKQorCitzdGF0aWMgY29uc3QgaW50IGV4dGVuZF90ZXN0WzE2XSA9ICAgLyogZW50cnkgbiBpcyAyKioobi0xKSAqLworICB7IDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMjAsIDB4MDA0MCwgMHgwMDgwLAorICAgIDB4MDEwMCwgMHgwMjAwLCAweDA0MDAsIDB4MDgwMCwgMHgxMDAwLCAweDIwMDAsIDB4NDAwMCB9OworCitzdGF0aWMgY29uc3QgaW50IGV4dGVuZF9vZmZzZXRbMTZdID0gLyogZW50cnkgbiBpcyAoLTEgPDwgbikgKyAxICovCisgIHsgMCwgKCgtMSk8PDEpICsgMSwgKCgtMSk8PDIpICsgMSwgKCgtMSk8PDMpICsgMSwgKCgtMSk8PDQpICsgMSwKKyAgICAoKC0xKTw8NSkgKyAxLCAoKC0xKTw8NikgKyAxLCAoKC0xKTw8NykgKyAxLCAoKC0xKTw8OCkgKyAxLAorICAgICgoLTEpPDw5KSArIDEsICgoLTEpPDwxMCkgKyAxLCAoKC0xKTw8MTEpICsgMSwgKCgtMSk8PDEyKSArIDEsCisgICAgKCgtMSk8PDEzKSArIDEsICgoLTEpPDwxNCkgKyAxLCAoKC0xKTw8MTUpICsgMSB9OworCisjZW5kaWYgLyogQVZPSURfVEFCTEVTICovCisKKworLyoKICAqIENoZWNrIGZvciBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBkZWNvZGVyLgogICogUmV0dXJucyBGQUxTRSBpZiBtdXN0IHN1c3BlbmQuCiAgKi8KQEAgLTI2NywxMiArMjg0LDE2IEBACiAKIE1FVEhPRERFRihib29sZWFuKQogZGVjb2RlX21jdV9EQ19maXJzdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsKK3sgICAKICAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CiAgIGludCBBbCA9IGNpbmZvLT5BbDsKLSAgaW50IGJsa247CisgIHJlZ2lzdGVyIGludCBzLCByOworICBpbnQgYmxrbiwgY2k7CisgIEpCTE9DS1JPVyBibG9jazsKICAgQklUUkVBRF9TVEFURV9WQVJTOwogICBzYXZhYmxlX3N0YXRlIHN0YXRlOworICBkX2Rlcml2ZWRfdGJsICogdGJsOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKIAogICAvKiBQcm9jZXNzIHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZDsgbWF5IGhhdmUgdG8gc3VzcGVuZCAqLwogICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKQEAgLTI5Myw2NyArMzE0LDIxIEBACiAgICAgLyogT3V0ZXIgbG9vcCBoYW5kbGVzIGVhY2ggYmxvY2sgaW4gdGhlIE1DVSAqLwogCiAgICAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICAgIEpCTE9DS1JPVyBibG9jayA9IE1DVV9kYXRhW2Jsa25dOwotICAgICAgaW50IGNpID0gY2luZm8tPk1DVV9tZW1iZXJzaGlwW2Jsa25dOwotICAgICAgZF9kZXJpdmVkX3RibCAqIHRibCA9IGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tjaV07Ci0gICAgICByZWdpc3RlciBpbnQgczsKKyAgICAgIGJsb2NrID0gTUNVX2RhdGFbYmxrbl07CisgICAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKKyAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgICB0YmwgPSBlbnRyb3B5LT5kZXJpdmVkX3RibHNbY29tcHB0ci0+ZGNfdGJsX25vXTsKIAogICAgICAgLyogRGVjb2RlIGEgc2luZ2xlIGJsb2NrJ3Mgd29ydGggb2YgY29lZmZpY2llbnRzICovCiAKICAgICAgIC8qIFNlY3Rpb24gRi4yLjIuMTogZGVjb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlICovCi0gICAgICB7CQkvKiBIVUZGWF9ERUNPREUgKi8KLQlyZWdpc3RlciBpbnQgbmIsIGxvb2ssIHQ7Ci0JaWYgKGJpdHNfbGVmdCA8IEhVRkZYX0xPT0tBSEVBRCkgewotCSAgcmVnaXN0ZXIgY29uc3QgSk9DVEVUICogbmV4dF9pbnB1dF9ieXRlID0gYnJfc3RhdGUubmV4dF9pbnB1dF9ieXRlOwotCSAgcmVnaXN0ZXIgc2l6ZV90ICAgICAgICAgYnl0ZXNfaW5fYnVmZmVyID0gYnJfc3RhdGUuYnl0ZXNfaW5fYnVmZmVyOwotCSAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IDApIHsKLQkgICAgd2hpbGUgKGJpdHNfbGVmdCA8IE1JTl9HRVRfQklUUykgewotCSAgICAgIHJlZ2lzdGVyIGludCBjOwotCSAgICAgIGlmIChieXRlc19pbl9idWZmZXIgPT0gMCB8fAotCQkgIChjID0gR0VUSk9DVEVUKCpuZXh0X2lucHV0X2J5dGUpKSA9PSAweEZGKSB7Ci0JCWdvdG8gbGFiZWwxMTsgfQotCSAgICAgIGJ5dGVzX2luX2J1ZmZlci0tOyBuZXh0X2lucHV0X2J5dGUrKzsKLQkgICAgICBnZXRfYnVmZmVyID0gKGdldF9idWZmZXIgPDwgOCkgfCBjOwotCSAgICAgIGJpdHNfbGVmdCArPSA4OwotCSAgICB9Ci0JICAgIGJyX3N0YXRlLm5leHRfaW5wdXRfYnl0ZSA9IG5leHRfaW5wdXRfYnl0ZTsKLQkgICAgYnJfc3RhdGUuYnl0ZXNfaW5fYnVmZmVyID0gYnl0ZXNfaW5fYnVmZmVyOwotCSAgfSBlbHNlIHsKLQlsYWJlbDExOgotCSAgICBicl9zdGF0ZS5uZXh0X2lucHV0X2J5dGUgPSBuZXh0X2lucHV0X2J5dGU7Ci0JICAgIGJyX3N0YXRlLmJ5dGVzX2luX2J1ZmZlciA9IGJ5dGVzX2luX2J1ZmZlcjsKLQkgICAgaWYgKCEganBlZ19maWxsX2JpdF9idWZmZXIoJmJyX3N0YXRlLGdldF9idWZmZXIsYml0c19sZWZ0LCAwKSkgewotCSAgICAgIHJldHVybiBGQUxTRTsgfQotCSAgICBnZXRfYnVmZmVyID0gYnJfc3RhdGUuZ2V0X2J1ZmZlcjsgYml0c19sZWZ0ID0gYnJfc3RhdGUuYml0c19sZWZ0OwotCSAgICBpZiAoYml0c19sZWZ0IDwgSFVGRlhfTE9PS0FIRUFEKSB7Ci0JICAgICAgbmIgPSAxOyBnb3RvIGxhYmVsMTsKLQkgICAgfQotCSAgfQotCX0KLQlsb29rID0gUEVFS19CSVRTKEhVRkZYX0xPT0tBSEVBRCk7Ci0JaWYgKChuYiA9IHRibC0+bG9va3hfbmJpdHNbbG9va10pICE9IDApIHsKLQkgIHMgPSB0YmwtPmxvb2t4X3ZhbFtsb29rXTsKLQkgIGlmIChuYiA8PSBIVUZGWF9MT09LQUhFQUQpIHsKLQkgICAgRFJPUF9CSVRTKG5iKTsKLQkgIH0gZWxzZSB7Ci0JICAgIERST1BfQklUUyhIVUZGWF9MT09LQUhFQUQpOwotCSAgICBuYiAtPSBIVUZGWF9MT09LQUhFQUQ7Ci0JICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIG5iLCByZXR1cm4gRkFMU0UpOwotCSAgICBzICs9IEdFVF9CSVRTKG5iKTsKLQkgIH0KLQl9IGVsc2UgewotCSAgbmIgPSBIVUZGWF9MT09LQUhFQUQ7Ci0gICAgICBsYWJlbDE6Ci0JICBpZiAoKHM9anBlZ19odWZmX2RlY29kZSgmYnJfc3RhdGUsZ2V0X2J1ZmZlcixiaXRzX2xlZnQsdGJsLG5iKSkKLQkgICAgICAgPCAwKSB7IHJldHVybiBGQUxTRTsgfQotCSAgZ2V0X2J1ZmZlciA9IGJyX3N0YXRlLmdldF9idWZmZXI7IGJpdHNfbGVmdCA9IGJyX3N0YXRlLmJpdHNfbGVmdDsKLQkgIGlmIChzKSB7Ci0JICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7Ci0JICAgIHQgPSBHRVRfQklUUyhzKTsKLQkgICAgcyA9IEhVRkZfRVhURU5EKHQsIHMpOwotCSAgfQotCX0KKyAgICAgIEhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCB0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwxKTsKKyAgICAgIGlmIChzKSB7CisJQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKKwlyID0gR0VUX0JJVFMocyk7CisJcyA9IEhVRkZfRVhURU5EKHIsIHMpOwogICAgICAgfQorCiAgICAgICAvKiBDb252ZXJ0IERDIGRpZmZlcmVuY2UgdG8gYWN0dWFsIHZhbHVlLCB1cGRhdGUgbGFzdF9kY192YWwgKi8KICAgICAgIHMgKz0gc3RhdGUubGFzdF9kY192YWxbY2ldOwogICAgICAgc3RhdGUubGFzdF9kY192YWxbY2ldID0gczsKQEAgLTM4MCwxMiArMzU1LDE1IEBACiAKIE1FVEhPRERFRihib29sZWFuKQogZGVjb2RlX21jdV9BQ19maXJzdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsKK3sgICAKICAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CiAgIGludCBTZSA9IGNpbmZvLT5TZTsKICAgaW50IEFsID0gY2luZm8tPkFsOworICByZWdpc3RlciBpbnQgcywgaywgcjsKICAgdW5zaWduZWQgaW50IEVPQlJVTjsKKyAgSkJMT0NLUk9XIGJsb2NrOwogICBCSVRSRUFEX1NUQVRFX1ZBUlM7CisgIGRfZGVyaXZlZF90YmwgKiB0Ymw7CiAKICAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KICAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CkBAIC00MDYsNzQgKzM4NCwyMiBAQAogCiAgICAgLyogVGhlcmUgaXMgYWx3YXlzIG9ubHkgb25lIGJsb2NrIHBlciBNQ1UgKi8KIAotICAgIGlmIChFT0JSVU4gPiAwKSB7CQkvKiBpZiBpdCdzIGEgYmFuZCBvZiB6ZXJvZXMuLi4gKi8KKyAgICBpZiAoRU9CUlVOID4gMCkJCS8qIGlmIGl0J3MgYSBiYW5kIG9mIHplcm9lcy4uLiAqLwogICAgICAgRU9CUlVOLS07CQkJLyogLi4ucHJvY2VzcyBpdCBub3cgKHdlIGRvIG5vdGhpbmcpICovCi0gICAgfSBlbHNlIHsKLSAgICAgIEpCTE9DS1JPVyBibG9jayA9IE1DVV9kYXRhWzBdOwotICAgICAgZF9kZXJpdmVkX3RibCAqIHRibCA9IGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsOwotICAgICAgcmVnaXN0ZXIgaW50IHMsIGssIHI7Ci0KLSAgICAgIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAqLworICAgIGVsc2UgewogICAgICAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKyAgICAgIGJsb2NrID0gTUNVX2RhdGFbMF07CisgICAgICB0YmwgPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibDsKIAogICAgICAgZm9yIChrID0gY2luZm8tPlNzOyBrIDw9IFNlOyBrKyspIHsKLQl7CS8qIEhVRkZYX0RFQ09ERSAqLwotCSAgcmVnaXN0ZXIgaW50IG5iLCBsb29rLCB0OwotCSAgaWYgKGJpdHNfbGVmdCA8IEhVRkZYX0xPT0tBSEVBRCkgewotCSAgICByZWdpc3RlciBjb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGUgPSBicl9zdGF0ZS5uZXh0X2lucHV0X2J5dGU7Ci0JICAgIHJlZ2lzdGVyIHNpemVfdCAgICAgICAgIGJ5dGVzX2luX2J1ZmZlciA9IGJyX3N0YXRlLmJ5dGVzX2luX2J1ZmZlcjsKLQkgICAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IDApIHsKLQkgICAgICB3aGlsZSAoYml0c19sZWZ0IDwgTUlOX0dFVF9CSVRTKSB7Ci0JCXJlZ2lzdGVyIGludCBjOwotCQlpZiAoYnl0ZXNfaW5fYnVmZmVyID09IDAgfHwKLQkJICAgIChjID0gR0VUSk9DVEVUKCpuZXh0X2lucHV0X2J5dGUpKSA9PSAweEZGKSB7Ci0JCSAgZ290byBsYWJlbDIxOyB9Ci0JCWJ5dGVzX2luX2J1ZmZlci0tOyBuZXh0X2lucHV0X2J5dGUrKzsKLQkJZ2V0X2J1ZmZlciA9IChnZXRfYnVmZmVyIDw8IDgpIHwgYzsKLQkJYml0c19sZWZ0ICs9IDg7Ci0JICAgICAgfQotCSAgICAgIGJyX3N0YXRlLm5leHRfaW5wdXRfYnl0ZSA9IG5leHRfaW5wdXRfYnl0ZTsKLQkgICAgICBicl9zdGF0ZS5ieXRlc19pbl9idWZmZXIgPSBieXRlc19pbl9idWZmZXI7Ci0JICAgIH0gZWxzZSB7Ci0JICBsYWJlbDIxOgotCSAgICAgIGJyX3N0YXRlLm5leHRfaW5wdXRfYnl0ZSA9IG5leHRfaW5wdXRfYnl0ZTsKLQkgICAgICBicl9zdGF0ZS5ieXRlc19pbl9idWZmZXIgPSBieXRlc19pbl9idWZmZXI7Ci0JICAgICAgaWYgKCEganBlZ19maWxsX2JpdF9idWZmZXIoJmJyX3N0YXRlLGdldF9idWZmZXIsYml0c19sZWZ0LCAwKSkgewotCQlyZXR1cm4gRkFMU0U7IH0KLQkgICAgICBnZXRfYnVmZmVyID0gYnJfc3RhdGUuZ2V0X2J1ZmZlcjsgYml0c19sZWZ0ID0gYnJfc3RhdGUuYml0c19sZWZ0OwotCSAgICAgIGlmIChiaXRzX2xlZnQgPCBIVUZGWF9MT09LQUhFQUQpIHsKLQkJbmIgPSAxOyBnb3RvIGxhYmVsMjsKLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KLQkgIGxvb2sgPSBQRUVLX0JJVFMoSFVGRlhfTE9PS0FIRUFEKTsKLQkgIGlmICgobmIgPSB0YmwtPmxvb2t4X25iaXRzW2xvb2tdKSAhPSAwKSB7Ci0JICAgIHMgPSB0YmwtPmxvb2t4X3ZhbFtsb29rXTsKLQkgICAgciA9IHRibC0+bG9va3hfc3ltW2xvb2tdID4+IDQ7Ci0JICAgIGlmIChuYiA8PSBIVUZGWF9MT09LQUhFQUQpIHsKLQkgICAgICBEUk9QX0JJVFMobmIpOwotCSAgICB9IGVsc2UgewotCSAgICAgIERST1BfQklUUyhIVUZGWF9MT09LQUhFQUQpOwotCSAgICAgIG5iIC09IEhVRkZYX0xPT0tBSEVBRDsKLQkgICAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBuYiwgcmV0dXJuIEZBTFNFKTsKLQkgICAgICBzICs9IEdFVF9CSVRTKG5iKTsKLQkgICAgfQotCSAgfSBlbHNlIHsKLQkgICAgbmIgPSBIVUZGWF9MT09LQUhFQUQ7Ci0JbGFiZWwyOgotCSAgICBpZiAoKHM9anBlZ19odWZmX2RlY29kZSgmYnJfc3RhdGUsZ2V0X2J1ZmZlcixiaXRzX2xlZnQsdGJsLG5iKSkKLQkJIDwgMCkgeyByZXR1cm4gRkFMU0U7IH0KLQkgICAgZ2V0X2J1ZmZlciA9IGJyX3N0YXRlLmdldF9idWZmZXI7IGJpdHNfbGVmdCA9IGJyX3N0YXRlLmJpdHNfbGVmdDsKLQkgICAgciA9IHMgPj4gNDsgcyAmPSAxNTsKLQkgICAgaWYgKHMpIHsKLQkgICAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOwotCSAgICAgIHQgPSBHRVRfQklUUyhzKTsKLQkgICAgICBzID0gSFVGRl9FWFRFTkQodCwgcyk7Ci0JICAgIH0KLQkgIH0KLQl9CisJSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIHRibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDIpOworCXIgPSBzID4+IDQ7CisJcyAmPSAxNTsKIAlpZiAocykgewogCSAgayArPSByOworCSAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKKwkgIHIgPSBHRVRfQklUUyhzKTsKKwkgIHMgPSBIVUZGX0VYVEVORChyLCBzKTsKIAkgIC8qIFNjYWxlIGFuZCBvdXRwdXQgY29lZmZpY2llbnQgaW4gbmF0dXJhbCAoZGV6aWd6YWdnZWQpIG9yZGVyICovCiAJICAoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dID0gKEpDT0VGKSAocyA8PCBBbCk7CiAJfSBlbHNlIHsKQEAgLTUxNCwxMCArNDQwLDExIEBACiAKIE1FVEhPRERFRihib29sZWFuKQogZGVjb2RlX21jdV9EQ19yZWZpbmUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17Cit7ICAgCiAgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwogICBpbnQgcDEgPSAxIDw8IGNpbmZvLT5BbDsJLyogMSBpbiB0aGUgYml0IHBvc2l0aW9uIGJlaW5nIGNvZGVkICovCiAgIGludCBibGtuOworICBKQkxPQ0tST1cgYmxvY2s7CiAgIEJJVFJFQURfU1RBVEVfVkFSUzsKIAogICAvKiBQcm9jZXNzIHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZDsgbWF5IGhhdmUgdG8gc3VzcGVuZCAqLwpAQCAtNTM3LDcgKzQ2NCw3IEBACiAgIC8qIE91dGVyIGxvb3AgaGFuZGxlcyBlYWNoIGJsb2NrIGluIHRoZSBNQ1UgKi8KIAogICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgewotICAgIEpCTE9DS1JPVyBibG9jayA9IE1DVV9kYXRhW2Jsa25dOworICAgIGJsb2NrID0gTUNVX2RhdGFbYmxrbl07CiAKICAgICAvKiBFbmNvZGVkIGRhdGEgaXMgc2ltcGx5IHRoZSBuZXh0IGJpdCBvZiB0aGUgdHdvJ3MtY29tcGxlbWVudCBEQyB2YWx1ZSAqLwogICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIDEsIHJldHVybiBGQUxTRSk7CkBAIC01NjIsMTcgKzQ4OSwxNyBAQAogCiBNRVRIT0RERUYoYm9vbGVhbikKIGRlY29kZV9tY3VfQUNfcmVmaW5lIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoteworeyAgIAogICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKICAgaW50IFNlID0gY2luZm8tPlNlOwotICBpbnQgQWwgPSBjaW5mby0+QWw7CisgIGludCBwMSA9IDEgPDwgY2luZm8tPkFsOwkvKiAxIGluIHRoZSBiaXQgcG9zaXRpb24gYmVpbmcgY29kZWQgKi8KKyAgaW50IG0xID0gKC0xKSA8PCBjaW5mby0+QWw7CS8qIC0xIGluIHRoZSBiaXQgcG9zaXRpb24gYmVpbmcgY29kZWQgKi8KICAgcmVnaXN0ZXIgaW50IHMsIGssIHI7CiAgIHVuc2lnbmVkIGludCBFT0JSVU47CiAgIEpCTE9DS1JPVyBibG9jazsKICAgSkNPRUZQVFIgdGhpc2NvZWY7CiAgIEJJVFJFQURfU1RBVEVfVkFSUzsKICAgZF9kZXJpdmVkX3RibCAqIHRibDsKLSAgaW50IHBtMVsyXTsKICAgaW50IG51bV9uZXduejsKICAgaW50IG5ld256X3Bvc1tEQ1RTSVpFMl07CiAKQEAgLTU5NSwxMyArNTIyLDYgQEAKICAgICBibG9jayA9IE1DVV9kYXRhWzBdOwogICAgIHRibCA9IGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsOwogCi0gICAgLyogVGhlIHBtMVtdIGFycmF5IGlzIGluZGV4ZWQgYnkgYSB2YWx1ZSBmcm9tIHJlbGF0aW9uYWwgb3BlcmF0b3IuCi0gICAgICogVGhpcyBtZXRob2QgZWxpbWluYXRlcyBjb25kaXRpb25hbCBicmFuY2hlcyBkZXBlbmRpbmcgb24gcmFuZG9tIGRhdGEsCi0gICAgICogd2hpY2ggcmVzdWx0IGluIGxvd2VyIHBlcmZvcm1hbmNlIG9uIHJlY2VudCBwcm9jZXNzb3JzLgotICAgICAqLwotICAgIHBtMVswXSA9ICAgMSAgPDwgY2luZm8tPkFsOwkvKiArMSBpbiB0aGUgYml0IHBvc2l0aW9uIGJlaW5nIGNvZGVkICovCi0gICAgcG0xWzFdID0gKC0xKSA8PCBjaW5mby0+QWw7CS8qIC0xIGluIHRoZSBiaXQgcG9zaXRpb24gYmVpbmcgY29kZWQgKi8KLQogICAgIC8qIElmIHdlIGFyZSBmb3JjZWQgdG8gc3VzcGVuZCwgd2UgbXVzdCB1bmRvIHRoZSBhc3NpZ25tZW50cyB0byBhbnkgbmV3bHkKICAgICAgKiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgYmxvY2ssIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlJ2QgZ2V0IGNvbmZ1c2VkCiAgICAgICogbmV4dCB0aW1lIGFib3V0IHdoaWNoIGNvZWZmaWNpZW50cyB3ZXJlIGFscmVhZHkgbm9uemVyby4KQEAgLTYxNSw2MyArNTM1LDE4IEBACiAKICAgICBpZiAoRU9CUlVOID09IDApIHsKICAgICAgIGZvciAoOyBrIDw9IFNlOyBrKyspIHsKLQl7CS8qIEhVRkZYX0RFQ09ERSAqLwotCSAgcmVnaXN0ZXIgaW50IG5iLCBsb29rLCB0OwotCSAgaWYgKGJpdHNfbGVmdCA8IEhVRkZYX0xPT0tBSEVBRCkgewotCSAgICByZWdpc3RlciBjb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGUgPSBicl9zdGF0ZS5uZXh0X2lucHV0X2J5dGU7Ci0JICAgIHJlZ2lzdGVyIHNpemVfdCAgICAgICAgIGJ5dGVzX2luX2J1ZmZlciA9IGJyX3N0YXRlLmJ5dGVzX2luX2J1ZmZlcjsKLQkgICAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IDApIHsKLQkgICAgICB3aGlsZSAoYml0c19sZWZ0IDwgTUlOX0dFVF9CSVRTKSB7Ci0JCXJlZ2lzdGVyIGludCBjOwotCQlpZiAoYnl0ZXNfaW5fYnVmZmVyID09IDAgfHwKLQkJICAgIChjID0gR0VUSk9DVEVUKCpuZXh0X2lucHV0X2J5dGUpKSA9PSAweEZGKSB7Ci0JCSAgZ290byBsYWJlbDMxOyB9Ci0JCWJ5dGVzX2luX2J1ZmZlci0tOyBuZXh0X2lucHV0X2J5dGUrKzsKLQkJZ2V0X2J1ZmZlciA9IChnZXRfYnVmZmVyIDw8IDgpIHwgYzsKLQkJYml0c19sZWZ0ICs9IDg7Ci0JICAgICAgfQotCSAgICAgIGJyX3N0YXRlLm5leHRfaW5wdXRfYnl0ZSA9IG5leHRfaW5wdXRfYnl0ZTsKLQkgICAgICBicl9zdGF0ZS5ieXRlc19pbl9idWZmZXIgPSBieXRlc19pbl9idWZmZXI7Ci0JICAgIH0gZWxzZSB7Ci0JICBsYWJlbDMxOgotCSAgICAgIGJyX3N0YXRlLm5leHRfaW5wdXRfYnl0ZSA9IG5leHRfaW5wdXRfYnl0ZTsKLQkgICAgICBicl9zdGF0ZS5ieXRlc19pbl9idWZmZXIgPSBieXRlc19pbl9idWZmZXI7Ci0JICAgICAgaWYgKCEganBlZ19maWxsX2JpdF9idWZmZXIoJmJyX3N0YXRlLGdldF9idWZmZXIsYml0c19sZWZ0LCAwKSkgewotCQlnb3RvIHVuZG9pdDsgfQotCSAgICAgIGdldF9idWZmZXIgPSBicl9zdGF0ZS5nZXRfYnVmZmVyOyBiaXRzX2xlZnQgPSBicl9zdGF0ZS5iaXRzX2xlZnQ7Ci0JICAgICAgaWYgKGJpdHNfbGVmdCA8IEhVRkZYX0xPT0tBSEVBRCkgewotCQluYiA9IDE7IGdvdG8gbGFiZWwzOwotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCSAgbG9vayA9IFBFRUtfQklUUyhIVUZGWF9MT09LQUhFQUQpOwotCSAgaWYgKChuYiA9IHRibC0+bG9va3hfbmJpdHNbbG9va10pICE9IDApIHsKLQkgICAgdCA9IHRibC0+bG9va3hfc3ltW2xvb2tdOwotCSAgICBzID0gdGJsLT5sb29reF92YWxbbG9va107Ci0JICAgIHIgPSB0ID4+IDQ7IHQgJj0gMTU7Ci0JICAgIGlmICh0IDw9IDEpIHsKLQkgICAgICBEUk9QX0JJVFMobmIpOwotCSAgICB9IGVsc2UgewkJICAvKiBzaXplIG9mIG5ldyBjb2VmIHNob3VsZCBhbHdheXMgYmUgMSAqLwotCSAgICAgIFdBUk5NUyhjaW5mbywgSldSTl9IVUZGX0JBRF9DT0RFKTsKLQkgICAgICBEUk9QX0JJVFMobmIgLSAodCAtIDEpKTsKLQkgICAgICBzID0gKHMgPj0gMCkgPyAxIDogLTE7Ci0JICAgIH0KLQkgIH0gZWxzZSB7Ci0JICAgIG5iID0gSFVGRlhfTE9PS0FIRUFEOwotCWxhYmVsMzoKLQkgICAgaWYgKChzPWpwZWdfaHVmZl9kZWNvZGUoJmJyX3N0YXRlLGdldF9idWZmZXIsYml0c19sZWZ0LHRibCxuYikpCi0JCSA8IDApIHsgZ290byB1bmRvaXQ7IH0KLQkgICAgZ2V0X2J1ZmZlciA9IGJyX3N0YXRlLmdldF9idWZmZXI7IGJpdHNfbGVmdCA9IGJyX3N0YXRlLmJpdHNfbGVmdDsKLQkgICAgciA9IHMgPj4gNDsgcyAmPSAxNTsKLQkgICAgaWYgKHMpIHsKLQkgICAgICBpZiAocyAhPSAxKQkgICAgLyogc2l6ZSBvZiBuZXcgY29lZiBzaG91bGQgYWx3YXlzIGJlIDEgKi8KLQkJV0FSTk1TKGNpbmZvLCBKV1JOX0hVRkZfQkFEX0NPREUpOwotCSAgICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIDEsIGdvdG8gdW5kb2l0KTsKLQkgICAgICBzID0gR0VUX0JJVFMoMSkgPyAxIDogLTE7Ci0JICAgIH0KLQkgIH0KLQl9Ci0JaWYgKHMgPT0gMCkgeworCUhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCB0YmwsIGdvdG8gdW5kb2l0LCBsYWJlbDMpOworCXIgPSBzID4+IDQ7CisJcyAmPSAxNTsKKwlpZiAocykgeworCSAgaWYgKHMgIT0gMSkJCS8qIHNpemUgb2YgbmV3IGNvZWYgc2hvdWxkIGFsd2F5cyBiZSAxICovCisJICAgIFdBUk5NUyhjaW5mbywgSldSTl9IVUZGX0JBRF9DT0RFKTsKKwkgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIDEsIGdvdG8gdW5kb2l0KTsKKwkgIGlmIChHRVRfQklUUygxKSkKKwkgICAgcyA9IHAxOwkJLyogbmV3bHkgbm9uemVybyBjb2VmIGlzIHBvc2l0aXZlICovCisJICBlbHNlCisJICAgIHMgPSBtMTsJCS8qIG5ld2x5IG5vbnplcm8gY29lZiBpcyBuZWdhdGl2ZSAqLworCX0gZWxzZSB7CiAJICBpZiAociAhPSAxNSkgewogCSAgICBFT0JSVU4gPSAxIDw8IHI7CS8qIEVPQnIsIHJ1biBsZW5ndGggaXMgMl5yICsgYXBwZW5kZWQgYml0cyAqLwogCSAgICBpZiAocikgewpAQCAtNjkyLDggKzU2NywxMiBAQAogCSAgaWYgKCp0aGlzY29lZiAhPSAwKSB7CiAJICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIDEsIGdvdG8gdW5kb2l0KTsKIAkgICAgaWYgKEdFVF9CSVRTKDEpKSB7Ci0JICAgICAgaWYgKCgqdGhpc2NvZWYgJiBwbTFbMF0pID09IDApIC8qIGRvIG5vdGhpbmcgaWYgYWxyZWFkeSBzZXQgaXQgKi8KLQkJKnRoaXNjb2VmICs9IHBtMVsoKnRoaXNjb2VmIDwgMCldOworCSAgICAgIGlmICgoKnRoaXNjb2VmICYgcDEpID09IDApIHsgLyogZG8gbm90aGluZyBpZiBhbHJlYWR5IHNldCBpdCAqLworCQlpZiAoKnRoaXNjb2VmID49IDApCisJCSAgKnRoaXNjb2VmICs9IHAxOworCQllbHNlCisJCSAgKnRoaXNjb2VmICs9IG0xOworCSAgICAgIH0KIAkgICAgfQogCSAgfSBlbHNlIHsKIAkgICAgaWYgKC0tciA8IDApCkBAIC03MDQsNyArNTgzLDcgQEAKIAlpZiAocykgewogCSAgaW50IHBvcyA9IGpwZWdfbmF0dXJhbF9vcmRlcltrXTsKIAkgIC8qIE91dHB1dCBuZXdseSBub256ZXJvIGNvZWZmaWNpZW50ICovCi0JICAoKmJsb2NrKVtwb3NdID0gKEpDT0VGKSAocyA8PCBBbCk7CisJICAoKmJsb2NrKVtwb3NdID0gKEpDT0VGKSBzOwogCSAgLyogUmVtZW1iZXIgaXRzIHBvc2l0aW9uIGluIGNhc2Ugd2UgaGF2ZSB0byBzdXNwZW5kICovCiAJICBuZXduel9wb3NbbnVtX25ld256KytdID0gcG9zOwogCX0KQEAgLTcyMiw4ICs2MDEsMTIgQEAKIAlpZiAoKnRoaXNjb2VmICE9IDApIHsKIAkgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIDEsIGdvdG8gdW5kb2l0KTsKIAkgIGlmIChHRVRfQklUUygxKSkgewotCSAgICBpZiAoKCp0aGlzY29lZiAmIHBtMVswXSkgPT0gMCkgIC8qIGRvIG5vdGhpbmcgaWYgYWxyZWFkeSBzZXQgaXQgKi8KLQkgICAgICAqdGhpc2NvZWYgKz0gcG0xWygqdGhpc2NvZWYgPCAwKV07CisJICAgIGlmICgoKnRoaXNjb2VmICYgcDEpID09IDApIHsgLyogZG8gbm90aGluZyBpZiBhbHJlYWR5IGNoYW5nZWQgaXQgKi8KKwkgICAgICBpZiAoKnRoaXNjb2VmID49IDApCisJCSp0aGlzY29lZiArPSBwMTsKKwkgICAgICBlbHNlCisJCSp0aGlzY29lZiArPSBtMTsKKwkgICAgfQogCSAgfQogCX0KICAgICAgIH0KZGlmZiAtLWdpdCBhL2pkc2FtcGxlLmMgYi9qZHNhbXBsZS5jCmluZGV4IDM3YTZjZWUuLjRlMGI4YjQgMTAwNjQ0Ci0tLSBhL2pkc2FtcGxlLmMKKysrIGIvamRzYW1wbGUuYwpAQCAtMiwxNiArMiwxMCBAQAogICogamRzYW1wbGUuYwogICoKICAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIENvcHlyaWdodCAyMDA5IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi0gKiBUaGlzIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgZm9yIFNJTUQgZXh0ZW5zaW9uLgotICogTGFzdCBNb2RpZmllZCA6IEphbnVhcnkgNSwgMjAwNgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgogICogVGhpcyBmaWxlIGNvbnRhaW5zIHVwc2FtcGxpbmcgcm91dGluZXMuCiAgKgogICogVXBzYW1wbGluZyBpbnB1dCBkYXRhIGlzIGNvdW50ZWQgaW4gInJvdyBncm91cHMiLiAgQSByb3cgZ3JvdXAKQEAgLTI4LDcgKzIyLDcgQEAKICNkZWZpbmUgSlBFR19JTlRFUk5BTFMKICNpbmNsdWRlICJqaW5jbHVkZS5oIgogI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqY29sc2FtcC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgKi8KKyNpbmNsdWRlICJqc2ltZC5oIgogCiAKIC8qIFBvaW50ZXIgdG8gcm91dGluZSB0byB1cHNhbXBsZSBhIHNpbmdsZSBjb21wb25lbnQgKi8KQEAgLTI5MywzNyArMjg3LDYgQEAKIH0KIAogCi0jaWZkZWYgVVBTQU1QTEVfSDFWMl9TVVBQT1JURUQKLQotLyoKLSAqIEZhc3QgcHJvY2Vzc2luZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIDE6MSBob3Jpem9udGFsIGFuZCAyOjEgdmVydGljYWwuCi0gKiBJdCdzIHN0aWxsIGEgYm94IGZpbHRlci4KLSAqCi0gKiBTSU1EIEV4dDogVGhpcyByb3V0aW5lIGlzIGZvciBmaWxlcyB0aGF0IGFyZSByb3RhdGVkIG9yIHRyYW5zcG9zZWQKLSAqICAgICAgICAgICBieSBqcGVndHJhbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWgxdjJfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCi17Ci0gIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOwotICBpbnQgaW5yb3csIG91dHJvdzsKLQotICBpbnJvdyA9IG91dHJvdyA9IDA7Ci0gIHdoaWxlIChvdXRyb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKLSAgICBqY29weV9zYW1wbGVfcm93cyhpbnB1dF9kYXRhLCBpbnJvdywgb3V0cHV0X2RhdGEsIG91dHJvdywKLQkJICAgICAgMSwgY2luZm8tPm91dHB1dF93aWR0aCk7Ci0gICAgamNvcHlfc2FtcGxlX3Jvd3MoaW5wdXRfZGF0YSwgaW5yb3csIG91dHB1dF9kYXRhLCBvdXRyb3crMSwKLQkJICAgICAgMSwgY2luZm8tPm91dHB1dF93aWR0aCk7Ci0gICAgaW5yb3crKzsKLSAgICBvdXRyb3cgKz0gMjsKLSAgfQotfQotCi0jZW5kaWYgLyogVVBTQU1QTEVfSDFWMl9TVVBQT1JURUQgKi8KLQotCiAvKgogICogRmFuY3kgcHJvY2Vzc2luZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAxOjEgdmVydGljYWwuCiAgKgpAQCAtNDMwLDUyICszOTMsNiBAQAogfQogCiAKLSNpZmRlZiBVUFNBTVBMRV9IMVYyX1NVUFBPUlRFRAotCi0vKgotICogRmFuY3kgcHJvY2Vzc2luZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIDE6MSBob3Jpem9udGFsIGFuZCAyOjEgdmVydGljYWwuCi0gKiBBZ2FpbiBhIHRyaWFuZ2xlIGZpbHRlcjsgc2VlIGNvbW1lbnRzIGZvciBoMnYxIGNhc2UsIGFib3ZlLgotICoKLSAqIEl0IGlzIE9LIGZvciB1cyB0byByZWZlcmVuY2UgdGhlIGFkamFjZW50IGlucHV0IHJvd3MgYmVjYXVzZSB3ZSBkZW1hbmRlZAotICogY29udGV4dCBmcm9tIHRoZSBtYWluIGJ1ZmZlciBjb250cm9sbGVyIChzZWUgaW5pdGlhbGl6YXRpb24gY29kZSkuCi0gKgotICogU0lNRCBFeHQ6IFRoaXMgcm91dGluZSBpcyBmb3IgZmlsZXMgdGhhdCBhcmUgcm90YXRlZCBvciB0cmFuc3Bvc2VkCi0gKiAgICAgICAgICAgYnkganBlZ3RyYW4uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1oMXYyX2ZhbmN5X3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCi17Ci0gIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgb3V0cHRyOwotICByZWdpc3RlciBpbnQgY29sc3VtOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbGN0cjsKLSAgaW50IGlucm93LCBvdXRyb3csIHY7Ci0KLSAgaW5yb3cgPSBvdXRyb3cgPSAwOwotICB3aGlsZSAob3V0cm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7Ci0gICAgZm9yICh2ID0gMDsgdiA8IDI7IHYrKykgewotICAgICAgLyogaW5wdHIwIHBvaW50cyB0byBuZWFyZXN0IGlucHV0IHJvdywgaW5wdHIxIHBvaW50cyB0byBuZXh0IG5lYXJlc3QgKi8KLSAgICAgIGlucHRyMCA9IGlucHV0X2RhdGFbaW5yb3ddOwotICAgICAgaWYgKHYgPT0gMCkJCS8qIG5leHQgbmVhcmVzdCBpcyByb3cgYWJvdmUgKi8KLQlpbnB0cjEgPSBpbnB1dF9kYXRhW2lucm93LTFdOwotICAgICAgZWxzZQkJCS8qIG5leHQgbmVhcmVzdCBpcyByb3cgYmVsb3cgKi8KLQlpbnB0cjEgPSBpbnB1dF9kYXRhW2lucm93KzFdOwotICAgICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93KytdOwotCi0gICAgICBmb3IgKGNvbGN0ciA9IGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoOyBjb2xjdHIgPiAwOyBjb2xjdHItLSkgewotCWNvbHN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKSAqIDMgKyBHRVRKU0FNUExFKCppbnB0cjErKyk7Ci0JKm91dHB0cisrID0gKEpTQU1QTEUpICgoY29sc3VtICsgdiArIDEpID4+IDIpOwotICAgICAgfQotICAgIH0KLSAgICBpbnJvdysrOwotICB9Ci19Ci0KLSNlbmRpZiAvKiBVUFNBTVBMRV9IMVYyX1NVUFBPUlRFRCAqLwotCi0KIC8qCiAgKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgdXBzYW1wbGluZy4KICAqLwpAQCAtNDg4LDcgKzQwNSw2IEBACiAgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwogICBib29sZWFuIG5lZWRfYnVmZmVyLCBkb19mYW5jeTsKICAgaW50IGhfaW5fZ3JvdXAsIHZfaW5fZ3JvdXAsIGhfb3V0X2dyb3VwLCB2X291dF9ncm91cDsKLSAgdW5zaWduZWQgaW50IHNpbWQgPSBqcGVnX3NpbWRfc3VwcG9ydCgoal9jb21tb25fcHRyKSBjaW5mbyk7CiAKICAgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKQogICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCkBAIC01MzQsODIgKzQ1MCwzMSBAQAogCSAgICAgICB2X2luX2dyb3VwID09IHZfb3V0X2dyb3VwKSB7CiAgICAgICAvKiBTcGVjaWFsIGNhc2VzIGZvciAyaDF2IHVwc2FtcGxpbmcgKi8KICAgICAgIGlmIChkb19mYW5jeSAmJiBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCA+IDIpIHsKLSNpZmRlZiBKRFNBTVBMRV9GQU5DWV9TU0UyX1NVUFBPUlRFRAotCWlmIChzaW1kICYgSlNJTURfU1NFMiAmJgotCSAgICBJU19DT05TVF9BTElHTkVEXzE2KGpjb25zdF9mYW5jeV91cHNhbXBsZV9zc2UyKSkKLQkgIHVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGpwZWdfaDJ2MV9mYW5jeV91cHNhbXBsZV9zc2UyOworCWlmIChqc2ltZF9jYW5faDJ2MV9mYW5jeV91cHNhbXBsZSgpKQorCSAgdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0ganNpbWRfaDJ2MV9mYW5jeV91cHNhbXBsZTsKIAllbHNlCi0jZW5kaWYKLSNpZmRlZiBKRFNBTVBMRV9GQU5DWV9NTVhfU1VQUE9SVEVECi0JaWYgKHNpbWQgJiBKU0lNRF9NTVgpCi0JICB1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBqcGVnX2gydjFfZmFuY3lfdXBzYW1wbGVfbW14OwotCWVsc2UKLSNlbmRpZgogCSAgdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2MV9mYW5jeV91cHNhbXBsZTsKICAgICAgIH0gZWxzZSB7Ci0jaWZkZWYgSkRTQU1QTEVfU0lNUExFX1NTRTJfU1VQUE9SVEVECi0JaWYgKHNpbWQgJiBKU0lNRF9TU0UyKQotCSAgdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0ganBlZ19oMnYxX3Vwc2FtcGxlX3NzZTI7CisJaWYgKGpzaW1kX2Nhbl9oMnYxX3Vwc2FtcGxlKCkpCisJICB1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBqc2ltZF9oMnYxX3Vwc2FtcGxlOwogCWVsc2UKLSNlbmRpZgotI2lmZGVmIEpEU0FNUExFX1NJTVBMRV9NTVhfU1VQUE9SVEVECi0JaWYgKHNpbWQgJiBKU0lNRF9NTVgpCi0JICB1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBqcGVnX2gydjFfdXBzYW1wbGVfbW14OwotCWVsc2UKLSNlbmRpZgogCSAgdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2MV91cHNhbXBsZTsKICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGhfaW5fZ3JvdXAgKiAyID09IGhfb3V0X2dyb3VwICYmCiAJICAgICAgIHZfaW5fZ3JvdXAgKiAyID09IHZfb3V0X2dyb3VwKSB7CiAgICAgICAvKiBTcGVjaWFsIGNhc2VzIGZvciAyaDJ2IHVwc2FtcGxpbmcgKi8KICAgICAgIGlmIChkb19mYW5jeSAmJiBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCA+IDIpIHsKLSNpZmRlZiBKRFNBTVBMRV9GQU5DWV9TU0UyX1NVUFBPUlRFRAotCWlmIChzaW1kICYgSlNJTURfU1NFMiAmJgotCSAgICBJU19DT05TVF9BTElHTkVEXzE2KGpjb25zdF9mYW5jeV91cHNhbXBsZV9zc2UyKSkKLQkgIHVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGpwZWdfaDJ2Ml9mYW5jeV91cHNhbXBsZV9zc2UyOworCWlmIChqc2ltZF9jYW5faDJ2Ml9mYW5jeV91cHNhbXBsZSgpKQorCSAgdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0ganNpbWRfaDJ2Ml9mYW5jeV91cHNhbXBsZTsKIAllbHNlCi0jZW5kaWYKLSNpZmRlZiBKRFNBTVBMRV9GQU5DWV9NTVhfU1VQUE9SVEVECi0JaWYgKHNpbWQgJiBKU0lNRF9NTVgpCi0JICB1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBqcGVnX2gydjJfZmFuY3lfdXBzYW1wbGVfbW14OwotCWVsc2UKLSNlbmRpZgogCSAgdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2Ml9mYW5jeV91cHNhbXBsZTsKIAl1cHNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gVFJVRTsKICAgICAgIH0gZWxzZSB7Ci0jaWZkZWYgSkRTQU1QTEVfU0lNUExFX1NTRTJfU1VQUE9SVEVECi0JaWYgKHNpbWQgJiBKU0lNRF9TU0UyKQotCSAgdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0ganBlZ19oMnYyX3Vwc2FtcGxlX3NzZTI7CisJaWYgKGpzaW1kX2Nhbl9oMnYyX3Vwc2FtcGxlKCkpCisJICB1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBqc2ltZF9oMnYyX3Vwc2FtcGxlOwogCWVsc2UKLSNlbmRpZgotI2lmZGVmIEpEU0FNUExFX1NJTVBMRV9NTVhfU1VQUE9SVEVECi0JaWYgKHNpbWQgJiBKU0lNRF9NTVgpCi0JICB1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBqcGVnX2gydjJfdXBzYW1wbGVfbW14OwotCWVsc2UKLSNlbmRpZgogCSAgdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2Ml91cHNhbXBsZTsKICAgICAgIH0KLSNpZmRlZiBVUFNBTVBMRV9IMVYyX1NVUFBPUlRFRAotICAgIH0gZWxzZSBpZiAoaF9pbl9ncm91cCA9PSBoX291dF9ncm91cCAmJgotCSAgICAgICB2X2luX2dyb3VwICogMiA9PSB2X291dF9ncm91cCkgewotICAgICAgLyogU3BlY2lhbCBjYXNlcyBmb3IgMWgydiB1cHNhbXBsaW5nICovCi0gICAgICBpZiAoZG9fZmFuY3kpIHsKLSNpZmRlZiBKRFNBTVBMRV9GQU5DWV9TU0UyX1NVUFBPUlRFRAotCWlmIChzaW1kICYgSlNJTURfU1NFMiAmJgotCSAgICBJU19DT05TVF9BTElHTkVEXzE2KGpjb25zdF9mYW5jeV91cHNhbXBsZV9zc2UyKSkKLQkgIHVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGpwZWdfaDF2Ml9mYW5jeV91cHNhbXBsZV9zc2UyOwotCWVsc2UKLSNlbmRpZgotI2lmZGVmIEpEU0FNUExFX0ZBTkNZX01NWF9TVVBQT1JURUQKLQlpZiAoc2ltZCAmIEpTSU1EX01NWCkKLQkgIHVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGpwZWdfaDF2Ml9mYW5jeV91cHNhbXBsZV9tbXg7Ci0JZWxzZQotI2VuZGlmCi0JICB1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMXYyX2ZhbmN5X3Vwc2FtcGxlOwotCXVwc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBUUlVFOwotICAgICAgfSBlbHNlCi0JdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaDF2Ml91cHNhbXBsZTsKLSNlbmRpZiAvKiBVUFNBTVBMRV9IMVYyX1NVUFBPUlRFRCAqLwogICAgIH0gZWxzZSBpZiAoKGhfb3V0X2dyb3VwICUgaF9pbl9ncm91cCkgPT0gMCAmJgogCSAgICAgICAodl9vdXRfZ3JvdXAgJSB2X2luX2dyb3VwKSA9PSAwKSB7CiAgICAgICAvKiBHZW5lcmljIGludGVncmFsLWZhY3RvcnMgdXBzYW1wbGluZyBtZXRob2QgKi8KQEAgLTYxOSw1MiArNDg0LDExIEBACiAgICAgfSBlbHNlCiAgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZSQUNUX1NBTVBMRV9OT1RJTVBMKTsKICAgICBpZiAobmVlZF9idWZmZXIpIHsKLSAgICAgIGVudW0geyBTSVpFT0ZfWE1NV09SRCA9IDE2IH07CS8qIGZyb20ganNpbWRleHQuaW5jICovCiAgICAgICB1cHNhbXBsZS0+Y29sb3JfYnVmW2NpXSA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQogCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JIChKRElNRU5TSU9OKSBqcm91bmRfdXAoanJvdW5kX3VwKChsb25nKSBjaW5mby0+b3V0cHV0X3dpZHRoLAotCQkJCQkgIChsb25nKSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpLAotCQkJCShsb25nKSAoMiAqIFNJWkVPRl9YTU1XT1JEKSksCisJIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5vdXRwdXRfd2lkdGgsCisJCQkJKGxvbmcpIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciksCiAJIChKRElNRU5TSU9OKSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOwogICAgIH0KICAgfQogfQotCi0KLSNpZm5kZWYgSlNJTURfTU9ERUlORk9fTk9UX1NVUFBPUlRFRAotCi1HTE9CQUwodW5zaWduZWQgaW50KQotanBlZ19zaW1kX3Vwc2FtcGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGRvX2ZhbmN5KQotewotICB1bnNpZ25lZCBpbnQgc2ltZCA9IGpwZWdfc2ltZF9zdXBwb3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLQotI2lmZGVmIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVECi0gIGlmICghZG9fZmFuY3kpCi0gICAgcmV0dXJuIGpwZWdfc2ltZF9tZXJnZWRfdXBzYW1wbGVyKGNpbmZvKTsKLSNlbmRpZgotCi0gIGlmIChkb19mYW5jeSkgewotI2lmZGVmIEpEU0FNUExFX0ZBTkNZX1NTRTJfU1VQUE9SVEVECi0gICAgaWYgKHNpbWQgJiBKU0lNRF9TU0UyICYmCi0gICAgICAgIElTX0NPTlNUX0FMSUdORURfMTYoamNvbnN0X2ZhbmN5X3Vwc2FtcGxlX3NzZTIpKQotICAgICAgcmV0dXJuIEpTSU1EX1NTRTI7Ci0jZW5kaWYKLSNpZmRlZiBKRFNBTVBMRV9GQU5DWV9NTVhfU1VQUE9SVEVECi0gICAgaWYgKHNpbWQgJiBKU0lNRF9NTVgpCi0gICAgICByZXR1cm4gSlNJTURfTU1YOwotI2VuZGlmCi0gIH0gZWxzZSB7Ci0jaWZkZWYgSkRTQU1QTEVfU0lNUExFX1NTRTJfU1VQUE9SVEVECi0gICAgaWYgKHNpbWQgJiBKU0lNRF9TU0UyKQotICAgICAgcmV0dXJuIEpTSU1EX1NTRTI7Ci0jZW5kaWYKLSNpZmRlZiBKRFNBTVBMRV9TSU1QTEVfTU1YX1NVUFBPUlRFRAotICAgIGlmIChzaW1kICYgSlNJTURfTU1YKQotICAgICAgcmV0dXJuIEpTSU1EX01NWDsKLSNlbmRpZgotICB9Ci0KLSAgcmV0dXJuIEpTSU1EX05PTkU7Ci19Ci0KLSNlbmRpZiAvKiAhSlNJTURfTU9ERUlORk9fTk9UX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvamRzYW1zczIuYXNtIGIvamRzYW1zczIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmZjZjUxLi4wMDAwMDAwCi0tLSBhL2pkc2Ftc3MyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDg4MyArMCwwIEBACi07Ci07IGpkc2Ftc3MyLmFzbSAtIHVwc2FtcGxpbmcgKFNTRTIpCi07Ci07IHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotOyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgotOyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4ganNpbWRleHQuaW5jCi07Ci07IFRoaXMgZmlsZSBzaG91bGQgYmUgYXNzZW1ibGVkIHdpdGggTkFTTSAoTmV0d2lkZSBBc3NlbWJsZXIpLAotOyBjYW4gKm5vdCogYmUgYXNzZW1ibGVkIHdpdGggTWljcm9zb2Z0J3MgTUFTTSBvciBhbnkgY29tcGF0aWJsZQotOyBhc3NlbWJsZXIgKGluY2x1ZGluZyBCb3JsYW5kJ3MgVHVyYm8gQXNzZW1ibGVyKS4KLTsgTkFTTSBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vbmFzbS5zb3VyY2Vmb3JnZS5uZXQvIG9yCi07IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTYyMDgKLTsKLTsgTGFzdCBNb2RpZmllZCA6IEZlYnJ1YXJ5IDQsIDIwMDYKLTsKLTsgW1RBQjhdCi0KLSVpbmNsdWRlICJqc2ltZGV4dC5pbmMiCi0laW5jbHVkZSAiamNvbHNhbXAuaW5jIgotCi0laWZkZWYgSkRTQU1QTEVfRkFOQ1lfU1NFMl9TVVBQT1JURUQKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX0NPTlNUCi0KLQlhbGlnbnoJMTYKLQlnbG9iYWwJRVhUTihqY29uc3RfZmFuY3lfdXBzYW1wbGVfc3NlMikKLQotRVhUTihqY29uc3RfZmFuY3lfdXBzYW1wbGVfc3NlMik6Ci0KLVBXX09ORQkJdGltZXMgOCBkdyAgMQotUFdfVFdPCQl0aW1lcyA4IGR3ICAyCi1QV19USFJFRQl0aW1lcyA4IGR3ICAzCi1QV19TRVZFTgl0aW1lcyA4IGR3ICA3Ci1QV19FSUdIVAl0aW1lcyA4IGR3ICA4Ci0KLQlhbGlnbnoJMTYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX1RFWFQKLQlCSVRTCTMyCi07Ci07IEZhbmN5IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMToxIHZlcnRpY2FsLgotOwotOyBUaGUgdXBzYW1wbGluZyBhbGdvcml0aG0gaXMgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiBwaXhlbCBjZW50ZXJzLAotOyBhbHNvIGtub3duIGFzIGEgInRyaWFuZ2xlIGZpbHRlciIuICBUaGlzIGlzIGEgZ29vZCBjb21wcm9taXNlIGJldHdlZW4KLTsgc3BlZWQgYW5kIHZpc3VhbCBxdWFsaXR5LiAgVGhlIGNlbnRlcnMgb2YgdGhlIG91dHB1dCBwaXhlbHMgYXJlIDEvNCBhbmQgMy80Ci07IG9mIHRoZSB3YXkgYmV0d2VlbiBpbnB1dCBwaXhlbCBjZW50ZXJzLgotOwotOyBHTE9CQUwodm9pZCkKLTsganBlZ19oMnYxX2ZhbmN5X3Vwc2FtcGxlX3NzZTIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpOwotOwotCi0lZGVmaW5lIGNpbmZvKGIpCQkoYikrOAkJOyBqX2RlY29tcHJlc3NfcHRyIGNpbmZvCi0lZGVmaW5lIGNvbXBwdHIoYikJCShiKSsxMgkJOyBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cgotJWRlZmluZSBpbnB1dF9kYXRhKGIpCQkoYikrMTYJCTsgSlNBTVBBUlJBWSBpbnB1dF9kYXRhCi0lZGVmaW5lIG91dHB1dF9kYXRhX3B0cihiKQkoYikrMjAJCTsgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cgotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2gydjFfZmFuY3lfdXBzYW1wbGVfc3NlMikKLQotRVhUTihqcGVnX2gydjFfZmFuY3lfdXBzYW1wbGVfc3NlMik6Ci0JcHVzaAllYnAKLQltb3YJZWJwLGVzcAotCXB1c2hwaWMJZWJ4Ci07CXB1c2gJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwdXNoCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwdXNoCWVzaQotCXB1c2gJZWRpCi0KLQlnZXRfR09UCWVieAkJOyBnZXQgR09UIGFkZHJlc3MKLQotCW1vdgllYXgsIFBPSU5URVIgW2NvbXBwdHIoZWJwKV0KLQltb3YJZWF4LCBKRElNRU5TSU9OIFtqY29tcGluZm9fZG93bnNhbXBsZWRfd2lkdGgoZWF4KV0gIDsgY29sY3RyCi0JdGVzdAllYXgsZWF4Ci0JanoJbmVhciAucmV0dXJuCi0KLQltb3YJZWN4LCBQT0lOVEVSIFtjaW5mbyhlYnApXQotCW1vdgllY3gsIElOVCBbamRzdHJ1Y3RfbWF4X3Zfc2FtcF9mYWN0b3IoZWN4KV0JOyByb3djdHIKLQl0ZXN0CWVjeCxlY3gKLQlqegluZWFyIC5yZXR1cm4KLQotCW1vdgllc2ksIEpTQU1QQVJSQVkgW2lucHV0X2RhdGEoZWJwKV0JOyBpbnB1dF9kYXRhCi0JbW92CWVkaSwgUE9JTlRFUiBbb3V0cHV0X2RhdGFfcHRyKGVicCldCi0JbW92CWVkaSwgSlNBTVBBUlJBWSBbZWRpXQkJCTsgb3V0cHV0X2RhdGEKLQlhbGlnbngJMTYsNwotLnJvd2xvb3A6Ci0JcHVzaAllYXgJCQk7IGNvbGN0cgotCXB1c2gJZWRpCi0JcHVzaAllc2kKLQotCW1vdgllc2ksIEpTQU1QUk9XIFtlc2ldCTsgaW5wdHIKLQltb3YJZWRpLCBKU0FNUFJPVyBbZWRpXQk7IG91dHB0cgotCi0JdGVzdAllYXgsIFNJWkVPRl9YTU1XT1JELTEKLQlqeglzaG9ydCAuc2tpcAotCW1vdglkbCwgSlNBTVBMRSBbZXNpKyhlYXgtMSkqU0laRU9GX0pTQU1QTEVdCi0JbW92CUpTQU1QTEUgW2VzaStlYXgqU0laRU9GX0pTQU1QTEVdLCBkbAk7IGluc2VydCBhIGR1bW15IHNhbXBsZQotLnNraXA6Ci0JcHhvcgl4bW0wLHhtbTAJCTsgeG1tMD0oYWxsIDAncykKLQlwY21wZXFiCXhtbTcseG1tNwotCXBzcmxkcQl4bW03LChTSVpFT0ZfWE1NV09SRC0xKQotCXBhbmQJeG1tNywgWE1NV09SRCBbZXNpKzAqU0laRU9GX1hNTVdPUkRdCi0KLQlhZGQJZWF4LCBieXRlIFNJWkVPRl9YTU1XT1JELTEKLQlhbmQJZWF4LCBieXRlIC1TSVpFT0ZfWE1NV09SRAotCWNtcAllYXgsIGJ5dGUgU0laRU9GX1hNTVdPUkQKLQlqYQlzaG9ydCAuY29sdW1ubG9vcAotCWFsaWdueAkxNiw3Ci0KLS5jb2x1bW5sb29wX2xhc3Q6Ci0JcGNtcGVxYgl4bW02LHhtbTYKLQlwc2xsZHEJeG1tNiwoU0laRU9GX1hNTVdPUkQtMSkKLQlwYW5kCXhtbTYsIFhNTVdPUkQgW2VzaSswKlNJWkVPRl9YTU1XT1JEXQotCWptcAlzaG9ydCAudXBzYW1wbGUKLQlhbGlnbngJMTYsNwotCi0uY29sdW1ubG9vcDoKLQltb3ZkcWEJeG1tNiwgWE1NV09SRCBbZXNpKzEqU0laRU9GX1hNTVdPUkRdCi0JcHNsbGRxCXhtbTYsKFNJWkVPRl9YTU1XT1JELTEpCi0KLS51cHNhbXBsZToKLQltb3ZkcWEJeG1tMSwgWE1NV09SRCBbZXNpKzAqU0laRU9GX1hNTVdPUkRdCi0JbW92ZHFhCXhtbTIseG1tMQotCW1vdmRxYQl4bW0zLHhtbTEJCTsgeG1tMT0oIDAgIDEgIDIgLi4uIDEzIDE0IDE1KQotCXBzbGxkcQl4bW0yLDEJCQk7IHhtbTI9KC0tICAwICAxIC4uLiAxMiAxMyAxNCkKLQlwc3JsZHEJeG1tMywxCQkJOyB4bW0zPSggMSAgMiAgMyAuLi4gMTQgMTUgLS0pCi0KLQlwb3IJeG1tMix4bW03CQk7IHhtbTI9KC0xICAwICAxIC4uLiAxMiAxMyAxNCkKLQlwb3IJeG1tMyx4bW02CQk7IHhtbTM9KCAxICAyICAzIC4uLiAxNCAxNSAxNikKLQotCW1vdmRxYQl4bW03LHhtbTEKLQlwc3JsZHEJeG1tNywoU0laRU9GX1hNTVdPUkQtMSkJOyB4bW03PSgxNSAtLSAtLSAuLi4gLS0gLS0gLS0pCi0KLQltb3ZkcWEgICAgeG1tNCx4bW0xCi0JcHVucGNrbGJ3IHhtbTEseG1tMAkJOyB4bW0xPSggMCAgMSAgMiAgMyAgNCAgNSAgNiAgNykKLQlwdW5wY2toYncgeG1tNCx4bW0wCQk7IHhtbTQ9KCA4ICA5IDEwIDExIDEyIDEzIDE0IDE1KQotCW1vdmRxYSAgICB4bW01LHhtbTIKLQlwdW5wY2tsYncgeG1tMix4bW0wCQk7IHhtbTI9KC0xICAwICAxICAyICAzICA0ICA1ICA2KQotCXB1bnBja2hidyB4bW01LHhtbTAJCTsgeG1tNT0oIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQpCi0JbW92ZHFhICAgIHhtbTYseG1tMwotCXB1bnBja2xidyB4bW0zLHhtbTAJCTsgeG1tMz0oIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDgpCi0JcHVucGNraGJ3IHhtbTYseG1tMAkJOyB4bW02PSggOSAxMCAxMSAxMiAxMyAxNCAxNSAxNikKLQotCXBtdWxsdwl4bW0xLFtHT1RPRkYoZWJ4LFBXX1RIUkVFKV0KLQlwbXVsbHcJeG1tNCxbR09UT0ZGKGVieCxQV19USFJFRSldCi0JcGFkZHcJeG1tMixbR09UT0ZGKGVieCxQV19PTkUpXQotCXBhZGR3CXhtbTUsW0dPVE9GRihlYngsUFdfT05FKV0KLQlwYWRkdwl4bW0zLFtHT1RPRkYoZWJ4LFBXX1RXTyldCi0JcGFkZHcJeG1tNixbR09UT0ZGKGVieCxQV19UV08pXQotCi0JcGFkZHcJeG1tMix4bW0xCi0JcGFkZHcJeG1tNSx4bW00Ci0JcHNybHcJeG1tMiwyCQkJOyB4bW0yPU91dExFPSggMCAgMiAgNCAgNiAgOCAxMCAxMiAxNCkKLQlwc3Jsdwl4bW01LDIJCQk7IHhtbTU9T3V0SEU9KDE2IDE4IDIwIDIyIDI0IDI2IDI4IDMwKQotCXBhZGR3CXhtbTMseG1tMQotCXBhZGR3CXhtbTYseG1tNAotCXBzcmx3CXhtbTMsMgkJCTsgeG1tMz1PdXRMTz0oIDEgIDMgIDUgIDcgIDkgMTEgMTMgMTUpCi0JcHNybHcJeG1tNiwyCQkJOyB4bW02PU91dEhPPSgxNyAxOSAyMSAyMyAyNSAyNyAyOSAzMSkKLQotCXBzbGx3CXhtbTMsQllURV9CSVQKLQlwc2xsdwl4bW02LEJZVEVfQklUCi0JcG9yCXhtbTIseG1tMwkJOyB4bW0yPU91dEw9KCAwICAxICAyIC4uLiAxMyAxNCAxNSkKLQlwb3IJeG1tNSx4bW02CQk7IHhtbTU9T3V0SD0oMTYgMTcgMTggLi4uIDI5IDMwIDMxKQotCi0JbW92ZHFhCVhNTVdPUkQgW2VkaSswKlNJWkVPRl9YTU1XT1JEXSwgeG1tMgotCW1vdmRxYQlYTU1XT1JEIFtlZGkrMSpTSVpFT0ZfWE1NV09SRF0sIHhtbTUKLQotCXN1YgllYXgsIGJ5dGUgU0laRU9GX1hNTVdPUkQKLQlhZGQJZXNpLCBieXRlIDEqU0laRU9GX1hNTVdPUkQJOyBpbnB0cgotCWFkZAllZGksIGJ5dGUgMipTSVpFT0ZfWE1NV09SRAk7IG91dHB0cgotCWNtcAllYXgsIGJ5dGUgU0laRU9GX1hNTVdPUkQKLQlqYQluZWFyIC5jb2x1bW5sb29wCi0JdGVzdAllYXgsZWF4Ci0Jam56CW5lYXIgLmNvbHVtbmxvb3BfbGFzdAotCi0JcG9wCWVzaQotCXBvcAllZGkKLQlwb3AJZWF4Ci0KLQlhZGQJZXNpLCBieXRlIFNJWkVPRl9KU0FNUFJPVwk7IGlucHV0X2RhdGEKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9KU0FNUFJPVwk7IG91dHB1dF9kYXRhCi0JZGVjCWVjeAkJCQk7IHJvd2N0cgotCWpnCW5lYXIgLnJvd2xvb3AKLQotLnJldHVybjoKLQlwb3AJZWRpCi0JcG9wCWVzaQotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXBvcHBpYwllYngKLQlwb3AJZWJwCi0JcmV0Ci0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsKLTsgRmFuY3kgcHJvY2Vzc2luZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAyOjEgdmVydGljYWwuCi07IEFnYWluIGEgdHJpYW5nbGUgZmlsdGVyOyBzZWUgY29tbWVudHMgZm9yIGgydjEgY2FzZSwgYWJvdmUuCi07Ci07IEdMT0JBTCh2b2lkKQotOyBqcGVnX2gydjJfZmFuY3lfdXBzYW1wbGVfc3NlMiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cik7Ci07Ci0KLSVkZWZpbmUgY2luZm8oYikJCShiKSs4CQk7IGpfZGVjb21wcmVzc19wdHIgY2luZm8KLSVkZWZpbmUgY29tcHB0cihiKQkJKGIpKzEyCQk7IGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyCi0lZGVmaW5lIGlucHV0X2RhdGEoYikJCShiKSsxNgkJOyBKU0FNUEFSUkFZIGlucHV0X2RhdGEKLSVkZWZpbmUgb3V0cHV0X2RhdGFfcHRyKGIpCShiKSsyMAkJOyBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyCi0KLSVkZWZpbmUgb3JpZ2luYWxfZWJwCWVicCswCi0lZGVmaW5lIHdrKGkpCQllYnAtKFdLX05VTS0oaSkpKlNJWkVPRl9YTU1XT1JECTsgeG1td29yZCB3a1tXS19OVU1dCi0lZGVmaW5lIFdLX05VTQkJNAotJWRlZmluZSBnb3RwdHIJCXdrKDApLVNJWkVPRl9QT0lOVEVSCTsgdm9pZCAqIGdvdHB0cgotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2gydjJfZmFuY3lfdXBzYW1wbGVfc3NlMikKLQotRVhUTihqcGVnX2gydjJfZmFuY3lfdXBzYW1wbGVfc3NlMik6Ci0JcHVzaAllYnAKLQltb3YJZWF4LGVzcAkJCQk7IGVheCA9IG9yaWdpbmFsIGVicAotCXN1Ygllc3AsIGJ5dGUgNAotCWFuZAllc3AsIGJ5dGUgKC1TSVpFT0ZfWE1NV09SRCkJOyBhbGlnbiB0byAxMjggYml0cwotCW1vdglbZXNwXSxlYXgKLQltb3YJZWJwLGVzcAkJCQk7IGVicCA9IGFsaWduZWQgZWJwCi0JbGVhCWVzcCwgW3drKDApXQotCXB1c2hwaWMJZWF4CQk7IG1ha2UgYSByb29tIGZvciBHT1QgYWRkcmVzcwotCXB1c2gJZWJ4Ci07CXB1c2gJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwdXNoCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwdXNoCWVzaQotCXB1c2gJZWRpCi0KLQlnZXRfR09UCWVieAkJCTsgZ2V0IEdPVCBhZGRyZXNzCi0JbW92cGljCVBPSU5URVIgW2dvdHB0cl0sIGVieAk7IHNhdmUgR09UIGFkZHJlc3MKLQotCW1vdgllZHgsZWF4CQkJCTsgZWR4ID0gb3JpZ2luYWwgZWJwCi0JbW92CWVheCwgUE9JTlRFUiBbY29tcHB0cihlZHgpXQotCW1vdgllYXgsIEpESU1FTlNJT04gW2pjb21waW5mb19kb3duc2FtcGxlZF93aWR0aChlYXgpXSAgOyBjb2xjdHIKLQl0ZXN0CWVheCxlYXgKLQlqegluZWFyIC5yZXR1cm4KLQotCW1vdgllY3gsIFBPSU5URVIgW2NpbmZvKGVkeCldCi0JbW92CWVjeCwgSU5UIFtqZHN0cnVjdF9tYXhfdl9zYW1wX2ZhY3RvcihlY3gpXQk7IHJvd2N0cgotCXRlc3QJZWN4LGVjeAotCWp6CW5lYXIgLnJldHVybgotCi0JbW92CWVzaSwgSlNBTVBBUlJBWSBbaW5wdXRfZGF0YShlZHgpXQk7IGlucHV0X2RhdGEKLQltb3YJZWRpLCBQT0lOVEVSIFtvdXRwdXRfZGF0YV9wdHIoZWR4KV0KLQltb3YJZWRpLCBKU0FNUEFSUkFZIFtlZGldCQkJOyBvdXRwdXRfZGF0YQotCWFsaWdueAkxNiw3Ci0ucm93bG9vcDoKLQlwdXNoCWVheAkJCQkJOyBjb2xjdHIKLQlwdXNoCWVjeAotCXB1c2gJZWRpCi0JcHVzaAllc2kKLQotCW1vdgllY3gsIEpTQU1QUk9XIFtlc2ktMSpTSVpFT0ZfSlNBTVBST1ddCTsgaW5wdHIxKGFib3ZlKQotCW1vdgllYngsIEpTQU1QUk9XIFtlc2krMCpTSVpFT0ZfSlNBTVBST1ddCTsgaW5wdHIwCi0JbW92CWVzaSwgSlNBTVBST1cgW2VzaSsxKlNJWkVPRl9KU0FNUFJPV10JOyBpbnB0cjEoYmVsb3cpCi0JbW92CWVkeCwgSlNBTVBST1cgW2VkaSswKlNJWkVPRl9KU0FNUFJPV10JOyBvdXRwdHIwCi0JbW92CWVkaSwgSlNBTVBST1cgW2VkaSsxKlNJWkVPRl9KU0FNUFJPV10JOyBvdXRwdHIxCi0KLQl0ZXN0CWVheCwgU0laRU9GX1hNTVdPUkQtMQotCWp6CXNob3J0IC5za2lwCi0JcHVzaAllZHgKLQltb3YJZGwsIEpTQU1QTEUgW2VjeCsoZWF4LTEpKlNJWkVPRl9KU0FNUExFXQotCW1vdglKU0FNUExFIFtlY3grZWF4KlNJWkVPRl9KU0FNUExFXSwgZGwKLQltb3YJZGwsIEpTQU1QTEUgW2VieCsoZWF4LTEpKlNJWkVPRl9KU0FNUExFXQotCW1vdglKU0FNUExFIFtlYngrZWF4KlNJWkVPRl9KU0FNUExFXSwgZGwKLQltb3YJZGwsIEpTQU1QTEUgW2VzaSsoZWF4LTEpKlNJWkVPRl9KU0FNUExFXQotCW1vdglKU0FNUExFIFtlc2krZWF4KlNJWkVPRl9KU0FNUExFXSwgZGwJOyBpbnNlcnQgYSBkdW1teSBzYW1wbGUKLQlwb3AJZWR4Ci0uc2tpcDoKLQk7IC0tIHByb2Nlc3MgdGhlIGZpcnN0IGNvbHVtbiBibG9jawotCi0JbW92ZHFhCXhtbTAsIFhNTVdPUkQgW2VieCswKlNJWkVPRl9YTU1XT1JEXQk7IHhtbTA9cm93WyAwXVswXQotCW1vdmRxYQl4bW0xLCBYTU1XT1JEIFtlY3grMCpTSVpFT0ZfWE1NV09SRF0JOyB4bW0xPXJvd1stMV1bMF0KLQltb3ZkcWEJeG1tMiwgWE1NV09SRCBbZXNpKzAqU0laRU9GX1hNTVdPUkRdCTsgeG1tMj1yb3dbKzFdWzBdCi0KLQlwdXNocGljCWVieAotCW1vdnBpYwllYngsIFBPSU5URVIgW2dvdHB0cl0JOyBsb2FkIEdPVCBhZGRyZXNzCi0KLQlweG9yICAgICAgeG1tMyx4bW0zCQk7IHhtbTM9KGFsbCAwJ3MpCi0JbW92ZHFhICAgIHhtbTQseG1tMAotCXB1bnBja2xidyB4bW0wLHhtbTMJCTsgeG1tMD1yb3dbIDBdKCAwICAxICAyICAzICA0ICA1ICA2ICA3KQotCXB1bnBja2hidyB4bW00LHhtbTMJCTsgeG1tND1yb3dbIDBdKCA4ICA5IDEwIDExIDEyIDEzIDE0IDE1KQotCW1vdmRxYSAgICB4bW01LHhtbTEKLQlwdW5wY2tsYncgeG1tMSx4bW0zCQk7IHhtbTE9cm93Wy0xXSggMCAgMSAgMiAgMyAgNCAgNSAgNiAgNykKLQlwdW5wY2toYncgeG1tNSx4bW0zCQk7IHhtbTU9cm93Wy0xXSggOCAgOSAxMCAxMSAxMiAxMyAxNCAxNSkKLQltb3ZkcWEgICAgeG1tNix4bW0yCi0JcHVucGNrbGJ3IHhtbTIseG1tMwkJOyB4bW0yPXJvd1srMV0oIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcpCi0JcHVucGNraGJ3IHhtbTYseG1tMwkJOyB4bW02PXJvd1srMV0oIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUpCi0KLQlwbXVsbHcJeG1tMCxbR09UT0ZGKGVieCxQV19USFJFRSldCi0JcG11bGx3CXhtbTQsW0dPVE9GRihlYngsUFdfVEhSRUUpXQotCi0JcGNtcGVxYgl4bW03LHhtbTcKLQlwc3JsZHEJeG1tNywoU0laRU9GX1hNTVdPUkQtMikKLQotCXBhZGR3CXhtbTEseG1tMAkJOyB4bW0xPUludDBMPSggMCAgMSAgMiAgMyAgNCAgNSAgNiAgNykKLQlwYWRkdwl4bW01LHhtbTQJCTsgeG1tNT1JbnQwSD0oIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUpCi0JcGFkZHcJeG1tMix4bW0wCQk7IHhtbTI9SW50MUw9KCAwICAxICAyICAzICA0ICA1ICA2ICA3KQotCXBhZGR3CXhtbTYseG1tNAkJOyB4bW02PUludDFIPSggOCAgOSAxMCAxMSAxMiAxMyAxNCAxNSkKLQotCW1vdmRxYQlYTU1XT1JEIFtlZHgrMCpTSVpFT0ZfWE1NV09SRF0sIHhtbTEJOyB0ZW1wb3JhcmlseSBzYXZlCi0JbW92ZHFhCVhNTVdPUkQgW2VkeCsxKlNJWkVPRl9YTU1XT1JEXSwgeG1tNQk7IHRoZSBpbnRlcm1lZGlhdGUgZGF0YQotCW1vdmRxYQlYTU1XT1JEIFtlZGkrMCpTSVpFT0ZfWE1NV09SRF0sIHhtbTIKLQltb3ZkcWEJWE1NV09SRCBbZWRpKzEqU0laRU9GX1hNTVdPUkRdLCB4bW02Ci0KLQlwYW5kCXhtbTEseG1tNwkJOyB4bW0xPSggMCAtLSAtLSAtLSAtLSAtLSAtLSAtLSkKLQlwYW5kCXhtbTIseG1tNwkJOyB4bW0yPSggMCAtLSAtLSAtLSAtLSAtLSAtLSAtLSkKLQotCW1vdmRxYQlYTU1XT1JEIFt3aygwKV0sIHhtbTEKLQltb3ZkcWEJWE1NV09SRCBbd2soMSldLCB4bW0yCi0KLQlwb3BwaWMJZWJ4Ci0KLQlhZGQJZWF4LCBieXRlIFNJWkVPRl9YTU1XT1JELTEKLQlhbmQJZWF4LCBieXRlIC1TSVpFT0ZfWE1NV09SRAotCWNtcAllYXgsIGJ5dGUgU0laRU9GX1hNTVdPUkQKLQlqYQlzaG9ydCAuY29sdW1ubG9vcAotCWFsaWdueAkxNiw3Ci0KLS5jb2x1bW5sb29wX2xhc3Q6Ci0JOyAtLSBwcm9jZXNzIHRoZSBsYXN0IGNvbHVtbiBibG9jawotCi0JcHVzaHBpYwllYngKLQltb3ZwaWMJZWJ4LCBQT0lOVEVSIFtnb3RwdHJdCTsgbG9hZCBHT1QgYWRkcmVzcwotCi0JcGNtcGVxYgl4bW0xLHhtbTEKLQlwc2xsZHEJeG1tMSwoU0laRU9GX1hNTVdPUkQtMikKLQltb3ZkcWEJeG1tMix4bW0xCi0KLQlwYW5kCXhtbTEsIFhNTVdPUkQgW2VkeCsxKlNJWkVPRl9YTU1XT1JEXQotCXBhbmQJeG1tMiwgWE1NV09SRCBbZWRpKzEqU0laRU9GX1hNTVdPUkRdCi0KLQltb3ZkcWEJWE1NV09SRCBbd2soMildLCB4bW0xCTsgeG1tMT0oLS0gLS0gLS0gLS0gLS0gLS0gLS0gMTUpCi0JbW92ZHFhCVhNTVdPUkQgW3drKDMpXSwgeG1tMgk7IHhtbTI9KC0tIC0tIC0tIC0tIC0tIC0tIC0tIDE1KQotCi0Jam1wCW5lYXIgLnVwc2FtcGxlCi0JYWxpZ254CTE2LDcKLQotLmNvbHVtbmxvb3A6Ci0JOyAtLSBwcm9jZXNzIHRoZSBuZXh0IGNvbHVtbiBibG9jawotCi0JbW92ZHFhCXhtbTAsIFhNTVdPUkQgW2VieCsxKlNJWkVPRl9YTU1XT1JEXQk7IHhtbTA9cm93WyAwXVsxXQotCW1vdmRxYQl4bW0xLCBYTU1XT1JEIFtlY3grMSpTSVpFT0ZfWE1NV09SRF0JOyB4bW0xPXJvd1stMV1bMV0KLQltb3ZkcWEJeG1tMiwgWE1NV09SRCBbZXNpKzEqU0laRU9GX1hNTVdPUkRdCTsgeG1tMj1yb3dbKzFdWzFdCi0KLQlwdXNocGljCWVieAotCW1vdnBpYwllYngsIFBPSU5URVIgW2dvdHB0cl0JOyBsb2FkIEdPVCBhZGRyZXNzCi0KLQlweG9yICAgICAgeG1tMyx4bW0zCQk7IHhtbTM9KGFsbCAwJ3MpCi0JbW92ZHFhICAgIHhtbTQseG1tMAotCXB1bnBja2xidyB4bW0wLHhtbTMJCTsgeG1tMD1yb3dbIDBdKCAwICAxICAyICAzICA0ICA1ICA2ICA3KQotCXB1bnBja2hidyB4bW00LHhtbTMJCTsgeG1tND1yb3dbIDBdKCA4ICA5IDEwIDExIDEyIDEzIDE0IDE1KQotCW1vdmRxYSAgICB4bW01LHhtbTEKLQlwdW5wY2tsYncgeG1tMSx4bW0zCQk7IHhtbTE9cm93Wy0xXSggMCAgMSAgMiAgMyAgNCAgNSAgNiAgNykKLQlwdW5wY2toYncgeG1tNSx4bW0zCQk7IHhtbTU9cm93Wy0xXSggOCAgOSAxMCAxMSAxMiAxMyAxNCAxNSkKLQltb3ZkcWEgICAgeG1tNix4bW0yCi0JcHVucGNrbGJ3IHhtbTIseG1tMwkJOyB4bW0yPXJvd1srMV0oIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcpCi0JcHVucGNraGJ3IHhtbTYseG1tMwkJOyB4bW02PXJvd1srMV0oIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUpCi0KLQlwbXVsbHcJeG1tMCxbR09UT0ZGKGVieCxQV19USFJFRSldCi0JcG11bGx3CXhtbTQsW0dPVE9GRihlYngsUFdfVEhSRUUpXQotCi0JcGFkZHcJeG1tMSx4bW0wCQk7IHhtbTE9SW50MEw9KCAwICAxICAyICAzICA0ICA1ICA2ICA3KQotCXBhZGR3CXhtbTUseG1tNAkJOyB4bW01PUludDBIPSggOCAgOSAxMCAxMSAxMiAxMyAxNCAxNSkKLQlwYWRkdwl4bW0yLHhtbTAJCTsgeG1tMj1JbnQxTD0oIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcpCi0JcGFkZHcJeG1tNix4bW00CQk7IHhtbTY9SW50MUg9KCA4ICA5IDEwIDExIDEyIDEzIDE0IDE1KQotCi0JbW92ZHFhCVhNTVdPUkQgW2VkeCsyKlNJWkVPRl9YTU1XT1JEXSwgeG1tMQk7IHRlbXBvcmFyaWx5IHNhdmUKLQltb3ZkcWEJWE1NV09SRCBbZWR4KzMqU0laRU9GX1hNTVdPUkRdLCB4bW01CTsgdGhlIGludGVybWVkaWF0ZSBkYXRhCi0JbW92ZHFhCVhNTVdPUkQgW2VkaSsyKlNJWkVPRl9YTU1XT1JEXSwgeG1tMgotCW1vdmRxYQlYTU1XT1JEIFtlZGkrMypTSVpFT0ZfWE1NV09SRF0sIHhtbTYKLQotCXBzbGxkcQl4bW0xLChTSVpFT0ZfWE1NV09SRC0yKQk7IHhtbTE9KC0tIC0tIC0tIC0tIC0tIC0tIC0tICAwKQotCXBzbGxkcQl4bW0yLChTSVpFT0ZfWE1NV09SRC0yKQk7IHhtbTI9KC0tIC0tIC0tIC0tIC0tIC0tIC0tICAwKQotCi0JbW92ZHFhCVhNTVdPUkQgW3drKDIpXSwgeG1tMQotCW1vdmRxYQlYTU1XT1JEIFt3aygzKV0sIHhtbTIKLQotLnVwc2FtcGxlOgotCTsgLS0gcHJvY2VzcyB0aGUgdXBwZXIgcm93Ci0KLQltb3ZkcWEJeG1tNywgWE1NV09SRCBbZWR4KzAqU0laRU9GX1hNTVdPUkRdCi0JbW92ZHFhCXhtbTMsIFhNTVdPUkQgW2VkeCsxKlNJWkVPRl9YTU1XT1JEXQotCi0JbW92ZHFhCXhtbTAseG1tNwkJOyB4bW03PUludDBMPSggMCAgMSAgMiAgMyAgNCAgNSAgNiAgNykKLQltb3ZkcWEJeG1tNCx4bW0zCQk7IHhtbTM9SW50MEg9KCA4ICA5IDEwIDExIDEyIDEzIDE0IDE1KQotCXBzcmxkcQl4bW0wLDIJCQk7IHhtbTA9KCAxICAyICAzICA0ICA1ICA2ICA3IC0tKQotCXBzbGxkcQl4bW00LChTSVpFT0ZfWE1NV09SRC0yKQk7IHhtbTQ9KC0tIC0tIC0tIC0tIC0tIC0tIC0tICA4KQotCW1vdmRxYQl4bW01LHhtbTcKLQltb3ZkcWEJeG1tNix4bW0zCi0JcHNybGRxCXhtbTUsKFNJWkVPRl9YTU1XT1JELTIpCTsgeG1tNT0oIDcgLS0gLS0gLS0gLS0gLS0gLS0gLS0pCi0JcHNsbGRxCXhtbTYsMgkJCTsgeG1tNj0oLS0gIDggIDkgMTAgMTEgMTIgMTMgMTQpCi0KLQlwb3IJeG1tMCx4bW00CQk7IHhtbTA9KCAxICAyICAzICA0ICA1ICA2ICA3ICA4KQotCXBvcgl4bW01LHhtbTYJCTsgeG1tNT0oIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQpCi0KLQltb3ZkcWEJeG1tMSx4bW03Ci0JbW92ZHFhCXhtbTIseG1tMwotCXBzbGxkcQl4bW0xLDIJCQk7IHhtbTE9KC0tICAwICAxICAyICAzICA0ICA1ICA2KQotCXBzcmxkcQl4bW0yLDIJCQk7IHhtbTI9KCA5IDEwIDExIDEyIDEzIDE0IDE1IC0tKQotCW1vdmRxYQl4bW00LHhtbTMKLQlwc3JsZHEJeG1tNCwoU0laRU9GX1hNTVdPUkQtMikJOyB4bW00PSgxNSAtLSAtLSAtLSAtLSAtLSAtLSAtLSkKLQotCXBvcgl4bW0xLCBYTU1XT1JEIFt3aygwKV0JOyB4bW0xPSgtMSAgMCAgMSAgMiAgMyAgNCAgNSAgNikKLQlwb3IJeG1tMiwgWE1NV09SRCBbd2soMildCTsgeG1tMj0oIDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYpCi0KLQltb3ZkcWEJWE1NV09SRCBbd2soMCldLCB4bW00Ci0KLQlwbXVsbHcJeG1tNyxbR09UT0ZGKGVieCxQV19USFJFRSldCi0JcG11bGx3CXhtbTMsW0dPVE9GRihlYngsUFdfVEhSRUUpXQotCXBhZGR3CXhtbTEsW0dPVE9GRihlYngsUFdfRUlHSFQpXQotCXBhZGR3CXhtbTUsW0dPVE9GRihlYngsUFdfRUlHSFQpXQotCXBhZGR3CXhtbTAsW0dPVE9GRihlYngsUFdfU0VWRU4pXQotCXBhZGR3CXhtbTIsW0dPVE9GRihlYngsUFdfU0VWRU4pXQotCi0JcGFkZHcJeG1tMSx4bW03Ci0JcGFkZHcJeG1tNSx4bW0zCi0JcHNybHcJeG1tMSw0CQkJOyB4bW0xPU91dDBMRT0oIDAgIDIgIDQgIDYgIDggMTAgMTIgMTQpCi0JcHNybHcJeG1tNSw0CQkJOyB4bW01PU91dDBIRT0oMTYgMTggMjAgMjIgMjQgMjYgMjggMzApCi0JcGFkZHcJeG1tMCx4bW03Ci0JcGFkZHcJeG1tMix4bW0zCi0JcHNybHcJeG1tMCw0CQkJOyB4bW0wPU91dDBMTz0oIDEgIDMgIDUgIDcgIDkgMTEgMTMgMTUpCi0JcHNybHcJeG1tMiw0CQkJOyB4bW0yPU91dDBITz0oMTcgMTkgMjEgMjMgMjUgMjcgMjkgMzEpCi0KLQlwc2xsdwl4bW0wLEJZVEVfQklUCi0JcHNsbHcJeG1tMixCWVRFX0JJVAotCXBvcgl4bW0xLHhtbTAJCTsgeG1tMT1PdXQwTD0oIDAgIDEgIDIgLi4uIDEzIDE0IDE1KQotCXBvcgl4bW01LHhtbTIJCTsgeG1tNT1PdXQwSD0oMTYgMTcgMTggLi4uIDI5IDMwIDMxKQotCi0JbW92ZHFhCVhNTVdPUkQgW2VkeCswKlNJWkVPRl9YTU1XT1JEXSwgeG1tMQotCW1vdmRxYQlYTU1XT1JEIFtlZHgrMSpTSVpFT0ZfWE1NV09SRF0sIHhtbTUKLQotCTsgLS0gcHJvY2VzcyB0aGUgbG93ZXIgcm93Ci0KLQltb3ZkcWEJeG1tNiwgWE1NV09SRCBbZWRpKzAqU0laRU9GX1hNTVdPUkRdCi0JbW92ZHFhCXhtbTQsIFhNTVdPUkQgW2VkaSsxKlNJWkVPRl9YTU1XT1JEXQotCi0JbW92ZHFhCXhtbTcseG1tNgkJOyB4bW02PUludDFMPSggMCAgMSAgMiAgMyAgNCAgNSAgNiAgNykKLQltb3ZkcWEJeG1tMyx4bW00CQk7IHhtbTQ9SW50MUg9KCA4ICA5IDEwIDExIDEyIDEzIDE0IDE1KQotCXBzcmxkcQl4bW03LDIJCQk7IHhtbTc9KCAxICAyICAzICA0ICA1ICA2ICA3IC0tKQotCXBzbGxkcQl4bW0zLChTSVpFT0ZfWE1NV09SRC0yKQk7IHhtbTM9KC0tIC0tIC0tIC0tIC0tIC0tIC0tICA4KQotCW1vdmRxYQl4bW0wLHhtbTYKLQltb3ZkcWEJeG1tMix4bW00Ci0JcHNybGRxCXhtbTAsKFNJWkVPRl9YTU1XT1JELTIpCTsgeG1tMD0oIDcgLS0gLS0gLS0gLS0gLS0gLS0gLS0pCi0JcHNsbGRxCXhtbTIsMgkJCTsgeG1tMj0oLS0gIDggIDkgMTAgMTEgMTIgMTMgMTQpCi0KLQlwb3IJeG1tNyx4bW0zCQk7IHhtbTc9KCAxICAyICAzICA0ICA1ICA2ICA3ICA4KQotCXBvcgl4bW0wLHhtbTIJCTsgeG1tMD0oIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQpCi0KLQltb3ZkcWEJeG1tMSx4bW02Ci0JbW92ZHFhCXhtbTUseG1tNAotCXBzbGxkcQl4bW0xLDIJCQk7IHhtbTE9KC0tICAwICAxICAyICAzICA0ICA1ICA2KQotCXBzcmxkcQl4bW01LDIJCQk7IHhtbTU9KCA5IDEwIDExIDEyIDEzIDE0IDE1IC0tKQotCW1vdmRxYQl4bW0zLHhtbTQKLQlwc3JsZHEJeG1tMywoU0laRU9GX1hNTVdPUkQtMikJOyB4bW0zPSgxNSAtLSAtLSAtLSAtLSAtLSAtLSAtLSkKLQotCXBvcgl4bW0xLCBYTU1XT1JEIFt3aygxKV0JOyB4bW0xPSgtMSAgMCAgMSAgMiAgMyAgNCAgNSAgNikKLQlwb3IJeG1tNSwgWE1NV09SRCBbd2soMyldCTsgeG1tNT0oIDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYpCi0KLQltb3ZkcWEJWE1NV09SRCBbd2soMSldLCB4bW0zCi0KLQlwbXVsbHcJeG1tNixbR09UT0ZGKGVieCxQV19USFJFRSldCi0JcG11bGx3CXhtbTQsW0dPVE9GRihlYngsUFdfVEhSRUUpXQotCXBhZGR3CXhtbTEsW0dPVE9GRihlYngsUFdfRUlHSFQpXQotCXBhZGR3CXhtbTAsW0dPVE9GRihlYngsUFdfRUlHSFQpXQotCXBhZGR3CXhtbTcsW0dPVE9GRihlYngsUFdfU0VWRU4pXQotCXBhZGR3CXhtbTUsW0dPVE9GRihlYngsUFdfU0VWRU4pXQotCi0JcGFkZHcJeG1tMSx4bW02Ci0JcGFkZHcJeG1tMCx4bW00Ci0JcHNybHcJeG1tMSw0CQkJOyB4bW0xPU91dDFMRT0oIDAgIDIgIDQgIDYgIDggMTAgMTIgMTQpCi0JcHNybHcJeG1tMCw0CQkJOyB4bW0wPU91dDFIRT0oMTYgMTggMjAgMjIgMjQgMjYgMjggMzApCi0JcGFkZHcJeG1tNyx4bW02Ci0JcGFkZHcJeG1tNSx4bW00Ci0JcHNybHcJeG1tNyw0CQkJOyB4bW03PU91dDFMTz0oIDEgIDMgIDUgIDcgIDkgMTEgMTMgMTUpCi0JcHNybHcJeG1tNSw0CQkJOyB4bW01PU91dDFITz0oMTcgMTkgMjEgMjMgMjUgMjcgMjkgMzEpCi0KLQlwc2xsdwl4bW03LEJZVEVfQklUCi0JcHNsbHcJeG1tNSxCWVRFX0JJVAotCXBvcgl4bW0xLHhtbTcJCTsgeG1tMT1PdXQxTD0oIDAgIDEgIDIgLi4uIDEzIDE0IDE1KQotCXBvcgl4bW0wLHhtbTUJCTsgeG1tMD1PdXQxSD0oMTYgMTcgMTggLi4uIDI5IDMwIDMxKQotCi0JbW92ZHFhCVhNTVdPUkQgW2VkaSswKlNJWkVPRl9YTU1XT1JEXSwgeG1tMQotCW1vdmRxYQlYTU1XT1JEIFtlZGkrMSpTSVpFT0ZfWE1NV09SRF0sIHhtbTAKLQotCXBvcHBpYwllYngKLQotCXN1YgllYXgsIGJ5dGUgU0laRU9GX1hNTVdPUkQKLQlhZGQJZWN4LCBieXRlIDEqU0laRU9GX1hNTVdPUkQJOyBpbnB0cjEoYWJvdmUpCi0JYWRkCWVieCwgYnl0ZSAxKlNJWkVPRl9YTU1XT1JECTsgaW5wdHIwCi0JYWRkCWVzaSwgYnl0ZSAxKlNJWkVPRl9YTU1XT1JECTsgaW5wdHIxKGJlbG93KQotCWFkZAllZHgsIGJ5dGUgMipTSVpFT0ZfWE1NV09SRAk7IG91dHB0cjAKLQlhZGQJZWRpLCBieXRlIDIqU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIxCi0JY21wCWVheCwgYnl0ZSBTSVpFT0ZfWE1NV09SRAotCWphCW5lYXIgLmNvbHVtbmxvb3AKLQl0ZXN0CWVheCxlYXgKLQlqbnoJbmVhciAuY29sdW1ubG9vcF9sYXN0Ci0KLQlwb3AJZXNpCi0JcG9wCWVkaQotCXBvcAllY3gKLQlwb3AJZWF4Ci0KLQlhZGQJZXNpLCBieXRlIDEqU0laRU9GX0pTQU1QUk9XCTsgaW5wdXRfZGF0YQotCWFkZAllZGksIGJ5dGUgMipTSVpFT0ZfSlNBTVBST1cJOyBvdXRwdXRfZGF0YQotCXN1YgllY3gsIGJ5dGUgMgkJCTsgcm93Y3RyCi0JamcJbmVhciAucm93bG9vcAotCi0ucmV0dXJuOgotCXBvcAllZGkKLQlwb3AJZXNpCi07CXBvcAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXBvcAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcG9wCWVieAotCW1vdgllc3AsZWJwCQk7IGVzcCA8LSBhbGlnbmVkIGVicAotCXBvcAllc3AJCTsgZXNwIDwtIG9yaWdpbmFsIGVicAotCXBvcAllYnAKLQlyZXQKLQotJWlmZGVmIFVQU0FNUExFX0gxVjJfU1VQUE9SVEVECi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsKLTsgRmFuY3kgcHJvY2Vzc2luZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIDE6MSBob3Jpem9udGFsIGFuZCAyOjEgdmVydGljYWwuCi07IEFnYWluIGEgdHJpYW5nbGUgZmlsdGVyOyBzZWUgY29tbWVudHMgZm9yIGgydjEgY2FzZSwgYWJvdmUuCi07Ci07IEdMT0JBTCh2b2lkKQotOyBqcGVnX2gxdjJfZmFuY3lfdXBzYW1wbGVfc3NlMiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cik7Ci07Ci0KLSVkZWZpbmUgY2luZm8oYikJCShiKSs4CQk7IGpfZGVjb21wcmVzc19wdHIgY2luZm8KLSVkZWZpbmUgY29tcHB0cihiKQkJKGIpKzEyCQk7IGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyCi0lZGVmaW5lIGlucHV0X2RhdGEoYikJCShiKSsxNgkJOyBKU0FNUEFSUkFZIGlucHV0X2RhdGEKLSVkZWZpbmUgb3V0cHV0X2RhdGFfcHRyKGIpCShiKSsyMAkJOyBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyCi0KLSVkZWZpbmUgZ290cHRyCQllYnAtU0laRU9GX1BPSU5URVIJOyB2b2lkICogZ290cHRyCi0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfaDF2Ml9mYW5jeV91cHNhbXBsZV9zc2UyKQotCi1FWFROKGpwZWdfaDF2Ml9mYW5jeV91cHNhbXBsZV9zc2UyKToKLQlwdXNoCWVicAotCW1vdgllYnAsZXNwCi0JcHVzaHBpYwllYXgJCTsgbWFrZSBhIHJvb20gZm9yIEdPVCBhZGRyZXNzCi0JcHVzaAllYngKLTsJcHVzaAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXB1c2gJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXB1c2gJZXNpCi0JcHVzaAllZGkKLQotCWdldF9HT1QJZWJ4CQkJOyBnZXQgR09UIGFkZHJlc3MKLQltb3ZwaWMJUE9JTlRFUiBbZ290cHRyXSwgZWJ4CTsgc2F2ZSBHT1QgYWRkcmVzcwotCi0JbW92CWVheCwgUE9JTlRFUiBbY29tcHB0cihlYnApXQotCW1vdgllYXgsIEpESU1FTlNJT04gW2pjb21waW5mb19kb3duc2FtcGxlZF93aWR0aChlYXgpXSAgOyBjb2xjdHIKLQlhZGQJZWF4LCBieXRlIFNJWkVPRl9YTU1XT1JELTEKLQlhbmQJZWF4LCBieXRlIC1TSVpFT0ZfWE1NV09SRAotCWp6CW5lYXIgLnJldHVybgotCi0JbW92CWVjeCwgUE9JTlRFUiBbY2luZm8oZWJwKV0KLQltb3YJZWN4LCBJTlQgW2pkc3RydWN0X21heF92X3NhbXBfZmFjdG9yKGVjeCldCTsgcm93Y3RyCi0JdGVzdAllY3gsZWN4Ci0JanoJbmVhciAucmV0dXJuCi0KLQltb3YJZXNpLCBKU0FNUEFSUkFZIFtpbnB1dF9kYXRhKGVicCldCTsgaW5wdXRfZGF0YQotCW1vdgllZGksIFBPSU5URVIgW291dHB1dF9kYXRhX3B0cihlYnApXQotCW1vdgllZGksIEpTQU1QQVJSQVkgW2VkaV0JCQk7IG91dHB1dF9kYXRhCi0JYWxpZ254CTE2LDcKLS5yb3dsb29wOgotCXB1c2gJZWF4CQkJCQk7IGNvbGN0cgotCXB1c2gJZWN4Ci0JcHVzaAllZGkKLQlwdXNoCWVzaQotCi0JbW92CWVjeCwgSlNBTVBST1cgW2VzaS0xKlNJWkVPRl9KU0FNUFJPV10JOyBpbnB0cjEoYWJvdmUpCi0JbW92CWVieCwgSlNBTVBST1cgW2VzaSswKlNJWkVPRl9KU0FNUFJPV10JOyBpbnB0cjAKLQltb3YJZXNpLCBKU0FNUFJPVyBbZXNpKzEqU0laRU9GX0pTQU1QUk9XXQk7IGlucHRyMShiZWxvdykKLQltb3YJZWR4LCBKU0FNUFJPVyBbZWRpKzAqU0laRU9GX0pTQU1QUk9XXQk7IG91dHB0cjAKLQltb3YJZWRpLCBKU0FNUFJPVyBbZWRpKzEqU0laRU9GX0pTQU1QUk9XXQk7IG91dHB0cjEKLQotCXB4b3IJeG1tMCx4bW0wCQk7IHhtbTA9KGFsbCAwJ3MpCi0JYWxpZ254CTE2LDcKLQotLmNvbHVtbmxvb3A6Ci0JbW92ZHFhCXhtbTEsIFhNTVdPUkQgW2VieF0JOyB4bW0xPXJvd1sgMF0oIDAgIDEgIDIgLi4uIDEzIDE0IDE1KQotCW1vdmRxYQl4bW0yLCBYTU1XT1JEIFtlY3hdCTsgeG1tMj1yb3dbLTFdKCAwICAxICAyIC4uLiAxMyAxNCAxNSkKLQltb3ZkcWEJeG1tMywgWE1NV09SRCBbZXNpXQk7IHhtbTM9cm93WysxXSggMCAgMSAgMiAuLi4gMTMgMTQgMTUpCi0KLQlwdXNocGljCWVieAotCW1vdnBpYwllYngsIFBPSU5URVIgW2dvdHB0cl0JOyBsb2FkIEdPVCBhZGRyZXNzCi0KLQltb3ZkcWEgICAgeG1tNCx4bW0xCi0JcHVucGNrbGJ3IHhtbTEseG1tMAkJOyB4bW0xPXJvd1sgMF0oIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcpCi0JcHVucGNraGJ3IHhtbTQseG1tMAkJOyB4bW00PXJvd1sgMF0oIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUpCi0JbW92ZHFhICAgIHhtbTUseG1tMgotCXB1bnBja2xidyB4bW0yLHhtbTAJCTsgeG1tMj1yb3dbLTFdKCAwICAxICAyICAzICA0ICA1ICA2ICA3KQotCXB1bnBja2hidyB4bW01LHhtbTAJCTsgeG1tNT1yb3dbLTFdKCA4ICA5IDEwIDExIDEyIDEzIDE0IDE1KQotCW1vdmRxYSAgICB4bW02LHhtbTMKLQlwdW5wY2tsYncgeG1tMyx4bW0wCQk7IHhtbTM9cm93WysxXSggMCAgMSAgMiAgMyAgNCAgNSAgNiAgNykKLQlwdW5wY2toYncgeG1tNix4bW0wCQk7IHhtbTY9cm93WysxXSggOCAgOSAxMCAxMSAxMiAxMyAxNCAxNSkKLQotCXBtdWxsdwl4bW0xLFtHT1RPRkYoZWJ4LFBXX1RIUkVFKV0KLQlwbXVsbHcJeG1tNCxbR09UT0ZGKGVieCxQV19USFJFRSldCi0JcGFkZHcJeG1tMixbR09UT0ZGKGVieCxQV19PTkUpXQotCXBhZGR3CXhtbTUsW0dPVE9GRihlYngsUFdfT05FKV0KLQlwYWRkdwl4bW0zLFtHT1RPRkYoZWJ4LFBXX1RXTyldCi0JcGFkZHcJeG1tNixbR09UT0ZGKGVieCxQV19UV08pXQotCi0JcGFkZHcJeG1tMix4bW0xCi0JcGFkZHcJeG1tNSx4bW00Ci0JcHNybHcJeG1tMiwyCQkJOyB4bW0yPU91dDBMPSggMCAgMSAgMiAgMyAgNCAgNSAgNiAgNykKLQlwc3Jsdwl4bW01LDIJCQk7IHhtbTU9T3V0MEg9KCA4ICA5IDEwIDExIDEyIDEzIDE0IDE1KQotCXBhZGR3CXhtbTMseG1tMQotCXBhZGR3CXhtbTYseG1tNAotCXBzcmx3CXhtbTMsMgkJCTsgeG1tMz1PdXQxTD0oIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcpCi0JcHNybHcJeG1tNiwyCQkJOyB4bW02PU91dDFIPSggOCAgOSAxMCAxMSAxMiAxMyAxNCAxNSkKLQotCXBhY2t1c3diICB4bW0yLHhtbTUJCTsgeG1tMj1PdXQwPSggMCAgMSAgMiAuLi4gMTMgMTQgMTUpCi0JcGFja3Vzd2IgIHhtbTMseG1tNgkJOyB4bW0zPU91dDE9KCAwICAxICAyIC4uLiAxMyAxNCAxNSkKLQotCW1vdmRxYQlYTU1XT1JEIFtlZHhdLCB4bW0yCi0JbW92ZHFhCVhNTVdPUkQgW2VkaV0sIHhtbTMKLQotCXBvcHBpYwllYngKLQotCWFkZAllY3gsIGJ5dGUgMSpTSVpFT0ZfWE1NV09SRAk7IGlucHRyMShhYm92ZSkKLQlhZGQJZWJ4LCBieXRlIDEqU0laRU9GX1hNTVdPUkQJOyBpbnB0cjAKLQlhZGQJZXNpLCBieXRlIDEqU0laRU9GX1hNTVdPUkQJOyBpbnB0cjEoYmVsb3cpCi0JYWRkCWVkeCwgYnl0ZSAxKlNJWkVPRl9YTU1XT1JECTsgb3V0cHRyMAotCWFkZAllZGksIGJ5dGUgMSpTSVpFT0ZfWE1NV09SRAk7IG91dHB0cjEKLQlzdWIJZWF4LCBieXRlIFNJWkVPRl9YTU1XT1JECi0Jam56CW5lYXIgLmNvbHVtbmxvb3AKLQotCXBvcAllc2kKLQlwb3AJZWRpCi0JcG9wCWVjeAotCXBvcAllYXgKLQotCWFkZAllc2ksIGJ5dGUgMSpTSVpFT0ZfSlNBTVBST1cJOyBpbnB1dF9kYXRhCi0JYWRkCWVkaSwgYnl0ZSAyKlNJWkVPRl9KU0FNUFJPVwk7IG91dHB1dF9kYXRhCi0Jc3ViCWVjeCwgYnl0ZSAyCQkJOyByb3djdHIKLQlqZwluZWFyIC5yb3dsb29wCi0KLS5yZXR1cm46Ci0JcG9wCWVkaQotCXBvcAllc2kKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwb3AJZWJ4Ci0JcG9wcGljCWVheAkJOyByZW1vdmUgZ290cHRyCi0JcG9wCWVicAotCXJldAotCi0lZW5kaWYgOyBVUFNBTVBMRV9IMVYyX1NVUFBPUlRFRAotJWVuZGlmIDsgSkRTQU1QTEVfRkFOQ1lfU1NFMl9TVVBQT1JURUQKLQotJWlmZGVmIEpEU0FNUExFX1NJTVBMRV9TU0UyX1NVUFBPUlRFRAotCi0laWZuZGVmIEpEU0FNUExFX0ZBTkNZX1NTRTJfU1VQUE9SVEVECi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JU0VDVElPTglTRUdfVEVYVAotCUJJVFMJMzIKLSVlbmRpZgotOwotOyBGYXN0IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMToxIHZlcnRpY2FsLgotOyBJdCdzIHN0aWxsIGEgYm94IGZpbHRlci4KLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfaDJ2MV91cHNhbXBsZV9zc2UyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKTsKLTsKLQotJWRlZmluZSBjaW5mbyhiKQkJKGIpKzgJCTsgal9kZWNvbXByZXNzX3B0ciBjaW5mbwotJWRlZmluZSBjb21wcHRyKGIpCQkoYikrMTIJCTsganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIKLSVkZWZpbmUgaW5wdXRfZGF0YShiKQkJKGIpKzE2CQk7IEpTQU1QQVJSQVkgaW5wdXRfZGF0YQotJWRlZmluZSBvdXRwdXRfZGF0YV9wdHIoYikJKGIpKzIwCQk7IEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIKLQotCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19oMnYxX3Vwc2FtcGxlX3NzZTIpCi0KLUVYVE4oanBlZ19oMnYxX3Vwc2FtcGxlX3NzZTIpOgotCXB1c2gJZWJwCi0JbW92CWVicCxlc3AKLTsJcHVzaAllYngJCTsgdW51c2VkCi07CXB1c2gJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwdXNoCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwdXNoCWVzaQotCXB1c2gJZWRpCi0KLQltb3YJZWR4LCBQT0lOVEVSIFtjaW5mbyhlYnApXQotCW1vdgllZHgsIEpESU1FTlNJT04gW2pkc3RydWN0X291dHB1dF93aWR0aChlZHgpXQotCWFkZAllZHgsIGJ5dGUgKDIqU0laRU9GX1hNTVdPUkQpLTEKLQlhbmQJZWR4LCBieXRlIC0oMipTSVpFT0ZfWE1NV09SRCkKLQlqeglzaG9ydCAucmV0dXJuCi0KLQltb3YJZWN4LCBQT0lOVEVSIFtjaW5mbyhlYnApXQotCW1vdgllY3gsIElOVCBbamRzdHJ1Y3RfbWF4X3Zfc2FtcF9mYWN0b3IoZWN4KV0JOyByb3djdHIKLQl0ZXN0CWVjeCxlY3gKLQlqeglzaG9ydCAucmV0dXJuCi0KLQltb3YJZXNpLCBKU0FNUEFSUkFZIFtpbnB1dF9kYXRhKGVicCldCTsgaW5wdXRfZGF0YQotCW1vdgllZGksIFBPSU5URVIgW291dHB1dF9kYXRhX3B0cihlYnApXQotCW1vdgllZGksIEpTQU1QQVJSQVkgW2VkaV0JCQk7IG91dHB1dF9kYXRhCi0JYWxpZ254CTE2LDcKLS5yb3dsb29wOgotCXB1c2gJZWRpCi0JcHVzaAllc2kKLQotCW1vdgllc2ksIEpTQU1QUk9XIFtlc2ldCQk7IGlucHRyCi0JbW92CWVkaSwgSlNBTVBST1cgW2VkaV0JCTsgb3V0cHRyCi0JbW92CWVheCxlZHgJCQkJOyBjb2xjdHIKLQlhbGlnbngJMTYsNwotLmNvbHVtbmxvb3A6Ci0KLQltb3ZkcWEJeG1tMCwgWE1NV09SRCBbZXNpKzAqU0laRU9GX1hNTVdPUkRdCi0KLQltb3ZkcWEgICAgeG1tMSx4bW0wCi0JcHVucGNrbGJ3IHhtbTAseG1tMAotCXB1bnBja2hidyB4bW0xLHhtbTEKLQotCW1vdmRxYQlYTU1XT1JEIFtlZGkrMCpTSVpFT0ZfWE1NV09SRF0sIHhtbTAKLQltb3ZkcWEJWE1NV09SRCBbZWRpKzEqU0laRU9GX1hNTVdPUkRdLCB4bW0xCi0KLQlzdWIJZWF4LCBieXRlIDIqU0laRU9GX1hNTVdPUkQKLQlqeglzaG9ydCAubmV4dHJvdwotCi0JbW92ZHFhCXhtbTIsIFhNTVdPUkQgW2VzaSsxKlNJWkVPRl9YTU1XT1JEXQotCi0JbW92ZHFhICAgIHhtbTMseG1tMgotCXB1bnBja2xidyB4bW0yLHhtbTIKLQlwdW5wY2toYncgeG1tMyx4bW0zCi0KLQltb3ZkcWEJWE1NV09SRCBbZWRpKzIqU0laRU9GX1hNTVdPUkRdLCB4bW0yCi0JbW92ZHFhCVhNTVdPUkQgW2VkaSszKlNJWkVPRl9YTU1XT1JEXSwgeG1tMwotCi0Jc3ViCWVheCwgYnl0ZSAyKlNJWkVPRl9YTU1XT1JECi0JanoJc2hvcnQgLm5leHRyb3cKLQotCWFkZAllc2ksIGJ5dGUgMipTSVpFT0ZfWE1NV09SRAk7IGlucHRyCi0JYWRkCWVkaSwgYnl0ZSA0KlNJWkVPRl9YTU1XT1JECTsgb3V0cHRyCi0Jam1wCXNob3J0IC5jb2x1bW5sb29wCi0JYWxpZ254CTE2LDcKLQotLm5leHRyb3c6Ci0JcG9wCWVzaQotCXBvcAllZGkKLQotCWFkZAllc2ksIGJ5dGUgU0laRU9GX0pTQU1QUk9XCTsgaW5wdXRfZGF0YQotCWFkZAllZGksIGJ5dGUgU0laRU9GX0pTQU1QUk9XCTsgb3V0cHV0X2RhdGEKLQlkZWMJZWN4CQkJCTsgcm93Y3RyCi0JamcJc2hvcnQgLnJvd2xvb3AKLQotLnJldHVybjoKLQlwb3AJZWRpCi0JcG9wCWVzaQotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWJ4CQk7IHVudXNlZAotCXBvcAllYnAKLQlyZXQKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOwotOyBGYXN0IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLgotOyBJdCdzIHN0aWxsIGEgYm94IGZpbHRlci4KLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfaDJ2Ml91cHNhbXBsZV9zc2UyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKTsKLTsKLQotJWRlZmluZSBjaW5mbyhiKQkJKGIpKzgJCTsgal9kZWNvbXByZXNzX3B0ciBjaW5mbwotJWRlZmluZSBjb21wcHRyKGIpCQkoYikrMTIJCTsganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIKLSVkZWZpbmUgaW5wdXRfZGF0YShiKQkJKGIpKzE2CQk7IEpTQU1QQVJSQVkgaW5wdXRfZGF0YQotJWRlZmluZSBvdXRwdXRfZGF0YV9wdHIoYikJKGIpKzIwCQk7IEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIKLQotCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19oMnYyX3Vwc2FtcGxlX3NzZTIpCi0KLUVYVE4oanBlZ19oMnYyX3Vwc2FtcGxlX3NzZTIpOgotCXB1c2gJZWJwCi0JbW92CWVicCxlc3AKLQlwdXNoCWVieAotOwlwdXNoCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcHVzaAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcHVzaAllc2kKLQlwdXNoCWVkaQotCi0JbW92CWVkeCwgUE9JTlRFUiBbY2luZm8oZWJwKV0KLQltb3YJZWR4LCBKRElNRU5TSU9OIFtqZHN0cnVjdF9vdXRwdXRfd2lkdGgoZWR4KV0KLQlhZGQJZWR4LCBieXRlICgyKlNJWkVPRl9YTU1XT1JEKS0xCi0JYW5kCWVkeCwgYnl0ZSAtKDIqU0laRU9GX1hNTVdPUkQpCi0JanoJbmVhciAucmV0dXJuCi0KLQltb3YJZWN4LCBQT0lOVEVSIFtjaW5mbyhlYnApXQotCW1vdgllY3gsIElOVCBbamRzdHJ1Y3RfbWF4X3Zfc2FtcF9mYWN0b3IoZWN4KV0JOyByb3djdHIKLQl0ZXN0CWVjeCxlY3gKLQlqegluZWFyIC5yZXR1cm4KLQotCW1vdgllc2ksIEpTQU1QQVJSQVkgW2lucHV0X2RhdGEoZWJwKV0JOyBpbnB1dF9kYXRhCi0JbW92CWVkaSwgUE9JTlRFUiBbb3V0cHV0X2RhdGFfcHRyKGVicCldCi0JbW92CWVkaSwgSlNBTVBBUlJBWSBbZWRpXQkJCTsgb3V0cHV0X2RhdGEKLQlhbGlnbngJMTYsNwotLnJvd2xvb3A6Ci0JcHVzaAllZGkKLQlwdXNoCWVzaQotCi0JbW92CWVzaSwgSlNBTVBST1cgW2VzaV0JCQk7IGlucHRyCi0JbW92CWVieCwgSlNBTVBST1cgW2VkaSswKlNJWkVPRl9KU0FNUFJPV10JOyBvdXRwdHIwCi0JbW92CWVkaSwgSlNBTVBST1cgW2VkaSsxKlNJWkVPRl9KU0FNUFJPV10JOyBvdXRwdHIxCi0JbW92CWVheCxlZHgJCQkJCTsgY29sY3RyCi0JYWxpZ254CTE2LDcKLS5jb2x1bW5sb29wOgotCi0JbW92ZHFhCXhtbTAsIFhNTVdPUkQgW2VzaSswKlNJWkVPRl9YTU1XT1JEXQotCi0JbW92ZHFhICAgIHhtbTEseG1tMAotCXB1bnBja2xidyB4bW0wLHhtbTAKLQlwdW5wY2toYncgeG1tMSx4bW0xCi0KLQltb3ZkcWEJWE1NV09SRCBbZWJ4KzAqU0laRU9GX1hNTVdPUkRdLCB4bW0wCi0JbW92ZHFhCVhNTVdPUkQgW2VieCsxKlNJWkVPRl9YTU1XT1JEXSwgeG1tMQotCW1vdmRxYQlYTU1XT1JEIFtlZGkrMCpTSVpFT0ZfWE1NV09SRF0sIHhtbTAKLQltb3ZkcWEJWE1NV09SRCBbZWRpKzEqU0laRU9GX1hNTVdPUkRdLCB4bW0xCi0KLQlzdWIJZWF4LCBieXRlIDIqU0laRU9GX1hNTVdPUkQKLQlqeglzaG9ydCAubmV4dHJvdwotCi0JbW92ZHFhCXhtbTIsIFhNTVdPUkQgW2VzaSsxKlNJWkVPRl9YTU1XT1JEXQotCi0JbW92ZHFhICAgIHhtbTMseG1tMgotCXB1bnBja2xidyB4bW0yLHhtbTIKLQlwdW5wY2toYncgeG1tMyx4bW0zCi0KLQltb3ZkcWEJWE1NV09SRCBbZWJ4KzIqU0laRU9GX1hNTVdPUkRdLCB4bW0yCi0JbW92ZHFhCVhNTVdPUkQgW2VieCszKlNJWkVPRl9YTU1XT1JEXSwgeG1tMwotCW1vdmRxYQlYTU1XT1JEIFtlZGkrMipTSVpFT0ZfWE1NV09SRF0sIHhtbTIKLQltb3ZkcWEJWE1NV09SRCBbZWRpKzMqU0laRU9GX1hNTVdPUkRdLCB4bW0zCi0KLQlzdWIJZWF4LCBieXRlIDIqU0laRU9GX1hNTVdPUkQKLQlqeglzaG9ydCAubmV4dHJvdwotCi0JYWRkCWVzaSwgYnl0ZSAyKlNJWkVPRl9YTU1XT1JECTsgaW5wdHIKLQlhZGQJZWJ4LCBieXRlIDQqU0laRU9GX1hNTVdPUkQJOyBvdXRwdHIwCi0JYWRkCWVkaSwgYnl0ZSA0KlNJWkVPRl9YTU1XT1JECTsgb3V0cHRyMQotCWptcAlzaG9ydCAuY29sdW1ubG9vcAotCWFsaWdueAkxNiw3Ci0KLS5uZXh0cm93OgotCXBvcAllc2kKLQlwb3AJZWRpCi0KLQlhZGQJZXNpLCBieXRlIDEqU0laRU9GX0pTQU1QUk9XCTsgaW5wdXRfZGF0YQotCWFkZAllZGksIGJ5dGUgMipTSVpFT0ZfSlNBTVBST1cJOyBvdXRwdXRfZGF0YQotCXN1YgllY3gsIGJ5dGUgMgkJCTsgcm93Y3RyCi0JamcJc2hvcnQgLnJvd2xvb3AKLQotLnJldHVybjoKLQlwb3AJZWRpCi0JcG9wCWVzaQotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXBvcAllYngKLQlwb3AJZWJwCi0JcmV0Ci0KLSVlbmRpZiA7IEpEU0FNUExFX1NJTVBMRV9TU0UyX1NVUFBPUlRFRApkaWZmIC0tZ2l0IGEvamYzZG5mbHQuYXNtIGIvamYzZG5mbHQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTE3ZGQ0Li4wMDAwMDAwCi0tLSBhL2pmM2RuZmx0LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi07Ci07IGpmM2RuZmx0LmFzbSAtIGZsb2F0aW5nLXBvaW50IEZEQ1QgKDNETm93ISkKLTsKLTsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Ci07IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi07IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKLTsKLTsgVGhpcyBmaWxlIHNob3VsZCBiZSBhc3NlbWJsZWQgd2l0aCBOQVNNIChOZXR3aWRlIEFzc2VtYmxlciksCi07IGNhbiAqbm90KiBiZSBhc3NlbWJsZWQgd2l0aCBNaWNyb3NvZnQncyBNQVNNIG9yIGFueSBjb21wYXRpYmxlCi07IGFzc2VtYmxlciAoaW5jbHVkaW5nIEJvcmxhbmQncyBUdXJibyBBc3NlbWJsZXIpLgotOyBOQVNNIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9uYXNtLnNvdXJjZWZvcmdlLm5ldC8gb3IKLTsgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NjIwOAotOwotOyBUaGlzIGZpbGUgY29udGFpbnMgYSBmbG9hdGluZy1wb2ludCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZm9yd2FyZCBEQ1QKLTsgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgYmFzZWQgZGlyZWN0bHkgb24KLTsgdGhlIElKRydzIG9yaWdpbmFsIGpmZGN0Zmx0LmM7IHNlZSB0aGUgamZkY3RmbHQuYyBmb3IgbW9yZSBkZXRhaWxzLgotOwotOyBMYXN0IE1vZGlmaWVkIDogRmVicnVhcnkgNCwgMjAwNgotOwotOyBbVEFCOF0KLQotJWluY2x1ZGUgImpzaW1kZXh0LmluYyIKLSVpbmNsdWRlICJqZGN0LmluYyIKLQotJWlmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLSVpZmRlZiBKRkRDVF9GTFRfM0ROT1dfTU1YX1NVUFBPUlRFRAotCi07IFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotOwotJWlmIERDVFNJWkUgIT0gOAotJWVycm9yICJTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4iCi0lZW5kaWYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX0NPTlNUCi0KLQlhbGlnbnoJMTYKLQlnbG9iYWwJRVhUTihqY29uc3RfZmRjdF9mbG9hdF8zZG5vdykKLQotRVhUTihqY29uc3RfZmRjdF9mbG9hdF8zZG5vdyk6Ci0KLVBEXzBfMzgyCXRpbWVzIDIgZGQgIDAuMzgyNjgzNDMyMzY1MDg5NzcxNzI4NDYwCi1QRF8wXzcwNwl0aW1lcyAyIGRkICAwLjcwNzEwNjc4MTE4NjU0NzUyNDQwMDg0NAotUERfMF81NDEJdGltZXMgMiBkZCAgMC41NDExOTYxMDAxNDYxOTY5ODQzOTk3MjMKLVBEXzFfMzA2CXRpbWVzIDIgZGQgIDEuMzA2NTYyOTY0ODc2Mzc2NTI3ODU2NjQzCi0KLQlhbGlnbnoJMTYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX1RFWFQKLQlCSVRTCTMyCi07Ci07IFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIG9uZSBibG9jayBvZiBzYW1wbGVzLgotOwotOyBHTE9CQUwodm9pZCkKLTsganBlZ19mZGN0X2Zsb2F0XzNkbm93IChGQVNUX0ZMT0FUICogZGF0YSkKLTsKLQotJWRlZmluZSBkYXRhKGIpCQkoYikrOAkJOyBGQVNUX0ZMT0FUICogZGF0YQotCi0lZGVmaW5lIG9yaWdpbmFsX2VicAllYnArMAotJWRlZmluZSB3ayhpKQkJZWJwLShXS19OVU0tKGkpKSpTSVpFT0ZfTU1XT1JECTsgbW13b3JkIHdrW1dLX05VTV0KLSVkZWZpbmUgV0tfTlVNCQkyCi0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfZmRjdF9mbG9hdF8zZG5vdykKLQotRVhUTihqcGVnX2ZkY3RfZmxvYXRfM2Rub3cpOgotCXB1c2gJZWJwCi0JbW92CWVheCxlc3AJCQkJOyBlYXggPSBvcmlnaW5hbCBlYnAKLQlzdWIJZXNwLCBieXRlIDQKLQlhbmQJZXNwLCBieXRlICgtU0laRU9GX01NV09SRCkJOyBhbGlnbiB0byA2NCBiaXRzCi0JbW92CVtlc3BdLGVheAotCW1vdgllYnAsZXNwCQkJCTsgZWJwID0gYWxpZ25lZCBlYnAKLQlsZWEJZXNwLCBbd2soMCldCi0JcHVzaHBpYwllYngKLTsJcHVzaAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXB1c2gJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwdXNoCWVzaQkJOyB1bnVzZWQKLTsJcHVzaAllZGkJCTsgdW51c2VkCi0KLQlnZXRfR09UCWVieAkJOyBnZXQgR09UIGFkZHJlc3MKLQotCTsgLS0tLSBQYXNzIDE6IHByb2Nlc3Mgcm93cy4KLQotCW1vdgllZHgsIFBPSU5URVIgW2RhdGEoZWF4KV0JOyAoRkFTVF9GTE9BVCAqKQotCW1vdgllY3gsIERDVFNJWkUvMgotCWFsaWdueAkxNiw3Ci0ucm93bG9vcDoKLQotCW1vdnEJbW0wLCBNTVdPUkQgW01NQkxPQ0soMCwwLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92cQltbTEsIE1NV09SRCBbTU1CTE9DSygxLDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQltb3ZxCW1tMiwgTU1XT1JEIFtNTUJMT0NLKDAsMyxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCW1vdnEJbW0zLCBNTVdPUkQgW01NQkxPQ0soMSwzLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0KLQk7IG1tMD0oMDAgMDEpLCBtbTE9KDEwIDExKSwgbW0yPSgwNiAwNyksIG1tMz0oMTYgMTcpCi0KLQltb3ZxICAgICAgbW00LG1tMAkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzCi0JcHVucGNrbGRxIG1tMCxtbTEJCTsgbW0wPSgwMCAxMCk9ZGF0YTAKLQlwdW5wY2toZHEgbW00LG1tMQkJOyBtbTQ9KDAxIDExKT1kYXRhMQotCW1vdnEgICAgICBtbTUsbW0yCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMKLQlwdW5wY2tsZHEgbW0yLG1tMwkJOyBtbTI9KDA2IDE2KT1kYXRhNgotCXB1bnBja2hkcSBtbTUsbW0zCQk7IG1tNT0oMDcgMTcpPWRhdGE3Ci0KLQltb3ZxCW1tNixtbTQKLQltb3ZxCW1tNyxtbTAKLQlwZnN1YgltbTQsbW0yCQkJOyBtbTQ9ZGF0YTEtZGF0YTY9dG1wNgotCXBmc3ViCW1tMCxtbTUJCQk7IG1tMD1kYXRhMC1kYXRhNz10bXA3Ci0JcGZhZGQJbW02LG1tMgkJCTsgbW02PWRhdGExK2RhdGE2PXRtcDEKLQlwZmFkZAltbTcsbW01CQkJOyBtbTc9ZGF0YTArZGF0YTc9dG1wMAotCi0JbW92cQltbTEsIE1NV09SRCBbTU1CTE9DSygwLDEsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQltb3ZxCW1tMywgTU1XT1JEIFtNTUJMT0NLKDEsMSxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCW1vdnEJbW0yLCBNTVdPUkQgW01NQkxPQ0soMCwyLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92cQltbTUsIE1NV09SRCBbTU1CTE9DSygxLDIsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQotCTsgbW0xPSgwMiAwMyksIG1tMz0oMTIgMTMpLCBtbTI9KDA0IDA1KSwgbW01PSgxNCAxNSkKLQotCW1vdnEJTU1XT1JEIFt3aygwKV0sIG1tNAk7IHdrKDApPXRtcDYKLQltb3ZxCU1NV09SRCBbd2soMSldLCBtbTAJOyB3aygxKT10bXA3Ci0KLQltb3ZxICAgICAgbW00LG1tMQkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzCi0JcHVucGNrbGRxIG1tMSxtbTMJCTsgbW0xPSgwMiAxMik9ZGF0YTIKLQlwdW5wY2toZHEgbW00LG1tMwkJOyBtbTQ9KDAzIDEzKT1kYXRhMwotCW1vdnEgICAgICBtbTAsbW0yCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMKLQlwdW5wY2tsZHEgbW0yLG1tNQkJOyBtbTI9KDA0IDE0KT1kYXRhNAotCXB1bnBja2hkcSBtbTAsbW01CQk7IG1tMD0oMDUgMTUpPWRhdGE1Ci0KLQltb3ZxCW1tMyxtbTQKLQltb3ZxCW1tNSxtbTEKLQlwZmFkZAltbTQsbW0yCQkJOyBtbTQ9ZGF0YTMrZGF0YTQ9dG1wMwotCXBmYWRkCW1tMSxtbTAJCQk7IG1tMT1kYXRhMitkYXRhNT10bXAyCi0JcGZzdWIJbW0zLG1tMgkJCTsgbW0zPWRhdGEzLWRhdGE0PXRtcDQKLQlwZnN1YgltbTUsbW0wCQkJOyBtbTU9ZGF0YTItZGF0YTU9dG1wNQotCi0JOyAtLSBFdmVuIHBhcnQKLQotCW1vdnEJbW0yLG1tNwotCW1vdnEJbW0wLG1tNgotCXBmc3ViCW1tNyxtbTQJCQk7IG1tNz10bXAxMwotCXBmc3ViCW1tNixtbTEJCQk7IG1tNj10bXAxMgotCXBmYWRkCW1tMixtbTQJCQk7IG1tMj10bXAxMAotCXBmYWRkCW1tMCxtbTEJCQk7IG1tMD10bXAxMQotCi0JcGZhZGQJbW02LG1tNwotCXBmbXVsCW1tNixbR09UT0ZGKGVieCxQRF8wXzcwNyldIDsgbW02PXoxCi0KLQltb3ZxCW1tNCxtbTIKLQltb3ZxCW1tMSxtbTcKLQlwZnN1YgltbTIsbW0wCQkJOyBtbTI9ZGF0YTQKLQlwZnN1YgltbTcsbW02CQkJOyBtbTc9ZGF0YTYKLQlwZmFkZAltbTQsbW0wCQkJOyBtbTQ9ZGF0YTAKLQlwZmFkZAltbTEsbW02CQkJOyBtbTE9ZGF0YTIKLQotCW1vdnEJTU1XT1JEIFtNTUJMT0NLKDAsMixlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXSwgbW0yCi0JbW92cQlNTVdPUkQgW01NQkxPQ0soMCwzLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldLCBtbTcKLQltb3ZxCU1NV09SRCBbTU1CTE9DSygwLDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0sIG1tNAotCW1vdnEJTU1XT1JEIFtNTUJMT0NLKDAsMSxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXSwgbW0xCi0KLQk7IC0tIE9kZCBwYXJ0Ci0KLQltb3ZxCW1tMCwgTU1XT1JEIFt3aygwKV0JOyBtbTA9dG1wNgotCW1vdnEJbW02LCBNTVdPUkQgW3drKDEpXQk7IG1tNj10bXA3Ci0KLQlwZmFkZAltbTMsbW01CQkJOyBtbTM9dG1wMTAKLQlwZmFkZAltbTUsbW0wCQkJOyBtbTU9dG1wMTEKLQlwZmFkZAltbTAsbW02CQkJOyBtbTA9dG1wMTIsIG1tNj10bXA3Ci0KLQlwZm11bAltbTUsW0dPVE9GRihlYngsUERfMF83MDcpXSA7IG1tNT16MwotCi0JbW92cQltbTIsbW0zCQkJOyBtbTI9dG1wMTAKLQlwZnN1YgltbTMsbW0wCi0JcGZtdWwJbW0zLFtHT1RPRkYoZWJ4LFBEXzBfMzgyKV0gOyBtbTM9ejUKLQlwZm11bAltbTIsW0dPVE9GRihlYngsUERfMF81NDEpXSA7IG1tMj1NVUxUSVBMWSh0bXAxMCxGSVhfMF81NDExOTYxMCkKLQlwZm11bAltbTAsW0dPVE9GRihlYngsUERfMV8zMDYpXSA7IG1tMD1NVUxUSVBMWSh0bXAxMixGSVhfMV8zMDY1NjI5NikKLQlwZmFkZAltbTIsbW0zCQkJOyBtbTI9ejIKLQlwZmFkZAltbTAsbW0zCQkJOyBtbTA9ejQKLQotCW1vdnEJbW03LG1tNgotCXBmc3ViCW1tNixtbTUJCQk7IG1tNj16MTMKLQlwZmFkZAltbTcsbW01CQkJOyBtbTc9ejExCi0KLQltb3ZxCW1tNCxtbTYKLQltb3ZxCW1tMSxtbTcKLQlwZnN1YgltbTYsbW0yCQkJOyBtbTY9ZGF0YTMKLQlwZnN1YgltbTcsbW0wCQkJOyBtbTc9ZGF0YTcKLQlwZmFkZAltbTQsbW0yCQkJOyBtbTQ9ZGF0YTUKLQlwZmFkZAltbTEsbW0wCQkJOyBtbTE9ZGF0YTEKLQotCW1vdnEJTU1XT1JEIFtNTUJMT0NLKDEsMSxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXSwgbW02Ci0JbW92cQlNTVdPUkQgW01NQkxPQ0soMSwzLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldLCBtbTcKLQltb3ZxCU1NV09SRCBbTU1CTE9DSygxLDIsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0sIG1tNAotCW1vdnEJTU1XT1JEIFtNTUJMT0NLKDEsMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXSwgbW0xCi0KLQlhZGQJZWR4LCBieXRlIDIqRENUU0laRSpTSVpFT0ZfRkFTVF9GTE9BVAotCWRlYwllY3gKLQlqbnoJbmVhciAucm93bG9vcAotCi0JOyAtLS0tIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgotCi0JbW92CWVkeCwgUE9JTlRFUiBbZGF0YShlYXgpXQk7IChGQVNUX0ZMT0FUICopCi0JbW92CWVjeCwgRENUU0laRS8yCi0JYWxpZ254CTE2LDcKLS5jb2x1bW5sb29wOgotCi0JbW92cQltbTAsIE1NV09SRCBbTU1CTE9DSygwLDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQltb3ZxCW1tMSwgTU1XT1JEIFtNTUJMT0NLKDEsMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCW1vdnEJbW0yLCBNTVdPUkQgW01NQkxPQ0soNiwwLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92cQltbTMsIE1NV09SRCBbTU1CTE9DSyg3LDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQotCTsgbW0wPSgwMCAxMCksIG1tMT0oMDEgMTEpLCBtbTI9KDYwIDcwKSwgbW0zPSg2MSA3MSkKLQotCW1vdnEgICAgICBtbTQsbW0wCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMKLQlwdW5wY2tsZHEgbW0wLG1tMQkJOyBtbTA9KDAwIDAxKT1kYXRhMAotCXB1bnBja2hkcSBtbTQsbW0xCQk7IG1tND0oMTAgMTEpPWRhdGExCi0JbW92cSAgICAgIG1tNSxtbTIJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cwotCXB1bnBja2xkcSBtbTIsbW0zCQk7IG1tMj0oNjAgNjEpPWRhdGE2Ci0JcHVucGNraGRxIG1tNSxtbTMJCTsgbW01PSg3MCA3MSk9ZGF0YTcKLQotCW1vdnEJbW02LG1tNAotCW1vdnEJbW03LG1tMAotCXBmc3ViCW1tNCxtbTIJCQk7IG1tND1kYXRhMS1kYXRhNj10bXA2Ci0JcGZzdWIJbW0wLG1tNQkJCTsgbW0wPWRhdGEwLWRhdGE3PXRtcDcKLQlwZmFkZAltbTYsbW0yCQkJOyBtbTY9ZGF0YTErZGF0YTY9dG1wMQotCXBmYWRkCW1tNyxtbTUJCQk7IG1tNz1kYXRhMCtkYXRhNz10bXAwCi0KLQltb3ZxCW1tMSwgTU1XT1JEIFtNTUJMT0NLKDIsMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCW1vdnEJbW0zLCBNTVdPUkQgW01NQkxPQ0soMywwLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92cQltbTIsIE1NV09SRCBbTU1CTE9DSyg0LDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQltb3ZxCW1tNSwgTU1XT1JEIFtNTUJMT0NLKDUsMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCi0JOyBtbTE9KDIwIDMwKSwgbW0zPSgyMSAzMSksIG1tMj0oNDAgNTApLCBtbTU9KDQxIDUxKQotCi0JbW92cQlNTVdPUkQgW3drKDApXSwgbW00CTsgd2soMCk9dG1wNgotCW1vdnEJTU1XT1JEIFt3aygxKV0sIG1tMAk7IHdrKDEpPXRtcDcKLQotCW1vdnEgICAgICBtbTQsbW0xCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMKLQlwdW5wY2tsZHEgbW0xLG1tMwkJOyBtbTE9KDIwIDIxKT1kYXRhMgotCXB1bnBja2hkcSBtbTQsbW0zCQk7IG1tND0oMzAgMzEpPWRhdGEzCi0JbW92cSAgICAgIG1tMCxtbTIJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cwotCXB1bnBja2xkcSBtbTIsbW01CQk7IG1tMj0oNDAgNDEpPWRhdGE0Ci0JcHVucGNraGRxIG1tMCxtbTUJCTsgbW0wPSg1MCA1MSk9ZGF0YTUKLQotCW1vdnEJbW0zLG1tNAotCW1vdnEJbW01LG1tMQotCXBmYWRkCW1tNCxtbTIJCQk7IG1tND1kYXRhMytkYXRhND10bXAzCi0JcGZhZGQJbW0xLG1tMAkJCTsgbW0xPWRhdGEyK2RhdGE1PXRtcDIKLQlwZnN1YgltbTMsbW0yCQkJOyBtbTM9ZGF0YTMtZGF0YTQ9dG1wNAotCXBmc3ViCW1tNSxtbTAJCQk7IG1tNT1kYXRhMi1kYXRhNT10bXA1Ci0KLQk7IC0tIEV2ZW4gcGFydAotCi0JbW92cQltbTIsbW03Ci0JbW92cQltbTAsbW02Ci0JcGZzdWIJbW03LG1tNAkJCTsgbW03PXRtcDEzCi0JcGZzdWIJbW02LG1tMQkJCTsgbW02PXRtcDEyCi0JcGZhZGQJbW0yLG1tNAkJCTsgbW0yPXRtcDEwCi0JcGZhZGQJbW0wLG1tMQkJCTsgbW0wPXRtcDExCi0KLQlwZmFkZAltbTYsbW03Ci0JcGZtdWwJbW02LFtHT1RPRkYoZWJ4LFBEXzBfNzA3KV0gOyBtbTY9ejEKLQotCW1vdnEJbW00LG1tMgotCW1vdnEJbW0xLG1tNwotCXBmc3ViCW1tMixtbTAJCQk7IG1tMj1kYXRhNAotCXBmc3ViCW1tNyxtbTYJCQk7IG1tNz1kYXRhNgotCXBmYWRkCW1tNCxtbTAJCQk7IG1tND1kYXRhMAotCXBmYWRkCW1tMSxtbTYJCQk7IG1tMT1kYXRhMgotCi0JbW92cQlNTVdPUkQgW01NQkxPQ0soNCwwLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldLCBtbTIKLQltb3ZxCU1NV09SRCBbTU1CTE9DSyg2LDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0sIG1tNwotCW1vdnEJTU1XT1JEIFtNTUJMT0NLKDAsMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXSwgbW00Ci0JbW92cQlNTVdPUkQgW01NQkxPQ0soMiwwLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldLCBtbTEKLQotCTsgLS0gT2RkIHBhcnQKLQotCW1vdnEJbW0wLCBNTVdPUkQgW3drKDApXQk7IG1tMD10bXA2Ci0JbW92cQltbTYsIE1NV09SRCBbd2soMSldCTsgbW02PXRtcDcKLQotCXBmYWRkCW1tMyxtbTUJCQk7IG1tMz10bXAxMAotCXBmYWRkCW1tNSxtbTAJCQk7IG1tNT10bXAxMQotCXBmYWRkCW1tMCxtbTYJCQk7IG1tMD10bXAxMiwgbW02PXRtcDcKLQotCXBmbXVsCW1tNSxbR09UT0ZGKGVieCxQRF8wXzcwNyldIDsgbW01PXozCi0KLQltb3ZxCW1tMixtbTMJCQk7IG1tMj10bXAxMAotCXBmc3ViCW1tMyxtbTAKLQlwZm11bAltbTMsW0dPVE9GRihlYngsUERfMF8zODIpXSA7IG1tMz16NQotCXBmbXVsCW1tMixbR09UT0ZGKGVieCxQRF8wXzU0MSldIDsgbW0yPU1VTFRJUExZKHRtcDEwLEZJWF8wXzU0MTE5NjEwKQotCXBmbXVsCW1tMCxbR09UT0ZGKGVieCxQRF8xXzMwNildIDsgbW0wPU1VTFRJUExZKHRtcDEyLEZJWF8xXzMwNjU2Mjk2KQotCXBmYWRkCW1tMixtbTMJCQk7IG1tMj16MgotCXBmYWRkCW1tMCxtbTMJCQk7IG1tMD16NAotCi0JbW92cQltbTcsbW02Ci0JcGZzdWIJbW02LG1tNQkJCTsgbW02PXoxMwotCXBmYWRkCW1tNyxtbTUJCQk7IG1tNz16MTEKLQotCW1vdnEJbW00LG1tNgotCW1vdnEJbW0xLG1tNwotCXBmc3ViCW1tNixtbTIJCQk7IG1tNj1kYXRhMwotCXBmc3ViCW1tNyxtbTAJCQk7IG1tNz1kYXRhNwotCXBmYWRkCW1tNCxtbTIJCQk7IG1tND1kYXRhNQotCXBmYWRkCW1tMSxtbTAJCQk7IG1tMT1kYXRhMQotCi0JbW92cQlNTVdPUkQgW01NQkxPQ0soMywwLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldLCBtbTYKLQltb3ZxCU1NV09SRCBbTU1CTE9DSyg3LDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0sIG1tNwotCW1vdnEJTU1XT1JEIFtNTUJMT0NLKDUsMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXSwgbW00Ci0JbW92cQlNTVdPUkQgW01NQkxPQ0soMSwwLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldLCBtbTEKLQotCWFkZAllZHgsIGJ5dGUgMipTSVpFT0ZfRkFTVF9GTE9BVAotCWRlYwllY3gKLQlqbnoJbmVhciAuY29sdW1ubG9vcAotCi0JZmVtbXMJCTsgZW1wdHkgTU1YLzNETm93ISBzdGF0ZQotCi07CXBvcAllZGkJCTsgdW51c2VkCi07CXBvcAllc2kJCTsgdW51c2VkCi07CXBvcAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXBvcAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcG9wcGljCWVieAotCW1vdgllc3AsZWJwCQk7IGVzcCA8LSBhbGlnbmVkIGVicAotCXBvcAllc3AJCTsgZXNwIDwtIG9yaWdpbmFsIGVicAotCXBvcAllYnAKLQlyZXQKLQotJWVuZGlmIDsgSkZEQ1RfRkxUXzNETk9XX01NWF9TVVBQT1JURUQKLSVlbmRpZiA7IERDVF9GTE9BVF9TVVBQT1JURUQKZGlmZiAtLWdpdCBhL2pmZGN0Zmx0LmFzbSBiL2pmZGN0Zmx0LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4ZTFmOS4uMDAwMDAwMAotLS0gYS9qZmRjdGZsdC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotOwotOyBqZmRjdGZsdC5hc20gLSBmbG9hdGluZy1wb2ludCBGRENUIChub24tU0lNRCkKLTsKLTsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Ci07IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi07IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKLTsKLTsgVGhpcyBmaWxlIHNob3VsZCBiZSBhc3NlbWJsZWQgd2l0aCBOQVNNIChOZXR3aWRlIEFzc2VtYmxlciksCi07IGNhbiAqbm90KiBiZSBhc3NlbWJsZWQgd2l0aCBNaWNyb3NvZnQncyBNQVNNIG9yIGFueSBjb21wYXRpYmxlCi07IGFzc2VtYmxlciAoaW5jbHVkaW5nIEJvcmxhbmQncyBUdXJibyBBc3NlbWJsZXIpLgotOyBOQVNNIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9uYXNtLnNvdXJjZWZvcmdlLm5ldC8gb3IKLTsgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NjIwOAotOwotOyBUaGlzIGZpbGUgY29udGFpbnMgYSBmbG9hdGluZy1wb2ludCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZm9yd2FyZCBEQ1QKLTsgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgYmFzZWQgZGlyZWN0bHkgb24KLTsgdGhlIElKRydzIG9yaWdpbmFsIGpmZGN0Zmx0LmM7IHNlZSB0aGUgamZkY3RmbHQuYyBmb3IgbW9yZSBkZXRhaWxzLgotOwotOyBMYXN0IE1vZGlmaWVkIDogT2N0b2JlciAxNywgMjAwNAotOwotOyBbVEFCOF0KLQotJWluY2x1ZGUgImpzaW1kZXh0LmluYyIKLSVpbmNsdWRlICJqZGN0LmluYyIKLQotJWlmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLQotOyBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLTsKLSVpZiBEQ1RTSVpFICE9IDgKLSVlcnJvciAiU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIgotJWVuZGlmCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19DT05TVAotCi0lZGVmaW5lIFJPVEFUT1JfVFlQRQlGUDMyCTsgZmxvYXQKLQotCWFsaWduegkxNgotCWdsb2JhbAlFWFROKGpjb25zdF9mZGN0X2Zsb2F0KQotCi1FWFROKGpjb25zdF9mZGN0X2Zsb2F0KToKLQotRl8wXzM4MglkZAkwLjM4MjY4MzQzMjM2NTA4OTc3MTcyODQ2MAk7IGNvcyhQSSozLzgpCi1GXzBfNzA3CWRkCTAuNzA3MTA2NzgxMTg2NTQ3NTI0NDAwODQ0CTsgY29zKFBJKjEvNCkKLUZfMF81NDEJZGQJMC41NDExOTYxMDAxNDYxOTY5ODQzOTk3MjMJOyBjb3MoUEkqMS84KS1jb3MoUEkqMy84KQotRl8xXzMwNglkZAkxLjMwNjU2Mjk2NDg3NjM3NjUyNzg1NjY0Mwk7IGNvcyhQSSoxLzgpK2NvcyhQSSozLzgpCi0KLQlhbGlnbnoJMTYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX1RFWFQKLQlCSVRTCTMyCi07Ci07IFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIG9uZSBibG9jayBvZiBzYW1wbGVzLgotOwotOyBHTE9CQUwodm9pZCkKLTsganBlZ19mZGN0X2Zsb2F0IChGQVNUX0ZMT0FUICogZGF0YSkKLTsKLQotJWRlZmluZSBkYXRhKGIpCShiKSs4CQk7IEZBU1RfRkxPQVQgKiBkYXRhCi0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfZmRjdF9mbG9hdCkKLQotRVhUTihqcGVnX2ZkY3RfZmxvYXQpOgotCXB1c2gJZWJwCi0JbW92CWVicCxlc3AKLQlwdXNocGljCWVieAotOwlwdXNoCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcHVzaAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXB1c2gJZXNpCQk7IHVudXNlZAotOwlwdXNoCWVkaQkJOyB1bnVzZWQKLQotCWdldF9HT1QJZWJ4CQk7IGdldCBHT1QgYWRkcmVzcwotCi0JOyAtLS0tIFBhc3MgMTogcHJvY2VzcyByb3dzLgotCi0JbW92CWVkeCwgUE9JTlRFUiBbZGF0YShlYnApXQk7IChGQVNUX0ZMT0FUICopCi0JbW92CWVjeCwgRENUU0laRQotCWFsaWdueAkxNiw3Ci0ucm93bG9vcDoKLQlmbGQJRkFTVF9GTE9BVCBbUk9XKDEsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmYWRkCUZBU1RfRkxPQVQgW1JPVyg2LGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JZmxkCUZBU1RfRkxPQVQgW1JPVygwLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JZmFkZAlGQVNUX0ZMT0FUIFtST1coNyxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZsZAlGQVNUX0ZMT0FUIFtST1coMyxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZhZGQJRkFTVF9GTE9BVCBbUk9XKDQsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmbGQJRkFTVF9GTE9BVCBbUk9XKDIsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmYWRkCUZBU1RfRkxPQVQgW1JPVyg1LGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0KLQk7IC0tIEV2ZW4gcGFydAotCi0JZmxkCXN0Mgk7IHN0MiA9IHN0MiArIHN0MSwgc3QxID0gc3QyIC0gc3QxCi0JZnN1YglzdDAsc3QyCi0JZnhjaAlzdDAsc3QyCi0JZmFkZHAJc3QzLHN0MAotCWZsZAlzdDMJOyBzdDMgPSBzdDMgKyBzdDAsIHN0MCA9IHN0MyAtIHN0MAotCWZzdWIJc3QwLHN0MQotCWZ4Y2gJc3QwLHN0MQotCWZhZGRwCXN0NCxzdDAKLQotCWZhZGQJc3QwLHN0MQotCWZtdWwJUk9UQVRPUl9UWVBFIFtHT1RPRkYoZWJ4LEZfMF83MDcpXQotCi0JZmxkCXN0Mgk7IHN0MyA9IHN0MiArIHN0Mywgc3QyID0gc3QyIC0gc3QzCi0JZnN1YglzdDAsc3Q0Ci0JZnhjaAlzdDAsc3QzCi0JZmFkZHAJc3Q0LHN0MAotCWZsZAlzdDEJOyBzdDAgPSBzdDEgKyBzdDAsIHN0MSA9IHN0MSAtIHN0MAotCWZzdWIJc3QwLHN0MQotCWZ4Y2gJc3QwLHN0MgotCWZhZGRwCXN0MSxzdDAKLQotCWZsZAlGQVNUX0ZMT0FUIFtST1coMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZzdWIJRkFTVF9GTE9BVCBbUk9XKDcsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmeGNoCXN0MCxzdDQKLQlmbGQJRkFTVF9GTE9BVCBbUk9XKDMsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmc3ViCUZBU1RfRkxPQVQgW1JPVyg0LGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JZnhjaAlzdDAsc3Q0Ci0JZmxkCUZBU1RfRkxPQVQgW1JPVygxLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JZnN1YglGQVNUX0ZMT0FUIFtST1coNixlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZ4Y2gJc3QwLHN0NAotCWZsZAlGQVNUX0ZMT0FUIFtST1coMixlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZzdWIJRkFTVF9GTE9BVCBbUk9XKDUsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmeGNoCXN0MCxzdDQKLQotCWZzdHAJRkFTVF9GTE9BVCBbUk9XKDIsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmc3RwCUZBU1RfRkxPQVQgW1JPVyg2LGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JZnN0cAlGQVNUX0ZMT0FUIFtST1coNCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZzdHAJRkFTVF9GTE9BVCBbUk9XKDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQotCTsgLS0gT2RkIHBhcnQKLQotCWZhZGQJc3QyLHN0MAotCWZhZGQJc3QwLHN0MQotCWZ4Y2gJc3QwLHN0MwotCWZhZGQJc3QxLHN0MAotCWZ4Y2gJc3QwLHN0MwotCi0JZmxkCXN0MgotCWZ4Y2gJc3QwLHN0MQotCWZtdWwJUk9UQVRPUl9UWVBFIFtHT1RPRkYoZWJ4LEZfMF83MDcpXQotCWZ4Y2gJc3QwLHN0MQotCWZzdWIJc3QwLHN0MgotCWZ4Y2gJc3QwLHN0MwotCWZtdWwJUk9UQVRPUl9UWVBFIFtHT1RPRkYoZWJ4LEZfMF81NDEpXQotCWZ4Y2gJc3QwLHN0MwotCWZtdWwJUk9UQVRPUl9UWVBFIFtHT1RPRkYoZWJ4LEZfMF8zODIpXQotCWZ4Y2gJc3QwLHN0MgotCWZtdWwJUk9UQVRPUl9UWVBFIFtHT1RPRkYoZWJ4LEZfMV8zMDYpXQotCWZ4Y2gJc3QwLHN0MgotCWZhZGQJc3QzLHN0MAotCWZhZGRwCXN0MixzdDAKLQotCWZsZAlzdDMJOyBzdDMgPSBzdDMgKyBzdDAsIHN0MCA9IHN0MyAtIHN0MAotCWZzdWIJc3QwLHN0MQotCWZ4Y2gJc3QwLHN0MQotCWZhZGRwCXN0NCxzdDAKLQotCWZsZAlzdDIJOyBzdDAgPSBzdDAgKyBzdDIsIHN0MiA9IHN0MCAtIHN0MgotCWZzdWJyCXN0MCxzdDEKLQlmeGNoCXN0MCxzdDMKLQlmYWRkcAlzdDEsc3QwCi0JZmxkCXN0MQk7IHN0MyA9IHN0MyArIHN0MSwgc3QxID0gc3QzIC0gc3QxCi0JZnN1YnIJc3QwLHN0NAotCWZ4Y2gJc3QwLHN0MgotCWZhZGRwCXN0NCxzdDAKLQotCWZzdHAJRkFTVF9GTE9BVCBbUk9XKDUsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmc3RwCUZBU1RfRkxPQVQgW1JPVyg3LGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JZnN0cAlGQVNUX0ZMT0FUIFtST1coMyxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZzdHAJRkFTVF9GTE9BVCBbUk9XKDEsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQotCWFkZAllZHgsIGJ5dGUgRENUU0laRSpTSVpFT0ZfRkFTVF9GTE9BVAotCWRlYwllY3gJCQkJOyBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cKLQlqbnoJbmVhciAucm93bG9vcAotCi0JOyAtLS0tIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgotCi0JbW92CWVkeCwgUE9JTlRFUiBbZGF0YShlYnApXQk7IChGQVNUX0ZMT0FUICopCi0JbW92CWVjeCwgRENUU0laRQotCWFsaWdueAkxNiw3Ci0uY29sdW1ubG9vcDoKLQlmbGQJRkFTVF9GTE9BVCBbQ09MKDEsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmYWRkCUZBU1RfRkxPQVQgW0NPTCg2LGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JZmxkCUZBU1RfRkxPQVQgW0NPTCgwLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JZmFkZAlGQVNUX0ZMT0FUIFtDT0woNyxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZsZAlGQVNUX0ZMT0FUIFtDT0woMyxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZhZGQJRkFTVF9GTE9BVCBbQ09MKDQsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmbGQJRkFTVF9GTE9BVCBbQ09MKDIsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmYWRkCUZBU1RfRkxPQVQgW0NPTCg1LGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0KLQk7IC0tIEV2ZW4gcGFydAotCi0JZmxkCXN0Mgk7IHN0MiA9IHN0MiArIHN0MSwgc3QxID0gc3QyIC0gc3QxCi0JZnN1YglzdDAsc3QyCi0JZnhjaAlzdDAsc3QyCi0JZmFkZHAJc3QzLHN0MAotCWZsZAlzdDMJOyBzdDMgPSBzdDMgKyBzdDAsIHN0MCA9IHN0MyAtIHN0MAotCWZzdWIJc3QwLHN0MQotCWZ4Y2gJc3QwLHN0MQotCWZhZGRwCXN0NCxzdDAKLQotCWZhZGQJc3QwLHN0MQotCWZtdWwJUk9UQVRPUl9UWVBFIFtHT1RPRkYoZWJ4LEZfMF83MDcpXQotCi0JZmxkCXN0Mgk7IHN0MyA9IHN0MiArIHN0Mywgc3QyID0gc3QyIC0gc3QzCi0JZnN1YglzdDAsc3Q0Ci0JZnhjaAlzdDAsc3QzCi0JZmFkZHAJc3Q0LHN0MAotCWZsZAlzdDEJOyBzdDAgPSBzdDEgKyBzdDAsIHN0MSA9IHN0MSAtIHN0MAotCWZzdWIJc3QwLHN0MQotCWZ4Y2gJc3QwLHN0MgotCWZhZGRwCXN0MSxzdDAKLQotCWZsZAlGQVNUX0ZMT0FUIFtDT0woMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZzdWIJRkFTVF9GTE9BVCBbQ09MKDcsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmeGNoCXN0MCxzdDQKLQlmbGQJRkFTVF9GTE9BVCBbQ09MKDMsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmc3ViCUZBU1RfRkxPQVQgW0NPTCg0LGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JZnhjaAlzdDAsc3Q0Ci0JZmxkCUZBU1RfRkxPQVQgW0NPTCgxLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JZnN1YglGQVNUX0ZMT0FUIFtDT0woNixlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZ4Y2gJc3QwLHN0NAotCWZsZAlGQVNUX0ZMT0FUIFtDT0woMixlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZzdWIJRkFTVF9GTE9BVCBbQ09MKDUsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmeGNoCXN0MCxzdDQKLQotCWZzdHAJRkFTVF9GTE9BVCBbQ09MKDIsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmc3RwCUZBU1RfRkxPQVQgW0NPTCg2LGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JZnN0cAlGQVNUX0ZMT0FUIFtDT0woNCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZzdHAJRkFTVF9GTE9BVCBbQ09MKDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQotCTsgLS0gT2RkIHBhcnQKLQotCWZhZGQJc3QyLHN0MAotCWZhZGQJc3QwLHN0MQotCWZ4Y2gJc3QwLHN0MwotCWZhZGQJc3QxLHN0MAotCWZ4Y2gJc3QwLHN0MwotCi0JZmxkCXN0MgotCWZ4Y2gJc3QwLHN0MQotCWZtdWwJUk9UQVRPUl9UWVBFIFtHT1RPRkYoZWJ4LEZfMF83MDcpXQotCWZ4Y2gJc3QwLHN0MQotCWZzdWIJc3QwLHN0MgotCWZ4Y2gJc3QwLHN0MwotCWZtdWwJUk9UQVRPUl9UWVBFIFtHT1RPRkYoZWJ4LEZfMF81NDEpXQotCWZ4Y2gJc3QwLHN0MwotCWZtdWwJUk9UQVRPUl9UWVBFIFtHT1RPRkYoZWJ4LEZfMF8zODIpXQotCWZ4Y2gJc3QwLHN0MgotCWZtdWwJUk9UQVRPUl9UWVBFIFtHT1RPRkYoZWJ4LEZfMV8zMDYpXQotCWZ4Y2gJc3QwLHN0MgotCWZhZGQJc3QzLHN0MAotCWZhZGRwCXN0MixzdDAKLQotCWZsZAlzdDMJOyBzdDMgPSBzdDMgKyBzdDAsIHN0MCA9IHN0MyAtIHN0MAotCWZzdWIJc3QwLHN0MQotCWZ4Y2gJc3QwLHN0MQotCWZhZGRwCXN0NCxzdDAKLQotCWZsZAlzdDIJOyBzdDAgPSBzdDAgKyBzdDIsIHN0MiA9IHN0MCAtIHN0MgotCWZzdWJyCXN0MCxzdDEKLQlmeGNoCXN0MCxzdDMKLQlmYWRkcAlzdDEsc3QwCi0JZmxkCXN0MQk7IHN0MyA9IHN0MyArIHN0MSwgc3QxID0gc3QzIC0gc3QxCi0JZnN1YnIJc3QwLHN0NAotCWZ4Y2gJc3QwLHN0MgotCWZhZGRwCXN0NCxzdDAKLQotCWZzdHAJRkFTVF9GTE9BVCBbQ09MKDUsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmc3RwCUZBU1RfRkxPQVQgW0NPTCg3LGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JZnN0cAlGQVNUX0ZMT0FUIFtDT0woMyxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZzdHAJRkFTVF9GTE9BVCBbQ09MKDEsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQotCWFkZAllZHgsIGJ5dGUgU0laRU9GX0ZBU1RfRkxPQVQgOyBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4KLQlkZWMJZWN4Ci0Jam56CW5lYXIgLmNvbHVtbmxvb3AKLQotOwlwb3AJZWRpCQk7IHVudXNlZAotOwlwb3AJZXNpCQk7IHVudXNlZAotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXBvcHBpYwllYngKLQlwb3AJZWJwCi0JcmV0Ci0KLSVlbmRpZiA7IERDVF9GTE9BVF9TVVBQT1JURUQKZGlmZiAtLWdpdCBhL3VudXNlZC9qZmRjdGZsdC5jIGIvamZkY3RmbHQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdW51c2VkL2pmZGN0Zmx0LmMKcmVuYW1lIHRvIGpmZGN0Zmx0LmMKZGlmZiAtLWdpdCBhL2pmZGN0ZnN0LmFzbSBiL2pmZGN0ZnN0LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczYzkyMC4uMDAwMDAwMAotLS0gYS9qZmRjdGZzdC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotOwotOyBqZmRjdGZzdC5hc20gLSBmYXN0IGludGVnZXIgRkRDVCAobm9uLVNJTUQpCi07Ci07IHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotOyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgotOyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4ganNpbWRleHQuaW5jCi07Ci07IFRoaXMgZmlsZSBzaG91bGQgYmUgYXNzZW1ibGVkIHdpdGggTkFTTSAoTmV0d2lkZSBBc3NlbWJsZXIpLAotOyBjYW4gKm5vdCogYmUgYXNzZW1ibGVkIHdpdGggTWljcm9zb2Z0J3MgTUFTTSBvciBhbnkgY29tcGF0aWJsZQotOyBhc3NlbWJsZXIgKGluY2x1ZGluZyBCb3JsYW5kJ3MgVHVyYm8gQXNzZW1ibGVyKS4KLTsgTkFTTSBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vbmFzbS5zb3VyY2Vmb3JnZS5uZXQvIG9yCi07IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTYyMDgKLTsKLTsgVGhpcyBmaWxlIGNvbnRhaW5zIGEgZmFzdCwgbm90IHNvIGFjY3VyYXRlIGludGVnZXIgaW1wbGVtZW50YXRpb24gb2YKLTsgdGhlIGZvcndhcmQgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4gVGhlIGZvbGxvd2luZyBjb2RlIGlzIGJhc2VkCi07IGRpcmVjdGx5IG9uIHRoZSBJSkcncyBvcmlnaW5hbCBqZmRjdGZzdC5jOyBzZWUgdGhlIGpmZGN0ZnN0LmMgZm9yCi07IG1vcmUgZGV0YWlscy4KLTsKLTsgTGFzdCBNb2RpZmllZCA6IE9jdG9iZXIgMTcsIDIwMDQKLTsKLTsgW1RBQjhdCi0KLSVpbmNsdWRlICJqc2ltZGV4dC5pbmMiCi0laW5jbHVkZSAiamRjdC5pbmMiCi0KLSVpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0KLTsgVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCi07Ci0laWYgRENUU0laRSAhPSA4Ci0lZXJyb3IgIlNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiIKLSVlbmRpZgotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTsgV2UgY2FuIGdhaW4gYSBsaXR0bGUgbW9yZSBzcGVlZCwgd2l0aCBhIGZ1cnRoZXIgY29tcHJvbWlzZSBpbiBhY2N1cmFjeSwKLTsgYnkgb21pdHRpbmcgdGhlIGFkZGl0aW9uIGluIGEgZGVzY2FsaW5nIHNoaWZ0LiAgVGhpcyB5aWVsZHMgYW4KLTsgaW5jb3JyZWN0bHkgcm91bmRlZCByZXN1bHQgaGFsZiB0aGUgdGltZS4uLgotOwotJW1hY3JvCWRlc2NhbGUgMgotJWlmZGVmIFVTRV9BQ0NVUkFURV9ST1VORElORwotJWlmICglMik8PTcKLQlhZGQJJTEsIGJ5dGUgKDE8PCgoJTIpLTEpKQk7IGFkZCByZWczMixpbW04Ci0lZWxzZQotCWFkZAklMSwgKDE8PCgoJTIpLTEpKQk7IGFkZCByZWczMixpbW0zMgotJWVuZGlmCi0lZW5kaWYKLQlzYXIJJTEsJTIKLSVlbmRtYWNybwotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSVkZWZpbmUgQ09OU1RfQklUUwk4Ci0KLSVpZiBDT05TVF9CSVRTID09IDgKLUZfMF8zODIJZXF1CSA5OAkJOyBGSVgoMC4zODI2ODM0MzMpCi1GXzBfNTQxCWVxdQkxMzkJCTsgRklYKDAuNTQxMTk2MTAwKQotRl8wXzcwNwllcXUJMTgxCQk7IEZJWCgwLjcwNzEwNjc4MSkKLUZfMV8zMDYJZXF1CTMzNAkJOyBGSVgoMS4zMDY1NjI5NjUpCi0lZWxzZQotOyBOQVNNIGNhbm5vdCBkbyBjb21waWxlLXRpbWUgYXJpdGhtZXRpYyBvbiBmbG9hdGluZy1wb2ludCBjb25zdGFudHMuCi0lZGVmaW5lIERFU0NBTEUoeCxuKSAgKCgoeCkrKDE8PCgobiktMSkpKT4+KG4pKQotRl8wXzM4MgllcXUJREVTQ0FMRSggNDEwOTAzMjA3LDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuMzgyNjgzNDMzKQotRl8wXzU0MQllcXUJREVTQ0FMRSggNTgxMTA0ODg3LDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuNTQxMTk2MTAwKQotRl8wXzcwNwllcXUJREVTQ0FMRSggNzU5MjUwMTI0LDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuNzA3MTA2NzgxKQotRl8xXzMwNgllcXUJREVTQ0FMRSgxNDAyOTExMzAxLDMwLUNPTlNUX0JJVFMpCTsgRklYKDEuMzA2NTYyOTY1KQotJWVuZGlmCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19URVhUCi0JQklUUwkzMgotOwotOyBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBvbmUgYmxvY2sgb2Ygc2FtcGxlcy4KLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfZmRjdF9pZmFzdCAoRENURUxFTSAqIGRhdGEpCi07Ci0KLSVkZWZpbmUgZGF0YShiKQkoYikrOAkJOyBEQ1RFTEVNICogZGF0YQotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2ZkY3RfaWZhc3QpCi0KLUVYVE4oanBlZ19mZGN0X2lmYXN0KToKLQlwdXNoCWVicAotCW1vdgllYnAsZXNwCi0JcHVzaAllYngKLTsJcHVzaAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXB1c2gJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXB1c2gJZXNpCi0JcHVzaAllZGkKLQotCTsgLS0tLSBQYXNzIDE6IHByb2Nlc3Mgcm93cy4KLQotCW1vdgllY3gsIERDVFNJWkUKLQltb3YJZWR4LCBQT0lOVEVSIFtkYXRhKGVicCldCTsgKERDVEVMRU0gKikKLQlhbGlnbngJMTYsNwotLnJvd2xvb3A6Ci0JcHVzaAllY3gJCTsgY3RyCi0JcHVzaAllZHgJCTsgZGF0YXB0cgotCi0JbW92c3gJZWF4LCBEQ1RFTEVNIFtST1coMCxlZHgsU0laRU9GX0RDVEVMRU0pXQotCW1vdnN4CWVkaSwgRENURUxFTSBbUk9XKDcsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQlsZWEJZXNpLFtlYXgrZWRpXQk7IGVzaT10bXAwCi0Jc3ViCWVheCxlZGkJCTsgZWF4PXRtcDcKLQlwdXNoCWVheAotCi0JbW92c3gJZWJ4LCBEQ1RFTEVNIFtST1coMSxlZHgsU0laRU9GX0RDVEVMRU0pXQotCW1vdnN4CWVjeCwgRENURUxFTSBbUk9XKDYsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQlsZWEJZWRpLFtlYngrZWN4XQk7IGVkaT10bXAxCi0Jc3ViCWVieCxlY3gJCTsgZWJ4PXRtcDYKLQlwdXNoCWVieAotCi0JbW92c3gJZWF4LCBEQ1RFTEVNIFtST1coMixlZHgsU0laRU9GX0RDVEVMRU0pXQotCW1vdnN4CWVjeCwgRENURUxFTSBbUk9XKDUsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQlsZWEJZWJ4LFtlYXgrZWN4XQk7IGVieD10bXAyCi0Jc3ViCWVheCxlY3gJCTsgZWF4PXRtcDUKLQlwdXNoCWVheAotCi0JbW92c3gJZWN4LCBEQ1RFTEVNIFtST1coMyxlZHgsU0laRU9GX0RDVEVMRU0pXQotCW1vdnN4CWVheCwgRENURUxFTSBbUk9XKDQsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQlsZWEJZWR4LFtlY3grZWF4XQk7IGVkeD10bXAzCi0Jc3ViCWVjeCxlYXgJCTsgZWN4PXRtcDQKLQlwdXNoCWVjeAotCi0JOyAtLSBFdmVuIHBhcnQKLQotCWxlYQllYXgsW2VzaStlZHhdCTsgZWF4PXRtcDEwCi0JbGVhCWVjeCxbZWRpK2VieF0JOyBlY3g9dG1wMTEKLQlzdWIJZXNpLGVkeAkJOyBlc2k9dG1wMTMKLQlzdWIJZWRpLGVieAkJOyBlZGk9dG1wMTIKLQotCW1vdgllZHgsIFBPSU5URVIgW2VzcCsxNl0JOyBkYXRhcHRyCi0KLQlhZGQJZWRpLGVzaQotCWltdWwJZWRpLChGXzBfNzA3KQk7IGVkaT16MQotCWRlc2NhbGUJZWRpLENPTlNUX0JJVFMKLQotCWxlYQllYngsW2VheCtlY3hdCTsgZWJ4PWRhdGEwCi0Jc3ViCWVheCxlY3gJCTsgZWF4PWRhdGE0Ci0JbW92CURDVEVMRU0gW1JPVygwLGVkeCxTSVpFT0ZfRENURUxFTSldLCBieAotCW1vdglEQ1RFTEVNIFtST1coNCxlZHgsU0laRU9GX0RDVEVMRU0pXSwgYXgKLQotCWxlYQllY3gsW2VzaStlZGldCTsgZWN4PWRhdGEyCi0Jc3ViCWVzaSxlZGkJCTsgZXNpPWRhdGE2Ci0JbW92CURDVEVMRU0gW1JPVygyLGVkeCxTSVpFT0ZfRENURUxFTSldLCBjeAotCW1vdglEQ1RFTEVNIFtST1coNixlZHgsU0laRU9GX0RDVEVMRU0pXSwgc2kKLQotCTsgLS0gT2RkIHBhcnQKLQotCXBvcAllYXgJOyBlYXg9dG1wNAotCXBvcAllZHgJOyBlZHg9dG1wNQotCXBvcAllYngJOyBlYng9dG1wNgotCXBvcAllZGkJOyBlZGk9dG1wNwotCi0JYWRkCWVheCxlZHgJCTsgZWF4PXRtcDEwCi0JYWRkCWVkeCxlYngJCTsgZWR4PXRtcDExCi0JYWRkCWVieCxlZGkJCTsgZWJ4PXRtcDEyLCBlZGk9dG1wNwotCi0JaW11bAllZHgsKEZfMF83MDcpCTsgZWR4PXozCi0JZGVzY2FsZQllZHgsQ09OU1RfQklUUwotCWxlYQllc2ksW2VkaStlZHhdCTsgZXNpPXoxMQotCXN1YgllZGksZWR4CQk7IGVkaT16MTMKLQotCW1vdgllY3gsZWF4CQk7IGVjeD10bXAxMAotCXN1YgllYXgsZWJ4Ci0JaW11bAllYXgsKEZfMF8zODIpCTsgZWF4PXo1Ci0JaW11bAllY3gsKEZfMF81NDEpCTsgZWN4PU1VTFRJUExZKHRtcDEwLEZJWF8wXzU0MTE5NjEwMCkKLQlpbXVsCWVieCwoRl8xXzMwNikJOyBlYng9TVVMVElQTFkodG1wMTIsRklYXzFfMzA2NTYyOTY1KQotCWRlc2NhbGUJZWF4LENPTlNUX0JJVFMKLQlkZXNjYWxlCWVjeCxDT05TVF9CSVRTCi0JZGVzY2FsZQllYngsQ09OU1RfQklUUwotCWFkZAllY3gsZWF4CQk7IGVjeD16MgotCWFkZAllYngsZWF4CQk7IGVieD16NAotCi0JcG9wCWVkeAkJOyBkYXRhcHRyCi0KLQlsZWEJZWF4LFtlZGkrZWN4XQk7IGVheD1kYXRhNQotCXN1YgllZGksZWN4CQk7IGVkaT1kYXRhMwotCW1vdglEQ1RFTEVNIFtST1coNSxlZHgsU0laRU9GX0RDVEVMRU0pXSwgYXgKLQltb3YJRENURUxFTSBbUk9XKDMsZWR4LFNJWkVPRl9EQ1RFTEVNKV0sIGRpCi0KLQlsZWEJZWN4LFtlc2krZWJ4XQk7IGVjeD1kYXRhMQotCXN1Ygllc2ksZWJ4CQk7IGVzaT1kYXRhNwotCW1vdglEQ1RFTEVNIFtST1coMSxlZHgsU0laRU9GX0RDVEVMRU0pXSwgY3gKLQltb3YJRENURUxFTSBbUk9XKDcsZWR4LFNJWkVPRl9EQ1RFTEVNKV0sIHNpCi0KLQlwb3AJZWN4CQk7IGN0cgotCi0JYWRkCWVkeCwgYnl0ZSBEQ1RTSVpFKlNJWkVPRl9EQ1RFTEVNCi0JZGVjCWVjeAkJCTsgYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93Ci0Jam56CW5lYXIgLnJvd2xvb3AKLQotCTsgLS0tLSBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4KLQotCW1vdgllY3gsIERDVFNJWkUKLQltb3YJZWR4LCBQT0lOVEVSIFtkYXRhKGVicCldCTsgKERDVEVMRU0gKikKLQlhbGlnbngJMTYsNwotLmNvbHVtbmxvb3A6Ci0JcHVzaAllY3gJCTsgY3RyCi0JcHVzaAllZHgJCTsgZGF0YXB0cgotCi0JbW92c3gJZWF4LCBEQ1RFTEVNIFtDT0woMCxlZHgsU0laRU9GX0RDVEVMRU0pXQotCW1vdnN4CWVkaSwgRENURUxFTSBbQ09MKDcsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQlsZWEJZXNpLFtlYXgrZWRpXQk7IGVzaT10bXAwCi0Jc3ViCWVheCxlZGkJCTsgZWF4PXRtcDcKLQlwdXNoCWVheAotCi0JbW92c3gJZWJ4LCBEQ1RFTEVNIFtDT0woMSxlZHgsU0laRU9GX0RDVEVMRU0pXQotCW1vdnN4CWVjeCwgRENURUxFTSBbQ09MKDYsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQlsZWEJZWRpLFtlYngrZWN4XQk7IGVkaT10bXAxCi0Jc3ViCWVieCxlY3gJCTsgZWJ4PXRtcDYKLQlwdXNoCWVieAotCi0JbW92c3gJZWF4LCBEQ1RFTEVNIFtDT0woMixlZHgsU0laRU9GX0RDVEVMRU0pXQotCW1vdnN4CWVjeCwgRENURUxFTSBbQ09MKDUsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQlsZWEJZWJ4LFtlYXgrZWN4XQk7IGVieD10bXAyCi0Jc3ViCWVheCxlY3gJCTsgZWF4PXRtcDUKLQlwdXNoCWVheAotCi0JbW92c3gJZWN4LCBEQ1RFTEVNIFtDT0woMyxlZHgsU0laRU9GX0RDVEVMRU0pXQotCW1vdnN4CWVheCwgRENURUxFTSBbQ09MKDQsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQlsZWEJZWR4LFtlY3grZWF4XQk7IGVkeD10bXAzCi0Jc3ViCWVjeCxlYXgJCTsgZWN4PXRtcDQKLQlwdXNoCWVjeAotCi0JOyAtLSBFdmVuIHBhcnQKLQotCWxlYQllYXgsW2VzaStlZHhdCTsgZWF4PXRtcDEwCi0JbGVhCWVjeCxbZWRpK2VieF0JOyBlY3g9dG1wMTEKLQlzdWIJZXNpLGVkeAkJOyBlc2k9dG1wMTMKLQlzdWIJZWRpLGVieAkJOyBlZGk9dG1wMTIKLQotCW1vdgllZHgsIFBPSU5URVIgW2VzcCsxNl0JOyBkYXRhcHRyCi0KLQlhZGQJZWRpLGVzaQotCWltdWwJZWRpLChGXzBfNzA3KQk7IGVkaT16MQotCWRlc2NhbGUJZWRpLENPTlNUX0JJVFMKLQotCWxlYQllYngsW2VheCtlY3hdCTsgZWJ4PWRhdGEwCi0Jc3ViCWVheCxlY3gJCTsgZWF4PWRhdGE0Ci0JbW92CURDVEVMRU0gW0NPTCgwLGVkeCxTSVpFT0ZfRENURUxFTSldLCBieAotCW1vdglEQ1RFTEVNIFtDT0woNCxlZHgsU0laRU9GX0RDVEVMRU0pXSwgYXgKLQotCWxlYQllY3gsW2VzaStlZGldCTsgZWN4PWRhdGEyCi0Jc3ViCWVzaSxlZGkJCTsgZXNpPWRhdGE2Ci0JbW92CURDVEVMRU0gW0NPTCgyLGVkeCxTSVpFT0ZfRENURUxFTSldLCBjeAotCW1vdglEQ1RFTEVNIFtDT0woNixlZHgsU0laRU9GX0RDVEVMRU0pXSwgc2kKLQotCTsgLS0gT2RkIHBhcnQKLQotCXBvcAllYXgJOyBlYXg9dG1wNAotCXBvcAllZHgJOyBlZHg9dG1wNQotCXBvcAllYngJOyBlYng9dG1wNgotCXBvcAllZGkJOyBlZGk9dG1wNwotCi0JYWRkCWVheCxlZHgJCTsgZWF4PXRtcDEwCi0JYWRkCWVkeCxlYngJCTsgZWR4PXRtcDExCi0JYWRkCWVieCxlZGkJCTsgZWJ4PXRtcDEyLCBlZGk9dG1wNwotCi0JaW11bAllZHgsKEZfMF83MDcpCTsgZWR4PXozCi0JZGVzY2FsZQllZHgsQ09OU1RfQklUUwotCWxlYQllc2ksW2VkaStlZHhdCTsgZXNpPXoxMQotCXN1YgllZGksZWR4CQk7IGVkaT16MTMKLQotCW1vdgllY3gsZWF4CQk7IGVjeD10bXAxMAotCXN1YgllYXgsZWJ4Ci0JaW11bAllYXgsKEZfMF8zODIpCTsgZWF4PXo1Ci0JaW11bAllY3gsKEZfMF81NDEpCTsgZWN4PU1VTFRJUExZKHRtcDEwLEZJWF8wXzU0MTE5NjEwMCkKLQlpbXVsCWVieCwoRl8xXzMwNikJOyBlYng9TVVMVElQTFkodG1wMTIsRklYXzFfMzA2NTYyOTY1KQotCWRlc2NhbGUJZWF4LENPTlNUX0JJVFMKLQlkZXNjYWxlCWVjeCxDT05TVF9CSVRTCi0JZGVzY2FsZQllYngsQ09OU1RfQklUUwotCWFkZAllY3gsZWF4CQk7IGVjeD16MgotCWFkZAllYngsZWF4CQk7IGVieD16NAotCi0JcG9wCWVkeAkJOyBkYXRhcHRyCi0KLQlsZWEJZWF4LFtlZGkrZWN4XQk7IGVheD1kYXRhNQotCXN1YgllZGksZWN4CQk7IGVkaT1kYXRhMwotCW1vdglEQ1RFTEVNIFtDT0woNSxlZHgsU0laRU9GX0RDVEVMRU0pXSwgYXgKLQltb3YJRENURUxFTSBbQ09MKDMsZWR4LFNJWkVPRl9EQ1RFTEVNKV0sIGRpCi0KLQlsZWEJZWN4LFtlc2krZWJ4XQk7IGVjeD1kYXRhMQotCXN1Ygllc2ksZWJ4CQk7IGVzaT1kYXRhNwotCW1vdglEQ1RFTEVNIFtDT0woMSxlZHgsU0laRU9GX0RDVEVMRU0pXSwgY3gKLQltb3YJRENURUxFTSBbQ09MKDcsZWR4LFNJWkVPRl9EQ1RFTEVNKV0sIHNpCi0KLQlwb3AJZWN4CQk7IGN0cgotCi0JYWRkCWVkeCwgYnl0ZSBTSVpFT0ZfRENURUxFTSAgICA7IGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbgotCWRlYwllY3gKLQlqbnoJbmVhciAuY29sdW1ubG9vcAotCi0JcG9wCWVkaQotCXBvcAllc2kKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwb3AJZWJ4Ci0JcG9wCWVicAotCXJldAotCi0lZW5kaWYgOyBEQ1RfSUZBU1RfU1VQUE9SVEVECmRpZmYgLS1naXQgYS91bnVzZWQvamZkY3Rmc3QuYyBiL2pmZGN0ZnN0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHVudXNlZC9qZmRjdGZzdC5jCnJlbmFtZSB0byBqZmRjdGZzdC5jCmRpZmYgLS1naXQgYS9qZmRjdGludC5hc20gYi9qZmRjdGludC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMjk3MjUuLjAwMDAwMDAKLS0tIGEvamZkY3RpbnQuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLTsKLTsgamZkY3RpbnQuYXNtIC0gYWNjdXJhdGUgaW50ZWdlciBGRENUIChub24tU0lNRCkKLTsKLTsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Ci07IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi07IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKLTsKLTsgVGhpcyBmaWxlIHNob3VsZCBiZSBhc3NlbWJsZWQgd2l0aCBOQVNNIChOZXR3aWRlIEFzc2VtYmxlciksCi07IGNhbiAqbm90KiBiZSBhc3NlbWJsZWQgd2l0aCBNaWNyb3NvZnQncyBNQVNNIG9yIGFueSBjb21wYXRpYmxlCi07IGFzc2VtYmxlciAoaW5jbHVkaW5nIEJvcmxhbmQncyBUdXJibyBBc3NlbWJsZXIpLgotOyBOQVNNIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9uYXNtLnNvdXJjZWZvcmdlLm5ldC8gb3IKLTsgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NjIwOAotOwotOyBUaGlzIGZpbGUgY29udGFpbnMgYSBzbG93LWJ1dC1hY2N1cmF0ZSBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIG9mIHRoZQotOyBmb3J3YXJkIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBiYXNlZAotOyBkaXJlY3RseSBvbiB0aGUgSUpHJ3Mgb3JpZ2luYWwgamZkY3RpbnQuYzsgc2VlIHRoZSBqZmRjdGludC5jIGZvcgotOyBtb3JlIGRldGFpbHMuCi07Ci07IExhc3QgTW9kaWZpZWQgOiBPY3RvYmVyIDE3LCAyMDA0Ci07Ci07IFtUQUI4XQotCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotJWluY2x1ZGUgImpkY3QuaW5jIgotCi0laWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotCi07IFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotOwotJWlmIERDVFNJWkUgIT0gOAotJWVycm9yICJTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4iCi0lZW5kaWYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi07IERlc2NhbGUgYW5kIGNvcnJlY3RseSByb3VuZCBhIERXT1JEIHZhbHVlIHRoYXQncyBzY2FsZWQgYnkgTiBiaXRzLgotOwotJW1hY3JvCWRlc2NhbGUgMgotJWlmICglMik8PTcKLQlhZGQJJTEsIGJ5dGUgKDE8PCgoJTIpLTEpKQk7IGFkZCByZWczMixpbW04Ci0lZWxzZQotCWFkZAklMSwgKDE8PCgoJTIpLTEpKQk7IGFkZCByZWczMixpbW0zMgotJWVuZGlmCi0Jc2FyCSUxLCUyCi0lZW5kbWFjcm8KLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0lZGVmaW5lIENPTlNUX0JJVFMJMTMKLSVkZWZpbmUgUEFTUzFfQklUUwkyCi0KLSVpZiBDT05TVF9CSVRTID09IDEzCi1GXzBfMjk4CWVxdQkgMjQ0NgkJOyBGSVgoMC4yOTg2MzEzMzYpCi1GXzBfMzkwCWVxdQkgMzE5NgkJOyBGSVgoMC4zOTAxODA2NDQpCi1GXzBfNTQxCWVxdQkgNDQzMwkJOyBGSVgoMC41NDExOTYxMDApCi1GXzBfNzY1CWVxdQkgNjI3MAkJOyBGSVgoMC43NjUzNjY4NjUpCi1GXzBfODk5CWVxdQkgNzM3MwkJOyBGSVgoMC44OTk5NzYyMjMpCi1GXzFfMTc1CWVxdQkgOTYzMwkJOyBGSVgoMS4xNzU4NzU2MDIpCi1GXzFfNTAxCWVxdQkxMjI5OQkJOyBGSVgoMS41MDEzMjExMTApCi1GXzFfODQ3CWVxdQkxNTEzNwkJOyBGSVgoMS44NDc3NTkwNjUpCi1GXzFfOTYxCWVxdQkxNjA2OQkJOyBGSVgoMS45NjE1NzA1NjApCi1GXzJfMDUzCWVxdQkxNjgxOQkJOyBGSVgoMi4wNTMxMTk4NjkpCi1GXzJfNTYyCWVxdQkyMDk5NQkJOyBGSVgoMi41NjI5MTU0NDcpCi1GXzNfMDcyCWVxdQkyNTE3MgkJOyBGSVgoMy4wNzI3MTEwMjYpCi0lZWxzZQotOyBOQVNNIGNhbm5vdCBkbyBjb21waWxlLXRpbWUgYXJpdGhtZXRpYyBvbiBmbG9hdGluZy1wb2ludCBjb25zdGFudHMuCi0lZGVmaW5lIERFU0NBTEUoeCxuKSAgKCgoeCkrKDE8PCgobiktMSkpKT4+KG4pKQotRl8wXzI5OAllcXUJREVTQ0FMRSggMzIwNjUyOTU1LDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuMjk4NjMxMzM2KQotRl8wXzM5MAllcXUJREVTQ0FMRSggNDE4OTUzMjc2LDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuMzkwMTgwNjQ0KQotRl8wXzU0MQllcXUJREVTQ0FMRSggNTgxMTA0ODg3LDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuNTQxMTk2MTAwKQotRl8wXzc2NQllcXUJREVTQ0FMRSggODIxODA2NDEzLDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuNzY1MzY2ODY1KQotRl8wXzg5OQllcXUJREVTQ0FMRSggOTY2MzQyMTExLDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuODk5OTc2MjIzKQotRl8xXzE3NQllcXUJREVTQ0FMRSgxMjYyNTg2ODEzLDMwLUNPTlNUX0JJVFMpCTsgRklYKDEuMTc1ODc1NjAyKQotRl8xXzUwMQllcXUJREVTQ0FMRSgxNjEyMDMxMjY3LDMwLUNPTlNUX0JJVFMpCTsgRklYKDEuNTAxMzIxMTEwKQotRl8xXzg0NwllcXUJREVTQ0FMRSgxOTg0MDE2MTg4LDMwLUNPTlNUX0JJVFMpCTsgRklYKDEuODQ3NzU5MDY1KQotRl8xXzk2MQllcXUJREVTQ0FMRSgyMTA2MjIwMzUwLDMwLUNPTlNUX0JJVFMpCTsgRklYKDEuOTYxNTcwNTYwKQotRl8yXzA1MwllcXUJREVTQ0FMRSgyMjA0NTIwNjczLDMwLUNPTlNUX0JJVFMpCTsgRklYKDIuMDUzMTE5ODY5KQotRl8yXzU2MgllcXUJREVTQ0FMRSgyNzUxOTA5NTA2LDMwLUNPTlNUX0JJVFMpCTsgRklYKDIuNTYyOTE1NDQ3KQotRl8zXzA3MgllcXUJREVTQ0FMRSgzMjk5Mjk4MzQxLDMwLUNPTlNUX0JJVFMpCTsgRklYKDMuMDcyNzExMDI2KQotJWVuZGlmCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19URVhUCi0JQklUUwkzMgotOwotOyBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBvbmUgYmxvY2sgb2Ygc2FtcGxlcy4KLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfZmRjdF9pc2xvdyAoRENURUxFTSAqIGRhdGEpCi07Ci0KLSVkZWZpbmUgZGF0YShiKQkoYikrOAkJOyBEQ1RFTEVNICogZGF0YQotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2ZkY3RfaXNsb3cpCi0KLUVYVE4oanBlZ19mZGN0X2lzbG93KToKLQlwdXNoCWVicAotCW1vdgllYnAsZXNwCi0JcHVzaAllYngKLTsJcHVzaAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXB1c2gJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXB1c2gJZXNpCi0JcHVzaAllZGkKLQotCTsgLS0tLSBQYXNzIDE6IHByb2Nlc3Mgcm93cy4KLQotCW1vdgllZHgsIFBPSU5URVIgW2RhdGEoZWJwKV0JOyAoRENURUxFTSAqKQotCW1vdgllY3gsIERDVFNJWkUKLQlhbGlnbngJMTYsNwotLnJvd2xvb3A6Ci0JbW92c3gJZWF4LCBEQ1RFTEVNIFtST1coMCxlZHgsU0laRU9GX0RDVEVMRU0pXQotCW1vdnN4CWVkaSwgRENURUxFTSBbUk9XKDcsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQlsZWEJZXNpLFtlYXgrZWRpXQk7IGVzaT10bXAwCi0Jc3ViCWVheCxlZGkJCTsgZWF4PXRtcDcKLQlwdXNoCWVjeAkJOyBjdHIKLQlwdXNoCWVheAotCi0JbW92c3gJZWJ4LCBEQ1RFTEVNIFtST1coMSxlZHgsU0laRU9GX0RDVEVMRU0pXQotCW1vdnN4CWVjeCwgRENURUxFTSBbUk9XKDYsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQlsZWEJZWRpLFtlYngrZWN4XQk7IGVkaT10bXAxCi0Jc3ViCWVieCxlY3gJCTsgZWJ4PXRtcDYKLQlwdXNoCWVieAotCi0JbW92c3gJZWF4LCBEQ1RFTEVNIFtST1coMixlZHgsU0laRU9GX0RDVEVMRU0pXQotCW1vdnN4CWVjeCwgRENURUxFTSBbUk9XKDUsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQlsZWEJZWJ4LFtlYXgrZWN4XQk7IGVieD10bXAyCi0Jc3ViCWVheCxlY3gJCTsgZWF4PXRtcDUKLQlwdXNoCWVkeAkJOyBkYXRhcHRyCi0JcHVzaAllYXgKLQotCW1vdnN4CWVjeCwgRENURUxFTSBbUk9XKDMsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQltb3ZzeAllYXgsIERDVEVMRU0gW1JPVyg0LGVkeCxTSVpFT0ZfRENURUxFTSldCi0JbGVhCWVkeCxbZWN4K2VheF0JOyBlZHg9dG1wMwotCXN1YgllY3gsZWF4CQk7IGVjeD10bXA0Ci0JcHVzaAllY3gKLQotCTsgLS0gRXZlbiBwYXJ0Ci0KLQlsZWEJZWF4LFtlc2krZWR4XQk7IGVheD10bXAxMAotCWxlYQllY3gsW2VkaStlYnhdCTsgZWN4PXRtcDExCi0Jc3ViCWVzaSxlZHgJCTsgZXNpPXRtcDEzCi0Jc3ViCWVkaSxlYngJCTsgZWRpPXRtcDEyCi0KLQlsZWEJZWJ4LFtlYXgrZWN4XQk7IGVieD1kYXRhMAotCXN1YgllYXgsZWN4CQk7IGVheD1kYXRhNAotCW1vdgllZHgsIFBPSU5URVIgW2VzcCs4XQk7IGRhdGFwdHIKLQlzYWwJZWJ4LCBQQVNTMV9CSVRTCi0Jc2FsCWVheCwgUEFTUzFfQklUUwotCW1vdglEQ1RFTEVNIFtST1coMCxlZHgsU0laRU9GX0RDVEVMRU0pXSwgYngKLQltb3YJRENURUxFTSBbUk9XKDQsZWR4LFNJWkVPRl9EQ1RFTEVNKV0sIGF4Ci0KLQlsZWEJZWN4LFtlZGkrZXNpXQotCWltdWwJZWN4LChGXzBfNTQxKQk7IGVjeD16MQotCWltdWwJZXNpLChGXzBfNzY1KQk7IGVzaT1NVUxUSVBMWSh0bXAxMyxGSVhfMF83NjUzNjY4NjUpCi0JaW11bAllZGksKC1GXzFfODQ3KQk7IGVkaT1NVUxUSVBMWSh0bXAxMiwtRklYXzFfODQ3NzU5MDY1KQotCWFkZAllc2ksZWN4CQk7IGVzaT1kYXRhMgotCWFkZAllZGksZWN4CQk7IGVkaT1kYXRhNgotCWRlc2NhbGUJZXNpLChDT05TVF9CSVRTLVBBU1MxX0JJVFMpCi0JZGVzY2FsZQllZGksKENPTlNUX0JJVFMtUEFTUzFfQklUUykKLQltb3YJRENURUxFTSBbUk9XKDIsZWR4LFNJWkVPRl9EQ1RFTEVNKV0sIHNpCi0JbW92CURDVEVMRU0gW1JPVyg2LGVkeCxTSVpFT0ZfRENURUxFTSldLCBkaQotCi0JOyAtLSBPZGQgcGFydAotCi0JbW92CWVheCwgSU5UMzIgW2VzcF0JOyBlYXg9dG1wNAotCW1vdgllYngsIElOVDMyIFtlc3ArNF0JOyBlYng9dG1wNQotCW1vdgllY3gsIElOVDMyIFtlc3ArMTJdCTsgZWN4PXRtcDYKLQltb3YJZXNpLCBJTlQzMiBbZXNwKzE2XQk7IGVzaT10bXA3Ci0KLQlsZWEJZWR4LFtlYXgrZWN4XQk7IGVkeD16MwotCWxlYQllZGksW2VieCtlc2ldCTsgZWRpPXo0Ci0JYWRkCWVheCxlc2kJCTsgZWF4PXoxCi0JYWRkCWVieCxlY3gJCTsgZWJ4PXoyCi0KLQlsZWEJZXNpLFtlZHgrZWRpXQotCWltdWwJZXNpLChGXzFfMTc1KQk7IGVzaT16NQotCi0JaW11bAllZHgsKC1GXzFfOTYxKQk7IGVkeD16Myg9TVVMVElQTFkoejMsLUZJWF8xXzk2MTU3MDU2MCkpCi0JaW11bAllZGksKC1GXzBfMzkwKQk7IGVkaT16NCg9TVVMVElQTFkoejQsLUZJWF8wXzM5MDE4MDY0NCkpCi0JaW11bAllYXgsKC1GXzBfODk5KQk7IGVheD16MSg9TVVMVElQTFkoejEsLUZJWF8wXzg5OTk3NjIyMykpCi0JaW11bAllYngsKC1GXzJfNTYyKQk7IGVieD16Mig9TVVMVElQTFkoejIsLUZJWF8yXzU2MjkxNTQ0NykpCi0KLQlhZGQJZWR4LGVzaQkJOyBlZHg9ejMoPXozK3o1KQotCWFkZAllZGksZXNpCQk7IGVkaT16NCg9ejQrejUpCi0KLQlsZWEJZWN4LFtlYXgrZWR4XQk7IGVjeD16MSt6MwotCWxlYQllc2ksW2VieCtlZGldCTsgZXNpPXoyK3o0Ci0JYWRkCWVheCxlZGkJCTsgZWF4PXoxK3o0Ci0JYWRkCWVieCxlZHgJCTsgZWJ4PXoyK3ozCi0KLQlwb3AJZWR4CQk7IGVkeD10bXA0Ci0JcG9wCWVkaQkJOyBlZGk9dG1wNQotCWltdWwJZWR4LChGXzBfMjk4KQk7IGVkeD10bXA0KD1NVUxUSVBMWSh0bXA0LEZJWF8wXzI5ODYzMTMzNikpCi0JaW11bAllZGksKEZfMl8wNTMpCTsgZWRpPXRtcDUoPU1VTFRJUExZKHRtcDUsRklYXzJfMDUzMTE5ODY5KSkKLQlhZGQJZWN4LGVkeAkJOyBlY3g9ZGF0YTcoPXRtcDQrejErejMpCi0JYWRkCWVzaSxlZGkJCTsgZXNpPWRhdGE1KD10bXA1K3oyK3o0KQotCXBvcAllZHgJCTsgZGF0YXB0cgotCWRlc2NhbGUJZWN4LChDT05TVF9CSVRTLVBBU1MxX0JJVFMpCi0JZGVzY2FsZQllc2ksKENPTlNUX0JJVFMtUEFTUzFfQklUUykKLQltb3YJRENURUxFTSBbUk9XKDcsZWR4LFNJWkVPRl9EQ1RFTEVNKV0sIGN4Ci0JbW92CURDVEVMRU0gW1JPVyg1LGVkeCxTSVpFT0ZfRENURUxFTSldLCBzaQotCi0JcG9wCWVkaQkJOyBlZGk9dG1wNgotCXBvcAllY3gJCTsgZWN4PXRtcDcKLQlpbXVsCWVkaSwoRl8zXzA3MikJOyBlZGk9dG1wNig9TVVMVElQTFkodG1wNixGSVhfM18wNzI3MTEwMjYpKQotCWltdWwJZWN4LChGXzFfNTAxKQk7IGVjeD10bXA3KD1NVUxUSVBMWSh0bXA3LEZJWF8xXzUwMTMyMTExMCkpCi0JYWRkCWVieCxlZGkJCTsgZWJ4PWRhdGEzKD10bXA2K3oyK3ozKQotCWFkZAllYXgsZWN4CQk7IGVheD1kYXRhMSg9dG1wNyt6MSt6NCkKLQlwb3AJZWN4CQk7IGN0cgotCWRlc2NhbGUJZWJ4LChDT05TVF9CSVRTLVBBU1MxX0JJVFMpCi0JZGVzY2FsZQllYXgsKENPTlNUX0JJVFMtUEFTUzFfQklUUykKLQltb3YJRENURUxFTSBbUk9XKDMsZWR4LFNJWkVPRl9EQ1RFTEVNKV0sIGJ4Ci0JbW92CURDVEVMRU0gW1JPVygxLGVkeCxTSVpFT0ZfRENURUxFTSldLCBheAotCi0JYWRkCWVkeCwgYnl0ZSBEQ1RTSVpFKlNJWkVPRl9EQ1RFTEVNCi0JZGVjCWVjeAkJCTsgYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93Ci0Jam56CW5lYXIgLnJvd2xvb3AKLQotCTsgLS0tLSBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4KLQotCW1vdgllZHgsIFBPSU5URVIgW2RhdGEoZWJwKV0JOyAoRENURUxFTSAqKQotCW1vdgllY3gsIERDVFNJWkUKLQlhbGlnbngJMTYsNwotLmNvbHVtbmxvb3A6Ci0JbW92c3gJZWF4LCBEQ1RFTEVNIFtDT0woMCxlZHgsU0laRU9GX0RDVEVMRU0pXQotCW1vdnN4CWVkaSwgRENURUxFTSBbQ09MKDcsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQlsZWEJZXNpLFtlYXgrZWRpXQk7IGVzaT10bXAwCi0Jc3ViCWVheCxlZGkJCTsgZWF4PXRtcDcKLQlwdXNoCWVjeAkJOyBjdHIKLQlwdXNoCWVheAotCi0JbW92c3gJZWJ4LCBEQ1RFTEVNIFtDT0woMSxlZHgsU0laRU9GX0RDVEVMRU0pXQotCW1vdnN4CWVjeCwgRENURUxFTSBbQ09MKDYsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQlsZWEJZWRpLFtlYngrZWN4XQk7IGVkaT10bXAxCi0Jc3ViCWVieCxlY3gJCTsgZWJ4PXRtcDYKLQlwdXNoCWVieAotCi0JbW92c3gJZWF4LCBEQ1RFTEVNIFtDT0woMixlZHgsU0laRU9GX0RDVEVMRU0pXQotCW1vdnN4CWVjeCwgRENURUxFTSBbQ09MKDUsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQlsZWEJZWJ4LFtlYXgrZWN4XQk7IGVieD10bXAyCi0Jc3ViCWVheCxlY3gJCTsgZWF4PXRtcDUKLQlwdXNoCWVkeAkJOyBkYXRhcHRyCi0JcHVzaAllYXgKLQotCW1vdnN4CWVjeCwgRENURUxFTSBbQ09MKDMsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQltb3ZzeAllYXgsIERDVEVMRU0gW0NPTCg0LGVkeCxTSVpFT0ZfRENURUxFTSldCi0JbGVhCWVkeCxbZWN4K2VheF0JOyBlZHg9dG1wMwotCXN1YgllY3gsZWF4CQk7IGVjeD10bXA0Ci0JcHVzaAllY3gKLQotCTsgLS0gRXZlbiBwYXJ0Ci0KLQlsZWEJZWF4LFtlc2krZWR4XQk7IGVheD10bXAxMAotCWxlYQllY3gsW2VkaStlYnhdCTsgZWN4PXRtcDExCi0Jc3ViCWVzaSxlZHgJCTsgZXNpPXRtcDEzCi0Jc3ViCWVkaSxlYngJCTsgZWRpPXRtcDEyCi0KLQlsZWEJZWJ4LFtlYXgrZWN4XQk7IGVieD1kYXRhMAotCXN1YgllYXgsZWN4CQk7IGVheD1kYXRhNAotCW1vdgllZHgsIFBPSU5URVIgW2VzcCs4XQk7IGRhdGFwdHIKLQlkZXNjYWxlCWVieCwgUEFTUzFfQklUUwotCWRlc2NhbGUJZWF4LCBQQVNTMV9CSVRTCi0JbW92CURDVEVMRU0gW0NPTCgwLGVkeCxTSVpFT0ZfRENURUxFTSldLCBieAotCW1vdglEQ1RFTEVNIFtDT0woNCxlZHgsU0laRU9GX0RDVEVMRU0pXSwgYXgKLQotCWxlYQllY3gsW2VkaStlc2ldCi0JaW11bAllY3gsKEZfMF81NDEpCTsgZWN4PXoxCi0JaW11bAllc2ksKEZfMF83NjUpCTsgZXNpPU1VTFRJUExZKHRtcDEzLEZJWF8wXzc2NTM2Njg2NSkKLQlpbXVsCWVkaSwoLUZfMV84NDcpCTsgZWRpPU1VTFRJUExZKHRtcDEyLC1GSVhfMV84NDc3NTkwNjUpCi0JYWRkCWVzaSxlY3gJCTsgZXNpPWRhdGEyCi0JYWRkCWVkaSxlY3gJCTsgZWRpPWRhdGE2Ci0JZGVzY2FsZQllc2ksKENPTlNUX0JJVFMrUEFTUzFfQklUUykKLQlkZXNjYWxlCWVkaSwoQ09OU1RfQklUUytQQVNTMV9CSVRTKQotCW1vdglEQ1RFTEVNIFtDT0woMixlZHgsU0laRU9GX0RDVEVMRU0pXSwgc2kKLQltb3YJRENURUxFTSBbQ09MKDYsZWR4LFNJWkVPRl9EQ1RFTEVNKV0sIGRpCi0KLQk7IC0tIE9kZCBwYXJ0Ci0KLQltb3YJZWF4LCBJTlQzMiBbZXNwXQk7IGVheD10bXA0Ci0JbW92CWVieCwgSU5UMzIgW2VzcCs0XQk7IGVieD10bXA1Ci0JbW92CWVjeCwgSU5UMzIgW2VzcCsxMl0JOyBlY3g9dG1wNgotCW1vdgllc2ksIElOVDMyIFtlc3ArMTZdCTsgZXNpPXRtcDcKLQotCWxlYQllZHgsW2VheCtlY3hdCTsgZWR4PXozCi0JbGVhCWVkaSxbZWJ4K2VzaV0JOyBlZGk9ejQKLQlhZGQJZWF4LGVzaQkJOyBlYXg9ejEKLQlhZGQJZWJ4LGVjeAkJOyBlYng9ejIKLQotCWxlYQllc2ksW2VkeCtlZGldCi0JaW11bAllc2ksKEZfMV8xNzUpCTsgZXNpPXo1Ci0KLQlpbXVsCWVkeCwoLUZfMV85NjEpCTsgZWR4PXozKD1NVUxUSVBMWSh6MywtRklYXzFfOTYxNTcwNTYwKSkKLQlpbXVsCWVkaSwoLUZfMF8zOTApCTsgZWRpPXo0KD1NVUxUSVBMWSh6NCwtRklYXzBfMzkwMTgwNjQ0KSkKLQlpbXVsCWVheCwoLUZfMF84OTkpCTsgZWF4PXoxKD1NVUxUSVBMWSh6MSwtRklYXzBfODk5OTc2MjIzKSkKLQlpbXVsCWVieCwoLUZfMl81NjIpCTsgZWJ4PXoyKD1NVUxUSVBMWSh6MiwtRklYXzJfNTYyOTE1NDQ3KSkKLQotCWFkZAllZHgsZXNpCQk7IGVkeD16Myg9ejMrejUpCi0JYWRkCWVkaSxlc2kJCTsgZWRpPXo0KD16NCt6NSkKLQotCWxlYQllY3gsW2VheCtlZHhdCTsgZWN4PXoxK3ozCi0JbGVhCWVzaSxbZWJ4K2VkaV0JOyBlc2k9ejIrejQKLQlhZGQJZWF4LGVkaQkJOyBlYXg9ejErejQKLQlhZGQJZWJ4LGVkeAkJOyBlYng9ejIrejMKLQotCXBvcAllZHgJCTsgZWR4PXRtcDQKLQlwb3AJZWRpCQk7IGVkaT10bXA1Ci0JaW11bAllZHgsKEZfMF8yOTgpCTsgZWR4PXRtcDQoPU1VTFRJUExZKHRtcDQsRklYXzBfMjk4NjMxMzM2KSkKLQlpbXVsCWVkaSwoRl8yXzA1MykJOyBlZGk9dG1wNSg9TVVMVElQTFkodG1wNSxGSVhfMl8wNTMxMTk4NjkpKQotCWFkZAllY3gsZWR4CQk7IGVjeD1kYXRhNyg9dG1wNCt6MSt6MykKLQlhZGQJZXNpLGVkaQkJOyBlc2k9ZGF0YTUoPXRtcDUrejIrejQpCi0JcG9wCWVkeAkJOyBkYXRhcHRyCi0JZGVzY2FsZQllY3gsKENPTlNUX0JJVFMrUEFTUzFfQklUUykKLQlkZXNjYWxlCWVzaSwoQ09OU1RfQklUUytQQVNTMV9CSVRTKQotCW1vdglEQ1RFTEVNIFtDT0woNyxlZHgsU0laRU9GX0RDVEVMRU0pXSwgY3gKLQltb3YJRENURUxFTSBbQ09MKDUsZWR4LFNJWkVPRl9EQ1RFTEVNKV0sIHNpCi0KLQlwb3AJZWRpCQk7IGVkaT10bXA2Ci0JcG9wCWVjeAkJOyBlY3g9dG1wNwotCWltdWwJZWRpLChGXzNfMDcyKQk7IGVkaT10bXA2KD1NVUxUSVBMWSh0bXA2LEZJWF8zXzA3MjcxMTAyNikpCi0JaW11bAllY3gsKEZfMV81MDEpCTsgZWN4PXRtcDcoPU1VTFRJUExZKHRtcDcsRklYXzFfNTAxMzIxMTEwKSkKLQlhZGQJZWJ4LGVkaQkJOyBlYng9ZGF0YTMoPXRtcDYrejIrejMpCi0JYWRkCWVheCxlY3gJCTsgZWF4PWRhdGExKD10bXA3K3oxK3o0KQotCXBvcAllY3gJCTsgY3RyCi0JZGVzY2FsZQllYngsKENPTlNUX0JJVFMrUEFTUzFfQklUUykKLQlkZXNjYWxlCWVheCwoQ09OU1RfQklUUytQQVNTMV9CSVRTKQotCW1vdglEQ1RFTEVNIFtDT0woMyxlZHgsU0laRU9GX0RDVEVMRU0pXSwgYngKLQltb3YJRENURUxFTSBbQ09MKDEsZWR4LFNJWkVPRl9EQ1RFTEVNKV0sIGF4Ci0KLQlhZGQJZWR4LCBieXRlIFNJWkVPRl9EQ1RFTEVNICAgIDsgYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uCi0JZGVjCWVjeAotCWpuegluZWFyIC5jb2x1bW5sb29wCi0KLQlwb3AJZWRpCi0JcG9wCWVzaQotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXBvcAllYngKLQlwb3AJZWJwCi0JcmV0Ci0KLSVlbmRpZiA7IERDVF9JU0xPV19TVVBQT1JURUQKZGlmZiAtLWdpdCBhL3VudXNlZC9qZmRjdGludC5jIGIvamZkY3RpbnQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdW51c2VkL2pmZGN0aW50LmMKcmVuYW1lIHRvIGpmZGN0aW50LmMKZGlmZiAtLWdpdCBhL2pmc3MyZnN0LmFzbSBiL2pmc3MyZnN0LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3YmNlZi4uMDAwMDAwMAotLS0gYS9qZnNzMmZzdC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw0MTEgKzAsMCBAQAotOwotOyBqZnNzMmZzdC5hc20gLSBmYXN0IGludGVnZXIgRkRDVCAoU1NFMikKLTsKLTsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Ci07IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi07IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKLTsKLTsgVGhpcyBmaWxlIHNob3VsZCBiZSBhc3NlbWJsZWQgd2l0aCBOQVNNIChOZXR3aWRlIEFzc2VtYmxlciksCi07IGNhbiAqbm90KiBiZSBhc3NlbWJsZWQgd2l0aCBNaWNyb3NvZnQncyBNQVNNIG9yIGFueSBjb21wYXRpYmxlCi07IGFzc2VtYmxlciAoaW5jbHVkaW5nIEJvcmxhbmQncyBUdXJibyBBc3NlbWJsZXIpLgotOyBOQVNNIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9uYXNtLnNvdXJjZWZvcmdlLm5ldC8gb3IKLTsgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NjIwOAotOwotOyBUaGlzIGZpbGUgY29udGFpbnMgYSBmYXN0LCBub3Qgc28gYWNjdXJhdGUgaW50ZWdlciBpbXBsZW1lbnRhdGlvbiBvZgotOyB0aGUgZm9yd2FyZCBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLiBUaGUgZm9sbG93aW5nIGNvZGUgaXMKLTsgYmFzZWQgZGlyZWN0bHkgb24gdGhlIElKRydzIG9yaWdpbmFsIGpmZGN0ZnN0LmM7IHNlZSB0aGUgamZkY3Rmc3QuYwotOyBmb3IgbW9yZSBkZXRhaWxzLgotOwotOyBMYXN0IE1vZGlmaWVkIDogRmVicnVhcnkgNCwgMjAwNgotOwotOyBbVEFCOF0KLQotJWluY2x1ZGUgImpzaW1kZXh0LmluYyIKLSVpbmNsdWRlICJqZGN0LmluYyIKLQotJWlmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKLSVpZmRlZiBKRkRDVF9JTlRfU1NFMl9TVVBQT1JURUQKLQotOyBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLTsKLSVpZiBEQ1RTSVpFICE9IDgKLSVlcnJvciAiU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIgotJWVuZGlmCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJWRlZmluZSBDT05TVF9CSVRTCTgJOyAxNCBpcyBhbHNvIE9LLgotCi0laWYgQ09OU1RfQklUUyA9PSA4Ci1GXzBfMzgyCWVxdQkgOTgJCTsgRklYKDAuMzgyNjgzNDMzKQotRl8wXzU0MQllcXUJMTM5CQk7IEZJWCgwLjU0MTE5NjEwMCkKLUZfMF83MDcJZXF1CTE4MQkJOyBGSVgoMC43MDcxMDY3ODEpCi1GXzFfMzA2CWVxdQkzMzQJCTsgRklYKDEuMzA2NTYyOTY1KQotJWVsc2UKLTsgTkFTTSBjYW5ub3QgZG8gY29tcGlsZS10aW1lIGFyaXRobWV0aWMgb24gZmxvYXRpbmctcG9pbnQgY29uc3RhbnRzLgotJWRlZmluZSBERVNDQUxFKHgsbikgICgoKHgpKygxPDwoKG4pLTEpKSk+PihuKSkKLUZfMF8zODIJZXF1CURFU0NBTEUoIDQxMDkwMzIwNywzMC1DT05TVF9CSVRTKQk7IEZJWCgwLjM4MjY4MzQzMykKLUZfMF81NDEJZXF1CURFU0NBTEUoIDU4MTEwNDg4NywzMC1DT05TVF9CSVRTKQk7IEZJWCgwLjU0MTE5NjEwMCkKLUZfMF83MDcJZXF1CURFU0NBTEUoIDc1OTI1MDEyNCwzMC1DT05TVF9CSVRTKQk7IEZJWCgwLjcwNzEwNjc4MSkKLUZfMV8zMDYJZXF1CURFU0NBTEUoMTQwMjkxMTMwMSwzMC1DT05TVF9CSVRTKQk7IEZJWCgxLjMwNjU2Mjk2NSkKLSVlbmRpZgotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JU0VDVElPTglTRUdfQ09OU1QKLQotOyBQUkVfTVVMVElQTFlfU0NBTEVfQklUUyA8PSAyICh0byBhdm9pZCBvdmVyZmxvdykKLTsgQ09OU1RfQklUUyArIENPTlNUX1NISUZUICsgUFJFX01VTFRJUExZX1NDQUxFX0JJVFMgPT0gMTYgKGZvciBwbXVsaHcpCi0KLSVkZWZpbmUgUFJFX01VTFRJUExZX1NDQUxFX0JJVFMgICAyCi0lZGVmaW5lIENPTlNUX1NISUZUICAgICAoMTYgLSBQUkVfTVVMVElQTFlfU0NBTEVfQklUUyAtIENPTlNUX0JJVFMpCi0KLQlhbGlnbnoJMTYKLQlnbG9iYWwJRVhUTihqY29uc3RfZmRjdF9pZmFzdF9zc2UyKQotCi1FWFROKGpjb25zdF9mZGN0X2lmYXN0X3NzZTIpOgotCi1QV19GMDcwNwl0aW1lcyA4IGR3ICBGXzBfNzA3IDw8IENPTlNUX1NISUZUCi1QV19GMDM4Mgl0aW1lcyA4IGR3ICBGXzBfMzgyIDw8IENPTlNUX1NISUZUCi1QV19GMDU0MQl0aW1lcyA4IGR3ICBGXzBfNTQxIDw8IENPTlNUX1NISUZUCi1QV19GMTMwNgl0aW1lcyA4IGR3ICBGXzFfMzA2IDw8IENPTlNUX1NISUZUCi0KLQlhbGlnbnoJMTYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX1RFWFQKLQlCSVRTCTMyCi07Ci07IFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIG9uZSBibG9jayBvZiBzYW1wbGVzLgotOwotOyBHTE9CQUwodm9pZCkKLTsganBlZ19mZGN0X2lmYXN0X3NzZTIgKERDVEVMRU0gKiBkYXRhKQotOwotCi0lZGVmaW5lIGRhdGEoYikJCShiKSs4CQk7IERDVEVMRU0gKiBkYXRhCi0KLSVkZWZpbmUgb3JpZ2luYWxfZWJwCWVicCswCi0lZGVmaW5lIHdrKGkpCQllYnAtKFdLX05VTS0oaSkpKlNJWkVPRl9YTU1XT1JECTsgeG1td29yZCB3a1tXS19OVU1dCi0lZGVmaW5lIFdLX05VTQkJMgotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2ZkY3RfaWZhc3Rfc3NlMikKLQotRVhUTihqcGVnX2ZkY3RfaWZhc3Rfc3NlMik6Ci0JcHVzaAllYnAKLQltb3YJZWF4LGVzcAkJCQk7IGVheCA9IG9yaWdpbmFsIGVicAotCXN1Ygllc3AsIGJ5dGUgNAotCWFuZAllc3AsIGJ5dGUgKC1TSVpFT0ZfWE1NV09SRCkJOyBhbGlnbiB0byAxMjggYml0cwotCW1vdglbZXNwXSxlYXgKLQltb3YJZWJwLGVzcAkJCQk7IGVicCA9IGFsaWduZWQgZWJwCi0JbGVhCWVzcCwgW3drKDApXQotCXB1c2hwaWMJZWJ4Ci07CXB1c2gJZWN4CQk7IHVudXNlZAotOwlwdXNoCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcHVzaAllc2kJCTsgdW51c2VkCi07CXB1c2gJZWRpCQk7IHVudXNlZAotCi0JZ2V0X0dPVAllYngJCTsgZ2V0IEdPVCBhZGRyZXNzCi0KLQk7IC0tLS0gUGFzcyAxOiBwcm9jZXNzIHJvd3MuCi0KLQltb3YJZWR4LCBQT0lOVEVSIFtkYXRhKGVheCldCTsgKERDVEVMRU0gKikKLQotCW1vdmRxYQl4bW0wLCBYTU1XT1JEIFtYTU1CTE9DSygwLDAsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQltb3ZkcWEJeG1tMSwgWE1NV09SRCBbWE1NQkxPQ0soMSwwLGVkeCxTSVpFT0ZfRENURUxFTSldCi0JbW92ZHFhCXhtbTIsIFhNTVdPUkQgW1hNTUJMT0NLKDIsMCxlZHgsU0laRU9GX0RDVEVMRU0pXQotCW1vdmRxYQl4bW0zLCBYTU1XT1JEIFtYTU1CTE9DSygzLDAsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQotCTsgeG1tMD0oMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcpLCB4bW0yPSgyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNykKLQk7IHhtbTE9KDEwIDExIDEyIDEzIDE0IDE1IDE2IDE3KSwgeG1tMz0oMzAgMzEgMzIgMzMgMzQgMzUgMzYgMzcpCi0KLQltb3ZkcWEgICAgeG1tNCx4bW0wCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMSkKLQlwdW5wY2tsd2QgeG1tMCx4bW0xCQk7IHhtbTA9KDAwIDEwIDAxIDExIDAyIDEyIDAzIDEzKQotCXB1bnBja2h3ZCB4bW00LHhtbTEJCTsgeG1tND0oMDQgMTQgMDUgMTUgMDYgMTYgMDcgMTcpCi0JbW92ZHFhICAgIHhtbTUseG1tMgkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDEpCi0JcHVucGNrbHdkIHhtbTIseG1tMwkJOyB4bW0yPSgyMCAzMCAyMSAzMSAyMiAzMiAyMyAzMykKLQlwdW5wY2tod2QgeG1tNSx4bW0zCQk7IHhtbTU9KDI0IDM0IDI1IDM1IDI2IDM2IDI3IDM3KQotCi0JbW92ZHFhCXhtbTYsIFhNTVdPUkQgW1hNTUJMT0NLKDQsMCxlZHgsU0laRU9GX0RDVEVMRU0pXQotCW1vdmRxYQl4bW03LCBYTU1XT1JEIFtYTU1CTE9DSyg1LDAsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQltb3ZkcWEJeG1tMSwgWE1NV09SRCBbWE1NQkxPQ0soNiwwLGVkeCxTSVpFT0ZfRENURUxFTSldCi0JbW92ZHFhCXhtbTMsIFhNTVdPUkQgW1hNTUJMT0NLKDcsMCxlZHgsU0laRU9GX0RDVEVMRU0pXQotCi0JOyB4bW02PSggNCAxMiAyMCAyOCAzNiA0NCA1MiA2MCksIHhtbTE9KCA2IDE0IDIyIDMwIDM4IDQ2IDU0IDYyKQotCTsgeG1tNz0oIDUgMTMgMjEgMjkgMzcgNDUgNTMgNjEpLCB4bW0zPSggNyAxNSAyMyAzMSAzOSA0NyA1NSA2MykKLQotCW1vdmRxYQlYTU1XT1JEIFt3aygwKV0sIHhtbTIJOyB3aygwKT0oMjAgMzAgMjEgMzEgMjIgMzIgMjMgMzMpCi0JbW92ZHFhCVhNTVdPUkQgW3drKDEpXSwgeG1tNQk7IHdrKDEpPSgyNCAzNCAyNSAzNSAyNiAzNiAyNyAzNykKLQotCW1vdmRxYSAgICB4bW0yLHhtbTYJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAxKQotCXB1bnBja2x3ZCB4bW02LHhtbTcJCTsgeG1tNj0oNDAgNTAgNDEgNTEgNDIgNTIgNDMgNTMpCi0JcHVucGNraHdkIHhtbTIseG1tNwkJOyB4bW0yPSg0NCA1NCA0NSA1NSA0NiA1NiA0NyA1NykKLQltb3ZkcWEgICAgeG1tNSx4bW0xCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMSkKLQlwdW5wY2tsd2QgeG1tMSx4bW0zCQk7IHhtbTE9KDYwIDcwIDYxIDcxIDYyIDcyIDYzIDczKQotCXB1bnBja2h3ZCB4bW01LHhtbTMJCTsgeG1tNT0oNjQgNzQgNjUgNzUgNjYgNzYgNjcgNzcpCi0KLQltb3ZkcWEgICAgeG1tNyx4bW02CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMikKLQlwdW5wY2tsZHEgeG1tNix4bW0xCQk7IHhtbTY9KDQwIDUwIDYwIDcwIDQxIDUxIDYxIDcxKQotCXB1bnBja2hkcSB4bW03LHhtbTEJCTsgeG1tNz0oNDIgNTIgNjIgNzIgNDMgNTMgNjMgNzMpCi0JbW92ZHFhICAgIHhtbTMseG1tMgkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDIpCi0JcHVucGNrbGRxIHhtbTIseG1tNQkJOyB4bW0yPSg0NCA1NCA2NCA3NCA0NSA1NSA2NSA3NSkKLQlwdW5wY2toZHEgeG1tMyx4bW01CQk7IHhtbTM9KDQ2IDU2IDY2IDc2IDQ3IDU3IDY3IDc3KQotCi0JbW92ZHFhCXhtbTEsIFhNTVdPUkQgW3drKDApXQk7IHhtbTE9KDIwIDMwIDIxIDMxIDIyIDMyIDIzIDMzKQotCW1vdmRxYQl4bW01LCBYTU1XT1JEIFt3aygxKV0JOyB4bW01PSgyNCAzNCAyNSAzNSAyNiAzNiAyNyAzNykKLQltb3ZkcWEJWE1NV09SRCBbd2soMCldLCB4bW03CTsgd2soMCk9KDQyIDUyIDYyIDcyIDQzIDUzIDYzIDczKQotCW1vdmRxYQlYTU1XT1JEIFt3aygxKV0sIHhtbTIJOyB3aygxKT0oNDQgNTQgNjQgNzQgNDUgNTUgNjUgNzUpCi0KLQltb3ZkcWEgICAgeG1tNyx4bW0wCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMikKLQlwdW5wY2tsZHEgeG1tMCx4bW0xCQk7IHhtbTA9KDAwIDEwIDIwIDMwIDAxIDExIDIxIDMxKQotCXB1bnBja2hkcSB4bW03LHhtbTEJCTsgeG1tNz0oMDIgMTIgMjIgMzIgMDMgMTMgMjMgMzMpCi0JbW92ZHFhICAgIHhtbTIseG1tNAkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDIpCi0JcHVucGNrbGRxIHhtbTQseG1tNQkJOyB4bW00PSgwNCAxNCAyNCAzNCAwNSAxNSAyNSAzNSkKLQlwdW5wY2toZHEgeG1tMix4bW01CQk7IHhtbTI9KDA2IDE2IDI2IDM2IDA3IDE3IDI3IDM3KQotCi0JbW92ZHFhICAgICB4bW0xLHhtbTAJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAzKQotCXB1bnBja2xxZHEgeG1tMCx4bW02CQk7IHhtbTA9KDAwIDEwIDIwIDMwIDQwIDUwIDYwIDcwKT1kYXRhMAotCXB1bnBja2hxZHEgeG1tMSx4bW02CQk7IHhtbTE9KDAxIDExIDIxIDMxIDQxIDUxIDYxIDcxKT1kYXRhMQotCW1vdmRxYSAgICAgeG1tNSx4bW0yCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMykKLQlwdW5wY2tscWRxIHhtbTIseG1tMwkJOyB4bW0yPSgwNiAxNiAyNiAzNiA0NiA1NiA2NiA3Nik9ZGF0YTYKLQlwdW5wY2tocWRxIHhtbTUseG1tMwkJOyB4bW01PSgwNyAxNyAyNyAzNyA0NyA1NyA2NyA3Nyk9ZGF0YTcKLQotCW1vdmRxYQl4bW02LHhtbTEKLQltb3ZkcWEJeG1tMyx4bW0wCi0JcHN1YncJeG1tMSx4bW0yCQk7IHhtbTE9ZGF0YTEtZGF0YTY9dG1wNgotCXBzdWJ3CXhtbTAseG1tNQkJOyB4bW0wPWRhdGEwLWRhdGE3PXRtcDcKLQlwYWRkdwl4bW02LHhtbTIJCTsgeG1tNj1kYXRhMStkYXRhNj10bXAxCi0JcGFkZHcJeG1tMyx4bW01CQk7IHhtbTM9ZGF0YTArZGF0YTc9dG1wMAotCi0JbW92ZHFhCXhtbTIsIFhNTVdPUkQgW3drKDApXQk7IHhtbTI9KDQyIDUyIDYyIDcyIDQzIDUzIDYzIDczKQotCW1vdmRxYQl4bW01LCBYTU1XT1JEIFt3aygxKV0JOyB4bW01PSg0NCA1NCA2NCA3NCA0NSA1NSA2NSA3NSkKLQltb3ZkcWEJWE1NV09SRCBbd2soMCldLCB4bW0xCTsgd2soMCk9dG1wNgotCW1vdmRxYQlYTU1XT1JEIFt3aygxKV0sIHhtbTAJOyB3aygxKT10bXA3Ci0KLQltb3ZkcWEgICAgIHhtbTEseG1tNwkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDMpCi0JcHVucGNrbHFkcSB4bW03LHhtbTIJCTsgeG1tNz0oMDIgMTIgMjIgMzIgNDIgNTIgNjIgNzIpPWRhdGEyCi0JcHVucGNraHFkcSB4bW0xLHhtbTIJCTsgeG1tMT0oMDMgMTMgMjMgMzMgNDMgNTMgNjMgNzMpPWRhdGEzCi0JbW92ZHFhICAgICB4bW0wLHhtbTQJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAzKQotCXB1bnBja2xxZHEgeG1tNCx4bW01CQk7IHhtbTQ9KDA0IDE0IDI0IDM0IDQ0IDU0IDY0IDc0KT1kYXRhNAotCXB1bnBja2hxZHEgeG1tMCx4bW01CQk7IHhtbTA9KDA1IDE1IDI1IDM1IDQ1IDU1IDY1IDc1KT1kYXRhNQotCi0JbW92ZHFhCXhtbTIseG1tMQotCW1vdmRxYQl4bW01LHhtbTcKLQlwYWRkdwl4bW0xLHhtbTQJCTsgeG1tMT1kYXRhMytkYXRhND10bXAzCi0JcGFkZHcJeG1tNyx4bW0wCQk7IHhtbTc9ZGF0YTIrZGF0YTU9dG1wMgotCXBzdWJ3CXhtbTIseG1tNAkJOyB4bW0yPWRhdGEzLWRhdGE0PXRtcDQKLQlwc3Vidwl4bW01LHhtbTAJCTsgeG1tNT1kYXRhMi1kYXRhNT10bXA1Ci0KLQk7IC0tIEV2ZW4gcGFydAotCi0JbW92ZHFhCXhtbTQseG1tMwotCW1vdmRxYQl4bW0wLHhtbTYKLQlwc3Vidwl4bW0zLHhtbTEJCTsgeG1tMz10bXAxMwotCXBzdWJ3CXhtbTYseG1tNwkJOyB4bW02PXRtcDEyCi0JcGFkZHcJeG1tNCx4bW0xCQk7IHhtbTQ9dG1wMTAKLQlwYWRkdwl4bW0wLHhtbTcJCTsgeG1tMD10bXAxMQotCi0JcGFkZHcJeG1tNix4bW0zCi0JcHNsbHcJeG1tNixQUkVfTVVMVElQTFlfU0NBTEVfQklUUwotCXBtdWxodwl4bW02LFtHT1RPRkYoZWJ4LFBXX0YwNzA3KV0gOyB4bW02PXoxCi0KLQltb3ZkcWEJeG1tMSx4bW00Ci0JbW92ZHFhCXhtbTcseG1tMwotCXBzdWJ3CXhtbTQseG1tMAkJOyB4bW00PWRhdGE0Ci0JcHN1YncJeG1tMyx4bW02CQk7IHhtbTM9ZGF0YTYKLQlwYWRkdwl4bW0xLHhtbTAJCTsgeG1tMT1kYXRhMAotCXBhZGR3CXhtbTcseG1tNgkJOyB4bW03PWRhdGEyCi0KLQltb3ZkcWEJeG1tMCwgWE1NV09SRCBbd2soMCldCTsgeG1tMD10bXA2Ci0JbW92ZHFhCXhtbTYsIFhNTVdPUkQgW3drKDEpXQk7IHhtbTY9dG1wNwotCW1vdmRxYQlYTU1XT1JEIFt3aygwKV0sIHhtbTQJOyB3aygwKT1kYXRhNAotCW1vdmRxYQlYTU1XT1JEIFt3aygxKV0sIHhtbTMJOyB3aygxKT1kYXRhNgotCi0JOyAtLSBPZGQgcGFydAotCi0JcGFkZHcJeG1tMix4bW01CQk7IHhtbTI9dG1wMTAKLQlwYWRkdwl4bW01LHhtbTAJCTsgeG1tNT10bXAxMQotCXBhZGR3CXhtbTAseG1tNgkJOyB4bW0wPXRtcDEyLCB4bW02PXRtcDcKLQotCXBzbGx3CXhtbTIsUFJFX01VTFRJUExZX1NDQUxFX0JJVFMKLQlwc2xsdwl4bW0wLFBSRV9NVUxUSVBMWV9TQ0FMRV9CSVRTCi0KLQlwc2xsdwl4bW01LFBSRV9NVUxUSVBMWV9TQ0FMRV9CSVRTCi0JcG11bGh3CXhtbTUsW0dPVE9GRihlYngsUFdfRjA3MDcpXSA7IHhtbTU9ejMKLQotCW1vdmRxYQl4bW00LHhtbTIJCTsgeG1tND10bXAxMAotCXBzdWJ3CXhtbTIseG1tMAotCXBtdWxodwl4bW0yLFtHT1RPRkYoZWJ4LFBXX0YwMzgyKV0gOyB4bW0yPXo1Ci0JcG11bGh3CXhtbTQsW0dPVE9GRihlYngsUFdfRjA1NDEpXSA7IHhtbTQ9TVVMVElQTFkodG1wMTAsRklYXzBfNTQxMTk2KQotCXBtdWxodwl4bW0wLFtHT1RPRkYoZWJ4LFBXX0YxMzA2KV0gOyB4bW0wPU1VTFRJUExZKHRtcDEyLEZJWF8xXzMwNjU2MikKLQlwYWRkdwl4bW00LHhtbTIJCTsgeG1tND16MgotCXBhZGR3CXhtbTAseG1tMgkJOyB4bW0wPXo0Ci0KLQltb3ZkcWEJeG1tMyx4bW02Ci0JcHN1YncJeG1tNix4bW01CQk7IHhtbTY9ejEzCi0JcGFkZHcJeG1tMyx4bW01CQk7IHhtbTM9ejExCi0KLQltb3ZkcWEJeG1tMix4bW02Ci0JbW92ZHFhCXhtbTUseG1tMwotCXBzdWJ3CXhtbTYseG1tNAkJOyB4bW02PWRhdGEzCi0JcHN1YncJeG1tMyx4bW0wCQk7IHhtbTM9ZGF0YTcKLQlwYWRkdwl4bW0yLHhtbTQJCTsgeG1tMj1kYXRhNQotCXBhZGR3CXhtbTUseG1tMAkJOyB4bW01PWRhdGExCi0KLQk7IC0tLS0gUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuCi0KLTsJbW92CWVkeCwgUE9JTlRFUiBbZGF0YShlYXgpXQk7IChEQ1RFTEVNICopCi0KLQk7IHhtbTE9KDAwIDEwIDIwIDMwIDQwIDUwIDYwIDcwKSwgeG1tNz0oMDIgMTIgMjIgMzIgNDIgNTIgNjIgNzIpCi0JOyB4bW01PSgwMSAxMSAyMSAzMSA0MSA1MSA2MSA3MSksIHhtbTY9KDAzIDEzIDIzIDMzIDQzIDUzIDYzIDczKQotCi0JbW92ZHFhICAgIHhtbTQseG1tMQkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDEpCi0JcHVucGNrbHdkIHhtbTEseG1tNQkJOyB4bW0xPSgwMCAwMSAxMCAxMSAyMCAyMSAzMCAzMSkKLQlwdW5wY2tod2QgeG1tNCx4bW01CQk7IHhtbTQ9KDQwIDQxIDUwIDUxIDYwIDYxIDcwIDcxKQotCW1vdmRxYSAgICB4bW0wLHhtbTcJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAxKQotCXB1bnBja2x3ZCB4bW03LHhtbTYJCTsgeG1tNz0oMDIgMDMgMTIgMTMgMjIgMjMgMzIgMzMpCi0JcHVucGNraHdkIHhtbTAseG1tNgkJOyB4bW0wPSg0MiA0MyA1MiA1MyA2MiA2MyA3MiA3MykKLQotCW1vdmRxYQl4bW01LCBYTU1XT1JEIFt3aygwKV0JOyB4bW01PWNvbDQKLQltb3ZkcWEJeG1tNiwgWE1NV09SRCBbd2soMSldCTsgeG1tNj1jb2w2Ci0KLQk7IHhtbTU9KDA0IDE0IDI0IDM0IDQ0IDU0IDY0IDc0KSwgeG1tNj0oMDYgMTYgMjYgMzYgNDYgNTYgNjYgNzYpCi0JOyB4bW0yPSgwNSAxNSAyNSAzNSA0NSA1NSA2NSA3NSksIHhtbTM9KDA3IDE3IDI3IDM3IDQ3IDU3IDY3IDc3KQotCi0JbW92ZHFhCVhNTVdPUkQgW3drKDApXSwgeG1tNwk7IHdrKDApPSgwMiAwMyAxMiAxMyAyMiAyMyAzMiAzMykKLQltb3ZkcWEJWE1NV09SRCBbd2soMSldLCB4bW0wCTsgd2soMSk9KDQyIDQzIDUyIDUzIDYyIDYzIDcyIDczKQotCi0JbW92ZHFhICAgIHhtbTcseG1tNQkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDEpCi0JcHVucGNrbHdkIHhtbTUseG1tMgkJOyB4bW01PSgwNCAwNSAxNCAxNSAyNCAyNSAzNCAzNSkKLQlwdW5wY2tod2QgeG1tNyx4bW0yCQk7IHhtbTc9KDQ0IDQ1IDU0IDU1IDY0IDY1IDc0IDc1KQotCW1vdmRxYSAgICB4bW0wLHhtbTYJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAxKQotCXB1bnBja2x3ZCB4bW02LHhtbTMJCTsgeG1tNj0oMDYgMDcgMTYgMTcgMjYgMjcgMzYgMzcpCi0JcHVucGNraHdkIHhtbTAseG1tMwkJOyB4bW0wPSg0NiA0NyA1NiA1NyA2NiA2NyA3NiA3NykKLQotCW1vdmRxYSAgICB4bW0yLHhtbTUJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXB1bnBja2xkcSB4bW01LHhtbTYJCTsgeG1tNT0oMDQgMDUgMDYgMDcgMTQgMTUgMTYgMTcpCi0JcHVucGNraGRxIHhtbTIseG1tNgkJOyB4bW0yPSgyNCAyNSAyNiAyNyAzNCAzNSAzNiAzNykKLQltb3ZkcWEgICAgeG1tMyx4bW03CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMikKLQlwdW5wY2tsZHEgeG1tNyx4bW0wCQk7IHhtbTc9KDQ0IDQ1IDQ2IDQ3IDU0IDU1IDU2IDU3KQotCXB1bnBja2hkcSB4bW0zLHhtbTAJCTsgeG1tMz0oNjQgNjUgNjYgNjcgNzQgNzUgNzYgNzcpCi0KLQltb3ZkcWEJeG1tNiwgWE1NV09SRCBbd2soMCldCTsgeG1tNj0oMDIgMDMgMTIgMTMgMjIgMjMgMzIgMzMpCi0JbW92ZHFhCXhtbTAsIFhNTVdPUkQgW3drKDEpXQk7IHhtbTA9KDQyIDQzIDUyIDUzIDYyIDYzIDcyIDczKQotCW1vdmRxYQlYTU1XT1JEIFt3aygwKV0sIHhtbTIJOyB3aygwKT0oMjQgMjUgMjYgMjcgMzQgMzUgMzYgMzcpCi0JbW92ZHFhCVhNTVdPUkQgW3drKDEpXSwgeG1tNwk7IHdrKDEpPSg0NCA0NSA0NiA0NyA1NCA1NSA1NiA1NykKLQotCW1vdmRxYSAgICB4bW0yLHhtbTEJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXB1bnBja2xkcSB4bW0xLHhtbTYJCTsgeG1tMT0oMDAgMDEgMDIgMDMgMTAgMTEgMTIgMTMpCi0JcHVucGNraGRxIHhtbTIseG1tNgkJOyB4bW0yPSgyMCAyMSAyMiAyMyAzMCAzMSAzMiAzMykKLQltb3ZkcWEgICAgeG1tNyx4bW00CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMikKLQlwdW5wY2tsZHEgeG1tNCx4bW0wCQk7IHhtbTQ9KDQwIDQxIDQyIDQzIDUwIDUxIDUyIDUzKQotCXB1bnBja2hkcSB4bW03LHhtbTAJCTsgeG1tNz0oNjAgNjEgNjIgNjMgNzAgNzEgNzIgNzMpCi0KLQltb3ZkcWEgICAgIHhtbTYseG1tMQkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDMpCi0JcHVucGNrbHFkcSB4bW0xLHhtbTUJCTsgeG1tMT0oMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcpPWRhdGEwCi0JcHVucGNraHFkcSB4bW02LHhtbTUJCTsgeG1tNj0oMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcpPWRhdGExCi0JbW92ZHFhICAgICB4bW0wLHhtbTcJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAzKQotCXB1bnBja2xxZHEgeG1tNyx4bW0zCQk7IHhtbTc9KDYwIDYxIDYyIDYzIDY0IDY1IDY2IDY3KT1kYXRhNgotCXB1bnBja2hxZHEgeG1tMCx4bW0zCQk7IHhtbTA9KDcwIDcxIDcyIDczIDc0IDc1IDc2IDc3KT1kYXRhNwotCi0JbW92ZHFhCXhtbTUseG1tNgotCW1vdmRxYQl4bW0zLHhtbTEKLQlwc3Vidwl4bW02LHhtbTcJCTsgeG1tNj1kYXRhMS1kYXRhNj10bXA2Ci0JcHN1YncJeG1tMSx4bW0wCQk7IHhtbTE9ZGF0YTAtZGF0YTc9dG1wNwotCXBhZGR3CXhtbTUseG1tNwkJOyB4bW01PWRhdGExK2RhdGE2PXRtcDEKLQlwYWRkdwl4bW0zLHhtbTAJCTsgeG1tMz1kYXRhMCtkYXRhNz10bXAwCi0KLQltb3ZkcWEJeG1tNywgWE1NV09SRCBbd2soMCldCTsgeG1tNz0oMjQgMjUgMjYgMjcgMzQgMzUgMzYgMzcpCi0JbW92ZHFhCXhtbTAsIFhNTVdPUkQgW3drKDEpXQk7IHhtbTA9KDQ0IDQ1IDQ2IDQ3IDU0IDU1IDU2IDU3KQotCW1vdmRxYQlYTU1XT1JEIFt3aygwKV0sIHhtbTYJOyB3aygwKT10bXA2Ci0JbW92ZHFhCVhNTVdPUkQgW3drKDEpXSwgeG1tMQk7IHdrKDEpPXRtcDcKLQotCW1vdmRxYSAgICAgeG1tNix4bW0yCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMykKLQlwdW5wY2tscWRxIHhtbTIseG1tNwkJOyB4bW0yPSgyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNyk9ZGF0YTIKLQlwdW5wY2tocWRxIHhtbTYseG1tNwkJOyB4bW02PSgzMCAzMSAzMiAzMyAzNCAzNSAzNiAzNyk9ZGF0YTMKLQltb3ZkcWEgICAgIHhtbTEseG1tNAkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDMpCi0JcHVucGNrbHFkcSB4bW00LHhtbTAJCTsgeG1tND0oNDAgNDEgNDIgNDMgNDQgNDUgNDYgNDcpPWRhdGE0Ci0JcHVucGNraHFkcSB4bW0xLHhtbTAJCTsgeG1tMT0oNTAgNTEgNTIgNTMgNTQgNTUgNTYgNTcpPWRhdGE1Ci0KLQltb3ZkcWEJeG1tNyx4bW02Ci0JbW92ZHFhCXhtbTAseG1tMgotCXBhZGR3CXhtbTYseG1tNAkJOyB4bW02PWRhdGEzK2RhdGE0PXRtcDMKLQlwYWRkdwl4bW0yLHhtbTEJCTsgeG1tMj1kYXRhMitkYXRhNT10bXAyCi0JcHN1YncJeG1tNyx4bW00CQk7IHhtbTc9ZGF0YTMtZGF0YTQ9dG1wNAotCXBzdWJ3CXhtbTAseG1tMQkJOyB4bW0wPWRhdGEyLWRhdGE1PXRtcDUKLQotCTsgLS0gRXZlbiBwYXJ0Ci0KLQltb3ZkcWEJeG1tNCx4bW0zCi0JbW92ZHFhCXhtbTEseG1tNQotCXBzdWJ3CXhtbTMseG1tNgkJOyB4bW0zPXRtcDEzCi0JcHN1YncJeG1tNSx4bW0yCQk7IHhtbTU9dG1wMTIKLQlwYWRkdwl4bW00LHhtbTYJCTsgeG1tND10bXAxMAotCXBhZGR3CXhtbTEseG1tMgkJOyB4bW0xPXRtcDExCi0KLQlwYWRkdwl4bW01LHhtbTMKLQlwc2xsdwl4bW01LFBSRV9NVUxUSVBMWV9TQ0FMRV9CSVRTCi0JcG11bGh3CXhtbTUsW0dPVE9GRihlYngsUFdfRjA3MDcpXSA7IHhtbTU9ejEKLQotCW1vdmRxYQl4bW02LHhtbTQKLQltb3ZkcWEJeG1tMix4bW0zCi0JcHN1YncJeG1tNCx4bW0xCQk7IHhtbTQ9ZGF0YTQKLQlwc3Vidwl4bW0zLHhtbTUJCTsgeG1tMz1kYXRhNgotCXBhZGR3CXhtbTYseG1tMQkJOyB4bW02PWRhdGEwCi0JcGFkZHcJeG1tMix4bW01CQk7IHhtbTI9ZGF0YTIKLQotCW1vdmRxYQlYTU1XT1JEIFtYTU1CTE9DSyg0LDAsZWR4LFNJWkVPRl9EQ1RFTEVNKV0sIHhtbTQKLQltb3ZkcWEJWE1NV09SRCBbWE1NQkxPQ0soNiwwLGVkeCxTSVpFT0ZfRENURUxFTSldLCB4bW0zCi0JbW92ZHFhCVhNTVdPUkQgW1hNTUJMT0NLKDAsMCxlZHgsU0laRU9GX0RDVEVMRU0pXSwgeG1tNgotCW1vdmRxYQlYTU1XT1JEIFtYTU1CTE9DSygyLDAsZWR4LFNJWkVPRl9EQ1RFTEVNKV0sIHhtbTIKLQotCTsgLS0gT2RkIHBhcnQKLQotCW1vdmRxYQl4bW0xLCBYTU1XT1JEIFt3aygwKV0JOyB4bW0xPXRtcDYKLQltb3ZkcWEJeG1tNSwgWE1NV09SRCBbd2soMSldCTsgeG1tNT10bXA3Ci0KLQlwYWRkdwl4bW03LHhtbTAJCTsgeG1tNz10bXAxMAotCXBhZGR3CXhtbTAseG1tMQkJOyB4bW0wPXRtcDExCi0JcGFkZHcJeG1tMSx4bW01CQk7IHhtbTE9dG1wMTIsIHhtbTU9dG1wNwotCi0JcHNsbHcJeG1tNyxQUkVfTVVMVElQTFlfU0NBTEVfQklUUwotCXBzbGx3CXhtbTEsUFJFX01VTFRJUExZX1NDQUxFX0JJVFMKLQotCXBzbGx3CXhtbTAsUFJFX01VTFRJUExZX1NDQUxFX0JJVFMKLQlwbXVsaHcJeG1tMCxbR09UT0ZGKGVieCxQV19GMDcwNyldIDsgeG1tMD16MwotCi0JbW92ZHFhCXhtbTQseG1tNwkJOyB4bW00PXRtcDEwCi0JcHN1YncJeG1tNyx4bW0xCi0JcG11bGh3CXhtbTcsW0dPVE9GRihlYngsUFdfRjAzODIpXSA7IHhtbTc9ejUKLQlwbXVsaHcJeG1tNCxbR09UT0ZGKGVieCxQV19GMDU0MSldIDsgeG1tND1NVUxUSVBMWSh0bXAxMCxGSVhfMF81NDExOTYpCi0JcG11bGh3CXhtbTEsW0dPVE9GRihlYngsUFdfRjEzMDYpXSA7IHhtbTE9TVVMVElQTFkodG1wMTIsRklYXzFfMzA2NTYyKQotCXBhZGR3CXhtbTQseG1tNwkJOyB4bW00PXoyCi0JcGFkZHcJeG1tMSx4bW03CQk7IHhtbTE9ejQKLQotCW1vdmRxYQl4bW0zLHhtbTUKLQlwc3Vidwl4bW01LHhtbTAJCTsgeG1tNT16MTMKLQlwYWRkdwl4bW0zLHhtbTAJCTsgeG1tMz16MTEKLQotCW1vdmRxYQl4bW02LHhtbTUKLQltb3ZkcWEJeG1tMix4bW0zCi0JcHN1YncJeG1tNSx4bW00CQk7IHhtbTU9ZGF0YTMKLQlwc3Vidwl4bW0zLHhtbTEJCTsgeG1tMz1kYXRhNwotCXBhZGR3CXhtbTYseG1tNAkJOyB4bW02PWRhdGE1Ci0JcGFkZHcJeG1tMix4bW0xCQk7IHhtbTI9ZGF0YTEKLQotCW1vdmRxYQlYTU1XT1JEIFtYTU1CTE9DSygzLDAsZWR4LFNJWkVPRl9EQ1RFTEVNKV0sIHhtbTUKLQltb3ZkcWEJWE1NV09SRCBbWE1NQkxPQ0soNywwLGVkeCxTSVpFT0ZfRENURUxFTSldLCB4bW0zCi0JbW92ZHFhCVhNTVdPUkQgW1hNTUJMT0NLKDUsMCxlZHgsU0laRU9GX0RDVEVMRU0pXSwgeG1tNgotCW1vdmRxYQlYTU1XT1JEIFtYTU1CTE9DSygxLDAsZWR4LFNJWkVPRl9EQ1RFTEVNKV0sIHhtbTIKLQotOwlwb3AJZWRpCQk7IHVudXNlZAotOwlwb3AJZXNpCQk7IHVudXNlZAotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IHVudXNlZAotCXBvcHBpYwllYngKLQltb3YJZXNwLGVicAkJOyBlc3AgPC0gYWxpZ25lZCBlYnAKLQlwb3AJZXNwCQk7IGVzcCA8LSBvcmlnaW5hbCBlYnAKLQlwb3AJZWJwCi0JcmV0Ci0KLSVlbmRpZiA7IEpGRENUX0lOVF9TU0UyX1NVUFBPUlRFRAotJWVuZGlmIDsgRENUX0lGQVNUX1NVUFBPUlRFRApkaWZmIC0tZ2l0IGEvamZzczJpbnQuYXNtIGIvamZzczJpbnQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDZiNDJjLi4wMDAwMDAwCi0tLSBhL2pmc3MyaW50LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDY0MSArMCwwIEBACi07Ci07IGpmc3MyaW50LmFzbSAtIGFjY3VyYXRlIGludGVnZXIgRkRDVCAoU1NFMikKLTsKLTsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Ci07IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi07IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKLTsKLTsgVGhpcyBmaWxlIHNob3VsZCBiZSBhc3NlbWJsZWQgd2l0aCBOQVNNIChOZXR3aWRlIEFzc2VtYmxlciksCi07IGNhbiAqbm90KiBiZSBhc3NlbWJsZWQgd2l0aCBNaWNyb3NvZnQncyBNQVNNIG9yIGFueSBjb21wYXRpYmxlCi07IGFzc2VtYmxlciAoaW5jbHVkaW5nIEJvcmxhbmQncyBUdXJibyBBc3NlbWJsZXIpLgotOyBOQVNNIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9uYXNtLnNvdXJjZWZvcmdlLm5ldC8gb3IKLTsgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NjIwOAotOwotOyBUaGlzIGZpbGUgY29udGFpbnMgYSBzbG93LWJ1dC1hY2N1cmF0ZSBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIG9mIHRoZQotOyBmb3J3YXJkIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBiYXNlZAotOyBkaXJlY3RseSBvbiB0aGUgSUpHJ3Mgb3JpZ2luYWwgamZkY3RpbnQuYzsgc2VlIHRoZSBqZmRjdGludC5jIGZvcgotOyBtb3JlIGRldGFpbHMuCi07Ci07IExhc3QgTW9kaWZpZWQgOiBGZWJydWFyeSA0LCAyMDA2Ci07Ci07IFtUQUI4XQotCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotJWluY2x1ZGUgImpkY3QuaW5jIgotCi0laWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotJWlmZGVmIEpGRENUX0lOVF9TU0UyX1NVUFBPUlRFRAotCi07IFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotOwotJWlmIERDVFNJWkUgIT0gOAotJWVycm9yICJTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4iCi0lZW5kaWYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0lZGVmaW5lIENPTlNUX0JJVFMJMTMKLSVkZWZpbmUgUEFTUzFfQklUUwkyCi0KLSVkZWZpbmUgREVTQ0FMRV9QMQkoQ09OU1RfQklUUy1QQVNTMV9CSVRTKQotJWRlZmluZSBERVNDQUxFX1AyCShDT05TVF9CSVRTK1BBU1MxX0JJVFMpCi0KLSVpZiBDT05TVF9CSVRTID09IDEzCi1GXzBfMjk4CWVxdQkgMjQ0NgkJOyBGSVgoMC4yOTg2MzEzMzYpCi1GXzBfMzkwCWVxdQkgMzE5NgkJOyBGSVgoMC4zOTAxODA2NDQpCi1GXzBfNTQxCWVxdQkgNDQzMwkJOyBGSVgoMC41NDExOTYxMDApCi1GXzBfNzY1CWVxdQkgNjI3MAkJOyBGSVgoMC43NjUzNjY4NjUpCi1GXzBfODk5CWVxdQkgNzM3MwkJOyBGSVgoMC44OTk5NzYyMjMpCi1GXzFfMTc1CWVxdQkgOTYzMwkJOyBGSVgoMS4xNzU4NzU2MDIpCi1GXzFfNTAxCWVxdQkxMjI5OQkJOyBGSVgoMS41MDEzMjExMTApCi1GXzFfODQ3CWVxdQkxNTEzNwkJOyBGSVgoMS44NDc3NTkwNjUpCi1GXzFfOTYxCWVxdQkxNjA2OQkJOyBGSVgoMS45NjE1NzA1NjApCi1GXzJfMDUzCWVxdQkxNjgxOQkJOyBGSVgoMi4wNTMxMTk4NjkpCi1GXzJfNTYyCWVxdQkyMDk5NQkJOyBGSVgoMi41NjI5MTU0NDcpCi1GXzNfMDcyCWVxdQkyNTE3MgkJOyBGSVgoMy4wNzI3MTEwMjYpCi0lZWxzZQotOyBOQVNNIGNhbm5vdCBkbyBjb21waWxlLXRpbWUgYXJpdGhtZXRpYyBvbiBmbG9hdGluZy1wb2ludCBjb25zdGFudHMuCi0lZGVmaW5lIERFU0NBTEUoeCxuKSAgKCgoeCkrKDE8PCgobiktMSkpKT4+KG4pKQotRl8wXzI5OAllcXUJREVTQ0FMRSggMzIwNjUyOTU1LDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuMjk4NjMxMzM2KQotRl8wXzM5MAllcXUJREVTQ0FMRSggNDE4OTUzMjc2LDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuMzkwMTgwNjQ0KQotRl8wXzU0MQllcXUJREVTQ0FMRSggNTgxMTA0ODg3LDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuNTQxMTk2MTAwKQotRl8wXzc2NQllcXUJREVTQ0FMRSggODIxODA2NDEzLDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuNzY1MzY2ODY1KQotRl8wXzg5OQllcXUJREVTQ0FMRSggOTY2MzQyMTExLDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuODk5OTc2MjIzKQotRl8xXzE3NQllcXUJREVTQ0FMRSgxMjYyNTg2ODEzLDMwLUNPTlNUX0JJVFMpCTsgRklYKDEuMTc1ODc1NjAyKQotRl8xXzUwMQllcXUJREVTQ0FMRSgxNjEyMDMxMjY3LDMwLUNPTlNUX0JJVFMpCTsgRklYKDEuNTAxMzIxMTEwKQotRl8xXzg0NwllcXUJREVTQ0FMRSgxOTg0MDE2MTg4LDMwLUNPTlNUX0JJVFMpCTsgRklYKDEuODQ3NzU5MDY1KQotRl8xXzk2MQllcXUJREVTQ0FMRSgyMTA2MjIwMzUwLDMwLUNPTlNUX0JJVFMpCTsgRklYKDEuOTYxNTcwNTYwKQotRl8yXzA1MwllcXUJREVTQ0FMRSgyMjA0NTIwNjczLDMwLUNPTlNUX0JJVFMpCTsgRklYKDIuMDUzMTE5ODY5KQotRl8yXzU2MgllcXUJREVTQ0FMRSgyNzUxOTA5NTA2LDMwLUNPTlNUX0JJVFMpCTsgRklYKDIuNTYyOTE1NDQ3KQotRl8zXzA3MgllcXUJREVTQ0FMRSgzMjk5Mjk4MzQxLDMwLUNPTlNUX0JJVFMpCTsgRklYKDMuMDcyNzExMDI2KQotJWVuZGlmCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19DT05TVAotCi0JYWxpZ256CTE2Ci0JZ2xvYmFsCUVYVE4oamNvbnN0X2ZkY3RfaXNsb3dfc3NlMikKLQotRVhUTihqY29uc3RfZmRjdF9pc2xvd19zc2UyKToKLQotUFdfRjEzMF9GMDU0CXRpbWVzIDQgZHcgIChGXzBfNTQxK0ZfMF83NjUpLCBGXzBfNTQxCi1QV19GMDU0X01GMTMwCXRpbWVzIDQgZHcgIEZfMF81NDEsIChGXzBfNTQxLUZfMV84NDcpCi1QV19NRjA3OF9GMTE3CXRpbWVzIDQgZHcgIChGXzFfMTc1LUZfMV85NjEpLCBGXzFfMTc1Ci1QV19GMTE3X0YwNzgJdGltZXMgNCBkdyAgRl8xXzE3NSwgKEZfMV8xNzUtRl8wXzM5MCkKLVBXX01GMDYwX01GMDg5CXRpbWVzIDQgZHcgIChGXzBfMjk4LUZfMF84OTkpLC1GXzBfODk5Ci1QV19NRjA4OV9GMDYwCXRpbWVzIDQgZHcgLUZfMF84OTksIChGXzFfNTAxLUZfMF84OTkpCi1QV19NRjA1MF9NRjI1Ngl0aW1lcyA0IGR3ICAoRl8yXzA1My1GXzJfNTYyKSwtRl8yXzU2MgotUFdfTUYyNTZfRjA1MAl0aW1lcyA0IGR3IC1GXzJfNTYyLCAoRl8zXzA3Mi1GXzJfNTYyKQotUERfREVTQ0FMRV9QMQl0aW1lcyA0IGRkICAxIDw8IChERVNDQUxFX1AxLTEpCi1QRF9ERVNDQUxFX1AyCXRpbWVzIDQgZGQgIDEgPDwgKERFU0NBTEVfUDItMSkKLVBXX0RFU0NBTEVfUDJYCXRpbWVzIDggZHcgIDEgPDwgKFBBU1MxX0JJVFMtMSkKLQotCWFsaWduegkxNgotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JU0VDVElPTglTRUdfVEVYVAotCUJJVFMJMzIKLTsKLTsgUGVyZm9ybSB0aGUgZm9yd2FyZCBEQ1Qgb24gb25lIGJsb2NrIG9mIHNhbXBsZXMuCi07Ci07IEdMT0JBTCh2b2lkKQotOyBqcGVnX2ZkY3RfaXNsb3dfc3NlMiAoRENURUxFTSAqIGRhdGEpCi07Ci0KLSVkZWZpbmUgZGF0YShiKQkJKGIpKzgJCTsgRENURUxFTSAqIGRhdGEKLQotJWRlZmluZSBvcmlnaW5hbF9lYnAJZWJwKzAKLSVkZWZpbmUgd2soaSkJCWVicC0oV0tfTlVNLShpKSkqU0laRU9GX1hNTVdPUkQJOyB4bW13b3JkIHdrW1dLX05VTV0KLSVkZWZpbmUgV0tfTlVNCQk2Ci0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfZmRjdF9pc2xvd19zc2UyKQotCi1FWFROKGpwZWdfZmRjdF9pc2xvd19zc2UyKToKLQlwdXNoCWVicAotCW1vdgllYXgsZXNwCQkJCTsgZWF4ID0gb3JpZ2luYWwgZWJwCi0Jc3ViCWVzcCwgYnl0ZSA0Ci0JYW5kCWVzcCwgYnl0ZSAoLVNJWkVPRl9YTU1XT1JEKQk7IGFsaWduIHRvIDEyOCBiaXRzCi0JbW92CVtlc3BdLGVheAotCW1vdgllYnAsZXNwCQkJCTsgZWJwID0gYWxpZ25lZCBlYnAKLQlsZWEJZXNwLCBbd2soMCldCi0JcHVzaHBpYwllYngKLTsJcHVzaAllY3gJCTsgdW51c2VkCi07CXB1c2gJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwdXNoCWVzaQkJOyB1bnVzZWQKLTsJcHVzaAllZGkJCTsgdW51c2VkCi0KLQlnZXRfR09UCWVieAkJOyBnZXQgR09UIGFkZHJlc3MKLQotCTsgLS0tLSBQYXNzIDE6IHByb2Nlc3Mgcm93cy4KLQotCW1vdgllZHgsIFBPSU5URVIgW2RhdGEoZWF4KV0JOyAoRENURUxFTSAqKQotCi0JbW92ZHFhCXhtbTAsIFhNTVdPUkQgW1hNTUJMT0NLKDAsMCxlZHgsU0laRU9GX0RDVEVMRU0pXQotCW1vdmRxYQl4bW0xLCBYTU1XT1JEIFtYTU1CTE9DSygxLDAsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQltb3ZkcWEJeG1tMiwgWE1NV09SRCBbWE1NQkxPQ0soMiwwLGVkeCxTSVpFT0ZfRENURUxFTSldCi0JbW92ZHFhCXhtbTMsIFhNTVdPUkQgW1hNTUJMT0NLKDMsMCxlZHgsU0laRU9GX0RDVEVMRU0pXQotCi0JOyB4bW0wPSgwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyksIHhtbTI9KDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3KQotCTsgeG1tMT0oMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcpLCB4bW0zPSgzMCAzMSAzMiAzMyAzNCAzNSAzNiAzNykKLQotCW1vdmRxYSAgICB4bW00LHhtbTAJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAxKQotCXB1bnBja2x3ZCB4bW0wLHhtbTEJCTsgeG1tMD0oMDAgMTAgMDEgMTEgMDIgMTIgMDMgMTMpCi0JcHVucGNraHdkIHhtbTQseG1tMQkJOyB4bW00PSgwNCAxNCAwNSAxNSAwNiAxNiAwNyAxNykKLQltb3ZkcWEgICAgeG1tNSx4bW0yCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMSkKLQlwdW5wY2tsd2QgeG1tMix4bW0zCQk7IHhtbTI9KDIwIDMwIDIxIDMxIDIyIDMyIDIzIDMzKQotCXB1bnBja2h3ZCB4bW01LHhtbTMJCTsgeG1tNT0oMjQgMzQgMjUgMzUgMjYgMzYgMjcgMzcpCi0KLQltb3ZkcWEJeG1tNiwgWE1NV09SRCBbWE1NQkxPQ0soNCwwLGVkeCxTSVpFT0ZfRENURUxFTSldCi0JbW92ZHFhCXhtbTcsIFhNTVdPUkQgW1hNTUJMT0NLKDUsMCxlZHgsU0laRU9GX0RDVEVMRU0pXQotCW1vdmRxYQl4bW0xLCBYTU1XT1JEIFtYTU1CTE9DSyg2LDAsZWR4LFNJWkVPRl9EQ1RFTEVNKV0KLQltb3ZkcWEJeG1tMywgWE1NV09SRCBbWE1NQkxPQ0soNywwLGVkeCxTSVpFT0ZfRENURUxFTSldCi0KLQk7IHhtbTY9KCA0IDEyIDIwIDI4IDM2IDQ0IDUyIDYwKSwgeG1tMT0oIDYgMTQgMjIgMzAgMzggNDYgNTQgNjIpCi0JOyB4bW03PSggNSAxMyAyMSAyOSAzNyA0NSA1MyA2MSksIHhtbTM9KCA3IDE1IDIzIDMxIDM5IDQ3IDU1IDYzKQotCi0JbW92ZHFhCVhNTVdPUkQgW3drKDApXSwgeG1tMgk7IHdrKDApPSgyMCAzMCAyMSAzMSAyMiAzMiAyMyAzMykKLQltb3ZkcWEJWE1NV09SRCBbd2soMSldLCB4bW01CTsgd2soMSk9KDI0IDM0IDI1IDM1IDI2IDM2IDI3IDM3KQotCi0JbW92ZHFhICAgIHhtbTIseG1tNgkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDEpCi0JcHVucGNrbHdkIHhtbTYseG1tNwkJOyB4bW02PSg0MCA1MCA0MSA1MSA0MiA1MiA0MyA1MykKLQlwdW5wY2tod2QgeG1tMix4bW03CQk7IHhtbTI9KDQ0IDU0IDQ1IDU1IDQ2IDU2IDQ3IDU3KQotCW1vdmRxYSAgICB4bW01LHhtbTEJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAxKQotCXB1bnBja2x3ZCB4bW0xLHhtbTMJCTsgeG1tMT0oNjAgNzAgNjEgNzEgNjIgNzIgNjMgNzMpCi0JcHVucGNraHdkIHhtbTUseG1tMwkJOyB4bW01PSg2NCA3NCA2NSA3NSA2NiA3NiA2NyA3NykKLQotCW1vdmRxYSAgICB4bW03LHhtbTYJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXB1bnBja2xkcSB4bW02LHhtbTEJCTsgeG1tNj0oNDAgNTAgNjAgNzAgNDEgNTEgNjEgNzEpCi0JcHVucGNraGRxIHhtbTcseG1tMQkJOyB4bW03PSg0MiA1MiA2MiA3MiA0MyA1MyA2MyA3MykKLQltb3ZkcWEgICAgeG1tMyx4bW0yCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMikKLQlwdW5wY2tsZHEgeG1tMix4bW01CQk7IHhtbTI9KDQ0IDU0IDY0IDc0IDQ1IDU1IDY1IDc1KQotCXB1bnBja2hkcSB4bW0zLHhtbTUJCTsgeG1tMz0oNDYgNTYgNjYgNzYgNDcgNTcgNjcgNzcpCi0KLQltb3ZkcWEJeG1tMSwgWE1NV09SRCBbd2soMCldCTsgeG1tMT0oMjAgMzAgMjEgMzEgMjIgMzIgMjMgMzMpCi0JbW92ZHFhCXhtbTUsIFhNTVdPUkQgW3drKDEpXQk7IHhtbTU9KDI0IDM0IDI1IDM1IDI2IDM2IDI3IDM3KQotCW1vdmRxYQlYTU1XT1JEIFt3aygyKV0sIHhtbTcJOyB3aygyKT0oNDIgNTIgNjIgNzIgNDMgNTMgNjMgNzMpCi0JbW92ZHFhCVhNTVdPUkQgW3drKDMpXSwgeG1tMgk7IHdrKDMpPSg0NCA1NCA2NCA3NCA0NSA1NSA2NSA3NSkKLQotCW1vdmRxYSAgICB4bW03LHhtbTAJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXB1bnBja2xkcSB4bW0wLHhtbTEJCTsgeG1tMD0oMDAgMTAgMjAgMzAgMDEgMTEgMjEgMzEpCi0JcHVucGNraGRxIHhtbTcseG1tMQkJOyB4bW03PSgwMiAxMiAyMiAzMiAwMyAxMyAyMyAzMykKLQltb3ZkcWEgICAgeG1tMix4bW00CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMikKLQlwdW5wY2tsZHEgeG1tNCx4bW01CQk7IHhtbTQ9KDA0IDE0IDI0IDM0IDA1IDE1IDI1IDM1KQotCXB1bnBja2hkcSB4bW0yLHhtbTUJCTsgeG1tMj0oMDYgMTYgMjYgMzYgMDcgMTcgMjcgMzcpCi0KLQltb3ZkcWEgICAgIHhtbTEseG1tMAkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDMpCi0JcHVucGNrbHFkcSB4bW0wLHhtbTYJCTsgeG1tMD0oMDAgMTAgMjAgMzAgNDAgNTAgNjAgNzApPWRhdGEwCi0JcHVucGNraHFkcSB4bW0xLHhtbTYJCTsgeG1tMT0oMDEgMTEgMjEgMzEgNDEgNTEgNjEgNzEpPWRhdGExCi0JbW92ZHFhICAgICB4bW01LHhtbTIJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAzKQotCXB1bnBja2xxZHEgeG1tMix4bW0zCQk7IHhtbTI9KDA2IDE2IDI2IDM2IDQ2IDU2IDY2IDc2KT1kYXRhNgotCXB1bnBja2hxZHEgeG1tNSx4bW0zCQk7IHhtbTU9KDA3IDE3IDI3IDM3IDQ3IDU3IDY3IDc3KT1kYXRhNwotCi0JbW92ZHFhCXhtbTYseG1tMQotCW1vdmRxYQl4bW0zLHhtbTAKLQlwc3Vidwl4bW0xLHhtbTIJCTsgeG1tMT1kYXRhMS1kYXRhNj10bXA2Ci0JcHN1YncJeG1tMCx4bW01CQk7IHhtbTA9ZGF0YTAtZGF0YTc9dG1wNwotCXBhZGR3CXhtbTYseG1tMgkJOyB4bW02PWRhdGExK2RhdGE2PXRtcDEKLQlwYWRkdwl4bW0zLHhtbTUJCTsgeG1tMz1kYXRhMCtkYXRhNz10bXAwCi0KLQltb3ZkcWEJeG1tMiwgWE1NV09SRCBbd2soMildCTsgeG1tMj0oNDIgNTIgNjIgNzIgNDMgNTMgNjMgNzMpCi0JbW92ZHFhCXhtbTUsIFhNTVdPUkQgW3drKDMpXQk7IHhtbTU9KDQ0IDU0IDY0IDc0IDQ1IDU1IDY1IDc1KQotCW1vdmRxYQlYTU1XT1JEIFt3aygwKV0sIHhtbTEJOyB3aygwKT10bXA2Ci0JbW92ZHFhCVhNTVdPUkQgW3drKDEpXSwgeG1tMAk7IHdrKDEpPXRtcDcKLQotCW1vdmRxYSAgICAgeG1tMSx4bW03CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMykKLQlwdW5wY2tscWRxIHhtbTcseG1tMgkJOyB4bW03PSgwMiAxMiAyMiAzMiA0MiA1MiA2MiA3Mik9ZGF0YTIKLQlwdW5wY2tocWRxIHhtbTEseG1tMgkJOyB4bW0xPSgwMyAxMyAyMyAzMyA0MyA1MyA2MyA3Myk9ZGF0YTMKLQltb3ZkcWEgICAgIHhtbTAseG1tNAkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDMpCi0JcHVucGNrbHFkcSB4bW00LHhtbTUJCTsgeG1tND0oMDQgMTQgMjQgMzQgNDQgNTQgNjQgNzQpPWRhdGE0Ci0JcHVucGNraHFkcSB4bW0wLHhtbTUJCTsgeG1tMD0oMDUgMTUgMjUgMzUgNDUgNTUgNjUgNzUpPWRhdGE1Ci0KLQltb3ZkcWEJeG1tMix4bW0xCi0JbW92ZHFhCXhtbTUseG1tNwotCXBhZGR3CXhtbTEseG1tNAkJOyB4bW0xPWRhdGEzK2RhdGE0PXRtcDMKLQlwYWRkdwl4bW03LHhtbTAJCTsgeG1tNz1kYXRhMitkYXRhNT10bXAyCi0JcHN1YncJeG1tMix4bW00CQk7IHhtbTI9ZGF0YTMtZGF0YTQ9dG1wNAotCXBzdWJ3CXhtbTUseG1tMAkJOyB4bW01PWRhdGEyLWRhdGE1PXRtcDUKLQotCTsgLS0gRXZlbiBwYXJ0Ci0KLQltb3ZkcWEJeG1tNCx4bW0zCi0JbW92ZHFhCXhtbTAseG1tNgotCXBhZGR3CXhtbTMseG1tMQkJOyB4bW0zPXRtcDEwCi0JcGFkZHcJeG1tNix4bW03CQk7IHhtbTY9dG1wMTEKLQlwc3Vidwl4bW00LHhtbTEJCTsgeG1tND10bXAxMwotCXBzdWJ3CXhtbTAseG1tNwkJOyB4bW0wPXRtcDEyCi0KLQltb3ZkcWEJeG1tMSx4bW0zCi0JcGFkZHcJeG1tMyx4bW02CQk7IHhtbTM9dG1wMTArdG1wMTEKLQlwc3Vidwl4bW0xLHhtbTYJCTsgeG1tMT10bXAxMC10bXAxMQotCi0JcHNsbHcJeG1tMyxQQVNTMV9CSVRTCQk7IHhtbTM9ZGF0YTAKLQlwc2xsdwl4bW0xLFBBU1MxX0JJVFMJCTsgeG1tMT1kYXRhNAotCi0JbW92ZHFhCVhNTVdPUkQgW3drKDIpXSwgeG1tMwk7IHdrKDIpPWRhdGEwCi0JbW92ZHFhCVhNTVdPUkQgW3drKDMpXSwgeG1tMQk7IHdrKDMpPWRhdGE0Ci0KLQk7IChPcmlnaW5hbCkKLQk7IHoxID0gKHRtcDEyICsgdG1wMTMpICogMC41NDExOTYxMDA7Ci0JOyBkYXRhMiA9IHoxICsgdG1wMTMgKiAwLjc2NTM2Njg2NTsKLQk7IGRhdGE2ID0gejEgKyB0bXAxMiAqIC0xLjg0Nzc1OTA2NTsKLQk7Ci0JOyAoVGhpcyBpbXBsZW1lbnRhdGlvbikKLQk7IGRhdGEyID0gdG1wMTMgKiAoMC41NDExOTYxMDAgKyAwLjc2NTM2Njg2NSkgKyB0bXAxMiAqIDAuNTQxMTk2MTAwOwotCTsgZGF0YTYgPSB0bXAxMyAqIDAuNTQxMTk2MTAwICsgdG1wMTIgKiAoMC41NDExOTYxMDAgLSAxLjg0Nzc1OTA2NSk7Ci0KLQltb3ZkcWEgICAgeG1tNyx4bW00CQk7IHhtbTQ9dG1wMTMKLQltb3ZkcWEgICAgeG1tNix4bW00Ci0JcHVucGNrbHdkIHhtbTcseG1tMAkJOyB4bW0wPXRtcDEyCi0JcHVucGNraHdkIHhtbTYseG1tMAotCW1vdmRxYSAgICB4bW00LHhtbTcKLQltb3ZkcWEgICAgeG1tMCx4bW02Ci0JcG1hZGR3ZCAgIHhtbTcsW0dPVE9GRihlYngsUFdfRjEzMF9GMDU0KV0JOyB4bW03PWRhdGEyTAotCXBtYWRkd2QgICB4bW02LFtHT1RPRkYoZWJ4LFBXX0YxMzBfRjA1NCldCTsgeG1tNj1kYXRhMkgKLQlwbWFkZHdkICAgeG1tNCxbR09UT0ZGKGVieCxQV19GMDU0X01GMTMwKV0JOyB4bW00PWRhdGE2TAotCXBtYWRkd2QgICB4bW0wLFtHT1RPRkYoZWJ4LFBXX0YwNTRfTUYxMzApXQk7IHhtbTA9ZGF0YTZICi0KLQlwYWRkZAl4bW03LFtHT1RPRkYoZWJ4LFBEX0RFU0NBTEVfUDEpXQotCXBhZGRkCXhtbTYsW0dPVE9GRihlYngsUERfREVTQ0FMRV9QMSldCi0JcHNyYWQJeG1tNyxERVNDQUxFX1AxCi0JcHNyYWQJeG1tNixERVNDQUxFX1AxCi0JcGFkZGQJeG1tNCxbR09UT0ZGKGVieCxQRF9ERVNDQUxFX1AxKV0KLQlwYWRkZAl4bW0wLFtHT1RPRkYoZWJ4LFBEX0RFU0NBTEVfUDEpXQotCXBzcmFkCXhtbTQsREVTQ0FMRV9QMQotCXBzcmFkCXhtbTAsREVTQ0FMRV9QMQotCi0JcGFja3NzZHcgIHhtbTcseG1tNgkJOyB4bW03PWRhdGEyCi0JcGFja3NzZHcgIHhtbTQseG1tMAkJOyB4bW00PWRhdGE2Ci0KLQltb3ZkcWEJWE1NV09SRCBbd2soNCldLCB4bW03CTsgd2soNCk9ZGF0YTIKLQltb3ZkcWEJWE1NV09SRCBbd2soNSldLCB4bW00CTsgd2soNSk9ZGF0YTYKLQotCTsgLS0gT2RkIHBhcnQKLQotCW1vdmRxYQl4bW0zLCBYTU1XT1JEIFt3aygwKV0JOyB4bW0zPXRtcDYKLQltb3ZkcWEJeG1tMSwgWE1NV09SRCBbd2soMSldCTsgeG1tMT10bXA3Ci0KLQltb3ZkcWEJeG1tNix4bW0yCQk7IHhtbTI9dG1wNAotCW1vdmRxYQl4bW0wLHhtbTUJCTsgeG1tNT10bXA1Ci0JcGFkZHcJeG1tNix4bW0zCQk7IHhtbTY9ejMKLQlwYWRkdwl4bW0wLHhtbTEJCTsgeG1tMD16NAotCi0JOyAoT3JpZ2luYWwpCi0JOyB6NSA9ICh6MyArIHo0KSAqIDEuMTc1ODc1NjAyOwotCTsgejMgPSB6MyAqIC0xLjk2MTU3MDU2MDsgIHo0ID0gejQgKiAtMC4zOTAxODA2NDQ7Ci0JOyB6MyArPSB6NTsgIHo0ICs9IHo1OwotCTsKLQk7IChUaGlzIGltcGxlbWVudGF0aW9uKQotCTsgejMgPSB6MyAqICgxLjE3NTg3NTYwMiAtIDEuOTYxNTcwNTYwKSArIHo0ICogMS4xNzU4NzU2MDI7Ci0JOyB6NCA9IHozICogMS4xNzU4NzU2MDIgKyB6NCAqICgxLjE3NTg3NTYwMiAtIDAuMzkwMTgwNjQ0KTsKLQotCW1vdmRxYSAgICB4bW03LHhtbTYKLQltb3ZkcWEgICAgeG1tNCx4bW02Ci0JcHVucGNrbHdkIHhtbTcseG1tMAotCXB1bnBja2h3ZCB4bW00LHhtbTAKLQltb3ZkcWEgICAgeG1tNix4bW03Ci0JbW92ZHFhICAgIHhtbTAseG1tNAotCXBtYWRkd2QgICB4bW03LFtHT1RPRkYoZWJ4LFBXX01GMDc4X0YxMTcpXQk7IHhtbTc9ejNMCi0JcG1hZGR3ZCAgIHhtbTQsW0dPVE9GRihlYngsUFdfTUYwNzhfRjExNyldCTsgeG1tND16M0gKLQlwbWFkZHdkICAgeG1tNixbR09UT0ZGKGVieCxQV19GMTE3X0YwNzgpXQk7IHhtbTY9ejRMCi0JcG1hZGR3ZCAgIHhtbTAsW0dPVE9GRihlYngsUFdfRjExN19GMDc4KV0JOyB4bW0wPXo0SAotCi0JbW92ZHFhCVhNTVdPUkQgW3drKDApXSwgeG1tNwk7IHdrKDApPXozTAotCW1vdmRxYQlYTU1XT1JEIFt3aygxKV0sIHhtbTQJOyB3aygxKT16M0gKLQotCTsgKE9yaWdpbmFsKQotCTsgejEgPSB0bXA0ICsgdG1wNzsgIHoyID0gdG1wNSArIHRtcDY7Ci0JOyB0bXA0ID0gdG1wNCAqIDAuMjk4NjMxMzM2OyAgdG1wNSA9IHRtcDUgKiAyLjA1MzExOTg2OTsKLQk7IHRtcDYgPSB0bXA2ICogMy4wNzI3MTEwMjY7ICB0bXA3ID0gdG1wNyAqIDEuNTAxMzIxMTEwOwotCTsgejEgPSB6MSAqIC0wLjg5OTk3NjIyMzsgIHoyID0gejIgKiAtMi41NjI5MTU0NDc7Ci0JOyBkYXRhNyA9IHRtcDQgKyB6MSArIHozOyAgZGF0YTUgPSB0bXA1ICsgejIgKyB6NDsKLQk7IGRhdGEzID0gdG1wNiArIHoyICsgejM7ICBkYXRhMSA9IHRtcDcgKyB6MSArIHo0OwotCTsKLQk7IChUaGlzIGltcGxlbWVudGF0aW9uKQotCTsgdG1wNCA9IHRtcDQgKiAoMC4yOTg2MzEzMzYgLSAwLjg5OTk3NjIyMykgKyB0bXA3ICogLTAuODk5OTc2MjIzOwotCTsgdG1wNSA9IHRtcDUgKiAoMi4wNTMxMTk4NjkgLSAyLjU2MjkxNTQ0NykgKyB0bXA2ICogLTIuNTYyOTE1NDQ3OwotCTsgdG1wNiA9IHRtcDUgKiAtMi41NjI5MTU0NDcgKyB0bXA2ICogKDMuMDcyNzExMDI2IC0gMi41NjI5MTU0NDcpOwotCTsgdG1wNyA9IHRtcDQgKiAtMC44OTk5NzYyMjMgKyB0bXA3ICogKDEuNTAxMzIxMTEwIC0gMC44OTk5NzYyMjMpOwotCTsgZGF0YTcgPSB0bXA0ICsgejM7ICBkYXRhNSA9IHRtcDUgKyB6NDsKLQk7IGRhdGEzID0gdG1wNiArIHozOyAgZGF0YTEgPSB0bXA3ICsgejQ7Ci0KLQltb3ZkcWEgICAgeG1tNyx4bW0yCi0JbW92ZHFhICAgIHhtbTQseG1tMgotCXB1bnBja2x3ZCB4bW03LHhtbTEKLQlwdW5wY2tod2QgeG1tNCx4bW0xCi0JbW92ZHFhICAgIHhtbTIseG1tNwotCW1vdmRxYSAgICB4bW0xLHhtbTQKLQlwbWFkZHdkICAgeG1tNyxbR09UT0ZGKGVieCxQV19NRjA2MF9NRjA4OSldCTsgeG1tNz10bXA0TAotCXBtYWRkd2QgICB4bW00LFtHT1RPRkYoZWJ4LFBXX01GMDYwX01GMDg5KV0JOyB4bW00PXRtcDRICi0JcG1hZGR3ZCAgIHhtbTIsW0dPVE9GRihlYngsUFdfTUYwODlfRjA2MCldCTsgeG1tMj10bXA3TAotCXBtYWRkd2QgICB4bW0xLFtHT1RPRkYoZWJ4LFBXX01GMDg5X0YwNjApXQk7IHhtbTE9dG1wN0gKLQotCXBhZGRkCXhtbTcsIFhNTVdPUkQgW3drKDApXQk7IHhtbTc9ZGF0YTdMCi0JcGFkZGQJeG1tNCwgWE1NV09SRCBbd2soMSldCTsgeG1tND1kYXRhN0gKLQlwYWRkZAl4bW0yLHhtbTYJCTsgeG1tMj1kYXRhMUwKLQlwYWRkZAl4bW0xLHhtbTAJCTsgeG1tMT1kYXRhMUgKLQotCXBhZGRkCXhtbTcsW0dPVE9GRihlYngsUERfREVTQ0FMRV9QMSldCi0JcGFkZGQJeG1tNCxbR09UT0ZGKGVieCxQRF9ERVNDQUxFX1AxKV0KLQlwc3JhZAl4bW03LERFU0NBTEVfUDEKLQlwc3JhZAl4bW00LERFU0NBTEVfUDEKLQlwYWRkZAl4bW0yLFtHT1RPRkYoZWJ4LFBEX0RFU0NBTEVfUDEpXQotCXBhZGRkCXhtbTEsW0dPVE9GRihlYngsUERfREVTQ0FMRV9QMSldCi0JcHNyYWQJeG1tMixERVNDQUxFX1AxCi0JcHNyYWQJeG1tMSxERVNDQUxFX1AxCi0KLQlwYWNrc3NkdyAgeG1tNyx4bW00CQk7IHhtbTc9ZGF0YTcKLQlwYWNrc3NkdyAgeG1tMix4bW0xCQk7IHhtbTI9ZGF0YTEKLQotCW1vdmRxYSAgICB4bW00LHhtbTUKLQltb3ZkcWEgICAgeG1tMSx4bW01Ci0JcHVucGNrbHdkIHhtbTQseG1tMwotCXB1bnBja2h3ZCB4bW0xLHhtbTMKLQltb3ZkcWEgICAgeG1tNSx4bW00Ci0JbW92ZHFhICAgIHhtbTMseG1tMQotCXBtYWRkd2QgICB4bW00LFtHT1RPRkYoZWJ4LFBXX01GMDUwX01GMjU2KV0JOyB4bW00PXRtcDVMCi0JcG1hZGR3ZCAgIHhtbTEsW0dPVE9GRihlYngsUFdfTUYwNTBfTUYyNTYpXQk7IHhtbTE9dG1wNUgKLQlwbWFkZHdkICAgeG1tNSxbR09UT0ZGKGVieCxQV19NRjI1Nl9GMDUwKV0JOyB4bW01PXRtcDZMCi0JcG1hZGR3ZCAgIHhtbTMsW0dPVE9GRihlYngsUFdfTUYyNTZfRjA1MCldCTsgeG1tMz10bXA2SAotCi0JcGFkZGQJeG1tNCx4bW02CQk7IHhtbTQ9ZGF0YTVMCi0JcGFkZGQJeG1tMSx4bW0wCQk7IHhtbTE9ZGF0YTVICi0JcGFkZGQJeG1tNSwgWE1NV09SRCBbd2soMCldCTsgeG1tNT1kYXRhM0wKLQlwYWRkZAl4bW0zLCBYTU1XT1JEIFt3aygxKV0JOyB4bW0zPWRhdGEzSAotCi0JcGFkZGQJeG1tNCxbR09UT0ZGKGVieCxQRF9ERVNDQUxFX1AxKV0KLQlwYWRkZAl4bW0xLFtHT1RPRkYoZWJ4LFBEX0RFU0NBTEVfUDEpXQotCXBzcmFkCXhtbTQsREVTQ0FMRV9QMQotCXBzcmFkCXhtbTEsREVTQ0FMRV9QMQotCXBhZGRkCXhtbTUsW0dPVE9GRihlYngsUERfREVTQ0FMRV9QMSldCi0JcGFkZGQJeG1tMyxbR09UT0ZGKGVieCxQRF9ERVNDQUxFX1AxKV0KLQlwc3JhZAl4bW01LERFU0NBTEVfUDEKLQlwc3JhZAl4bW0zLERFU0NBTEVfUDEKLQotCXBhY2tzc2R3ICB4bW00LHhtbTEJCTsgeG1tND1kYXRhNQotCXBhY2tzc2R3ICB4bW01LHhtbTMJCTsgeG1tNT1kYXRhMwotCi0JOyAtLS0tIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgotCi07CW1vdgllZHgsIFBPSU5URVIgW2RhdGEoZWF4KV0JOyAoRENURUxFTSAqKQotCi0JbW92ZHFhCXhtbTYsIFhNTVdPUkQgW3drKDIpXQk7IHhtbTY9Y29sMAotCW1vdmRxYQl4bW0wLCBYTU1XT1JEIFt3ayg0KV0JOyB4bW0wPWNvbDIKLQotCTsgeG1tNj0oMDAgMTAgMjAgMzAgNDAgNTAgNjAgNzApLCB4bW0wPSgwMiAxMiAyMiAzMiA0MiA1MiA2MiA3MikKLQk7IHhtbTI9KDAxIDExIDIxIDMxIDQxIDUxIDYxIDcxKSwgeG1tNT0oMDMgMTMgMjMgMzMgNDMgNTMgNjMgNzMpCi0KLQltb3ZkcWEgICAgeG1tMSx4bW02CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMSkKLQlwdW5wY2tsd2QgeG1tNix4bW0yCQk7IHhtbTY9KDAwIDAxIDEwIDExIDIwIDIxIDMwIDMxKQotCXB1bnBja2h3ZCB4bW0xLHhtbTIJCTsgeG1tMT0oNDAgNDEgNTAgNTEgNjAgNjEgNzAgNzEpCi0JbW92ZHFhICAgIHhtbTMseG1tMAkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDEpCi0JcHVucGNrbHdkIHhtbTAseG1tNQkJOyB4bW0wPSgwMiAwMyAxMiAxMyAyMiAyMyAzMiAzMykKLQlwdW5wY2tod2QgeG1tMyx4bW01CQk7IHhtbTM9KDQyIDQzIDUyIDUzIDYyIDYzIDcyIDczKQotCi0JbW92ZHFhCXhtbTIsIFhNTVdPUkQgW3drKDMpXQk7IHhtbTI9Y29sNAotCW1vdmRxYQl4bW01LCBYTU1XT1JEIFt3ayg1KV0JOyB4bW01PWNvbDYKLQotCTsgeG1tMj0oMDQgMTQgMjQgMzQgNDQgNTQgNjQgNzQpLCB4bW01PSgwNiAxNiAyNiAzNiA0NiA1NiA2NiA3NikKLQk7IHhtbTQ9KDA1IDE1IDI1IDM1IDQ1IDU1IDY1IDc1KSwgeG1tNz0oMDcgMTcgMjcgMzcgNDcgNTcgNjcgNzcpCi0KLQltb3ZkcWEJWE1NV09SRCBbd2soMCldLCB4bW0wCTsgd2soMCk9KDAyIDAzIDEyIDEzIDIyIDIzIDMyIDMzKQotCW1vdmRxYQlYTU1XT1JEIFt3aygxKV0sIHhtbTMJOyB3aygxKT0oNDIgNDMgNTIgNTMgNjIgNjMgNzIgNzMpCi0KLQltb3ZkcWEgICAgeG1tMCx4bW0yCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMSkKLQlwdW5wY2tsd2QgeG1tMix4bW00CQk7IHhtbTI9KDA0IDA1IDE0IDE1IDI0IDI1IDM0IDM1KQotCXB1bnBja2h3ZCB4bW0wLHhtbTQJCTsgeG1tMD0oNDQgNDUgNTQgNTUgNjQgNjUgNzQgNzUpCi0JbW92ZHFhICAgIHhtbTMseG1tNQkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDEpCi0JcHVucGNrbHdkIHhtbTUseG1tNwkJOyB4bW01PSgwNiAwNyAxNiAxNyAyNiAyNyAzNiAzNykKLQlwdW5wY2tod2QgeG1tMyx4bW03CQk7IHhtbTM9KDQ2IDQ3IDU2IDU3IDY2IDY3IDc2IDc3KQotCi0JbW92ZHFhICAgIHhtbTQseG1tMgkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDIpCi0JcHVucGNrbGRxIHhtbTIseG1tNQkJOyB4bW0yPSgwNCAwNSAwNiAwNyAxNCAxNSAxNiAxNykKLQlwdW5wY2toZHEgeG1tNCx4bW01CQk7IHhtbTQ9KDI0IDI1IDI2IDI3IDM0IDM1IDM2IDM3KQotCW1vdmRxYSAgICB4bW03LHhtbTAJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXB1bnBja2xkcSB4bW0wLHhtbTMJCTsgeG1tMD0oNDQgNDUgNDYgNDcgNTQgNTUgNTYgNTcpCi0JcHVucGNraGRxIHhtbTcseG1tMwkJOyB4bW03PSg2NCA2NSA2NiA2NyA3NCA3NSA3NiA3NykKLQotCW1vdmRxYQl4bW01LCBYTU1XT1JEIFt3aygwKV0JOyB4bW01PSgwMiAwMyAxMiAxMyAyMiAyMyAzMiAzMykKLQltb3ZkcWEJeG1tMywgWE1NV09SRCBbd2soMSldCTsgeG1tMz0oNDIgNDMgNTIgNTMgNjIgNjMgNzIgNzMpCi0JbW92ZHFhCVhNTVdPUkQgW3drKDIpXSwgeG1tNAk7IHdrKDIpPSgyNCAyNSAyNiAyNyAzNCAzNSAzNiAzNykKLQltb3ZkcWEJWE1NV09SRCBbd2soMyldLCB4bW0wCTsgd2soMyk9KDQ0IDQ1IDQ2IDQ3IDU0IDU1IDU2IDU3KQotCi0JbW92ZHFhICAgIHhtbTQseG1tNgkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDIpCi0JcHVucGNrbGRxIHhtbTYseG1tNQkJOyB4bW02PSgwMCAwMSAwMiAwMyAxMCAxMSAxMiAxMykKLQlwdW5wY2toZHEgeG1tNCx4bW01CQk7IHhtbTQ9KDIwIDIxIDIyIDIzIDMwIDMxIDMyIDMzKQotCW1vdmRxYSAgICB4bW0wLHhtbTEJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXB1bnBja2xkcSB4bW0xLHhtbTMJCTsgeG1tMT0oNDAgNDEgNDIgNDMgNTAgNTEgNTIgNTMpCi0JcHVucGNraGRxIHhtbTAseG1tMwkJOyB4bW0wPSg2MCA2MSA2MiA2MyA3MCA3MSA3MiA3MykKLQotCW1vdmRxYSAgICAgeG1tNSx4bW02CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMykKLQlwdW5wY2tscWRxIHhtbTYseG1tMgkJOyB4bW02PSgwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyk9ZGF0YTAKLQlwdW5wY2tocWRxIHhtbTUseG1tMgkJOyB4bW01PSgxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyk9ZGF0YTEKLQltb3ZkcWEgICAgIHhtbTMseG1tMAkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDMpCi0JcHVucGNrbHFkcSB4bW0wLHhtbTcJCTsgeG1tMD0oNjAgNjEgNjIgNjMgNjQgNjUgNjYgNjcpPWRhdGE2Ci0JcHVucGNraHFkcSB4bW0zLHhtbTcJCTsgeG1tMz0oNzAgNzEgNzIgNzMgNzQgNzUgNzYgNzcpPWRhdGE3Ci0KLQltb3ZkcWEJeG1tMix4bW01Ci0JbW92ZHFhCXhtbTcseG1tNgotCXBzdWJ3CXhtbTUseG1tMAkJOyB4bW01PWRhdGExLWRhdGE2PXRtcDYKLQlwc3Vidwl4bW02LHhtbTMJCTsgeG1tNj1kYXRhMC1kYXRhNz10bXA3Ci0JcGFkZHcJeG1tMix4bW0wCQk7IHhtbTI9ZGF0YTErZGF0YTY9dG1wMQotCXBhZGR3CXhtbTcseG1tMwkJOyB4bW03PWRhdGEwK2RhdGE3PXRtcDAKLQotCW1vdmRxYQl4bW0wLCBYTU1XT1JEIFt3aygyKV0JOyB4bW0wPSgyNCAyNSAyNiAyNyAzNCAzNSAzNiAzNykKLQltb3ZkcWEJeG1tMywgWE1NV09SRCBbd2soMyldCTsgeG1tMz0oNDQgNDUgNDYgNDcgNTQgNTUgNTYgNTcpCi0JbW92ZHFhCVhNTVdPUkQgW3drKDApXSwgeG1tNQk7IHdrKDApPXRtcDYKLQltb3ZkcWEJWE1NV09SRCBbd2soMSldLCB4bW02CTsgd2soMSk9dG1wNwotCi0JbW92ZHFhICAgICB4bW01LHhtbTQJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAzKQotCXB1bnBja2xxZHEgeG1tNCx4bW0wCQk7IHhtbTQ9KDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3KT1kYXRhMgotCXB1bnBja2hxZHEgeG1tNSx4bW0wCQk7IHhtbTU9KDMwIDMxIDMyIDMzIDM0IDM1IDM2IDM3KT1kYXRhMwotCW1vdmRxYSAgICAgeG1tNix4bW0xCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMykKLQlwdW5wY2tscWRxIHhtbTEseG1tMwkJOyB4bW0xPSg0MCA0MSA0MiA0MyA0NCA0NSA0NiA0Nyk9ZGF0YTQKLQlwdW5wY2tocWRxIHhtbTYseG1tMwkJOyB4bW02PSg1MCA1MSA1MiA1MyA1NCA1NSA1NiA1Nyk9ZGF0YTUKLQotCW1vdmRxYQl4bW0wLHhtbTUKLQltb3ZkcWEJeG1tMyx4bW00Ci0JcGFkZHcJeG1tNSx4bW0xCQk7IHhtbTU9ZGF0YTMrZGF0YTQ9dG1wMwotCXBhZGR3CXhtbTQseG1tNgkJOyB4bW00PWRhdGEyK2RhdGE1PXRtcDIKLQlwc3Vidwl4bW0wLHhtbTEJCTsgeG1tMD1kYXRhMy1kYXRhND10bXA0Ci0JcHN1YncJeG1tMyx4bW02CQk7IHhtbTM9ZGF0YTItZGF0YTU9dG1wNQotCi0JOyAtLSBFdmVuIHBhcnQKLQotCW1vdmRxYQl4bW0xLHhtbTcKLQltb3ZkcWEJeG1tNix4bW0yCi0JcGFkZHcJeG1tNyx4bW01CQk7IHhtbTc9dG1wMTAKLQlwYWRkdwl4bW0yLHhtbTQJCTsgeG1tMj10bXAxMQotCXBzdWJ3CXhtbTEseG1tNQkJOyB4bW0xPXRtcDEzCi0JcHN1YncJeG1tNix4bW00CQk7IHhtbTY9dG1wMTIKLQotCW1vdmRxYQl4bW01LHhtbTcKLQlwYWRkdwl4bW03LHhtbTIJCTsgeG1tNz10bXAxMCt0bXAxMQotCXBzdWJ3CXhtbTUseG1tMgkJOyB4bW01PXRtcDEwLXRtcDExCi0KLQlwYWRkdwl4bW03LFtHT1RPRkYoZWJ4LFBXX0RFU0NBTEVfUDJYKV0KLQlwYWRkdwl4bW01LFtHT1RPRkYoZWJ4LFBXX0RFU0NBTEVfUDJYKV0KLQlwc3Jhdwl4bW03LFBBU1MxX0JJVFMJCTsgeG1tNz1kYXRhMAotCXBzcmF3CXhtbTUsUEFTUzFfQklUUwkJOyB4bW01PWRhdGE0Ci0KLQltb3ZkcWEJWE1NV09SRCBbWE1NQkxPQ0soMCwwLGVkeCxTSVpFT0ZfRENURUxFTSldLCB4bW03Ci0JbW92ZHFhCVhNTVdPUkQgW1hNTUJMT0NLKDQsMCxlZHgsU0laRU9GX0RDVEVMRU0pXSwgeG1tNQotCi0JOyAoT3JpZ2luYWwpCi0JOyB6MSA9ICh0bXAxMiArIHRtcDEzKSAqIDAuNTQxMTk2MTAwOwotCTsgZGF0YTIgPSB6MSArIHRtcDEzICogMC43NjUzNjY4NjU7Ci0JOyBkYXRhNiA9IHoxICsgdG1wMTIgKiAtMS44NDc3NTkwNjU7Ci0JOwotCTsgKFRoaXMgaW1wbGVtZW50YXRpb24pCi0JOyBkYXRhMiA9IHRtcDEzICogKDAuNTQxMTk2MTAwICsgMC43NjUzNjY4NjUpICsgdG1wMTIgKiAwLjU0MTE5NjEwMDsKLQk7IGRhdGE2ID0gdG1wMTMgKiAwLjU0MTE5NjEwMCArIHRtcDEyICogKDAuNTQxMTk2MTAwIC0gMS44NDc3NTkwNjUpOwotCi0JbW92ZHFhICAgIHhtbTQseG1tMQkJOyB4bW0xPXRtcDEzCi0JbW92ZHFhICAgIHhtbTIseG1tMQotCXB1bnBja2x3ZCB4bW00LHhtbTYJCTsgeG1tNj10bXAxMgotCXB1bnBja2h3ZCB4bW0yLHhtbTYKLQltb3ZkcWEgICAgeG1tMSx4bW00Ci0JbW92ZHFhICAgIHhtbTYseG1tMgotCXBtYWRkd2QgICB4bW00LFtHT1RPRkYoZWJ4LFBXX0YxMzBfRjA1NCldCTsgeG1tND1kYXRhMkwKLQlwbWFkZHdkICAgeG1tMixbR09UT0ZGKGVieCxQV19GMTMwX0YwNTQpXQk7IHhtbTI9ZGF0YTJICi0JcG1hZGR3ZCAgIHhtbTEsW0dPVE9GRihlYngsUFdfRjA1NF9NRjEzMCldCTsgeG1tMT1kYXRhNkwKLQlwbWFkZHdkICAgeG1tNixbR09UT0ZGKGVieCxQV19GMDU0X01GMTMwKV0JOyB4bW02PWRhdGE2SAotCi0JcGFkZGQJeG1tNCxbR09UT0ZGKGVieCxQRF9ERVNDQUxFX1AyKV0KLQlwYWRkZAl4bW0yLFtHT1RPRkYoZWJ4LFBEX0RFU0NBTEVfUDIpXQotCXBzcmFkCXhtbTQsREVTQ0FMRV9QMgotCXBzcmFkCXhtbTIsREVTQ0FMRV9QMgotCXBhZGRkCXhtbTEsW0dPVE9GRihlYngsUERfREVTQ0FMRV9QMildCi0JcGFkZGQJeG1tNixbR09UT0ZGKGVieCxQRF9ERVNDQUxFX1AyKV0KLQlwc3JhZAl4bW0xLERFU0NBTEVfUDIKLQlwc3JhZAl4bW02LERFU0NBTEVfUDIKLQotCXBhY2tzc2R3ICB4bW00LHhtbTIJCTsgeG1tND1kYXRhMgotCXBhY2tzc2R3ICB4bW0xLHhtbTYJCTsgeG1tMT1kYXRhNgotCi0JbW92ZHFhCVhNTVdPUkQgW1hNTUJMT0NLKDIsMCxlZHgsU0laRU9GX0RDVEVMRU0pXSwgeG1tNAotCW1vdmRxYQlYTU1XT1JEIFtYTU1CTE9DSyg2LDAsZWR4LFNJWkVPRl9EQ1RFTEVNKV0sIHhtbTEKLQotCTsgLS0gT2RkIHBhcnQKLQotCW1vdmRxYQl4bW03LCBYTU1XT1JEIFt3aygwKV0JOyB4bW03PXRtcDYKLQltb3ZkcWEJeG1tNSwgWE1NV09SRCBbd2soMSldCTsgeG1tNT10bXA3Ci0KLQltb3ZkcWEJeG1tMix4bW0wCQk7IHhtbTA9dG1wNAotCW1vdmRxYQl4bW02LHhtbTMJCTsgeG1tMz10bXA1Ci0JcGFkZHcJeG1tMix4bW03CQk7IHhtbTI9ejMKLQlwYWRkdwl4bW02LHhtbTUJCTsgeG1tNj16NAotCi0JOyAoT3JpZ2luYWwpCi0JOyB6NSA9ICh6MyArIHo0KSAqIDEuMTc1ODc1NjAyOwotCTsgejMgPSB6MyAqIC0xLjk2MTU3MDU2MDsgIHo0ID0gejQgKiAtMC4zOTAxODA2NDQ7Ci0JOyB6MyArPSB6NTsgIHo0ICs9IHo1OwotCTsKLQk7IChUaGlzIGltcGxlbWVudGF0aW9uKQotCTsgejMgPSB6MyAqICgxLjE3NTg3NTYwMiAtIDEuOTYxNTcwNTYwKSArIHo0ICogMS4xNzU4NzU2MDI7Ci0JOyB6NCA9IHozICogMS4xNzU4NzU2MDIgKyB6NCAqICgxLjE3NTg3NTYwMiAtIDAuMzkwMTgwNjQ0KTsKLQotCW1vdmRxYSAgICB4bW00LHhtbTIKLQltb3ZkcWEgICAgeG1tMSx4bW0yCi0JcHVucGNrbHdkIHhtbTQseG1tNgotCXB1bnBja2h3ZCB4bW0xLHhtbTYKLQltb3ZkcWEgICAgeG1tMix4bW00Ci0JbW92ZHFhICAgIHhtbTYseG1tMQotCXBtYWRkd2QgICB4bW00LFtHT1RPRkYoZWJ4LFBXX01GMDc4X0YxMTcpXQk7IHhtbTQ9ejNMCi0JcG1hZGR3ZCAgIHhtbTEsW0dPVE9GRihlYngsUFdfTUYwNzhfRjExNyldCTsgeG1tMT16M0gKLQlwbWFkZHdkICAgeG1tMixbR09UT0ZGKGVieCxQV19GMTE3X0YwNzgpXQk7IHhtbTI9ejRMCi0JcG1hZGR3ZCAgIHhtbTYsW0dPVE9GRihlYngsUFdfRjExN19GMDc4KV0JOyB4bW02PXo0SAotCi0JbW92ZHFhCVhNTVdPUkQgW3drKDApXSwgeG1tNAk7IHdrKDApPXozTAotCW1vdmRxYQlYTU1XT1JEIFt3aygxKV0sIHhtbTEJOyB3aygxKT16M0gKLQotCTsgKE9yaWdpbmFsKQotCTsgejEgPSB0bXA0ICsgdG1wNzsgIHoyID0gdG1wNSArIHRtcDY7Ci0JOyB0bXA0ID0gdG1wNCAqIDAuMjk4NjMxMzM2OyAgdG1wNSA9IHRtcDUgKiAyLjA1MzExOTg2OTsKLQk7IHRtcDYgPSB0bXA2ICogMy4wNzI3MTEwMjY7ICB0bXA3ID0gdG1wNyAqIDEuNTAxMzIxMTEwOwotCTsgejEgPSB6MSAqIC0wLjg5OTk3NjIyMzsgIHoyID0gejIgKiAtMi41NjI5MTU0NDc7Ci0JOyBkYXRhNyA9IHRtcDQgKyB6MSArIHozOyAgZGF0YTUgPSB0bXA1ICsgejIgKyB6NDsKLQk7IGRhdGEzID0gdG1wNiArIHoyICsgejM7ICBkYXRhMSA9IHRtcDcgKyB6MSArIHo0OwotCTsKLQk7IChUaGlzIGltcGxlbWVudGF0aW9uKQotCTsgdG1wNCA9IHRtcDQgKiAoMC4yOTg2MzEzMzYgLSAwLjg5OTk3NjIyMykgKyB0bXA3ICogLTAuODk5OTc2MjIzOwotCTsgdG1wNSA9IHRtcDUgKiAoMi4wNTMxMTk4NjkgLSAyLjU2MjkxNTQ0NykgKyB0bXA2ICogLTIuNTYyOTE1NDQ3OwotCTsgdG1wNiA9IHRtcDUgKiAtMi41NjI5MTU0NDcgKyB0bXA2ICogKDMuMDcyNzExMDI2IC0gMi41NjI5MTU0NDcpOwotCTsgdG1wNyA9IHRtcDQgKiAtMC44OTk5NzYyMjMgKyB0bXA3ICogKDEuNTAxMzIxMTEwIC0gMC44OTk5NzYyMjMpOwotCTsgZGF0YTcgPSB0bXA0ICsgejM7ICBkYXRhNSA9IHRtcDUgKyB6NDsKLQk7IGRhdGEzID0gdG1wNiArIHozOyAgZGF0YTEgPSB0bXA3ICsgejQ7Ci0KLQltb3ZkcWEgICAgeG1tNCx4bW0wCi0JbW92ZHFhICAgIHhtbTEseG1tMAotCXB1bnBja2x3ZCB4bW00LHhtbTUKLQlwdW5wY2tod2QgeG1tMSx4bW01Ci0JbW92ZHFhICAgIHhtbTAseG1tNAotCW1vdmRxYSAgICB4bW01LHhtbTEKLQlwbWFkZHdkICAgeG1tNCxbR09UT0ZGKGVieCxQV19NRjA2MF9NRjA4OSldCTsgeG1tND10bXA0TAotCXBtYWRkd2QgICB4bW0xLFtHT1RPRkYoZWJ4LFBXX01GMDYwX01GMDg5KV0JOyB4bW0xPXRtcDRICi0JcG1hZGR3ZCAgIHhtbTAsW0dPVE9GRihlYngsUFdfTUYwODlfRjA2MCldCTsgeG1tMD10bXA3TAotCXBtYWRkd2QgICB4bW01LFtHT1RPRkYoZWJ4LFBXX01GMDg5X0YwNjApXQk7IHhtbTU9dG1wN0gKLQotCXBhZGRkCXhtbTQsIFhNTVdPUkQgW3drKDApXQk7IHhtbTQ9ZGF0YTdMCi0JcGFkZGQJeG1tMSwgWE1NV09SRCBbd2soMSldCTsgeG1tMT1kYXRhN0gKLQlwYWRkZAl4bW0wLHhtbTIJCTsgeG1tMD1kYXRhMUwKLQlwYWRkZAl4bW01LHhtbTYJCTsgeG1tNT1kYXRhMUgKLQotCXBhZGRkCXhtbTQsW0dPVE9GRihlYngsUERfREVTQ0FMRV9QMildCi0JcGFkZGQJeG1tMSxbR09UT0ZGKGVieCxQRF9ERVNDQUxFX1AyKV0KLQlwc3JhZAl4bW00LERFU0NBTEVfUDIKLQlwc3JhZAl4bW0xLERFU0NBTEVfUDIKLQlwYWRkZAl4bW0wLFtHT1RPRkYoZWJ4LFBEX0RFU0NBTEVfUDIpXQotCXBhZGRkCXhtbTUsW0dPVE9GRihlYngsUERfREVTQ0FMRV9QMildCi0JcHNyYWQJeG1tMCxERVNDQUxFX1AyCi0JcHNyYWQJeG1tNSxERVNDQUxFX1AyCi0KLQlwYWNrc3NkdyAgeG1tNCx4bW0xCQk7IHhtbTQ9ZGF0YTcKLQlwYWNrc3NkdyAgeG1tMCx4bW01CQk7IHhtbTA9ZGF0YTEKLQotCW1vdmRxYQlYTU1XT1JEIFtYTU1CTE9DSyg3LDAsZWR4LFNJWkVPRl9EQ1RFTEVNKV0sIHhtbTQKLQltb3ZkcWEJWE1NV09SRCBbWE1NQkxPQ0soMSwwLGVkeCxTSVpFT0ZfRENURUxFTSldLCB4bW0wCi0KLQltb3ZkcWEgICAgeG1tMSx4bW0zCi0JbW92ZHFhICAgIHhtbTUseG1tMwotCXB1bnBja2x3ZCB4bW0xLHhtbTcKLQlwdW5wY2tod2QgeG1tNSx4bW03Ci0JbW92ZHFhICAgIHhtbTMseG1tMQotCW1vdmRxYSAgICB4bW03LHhtbTUKLQlwbWFkZHdkICAgeG1tMSxbR09UT0ZGKGVieCxQV19NRjA1MF9NRjI1NildCTsgeG1tMT10bXA1TAotCXBtYWRkd2QgICB4bW01LFtHT1RPRkYoZWJ4LFBXX01GMDUwX01GMjU2KV0JOyB4bW01PXRtcDVICi0JcG1hZGR3ZCAgIHhtbTMsW0dPVE9GRihlYngsUFdfTUYyNTZfRjA1MCldCTsgeG1tMz10bXA2TAotCXBtYWRkd2QgICB4bW03LFtHT1RPRkYoZWJ4LFBXX01GMjU2X0YwNTApXQk7IHhtbTc9dG1wNkgKLQotCXBhZGRkCXhtbTEseG1tMgkJOyB4bW0xPWRhdGE1TAotCXBhZGRkCXhtbTUseG1tNgkJOyB4bW01PWRhdGE1SAotCXBhZGRkCXhtbTMsIFhNTVdPUkQgW3drKDApXQk7IHhtbTM9ZGF0YTNMCi0JcGFkZGQJeG1tNywgWE1NV09SRCBbd2soMSldCTsgeG1tNz1kYXRhM0gKLQotCXBhZGRkCXhtbTEsW0dPVE9GRihlYngsUERfREVTQ0FMRV9QMildCi0JcGFkZGQJeG1tNSxbR09UT0ZGKGVieCxQRF9ERVNDQUxFX1AyKV0KLQlwc3JhZAl4bW0xLERFU0NBTEVfUDIKLQlwc3JhZAl4bW01LERFU0NBTEVfUDIKLQlwYWRkZAl4bW0zLFtHT1RPRkYoZWJ4LFBEX0RFU0NBTEVfUDIpXQotCXBhZGRkCXhtbTcsW0dPVE9GRihlYngsUERfREVTQ0FMRV9QMildCi0JcHNyYWQJeG1tMyxERVNDQUxFX1AyCi0JcHNyYWQJeG1tNyxERVNDQUxFX1AyCi0KLQlwYWNrc3NkdyAgeG1tMSx4bW01CQk7IHhtbTE9ZGF0YTUKLQlwYWNrc3NkdyAgeG1tMyx4bW03CQk7IHhtbTM9ZGF0YTMKLQotCW1vdmRxYQlYTU1XT1JEIFtYTU1CTE9DSyg1LDAsZWR4LFNJWkVPRl9EQ1RFTEVNKV0sIHhtbTEKLQltb3ZkcWEJWE1NV09SRCBbWE1NQkxPQ0soMywwLGVkeCxTSVpFT0ZfRENURUxFTSldLCB4bW0zCi0KLTsJcG9wCWVkaQkJOyB1bnVzZWQKLTsJcG9wCWVzaQkJOyB1bnVzZWQKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyB1bnVzZWQKLQlwb3BwaWMJZWJ4Ci0JbW92CWVzcCxlYnAJCTsgZXNwIDwtIGFsaWduZWQgZWJwCi0JcG9wCWVzcAkJOyBlc3AgPC0gb3JpZ2luYWwgZWJwCi0JcG9wCWVicAotCXJldAotCi0lZW5kaWYgOyBKRkRDVF9JTlRfU1NFMl9TVVBQT1JURUQKLSVlbmRpZiA7IERDVF9JU0xPV19TVVBQT1JURUQKZGlmZiAtLWdpdCBhL2pmc3NlZmx0LmFzbSBiL2pmc3NlZmx0LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiMDk3My4uMDAwMDAwMAotLS0gYS9qZnNzZWZsdC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzODMgKzAsMCBAQAotOwotOyBqZnNzZWZsdC5hc20gLSBmbG9hdGluZy1wb2ludCBGRENUIChTU0UpCi07Ci07IHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotOyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgotOyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4ganNpbWRleHQuaW5jCi07Ci07IFRoaXMgZmlsZSBzaG91bGQgYmUgYXNzZW1ibGVkIHdpdGggTkFTTSAoTmV0d2lkZSBBc3NlbWJsZXIpLAotOyBjYW4gKm5vdCogYmUgYXNzZW1ibGVkIHdpdGggTWljcm9zb2Z0J3MgTUFTTSBvciBhbnkgY29tcGF0aWJsZQotOyBhc3NlbWJsZXIgKGluY2x1ZGluZyBCb3JsYW5kJ3MgVHVyYm8gQXNzZW1ibGVyKS4KLTsgTkFTTSBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vbmFzbS5zb3VyY2Vmb3JnZS5uZXQvIG9yCi07IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTYyMDgKLTsKLTsgVGhpcyBmaWxlIGNvbnRhaW5zIGEgZmxvYXRpbmctcG9pbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZvcndhcmQgRENUCi07IChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4gVGhlIGZvbGxvd2luZyBjb2RlIGlzIGJhc2VkIGRpcmVjdGx5IG9uCi07IHRoZSBJSkcncyBvcmlnaW5hbCBqZmRjdGZsdC5jOyBzZWUgdGhlIGpmZGN0Zmx0LmMgZm9yIG1vcmUgZGV0YWlscy4KLTsKLTsgTGFzdCBNb2RpZmllZCA6IEZlYnJ1YXJ5IDQsIDIwMDYKLTsKLTsgW1RBQjhdCi0KLSVpbmNsdWRlICJqc2ltZGV4dC5pbmMiCi0laW5jbHVkZSAiamRjdC5pbmMiCi0KLSVpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0laWZkZWYgSkZEQ1RfRkxUX1NTRV9NTVhfU1VQUE9SVEVECi0lZGVmaW5lIEpGRENUX0ZMVF9TU0VfU1VQUE9SVEVECi0lZW5kaWYKLSVpZmRlZiBKRkRDVF9GTFRfU1NFX1NTRTJfU1VQUE9SVEVECi0lZGVmaW5lIEpGRENUX0ZMVF9TU0VfU1VQUE9SVEVECi0lZW5kaWYKLSVpZmRlZiBKRkRDVF9GTFRfU1NFX1NVUFBPUlRFRAotCi07IFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotOwotJWlmIERDVFNJWkUgIT0gOAotJWVycm9yICJTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4iCi0lZW5kaWYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0lbWFjcm8JdW5wY2tscHMyIDIJOyAlMT0oMCAxIDIgMykgLyAlMj0oNCA1IDYgNykgPT4gJTE9KDAgMSA0IDUpCi0Jc2h1ZnBzCSUxLCUyLDB4NDQKLSVlbmRtYWNybwotCi0lbWFjcm8JdW5wY2tocHMyIDIJOyAlMT0oMCAxIDIgMykgLyAlMj0oNCA1IDYgNykgPT4gJTE9KDIgMyA2IDcpCi0Jc2h1ZnBzCSUxLCUyLDB4RUUKLSVlbmRtYWNybwotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JU0VDVElPTglTRUdfQ09OU1QKLQotCWFsaWduegkxNgotCWdsb2JhbAlFWFROKGpjb25zdF9mZGN0X2Zsb2F0X3NzZSkKLQotRVhUTihqY29uc3RfZmRjdF9mbG9hdF9zc2UpOgotCi1QRF8wXzM4Mgl0aW1lcyA0IGRkICAwLjM4MjY4MzQzMjM2NTA4OTc3MTcyODQ2MAotUERfMF83MDcJdGltZXMgNCBkZCAgMC43MDcxMDY3ODExODY1NDc1MjQ0MDA4NDQKLVBEXzBfNTQxCXRpbWVzIDQgZGQgIDAuNTQxMTk2MTAwMTQ2MTk2OTg0Mzk5NzIzCi1QRF8xXzMwNgl0aW1lcyA0IGRkICAxLjMwNjU2Mjk2NDg3NjM3NjUyNzg1NjY0MwotCi0JYWxpZ256CTE2Ci0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19URVhUCi0JQklUUwkzMgotOwotOyBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBvbmUgYmxvY2sgb2Ygc2FtcGxlcy4KLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfZmRjdF9mbG9hdF9zc2UgKEZBU1RfRkxPQVQgKiBkYXRhKQotOwotCi0lZGVmaW5lIGRhdGEoYikJCShiKSs4CQk7IEZBU1RfRkxPQVQgKiBkYXRhCi0KLSVkZWZpbmUgb3JpZ2luYWxfZWJwCWVicCswCi0lZGVmaW5lIHdrKGkpCQllYnAtKFdLX05VTS0oaSkpKlNJWkVPRl9YTU1XT1JECTsgeG1td29yZCB3a1tXS19OVU1dCi0lZGVmaW5lIFdLX05VTQkJMgotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2ZkY3RfZmxvYXRfc3NlKQotCi1FWFROKGpwZWdfZmRjdF9mbG9hdF9zc2UpOgotCXB1c2gJZWJwCi0JbW92CWVheCxlc3AJCQkJOyBlYXggPSBvcmlnaW5hbCBlYnAKLQlzdWIJZXNwLCBieXRlIDQKLQlhbmQJZXNwLCBieXRlICgtU0laRU9GX1hNTVdPUkQpCTsgYWxpZ24gdG8gMTI4IGJpdHMKLQltb3YJW2VzcF0sZWF4Ci0JbW92CWVicCxlc3AJCQkJOyBlYnAgPSBhbGlnbmVkIGVicAotCWxlYQllc3AsIFt3aygwKV0KLQlwdXNocGljCWVieAotOwlwdXNoCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcHVzaAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXB1c2gJZXNpCQk7IHVudXNlZAotOwlwdXNoCWVkaQkJOyB1bnVzZWQKLQotCWdldF9HT1QJZWJ4CQk7IGdldCBHT1QgYWRkcmVzcwotCi0JOyAtLS0tIFBhc3MgMTogcHJvY2VzcyByb3dzLgotCi0JbW92CWVkeCwgUE9JTlRFUiBbZGF0YShlYXgpXQk7IChGQVNUX0ZMT0FUICopCi0JbW92CWVjeCwgRENUU0laRS80Ci0JYWxpZ254CTE2LDcKLS5yb3dsb29wOgotCi0JbW92YXBzCXhtbTAsIFhNTVdPUkQgW1hNTUJMT0NLKDIsMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCW1vdmFwcwl4bW0xLCBYTU1XT1JEIFtYTU1CTE9DSygzLDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQltb3ZhcHMJeG1tMiwgWE1NV09SRCBbWE1NQkxPQ0soMiwxLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92YXBzCXhtbTMsIFhNTVdPUkQgW1hNTUJMT0NLKDMsMSxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCi0JOyB4bW0wPSgyMCAyMSAyMiAyMyksIHhtbTI9KDI0IDI1IDI2IDI3KQotCTsgeG1tMT0oMzAgMzEgMzIgMzMpLCB4bW0zPSgzNCAzNSAzNiAzNykKLQotCW1vdmFwcyAgIHhtbTQseG1tMAkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDEpCi0JdW5wY2tscHMgeG1tMCx4bW0xCQk7IHhtbTA9KDIwIDMwIDIxIDMxKQotCXVucGNraHBzIHhtbTQseG1tMQkJOyB4bW00PSgyMiAzMiAyMyAzMykKLQltb3ZhcHMgICB4bW01LHhtbTIJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAxKQotCXVucGNrbHBzIHhtbTIseG1tMwkJOyB4bW0yPSgyNCAzNCAyNSAzNSkKLQl1bnBja2hwcyB4bW01LHhtbTMJCTsgeG1tNT0oMjYgMzYgMjcgMzcpCi0KLQltb3ZhcHMJeG1tNiwgWE1NV09SRCBbWE1NQkxPQ0soMCwwLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92YXBzCXhtbTcsIFhNTVdPUkQgW1hNTUJMT0NLKDEsMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCW1vdmFwcwl4bW0xLCBYTU1XT1JEIFtYTU1CTE9DSygwLDEsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQltb3ZhcHMJeG1tMywgWE1NV09SRCBbWE1NQkxPQ0soMSwxLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0KLQk7IHhtbTY9KDAwIDAxIDAyIDAzKSwgeG1tMT0oMDQgMDUgMDYgMDcpCi0JOyB4bW03PSgxMCAxMSAxMiAxMyksIHhtbTM9KDE0IDE1IDE2IDE3KQotCi0JbW92YXBzCVhNTVdPUkQgW3drKDApXSwgeG1tNAk7IHdrKDApPSgyMiAzMiAyMyAzMykKLQltb3ZhcHMJWE1NV09SRCBbd2soMSldLCB4bW0yCTsgd2soMSk9KDI0IDM0IDI1IDM1KQotCi0JbW92YXBzICAgeG1tNCx4bW02CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMSkKLQl1bnBja2xwcyB4bW02LHhtbTcJCTsgeG1tNj0oMDAgMTAgMDEgMTEpCi0JdW5wY2tocHMgeG1tNCx4bW03CQk7IHhtbTQ9KDAyIDEyIDAzIDEzKQotCW1vdmFwcyAgIHhtbTIseG1tMQkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDEpCi0JdW5wY2tscHMgeG1tMSx4bW0zCQk7IHhtbTE9KDA0IDE0IDA1IDE1KQotCXVucGNraHBzIHhtbTIseG1tMwkJOyB4bW0yPSgwNiAxNiAwNyAxNykKLQotCW1vdmFwcyAgICB4bW03LHhtbTYJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXVucGNrbHBzMiB4bW02LHhtbTAJCTsgeG1tNj0oMDAgMTAgMjAgMzApPWRhdGEwCi0JdW5wY2tocHMyIHhtbTcseG1tMAkJOyB4bW03PSgwMSAxMSAyMSAzMSk9ZGF0YTEKLQltb3ZhcHMgICAgeG1tMyx4bW0yCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMikKLQl1bnBja2xwczIgeG1tMix4bW01CQk7IHhtbTI9KDA2IDE2IDI2IDM2KT1kYXRhNgotCXVucGNraHBzMiB4bW0zLHhtbTUJCTsgeG1tMz0oMDcgMTcgMjcgMzcpPWRhdGE3Ci0KLQltb3ZhcHMJeG1tMCx4bW03Ci0JbW92YXBzCXhtbTUseG1tNgotCXN1YnBzCXhtbTcseG1tMgkJOyB4bW03PWRhdGExLWRhdGE2PXRtcDYKLQlzdWJwcwl4bW02LHhtbTMJCTsgeG1tNj1kYXRhMC1kYXRhNz10bXA3Ci0JYWRkcHMJeG1tMCx4bW0yCQk7IHhtbTA9ZGF0YTErZGF0YTY9dG1wMQotCWFkZHBzCXhtbTUseG1tMwkJOyB4bW01PWRhdGEwK2RhdGE3PXRtcDAKLQotCW1vdmFwcwl4bW0yLCBYTU1XT1JEIFt3aygwKV0JOyB4bW0yPSgyMiAzMiAyMyAzMykKLQltb3ZhcHMJeG1tMywgWE1NV09SRCBbd2soMSldCTsgeG1tMz0oMjQgMzQgMjUgMzUpCi0JbW92YXBzCVhNTVdPUkQgW3drKDApXSwgeG1tNwk7IHdrKDApPXRtcDYKLQltb3ZhcHMJWE1NV09SRCBbd2soMSldLCB4bW02CTsgd2soMSk9dG1wNwotCi0JbW92YXBzICAgIHhtbTcseG1tNAkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDIpCi0JdW5wY2tscHMyIHhtbTQseG1tMgkJOyB4bW00PSgwMiAxMiAyMiAzMik9ZGF0YTIKLQl1bnBja2hwczIgeG1tNyx4bW0yCQk7IHhtbTc9KDAzIDEzIDIzIDMzKT1kYXRhMwotCW1vdmFwcyAgICB4bW02LHhtbTEJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXVucGNrbHBzMiB4bW0xLHhtbTMJCTsgeG1tMT0oMDQgMTQgMjQgMzQpPWRhdGE0Ci0JdW5wY2tocHMyIHhtbTYseG1tMwkJOyB4bW02PSgwNSAxNSAyNSAzNSk9ZGF0YTUKLQotCW1vdmFwcwl4bW0yLHhtbTcKLQltb3ZhcHMJeG1tMyx4bW00Ci0JYWRkcHMJeG1tNyx4bW0xCQk7IHhtbTc9ZGF0YTMrZGF0YTQ9dG1wMwotCWFkZHBzCXhtbTQseG1tNgkJOyB4bW00PWRhdGEyK2RhdGE1PXRtcDIKLQlzdWJwcwl4bW0yLHhtbTEJCTsgeG1tMj1kYXRhMy1kYXRhND10bXA0Ci0Jc3VicHMJeG1tMyx4bW02CQk7IHhtbTM9ZGF0YTItZGF0YTU9dG1wNQotCi0JOyAtLSBFdmVuIHBhcnQKLQotCW1vdmFwcwl4bW0xLHhtbTUKLQltb3ZhcHMJeG1tNix4bW0wCi0Jc3VicHMJeG1tNSx4bW03CQk7IHhtbTU9dG1wMTMKLQlzdWJwcwl4bW0wLHhtbTQJCTsgeG1tMD10bXAxMgotCWFkZHBzCXhtbTEseG1tNwkJOyB4bW0xPXRtcDEwCi0JYWRkcHMJeG1tNix4bW00CQk7IHhtbTY9dG1wMTEKLQotCWFkZHBzCXhtbTAseG1tNQotCW11bHBzCXhtbTAsW0dPVE9GRihlYngsUERfMF83MDcpXSA7IHhtbTA9ejEKLQotCW1vdmFwcwl4bW03LHhtbTEKLQltb3ZhcHMJeG1tNCx4bW01Ci0Jc3VicHMJeG1tMSx4bW02CQk7IHhtbTE9ZGF0YTQKLQlzdWJwcwl4bW01LHhtbTAJCTsgeG1tNT1kYXRhNgotCWFkZHBzCXhtbTcseG1tNgkJOyB4bW03PWRhdGEwCi0JYWRkcHMJeG1tNCx4bW0wCQk7IHhtbTQ9ZGF0YTIKLQotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSygwLDEsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTEKLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soMiwxLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW01Ci0JbW92YXBzCVhNTVdPUkQgW1hNTUJMT0NLKDAsMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXSwgeG1tNwotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSygyLDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTQKLQotCTsgLS0gT2RkIHBhcnQKLQotCW1vdmFwcwl4bW02LCBYTU1XT1JEIFt3aygwKV0JOyB4bW02PXRtcDYKLQltb3ZhcHMJeG1tMCwgWE1NV09SRCBbd2soMSldCTsgeG1tMD10bXA3Ci0KLQlhZGRwcwl4bW0yLHhtbTMJCTsgeG1tMj10bXAxMAotCWFkZHBzCXhtbTMseG1tNgkJOyB4bW0zPXRtcDExCi0JYWRkcHMJeG1tNix4bW0wCQk7IHhtbTY9dG1wMTIsIHhtbTA9dG1wNwotCi0JbXVscHMJeG1tMyxbR09UT0ZGKGVieCxQRF8wXzcwNyldIDsgeG1tMz16MwotCi0JbW92YXBzCXhtbTEseG1tMgkJOyB4bW0xPXRtcDEwCi0Jc3VicHMJeG1tMix4bW02Ci0JbXVscHMJeG1tMixbR09UT0ZGKGVieCxQRF8wXzM4MildIDsgeG1tMj16NQotCW11bHBzCXhtbTEsW0dPVE9GRihlYngsUERfMF81NDEpXSA7IHhtbTE9TVVMVElQTFkodG1wMTAsRklYXzBfNTQxMTk2KQotCW11bHBzCXhtbTYsW0dPVE9GRihlYngsUERfMV8zMDYpXSA7IHhtbTY9TVVMVElQTFkodG1wMTIsRklYXzFfMzA2NTYyKQotCWFkZHBzCXhtbTEseG1tMgkJOyB4bW0xPXoyCi0JYWRkcHMJeG1tNix4bW0yCQk7IHhtbTY9ejQKLQotCW1vdmFwcwl4bW01LHhtbTAKLQlzdWJwcwl4bW0wLHhtbTMJCTsgeG1tMD16MTMKLQlhZGRwcwl4bW01LHhtbTMJCTsgeG1tNT16MTEKLQotCW1vdmFwcwl4bW03LHhtbTAKLQltb3ZhcHMJeG1tNCx4bW01Ci0Jc3VicHMJeG1tMCx4bW0xCQk7IHhtbTA9ZGF0YTMKLQlzdWJwcwl4bW01LHhtbTYJCTsgeG1tNT1kYXRhNwotCWFkZHBzCXhtbTcseG1tMQkJOyB4bW03PWRhdGE1Ci0JYWRkcHMJeG1tNCx4bW02CQk7IHhtbTQ9ZGF0YTEKLQotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSygzLDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTAKLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soMywxLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW01Ci0JbW92YXBzCVhNTVdPUkQgW1hNTUJMT0NLKDEsMSxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXSwgeG1tNwotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSygxLDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTQKLQotCWFkZAllZHgsIDQqRENUU0laRSpTSVpFT0ZfRkFTVF9GTE9BVAotCWRlYwllY3gKLQlqbnoJbmVhciAucm93bG9vcAotCi0JOyAtLS0tIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgotCi0JbW92CWVkeCwgUE9JTlRFUiBbZGF0YShlYXgpXQk7IChGQVNUX0ZMT0FUICopCi0JbW92CWVjeCwgRENUU0laRS80Ci0JYWxpZ254CTE2LDcKLS5jb2x1bW5sb29wOgotCi0JbW92YXBzCXhtbTAsIFhNTVdPUkQgW1hNTUJMT0NLKDIsMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCW1vdmFwcwl4bW0xLCBYTU1XT1JEIFtYTU1CTE9DSygzLDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQltb3ZhcHMJeG1tMiwgWE1NV09SRCBbWE1NQkxPQ0soNiwwLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92YXBzCXhtbTMsIFhNTVdPUkQgW1hNTUJMT0NLKDcsMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCi0JOyB4bW0wPSgwMiAxMiAyMiAzMiksIHhtbTI9KDQyIDUyIDYyIDcyKQotCTsgeG1tMT0oMDMgMTMgMjMgMzMpLCB4bW0zPSg0MyA1MyA2MyA3MykKLQotCW1vdmFwcyAgIHhtbTQseG1tMAkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDEpCi0JdW5wY2tscHMgeG1tMCx4bW0xCQk7IHhtbTA9KDAyIDAzIDEyIDEzKQotCXVucGNraHBzIHhtbTQseG1tMQkJOyB4bW00PSgyMiAyMyAzMiAzMykKLQltb3ZhcHMgICB4bW01LHhtbTIJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAxKQotCXVucGNrbHBzIHhtbTIseG1tMwkJOyB4bW0yPSg0MiA0MyA1MiA1MykKLQl1bnBja2hwcyB4bW01LHhtbTMJCTsgeG1tNT0oNjIgNjMgNzIgNzMpCi0KLQltb3ZhcHMJeG1tNiwgWE1NV09SRCBbWE1NQkxPQ0soMCwwLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92YXBzCXhtbTcsIFhNTVdPUkQgW1hNTUJMT0NLKDEsMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXQotCW1vdmFwcwl4bW0xLCBYTU1XT1JEIFtYTU1CTE9DSyg0LDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQltb3ZhcHMJeG1tMywgWE1NV09SRCBbWE1NQkxPQ0soNSwwLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldCi0KLQk7IHhtbTY9KDAwIDEwIDIwIDMwKSwgeG1tMT0oNDAgNTAgNjAgNzApCi0JOyB4bW03PSgwMSAxMSAyMSAzMSksIHhtbTM9KDQxIDUxIDYxIDcxKQotCi0JbW92YXBzCVhNTVdPUkQgW3drKDApXSwgeG1tNAk7IHdrKDApPSgyMiAyMyAzMiAzMykKLQltb3ZhcHMJWE1NV09SRCBbd2soMSldLCB4bW0yCTsgd2soMSk9KDQyIDQzIDUyIDUzKQotCi0JbW92YXBzICAgeG1tNCx4bW02CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMSkKLQl1bnBja2xwcyB4bW02LHhtbTcJCTsgeG1tNj0oMDAgMDEgMTAgMTEpCi0JdW5wY2tocHMgeG1tNCx4bW03CQk7IHhtbTQ9KDIwIDIxIDMwIDMxKQotCW1vdmFwcyAgIHhtbTIseG1tMQkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDEpCi0JdW5wY2tscHMgeG1tMSx4bW0zCQk7IHhtbTE9KDQwIDQxIDUwIDUxKQotCXVucGNraHBzIHhtbTIseG1tMwkJOyB4bW0yPSg2MCA2MSA3MCA3MSkKLQotCW1vdmFwcyAgICB4bW03LHhtbTYJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXVucGNrbHBzMiB4bW02LHhtbTAJCTsgeG1tNj0oMDAgMDEgMDIgMDMpPWRhdGEwCi0JdW5wY2tocHMyIHhtbTcseG1tMAkJOyB4bW03PSgxMCAxMSAxMiAxMyk9ZGF0YTEKLQltb3ZhcHMgICAgeG1tMyx4bW0yCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMikKLQl1bnBja2xwczIgeG1tMix4bW01CQk7IHhtbTI9KDYwIDYxIDYyIDYzKT1kYXRhNgotCXVucGNraHBzMiB4bW0zLHhtbTUJCTsgeG1tMz0oNzAgNzEgNzIgNzMpPWRhdGE3Ci0KLQltb3ZhcHMJeG1tMCx4bW03Ci0JbW92YXBzCXhtbTUseG1tNgotCXN1YnBzCXhtbTcseG1tMgkJOyB4bW03PWRhdGExLWRhdGE2PXRtcDYKLQlzdWJwcwl4bW02LHhtbTMJCTsgeG1tNj1kYXRhMC1kYXRhNz10bXA3Ci0JYWRkcHMJeG1tMCx4bW0yCQk7IHhtbTA9ZGF0YTErZGF0YTY9dG1wMQotCWFkZHBzCXhtbTUseG1tMwkJOyB4bW01PWRhdGEwK2RhdGE3PXRtcDAKLQotCW1vdmFwcwl4bW0yLCBYTU1XT1JEIFt3aygwKV0JOyB4bW0yPSgyMiAyMyAzMiAzMykKLQltb3ZhcHMJeG1tMywgWE1NV09SRCBbd2soMSldCTsgeG1tMz0oNDIgNDMgNTIgNTMpCi0JbW92YXBzCVhNTVdPUkQgW3drKDApXSwgeG1tNwk7IHdrKDApPXRtcDYKLQltb3ZhcHMJWE1NV09SRCBbd2soMSldLCB4bW02CTsgd2soMSk9dG1wNwotCi0JbW92YXBzICAgIHhtbTcseG1tNAkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDIpCi0JdW5wY2tscHMyIHhtbTQseG1tMgkJOyB4bW00PSgyMCAyMSAyMiAyMyk9ZGF0YTIKLQl1bnBja2hwczIgeG1tNyx4bW0yCQk7IHhtbTc9KDMwIDMxIDMyIDMzKT1kYXRhMwotCW1vdmFwcyAgICB4bW02LHhtbTEJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXVucGNrbHBzMiB4bW0xLHhtbTMJCTsgeG1tMT0oNDAgNDEgNDIgNDMpPWRhdGE0Ci0JdW5wY2tocHMyIHhtbTYseG1tMwkJOyB4bW02PSg1MCA1MSA1MiA1Myk9ZGF0YTUKLQotCW1vdmFwcwl4bW0yLHhtbTcKLQltb3ZhcHMJeG1tMyx4bW00Ci0JYWRkcHMJeG1tNyx4bW0xCQk7IHhtbTc9ZGF0YTMrZGF0YTQ9dG1wMwotCWFkZHBzCXhtbTQseG1tNgkJOyB4bW00PWRhdGEyK2RhdGE1PXRtcDIKLQlzdWJwcwl4bW0yLHhtbTEJCTsgeG1tMj1kYXRhMy1kYXRhND10bXA0Ci0Jc3VicHMJeG1tMyx4bW02CQk7IHhtbTM9ZGF0YTItZGF0YTU9dG1wNQotCi0JOyAtLSBFdmVuIHBhcnQKLQotCW1vdmFwcwl4bW0xLHhtbTUKLQltb3ZhcHMJeG1tNix4bW0wCi0Jc3VicHMJeG1tNSx4bW03CQk7IHhtbTU9dG1wMTMKLQlzdWJwcwl4bW0wLHhtbTQJCTsgeG1tMD10bXAxMgotCWFkZHBzCXhtbTEseG1tNwkJOyB4bW0xPXRtcDEwCi0JYWRkcHMJeG1tNix4bW00CQk7IHhtbTY9dG1wMTEKLQotCWFkZHBzCXhtbTAseG1tNQotCW11bHBzCXhtbTAsW0dPVE9GRihlYngsUERfMF83MDcpXSA7IHhtbTA9ejEKLQotCW1vdmFwcwl4bW03LHhtbTEKLQltb3ZhcHMJeG1tNCx4bW01Ci0Jc3VicHMJeG1tMSx4bW02CQk7IHhtbTE9ZGF0YTQKLQlzdWJwcwl4bW01LHhtbTAJCTsgeG1tNT1kYXRhNgotCWFkZHBzCXhtbTcseG1tNgkJOyB4bW03PWRhdGEwCi0JYWRkcHMJeG1tNCx4bW0wCQk7IHhtbTQ9ZGF0YTIKLQotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSyg0LDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTEKLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soNiwwLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW01Ci0JbW92YXBzCVhNTVdPUkQgW1hNTUJMT0NLKDAsMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXSwgeG1tNwotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSygyLDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTQKLQotCTsgLS0gT2RkIHBhcnQKLQotCW1vdmFwcwl4bW02LCBYTU1XT1JEIFt3aygwKV0JOyB4bW02PXRtcDYKLQltb3ZhcHMJeG1tMCwgWE1NV09SRCBbd2soMSldCTsgeG1tMD10bXA3Ci0KLQlhZGRwcwl4bW0yLHhtbTMJCTsgeG1tMj10bXAxMAotCWFkZHBzCXhtbTMseG1tNgkJOyB4bW0zPXRtcDExCi0JYWRkcHMJeG1tNix4bW0wCQk7IHhtbTY9dG1wMTIsIHhtbTA9dG1wNwotCi0JbXVscHMJeG1tMyxbR09UT0ZGKGVieCxQRF8wXzcwNyldIDsgeG1tMz16MwotCi0JbW92YXBzCXhtbTEseG1tMgkJOyB4bW0xPXRtcDEwCi0Jc3VicHMJeG1tMix4bW02Ci0JbXVscHMJeG1tMixbR09UT0ZGKGVieCxQRF8wXzM4MildIDsgeG1tMj16NQotCW11bHBzCXhtbTEsW0dPVE9GRihlYngsUERfMF81NDEpXSA7IHhtbTE9TVVMVElQTFkodG1wMTAsRklYXzBfNTQxMTk2KQotCW11bHBzCXhtbTYsW0dPVE9GRihlYngsUERfMV8zMDYpXSA7IHhtbTY9TVVMVElQTFkodG1wMTIsRklYXzFfMzA2NTYyKQotCWFkZHBzCXhtbTEseG1tMgkJOyB4bW0xPXoyCi0JYWRkcHMJeG1tNix4bW0yCQk7IHhtbTY9ejQKLQotCW1vdmFwcwl4bW01LHhtbTAKLQlzdWJwcwl4bW0wLHhtbTMJCTsgeG1tMD16MTMKLQlhZGRwcwl4bW01LHhtbTMJCTsgeG1tNT16MTEKLQotCW1vdmFwcwl4bW03LHhtbTAKLQltb3ZhcHMJeG1tNCx4bW01Ci0Jc3VicHMJeG1tMCx4bW0xCQk7IHhtbTA9ZGF0YTMKLQlzdWJwcwl4bW01LHhtbTYJCTsgeG1tNT1kYXRhNwotCWFkZHBzCXhtbTcseG1tMQkJOyB4bW03PWRhdGE1Ci0JYWRkcHMJeG1tNCx4bW02CQk7IHhtbTQ9ZGF0YTEKLQotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSygzLDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTAKLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soNywwLGVkeCxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW01Ci0JbW92YXBzCVhNTVdPUkQgW1hNTUJMT0NLKDUsMCxlZHgsU0laRU9GX0ZBU1RfRkxPQVQpXSwgeG1tNwotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSygxLDAsZWR4LFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTQKLQotCWFkZAllZHgsIGJ5dGUgNCpTSVpFT0ZfRkFTVF9GTE9BVAotCWRlYwllY3gKLQlqbnoJbmVhciAuY29sdW1ubG9vcAotCi07CXBvcAllZGkJCTsgdW51c2VkCi07CXBvcAllc2kJCTsgdW51c2VkCi07CXBvcAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXBvcAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcG9wcGljCWVieAotCW1vdgllc3AsZWJwCQk7IGVzcCA8LSBhbGlnbmVkIGVicAotCXBvcAllc3AJCTsgZXNwIDwtIG9yaWdpbmFsIGVicAotCXBvcAllYnAKLQlyZXQKLQotJWVuZGlmIDsgSkZEQ1RfRkxUX1NTRV9TVVBQT1JURUQKLSVlbmRpZiA7IERDVF9GTE9BVF9TVVBQT1JURUQKZGlmZiAtLWdpdCBhL2ppM2RuZmx0LmFzbSBiL2ppM2RuZmx0LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzMWU5OS4uMDAwMDAwMAotLS0gYS9qaTNkbmZsdC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw0NjIgKzAsMCBAQAotOwotOyBqaTNkbmZsdC5hc20gLSBmbG9hdGluZy1wb2ludCBJRENUICgzRE5vdyEgJiBNTVgpCi07Ci07IHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotOyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgotOyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4ganNpbWRleHQuaW5jCi07Ci07IFRoaXMgZmlsZSBzaG91bGQgYmUgYXNzZW1ibGVkIHdpdGggTkFTTSAoTmV0d2lkZSBBc3NlbWJsZXIpLAotOyBjYW4gKm5vdCogYmUgYXNzZW1ibGVkIHdpdGggTWljcm9zb2Z0J3MgTUFTTSBvciBhbnkgY29tcGF0aWJsZQotOyBhc3NlbWJsZXIgKGluY2x1ZGluZyBCb3JsYW5kJ3MgVHVyYm8gQXNzZW1ibGVyKS4KLTsgTkFTTSBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vbmFzbS5zb3VyY2Vmb3JnZS5uZXQvIG9yCi07IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTYyMDgKLTsKLTsgVGhpcyBmaWxlIGNvbnRhaW5zIGEgZmxvYXRpbmctcG9pbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludmVyc2UgRENUCi07IChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4gVGhlIGZvbGxvd2luZyBjb2RlIGlzIGJhc2VkIGRpcmVjdGx5IG9uCi07IHRoZSBJSkcncyBvcmlnaW5hbCBqaWRjdGZsdC5jOyBzZWUgdGhlIGppZGN0Zmx0LmMgZm9yIG1vcmUgZGV0YWlscy4KLTsKLTsgTGFzdCBNb2RpZmllZCA6IEZlYnJ1YXJ5IDQsIDIwMDYKLTsKLTsgW1RBQjhdCi0KLSVpbmNsdWRlICJqc2ltZGV4dC5pbmMiCi0laW5jbHVkZSAiamRjdC5pbmMiCi0KLSVpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0laWZkZWYgSklEQ1RfRkxUXzNETk9XX01NWF9TVVBQT1JURUQKLQotOyBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLTsKLSVpZiBEQ1RTSVpFICE9IDgKLSVlcnJvciAiU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIgotJWVuZGlmCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19DT05TVAotCi0JYWxpZ256CTE2Ci0JZ2xvYmFsCUVYVE4oamNvbnN0X2lkY3RfZmxvYXRfM2Rub3cpCi0KLUVYVE4oamNvbnN0X2lkY3RfZmxvYXRfM2Rub3cpOgotCi1QRF8xXzQxNAl0aW1lcyAyIGRkICAxLjQxNDIxMzU2MjM3MzA5NTA0ODgwMTY4OQotUERfMV84NDcJdGltZXMgMiBkZCAgMS44NDc3NTkwNjUwMjI1NzM1MTIyNTYzNjYKLVBEXzFfMDgyCXRpbWVzIDIgZGQgIDEuMDgyMzkyMjAwMjkyMzkzOTY4Nzk5NDQ2Ci1QRF8yXzYxMwl0aW1lcyAyIGRkICAyLjYxMzEyNTkyOTc1Mjc1MzA1NTcxMzI4NgotUERfUk5ESU5UX01BR0lDCXRpbWVzIDIgZGQgIDEwMDY2MzI5Ni4wCTsgKGZsb2F0KSgweDAwQzAwMDAwIDw8IDMpCi1QQl9DRU5URVJKU0FNUAl0aW1lcyA4IGRiICBDRU5URVJKU0FNUExFCi0KLQlhbGlnbnoJMTYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX1RFWFQKLQlCSVRTCTMyCi07Ci07IFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMuCi07Ci07IEdMT0JBTCh2b2lkKQotOyBqcGVnX2lkY3RfZmxvYXRfM2Rub3cgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotOyAgICAgICAgICAgICAgICAgICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCi07ICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCi07Ci0KLSVkZWZpbmUgY2luZm8oYikJKGIpKzgJCTsgal9kZWNvbXByZXNzX3B0ciBjaW5mbwotJWRlZmluZSBjb21wcHRyKGIpCShiKSsxMgkJOyBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cgotJWRlZmluZSBjb2VmX2Jsb2NrKGIpCShiKSsxNgkJOyBKQ09FRlBUUiBjb2VmX2Jsb2NrCi0lZGVmaW5lIG91dHB1dF9idWYoYikJKGIpKzIwCQk7IEpTQU1QQVJSQVkgb3V0cHV0X2J1ZgotJWRlZmluZSBvdXRwdXRfY29sKGIpCShiKSsyNAkJOyBKRElNRU5TSU9OIG91dHB1dF9jb2wKLQotJWRlZmluZSBvcmlnaW5hbF9lYnAJZWJwKzAKLSVkZWZpbmUgd2soaSkJCWVicC0oV0tfTlVNLShpKSkqU0laRU9GX01NV09SRAk7IG1td29yZCB3a1tXS19OVU1dCi0lZGVmaW5lIFdLX05VTQkJMgotJWRlZmluZSB3b3Jrc3BhY2UJd2soMCktRENUU0laRTIqU0laRU9GX0ZBU1RfRkxPQVQKLQkJCQkJOyBGQVNUX0ZMT0FUIHdvcmtzcGFjZVtEQ1RTSVpFMl0KLQotCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19pZGN0X2Zsb2F0XzNkbm93KQotCi1FWFROKGpwZWdfaWRjdF9mbG9hdF8zZG5vdyk6Ci0JcHVzaAllYnAKLQltb3YJZWF4LGVzcAkJCQk7IGVheCA9IG9yaWdpbmFsIGVicAotCXN1Ygllc3AsIGJ5dGUgNAotCWFuZAllc3AsIGJ5dGUgKC1TSVpFT0ZfTU1XT1JEKQk7IGFsaWduIHRvIDY0IGJpdHMKLQltb3YJW2VzcF0sZWF4Ci0JbW92CWVicCxlc3AJCQkJOyBlYnAgPSBhbGlnbmVkIGVicAotCWxlYQllc3AsIFt3b3Jrc3BhY2VdCi0JcHVzaAllYngKLTsJcHVzaAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXB1c2gJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXB1c2gJZXNpCi0JcHVzaAllZGkKLQotCWdldF9HT1QJZWJ4CQk7IGdldCBHT1QgYWRkcmVzcwotCi0JOyAtLS0tIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4KLQotOwltb3YJZWF4LCBbb3JpZ2luYWxfZWJwXQotCW1vdgllZHgsIFBPSU5URVIgW2NvbXBwdHIoZWF4KV0KLQltb3YJZWR4LCBQT0lOVEVSIFtqY29tcGluZm9fZGN0X3RhYmxlKGVkeCldCTsgcXVhbnRwdHIKLQltb3YJZXNpLCBKQ09FRlBUUiBbY29lZl9ibG9jayhlYXgpXQkJOyBpbnB0cgotCWxlYQllZGksIFt3b3Jrc3BhY2VdCQkJOyBGQVNUX0ZMT0FUICogd3NwdHIKLQltb3YJZWN4LCBEQ1RTSVpFLzIJCQkJOyBjdHIKLQlhbGlnbngJMTYsNwotLmNvbHVtbmxvb3A6Ci0laWZuZGVmIE5PX1pFUk9fQ09MVU1OX1RFU1RfRkxPQVRfM0ROT1cKLQltb3YJZWF4LCBEV09SRCBbRFdCTE9DSygxLDAsZXNpLFNJWkVPRl9KQ09FRildCi0Jb3IJZWF4LCBEV09SRCBbRFdCTE9DSygyLDAsZXNpLFNJWkVPRl9KQ09FRildCi0Jam56CXNob3J0IC5jb2x1bW5EQ1QKLQotCXB1c2hwaWMJZWJ4CQk7IHNhdmUgR09UIGFkZHJlc3MKLQltb3YJZWJ4LCBEV09SRCBbRFdCTE9DSygzLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92CWVheCwgRFdPUkQgW0RXQkxPQ0soNCwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW9yCWVieCwgRFdPUkQgW0RXQkxPQ0soNSwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW9yCWVheCwgRFdPUkQgW0RXQkxPQ0soNiwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW9yCWVieCwgRFdPUkQgW0RXQkxPQ0soNywwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW9yCWVheCxlYngKLQlwb3BwaWMJZWJ4CQk7IHJlc3RvcmUgR09UIGFkZHJlc3MKLQlqbnoJc2hvcnQgLmNvbHVtbkRDVAotCi0JOyAtLSBBQyB0ZXJtcyBhbGwgemVybwotCi0JbW92ZCAgICAgIG1tMCwgRFdPUkQgW0RXQkxPQ0soMCwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCi0JcHVucGNrbHdkIG1tMCxtbTAKLQlwc3JhZCAgICAgbW0wLChEV09SRF9CSVQtV09SRF9CSVQpCi0JcGkyZmQgICAgIG1tMCxtbTAKLQotCXBmbXVsICAgICBtbTAsIE1NV09SRCBbTU1CTE9DSygwLDAsZWR4LFNJWkVPRl9GTE9BVF9NVUxUX1RZUEUpXQotCi0JbW92cSAgICAgIG1tMSxtbTAKLQlwdW5wY2tsZHEgbW0wLG1tMAotCXB1bnBja2hkcSBtbTEsbW0xCi0KLQltb3ZxCU1NV09SRCBbTU1CTE9DSygwLDAsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIG1tMAotCW1vdnEJTU1XT1JEIFtNTUJMT0NLKDAsMSxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgbW0wCi0JbW92cQlNTVdPUkQgW01NQkxPQ0soMCwyLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCBtbTAKLQltb3ZxCU1NV09SRCBbTU1CTE9DSygwLDMsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIG1tMAotCW1vdnEJTU1XT1JEIFtNTUJMT0NLKDEsMCxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgbW0xCi0JbW92cQlNTVdPUkQgW01NQkxPQ0soMSwxLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCBtbTEKLQltb3ZxCU1NV09SRCBbTU1CTE9DSygxLDIsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIG1tMQotCW1vdnEJTU1XT1JEIFtNTUJMT0NLKDEsMyxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgbW0xCi0Jam1wCW5lYXIgLm5leHRjb2x1bW4KLQlhbGlnbngJMTYsNwotJWVuZGlmCi0uY29sdW1uRENUOgotCi0JOyAtLSBFdmVuIHBhcnQKLQotCW1vdmQgICAgICBtbTAsIERXT1JEIFtEV0JMT0NLKDAsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQltb3ZkICAgICAgbW0xLCBEV09SRCBbRFdCTE9DSygyLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92ZCAgICAgIG1tMiwgRFdPUkQgW0RXQkxPQ0soNCwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdmQgICAgICBtbTMsIERXT1JEIFtEV0JMT0NLKDYsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQotCXB1bnBja2x3ZCBtbTAsbW0wCi0JcHVucGNrbHdkIG1tMSxtbTEKLQlwc3JhZCAgICAgbW0wLChEV09SRF9CSVQtV09SRF9CSVQpCi0JcHNyYWQgICAgIG1tMSwoRFdPUkRfQklULVdPUkRfQklUKQotCXBpMmZkICAgICBtbTAsbW0wCi0JcGkyZmQgICAgIG1tMSxtbTEKLQotCXBmbXVsICAgICBtbTAsIE1NV09SRCBbTU1CTE9DSygwLDAsZWR4LFNJWkVPRl9GTE9BVF9NVUxUX1RZUEUpXQotCXBmbXVsICAgICBtbTEsIE1NV09SRCBbTU1CTE9DSygyLDAsZWR4LFNJWkVPRl9GTE9BVF9NVUxUX1RZUEUpXQotCi0JcHVucGNrbHdkIG1tMixtbTIKLQlwdW5wY2tsd2QgbW0zLG1tMwotCXBzcmFkICAgICBtbTIsKERXT1JEX0JJVC1XT1JEX0JJVCkKLQlwc3JhZCAgICAgbW0zLChEV09SRF9CSVQtV09SRF9CSVQpCi0JcGkyZmQgICAgIG1tMixtbTIKLQlwaTJmZCAgICAgbW0zLG1tMwotCi0JcGZtdWwgICAgIG1tMiwgTU1XT1JEIFtNTUJMT0NLKDQsMCxlZHgsU0laRU9GX0ZMT0FUX01VTFRfVFlQRSldCi0JcGZtdWwgICAgIG1tMywgTU1XT1JEIFtNTUJMT0NLKDYsMCxlZHgsU0laRU9GX0ZMT0FUX01VTFRfVFlQRSldCi0KLQltb3ZxCW1tNCxtbTAKLQltb3ZxCW1tNSxtbTEKLQlwZnN1YgltbTAsbW0yCQkJOyBtbTA9dG1wMTEKLQlwZnN1YgltbTEsbW0zCi0JcGZhZGQJbW00LG1tMgkJCTsgbW00PXRtcDEwCi0JcGZhZGQJbW01LG1tMwkJCTsgbW01PXRtcDEzCi0KLQlwZm11bAltbTEsW0dPVE9GRihlYngsUERfMV80MTQpXQotCXBmc3ViCW1tMSxtbTUJCQk7IG1tMT10bXAxMgotCi0JbW92cQltbTYsbW00Ci0JbW92cQltbTcsbW0wCi0JcGZzdWIJbW00LG1tNQkJCTsgbW00PXRtcDMKLQlwZnN1YgltbTAsbW0xCQkJOyBtbTA9dG1wMgotCXBmYWRkCW1tNixtbTUJCQk7IG1tNj10bXAwCi0JcGZhZGQJbW03LG1tMQkJCTsgbW03PXRtcDEKLQotCW1vdnEJTU1XT1JEIFt3aygxKV0sIG1tNAk7IHRtcDMKLQltb3ZxCU1NV09SRCBbd2soMCldLCBtbTAJOyB0bXAyCi0KLQk7IC0tIE9kZCBwYXJ0Ci0KLQltb3ZkICAgICAgbW0yLCBEV09SRCBbRFdCTE9DSygxLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92ZCAgICAgIG1tMywgRFdPUkQgW0RXQkxPQ0soMywwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdmQgICAgICBtbTUsIERXT1JEIFtEV0JMT0NLKDUsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQltb3ZkICAgICAgbW0xLCBEV09SRCBbRFdCTE9DSyg3LDAsZXNpLFNJWkVPRl9KQ09FRildCi0KLQlwdW5wY2tsd2QgbW0yLG1tMgotCXB1bnBja2x3ZCBtbTMsbW0zCi0JcHNyYWQgICAgIG1tMiwoRFdPUkRfQklULVdPUkRfQklUKQotCXBzcmFkICAgICBtbTMsKERXT1JEX0JJVC1XT1JEX0JJVCkKLQlwaTJmZCAgICAgbW0yLG1tMgotCXBpMmZkICAgICBtbTMsbW0zCi0KLQlwZm11bCAgICAgbW0yLCBNTVdPUkQgW01NQkxPQ0soMSwwLGVkeCxTSVpFT0ZfRkxPQVRfTVVMVF9UWVBFKV0KLQlwZm11bCAgICAgbW0zLCBNTVdPUkQgW01NQkxPQ0soMywwLGVkeCxTSVpFT0ZfRkxPQVRfTVVMVF9UWVBFKV0KLQotCXB1bnBja2x3ZCBtbTUsbW01Ci0JcHVucGNrbHdkIG1tMSxtbTEKLQlwc3JhZCAgICAgbW01LChEV09SRF9CSVQtV09SRF9CSVQpCi0JcHNyYWQgICAgIG1tMSwoRFdPUkRfQklULVdPUkRfQklUKQotCXBpMmZkICAgICBtbTUsbW01Ci0JcGkyZmQgICAgIG1tMSxtbTEKLQotCXBmbXVsICAgICBtbTUsIE1NV09SRCBbTU1CTE9DSyg1LDAsZWR4LFNJWkVPRl9GTE9BVF9NVUxUX1RZUEUpXQotCXBmbXVsICAgICBtbTEsIE1NV09SRCBbTU1CTE9DSyg3LDAsZWR4LFNJWkVPRl9GTE9BVF9NVUxUX1RZUEUpXQotCi0JbW92cQltbTQsbW0yCi0JbW92cQltbTAsbW01Ci0JcGZhZGQJbW0yLG1tMQkJCTsgbW0yPXoxMQotCXBmYWRkCW1tNSxtbTMJCQk7IG1tNT16MTMKLQlwZnN1YgltbTQsbW0xCQkJOyBtbTQ9ejEyCi0JcGZzdWIJbW0wLG1tMwkJCTsgbW0wPXoxMAotCi0JbW92cQltbTEsbW0yCi0JcGZzdWIJbW0yLG1tNQotCXBmYWRkCW1tMSxtbTUJCQk7IG1tMT10bXA3Ci0KLQlwZm11bAltbTIsW0dPVE9GRihlYngsUERfMV80MTQpXQk7IG1tMj10bXAxMQotCi0JbW92cQltbTMsbW0wCi0JcGZhZGQJbW0wLG1tNAotCXBmbXVsCW1tMCxbR09UT0ZGKGVieCxQRF8xXzg0NyldCTsgbW0wPXo1Ci0JcGZtdWwJbW0zLFtHT1RPRkYoZWJ4LFBEXzJfNjEzKV0JOyBtbTM9KHoxMCAqIDIuNjEzMTI1OTMwKQotCXBmbXVsCW1tNCxbR09UT0ZGKGVieCxQRF8xXzA4MildCTsgbW00PSh6MTIgKiAxLjA4MjM5MjIwMCkKLQlwZnN1YnIJbW0zLG1tMAkJCTsgbW0zPXRtcDEyCi0JcGZzdWIJbW00LG1tMAkJCTsgbW00PXRtcDEwCi0KLQk7IC0tIEZpbmFsIG91dHB1dCBzdGFnZQotCi0JcGZzdWIJbW0zLG1tMQkJCTsgbW0zPXRtcDYKLQltb3ZxCW1tNSxtbTYKLQltb3ZxCW1tMCxtbTcKLQlwZmFkZAltbTYsbW0xCQkJOyBtbTY9ZGF0YTA9KDAwIDAxKQotCXBmYWRkCW1tNyxtbTMJCQk7IG1tNz1kYXRhMT0oMTAgMTEpCi0JcGZzdWIJbW01LG1tMQkJCTsgbW01PWRhdGE3PSg3MCA3MSkKLQlwZnN1YgltbTAsbW0zCQkJOyBtbTA9ZGF0YTY9KDYwIDYxKQotCXBmc3ViCW1tMixtbTMJCQk7IG1tMj10bXA1Ci0KLQltb3ZxICAgICAgbW0xLG1tNgkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzCi0JcHVucGNrbGRxIG1tNixtbTcJCTsgbW02PSgwMCAxMCkKLQlwdW5wY2toZHEgbW0xLG1tNwkJOyBtbTE9KDAxIDExKQotCW1vdnEgICAgICBtbTMsbW0wCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMKLQlwdW5wY2tsZHEgbW0wLG1tNQkJOyBtbTA9KDYwIDcwKQotCXB1bnBja2hkcSBtbTMsbW01CQk7IG1tMz0oNjEgNzEpCi0KLQltb3ZxCU1NV09SRCBbTU1CTE9DSygwLDAsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIG1tNgotCW1vdnEJTU1XT1JEIFtNTUJMT0NLKDEsMCxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgbW0xCi0JbW92cQlNTVdPUkQgW01NQkxPQ0soMCwzLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCBtbTAKLQltb3ZxCU1NV09SRCBbTU1CTE9DSygxLDMsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIG1tMwotCi0JbW92cQltbTcsIE1NV09SRCBbd2soMCldCTsgbW03PXRtcDIKLQltb3ZxCW1tNSwgTU1XT1JEIFt3aygxKV0JOyBtbTU9dG1wMwotCi0JcGZhZGQJbW00LG1tMgkJCTsgbW00PXRtcDQKLQltb3ZxCW1tNixtbTcKLQltb3ZxCW1tMSxtbTUKLQlwZmFkZAltbTcsbW0yCQkJOyBtbTc9ZGF0YTI9KDIwIDIxKQotCXBmYWRkCW1tNSxtbTQJCQk7IG1tNT1kYXRhND0oNDAgNDEpCi0JcGZzdWIJbW02LG1tMgkJCTsgbW02PWRhdGE1PSg1MCA1MSkKLQlwZnN1YgltbTEsbW00CQkJOyBtbTE9ZGF0YTM9KDMwIDMxKQotCi0JbW92cSAgICAgIG1tMCxtbTcJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cwotCXB1bnBja2xkcSBtbTcsbW0xCQk7IG1tNz0oMjAgMzApCi0JcHVucGNraGRxIG1tMCxtbTEJCTsgbW0wPSgyMSAzMSkKLQltb3ZxICAgICAgbW0zLG1tNQkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzCi0JcHVucGNrbGRxIG1tNSxtbTYJCTsgbW01PSg0MCA1MCkKLQlwdW5wY2toZHEgbW0zLG1tNgkJOyBtbTM9KDQxIDUxKQotCi0JbW92cQlNTVdPUkQgW01NQkxPQ0soMCwxLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCBtbTcKLQltb3ZxCU1NV09SRCBbTU1CTE9DSygxLDEsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIG1tMAotCW1vdnEJTU1XT1JEIFtNTUJMT0NLKDAsMixlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgbW01Ci0JbW92cQlNTVdPUkQgW01NQkxPQ0soMSwyLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCBtbTMKLQotLm5leHRjb2x1bW46Ci0JYWRkCWVzaSwgYnl0ZSAyKlNJWkVPRl9KQ09FRgkJOyBjb2VmX2Jsb2NrCi0JYWRkCWVkeCwgYnl0ZSAyKlNJWkVPRl9GTE9BVF9NVUxUX1RZUEUJOyBxdWFudHB0cgotCWFkZAllZGksIGJ5dGUgMipEQ1RTSVpFKlNJWkVPRl9GQVNUX0ZMT0FUCTsgd3NwdHIKLQlkZWMJZWN4CQkJCQk7IGN0cgotCWpuegluZWFyIC5jb2x1bW5sb29wCi0KLQk7IC0tIFByZWZldGNoIHRoZSBuZXh0IGNvZWZmaWNpZW50IGJsb2NrCi0KLQlwcmVmZXRjaCBbZXNpICsgKERDVFNJWkUyLTgpKlNJWkVPRl9KQ09FRiArIDAqMzJdCi0JcHJlZmV0Y2ggW2VzaSArIChEQ1RTSVpFMi04KSpTSVpFT0ZfSkNPRUYgKyAxKjMyXQotCXByZWZldGNoIFtlc2kgKyAoRENUU0laRTItOCkqU0laRU9GX0pDT0VGICsgMiozMl0KLQlwcmVmZXRjaCBbZXNpICsgKERDVFNJWkUyLTgpKlNJWkVPRl9KQ09FRiArIDMqMzJdCi0KLQk7IC0tLS0gUGFzcyAyOiBwcm9jZXNzIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4KLQotCW1vdgllYXgsIFtvcmlnaW5hbF9lYnBdCi0JbGVhCWVzaSwgW3dvcmtzcGFjZV0JCQk7IEZBU1RfRkxPQVQgKiB3c3B0cgotCW1vdgllZGksIEpTQU1QQVJSQVkgW291dHB1dF9idWYoZWF4KV0JOyAoSlNBTVBST1cgKikKLQltb3YJZWF4LCBKRElNRU5TSU9OIFtvdXRwdXRfY29sKGVheCldCi0JbW92CWVjeCwgRENUU0laRS8yCQkJCTsgY3RyCi0JYWxpZ254CTE2LDcKLS5yb3dsb29wOgotCi0JOyAtLSBFdmVuIHBhcnQKLQotCW1vdnEJbW0wLCBNTVdPUkQgW01NQkxPQ0soMCwwLGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92cQltbTEsIE1NV09SRCBbTU1CTE9DSygyLDAsZXNpLFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQltb3ZxCW1tMiwgTU1XT1JEIFtNTUJMT0NLKDQsMCxlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCW1vdnEJbW0zLCBNTVdPUkQgW01NQkxPQ0soNiwwLGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0KLQltb3ZxCW1tNCxtbTAKLQltb3ZxCW1tNSxtbTEKLQlwZnN1YgltbTAsbW0yCQkJOyBtbTA9dG1wMTEKLQlwZnN1YgltbTEsbW0zCi0JcGZhZGQJbW00LG1tMgkJCTsgbW00PXRtcDEwCi0JcGZhZGQJbW01LG1tMwkJCTsgbW01PXRtcDEzCi0KLQlwZm11bAltbTEsW0dPVE9GRihlYngsUERfMV80MTQpXQotCXBmc3ViCW1tMSxtbTUJCQk7IG1tMT10bXAxMgotCi0JbW92cQltbTYsbW00Ci0JbW92cQltbTcsbW0wCi0JcGZzdWIJbW00LG1tNQkJCTsgbW00PXRtcDMKLQlwZnN1YgltbTAsbW0xCQkJOyBtbTA9dG1wMgotCXBmYWRkCW1tNixtbTUJCQk7IG1tNj10bXAwCi0JcGZhZGQJbW03LG1tMQkJCTsgbW03PXRtcDEKLQotCW1vdnEJTU1XT1JEIFt3aygxKV0sIG1tNAk7IHRtcDMKLQltb3ZxCU1NV09SRCBbd2soMCldLCBtbTAJOyB0bXAyCi0KLQk7IC0tIE9kZCBwYXJ0Ci0KLQltb3ZxCW1tMiwgTU1XT1JEIFtNTUJMT0NLKDEsMCxlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCW1vdnEJbW0zLCBNTVdPUkQgW01NQkxPQ0soMywwLGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92cQltbTUsIE1NV09SRCBbTU1CTE9DSyg1LDAsZXNpLFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQltb3ZxCW1tMSwgTU1XT1JEIFtNTUJMT0NLKDcsMCxlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCi0JbW92cQltbTQsbW0yCi0JbW92cQltbTAsbW01Ci0JcGZhZGQJbW0yLG1tMQkJCTsgbW0yPXoxMQotCXBmYWRkCW1tNSxtbTMJCQk7IG1tNT16MTMKLQlwZnN1YgltbTQsbW0xCQkJOyBtbTQ9ejEyCi0JcGZzdWIJbW0wLG1tMwkJCTsgbW0wPXoxMAotCi0JbW92cQltbTEsbW0yCi0JcGZzdWIJbW0yLG1tNQotCXBmYWRkCW1tMSxtbTUJCQk7IG1tMT10bXA3Ci0KLQlwZm11bAltbTIsW0dPVE9GRihlYngsUERfMV80MTQpXQk7IG1tMj10bXAxMQotCi0JbW92cQltbTMsbW0wCi0JcGZhZGQJbW0wLG1tNAotCXBmbXVsCW1tMCxbR09UT0ZGKGVieCxQRF8xXzg0NyldCTsgbW0wPXo1Ci0JcGZtdWwJbW0zLFtHT1RPRkYoZWJ4LFBEXzJfNjEzKV0JOyBtbTM9KHoxMCAqIDIuNjEzMTI1OTMwKQotCXBmbXVsCW1tNCxbR09UT0ZGKGVieCxQRF8xXzA4MildCTsgbW00PSh6MTIgKiAxLjA4MjM5MjIwMCkKLQlwZnN1YnIJbW0zLG1tMAkJCTsgbW0zPXRtcDEyCi0JcGZzdWIJbW00LG1tMAkJCTsgbW00PXRtcDEwCi0KLQk7IC0tIEZpbmFsIG91dHB1dCBzdGFnZQotCi0JcGZzdWIJbW0zLG1tMQkJCTsgbW0zPXRtcDYKLQltb3ZxCW1tNSxtbTYKLQltb3ZxCW1tMCxtbTcKLQlwZmFkZAltbTYsbW0xCQkJOyBtbTY9ZGF0YTA9KDAwIDEwKQotCXBmYWRkCW1tNyxtbTMJCQk7IG1tNz1kYXRhMT0oMDEgMTEpCi0JcGZzdWIJbW01LG1tMQkJCTsgbW01PWRhdGE3PSgwNyAxNykKLQlwZnN1YgltbTAsbW0zCQkJOyBtbTA9ZGF0YTY9KDA2IDE2KQotCXBmc3ViCW1tMixtbTMJCQk7IG1tMj10bXA1Ci0KLQltb3ZxCW1tMSxbR09UT0ZGKGVieCxQRF9STkRJTlRfTUFHSUMpXQk7IG1tMT1bUERfUk5ESU5UX01BR0lDXQotCXBjbXBlcWQJbW0zLG1tMwotCXBzcmxkCW1tMyxXT1JEX0JJVAkJOyBtbTM9ezB4RkZGRiAweDAwMDAgMHhGRkZGIDB4MDAwMH0KLQotCXBmYWRkCW1tNixtbTEJCQk7IG1tNj1yb3VuZGludChkYXRhMC84KT0oMDAgKiogMTAgKiopCi0JcGZhZGQJbW03LG1tMQkJCTsgbW03PXJvdW5kaW50KGRhdGExLzgpPSgwMSAqKiAxMSAqKikKLQlwZmFkZAltbTAsbW0xCQkJOyBtbTA9cm91bmRpbnQoZGF0YTYvOCk9KDA2ICoqIDE2ICoqKQotCXBmYWRkCW1tNSxtbTEJCQk7IG1tNT1yb3VuZGludChkYXRhNy84KT0oMDcgKiogMTcgKiopCi0KLQlwYW5kCW1tNixtbTMJCQk7IG1tNj0oMDAgLS0gMTAgLS0pCi0JcHNsbGQJbW03LFdPUkRfQklUCQk7IG1tNz0oLS0gMDEgLS0gMTEpCi0JcGFuZAltbTAsbW0zCQkJOyBtbTA9KDA2IC0tIDE2IC0tKQotCXBzbGxkCW1tNSxXT1JEX0JJVAkJOyBtbTU9KC0tIDA3IC0tIDE3KQotCXBvcgltbTYsbW03CQkJOyBtbTY9KDAwIDAxIDEwIDExKQotCXBvcgltbTAsbW01CQkJOyBtbTA9KDA2IDA3IDE2IDE3KQotCi0JbW92cQltbTEsIE1NV09SRCBbd2soMCldCTsgbW0xPXRtcDIKLQltb3ZxCW1tMywgTU1XT1JEIFt3aygxKV0JOyBtbTM9dG1wMwotCi0JcGZhZGQJbW00LG1tMgkJCTsgbW00PXRtcDQKLQltb3ZxCW1tNyxtbTEKLQltb3ZxCW1tNSxtbTMKLQlwZmFkZAltbTEsbW0yCQkJOyBtbTE9ZGF0YTI9KDAyIDEyKQotCXBmYWRkCW1tMyxtbTQJCQk7IG1tMz1kYXRhND0oMDQgMTQpCi0JcGZzdWIJbW03LG1tMgkJCTsgbW03PWRhdGE1PSgwNSAxNSkKLQlwZnN1YgltbTUsbW00CQkJOyBtbTU9ZGF0YTM9KDAzIDEzKQotCi0JbW92cQltbTIsW0dPVE9GRihlYngsUERfUk5ESU5UX01BR0lDKV0JOyBtbTI9W1BEX1JORElOVF9NQUdJQ10KLQlwY21wZXFkCW1tNCxtbTQKLQlwc3JsZAltbTQsV09SRF9CSVQJCTsgbW00PXsweEZGRkYgMHgwMDAwIDB4RkZGRiAweDAwMDB9Ci0KLQlwZmFkZAltbTMsbW0yCQkJOyBtbTM9cm91bmRpbnQoZGF0YTQvOCk9KDA0ICoqIDE0ICoqKQotCXBmYWRkCW1tNyxtbTIJCQk7IG1tNz1yb3VuZGludChkYXRhNS84KT0oMDUgKiogMTUgKiopCi0JcGZhZGQJbW0xLG1tMgkJCTsgbW0xPXJvdW5kaW50KGRhdGEyLzgpPSgwMiAqKiAxMiAqKikKLQlwZmFkZAltbTUsbW0yCQkJOyBtbTU9cm91bmRpbnQoZGF0YTMvOCk9KDAzICoqIDEzICoqKQotCi0JcGFuZAltbTMsbW00CQkJOyBtbTM9KDA0IC0tIDE0IC0tKQotCXBzbGxkCW1tNyxXT1JEX0JJVAkJOyBtbTc9KC0tIDA1IC0tIDE1KQotCXBhbmQJbW0xLG1tNAkJCTsgbW0xPSgwMiAtLSAxMiAtLSkKLQlwc2xsZAltbTUsV09SRF9CSVQJCTsgbW01PSgtLSAwMyAtLSAxMykKLQlwb3IJbW0zLG1tNwkJCTsgbW0zPSgwNCAwNSAxNCAxNSkKLQlwb3IJbW0xLG1tNQkJCTsgbW0xPSgwMiAwMyAxMiAxMykKLQotCW1vdnEgICAgICBtbTIsW0dPVE9GRihlYngsUEJfQ0VOVEVSSlNBTVApXQk7IG1tMj1bUEJfQ0VOVEVSSlNBTVBdCi0KLQlwYWNrc3N3YiAgbW02LG1tMwkJOyBtbTY9KDAwIDAxIDEwIDExIDA0IDA1IDE0IDE1KQotCXBhY2tzc3diICBtbTEsbW0wCQk7IG1tMT0oMDIgMDMgMTIgMTMgMDYgMDcgMTYgMTcpCi0JcGFkZGIgICAgIG1tNixtbTIKLQlwYWRkYiAgICAgbW0xLG1tMgotCi0JbW92cSAgICAgIG1tNCxtbTYJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXB1bnBja2x3ZCBtbTYsbW0xCQk7IG1tNj0oMDAgMDEgMDIgMDMgMTAgMTEgMTIgMTMpCi0JcHVucGNraHdkIG1tNCxtbTEJCTsgbW00PSgwNCAwNSAwNiAwNyAxNCAxNSAxNiAxNykKLQotCW1vdnEgICAgICBtbTcsbW02CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMykKLQlwdW5wY2tsZHEgbW02LG1tNAkJOyBtbTY9KDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3KQotCXB1bnBja2hkcSBtbTcsbW00CQk7IG1tNz0oMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcpCi0KLQlwdXNocGljCWVieAkJCTsgc2F2ZSBHT1QgYWRkcmVzcwotCi0JbW92CWVkeCwgSlNBTVBST1cgW2VkaSswKlNJWkVPRl9KU0FNUFJPV10KLQltb3YJZWJ4LCBKU0FNUFJPVyBbZWRpKzEqU0laRU9GX0pTQU1QUk9XXQotCW1vdnEJTU1XT1JEIFtlZHgrZWF4KlNJWkVPRl9KU0FNUExFXSwgbW02Ci0JbW92cQlNTVdPUkQgW2VieCtlYXgqU0laRU9GX0pTQU1QTEVdLCBtbTcKLQotCXBvcHBpYwllYngJCQk7IHJlc3RvcmUgR09UIGFkZHJlc3MKLQotCWFkZAllc2ksIGJ5dGUgMipTSVpFT0ZfRkFTVF9GTE9BVAk7IHdzcHRyCi0JYWRkCWVkaSwgYnl0ZSAyKlNJWkVPRl9KU0FNUFJPVwotCWRlYwllY3gJCQkJOyBjdHIKLQlqbnoJbmVhciAucm93bG9vcAotCi0JZmVtbXMJCTsgZW1wdHkgTU1YLzNETm93ISBzdGF0ZQotCi0JcG9wCWVkaQotCXBvcAllc2kKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwb3AJZWJ4Ci0JbW92CWVzcCxlYnAJCTsgZXNwIDwtIGFsaWduZWQgZWJwCi0JcG9wCWVzcAkJOyBlc3AgPC0gb3JpZ2luYWwgZWJwCi0JcG9wCWVicAotCXJldAotCi0lZW5kaWYgOyBKSURDVF9GTFRfM0ROT1dfTU1YX1NVUFBPUlRFRAotJWVuZGlmIDsgRENUX0ZMT0FUX1NVUFBPUlRFRApkaWZmIC0tZ2l0IGEvamlkY3RmbHQuYXNtIGIvamlkY3RmbHQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjZkYzdiLi4wMDAwMDAwCi0tLSBhL2ppZGN0Zmx0LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi07Ci07IGppZGN0Zmx0LmFzbSAtIGZsb2F0aW5nLXBvaW50IElEQ1QgKG5vbi1TSU1EKQotOwotOyB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLTsgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KLTsgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGpzaW1kZXh0LmluYwotOwotOyBUaGlzIGZpbGUgc2hvdWxkIGJlIGFzc2VtYmxlZCB3aXRoIE5BU00gKE5ldHdpZGUgQXNzZW1ibGVyKSwKLTsgY2FuICpub3QqIGJlIGFzc2VtYmxlZCB3aXRoIE1pY3Jvc29mdCdzIE1BU00gb3IgYW55IGNvbXBhdGlibGUKLTsgYXNzZW1ibGVyIChpbmNsdWRpbmcgQm9ybGFuZCdzIFR1cmJvIEFzc2VtYmxlcikuCi07IE5BU00gaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL25hc20uc291cmNlZm9yZ2UubmV0LyBvcgotOyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD02MjA4Ci07Ci07IFRoaXMgZmlsZSBjb250YWlucyBhIGZsb2F0aW5nLXBvaW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnZlcnNlIERDVAotOyAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBiYXNlZCBkaXJlY3RseSBvbgotOyB0aGUgSUpHJ3Mgb3JpZ2luYWwgamlkY3RmbHQuYzsgc2VlIHRoZSBqaWRjdGZsdC5jIGZvciBtb3JlIGRldGFpbHMuCi07Ci07IExhc3QgTW9kaWZpZWQgOiBPY3RvYmVyIDE3LCAyMDA0Ci07Ci07IFtUQUI4XQotCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotJWluY2x1ZGUgImpkY3QuaW5jIgotCi0laWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotCi07IFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotOwotJWlmIERDVFNJWkUgIT0gOAotJWVycm9yICJTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4iCi0lZW5kaWYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX0NPTlNUCi0KLSVkZWZpbmUgUk9UQVRPUl9UWVBFCUZQMzIJOyBmbG9hdAotCi0JYWxpZ256CTE2Ci0JZ2xvYmFsCUVYVE4oamNvbnN0X2lkY3RfZmxvYXQpCi0KLUVYVE4oamNvbnN0X2lkY3RfZmxvYXQpOgotCi1GXzFfNDE0CWRkCTEuNDE0MjEzNTYyMzczMDk1MDQ4ODAxNjg5CTsgMipjb3MoUEkqMS80KQotRl8xXzg0NwlkZAkxLjg0Nzc1OTA2NTAyMjU3MzUxMjI1NjM2Ngk7IDIqY29zKFBJKjEvOCkKLUZfMV8wODIJZGQJMS4wODIzOTIyMDAyOTIzOTM5Njg3OTk0NDYJOyAyKihjb3MoUEkqMS84KS1jb3MoUEkqMy84KSkKLUZfMl82MTMJZGQJMi42MTMxMjU5Mjk3NTI3NTMwNTU3MTMyODYJOyAyKihjb3MoUEkqMS84KStjb3MoUEkqMy84KSkKLQotCWFsaWduegkxNgotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JU0VDVElPTglTRUdfVEVYVAotCUJJVFMJMzIKLTsKLTsgUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cy4KLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfaWRjdF9mbG9hdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi07ICAgICAgICAgICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKLTsgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLTsKLQotJWRlZmluZSBjaW5mbyhiKQkoYikrOAkJOyBqX2RlY29tcHJlc3NfcHRyIGNpbmZvCi0lZGVmaW5lIGNvbXBwdHIoYikJKGIpKzEyCQk7IGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyCi0lZGVmaW5lIGNvZWZfYmxvY2soYikJKGIpKzE2CQk7IEpDT0VGUFRSIGNvZWZfYmxvY2sKLSVkZWZpbmUgb3V0cHV0X2J1ZihiKQkoYikrMjAJCTsgSlNBTVBBUlJBWSBvdXRwdXRfYnVmCi0lZGVmaW5lIG91dHB1dF9jb2woYikJKGIpKzI0CQk7IEpESU1FTlNJT04gb3V0cHV0X2NvbAotCi0lZGVmaW5lIHRtcAkJZWJwLVNJWkVPRl9GUDY0CTsgZG91YmxlIHRtcAotJWRlZmluZSB3b3Jrc3BhY2UJdG1wLURDVFNJWkUyKlNJWkVPRl9GQVNUX0ZMT0FUCi0JCQkJCTsgRkFTVF9GTE9BVCB3b3Jrc3BhY2VbRENUU0laRTJdCi0lZGVmaW5lIHJuZGludF9tYWdpYwl3b3Jrc3BhY2UtU0laRU9GX0ZQMzIKLQkJCQkJOyBmbG9hdCBybmRpbnRfbWFnaWMgPSAxMDA2NjMyOTYuMEYKLSVkZWZpbmUgZ290cHRyCQlybmRpbnRfbWFnaWMtU0laRU9GX1BPSU5URVIJOyB2b2lkICogZ290cHRyCi0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfaWRjdF9mbG9hdCkKLQotRVhUTihqcGVnX2lkY3RfZmxvYXQpOgotCXB1c2gJZWJwCi0JbW92CWVicCxlc3AKLQlsZWEJZXNwLCBbd29ya3NwYWNlXQotCXB1c2gJRlAzMiAweDRDQzAwMDAwCQk7IChmbG9hdCkoMHgwMEMwMDAwMCA8PCAzKQotCXB1c2hwaWMJZWF4CQkJOyBtYWtlIGEgcm9vbSBmb3IgR09UIGFkZHJlc3MKLQlwdXNoCWVieAotOwlwdXNoCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcHVzaAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcHVzaAllc2kKLQlwdXNoCWVkaQotCi0JZ2V0X0dPVAllYngJCQk7IGdldCBHT1QgYWRkcmVzcwotCW1vdnBpYwlQT0lOVEVSIFtnb3RwdHJdLCBlYngJOyBzYXZlIEdPVCBhZGRyZXNzCi0KLQk7IC0tLS0gUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LgotCi0JbW92CWVkeCwgUE9JTlRFUiBbY29tcHB0cihlYnApXQotCW1vdgllZHgsIFBPSU5URVIgW2pjb21waW5mb19kY3RfdGFibGUoZWR4KV0JOyBxdWFudHB0cgotCW1vdgllc2ksIEpDT0VGUFRSIFtjb2VmX2Jsb2NrKGVicCldCQk7IGlucHRyCi0JbGVhCWVkaSwgW3dvcmtzcGFjZV0JCQk7IEZBU1RfRkxPQVQgKiB3c3B0cgotCW1vdgllY3gsIERDVFNJWkUJCQkJOyBjdHIKLQlhbGlnbngJMTYsNwotLmNvbHVtbmxvb3A6Ci0JbW92CWF4LCBKQ09FRiBbQ09MKDEsZXNpLFNJWkVPRl9KQ09FRildCi0Jb3IJYXgsIEpDT0VGIFtDT0woMixlc2ksU0laRU9GX0pDT0VGKV0KLQlqbnoJc2hvcnQgLmNvbHVtbkRDVAotCi0JbW92CWJ4LCBKQ09FRiBbQ09MKDMsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92CWF4LCBKQ09FRiBbQ09MKDQsZXNpLFNJWkVPRl9KQ09FRildCi0Jb3IJYngsIEpDT0VGIFtDT0woNSxlc2ksU0laRU9GX0pDT0VGKV0KLQlvcglheCwgSkNPRUYgW0NPTCg2LGVzaSxTSVpFT0ZfSkNPRUYpXQotCW9yCWJ4LCBKQ09FRiBbQ09MKDcsZXNpLFNJWkVPRl9KQ09FRildCi0Jb3IJYXgsYngKLQlqbnoJc2hvcnQgLmNvbHVtbkRDVAotCi0JOyAtLSBBQyB0ZXJtcyBhbGwgemVybwotCi0JZmlsZAlKQ09FRiBbQ09MKDAsZXNpLFNJWkVPRl9KQ09FRildCi0JZm11bAlGTE9BVF9NVUxUX1RZUEUgW0NPTCgwLGVkeCxTSVpFT0ZfRkxPQVRfTVVMVF9UWVBFKV0KLQotCWZzdAlGQVNUX0ZMT0FUIFtDT0woMCxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZzdAlGQVNUX0ZMT0FUIFtDT0woMSxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZzdAlGQVNUX0ZMT0FUIFtDT0woMixlZGksU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZzdAlGQVNUX0ZMT0FUIFtDT0woMyxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZzdAlGQVNUX0ZMT0FUIFtDT0woNCxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZzdAlGQVNUX0ZMT0FUIFtDT0woNSxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZzdAlGQVNUX0ZMT0FUIFtDT0woNixlZGksU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZzdHAJRkFTVF9GTE9BVCBbQ09MKDcsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlqbXAJbmVhciAubmV4dGNvbHVtbgotCWFsaWdueAkxNiw3Ci0KLS5jb2x1bW5EQ1Q6Ci0JbW92cGljCWVieCwgUE9JTlRFUiBbZ290cHRyXQk7IGxvYWQgR09UIGFkZHJlc3MKLQotCTsgLS0gRXZlbiBwYXJ0Ci0KLQlmaWxkCUpDT0VGIFtDT0woMixlc2ksU0laRU9GX0pDT0VGKV0KLQlmaWxkCUpDT0VGIFtDT0woNixlc2ksU0laRU9GX0pDT0VGKV0KLQlmaWxkCUpDT0VGIFtDT0woNCxlc2ksU0laRU9GX0pDT0VGKV0KLQlmaWxkCUpDT0VGIFtDT0woMCxlc2ksU0laRU9GX0pDT0VGKV0KLQotCWZ4Y2gJc3QwLHN0MwotCi0JZm11bAlGTE9BVF9NVUxUX1RZUEUgW0NPTCgyLGVkeCxTSVpFT0ZfRkxPQVRfTVVMVF9UWVBFKV0KLQlmeGNoCXN0MCxzdDIKLQlmbXVsCUZMT0FUX01VTFRfVFlQRSBbQ09MKDYsZWR4LFNJWkVPRl9GTE9BVF9NVUxUX1RZUEUpXQotCWZ4Y2gJc3QwLHN0MQotCWZtdWwJRkxPQVRfTVVMVF9UWVBFIFtDT0woNCxlZHgsU0laRU9GX0ZMT0FUX01VTFRfVFlQRSldCi0JZnhjaAlzdDAsc3QzCi0JZm11bAlGTE9BVF9NVUxUX1RZUEUgW0NPTCgwLGVkeCxTSVpFT0ZfRkxPQVRfTVVMVF9UWVBFKV0KLQlmeGNoCXN0MCxzdDEKLQotCWZsZAlzdDIJOyBzdDIgPSBzdDIgKyBzdDAsIHN0MCA9IHN0MiAtIHN0MAotCWZzdWIJc3QwLHN0MQotCWZ4Y2gJc3QwLHN0MQotCWZhZGRwCXN0MyxzdDAKLQotCWZtdWwJUk9UQVRPUl9UWVBFIFtHT1RPRkYoZWJ4LEZfMV80MTQpXQotCi0JZmxkCXN0Mwk7IHN0MSA9IHN0MSArIHN0Mywgc3QzID0gc3QxIC0gc3QzCi0JZnN1YnIJc3QwLHN0MgotCWZ4Y2gJc3QwLHN0NAotCWZhZGRwCXN0MixzdDAKLQotCWZzdWIJc3QwLHN0MgotCi0JZmxkCXN0MQk7IHN0MiA9IHN0MSArIHN0Miwgc3QxID0gc3QxIC0gc3QyCi0JZnN1YglzdDAsc3QzCi0JZnhjaAlzdDAsc3QyCi0JZmFkZHAJc3QzLHN0MAotCWZsZAlzdDMJOyBzdDAgPSBzdDMgKyBzdDAsIHN0MyA9IHN0MyAtIHN0MAotCWZzdWIJc3QwLHN0MQotCWZ4Y2gJc3QwLHN0NAotCWZhZGRwCXN0MSxzdDAKLQotCTsgLS0gT2RkIHBhcnQKLQotCWZpbGQJSkNPRUYgW0NPTCgxLGVzaSxTSVpFT0ZfSkNPRUYpXQotCWZpbGQJSkNPRUYgW0NPTCg3LGVzaSxTSVpFT0ZfSkNPRUYpXQotCWZpbGQJSkNPRUYgW0NPTCgzLGVzaSxTSVpFT0ZfSkNPRUYpXQotCWZpbGQJSkNPRUYgW0NPTCg1LGVzaSxTSVpFT0ZfSkNPRUYpXQotCi0JZnhjaAlzdDAsc3QzCi0KLQlmbXVsCUZMT0FUX01VTFRfVFlQRSBbQ09MKDEsZWR4LFNJWkVPRl9GTE9BVF9NVUxUX1RZUEUpXQotCWZ4Y2gJc3QwLHN0MgotCWZtdWwJRkxPQVRfTVVMVF9UWVBFIFtDT0woNyxlZHgsU0laRU9GX0ZMT0FUX01VTFRfVFlQRSldCi0JZnhjaAlzdDAsc3QxCi0JZm11bAlGTE9BVF9NVUxUX1RZUEUgW0NPTCgzLGVkeCxTSVpFT0ZfRkxPQVRfTVVMVF9UWVBFKV0KLQlmeGNoCXN0MCxzdDYKLQlmeGNoCXN0MyxzdDAKLQlmbXVsCUZMT0FUX01VTFRfVFlQRSBbQ09MKDUsZWR4LFNJWkVPRl9GTE9BVF9NVUxUX1RZUEUpXQotCWZ4Y2gJc3QwLHN0NQotCWZzdHAJRlA2NCBbdG1wXQotCi0JZmxkCXN0MQk7IHN0MSA9IHN0MSArIHN0MCwgc3QwID0gc3QxIC0gc3QwCi0JZnN1YglzdDAsc3QxCi0JZnhjaAlzdDAsc3QxCi0JZmFkZHAJc3QyLHN0MAotCWZsZAlzdDUJOyBzdDQgPSBzdDQgKyBzdDUsIHN0NSA9IHN0NCAtIHN0NQotCWZzdWJyCXN0MCxzdDUKLQlmeGNoCXN0MCxzdDYKLQlmYWRkcAlzdDUsc3QwCi0KLQlmbGQJc3QxCTsgc3QxID0gc3QxICsgc3Q0LCBzdDQgPSBzdDEgLSBzdDQKLQlmc3ViCXN0MCxzdDUKLQlmeGNoCXN0MCxzdDUKLQlmYWRkcAlzdDIsc3QwCi0KLQlmbGQJc3Q1Ci0JZmFkZAlzdDAsc3QxCi0JZnhjaAlzdDAsc3Q1Ci0JZm11bAlST1RBVE9SX1RZUEUgW0dPVE9GRihlYngsRl8xXzQxNCldCi0JZnhjaAlzdDAsc3Q1Ci0JZm11bAlST1RBVE9SX1RZUEUgW0dPVE9GRihlYngsRl8xXzg0NyldCi0JZnhjaAlzdDAsc3Q2Ci0JZm11bAlST1RBVE9SX1RZUEUgW0dPVE9GRihlYngsRl8yXzYxMyldCi0JZnhjaAlzdDAsc3QxCi0JZm11bAlST1RBVE9SX1RZUEUgW0dPVE9GRihlYngsRl8xXzA4MildCi0JZnhjaAlzdDAsc3Q2Ci0JZnN1YnIJc3QxLHN0MAotCWZzdWJwCXN0NixzdDAKLQotCTsgLS0gRmluYWwgb3V0cHV0IHN0YWdlCi0KLQlmc3ViCXN0MCxzdDEKLQlmbGQJc3QyCTsgc3QxID0gc3QyICsgc3QxLCBzdDIgPSBzdDIgLSBzdDEKLQlmc3ViCXN0MCxzdDIKLQlmeGNoCXN0MCxzdDMKLQlmYWRkcAlzdDIsc3QwCi0JZnN1YglzdDQsc3QwCi0JZmxkCXN0Mwk7IHN0MCA9IHN0MyArIHN0MCwgc3QzID0gc3QzIC0gc3QwCi0JZnN1YglzdDAsc3QxCi0JZnhjaAlzdDAsc3Q0Ci0JZmFkZHAJc3QxLHN0MAotCi0JZnhjaAlzdDAsc3QyCi0KLQlmc3RwCUZBU1RfRkxPQVQgW0NPTCg3LGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JZnN0cAlGQVNUX0ZMT0FUIFtDT0woMCxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZzdHAJRkFTVF9GTE9BVCBbQ09MKDEsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmc3RwCUZBU1RfRkxPQVQgW0NPTCg2LGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0KLQlmYWRkCXN0MSxzdDAKLQlmbGQJRlA2NCBbdG1wXQotCWZsZAlzdDEJOyBzdDMgPSBzdDMgKyBzdDEsIHN0MSA9IHN0MyAtIHN0MQotCWZzdWJyCXN0MCxzdDQKLQlmeGNoCXN0MCxzdDIKLQlmYWRkcAlzdDQsc3QwCi0JZmxkCXN0MAk7IHN0MCA9IHN0MCArIHN0Miwgc3QyID0gc3QwIC0gc3QyCi0JZnN1YglzdDAsc3QzCi0JZnhjaAlzdDAsc3QzCi0JZmFkZHAJc3QxLHN0MAotCi0JZnhjaAlzdDAsc3QzCi0KLQlmc3RwCUZBU1RfRkxPQVQgW0NPTCgyLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JZnN0cAlGQVNUX0ZMT0FUIFtDT0woNSxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZzdHAJRkFTVF9GTE9BVCBbQ09MKDMsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmc3RwCUZBU1RfRkxPQVQgW0NPTCg0LGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0KLS5uZXh0Y29sdW1uOgotCWFkZAllc2ksIGJ5dGUgU0laRU9GX0pDT0VGCTsgYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbgotCWFkZAllZHgsIGJ5dGUgU0laRU9GX0ZMT0FUX01VTFRfVFlQRQotCWFkZAllZGksIGJ5dGUgU0laRU9GX0ZBU1RfRkxPQVQKLQlkZWMJZWN4Ci0Jam56CW5lYXIgLmNvbHVtbmxvb3AKLQotCTsgLS0tLSBQYXNzIDI6IHByb2Nlc3Mgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LgotCi0JbW92CWVkeCwgUE9JTlRFUiBbY2luZm8oZWJwKV0KLQltb3YJZWR4LCBQT0lOVEVSIFtqZHN0cnVjdF9zYW1wbGVfcmFuZ2VfbGltaXQoZWR4KV0KLQlzdWIJZWR4LCBieXRlIC1DRU5URVJKU0FNUExFKlNJWkVPRl9KU0FNUExFCTsgSlNBTVBMRSAqIHJhbmdlX2xpbWl0Ci0KLQlsZWEJZXNpLCBbd29ya3NwYWNlXQkJCTsgRkFTVF9GTE9BVCAqIHdzcHRyCi0JbW92CWVkaSwgSlNBTVBBUlJBWSBbb3V0cHV0X2J1ZihlYnApXQk7IChKU0FNUFJPVyAqKQotCW1vdgllY3gsIERDVFNJWkUJCQkJOyBjdHIKLQlhbGlnbngJMTYsNwotLnJvd2xvb3A6Ci0JcHVzaAllZGkKLQltb3YJZWRpLCBKU0FNUFJPVyBbZWRpXQkJCTsgKEpTQU1QTEUgKikKLQlhZGQJZWRpLCBKRElNRU5TSU9OIFtvdXRwdXRfY29sKGVicCldCTsgZWRpPW91dHB0cgotCi0laWZuZGVmIE5PX1pFUk9fUk9XX1RFU1RfRkxPQVQKLQltb3YJZWF4LCBGQVNUX0ZMT0FUIFtST1coMSxlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCWFkZAllYXgsZWF4CQkJOyBzaGwgZWF4LDEgKHNoaWZ0IG91dCB0aGUgc2lnbiBiaXQpCi0Jam56CXNob3J0IC5yb3dEQ1QKLQotCW1vdgllYXgsIEZBU1RfRkxPQVQgW1JPVygyLGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92CWVieCwgRkFTVF9GTE9BVCBbUk9XKDMsZXNpLFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlvcgllYXgsIEZBU1RfRkxPQVQgW1JPVyg0LGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0Jb3IJZWJ4LCBGQVNUX0ZMT0FUIFtST1coNSxlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCW9yCWVheCwgRkFTVF9GTE9BVCBbUk9XKDYsZXNpLFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlvcgllYngsIEZBU1RfRkxPQVQgW1JPVyg3LGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0Jb3IJZWF4LGVieAotCWFkZAllYXgsZWF4CQkJOyBzaGwgZWF4LDEgKHNoaWZ0IG91dCB0aGUgc2lnbiBiaXQpCi0Jam56CXNob3J0IC5yb3dEQ1QKLQotCTsgLS0gQUMgdGVybXMgYWxsIHplcm8KLQotCXB1c2gJZWF4Ci0KLQlmbGQJRkFTVF9GTE9BVCBbUk9XKDAsZXNpLFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQlmYWRkCUZQMzIgW3JuZGludF9tYWdpY10KLQlmc3RwCUZQMzIgW2VzcF0KLQotCXBvcAllYXgKLQlhbmQJZWF4LFJBTkdFX01BU0sKLQltb3YJYWwsIEpTQU1QTEUgW2VkeCtlYXgqU0laRU9GX0pTQU1QTEVdCi0JbW92CUpTQU1QTEUgW2VkaSswKlNJWkVPRl9KU0FNUExFXSwgYWwKLQltb3YJSlNBTVBMRSBbZWRpKzEqU0laRU9GX0pTQU1QTEVdLCBhbAotCW1vdglKU0FNUExFIFtlZGkrMipTSVpFT0ZfSlNBTVBMRV0sIGFsCi0JbW92CUpTQU1QTEUgW2VkaSszKlNJWkVPRl9KU0FNUExFXSwgYWwKLQltb3YJSlNBTVBMRSBbZWRpKzQqU0laRU9GX0pTQU1QTEVdLCBhbAotCW1vdglKU0FNUExFIFtlZGkrNSpTSVpFT0ZfSlNBTVBMRV0sIGFsCi0JbW92CUpTQU1QTEUgW2VkaSs2KlNJWkVPRl9KU0FNUExFXSwgYWwKLQltb3YJSlNBTVBMRSBbZWRpKzcqU0laRU9GX0pTQU1QTEVdLCBhbAotCWptcAluZWFyIC5uZXh0cm93Ci0JYWxpZ254CTE2LDcKLSVlbmRpZgotLnJvd0RDVDoKLQltb3ZwaWMJZWJ4LCBQT0lOVEVSIFtnb3RwdHJdCTsgbG9hZCBHT1QgYWRkcmVzcwotCi0JOyAtLSBFdmVuIHBhcnQKLQotCWZsZAlGQVNUX0ZMT0FUIFtST1coNCxlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZsZAlGQVNUX0ZMT0FUIFtST1coMixlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZsZAlGQVNUX0ZMT0FUIFtST1coMCxlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCWZsZAlGQVNUX0ZMT0FUIFtST1coNixlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCi0JZmxkCXN0Mgk7IHN0MiA9IHN0MiArIHN0MCwgc3QwID0gc3QyIC0gc3QwCi0JZnN1YglzdDAsc3QxCi0JZnhjaAlzdDAsc3QxCi0JZmFkZHAJc3QzLHN0MAotCi0JZm11bAlST1RBVE9SX1RZUEUgW0dPVE9GRihlYngsRl8xXzQxNCldCi0KLQlmbGQJc3QzCTsgc3QxID0gc3QxICsgc3QzLCBzdDMgPSBzdDEgLSBzdDMKLQlmc3VicglzdDAsc3QyCi0JZnhjaAlzdDAsc3Q0Ci0JZmFkZHAJc3QyLHN0MAotCi0JZnN1YglzdDAsc3QyCi0KLQlmbGQJc3QxCTsgc3QyID0gc3QxICsgc3QyLCBzdDEgPSBzdDEgLSBzdDIKLQlmc3ViCXN0MCxzdDMKLQlmeGNoCXN0MCxzdDIKLQlmYWRkcAlzdDMsc3QwCi0JZmxkCXN0Mwk7IHN0MCA9IHN0MyArIHN0MCwgc3QzID0gc3QzIC0gc3QwCi0JZnN1YglzdDAsc3QxCi0JZnhjaAlzdDAsc3Q0Ci0JZmFkZHAJc3QxLHN0MAotCi0JOyAtLSBPZGQgcGFydAotCi0JZmxkCUZBU1RfRkxPQVQgW1JPVygzLGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JZnhjaAlzdDAsc3QzCi0JZmxkCUZBU1RfRkxPQVQgW1JPVygxLGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JZmxkCUZBU1RfRkxPQVQgW1JPVyg3LGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JZmxkCUZBU1RfRkxPQVQgW1JPVyg1LGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JZnhjaAlzdDAsc3Q1Ci0JZnN0cAlGUDY0IFt0bXBdCi0KLQlmbGQJc3QxCTsgc3QxID0gc3QxICsgc3QwLCBzdDAgPSBzdDEgLSBzdDAKLQlmc3ViCXN0MCxzdDEKLQlmeGNoCXN0MCxzdDEKLQlmYWRkcAlzdDIsc3QwCi0JZmxkCXN0NQk7IHN0NCA9IHN0NCArIHN0NSwgc3Q1ID0gc3Q0IC0gc3Q1Ci0JZnN1YnIJc3QwLHN0NQotCWZ4Y2gJc3QwLHN0NgotCWZhZGRwCXN0NSxzdDAKLQotCWZsZAlzdDEJOyBzdDEgPSBzdDEgKyBzdDQsIHN0NCA9IHN0MSAtIHN0NAotCWZzdWIJc3QwLHN0NQotCWZ4Y2gJc3QwLHN0NQotCWZhZGRwCXN0MixzdDAKLQotCWZsZAlzdDUKLQlmYWRkCXN0MCxzdDEKLQlmeGNoCXN0MCxzdDUKLQlmbXVsCVJPVEFUT1JfVFlQRSBbR09UT0ZGKGVieCxGXzFfNDE0KV0KLQlmeGNoCXN0MCxzdDUKLQlmbXVsCVJPVEFUT1JfVFlQRSBbR09UT0ZGKGVieCxGXzFfODQ3KV0KLQlmeGNoCXN0MCxzdDYKLQlmbXVsCVJPVEFUT1JfVFlQRSBbR09UT0ZGKGVieCxGXzJfNjEzKV0KLQlmeGNoCXN0MCxzdDEKLQlmbXVsCVJPVEFUT1JfVFlQRSBbR09UT0ZGKGVieCxGXzFfMDgyKV0KLQlmeGNoCXN0MCxzdDYKLQlmc3VicglzdDEsc3QwCi0JZnN1YnAJc3Q2LHN0MAotCi0JOyAtLSBGaW5hbCBvdXRwdXQgc3RhZ2UKLQotCXN1Ygllc3AsIGJ5dGUgRENUU0laRSpTSVpFT0ZfRlAzMgotCi0JZnN1YglzdDAsc3QxCi0JZmxkCXN0Mgk7IHN0MSA9IHN0MiArIHN0MSwgc3QyID0gc3QyIC0gc3QxCi0JZnN1YglzdDAsc3QyCi0JZnhjaAlzdDAsc3QzCi0JZmFkZHAJc3QyLHN0MAotCWZzdWIJc3Q0LHN0MAotCWZsZAlzdDMJOyBzdDAgPSBzdDMgKyBzdDAsIHN0MyA9IHN0MyAtIHN0MAotCWZzdWIJc3QwLHN0MQotCWZ4Y2gJc3QwLHN0NAotCWZhZGRwCXN0MSxzdDAKLQotCWZsZAlGUDMyIFtybmRpbnRfbWFnaWNdCi0KLQlmYWRkCXN0NCxzdDAKLQlmYWRkCXN0MSxzdDAKLQlmYWRkCXN0MixzdDAKLQlmYWRkCXN0MyxzdDAKLQotCWZ4Y2gJc3QwLHN0NAotCi0JZnN0cAlGUDMyIFtlc3ArNipTSVpFT0ZfRlAzMl0KLQlmc3RwCUZQMzIgW2VzcCsxKlNJWkVPRl9GUDMyXQotCWZzdHAJRlAzMiBbZXNwKzAqU0laRU9GX0ZQMzJdCi0JZnN0cAlGUDMyIFtlc3ArNypTSVpFT0ZfRlAzMl0KLQotCWZ4Y2gJc3QwLHN0MQotCi0JZmFkZAlzdDIsc3QwCi0JZmxkCUZQNjQgW3RtcF0KLQlmbGQJc3QxCTsgc3Q0ID0gc3Q0ICsgc3QxLCBzdDEgPSBzdDQgLSBzdDEKLQlmc3VicglzdDAsc3Q1Ci0JZnhjaAlzdDAsc3QyCi0JZmFkZHAJc3Q1LHN0MAotCWZsZAlzdDAJOyBzdDAgPSBzdDAgKyBzdDMsIHN0MyA9IHN0MCAtIHN0MwotCWZzdWIJc3QwLHN0NAotCWZ4Y2gJc3QwLHN0NAotCWZhZGRwCXN0MSxzdDAKLQotCWZ4Y2gJc3QwLHN0MgotCi0JZmFkZAlzdDEsc3QwCi0JZmFkZAlzdDIsc3QwCi0JZmFkZAlzdDMsc3QwCi0JZmFkZHAJc3Q0LHN0MAotCi0JZnN0cAlGUDMyIFtlc3ArNSpTSVpFT0ZfRlAzMl0KLQlmc3RwCUZQMzIgW2VzcCs0KlNJWkVPRl9GUDMyXQotCWZzdHAJRlAzMiBbZXNwKzMqU0laRU9GX0ZQMzJdCi0JZnN0cAlGUDMyIFtlc3ArMipTSVpFT0ZfRlAzMl0KLQotJWFzc2lnbiBpIDAJOyBpPTA7Ci0lcmVwIDQJOyAtLSByZXBlYXQgNCB0aW1lcyAtLS0KLQlwb3AJZWF4Ci0JcG9wCWVieAotCWFuZAllYXgsUkFOR0VfTUFTSwotCWFuZAllYngsUkFOR0VfTUFTSwotCW1vdglhbCwgSlNBTVBMRSBbZWR4K2VheCpTSVpFT0ZfSlNBTVBMRV0KLQltb3YJYmwsIEpTQU1QTEUgW2VkeCtlYngqU0laRU9GX0pTQU1QTEVdCi0JbW92CUpTQU1QTEUgW2VkaSsoaSswKSpTSVpFT0ZfSlNBTVBMRV0sIGFsCi0JbW92CUpTQU1QTEUgW2VkaSsoaSsxKSpTSVpFT0ZfSlNBTVBMRV0sIGJsCi0lYXNzaWduIGkgaSsyCTsgaSs9MjsKLSVlbmRyZXAJOyAtLSByZXBlYXQgZW5kIC0tLQotCi0ubmV4dHJvdzoKLQlwb3AJZWRpCi0JYWRkCWVzaSwgYnl0ZSBEQ1RTSVpFKlNJWkVPRl9GQVNUX0ZMT0FUCi0JYWRkCWVkaSwgYnl0ZSBTSVpFT0ZfSlNBTVBST1cJOyBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cKLQlkZWMJZWN4Ci0Jam56CW5lYXIgLnJvd2xvb3AKLQotCXBvcAllZGkKLQlwb3AJZXNpCi07CXBvcAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXBvcAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcG9wCWVieAotCW1vdgllc3AsZWJwCi0JcG9wCWVicAotCXJldAotCi0lZW5kaWYgOyBEQ1RfRkxPQVRfU1VQUE9SVEVECmRpZmYgLS1naXQgYS91bnVzZWQvamlkY3RmbHQuYyBiL2ppZGN0Zmx0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHVudXNlZC9qaWRjdGZsdC5jCnJlbmFtZSB0byBqaWRjdGZsdC5jCmRpZmYgLS1naXQgYS9qaWRjdGZzdC5hc20gYi9qaWRjdGZzdC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMjJhYzYuLjAwMDAwMDAKLS0tIGEvamlkY3Rmc3QuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNDY0ICswLDAgQEAKLTsKLTsgamlkY3Rmc3QuYXNtIC0gZmFzdCBpbnRlZ2VyIElEQ1QgKG5vbi1TSU1EKQotOwotOyB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLTsgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KLTsgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGpzaW1kZXh0LmluYwotOwotOyBUaGlzIGZpbGUgc2hvdWxkIGJlIGFzc2VtYmxlZCB3aXRoIE5BU00gKE5ldHdpZGUgQXNzZW1ibGVyKSwKLTsgY2FuICpub3QqIGJlIGFzc2VtYmxlZCB3aXRoIE1pY3Jvc29mdCdzIE1BU00gb3IgYW55IGNvbXBhdGlibGUKLTsgYXNzZW1ibGVyIChpbmNsdWRpbmcgQm9ybGFuZCdzIFR1cmJvIEFzc2VtYmxlcikuCi07IE5BU00gaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL25hc20uc291cmNlZm9yZ2UubmV0LyBvcgotOyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD02MjA4Ci07Ci07IFRoaXMgZmlsZSBjb250YWlucyBhIGZhc3QsIG5vdCBzbyBhY2N1cmF0ZSBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIG9mCi07IHRoZSBpbnZlcnNlIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuIFRoZSBmb2xsb3dpbmcgY29kZSBpcwotOyBiYXNlZCBkaXJlY3RseSBvbiB0aGUgSUpHJ3Mgb3JpZ2luYWwgamlkY3Rmc3QuYzsgc2VlIHRoZSBqaWRjdGZzdC5jCi07IGZvciBtb3JlIGRldGFpbHMuCi07Ci07IExhc3QgTW9kaWZpZWQgOiBPY3RvYmVyIDE3LCAyMDA0Ci07Ci07IFtUQUI4XQotCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotJWluY2x1ZGUgImpkY3QuaW5jIgotCi0laWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAotCi07IFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotOwotJWlmIERDVFNJWkUgIT0gOAotJWVycm9yICJTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4iCi0lZW5kaWYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi07IFdlIGNhbiBnYWluIGEgbGl0dGxlIG1vcmUgc3BlZWQsIHdpdGggYSBmdXJ0aGVyIGNvbXByb21pc2UgaW4gYWNjdXJhY3ksCi07IGJ5IG9taXR0aW5nIHRoZSBhZGRpdGlvbiBpbiBhIGRlc2NhbGluZyBzaGlmdC4gIFRoaXMgeWllbGRzIGFuCi07IGluY29ycmVjdGx5IHJvdW5kZWQgcmVzdWx0IGhhbGYgdGhlIHRpbWUuLi4KLTsKLSVtYWNybwlkZXNjYWxlIDIKLSVpZmRlZiBVU0VfQUNDVVJBVEVfUk9VTkRJTkcKLSVpZiAoJTIpPD03Ci0JYWRkCSUxLCBieXRlICgxPDwoKCUyKS0xKSkJOyBhZGQgcmVnMzIsaW1tOAotJWVsc2UKLQlhZGQJJTEsICgxPDwoKCUyKS0xKSkJOyBhZGQgcmVnMzIsaW1tMzIKLSVlbmRpZgotJWVuZGlmCi0Jc2FyCSUxLCUyCi0lZW5kbWFjcm8KLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0lZGVmaW5lIENPTlNUX0JJVFMJOAotJWRlZmluZSBQQVNTMV9CSVRTCTIKLQotJWlmIElGQVNUX1NDQUxFX0JJVFMgIT0gUEFTUzFfQklUUwotJWVycm9yICInSUZBU1RfU0NBTEVfQklUUycgbXVzdCBiZSBlcXVhbCB0byAnUEFTUzFfQklUUycuIgotJWVuZGlmCi0KLSVpZiBDT05TVF9CSVRTID09IDgKLUZfMV8wODIJZXF1CTI3NwkJOyBGSVgoMS4wODIzOTIyMDApCi1GXzFfNDE0CWVxdQkzNjIJCTsgRklYKDEuNDE0MjEzNTYyKQotRl8xXzg0NwllcXUJNDczCQk7IEZJWCgxLjg0Nzc1OTA2NSkKLUZfMl82MTMJZXF1CTY2OQkJOyBGSVgoMi42MTMxMjU5MzApCi0lZWxzZQotOyBOQVNNIGNhbm5vdCBkbyBjb21waWxlLXRpbWUgYXJpdGhtZXRpYyBvbiBmbG9hdGluZy1wb2ludCBjb25zdGFudHMuCi0lZGVmaW5lIERFU0NBTEUoeCxuKSAgKCgoeCkrKDE8PCgobiktMSkpKT4+KG4pKQotRl8xXzA4MgllcXUJREVTQ0FMRSgxMTYyMjA5Nzc1LDMwLUNPTlNUX0JJVFMpCTsgRklYKDEuMDgyMzkyMjAwKQotRl8xXzQxNAllcXUJREVTQ0FMRSgxNTE4NTAwMjQ5LDMwLUNPTlNUX0JJVFMpCTsgRklYKDEuNDE0MjEzNTYyKQotRl8xXzg0NwllcXUJREVTQ0FMRSgxOTg0MDE2MTg4LDMwLUNPTlNUX0JJVFMpCTsgRklYKDEuODQ3NzU5MDY1KQotRl8yXzYxMwllcXUJREVTQ0FMRSgyODA1ODIyNjAyLDMwLUNPTlNUX0JJVFMpCTsgRklYKDIuNjEzMTI1OTMwKQotJWVuZGlmCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19URVhUCi0JQklUUwkzMgotOwotOyBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLgotOwotOyBHTE9CQUwodm9pZCkKLTsganBlZ19pZGN0X2lmYXN0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLTsgICAgICAgICAgICAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotOyAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQotOwotCi0lZGVmaW5lIGNpbmZvKGIpCShiKSs4CQk7IGpfZGVjb21wcmVzc19wdHIgY2luZm8KLSVkZWZpbmUgY29tcHB0cihiKQkoYikrMTIJCTsganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIKLSVkZWZpbmUgY29lZl9ibG9jayhiKQkoYikrMTYJCTsgSkNPRUZQVFIgY29lZl9ibG9jawotJWRlZmluZSBvdXRwdXRfYnVmKGIpCShiKSsyMAkJOyBKU0FNUEFSUkFZIG91dHB1dF9idWYKLSVkZWZpbmUgb3V0cHV0X2NvbChiKQkoYikrMjQJCTsgSkRJTUVOU0lPTiBvdXRwdXRfY29sCi0KLSVkZWZpbmUgcmFuZ2VfbGltaXQJZWJwLVNJWkVPRl9QT0lOVEVSCQk7IEpTQU1QTEUgKiByYW5nZV9saW1pdAotJWRlZmluZSBwdHIJCXJhbmdlX2xpbWl0LVNJWkVPRl9QT0lOVEVSCTsgdm9pZCAqIHB0cgotJWRlZmluZSB3b3Jrc3BhY2UJcHRyLURDVFNJWkUyKlNJWkVPRl9JTlQKLQkJCQkJOyBpbnQgd29ya3NwYWNlW0RDVFNJWkUyXQotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2lkY3RfaWZhc3QpCi0KLUVYVE4oanBlZ19pZGN0X2lmYXN0KToKLQlwdXNoCWVicAotCW1vdgllYnAsZXNwCi0JbGVhCWVzcCwgW3dvcmtzcGFjZV0KLQlwdXNoCWVieAotOwlwdXNoCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcHVzaAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcHVzaAllc2kKLQlwdXNoCWVkaQotCi0JOyAtLS0tIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4KLQotCW1vdgllZHgsIFBPSU5URVIgW2NvbXBwdHIoZWJwKV0KLQltb3YJZWR4LCBQT0lOVEVSIFtqY29tcGluZm9fZGN0X3RhYmxlKGVkeCldCTsgcXVhbnRwdHIKLQltb3YJZXNpLCBKQ09FRlBUUiBbY29lZl9ibG9jayhlYnApXQkJOyBpbnB0cgotCWxlYQllZGksIFt3b3Jrc3BhY2VdCQkJOyBpbnQgKiB3c3B0cgotCW1vdgllY3gsIERDVFNJWkUJCQkJOyBjdHIKLQlhbGlnbngJMTYsNwotLmNvbHVtbmxvb3A6Ci0JbW92CWF4LCBKQ09FRiBbQ09MKDEsZXNpLFNJWkVPRl9KQ09FRildCi0Jb3IJYXgsIEpDT0VGIFtDT0woMixlc2ksU0laRU9GX0pDT0VGKV0KLQlqbnoJc2hvcnQgLmNvbHVtbkRDVAotCi0JbW92CWJ4LCBKQ09FRiBbQ09MKDMsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92CWF4LCBKQ09FRiBbQ09MKDQsZXNpLFNJWkVPRl9KQ09FRildCi0Jb3IJYngsIEpDT0VGIFtDT0woNSxlc2ksU0laRU9GX0pDT0VGKV0KLQlvcglheCwgSkNPRUYgW0NPTCg2LGVzaSxTSVpFT0ZfSkNPRUYpXQotCW9yCWJ4LCBKQ09FRiBbQ09MKDcsZXNpLFNJWkVPRl9KQ09FRildCi0Jb3IJYXgsYngKLQlqbnoJc2hvcnQgLmNvbHVtbkRDVAotCi0JOyAtLSBBQyB0ZXJtcyBhbGwgemVybwotCi0JbW92CWF4LCBKQ09FRiBbQ09MKDAsZXNpLFNJWkVPRl9KQ09FRildCi0JaW11bAlheCwgSUZBU1RfTVVMVF9UWVBFIFtDT0woMCxlZHgsU0laRU9GX0lGQVNUX01VTFRfVFlQRSldCi0JY3dkZQotCi0JbW92CUlOVCBbQ09MKDAsZWRpLFNJWkVPRl9JTlQpXSwgZWF4Ci0JbW92CUlOVCBbQ09MKDEsZWRpLFNJWkVPRl9JTlQpXSwgZWF4Ci0JbW92CUlOVCBbQ09MKDIsZWRpLFNJWkVPRl9JTlQpXSwgZWF4Ci0JbW92CUlOVCBbQ09MKDMsZWRpLFNJWkVPRl9JTlQpXSwgZWF4Ci0JbW92CUlOVCBbQ09MKDQsZWRpLFNJWkVPRl9JTlQpXSwgZWF4Ci0JbW92CUlOVCBbQ09MKDUsZWRpLFNJWkVPRl9JTlQpXSwgZWF4Ci0JbW92CUlOVCBbQ09MKDYsZWRpLFNJWkVPRl9JTlQpXSwgZWF4Ci0JbW92CUlOVCBbQ09MKDcsZWRpLFNJWkVPRl9JTlQpXSwgZWF4Ci0Jam1wCW5lYXIgLm5leHRjb2x1bW4KLQlhbGlnbngJMTYsNwotCi0uY29sdW1uRENUOgotCXB1c2gJZWN4CTsgY3RyCi0JcHVzaAllc2kJOyBjb2VmX2Jsb2NrCi0JcHVzaAllZHgJOyBxdWFudHB0cgotCi0JbW92CVBPSU5URVIgW3B0cl0sIGVkaQk7IHdzcHRyCi0KLQk7IC0tIEV2ZW4gcGFydAotCi0JbW92c3gJZWF4LCBKQ09FRiBbQ09MKDAsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92c3gJZWN4LCBKQ09FRiBbQ09MKDQsZXNpLFNJWkVPRl9KQ09FRildCi0JaW11bAlheCwgSUZBU1RfTVVMVF9UWVBFIFtDT0woMCxlZHgsU0laRU9GX0lGQVNUX01VTFRfVFlQRSldCi0JaW11bAljeCwgSUZBU1RfTVVMVF9UWVBFIFtDT0woNCxlZHgsU0laRU9GX0lGQVNUX01VTFRfVFlQRSldCi0JbW92c3gJZWJ4LCBKQ09FRiBbQ09MKDIsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92c3gJZWRpLCBKQ09FRiBbQ09MKDYsZXNpLFNJWkVPRl9KQ09FRildCi0JaW11bAlieCwgSUZBU1RfTVVMVF9UWVBFIFtDT0woMixlZHgsU0laRU9GX0lGQVNUX01VTFRfVFlQRSldCi0JaW11bAlkaSwgSUZBU1RfTVVMVF9UWVBFIFtDT0woNixlZHgsU0laRU9GX0lGQVNUX01VTFRfVFlQRSldCi0KLQlsZWEJZWR4LFtlYXgrZWN4XQkJOyBlZHg9dG1wMTAKLQlzdWIJZWF4LGVjeAkJCTsgZWF4PXRtcDExCi0KLQlsZWEJZWN4LFtlYngrZWRpXQkJOyBlY3g9dG1wMTMKLQlzdWIJZWJ4LGVkaQotCWltdWwJZWJ4LChGXzFfNDE0KQotCWRlc2NhbGUJZWJ4LENPTlNUX0JJVFMKLQlzdWIJZWJ4LGVjeAkJCTsgZWJ4PXRtcDEyCi0KLQlsZWEJZWRpLFtlZHgrZWN4XQkJOyBlZGk9dG1wMAotCXN1YgllZHgsZWN4CQkJOyBlZHg9dG1wMwotCWxlYQllY3gsW2VheCtlYnhdCQk7IGVjeD10bXAxCi0Jc3ViCWVheCxlYngJCQk7IGVheD10bXAyCi0KLQlwdXNoCWVkeAkJOyB0bXAzCi0JcHVzaAllYXgJCTsgdG1wMgotCXB1c2gJZWN4CQk7IHRtcDEKLQlwdXNoCWVkaQkJOyB0bXAwCi0KLQk7IC0tIE9kZCBwYXJ0Ci0KLQltb3YJZWR4LCBQT0lOVEVSIFtlc3ArMTZdCTsgcXVhbnRwdHIKLQotCW1vdnN4CWVheCwgSkNPRUYgW0NPTCgxLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdnN4CWVieCwgSkNPRUYgW0NPTCg3LGVzaSxTSVpFT0ZfSkNPRUYpXQotCWltdWwJYXgsIElGQVNUX01VTFRfVFlQRSBbQ09MKDEsZWR4LFNJWkVPRl9JRkFTVF9NVUxUX1RZUEUpXQotCWltdWwJYngsIElGQVNUX01VTFRfVFlQRSBbQ09MKDcsZWR4LFNJWkVPRl9JRkFTVF9NVUxUX1RZUEUpXQotCW1vdnN4CWVkaSwgSkNPRUYgW0NPTCg1LGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdnN4CWVjeCwgSkNPRUYgW0NPTCgzLGVzaSxTSVpFT0ZfSkNPRUYpXQotCWltdWwJZGksIElGQVNUX01VTFRfVFlQRSBbQ09MKDUsZWR4LFNJWkVPRl9JRkFTVF9NVUxUX1RZUEUpXQotCWltdWwJY3gsIElGQVNUX01VTFRfVFlQRSBbQ09MKDMsZWR4LFNJWkVPRl9JRkFTVF9NVUxUX1RZUEUpXQotCi0JbGVhCWVzaSxbZWF4K2VieF0JCTsgZXNpPXoxMQotCXN1YgllYXgsZWJ4CQkJOyBlYXg9ejEyCi0JbGVhCWVkeCxbZWRpK2VjeF0JCTsgZWR4PXoxMwotCXN1YgllZGksZWN4CQkJOyBlZGk9ejEwCi0KLQlsZWEJZWJ4LFtlc2krZWR4XQkJOyBlYng9dG1wNwotCXN1Ygllc2ksZWR4Ci0JaW11bAllc2ksKEZfMV80MTQpCQk7IGVzaT10bXAxMQotCWRlc2NhbGUJZXNpLENPTlNUX0JJVFMKLQotCWxlYQllY3gsW2VkaStlYXhdCi0JaW11bAllY3gsKEZfMV84NDcpCQk7IGVjeD16NQotCWltdWwJZWRpLCgtRl8yXzYxMykJCTsgZWRpPU1VTFRJUExZKHoxMCwtRklYXzJfNjEzMTI1OTMwKQotCWltdWwJZWF4LChGXzFfMDgyKQkJOyBlYXg9TVVMVElQTFkoejEyLEZJWF8xXzA4MjM5MjIwMCkKLQlkZXNjYWxlCWVjeCxDT05TVF9CSVRTCi0JZGVzY2FsZQllZGksQ09OU1RfQklUUwotCWRlc2NhbGUJZWF4LENPTlNUX0JJVFMKLQlhZGQJZWRpLGVjeAkJCTsgZWRpPXRtcDEyCi0Jc3ViCWVheCxlY3gJCQk7IGVheD10bXAxMAotCi0JOyAtLSBGaW5hbCBvdXRwdXQgc3RhZ2UKLQotCXN1YgllZGksZWJ4CQk7IGVkaT10bXA2Ci0JcG9wCWVkeAkJOyBlZHg9dG1wMAotCXN1Ygllc2ksZWRpCQk7IGVzaT10bXA1Ci0JcG9wCWVjeAkJOyBlY3g9dG1wMQotCWFkZAllYXgsZXNpCQk7IGVheD10bXA0Ci0JcHVzaAllc2kJCTsgdG1wNQotCXB1c2gJZWF4CQk7IHRtcDQKLQotCWxlYQllYXgsW2VkeCtlYnhdCTsgZWF4PWRhdGEwKD10bXAwK3RtcDcpCi0Jc3ViCWVkeCxlYngJCTsgZWR4PWRhdGE3KD10bXAwLXRtcDcpCi0JbGVhCWVieCxbZWN4K2VkaV0JOyBlYng9ZGF0YTEoPXRtcDErdG1wNikKLQlzdWIJZWN4LGVkaQkJOyBlY3g9ZGF0YTYoPXRtcDEtdG1wNikKLQotCW1vdgllZGksIFBPSU5URVIgW3B0cl0JOyBlZGk9d3NwdHIKLQotCW1vdglJTlQgW0NPTCgwLGVkaSxTSVpFT0ZfSU5UKV0sIGVheAotCW1vdglJTlQgW0NPTCg3LGVkaSxTSVpFT0ZfSU5UKV0sIGVkeAotCW1vdglJTlQgW0NPTCgxLGVkaSxTSVpFT0ZfSU5UKV0sIGVieAotCW1vdglJTlQgW0NPTCg2LGVkaSxTSVpFT0ZfSU5UKV0sIGVjeAotCi0JcG9wCWVzaQkJOyBlc2k9dG1wNAotCXBvcAllYXgJCTsgZWF4PXRtcDUKLQlwb3AJZWR4CQk7IGVkeD10bXAyCi0JcG9wCWVjeAkJOyBlY3g9dG1wMwotCi0JbGVhCWVieCxbZWR4K2VheF0JOyBlYng9ZGF0YTIoPXRtcDIrdG1wNSkKLQlzdWIJZWR4LGVheAkJOyBlZHg9ZGF0YTUoPXRtcDItdG1wNSkKLQlsZWEJZWF4LFtlY3grZXNpXQk7IGVheD1kYXRhNCg9dG1wMyt0bXA0KQotCXN1YgllY3gsZXNpCQk7IGVjeD1kYXRhMyg9dG1wMy10bXA0KQotCi0JbW92CUlOVCBbQ09MKDIsZWRpLFNJWkVPRl9JTlQpXSwgZWJ4Ci0JbW92CUlOVCBbQ09MKDUsZWRpLFNJWkVPRl9JTlQpXSwgZWR4Ci0JbW92CUlOVCBbQ09MKDQsZWRpLFNJWkVPRl9JTlQpXSwgZWF4Ci0JbW92CUlOVCBbQ09MKDMsZWRpLFNJWkVPRl9JTlQpXSwgZWN4Ci0KLQlwb3AJZWR4CTsgcXVhbnRwdHIKLQlwb3AJZXNpCTsgY29lZl9ibG9jawotCXBvcAllY3gJOyBjdHIKLQotLm5leHRjb2x1bW46Ci0JYWRkCWVzaSwgYnl0ZSBTSVpFT0ZfSkNPRUYJOyBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uCi0JYWRkCWVkeCwgYnl0ZSBTSVpFT0ZfSUZBU1RfTVVMVF9UWVBFCi0JYWRkCWVkaSwgYnl0ZSBTSVpFT0ZfSU5UCi0JZGVjCWVjeAotCWpuegluZWFyIC5jb2x1bW5sb29wCi0KLQk7IC0tLS0gUGFzcyAyOiBwcm9jZXNzIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4KLQotCW1vdgllYXgsIFBPSU5URVIgW2NpbmZvKGVicCldCi0JbW92CWVheCwgUE9JTlRFUiBbamRzdHJ1Y3Rfc2FtcGxlX3JhbmdlX2xpbWl0KGVheCldCi0Jc3ViCWVheCwgYnl0ZSAtQ0VOVEVSSlNBTVBMRSpTSVpFT0ZfSlNBTVBMRQk7IEpTQU1QTEUgKiByYW5nZV9saW1pdAotCW1vdglQT0lOVEVSIFtyYW5nZV9saW1pdF0sIGVheAotCi0JbGVhCWVzaSwgW3dvcmtzcGFjZV0JCQk7IGludCAqIHdzcHRyCi0JbW92CWVkaSwgSlNBTVBBUlJBWSBbb3V0cHV0X2J1ZihlYnApXQk7IChKU0FNUFJPVyAqKQotCW1vdgllY3gsIERDVFNJWkUJCQkJOyBjdHIKLQlhbGlnbngJMTYsNwotLnJvd2xvb3A6Ci0JcHVzaAllZGkKLQltb3YJZWRpLCBKU0FNUFJPVyBbZWRpXQkJCTsgKEpTQU1QTEUgKikKLQlhZGQJZWRpLCBKRElNRU5TSU9OIFtvdXRwdXRfY29sKGVicCldCTsgZWRpPW91dHB0cgotCi0laWZuZGVmIE5PX1pFUk9fUk9XX1RFU1QKLQltb3YJZWF4LCBJTlQgW1JPVygxLGVzaSxTSVpFT0ZfSU5UKV0KLQlvcgllYXgsIElOVCBbUk9XKDIsZXNpLFNJWkVPRl9JTlQpXQotCWpueglzaG9ydCAucm93RENUCi0KLQltb3YJZWJ4LCBJTlQgW1JPVygzLGVzaSxTSVpFT0ZfSU5UKV0KLQltb3YJZWF4LCBJTlQgW1JPVyg0LGVzaSxTSVpFT0ZfSU5UKV0KLQlvcgllYngsIElOVCBbUk9XKDUsZXNpLFNJWkVPRl9JTlQpXQotCW9yCWVheCwgSU5UIFtST1coNixlc2ksU0laRU9GX0lOVCldCi0Jb3IJZWJ4LCBJTlQgW1JPVyg3LGVzaSxTSVpFT0ZfSU5UKV0KLQlvcgllYXgsZWJ4Ci0Jam56CXNob3J0IC5yb3dEQ1QKLQotCTsgLS0gQUMgdGVybXMgYWxsIHplcm8KLQotCW1vdgllYXgsIElOVCBbUk9XKDAsZXNpLFNJWkVPRl9JTlQpXQotCi0JbW92CWVkeCwgUE9JTlRFUiBbcmFuZ2VfbGltaXRdCTsgKEpTQU1QTEUgKikKLQotCWRlc2NhbGUJZWF4LChQQVNTMV9CSVRTKzMpCi0JYW5kCWVheCxSQU5HRV9NQVNLCi0JbW92CWFsLCBKU0FNUExFIFtlZHgrZWF4KlNJWkVPRl9KU0FNUExFXQotCW1vdglKU0FNUExFIFtlZGkrMCpTSVpFT0ZfSlNBTVBMRV0sIGFsCi0JbW92CUpTQU1QTEUgW2VkaSsxKlNJWkVPRl9KU0FNUExFXSwgYWwKLQltb3YJSlNBTVBMRSBbZWRpKzIqU0laRU9GX0pTQU1QTEVdLCBhbAotCW1vdglKU0FNUExFIFtlZGkrMypTSVpFT0ZfSlNBTVBMRV0sIGFsCi0JbW92CUpTQU1QTEUgW2VkaSs0KlNJWkVPRl9KU0FNUExFXSwgYWwKLQltb3YJSlNBTVBMRSBbZWRpKzUqU0laRU9GX0pTQU1QTEVdLCBhbAotCW1vdglKU0FNUExFIFtlZGkrNipTSVpFT0ZfSlNBTVBMRV0sIGFsCi0JbW92CUpTQU1QTEUgW2VkaSs3KlNJWkVPRl9KU0FNUExFXSwgYWwKLQlqbXAJbmVhciAubmV4dHJvdwotCWFsaWdueAkxNiw3Ci0lZW5kaWYKLS5yb3dEQ1Q6Ci0JcHVzaAllc2kJOyB3c3B0cgotCXB1c2gJZWN4CTsgY3RyCi0KLQltb3YJUE9JTlRFUiBbcHRyXSwgZWRpCTsgb3V0cHRyCi0KLQk7IC0tIEV2ZW4gcGFydAotCi0JbW92CWVheCwgSU5UIFtST1coMCxlc2ksU0laRU9GX0lOVCldCi0JbW92CWVieCwgSU5UIFtST1coMixlc2ksU0laRU9GX0lOVCldCi0JbW92CWVjeCwgSU5UIFtST1coNCxlc2ksU0laRU9GX0lOVCldCi0JbW92CWVkaSwgSU5UIFtST1coNixlc2ksU0laRU9GX0lOVCldCi0KLQlsZWEJZWR4LFtlYXgrZWN4XQkJOyBlZHg9dG1wMTAKLQlzdWIJZWF4LGVjeAkJCTsgZWF4PXRtcDExCi0KLQlsZWEJZWN4LFtlYngrZWRpXQkJOyBlY3g9dG1wMTMKLQlzdWIJZWJ4LGVkaQotCWltdWwJZWJ4LChGXzFfNDE0KQotCWRlc2NhbGUJZWJ4LENPTlNUX0JJVFMKLQlzdWIJZWJ4LGVjeAkJCTsgZWJ4PXRtcDEyCi0KLQlsZWEJZWRpLFtlZHgrZWN4XQkJOyBlZGk9dG1wMAotCXN1YgllZHgsZWN4CQkJOyBlZHg9dG1wMwotCWxlYQllY3gsW2VheCtlYnhdCQk7IGVjeD10bXAxCi0Jc3ViCWVheCxlYngJCQk7IGVheD10bXAyCi0KLQlwdXNoCWVkeAkJOyB0bXAzCi0JcHVzaAllYXgJCTsgdG1wMgotCXB1c2gJZWN4CQk7IHRtcDEKLQlwdXNoCWVkaQkJOyB0bXAwCi0KLQk7IC0tIE9kZCBwYXJ0Ci0KLQltb3YJZWF4LCBJTlQgW1JPVygxLGVzaSxTSVpFT0ZfSU5UKV0KLQltb3YJZWN4LCBJTlQgW1JPVygzLGVzaSxTSVpFT0ZfSU5UKV0KLQltb3YJZWRpLCBJTlQgW1JPVyg1LGVzaSxTSVpFT0ZfSU5UKV0KLQltb3YJZWJ4LCBJTlQgW1JPVyg3LGVzaSxTSVpFT0ZfSU5UKV0KLQotCWxlYQllc2ksW2VheCtlYnhdCQk7IGVzaT16MTEKLQlzdWIJZWF4LGVieAkJCTsgZWF4PXoxMgotCWxlYQllZHgsW2VkaStlY3hdCQk7IGVkeD16MTMKLQlzdWIJZWRpLGVjeAkJCTsgZWRpPXoxMAotCi0JbGVhCWVieCxbZXNpK2VkeF0JCTsgZWJ4PXRtcDcKLQlzdWIJZXNpLGVkeAotCWltdWwJZXNpLChGXzFfNDE0KQkJOyBlc2k9dG1wMTEKLQlkZXNjYWxlCWVzaSxDT05TVF9CSVRTCi0KLQlsZWEJZWN4LFtlZGkrZWF4XQotCWltdWwJZWN4LChGXzFfODQ3KQkJOyBlY3g9ejUKLQlpbXVsCWVkaSwoLUZfMl82MTMpCQk7IGVkaT1NVUxUSVBMWSh6MTAsLUZJWF8yXzYxMzEyNTkzMCkKLQlpbXVsCWVheCwoRl8xXzA4MikJCTsgZWF4PU1VTFRJUExZKHoxMixGSVhfMV8wODIzOTIyMDApCi0JZGVzY2FsZQllY3gsQ09OU1RfQklUUwotCWRlc2NhbGUJZWRpLENPTlNUX0JJVFMKLQlkZXNjYWxlCWVheCxDT05TVF9CSVRTCi0JYWRkCWVkaSxlY3gJCQk7IGVkaT10bXAxMgotCXN1YgllYXgsZWN4CQkJOyBlYXg9dG1wMTAKLQotCTsgLS0gRmluYWwgb3V0cHV0IHN0YWdlCi0KLQlzdWIJZWRpLGVieAkJOyBlZGk9dG1wNgotCXBvcAllZHgJCTsgZWR4PXRtcDAKLQlzdWIJZXNpLGVkaQkJOyBlc2k9dG1wNQotCXBvcAllY3gJCTsgZWN4PXRtcDEKLQlhZGQJZWF4LGVzaQkJOyBlYXg9dG1wNAotCXB1c2gJZXNpCQk7IHRtcDUKLQlwdXNoCWVheAkJOyB0bXA0Ci0KLQlsZWEJZWF4LFtlZHgrZWJ4XQk7IGVheD1kYXRhMCg9dG1wMCt0bXA3KQotCXN1YgllZHgsZWJ4CQk7IGVkeD1kYXRhNyg9dG1wMC10bXA3KQotCWxlYQllYngsW2VjeCtlZGldCTsgZWJ4PWRhdGExKD10bXAxK3RtcDYpCi0Jc3ViCWVjeCxlZGkJCTsgZWN4PWRhdGE2KD10bXAxLXRtcDYpCi0KLQltb3YJZXNpLCBQT0lOVEVSIFtyYW5nZV9saW1pdF0JOyAoSlNBTVBMRSAqKQotCi0JZGVzY2FsZQllYXgsKFBBU1MxX0JJVFMrMykKLQlkZXNjYWxlCWVkeCwoUEFTUzFfQklUUyszKQotCWRlc2NhbGUJZWJ4LChQQVNTMV9CSVRTKzMpCi0JZGVzY2FsZQllY3gsKFBBU1MxX0JJVFMrMykKLQotCW1vdgllZGksIFBPSU5URVIgW3B0cl0JCTsgZWRpPW91dHB0cgotCi0JYW5kCWVheCxSQU5HRV9NQVNLCi0JYW5kCWVkeCxSQU5HRV9NQVNLCi0JYW5kCWVieCxSQU5HRV9NQVNLCi0JYW5kCWVjeCxSQU5HRV9NQVNLCi0KLQltb3YJYWwsIEpTQU1QTEUgW2VzaStlYXgqU0laRU9GX0pTQU1QTEVdCi0JbW92CWRsLCBKU0FNUExFIFtlc2krZWR4KlNJWkVPRl9KU0FNUExFXQotCW1vdglibCwgSlNBTVBMRSBbZXNpK2VieCpTSVpFT0ZfSlNBTVBMRV0KLQltb3YJY2wsIEpTQU1QTEUgW2VzaStlY3gqU0laRU9GX0pTQU1QTEVdCi0KLQltb3YJSlNBTVBMRSBbZWRpKzAqU0laRU9GX0pTQU1QTEVdLCBhbAotCW1vdglKU0FNUExFIFtlZGkrNypTSVpFT0ZfSlNBTVBMRV0sIGRsCi0JbW92CUpTQU1QTEUgW2VkaSsxKlNJWkVPRl9KU0FNUExFXSwgYmwKLQltb3YJSlNBTVBMRSBbZWRpKzYqU0laRU9GX0pTQU1QTEVdLCBjbAotCi0JcG9wCWVzaQkJOyBlc2k9dG1wNAotCXBvcAllYXgJCTsgZWF4PXRtcDUKLQlwb3AJZWR4CQk7IGVkeD10bXAyCi0JcG9wCWVjeAkJOyBlY3g9dG1wMwotCi0JbGVhCWVieCxbZWR4K2VheF0JOyBlYng9ZGF0YTIoPXRtcDIrdG1wNSkKLQlzdWIJZWR4LGVheAkJOyBlZHg9ZGF0YTUoPXRtcDItdG1wNSkKLQlsZWEJZWF4LFtlY3grZXNpXQk7IGVheD1kYXRhNCg9dG1wMyt0bXA0KQotCXN1YgllY3gsZXNpCQk7IGVjeD1kYXRhMyg9dG1wMy10bXA0KQotCi0JbW92CWVzaSwgUE9JTlRFUiBbcmFuZ2VfbGltaXRdCTsgKEpTQU1QTEUgKikKLQotCWRlc2NhbGUJZWJ4LChQQVNTMV9CSVRTKzMpCi0JZGVzY2FsZQllZHgsKFBBU1MxX0JJVFMrMykKLQlkZXNjYWxlCWVheCwoUEFTUzFfQklUUyszKQotCWRlc2NhbGUJZWN4LChQQVNTMV9CSVRTKzMpCi0KLQlhbmQJZWJ4LFJBTkdFX01BU0sKLQlhbmQJZWR4LFJBTkdFX01BU0sKLQlhbmQJZWF4LFJBTkdFX01BU0sKLQlhbmQJZWN4LFJBTkdFX01BU0sKLQotCW1vdglibCwgSlNBTVBMRSBbZXNpK2VieCpTSVpFT0ZfSlNBTVBMRV0KLQltb3YJZGwsIEpTQU1QTEUgW2VzaStlZHgqU0laRU9GX0pTQU1QTEVdCi0JbW92CWFsLCBKU0FNUExFIFtlc2krZWF4KlNJWkVPRl9KU0FNUExFXQotCW1vdgljbCwgSlNBTVBMRSBbZXNpK2VjeCpTSVpFT0ZfSlNBTVBMRV0KLQotCW1vdglKU0FNUExFIFtlZGkrMipTSVpFT0ZfSlNBTVBMRV0sIGJsCi0JbW92CUpTQU1QTEUgW2VkaSs1KlNJWkVPRl9KU0FNUExFXSwgZGwKLQltb3YJSlNBTVBMRSBbZWRpKzQqU0laRU9GX0pTQU1QTEVdLCBhbAotCW1vdglKU0FNUExFIFtlZGkrMypTSVpFT0ZfSlNBTVBMRV0sIGNsCi0KLQlwb3AJZWN4CTsgY3RyCi0JcG9wCWVzaQk7IHdzcHRyCi0KLS5uZXh0cm93OgotCXBvcAllZGkKLQlhZGQJZXNpLCBieXRlIERDVFNJWkUqU0laRU9GX0lOVAk7IGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdwotCWFkZAllZGksIGJ5dGUgU0laRU9GX0pTQU1QUk9XCi0JZGVjCWVjeAotCWpuegluZWFyIC5yb3dsb29wCi0KLQlwb3AJZWRpCi0JcG9wCWVzaQotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXBvcAllYngKLQltb3YJZXNwLGVicAotCXBvcAllYnAKLQlyZXQKLQotJWVuZGlmIDsgRENUX0lGQVNUX1NVUFBPUlRFRApkaWZmIC0tZ2l0IGEvdW51c2VkL2ppZGN0ZnN0LmMgYi9qaWRjdGZzdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB1bnVzZWQvamlkY3Rmc3QuYwpyZW5hbWUgdG8gamlkY3Rmc3QuYwpkaWZmIC0tZ2l0IGEvamlkY3RpbnQuYXNtIGIvamlkY3RpbnQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjgxOTE5Li4wMDAwMDAwCi0tLSBhL2ppZGN0aW50LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDUyNCArMCwwIEBACi07Ci07IGppZGN0aW50LmFzbSAtIGFjY3VyYXRlIGludGVnZXIgSURDVCAobm9uLVNJTUQpCi07Ci07IHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotOyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgotOyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4ganNpbWRleHQuaW5jCi07Ci07IFRoaXMgZmlsZSBzaG91bGQgYmUgYXNzZW1ibGVkIHdpdGggTkFTTSAoTmV0d2lkZSBBc3NlbWJsZXIpLAotOyBjYW4gKm5vdCogYmUgYXNzZW1ibGVkIHdpdGggTWljcm9zb2Z0J3MgTUFTTSBvciBhbnkgY29tcGF0aWJsZQotOyBhc3NlbWJsZXIgKGluY2x1ZGluZyBCb3JsYW5kJ3MgVHVyYm8gQXNzZW1ibGVyKS4KLTsgTkFTTSBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vbmFzbS5zb3VyY2Vmb3JnZS5uZXQvIG9yCi07IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTYyMDgKLTsKLTsgVGhpcyBmaWxlIGNvbnRhaW5zIGEgc2xvdy1idXQtYWNjdXJhdGUgaW50ZWdlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLTsgaW52ZXJzZSBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgYmFzZWQKLTsgZGlyZWN0bHkgb24gdGhlIElKRydzIG9yaWdpbmFsIGppZGN0aW50LmM7IHNlZSB0aGUgamlkY3RpbnQuYyBmb3IKLTsgbW9yZSBkZXRhaWxzLgotOwotOyBMYXN0IE1vZGlmaWVkIDogT2N0b2JlciAxNywgMjAwNAotOwotOyBbVEFCOF0KLQotJWluY2x1ZGUgImpzaW1kZXh0LmluYyIKLSVpbmNsdWRlICJqZGN0LmluYyIKLQotJWlmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKLQotOyBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLTsKLSVpZiBEQ1RTSVpFICE9IDgKLSVlcnJvciAiU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIgotJWVuZGlmCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotOyBEZXNjYWxlIGFuZCBjb3JyZWN0bHkgcm91bmQgYSBEV09SRCB2YWx1ZSB0aGF0J3Mgc2NhbGVkIGJ5IE4gYml0cy4KLTsKLSVtYWNybwlkZXNjYWxlIDIKLSVpZiAoJTIpPD03Ci0JYWRkCSUxLCBieXRlICgxPDwoKCUyKS0xKSkJOyBhZGQgcmVnMzIsaW1tOAotJWVsc2UKLQlhZGQJJTEsICgxPDwoKCUyKS0xKSkJOyBhZGQgcmVnMzIsaW1tMzIKLSVlbmRpZgotCXNhcgklMSwlMgotJWVuZG1hY3JvCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJWRlZmluZSBDT05TVF9CSVRTCTEzCi0lZGVmaW5lIFBBU1MxX0JJVFMJMgotCi0laWYgQ09OU1RfQklUUyA9PSAxMwotRl8wXzI5OAllcXUJIDI0NDYJCTsgRklYKDAuMjk4NjMxMzM2KQotRl8wXzM5MAllcXUJIDMxOTYJCTsgRklYKDAuMzkwMTgwNjQ0KQotRl8wXzU0MQllcXUJIDQ0MzMJCTsgRklYKDAuNTQxMTk2MTAwKQotRl8wXzc2NQllcXUJIDYyNzAJCTsgRklYKDAuNzY1MzY2ODY1KQotRl8wXzg5OQllcXUJIDczNzMJCTsgRklYKDAuODk5OTc2MjIzKQotRl8xXzE3NQllcXUJIDk2MzMJCTsgRklYKDEuMTc1ODc1NjAyKQotRl8xXzUwMQllcXUJMTIyOTkJCTsgRklYKDEuNTAxMzIxMTEwKQotRl8xXzg0NwllcXUJMTUxMzcJCTsgRklYKDEuODQ3NzU5MDY1KQotRl8xXzk2MQllcXUJMTYwNjkJCTsgRklYKDEuOTYxNTcwNTYwKQotRl8yXzA1MwllcXUJMTY4MTkJCTsgRklYKDIuMDUzMTE5ODY5KQotRl8yXzU2MgllcXUJMjA5OTUJCTsgRklYKDIuNTYyOTE1NDQ3KQotRl8zXzA3MgllcXUJMjUxNzIJCTsgRklYKDMuMDcyNzExMDI2KQotJWVsc2UKLTsgTkFTTSBjYW5ub3QgZG8gY29tcGlsZS10aW1lIGFyaXRobWV0aWMgb24gZmxvYXRpbmctcG9pbnQgY29uc3RhbnRzLgotJWRlZmluZSBERVNDQUxFKHgsbikgICgoKHgpKygxPDwoKG4pLTEpKSk+PihuKSkKLUZfMF8yOTgJZXF1CURFU0NBTEUoIDMyMDY1Mjk1NSwzMC1DT05TVF9CSVRTKQk7IEZJWCgwLjI5ODYzMTMzNikKLUZfMF8zOTAJZXF1CURFU0NBTEUoIDQxODk1MzI3NiwzMC1DT05TVF9CSVRTKQk7IEZJWCgwLjM5MDE4MDY0NCkKLUZfMF81NDEJZXF1CURFU0NBTEUoIDU4MTEwNDg4NywzMC1DT05TVF9CSVRTKQk7IEZJWCgwLjU0MTE5NjEwMCkKLUZfMF83NjUJZXF1CURFU0NBTEUoIDgyMTgwNjQxMywzMC1DT05TVF9CSVRTKQk7IEZJWCgwLjc2NTM2Njg2NSkKLUZfMF84OTkJZXF1CURFU0NBTEUoIDk2NjM0MjExMSwzMC1DT05TVF9CSVRTKQk7IEZJWCgwLjg5OTk3NjIyMykKLUZfMV8xNzUJZXF1CURFU0NBTEUoMTI2MjU4NjgxMywzMC1DT05TVF9CSVRTKQk7IEZJWCgxLjE3NTg3NTYwMikKLUZfMV81MDEJZXF1CURFU0NBTEUoMTYxMjAzMTI2NywzMC1DT05TVF9CSVRTKQk7IEZJWCgxLjUwMTMyMTExMCkKLUZfMV84NDcJZXF1CURFU0NBTEUoMTk4NDAxNjE4OCwzMC1DT05TVF9CSVRTKQk7IEZJWCgxLjg0Nzc1OTA2NSkKLUZfMV85NjEJZXF1CURFU0NBTEUoMjEwNjIyMDM1MCwzMC1DT05TVF9CSVRTKQk7IEZJWCgxLjk2MTU3MDU2MCkKLUZfMl8wNTMJZXF1CURFU0NBTEUoMjIwNDUyMDY3MywzMC1DT05TVF9CSVRTKQk7IEZJWCgyLjA1MzExOTg2OSkKLUZfMl81NjIJZXF1CURFU0NBTEUoMjc1MTkwOTUwNiwzMC1DT05TVF9CSVRTKQk7IEZJWCgyLjU2MjkxNTQ0NykKLUZfM18wNzIJZXF1CURFU0NBTEUoMzI5OTI5ODM0MSwzMC1DT05TVF9CSVRTKQk7IEZJWCgzLjA3MjcxMTAyNikKLSVlbmRpZgotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JU0VDVElPTglTRUdfVEVYVAotCUJJVFMJMzIKLTsKLTsgUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cy4KLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfaWRjdF9pc2xvdyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi07ICAgICAgICAgICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKLTsgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLTsKLQotJWRlZmluZSBjaW5mbyhiKQkoYikrOAkJOyBqX2RlY29tcHJlc3NfcHRyIGNpbmZvCi0lZGVmaW5lIGNvbXBwdHIoYikJKGIpKzEyCQk7IGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyCi0lZGVmaW5lIGNvZWZfYmxvY2soYikJKGIpKzE2CQk7IEpDT0VGUFRSIGNvZWZfYmxvY2sKLSVkZWZpbmUgb3V0cHV0X2J1ZihiKQkoYikrMjAJCTsgSlNBTVBBUlJBWSBvdXRwdXRfYnVmCi0lZGVmaW5lIG91dHB1dF9jb2woYikJKGIpKzI0CQk7IEpESU1FTlNJT04gb3V0cHV0X2NvbAotCi0lZGVmaW5lIHJhbmdlX2xpbWl0CWVicC1TSVpFT0ZfUE9JTlRFUgkJOyBKU0FNUExFICogcmFuZ2VfbGltaXQKLSVkZWZpbmUgcHRyCQlyYW5nZV9saW1pdC1TSVpFT0ZfUE9JTlRFUgk7IHZvaWQgKiBwdHIKLSVkZWZpbmUgd29ya3NwYWNlCXB0ci1EQ1RTSVpFMipTSVpFT0ZfSU5UCi0JCQkJCTsgaW50IHdvcmtzcGFjZVtEQ1RTSVpFMl0KLQotCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19pZGN0X2lzbG93KQotCi1FWFROKGpwZWdfaWRjdF9pc2xvdyk6Ci0JcHVzaAllYnAKLQltb3YJZWJwLGVzcAotCWxlYQllc3AsIFt3b3Jrc3BhY2VdCi0JcHVzaAllYngKLTsJcHVzaAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXB1c2gJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXB1c2gJZXNpCi0JcHVzaAllZGkKLQotCTsgLS0tLSBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuCi0KLQltb3YJZWR4LCBQT0lOVEVSIFtjb21wcHRyKGVicCldCi0JbW92CWVkeCwgUE9JTlRFUiBbamNvbXBpbmZvX2RjdF90YWJsZShlZHgpXQk7IHF1YW50cHRyCi0JbW92CWVzaSwgSkNPRUZQVFIgW2NvZWZfYmxvY2soZWJwKV0JCTsgaW5wdHIKLQlsZWEJZWRpLCBbd29ya3NwYWNlXQkJCTsgaW50ICogd3NwdHIKLQltb3YJZWN4LCBEQ1RTSVpFCQkJCTsgY3RyCi0JYWxpZ254CTE2LDcKLS5jb2x1bW5sb29wOgotCW1vdglheCwgSkNPRUYgW0NPTCgxLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW9yCWF4LCBKQ09FRiBbQ09MKDIsZXNpLFNJWkVPRl9KQ09FRildCi0Jam56CXNob3J0IC5jb2x1bW5EQ1QKLQotCW1vdglieCwgSkNPRUYgW0NPTCgzLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdglheCwgSkNPRUYgW0NPTCg0LGVzaSxTSVpFT0ZfSkNPRUYpXQotCW9yCWJ4LCBKQ09FRiBbQ09MKDUsZXNpLFNJWkVPRl9KQ09FRildCi0Jb3IJYXgsIEpDT0VGIFtDT0woNixlc2ksU0laRU9GX0pDT0VGKV0KLQlvcglieCwgSkNPRUYgW0NPTCg3LGVzaSxTSVpFT0ZfSkNPRUYpXQotCW9yCWF4LGJ4Ci0Jam56CXNob3J0IC5jb2x1bW5EQ1QKLQotCTsgLS0gQUMgdGVybXMgYWxsIHplcm8KLQotCW1vdglheCwgSkNPRUYgW0NPTCgwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCWltdWwJYXgsIElTTE9XX01VTFRfVFlQRSBbQ09MKDAsZWR4LFNJWkVPRl9JU0xPV19NVUxUX1RZUEUpXQotCWN3ZGUKLQotCXNhbAllYXgsUEFTUzFfQklUUwotCi0JbW92CUlOVCBbQ09MKDAsZWRpLFNJWkVPRl9JTlQpXSwgZWF4Ci0JbW92CUlOVCBbQ09MKDEsZWRpLFNJWkVPRl9JTlQpXSwgZWF4Ci0JbW92CUlOVCBbQ09MKDIsZWRpLFNJWkVPRl9JTlQpXSwgZWF4Ci0JbW92CUlOVCBbQ09MKDMsZWRpLFNJWkVPRl9JTlQpXSwgZWF4Ci0JbW92CUlOVCBbQ09MKDQsZWRpLFNJWkVPRl9JTlQpXSwgZWF4Ci0JbW92CUlOVCBbQ09MKDUsZWRpLFNJWkVPRl9JTlQpXSwgZWF4Ci0JbW92CUlOVCBbQ09MKDYsZWRpLFNJWkVPRl9JTlQpXSwgZWF4Ci0JbW92CUlOVCBbQ09MKDcsZWRpLFNJWkVPRl9JTlQpXSwgZWF4Ci0Jam1wCW5lYXIgLm5leHRjb2x1bW4KLQlhbGlnbngJMTYsNwotCi0uY29sdW1uRENUOgotCXB1c2gJZWN4CTsgY3RyCi0JcHVzaAllc2kJOyBjb2VmX2Jsb2NrCi0JcHVzaAllZHgJOyBxdWFudHB0cgotCi0JbW92CVBPSU5URVIgW3B0cl0sIGVkaQk7IHdzcHRyCi0KLQk7IC0tIEV2ZW4gcGFydAotCi0JbW92c3gJZWF4LCBKQ09FRiBbQ09MKDAsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92c3gJZWN4LCBKQ09FRiBbQ09MKDQsZXNpLFNJWkVPRl9KQ09FRildCi0JaW11bAlheCwgSVNMT1dfTVVMVF9UWVBFIFtDT0woMCxlZHgsU0laRU9GX0lTTE9XX01VTFRfVFlQRSldCi0JaW11bAljeCwgSVNMT1dfTVVMVF9UWVBFIFtDT0woNCxlZHgsU0laRU9GX0lTTE9XX01VTFRfVFlQRSldCi0JbW92c3gJZWJ4LCBKQ09FRiBbQ09MKDIsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92c3gJZWRpLCBKQ09FRiBbQ09MKDYsZXNpLFNJWkVPRl9KQ09FRildCi0JaW11bAlieCwgSVNMT1dfTVVMVF9UWVBFIFtDT0woMixlZHgsU0laRU9GX0lTTE9XX01VTFRfVFlQRSldCi0JaW11bAlkaSwgSVNMT1dfTVVMVF9UWVBFIFtDT0woNixlZHgsU0laRU9GX0lTTE9XX01VTFRfVFlQRSldCi0KLQlsZWEJZWR4LFtlYXgrZWN4XQotCXN1YgllYXgsZWN4Ci0Jc2FsCWVkeCxDT05TVF9CSVRTCTsgZWR4PXRtcDAKLQlzYWwJZWF4LENPTlNUX0JJVFMJOyBlYXg9dG1wMQotCi0JbGVhCWVjeCxbZWJ4K2VkaV0KLQlpbXVsCWVjeCwoRl8wXzU0MSkJOyBlY3g9ejEKLQlpbXVsCWVieCwoRl8wXzc2NSkJOyBlYng9TVVMVElQTFkoejIsRklYXzBfNzY1MzY2ODY1KQotCWltdWwJZWRpLCgtRl8xXzg0NykJOyBlZGk9TVVMVElQTFkoejMsLUZJWF8xXzg0Nzc1OTA2NSkKLQlhZGQJZWJ4LGVjeAkJOyBlYng9dG1wMwotCWFkZAllZGksZWN4CQk7IGVkaT10bXAyCi0KLQlsZWEJZWN4LFtlZHgrZWJ4XQk7IGVjeD10bXAxMAotCXN1YgllZHgsZWJ4CQk7IGVkeD10bXAxMwotCWxlYQllYngsW2VheCtlZGldCTsgZWJ4PXRtcDExCi0Jc3ViCWVheCxlZGkJCTsgZWF4PXRtcDEyCi0KLQlwdXNoCWVkeAkJOyB0bXAxMwotCXB1c2gJZWF4CQk7IHRtcDEyCi0JcHVzaAllYngJCTsgdG1wMTEKLQlwdXNoCWVjeAkJOyB0bXAxMAotCi0JOyAtLSBPZGQgcGFydAotCi0JbW92CWVkeCwgUE9JTlRFUiBbZXNwKzE2XQk7IHF1YW50cHRyCi0KLQltb3ZzeAllYXgsIEpDT0VGIFtDT0woMSxlc2ksU0laRU9GX0pDT0VGKV0KLQltb3ZzeAllZGksIEpDT0VGIFtDT0woMyxlc2ksU0laRU9GX0pDT0VGKV0KLQlpbXVsCWF4LCBJU0xPV19NVUxUX1RZUEUgW0NPTCgxLGVkeCxTSVpFT0ZfSVNMT1dfTVVMVF9UWVBFKV0KLQlpbXVsCWRpLCBJU0xPV19NVUxUX1RZUEUgW0NPTCgzLGVkeCxTSVpFT0ZfSVNMT1dfTVVMVF9UWVBFKV0KLQltb3ZzeAllY3gsIEpDT0VGIFtDT0woNSxlc2ksU0laRU9GX0pDT0VGKV0KLQltb3ZzeAllYngsIEpDT0VGIFtDT0woNyxlc2ksU0laRU9GX0pDT0VGKV0KLQlpbXVsCWN4LCBJU0xPV19NVUxUX1RZUEUgW0NPTCg1LGVkeCxTSVpFT0ZfSVNMT1dfTVVMVF9UWVBFKV0KLQlpbXVsCWJ4LCBJU0xPV19NVUxUX1RZUEUgW0NPTCg3LGVkeCxTSVpFT0ZfSVNMT1dfTVVMVF9UWVBFKV0KLQotCXB1c2gJZWF4CQk7IGVheD10bXAzCi0JcHVzaAllZGkJCTsgZWRpPXRtcDIKLQlwdXNoCWVjeAkJOyBlY3g9dG1wMQotCXB1c2gJZWJ4CQk7IGVieD10bXAwCi0KLQlsZWEJZXNpLFtlYngrZWRpXQk7IGVzaT16MwotCWxlYQllZHgsW2VjeCtlYXhdCTsgZWR4PXo0Ci0JYWRkCWVieCxlYXgJCTsgZWJ4PXoxCi0JYWRkCWVjeCxlZGkJCTsgZWN4PXoyCi0KLQlsZWEJZWF4LFtlc2krZWR4XQotCWltdWwJZWF4LChGXzFfMTc1KQk7IGVheD16NQotCi0JaW11bAllc2ksKC1GXzFfOTYxKQk7IGVzaT16Myg9TVVMVElQTFkoejMsLUZJWF8xXzk2MTU3MDU2MCkpCi0JaW11bAllZHgsKC1GXzBfMzkwKQk7IGVkeD16NCg9TVVMVElQTFkoejQsLUZJWF8wXzM5MDE4MDY0NCkpCi0JaW11bAllYngsKC1GXzBfODk5KQk7IGVieD16MSg9TVVMVElQTFkoejEsLUZJWF8wXzg5OTk3NjIyMykpCi0JaW11bAllY3gsKC1GXzJfNTYyKQk7IGVjeD16Mig9TVVMVElQTFkoejIsLUZJWF8yXzU2MjkxNTQ0NykpCi0KLQlhZGQJZXNpLGVheAkJOyBlc2k9ejMoPXozK3o1KQotCWFkZAllZHgsZWF4CQk7IGVkeD16NCg9ejQrejUpCi0KLQlsZWEJZWRpLFtlc2krZWJ4XQk7IGVkaT16MSt6MwotCWxlYQllYXgsW2VkeCtlY3hdCTsgZWF4PXoyK3o0Ci0JYWRkCWVzaSxlY3gJCTsgZXNpPXoyK3ozCi0JYWRkCWVkeCxlYngJCTsgZWR4PXoxK3o0Ci0KLQlwb3AJZWN4CQk7IGVjeD10bXAwCi0JcG9wCWVieAkJOyBlYng9dG1wMQotCWltdWwJZWN4LChGXzBfMjk4KQk7IGVjeD10bXAwKD1NVUxUSVBMWSh0bXAwLEZJWF8wXzI5ODYzMTMzNikpCi0JaW11bAllYngsKEZfMl8wNTMpCTsgZWJ4PXRtcDEoPU1VTFRJUExZKHRtcDEsRklYXzJfMDUzMTE5ODY5KSkKLQlhZGQJZWRpLGVjeAkJOyBlZGk9dG1wMCg9dG1wMCt6MSt6MykKLQlhZGQJZWF4LGVieAkJOyBlYXg9dG1wMSg9dG1wMSt6Mit6NCkKLQotCXBvcAllY3gJCTsgZWN4PXRtcDIKLQlwb3AJZWJ4CQk7IGVieD10bXAzCi0JaW11bAllY3gsKEZfM18wNzIpCTsgZWN4PXRtcDIoPU1VTFRJUExZKHRtcDIsRklYXzNfMDcyNzExMDI2KSkKLQlpbXVsCWVieCwoRl8xXzUwMSkJOyBlYng9dG1wMyg9TVVMVElQTFkodG1wMyxGSVhfMV81MDEzMjExMTApKQotCWFkZAllc2ksZWN4CQk7IGVzaT10bXAyKD10bXAyK3oyK3ozKQotCWFkZAllZHgsZWJ4CQk7IGVkeD10bXAzKD10bXAzK3oxK3o0KQotCi0JOyAtLSBGaW5hbCBvdXRwdXQgc3RhZ2UKLQotCXBvcAllY3gJCTsgZWN4PXRtcDEwCi0JcG9wCWVieAkJOyBlYng9dG1wMTEKLQlwdXNoCWVheAkJOyB0bXAxCi0JcHVzaAllZGkJCTsgdG1wMAotCi0JbGVhCWVheCxbZWN4K2VkeF0JOyBlYXg9ZGF0YTAoPXRtcDEwK3RtcDMpCi0Jc3ViCWVjeCxlZHgJCTsgZWN4PWRhdGE3KD10bXAxMC10bXAzKQotCWxlYQllZHgsW2VieCtlc2ldCTsgZWR4PWRhdGExKD10bXAxMSt0bXAyKQotCXN1YgllYngsZXNpCQk7IGVieD1kYXRhNig9dG1wMTEtdG1wMikKLQotCW1vdgllZGksIFBPSU5URVIgW3B0cl0JOyBlZGk9d3NwdHIKLQotCWRlc2NhbGUJZWF4LChDT05TVF9CSVRTLVBBU1MxX0JJVFMpCi0JZGVzY2FsZQllY3gsKENPTlNUX0JJVFMtUEFTUzFfQklUUykKLQlkZXNjYWxlCWVkeCwoQ09OU1RfQklUUy1QQVNTMV9CSVRTKQotCWRlc2NhbGUJZWJ4LChDT05TVF9CSVRTLVBBU1MxX0JJVFMpCi0KLQltb3YJSU5UIFtDT0woMCxlZGksU0laRU9GX0lOVCldLCBlYXgKLQltb3YJSU5UIFtDT0woNyxlZGksU0laRU9GX0lOVCldLCBlY3gKLQltb3YJSU5UIFtDT0woMSxlZGksU0laRU9GX0lOVCldLCBlZHgKLQltb3YJSU5UIFtDT0woNixlZGksU0laRU9GX0lOVCldLCBlYngKLQotCXBvcAllc2kJCTsgZXNpPXRtcDAKLQlwb3AJZWF4CQk7IGVheD10bXAxCi0JcG9wCWVjeAkJOyBlY3g9dG1wMTIKLQlwb3AJZWR4CQk7IGVkeD10bXAxMwotCi0JbGVhCWVieCxbZWN4K2VheF0JOyBlYng9ZGF0YTIoPXRtcDEyK3RtcDEpCi0Jc3ViCWVjeCxlYXgJCTsgZWN4PWRhdGE1KD10bXAxMi10bXAxKQotCWxlYQllYXgsW2VkeCtlc2ldCTsgZWF4PWRhdGEzKD10bXAxMyt0bXAwKQotCXN1YgllZHgsZXNpCQk7IGVkeD1kYXRhNCg9dG1wMTMtdG1wMCkKLQotCWRlc2NhbGUJZWJ4LChDT05TVF9CSVRTLVBBU1MxX0JJVFMpCi0JZGVzY2FsZQllY3gsKENPTlNUX0JJVFMtUEFTUzFfQklUUykKLQlkZXNjYWxlCWVheCwoQ09OU1RfQklUUy1QQVNTMV9CSVRTKQotCWRlc2NhbGUJZWR4LChDT05TVF9CSVRTLVBBU1MxX0JJVFMpCi0KLQltb3YJSU5UIFtDT0woMixlZGksU0laRU9GX0lOVCldLCBlYngKLQltb3YJSU5UIFtDT0woNSxlZGksU0laRU9GX0lOVCldLCBlY3gKLQltb3YJSU5UIFtDT0woMyxlZGksU0laRU9GX0lOVCldLCBlYXgKLQltb3YJSU5UIFtDT0woNCxlZGksU0laRU9GX0lOVCldLCBlZHgKLQotCXBvcAllZHgJOyBxdWFudHB0cgotCXBvcAllc2kJOyBjb2VmX2Jsb2NrCi0JcG9wCWVjeAk7IGN0cgotCi0ubmV4dGNvbHVtbjoKLQlhZGQJZXNpLCBieXRlIFNJWkVPRl9KQ09FRgk7IGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4KLQlhZGQJZWR4LCBieXRlIFNJWkVPRl9JU0xPV19NVUxUX1RZUEUKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9JTlQKLQlkZWMJZWN4Ci0Jam56CW5lYXIgLmNvbHVtbmxvb3AKLQotCTsgLS0tLSBQYXNzIDI6IHByb2Nlc3Mgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LgotCi0JbW92CWVheCwgUE9JTlRFUiBbY2luZm8oZWJwKV0KLQltb3YJZWF4LCBQT0lOVEVSIFtqZHN0cnVjdF9zYW1wbGVfcmFuZ2VfbGltaXQoZWF4KV0KLQlzdWIJZWF4LCBieXRlIC1DRU5URVJKU0FNUExFKlNJWkVPRl9KU0FNUExFCTsgSlNBTVBMRSAqIHJhbmdlX2xpbWl0Ci0JbW92CVBPSU5URVIgW3JhbmdlX2xpbWl0XSwgZWF4Ci0KLQlsZWEJZXNpLCBbd29ya3NwYWNlXQkJCTsgaW50ICogd3NwdHIKLQltb3YJZWRpLCBKU0FNUEFSUkFZIFtvdXRwdXRfYnVmKGVicCldCTsgKEpTQU1QUk9XICopCi0JbW92CWVjeCwgRENUU0laRQkJCQk7IGN0cgotCWFsaWdueAkxNiw3Ci0ucm93bG9vcDoKLQlwdXNoCWVkaQotCW1vdgllZGksIEpTQU1QUk9XIFtlZGldCQkJOyAoSlNBTVBMRSAqKQotCWFkZAllZGksIEpESU1FTlNJT04gW291dHB1dF9jb2woZWJwKV0JOyBlZGk9b3V0cHRyCi0KLSVpZm5kZWYgTk9fWkVST19ST1dfVEVTVAotCW1vdgllYXgsIElOVCBbUk9XKDEsZXNpLFNJWkVPRl9JTlQpXQotCW9yCWVheCwgSU5UIFtST1coMixlc2ksU0laRU9GX0lOVCldCi0Jam56CXNob3J0IC5yb3dEQ1QKLQotCW1vdgllYngsIElOVCBbUk9XKDMsZXNpLFNJWkVPRl9JTlQpXQotCW1vdgllYXgsIElOVCBbUk9XKDQsZXNpLFNJWkVPRl9JTlQpXQotCW9yCWVieCwgSU5UIFtST1coNSxlc2ksU0laRU9GX0lOVCldCi0Jb3IJZWF4LCBJTlQgW1JPVyg2LGVzaSxTSVpFT0ZfSU5UKV0KLQlvcgllYngsIElOVCBbUk9XKDcsZXNpLFNJWkVPRl9JTlQpXQotCW9yCWVheCxlYngKLQlqbnoJc2hvcnQgLnJvd0RDVAotCi0JOyAtLSBBQyB0ZXJtcyBhbGwgemVybwotCi0JbW92CWVheCwgSU5UIFtST1coMCxlc2ksU0laRU9GX0lOVCldCi0KLQltb3YJZWR4LCBQT0lOVEVSIFtyYW5nZV9saW1pdF0JOyAoSlNBTVBMRSAqKQotCi0JZGVzY2FsZQllYXgsKFBBU1MxX0JJVFMrMykKLQlhbmQJZWF4LFJBTkdFX01BU0sKLQltb3YJYWwsIEpTQU1QTEUgW2VkeCtlYXgqU0laRU9GX0pTQU1QTEVdCi0JbW92CUpTQU1QTEUgW2VkaSswKlNJWkVPRl9KU0FNUExFXSwgYWwKLQltb3YJSlNBTVBMRSBbZWRpKzEqU0laRU9GX0pTQU1QTEVdLCBhbAotCW1vdglKU0FNUExFIFtlZGkrMipTSVpFT0ZfSlNBTVBMRV0sIGFsCi0JbW92CUpTQU1QTEUgW2VkaSszKlNJWkVPRl9KU0FNUExFXSwgYWwKLQltb3YJSlNBTVBMRSBbZWRpKzQqU0laRU9GX0pTQU1QTEVdLCBhbAotCW1vdglKU0FNUExFIFtlZGkrNSpTSVpFT0ZfSlNBTVBMRV0sIGFsCi0JbW92CUpTQU1QTEUgW2VkaSs2KlNJWkVPRl9KU0FNUExFXSwgYWwKLQltb3YJSlNBTVBMRSBbZWRpKzcqU0laRU9GX0pTQU1QTEVdLCBhbAotCWptcAluZWFyIC5uZXh0cm93Ci0JYWxpZ254CTE2LDcKLSVlbmRpZgotLnJvd0RDVDoKLQlwdXNoCWVzaQk7IHdzcHRyCi0JcHVzaAllY3gJOyBjdHIKLQotCW1vdglQT0lOVEVSIFtwdHJdLCBlZGkJOyBvdXRwdHIKLQotCTsgLS0gRXZlbiBwYXJ0Ci0KLQltb3YJZWF4LCBJTlQgW1JPVygwLGVzaSxTSVpFT0ZfSU5UKV0KLQltb3YJZWJ4LCBJTlQgW1JPVygyLGVzaSxTSVpFT0ZfSU5UKV0KLQltb3YJZWN4LCBJTlQgW1JPVyg0LGVzaSxTSVpFT0ZfSU5UKV0KLQltb3YJZWRpLCBJTlQgW1JPVyg2LGVzaSxTSVpFT0ZfSU5UKV0KLQotCWxlYQllZHgsW2VheCtlY3hdCi0Jc3ViCWVheCxlY3gKLQlzYWwJZWR4LENPTlNUX0JJVFMJOyBlZHg9dG1wMAotCXNhbAllYXgsQ09OU1RfQklUUwk7IGVheD10bXAxCi0KLQlsZWEJZWN4LFtlYngrZWRpXQotCWltdWwJZWN4LChGXzBfNTQxKQk7IGVjeD16MQotCWltdWwJZWJ4LChGXzBfNzY1KQk7IGVieD1NVUxUSVBMWSh6MixGSVhfMF83NjUzNjY4NjUpCi0JaW11bAllZGksKC1GXzFfODQ3KQk7IGVkaT1NVUxUSVBMWSh6MywtRklYXzFfODQ3NzU5MDY1KQotCWFkZAllYngsZWN4CQk7IGVieD10bXAzCi0JYWRkCWVkaSxlY3gJCTsgZWRpPXRtcDIKLQotCWxlYQllY3gsW2VkeCtlYnhdCTsgZWN4PXRtcDEwCi0Jc3ViCWVkeCxlYngJCTsgZWR4PXRtcDEzCi0JbGVhCWVieCxbZWF4K2VkaV0JOyBlYng9dG1wMTEKLQlzdWIJZWF4LGVkaQkJOyBlYXg9dG1wMTIKLQotCXB1c2gJZWR4CQk7IHRtcDEzCi0JcHVzaAllYXgJCTsgdG1wMTIKLQlwdXNoCWVieAkJOyB0bXAxMQotCXB1c2gJZWN4CQk7IHRtcDEwCi0KLQk7IC0tIE9kZCBwYXJ0Ci0KLQltb3YJZWF4LCBJTlQgW1JPVygxLGVzaSxTSVpFT0ZfSU5UKV0KLQltb3YJZWRpLCBJTlQgW1JPVygzLGVzaSxTSVpFT0ZfSU5UKV0KLQltb3YJZWN4LCBJTlQgW1JPVyg1LGVzaSxTSVpFT0ZfSU5UKV0KLQltb3YJZWJ4LCBJTlQgW1JPVyg3LGVzaSxTSVpFT0ZfSU5UKV0KLQotCXB1c2gJZWF4CQk7IGVheD10bXAzCi0JcHVzaAllZGkJCTsgZWRpPXRtcDIKLQlwdXNoCWVjeAkJOyBlY3g9dG1wMQotCXB1c2gJZWJ4CQk7IGVieD10bXAwCi0KLQlsZWEJZXNpLFtlYngrZWRpXQk7IGVzaT16MwotCWxlYQllZHgsW2VjeCtlYXhdCTsgZWR4PXo0Ci0JYWRkCWVieCxlYXgJCTsgZWJ4PXoxCi0JYWRkCWVjeCxlZGkJCTsgZWN4PXoyCi0KLQlsZWEJZWF4LFtlc2krZWR4XQotCWltdWwJZWF4LChGXzFfMTc1KQk7IGVheD16NQotCi0JaW11bAllc2ksKC1GXzFfOTYxKQk7IGVzaT16Myg9TVVMVElQTFkoejMsLUZJWF8xXzk2MTU3MDU2MCkpCi0JaW11bAllZHgsKC1GXzBfMzkwKQk7IGVkeD16NCg9TVVMVElQTFkoejQsLUZJWF8wXzM5MDE4MDY0NCkpCi0JaW11bAllYngsKC1GXzBfODk5KQk7IGVieD16MSg9TVVMVElQTFkoejEsLUZJWF8wXzg5OTk3NjIyMykpCi0JaW11bAllY3gsKC1GXzJfNTYyKQk7IGVjeD16Mig9TVVMVElQTFkoejIsLUZJWF8yXzU2MjkxNTQ0NykpCi0KLQlhZGQJZXNpLGVheAkJOyBlc2k9ejMoPXozK3o1KQotCWFkZAllZHgsZWF4CQk7IGVkeD16NCg9ejQrejUpCi0KLQlsZWEJZWRpLFtlc2krZWJ4XQk7IGVkaT16MSt6MwotCWxlYQllYXgsW2VkeCtlY3hdCTsgZWF4PXoyK3o0Ci0JYWRkCWVzaSxlY3gJCTsgZXNpPXoyK3ozCi0JYWRkCWVkeCxlYngJCTsgZWR4PXoxK3o0Ci0KLQlwb3AJZWN4CQk7IGVjeD10bXAwCi0JcG9wCWVieAkJOyBlYng9dG1wMQotCWltdWwJZWN4LChGXzBfMjk4KQk7IGVjeD10bXAwKD1NVUxUSVBMWSh0bXAwLEZJWF8wXzI5ODYzMTMzNikpCi0JaW11bAllYngsKEZfMl8wNTMpCTsgZWJ4PXRtcDEoPU1VTFRJUExZKHRtcDEsRklYXzJfMDUzMTE5ODY5KSkKLQlhZGQJZWRpLGVjeAkJOyBlZGk9dG1wMCg9dG1wMCt6MSt6MykKLQlhZGQJZWF4LGVieAkJOyBlYXg9dG1wMSg9dG1wMSt6Mit6NCkKLQotCXBvcAllY3gJCTsgZWN4PXRtcDIKLQlwb3AJZWJ4CQk7IGVieD10bXAzCi0JaW11bAllY3gsKEZfM18wNzIpCTsgZWN4PXRtcDIoPU1VTFRJUExZKHRtcDIsRklYXzNfMDcyNzExMDI2KSkKLQlpbXVsCWVieCwoRl8xXzUwMSkJOyBlYng9dG1wMyg9TVVMVElQTFkodG1wMyxGSVhfMV81MDEzMjExMTApKQotCWFkZAllc2ksZWN4CQk7IGVzaT10bXAyKD10bXAyK3oyK3ozKQotCWFkZAllZHgsZWJ4CQk7IGVkeD10bXAzKD10bXAzK3oxK3o0KQotCi0JOyAtLSBGaW5hbCBvdXRwdXQgc3RhZ2UKLQotCXBvcAllY3gJCTsgZWN4PXRtcDEwCi0JcG9wCWVieAkJOyBlYng9dG1wMTEKLQlwdXNoCWVheAkJOyB0bXAxCi0JcHVzaAllZGkJCTsgdG1wMAotCi0JbGVhCWVheCxbZWN4K2VkeF0JOyBlYXg9ZGF0YTAoPXRtcDEwK3RtcDMpCi0Jc3ViCWVjeCxlZHgJCTsgZWN4PWRhdGE3KD10bXAxMC10bXAzKQotCWxlYQllZHgsW2VieCtlc2ldCTsgZWR4PWRhdGExKD10bXAxMSt0bXAyKQotCXN1YgllYngsZXNpCQk7IGVieD1kYXRhNig9dG1wMTEtdG1wMikKLQotCW1vdgllc2ksIFBPSU5URVIgW3JhbmdlX2xpbWl0XQk7IChKU0FNUExFICopCi0KLQlkZXNjYWxlCWVheCwoQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCi0JZGVzY2FsZQllY3gsKENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQotCWRlc2NhbGUJZWR4LChDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKLQlkZXNjYWxlCWVieCwoQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCi0KLQltb3YJZWRpLCBQT0lOVEVSIFtwdHJdCQk7IGVkaT1vdXRwdHIKLQotCWFuZAllYXgsUkFOR0VfTUFTSwotCWFuZAllY3gsUkFOR0VfTUFTSwotCWFuZAllZHgsUkFOR0VfTUFTSwotCWFuZAllYngsUkFOR0VfTUFTSwotCi0JbW92CWFsLCBKU0FNUExFIFtlc2krZWF4KlNJWkVPRl9KU0FNUExFXQotCW1vdgljbCwgSlNBTVBMRSBbZXNpK2VjeCpTSVpFT0ZfSlNBTVBMRV0KLQltb3YJZGwsIEpTQU1QTEUgW2VzaStlZHgqU0laRU9GX0pTQU1QTEVdCi0JbW92CWJsLCBKU0FNUExFIFtlc2krZWJ4KlNJWkVPRl9KU0FNUExFXQotCi0JbW92CUpTQU1QTEUgW2VkaSswKlNJWkVPRl9KU0FNUExFXSwgYWwKLQltb3YJSlNBTVBMRSBbZWRpKzcqU0laRU9GX0pTQU1QTEVdLCBjbAotCW1vdglKU0FNUExFIFtlZGkrMSpTSVpFT0ZfSlNBTVBMRV0sIGRsCi0JbW92CUpTQU1QTEUgW2VkaSs2KlNJWkVPRl9KU0FNUExFXSwgYmwKLQotCXBvcAllc2kJCTsgZXNpPXRtcDAKLQlwb3AJZWF4CQk7IGVheD10bXAxCi0JcG9wCWVjeAkJOyBlY3g9dG1wMTIKLQlwb3AJZWR4CQk7IGVkeD10bXAxMwotCi0JbGVhCWVieCxbZWN4K2VheF0JOyBlYng9ZGF0YTIoPXRtcDEyK3RtcDEpCi0Jc3ViCWVjeCxlYXgJCTsgZWN4PWRhdGE1KD10bXAxMi10bXAxKQotCWxlYQllYXgsW2VkeCtlc2ldCTsgZWF4PWRhdGEzKD10bXAxMyt0bXAwKQotCXN1YgllZHgsZXNpCQk7IGVkeD1kYXRhNCg9dG1wMTMtdG1wMCkKLQotCW1vdgllc2ksIFBPSU5URVIgW3JhbmdlX2xpbWl0XQk7IChKU0FNUExFICopCi0KLQlkZXNjYWxlCWVieCwoQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCi0JZGVzY2FsZQllY3gsKENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQotCWRlc2NhbGUJZWF4LChDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKLQlkZXNjYWxlCWVkeCwoQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCi0KLQlhbmQJZWJ4LFJBTkdFX01BU0sKLQlhbmQJZWN4LFJBTkdFX01BU0sKLQlhbmQJZWF4LFJBTkdFX01BU0sKLQlhbmQJZWR4LFJBTkdFX01BU0sKLQotCW1vdglibCwgSlNBTVBMRSBbZXNpK2VieCpTSVpFT0ZfSlNBTVBMRV0KLQltb3YJY2wsIEpTQU1QTEUgW2VzaStlY3gqU0laRU9GX0pTQU1QTEVdCi0JbW92CWFsLCBKU0FNUExFIFtlc2krZWF4KlNJWkVPRl9KU0FNUExFXQotCW1vdglkbCwgSlNBTVBMRSBbZXNpK2VkeCpTSVpFT0ZfSlNBTVBMRV0KLQotCW1vdglKU0FNUExFIFtlZGkrMipTSVpFT0ZfSlNBTVBMRV0sIGJsCi0JbW92CUpTQU1QTEUgW2VkaSs1KlNJWkVPRl9KU0FNUExFXSwgY2wKLQltb3YJSlNBTVBMRSBbZWRpKzMqU0laRU9GX0pTQU1QTEVdLCBhbAotCW1vdglKU0FNUExFIFtlZGkrNCpTSVpFT0ZfSlNBTVBMRV0sIGRsCi0KLQlwb3AJZWN4CTsgY3RyCi0JcG9wCWVzaQk7IHdzcHRyCi0KLS5uZXh0cm93OgotCXBvcAllZGkKLQlhZGQJZXNpLCBieXRlIERDVFNJWkUqU0laRU9GX0lOVAk7IGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdwotCWFkZAllZGksIGJ5dGUgU0laRU9GX0pTQU1QUk9XCi0JZGVjCWVjeAotCWpuegluZWFyIC5yb3dsb29wCi0KLQlwb3AJZWRpCi0JcG9wCWVzaQotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXBvcAllYngKLQltb3YJZXNwLGVicAotCXBvcAllYnAKLQlyZXQKLQotJWVuZGlmIDsgRENUX0lTTE9XX1NVUFBPUlRFRApkaWZmIC0tZ2l0IGEvdW51c2VkL2ppZGN0aW50LmMgYi9qaWRjdGludC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB1bnVzZWQvamlkY3RpbnQuYwpyZW5hbWUgdG8gamlkY3RpbnQuYwpkaWZmIC0tZ2l0IGEvamlkY3RyZWQuYXNtIGIvamlkY3RyZWQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDYzYmZiLi4wMDAwMDAwCi0tLSBhL2ppZGN0cmVkLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDY4OCArMCwwIEBACi07Ci07IGppZGN0cmVkLmFzbSAtIHJlZHVjZWQtc2l6ZSBJRENUIChub24tU0lNRCkKLTsKLTsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Ci07IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi07IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKLTsKLTsgVGhpcyBmaWxlIHNob3VsZCBiZSBhc3NlbWJsZWQgd2l0aCBOQVNNIChOZXR3aWRlIEFzc2VtYmxlciksCi07IGNhbiAqbm90KiBiZSBhc3NlbWJsZWQgd2l0aCBNaWNyb3NvZnQncyBNQVNNIG9yIGFueSBjb21wYXRpYmxlCi07IGFzc2VtYmxlciAoaW5jbHVkaW5nIEJvcmxhbmQncyBUdXJibyBBc3NlbWJsZXIpLgotOyBOQVNNIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9uYXNtLnNvdXJjZWZvcmdlLm5ldC8gb3IKLTsgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NjIwOAotOwotOyBUaGlzIGZpbGUgY29udGFpbnMgaW52ZXJzZS1EQ1Qgcm91dGluZXMgdGhhdCBwcm9kdWNlIHJlZHVjZWQtc2l6ZSBvdXRwdXQ6Ci07IGVpdGhlciA0eDQsIDJ4Miwgb3IgMXgxIHBpeGVscyBmcm9tIGFuIDh4OCBEQ1QgYmxvY2suCi07IFRoZSBmb2xsb3dpbmcgY29kZSBpcyBiYXNlZCBkaXJlY3RseSBvbiB0aGUgSUpHJ3Mgb3JpZ2luYWwgamlkY3RyZWQuYzsKLTsgc2VlIHRoZSBqaWRjdHJlZC5jIGZvciBtb3JlIGRldGFpbHMuCi07Ci07IExhc3QgTW9kaWZpZWQgOiBPY3RvYmVyIDE3LCAyMDA0Ci07Ci07IFtUQUI4XQotCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotJWluY2x1ZGUgImpkY3QuaW5jIgotCi0laWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAotCi07IFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotOwotJWlmIERDVFNJWkUgIT0gOAotJWVycm9yICJTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4iCi0lZW5kaWYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi07IERlc2NhbGUgYW5kIGNvcnJlY3RseSByb3VuZCBhIERXT1JEIHZhbHVlIHRoYXQncyBzY2FsZWQgYnkgTiBiaXRzLgotOwotJW1hY3JvCWRlc2NhbGUgMgotJWlmICglMik8PTcKLQlhZGQJJTEsIGJ5dGUgKDE8PCgoJTIpLTEpKQk7IGFkZCByZWczMixpbW04Ci0lZWxzZQotCWFkZAklMSwgKDE8PCgoJTIpLTEpKQk7IGFkZCByZWczMixpbW0zMgotJWVuZGlmCi0Jc2FyCSUxLCUyCi0lZW5kbWFjcm8KLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0lZGVmaW5lIENPTlNUX0JJVFMJMTMKLSVkZWZpbmUgUEFTUzFfQklUUwkyCi0KLSVpZiBDT05TVF9CSVRTID09IDEzCi1GXzBfMjExCWVxdQkgMTczMAkJOyBGSVgoMC4yMTExNjQyNDMpCi1GXzBfNTA5CWVxdQkgNDE3NgkJOyBGSVgoMC41MDk3OTU1NzkpCi1GXzBfNjAxCWVxdQkgNDkyNgkJOyBGSVgoMC42MDEzNDQ4ODcpCi1GXzBfNzIwCWVxdQkgNTkwNgkJOyBGSVgoMC43MjA5NTk4MjIpCi1GXzBfNzY1CWVxdQkgNjI3MAkJOyBGSVgoMC43NjUzNjY4NjUpCi1GXzBfODUwCWVxdQkgNjk2NwkJOyBGSVgoMC44NTA0MzAwOTUpCi1GXzBfODk5CWVxdQkgNzM3MwkJOyBGSVgoMC44OTk5NzYyMjMpCi1GXzFfMDYxCWVxdQkgODY5NwkJOyBGSVgoMS4wNjE1OTQzMzcpCi1GXzFfMjcyCWVxdQkxMDQyNgkJOyBGSVgoMS4yNzI3NTg1ODApCi1GXzFfNDUxCWVxdQkxMTg5MwkJOyBGSVgoMS40NTE3NzQ5ODEpCi1GXzFfODQ3CWVxdQkxNTEzNwkJOyBGSVgoMS44NDc3NTkwNjUpCi1GXzJfMTcyCWVxdQkxNzc5OQkJOyBGSVgoMi4xNzI3MzQ4MDMpCi1GXzJfNTYyCWVxdQkyMDk5NQkJOyBGSVgoMi41NjI5MTU0NDcpCi1GXzNfNjI0CWVxdQkyOTY5MgkJOyBGSVgoMy42MjQ1MDk3ODUpCi0lZWxzZQotOyBOQVNNIGNhbm5vdCBkbyBjb21waWxlLXRpbWUgYXJpdGhtZXRpYyBvbiBmbG9hdGluZy1wb2ludCBjb25zdGFudHMuCi0lZGVmaW5lIERFU0NBTEUoeCxuKSAgKCgoeCkrKDE8PCgobiktMSkpKT4+KG4pKQotRl8wXzIxMQllcXUJREVTQ0FMRSggMjI2NzM1ODc5LDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuMjExMTY0MjQzKQotRl8wXzUwOQllcXUJREVTQ0FMRSggNTQ3Mzg4ODM0LDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuNTA5Nzk1NTc5KQotRl8wXzYwMQllcXUJREVTQ0FMRSggNjQ1Njg5MTU1LDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuNjAxMzQ0ODg3KQotRl8wXzcyMAllcXUJREVTQ0FMRSggNzc0MTI0NzE0LDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuNzIwOTU5ODIyKQotRl8wXzc2NQllcXUJREVTQ0FMRSggODIxODA2NDEzLDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuNzY1MzY2ODY1KQotRl8wXzg1MAllcXUJREVTQ0FMRSggOTEzMTQyMzYxLDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuODUwNDMwMDk1KQotRl8wXzg5OQllcXUJREVTQ0FMRSggOTY2MzQyMTExLDMwLUNPTlNUX0JJVFMpCTsgRklYKDAuODk5OTc2MjIzKQotRl8xXzA2MQllcXUJREVTQ0FMRSgxMTM5ODc4MjM5LDMwLUNPTlNUX0JJVFMpCTsgRklYKDEuMDYxNTk0MzM3KQotRl8xXzI3MgllcXUJREVTQ0FMRSgxMzY2NjE0MTE5LDMwLUNPTlNUX0JJVFMpCTsgRklYKDEuMjcyNzU4NTgwKQotRl8xXzQ1MQllcXUJREVTQ0FMRSgxNTU4ODMxNTE2LDMwLUNPTlNUX0JJVFMpCTsgRklYKDEuNDUxNzc0OTgxKQotRl8xXzg0NwllcXUJREVTQ0FMRSgxOTg0MDE2MTg4LDMwLUNPTlNUX0JJVFMpCTsgRklYKDEuODQ3NzU5MDY1KQotRl8yXzE3MgllcXUJREVTQ0FMRSgyMzMyOTU2MjMwLDMwLUNPTlNUX0JJVFMpCTsgRklYKDIuMTcyNzM0ODAzKQotRl8yXzU2MgllcXUJREVTQ0FMRSgyNzUxOTA5NTA2LDMwLUNPTlNUX0JJVFMpCTsgRklYKDIuNTYyOTE1NDQ3KQotRl8zXzYyNAllcXUJREVTQ0FMRSgzODkxNzg3NzQ3LDMwLUNPTlNUX0JJVFMpCTsgRklYKDMuNjI0NTA5Nzg1KQotJWVuZGlmCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19URVhUCi0JQklUUwkzMgotOwotOyBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAotOyBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgNHg0IG91dHB1dCBibG9jay4KLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfaWRjdF80eDQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotOyAgICAgICAgICAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotOyAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLTsKLQotJWRlZmluZSBjaW5mbyhiKQkoYikrOAkJOyBqX2RlY29tcHJlc3NfcHRyIGNpbmZvCi0lZGVmaW5lIGNvbXBwdHIoYikJKGIpKzEyCQk7IGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyCi0lZGVmaW5lIGNvZWZfYmxvY2soYikJKGIpKzE2CQk7IEpDT0VGUFRSIGNvZWZfYmxvY2sKLSVkZWZpbmUgb3V0cHV0X2J1ZihiKQkoYikrMjAJCTsgSlNBTVBBUlJBWSBvdXRwdXRfYnVmCi0lZGVmaW5lIG91dHB1dF9jb2woYikJKGIpKzI0CQk7IEpESU1FTlNJT04gb3V0cHV0X2NvbAotCi0lZGVmaW5lIHJhbmdlX2xpbWl0CWVicC1TSVpFT0ZfUE9JTlRFUgk7IEpTQU1QTEUgKiByYW5nZV9saW1pdAotJWRlZmluZSB3b3Jrc3BhY2UJcmFuZ2VfbGltaXQtKERDVFNJWkUqNCkqU0laRU9GX0lOVAotCQkJCQk7IGludCB3b3Jrc3BhY2VbRENUU0laRSo0XQotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2lkY3RfNHg0KQotCi1FWFROKGpwZWdfaWRjdF80eDQpOgotCXB1c2gJZWJwCi0JbW92CWVicCxlc3AKLQlsZWEJZXNwLCBbd29ya3NwYWNlXQotCXB1c2gJZWJ4Ci07CXB1c2gJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwdXNoCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwdXNoCWVzaQotCXB1c2gJZWRpCi0KLQk7IC0tLS0gUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LgotCi0JbW92CWVkeCwgUE9JTlRFUiBbY29tcHB0cihlYnApXQotCW1vdgllZHgsIFBPSU5URVIgW2pjb21waW5mb19kY3RfdGFibGUoZWR4KV0JOyBxdWFudHB0cgotCW1vdgllc2ksIEpDT0VGUFRSIFtjb2VmX2Jsb2NrKGVicCldCQk7IGlucHRyCi0JbGVhCWVkaSwgW3dvcmtzcGFjZV0JCQk7IGludCAqIHdzcHRyCi0JbW92CWVjeCwgRENUU0laRQkJCQk7IGN0cgotCWFsaWdueAkxNiw3Ci0uY29sdW1ubG9vcDoKLQk7IERvbid0IGJvdGhlciB0byBwcm9jZXNzIGNvbHVtbiA0LCBiZWNhdXNlIHNlY29uZCBwYXNzIHdvbid0IHVzZSBpdAotCWNtcAllY3gsIGJ5dGUgRENUU0laRS00Ci0JamUJbmVhciAubmV4dGNvbHVtbgotCi0JbW92CWF4LCBKQ09FRiBbQ09MKDEsZXNpLFNJWkVPRl9KQ09FRildCi0Jb3IJYXgsIEpDT0VGIFtDT0woMixlc2ksU0laRU9GX0pDT0VGKV0KLQlqbnoJc2hvcnQgLmNvbHVtbkRDVAotCi0JbW92CWF4LCBKQ09FRiBbQ09MKDMsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92CWJ4LCBKQ09FRiBbQ09MKDUsZXNpLFNJWkVPRl9KQ09FRildCi0Jb3IJYXgsIEpDT0VGIFtDT0woNixlc2ksU0laRU9GX0pDT0VGKV0KLQlvcglieCwgSkNPRUYgW0NPTCg3LGVzaSxTSVpFT0ZfSkNPRUYpXQotCW9yCWF4LGJ4Ci0Jam56CXNob3J0IC5jb2x1bW5EQ1QKLQotCTsgLS0gQUMgdGVybXMgYWxsIHplcm87IHdlIG5lZWQgbm90IGV4YW1pbmUgdGVybSA0IGZvciA0eDQgb3V0cHV0Ci0KLQltb3YJYXgsIEpDT0VGIFtDT0woMCxlc2ksU0laRU9GX0pDT0VGKV0KLQlpbXVsCWF4LCBJU0xPV19NVUxUX1RZUEUgW0NPTCgwLGVkeCxTSVpFT0ZfSVNMT1dfTVVMVF9UWVBFKV0KLQljd2RlCi0KLQlzYWwJZWF4LCBQQVNTMV9CSVRTCi0KLQltb3YJSU5UIFtDT0woMCxlZGksU0laRU9GX0lOVCldLCBlYXgKLQltb3YJSU5UIFtDT0woMSxlZGksU0laRU9GX0lOVCldLCBlYXgKLQltb3YJSU5UIFtDT0woMixlZGksU0laRU9GX0lOVCldLCBlYXgKLQltb3YJSU5UIFtDT0woMyxlZGksU0laRU9GX0lOVCldLCBlYXgKLQlqbXAJbmVhciAubmV4dGNvbHVtbgotCWFsaWdueAkxNiw3Ci0KLS5jb2x1bW5EQ1Q6Ci0JcHVzaAllY3gJOyBjdHIKLQlwdXNoCWVzaQk7IGNvZWZfYmxvY2sKLQlwdXNoCWVkeAk7IHF1YW50cHRyCi0JcHVzaAllZGkJOyB3c3B0cgotCi0JOyAtLSBFdmVuIHBhcnQKLQotCW1vdnN4CWVieCwgSkNPRUYgW0NPTCgyLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdnN4CWVjeCwgSkNPRUYgW0NPTCg2LGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdnN4CWVheCwgSkNPRUYgW0NPTCgwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCWltdWwJYngsIElTTE9XX01VTFRfVFlQRSBbQ09MKDIsZWR4LFNJWkVPRl9JU0xPV19NVUxUX1RZUEUpXQotCWltdWwJY3gsIElTTE9XX01VTFRfVFlQRSBbQ09MKDYsZWR4LFNJWkVPRl9JU0xPV19NVUxUX1RZUEUpXQotCWltdWwJYXgsIElTTE9XX01VTFRfVFlQRSBbQ09MKDAsZWR4LFNJWkVPRl9JU0xPV19NVUxUX1RZUEUpXQotCi0JaW11bAllYngsKEZfMV84NDcpCQk7IGVieD1NVUxUSVBMWSh6MixGSVhfMV84NDc3NTkwNjUpCi0JaW11bAllY3gsKC1GXzBfNzY1KQkJOyBlY3g9TVVMVElQTFkoejMsLUZJWF8wXzc2NTM2Njg2NSkKLQlzYWwJZWF4LChDT05TVF9CSVRTKzEpCTsgZWF4PXRtcDAKLQlhZGQJZWN4LGVieAkJCTsgZWN4PXRtcDIKLQotCWxlYQllZGksW2VheCtlY3hdCQk7IGVkaT10bXAxMAotCXN1YgllYXgsZWN4CQkJOyBlYXg9dG1wMTIKLQotCXB1c2gJZWF4CQk7IHRtcDEyCi0JcHVzaAllZGkJCTsgdG1wMTAKLQotCTsgLS0gT2RkIHBhcnQKLQotCW1vdnN4CWVkaSwgSkNPRUYgW0NPTCg3LGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdnN4CWVjeCwgSkNPRUYgW0NPTCg1LGVzaSxTSVpFT0ZfSkNPRUYpXQotCWltdWwJZGksIElTTE9XX01VTFRfVFlQRSBbQ09MKDcsZWR4LFNJWkVPRl9JU0xPV19NVUxUX1RZUEUpXQotCWltdWwJY3gsIElTTE9XX01VTFRfVFlQRSBbQ09MKDUsZWR4LFNJWkVPRl9JU0xPV19NVUxUX1RZUEUpXQotCW1vdnN4CWVieCwgSkNPRUYgW0NPTCgzLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdnN4CWVheCwgSkNPRUYgW0NPTCgxLGVzaSxTSVpFT0ZfSkNPRUYpXQotCWltdWwJYngsIElTTE9XX01VTFRfVFlQRSBbQ09MKDMsZWR4LFNJWkVPRl9JU0xPV19NVUxUX1RZUEUpXQotCWltdWwJYXgsIElTTE9XX01VTFRfVFlQRSBbQ09MKDEsZWR4LFNJWkVPRl9JU0xPV19NVUxUX1RZUEUpXQotCi0JbW92CWVzaSxlZGkJCTsgZXNpPWVkaT16MQotCW1vdgllZHgsZWN4CQk7IGVkeD1lY3g9ejIKLQlpbXVsCWVkaSwoLUZfMF8yMTEpCTsgZWRpPU1VTFRJUExZKHoxLC1GSVhfMF8yMTExNjQyNDMpCi0JaW11bAllY3gsKEZfMV80NTEpCTsgZWN4PU1VTFRJUExZKHoyLEZJWF8xXzQ1MTc3NDk4MSkKLQlpbXVsCWVzaSwoLUZfMF81MDkpCTsgZXNpPU1VTFRJUExZKHoxLC1GSVhfMF81MDk3OTU1NzkpCi0JaW11bAllZHgsKC1GXzBfNjAxKQk7IGVkeD1NVUxUSVBMWSh6MiwtRklYXzBfNjAxMzQ0ODg3KQotCi0JYWRkCWVkaSxlY3gJCTsgZWRpPSh0bXAwKQotCWFkZAllc2ksZWR4CQk7IGVzaT0odG1wMikKLQotCW1vdgllY3gsZWJ4CQk7IGVjeD1lYng9ejMKLQltb3YJZWR4LGVheAkJOyBlZHg9ZWF4PXo0Ci0JaW11bAllYngsKC1GXzJfMTcyKQk7IGVieD1NVUxUSVBMWSh6MywtRklYXzJfMTcyNzM0ODAzKQotCWltdWwJZWF4LChGXzFfMDYxKQk7IGVheD1NVUxUSVBMWSh6NCxGSVhfMV8wNjE1OTQzMzcpCi0JaW11bAllY3gsKEZfMF84OTkpCTsgZWN4PU1VTFRJUExZKHozLEZJWF8wXzg5OTk3NjIyMykKLQlpbXVsCWVkeCwoRl8yXzU2MikJOyBlZHg9TVVMVElQTFkoejQsRklYXzJfNTYyOTE1NDQ3KQotCi0JYWRkCWVkaSxlYngKLQlhZGQJZXNpLGVjeAotCWFkZAllZGksZWF4CQk7IGVkaT10bXAwCi0JYWRkCWVzaSxlZHgJCTsgZXNpPXRtcDIKLQotCTsgLS0gRmluYWwgb3V0cHV0IHN0YWdlCi0KLQlwb3AJZWJ4CQk7IGVieD10bXAxMAotCXBvcAllY3gJCTsgZWN4PXRtcDEyCi0KLQlsZWEJZWF4LFtlYngrZXNpXQk7IGVheD1kYXRhMCg9dG1wMTArdG1wMikKLQlzdWIJZWJ4LGVzaQkJOyBlYng9ZGF0YTMoPXRtcDEwLXRtcDIpCi0JbGVhCWVkeCxbZWN4K2VkaV0JOyBlZHg9ZGF0YTEoPXRtcDEyK3RtcDApCi0Jc3ViCWVjeCxlZGkJCTsgZWN4PWRhdGEyKD10bXAxMi10bXAwKQotCi0JcG9wCWVkaQk7IHdzcHRyCi0KLQlkZXNjYWxlCWVheCwoQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpCi0JZGVzY2FsZQllYngsKENPTlNUX0JJVFMtUEFTUzFfQklUUysxKQotCWRlc2NhbGUJZWR4LChDT05TVF9CSVRTLVBBU1MxX0JJVFMrMSkKLQlkZXNjYWxlCWVjeCwoQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpCi0KLQltb3YJSU5UIFtDT0woMCxlZGksU0laRU9GX0lOVCldLCBlYXgKLQltb3YJSU5UIFtDT0woMyxlZGksU0laRU9GX0lOVCldLCBlYngKLQltb3YJSU5UIFtDT0woMSxlZGksU0laRU9GX0lOVCldLCBlZHgKLQltb3YJSU5UIFtDT0woMixlZGksU0laRU9GX0lOVCldLCBlY3gKLQotCXBvcAllZHgJOyBxdWFudHB0cgotCXBvcAllc2kJOyBjb2VmX2Jsb2NrCi0JcG9wCWVjeAk7IGN0cgotCi0ubmV4dGNvbHVtbjoKLQlhZGQJZXNpLCBieXRlIFNJWkVPRl9KQ09FRgk7IGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4KLQlhZGQJZWR4LCBieXRlIFNJWkVPRl9JU0xPV19NVUxUX1RZUEUKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9JTlQKLQlkZWMJZWN4Ci0Jam56CW5lYXIgLmNvbHVtbmxvb3AKLQotCTsgLS0tLSBQYXNzIDI6IHByb2Nlc3MgNCByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuCi0KLQltb3YJZWF4LCBQT0lOVEVSIFtjaW5mbyhlYnApXQotCW1vdgllYXgsIFBPSU5URVIgW2pkc3RydWN0X3NhbXBsZV9yYW5nZV9saW1pdChlYXgpXQotCXN1YgllYXgsIGJ5dGUgLUNFTlRFUkpTQU1QTEUqU0laRU9GX0pTQU1QTEUJOyBKU0FNUExFICogcmFuZ2VfbGltaXQKLQltb3YJUE9JTlRFUiBbcmFuZ2VfbGltaXRdLCBlYXgKLQotCWxlYQllc2ksIFt3b3Jrc3BhY2VdCQkJOyBpbnQgKiB3c3B0cgotCW1vdgllZGksIEpTQU1QQVJSQVkgW291dHB1dF9idWYoZWJwKV0JOyAoSlNBTVBST1cgKikKLQltb3YJZWN4LCBEQ1RTSVpFLzIJCQkJOyBjdHIKLQlhbGlnbngJMTYsNwotLnJvd2xvb3A6Ci0JcHVzaAllZGkKLQltb3YJZWRpLCBKU0FNUFJPVyBbZWRpXQkJCTsgKEpTQU1QTEUgKikKLQlhZGQJZWRpLCBKRElNRU5TSU9OIFtvdXRwdXRfY29sKGVicCldCTsgZWRpPW91dHB0cgotCi0laWZuZGVmIE5PX1pFUk9fUk9XX1RFU1QKLQltb3YJZWF4LCBJTlQgW1JPVygxLGVzaSxTSVpFT0ZfSU5UKV0KLQlvcgllYXgsIElOVCBbUk9XKDIsZXNpLFNJWkVPRl9JTlQpXQotCWpueglzaG9ydCAucm93RENUCi0KLQltb3YJZWF4LCBJTlQgW1JPVygzLGVzaSxTSVpFT0ZfSU5UKV0KLQltb3YJZWJ4LCBJTlQgW1JPVyg1LGVzaSxTSVpFT0ZfSU5UKV0KLQlvcgllYXgsIElOVCBbUk9XKDYsZXNpLFNJWkVPRl9JTlQpXQotCW9yCWVieCwgSU5UIFtST1coNyxlc2ksU0laRU9GX0lOVCldCi0Jb3IJZWF4LGVieAotCWpueglzaG9ydCAucm93RENUCi0KLQk7IC0tIEFDIHRlcm1zIGFsbCB6ZXJvCi0KLQltb3YJZWF4LCBJTlQgW1JPVygwLGVzaSxTSVpFT0ZfSU5UKV0KLQotCW1vdgllZHgsIFBPSU5URVIgW3JhbmdlX2xpbWl0XQk7IChKU0FNUExFICopCi0KLQlkZXNjYWxlCWVheCwoUEFTUzFfQklUUyszKQotCWFuZAllYXgsUkFOR0VfTUFTSwotCW1vdglhbCwgSlNBTVBMRSBbZWR4K2VheCpTSVpFT0ZfSlNBTVBMRV0KLQltb3YJSlNBTVBMRSBbZWRpKzAqU0laRU9GX0pTQU1QTEVdLCBhbAotCW1vdglKU0FNUExFIFtlZGkrMSpTSVpFT0ZfSlNBTVBMRV0sIGFsCi0JbW92CUpTQU1QTEUgW2VkaSsyKlNJWkVPRl9KU0FNUExFXSwgYWwKLQltb3YJSlNBTVBMRSBbZWRpKzMqU0laRU9GX0pTQU1QTEVdLCBhbAotCWptcAluZWFyIC5uZXh0cm93Ci0JYWxpZ254CTE2LDcKLSVlbmRpZgotLnJvd0RDVDoKLQlwdXNoCWVzaQk7IHdzcHRyCi0JcHVzaAllY3gJOyBjdHIKLQlwdXNoCWVkaQk7IG91dHB0cgotCi0JOyAtLSBFdmVuIHBhcnQKLQotCW1vdgllYXgsIElOVCBbUk9XKDAsZXNpLFNJWkVPRl9JTlQpXQotCW1vdgllYngsIElOVCBbUk9XKDIsZXNpLFNJWkVPRl9JTlQpXQotCW1vdgllY3gsIElOVCBbUk9XKDYsZXNpLFNJWkVPRl9JTlQpXQotCi0JaW11bAllYngsKEZfMV84NDcpCQk7IGVieD1NVUxUSVBMWSh6MixGSVhfMV84NDc3NTkwNjUpCi0JaW11bAllY3gsKC1GXzBfNzY1KQkJOyBlY3g9TVVMVElQTFkoejMsLUZJWF8wXzc2NTM2Njg2NSkKLQlzYWwJZWF4LChDT05TVF9CSVRTKzEpCTsgZWF4PXRtcDAKLQlhZGQJZWN4LGVieAkJCTsgZWN4PXRtcDIKLQotCWxlYQllZGksW2VheCtlY3hdCQk7IGVkaT10bXAxMAotCXN1YgllYXgsZWN4CQkJOyBlYXg9dG1wMTIKLQotCXB1c2gJZWF4CQk7IHRtcDEyCi0JcHVzaAllZGkJCTsgdG1wMTAKLQotCTsgLS0gT2RkIHBhcnQKLQotCW1vdgllYXgsIElOVCBbUk9XKDEsZXNpLFNJWkVPRl9JTlQpXQotCW1vdgllYngsIElOVCBbUk9XKDMsZXNpLFNJWkVPRl9JTlQpXQotCW1vdgllY3gsIElOVCBbUk9XKDUsZXNpLFNJWkVPRl9JTlQpXQotCW1vdgllZGksIElOVCBbUk9XKDcsZXNpLFNJWkVPRl9JTlQpXQotCi0JbW92CWVzaSxlZGkJCTsgZXNpPWVkaT16MQotCW1vdgllZHgsZWN4CQk7IGVkeD1lY3g9ejIKLQlpbXVsCWVkaSwoLUZfMF8yMTEpCTsgZWRpPU1VTFRJUExZKHoxLC1GSVhfMF8yMTExNjQyNDMpCi0JaW11bAllY3gsKEZfMV80NTEpCTsgZWN4PU1VTFRJUExZKHoyLEZJWF8xXzQ1MTc3NDk4MSkKLQlpbXVsCWVzaSwoLUZfMF81MDkpCTsgZXNpPU1VTFRJUExZKHoxLC1GSVhfMF81MDk3OTU1NzkpCi0JaW11bAllZHgsKC1GXzBfNjAxKQk7IGVkeD1NVUxUSVBMWSh6MiwtRklYXzBfNjAxMzQ0ODg3KQotCi0JYWRkCWVkaSxlY3gJCTsgZWRpPSh0bXAwKQotCWFkZAllc2ksZWR4CQk7IGVzaT0odG1wMikKLQotCW1vdgllY3gsZWJ4CQk7IGVjeD1lYng9ejMKLQltb3YJZWR4LGVheAkJOyBlZHg9ZWF4PXo0Ci0JaW11bAllYngsKC1GXzJfMTcyKQk7IGVieD1NVUxUSVBMWSh6MywtRklYXzJfMTcyNzM0ODAzKQotCWltdWwJZWF4LChGXzFfMDYxKQk7IGVheD1NVUxUSVBMWSh6NCxGSVhfMV8wNjE1OTQzMzcpCi0JaW11bAllY3gsKEZfMF84OTkpCTsgZWN4PU1VTFRJUExZKHozLEZJWF8wXzg5OTk3NjIyMykKLQlpbXVsCWVkeCwoRl8yXzU2MikJOyBlZHg9TVVMVElQTFkoejQsRklYXzJfNTYyOTE1NDQ3KQotCi0JYWRkCWVkaSxlYngKLQlhZGQJZXNpLGVjeAotCWFkZAllZGksZWF4CQk7IGVkaT10bXAwCi0JYWRkCWVzaSxlZHgJCTsgZXNpPXRtcDIKLQotCTsgLS0gRmluYWwgb3V0cHV0IHN0YWdlCi0KLQlwb3AJZWJ4CQk7IGVieD10bXAxMAotCXBvcAllY3gJCTsgZWN4PXRtcDEyCi0KLQlsZWEJZWF4LFtlYngrZXNpXQk7IGVheD1kYXRhMCg9dG1wMTArdG1wMikKLQlzdWIJZWJ4LGVzaQkJOyBlYng9ZGF0YTMoPXRtcDEwLXRtcDIpCi0JbGVhCWVkeCxbZWN4K2VkaV0JOyBlZHg9ZGF0YTEoPXRtcDEyK3RtcDApCi0Jc3ViCWVjeCxlZGkJCTsgZWN4PWRhdGEyKD10bXAxMi10bXAwKQotCi0JbW92CWVzaSwgUE9JTlRFUiBbcmFuZ2VfbGltaXRdCTsgKEpTQU1QTEUgKikKLQotCWRlc2NhbGUJZWF4LChDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQotCWRlc2NhbGUJZWJ4LChDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQotCWRlc2NhbGUJZWR4LChDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQotCWRlc2NhbGUJZWN4LChDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQotCi0JcG9wCWVkaQk7IG91dHB0cgotCi0JYW5kCWVheCxSQU5HRV9NQVNLCi0JYW5kCWVieCxSQU5HRV9NQVNLCi0JYW5kCWVkeCxSQU5HRV9NQVNLCi0JYW5kCWVjeCxSQU5HRV9NQVNLCi0KLQltb3YJYWwsIEpTQU1QTEUgW2VzaStlYXgqU0laRU9GX0pTQU1QTEVdCi0JbW92CWJsLCBKU0FNUExFIFtlc2krZWJ4KlNJWkVPRl9KU0FNUExFXQotCW1vdglkbCwgSlNBTVBMRSBbZXNpK2VkeCpTSVpFT0ZfSlNBTVBMRV0KLQltb3YJY2wsIEpTQU1QTEUgW2VzaStlY3gqU0laRU9GX0pTQU1QTEVdCi0KLQltb3YJSlNBTVBMRSBbZWRpKzAqU0laRU9GX0pTQU1QTEVdLCBhbAotCW1vdglKU0FNUExFIFtlZGkrMypTSVpFT0ZfSlNBTVBMRV0sIGJsCi0JbW92CUpTQU1QTEUgW2VkaSsxKlNJWkVPRl9KU0FNUExFXSwgZGwKLQltb3YJSlNBTVBMRSBbZWRpKzIqU0laRU9GX0pTQU1QTEVdLCBjbAotCi0JcG9wCWVjeAk7IGN0cgotCXBvcAllc2kJOyB3c3B0cgotCi0ubmV4dHJvdzoKLQlwb3AJZWRpCi0JYWRkCWVzaSwgYnl0ZSBEQ1RTSVpFKlNJWkVPRl9JTlQJOyBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9KU0FNUFJPVwotCWRlYwllY3gKLQlqbnoJbmVhciAucm93bG9vcAotCi0JcG9wCWVkaQotCXBvcAllc2kKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwb3AJZWJ4Ci0JbW92CWVzcCxlYnAKLQlwb3AJZWJwCi0JcmV0Ci0KLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOwotOyBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAotOyBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgMngyIG91dHB1dCBibG9jay4KLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfaWRjdF8yeDIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotOyAgICAgICAgICAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotOyAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLTsKLQotJWRlZmluZSBjaW5mbyhiKQkoYikrOAkJOyBqX2RlY29tcHJlc3NfcHRyIGNpbmZvCi0lZGVmaW5lIGNvbXBwdHIoYikJKGIpKzEyCQk7IGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyCi0lZGVmaW5lIGNvZWZfYmxvY2soYikJKGIpKzE2CQk7IEpDT0VGUFRSIGNvZWZfYmxvY2sKLSVkZWZpbmUgb3V0cHV0X2J1ZihiKQkoYikrMjAJCTsgSlNBTVBBUlJBWSBvdXRwdXRfYnVmCi0lZGVmaW5lIG91dHB1dF9jb2woYikJKGIpKzI0CQk7IEpESU1FTlNJT04gb3V0cHV0X2NvbAotCi0lZGVmaW5lIHJhbmdlX2xpbWl0CWVicC1TSVpFT0ZfUE9JTlRFUgk7IEpTQU1QTEUgKiByYW5nZV9saW1pdAotJWRlZmluZSB3b3Jrc3BhY2UJcmFuZ2VfbGltaXQtKERDVFNJWkUqMikqU0laRU9GX0lOVAotCQkJCQk7IGludCB3b3Jrc3BhY2VbRENUU0laRSoyXQotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2lkY3RfMngyKQotCi1FWFROKGpwZWdfaWRjdF8yeDIpOgotCXB1c2gJZWJwCi0JbW92CWVicCxlc3AKLQlsZWEJZXNwLCBbd29ya3NwYWNlXQotCXB1c2gJZWJ4Ci07CXB1c2gJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwdXNoCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwdXNoCWVzaQotCXB1c2gJZWRpCi0KLQk7IC0tLS0gUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LgotCi0JbW92CWVkeCwgUE9JTlRFUiBbY29tcHB0cihlYnApXQotCW1vdgllZHgsIFBPSU5URVIgW2pjb21waW5mb19kY3RfdGFibGUoZWR4KV0JOyBxdWFudHB0cgotCW1vdgllc2ksIEpDT0VGUFRSIFtjb2VmX2Jsb2NrKGVicCldCQk7IGlucHRyCi0JbGVhCWVkaSwgW3dvcmtzcGFjZV0JCQk7IGludCAqIHdzcHRyCi0JbW92CWVjeCwgRENUU0laRQkJCQk7IGN0cgotCWFsaWdueAkxNiw3Ci0uY29sdW1ubG9vcDoKLQk7IERvbid0IGJvdGhlciB0byBwcm9jZXNzIGNvbHVtbnMgMiw0LDYKLQl0ZXN0CWVjeCwgMHgwOQotCWp6CW5lYXIgLm5leHRjb2x1bW4KLQotCW1vdglheCwgSkNPRUYgW0NPTCgxLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW9yCWF4LCBKQ09FRiBbQ09MKDMsZXNpLFNJWkVPRl9KQ09FRildCi0Jam56CXNob3J0IC5jb2x1bW5EQ1QKLQotCW1vdglheCwgSkNPRUYgW0NPTCg1LGVzaSxTSVpFT0ZfSkNPRUYpXQotCW9yCWF4LCBKQ09FRiBbQ09MKDcsZXNpLFNJWkVPRl9KQ09FRildCi0Jam56CXNob3J0IC5jb2x1bW5EQ1QKLQotCTsgLS0gQUMgdGVybXMgYWxsIHplcm87IHdlIG5lZWQgbm90IGV4YW1pbmUgdGVybXMgMiw0LDYgZm9yIDJ4MiBvdXRwdXQKLQotCW1vdglheCwgSkNPRUYgW0NPTCgwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCWltdWwJYXgsIElTTE9XX01VTFRfVFlQRSBbQ09MKDAsZWR4LFNJWkVPRl9JU0xPV19NVUxUX1RZUEUpXQotCWN3ZGUKLQotCXNhbAllYXgsIFBBU1MxX0JJVFMKLQotCW1vdglJTlQgW0NPTCgwLGVkaSxTSVpFT0ZfSU5UKV0sIGVheAotCW1vdglJTlQgW0NPTCgxLGVkaSxTSVpFT0ZfSU5UKV0sIGVheAotCWptcAlzaG9ydCAubmV4dGNvbHVtbgotCWFsaWdueAkxNiw3Ci0KLS5jb2x1bW5EQ1Q6Ci0JcHVzaAllY3gJOyBjdHIKLQlwdXNoCWVkaQk7IHdzcHRyCi0KLQk7IC0tIE9kZCBwYXJ0Ci0KLQltb3ZzeAllYXgsIEpDT0VGIFtDT0woMSxlc2ksU0laRU9GX0pDT0VGKV0KLQltb3ZzeAllYngsIEpDT0VGIFtDT0woMyxlc2ksU0laRU9GX0pDT0VGKV0KLQlpbXVsCWF4LCBJU0xPV19NVUxUX1RZUEUgW0NPTCgxLGVkeCxTSVpFT0ZfSVNMT1dfTVVMVF9UWVBFKV0KLQlpbXVsCWJ4LCBJU0xPV19NVUxUX1RZUEUgW0NPTCgzLGVkeCxTSVpFT0ZfSVNMT1dfTVVMVF9UWVBFKV0KLQltb3ZzeAllY3gsIEpDT0VGIFtDT0woNSxlc2ksU0laRU9GX0pDT0VGKV0KLQltb3ZzeAllZGksIEpDT0VGIFtDT0woNyxlc2ksU0laRU9GX0pDT0VGKV0KLQlpbXVsCWN4LCBJU0xPV19NVUxUX1RZUEUgW0NPTCg1LGVkeCxTSVpFT0ZfSVNMT1dfTVVMVF9UWVBFKV0KLQlpbXVsCWRpLCBJU0xPV19NVUxUX1RZUEUgW0NPTCg3LGVkeCxTSVpFT0ZfSVNMT1dfTVVMVF9UWVBFKV0KLQotCWltdWwJZWF4LChGXzNfNjI0KQk7IGVheD1NVUxUSVBMWShkYXRhMSxGSVhfM182MjQ1MDk3ODUpCi0JaW11bAllYngsKC1GXzFfMjcyKQk7IGVieD1NVUxUSVBMWShkYXRhMywtRklYXzFfMjcyNzU4NTgwKQotCWltdWwJZWN4LChGXzBfODUwKQk7IGVjeD1NVUxUSVBMWShkYXRhNSxGSVhfMF84NTA0MzAwOTUpCi0JaW11bAllZGksKC1GXzBfNzIwKQk7IGVkaT1NVUxUSVBMWShkYXRhNywtRklYXzBfNzIwOTU5ODIyKQotCi0JYWRkCWVheCxlYngKLQlhZGQJZWN4LGVkaQotCWFkZAllY3gsZWF4CQk7IGVjeD10bXAwCi0KLQk7IC0tIEV2ZW4gcGFydAotCi0JbW92CWF4LCBKQ09FRiBbQ09MKDAsZXNpLFNJWkVPRl9KQ09FRildCi0JaW11bAlheCwgSVNMT1dfTVVMVF9UWVBFIFtDT0woMCxlZHgsU0laRU9GX0lTTE9XX01VTFRfVFlQRSldCi0JY3dkZQotCi0Jc2FsCWVheCwoQ09OU1RfQklUUysyKQk7IGVheD10bXAxMAotCi0JOyAtLSBGaW5hbCBvdXRwdXQgc3RhZ2UKLQotCXBvcAllZGkJOyB3c3B0cgotCi0JbGVhCWVieCxbZWF4K2VjeF0JOyBlYng9ZGF0YTAoPXRtcDEwK3RtcDApCi0Jc3ViCWVheCxlY3gJCTsgZWF4PWRhdGExKD10bXAxMC10bXAwKQotCi0JcG9wCWVjeAk7IGN0cgotCi0JZGVzY2FsZQllYngsKENPTlNUX0JJVFMtUEFTUzFfQklUUysyKQotCWRlc2NhbGUJZWF4LChDT05TVF9CSVRTLVBBU1MxX0JJVFMrMikKLQotCW1vdglJTlQgW0NPTCgwLGVkaSxTSVpFT0ZfSU5UKV0sIGVieAotCW1vdglJTlQgW0NPTCgxLGVkaSxTSVpFT0ZfSU5UKV0sIGVheAotCi0ubmV4dGNvbHVtbjoKLQlhZGQJZXNpLCBieXRlIFNJWkVPRl9KQ09FRgk7IGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4KLQlhZGQJZWR4LCBieXRlIFNJWkVPRl9JU0xPV19NVUxUX1RZUEUKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9JTlQKLQlkZWMJZWN4Ci0Jam56CW5lYXIgLmNvbHVtbmxvb3AKLQotCTsgLS0tLSBQYXNzIDI6IHByb2Nlc3MgMiByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuCi0KLQltb3YJZWF4LCBQT0lOVEVSIFtjaW5mbyhlYnApXQotCW1vdgllYXgsIFBPSU5URVIgW2pkc3RydWN0X3NhbXBsZV9yYW5nZV9saW1pdChlYXgpXQotCXN1YgllYXgsIGJ5dGUgLUNFTlRFUkpTQU1QTEUqU0laRU9GX0pTQU1QTEUJOyBKU0FNUExFICogcmFuZ2VfbGltaXQKLQltb3YJUE9JTlRFUiBbcmFuZ2VfbGltaXRdLCBlYXgKLQotCWxlYQllc2ksIFt3b3Jrc3BhY2VdCQkJOyBpbnQgKiB3c3B0cgotCW1vdgllZGksIEpTQU1QQVJSQVkgW291dHB1dF9idWYoZWJwKV0JOyAoSlNBTVBST1cgKikKLQltb3YJZWN4LCBEQ1RTSVpFLzQJCQkJOyBjdHIKLQlhbGlnbngJMTYsNwotLnJvd2xvb3A6Ci0JcHVzaAllZGkKLQltb3YJZWRpLCBKU0FNUFJPVyBbZWRpXQkJCTsgKEpTQU1QTEUgKikKLQlhZGQJZWRpLCBKRElNRU5TSU9OIFtvdXRwdXRfY29sKGVicCldCTsgZWRpPW91dHB0cgotCi0laWZuZGVmIE5PX1pFUk9fUk9XX1RFU1QKLQltb3YJZWF4LCBJTlQgW1JPVygxLGVzaSxTSVpFT0ZfSU5UKV0KLQlvcgllYXgsIElOVCBbUk9XKDMsZXNpLFNJWkVPRl9JTlQpXQotCWpueglzaG9ydCAucm93RENUCi0KLQltb3YJZWF4LCBJTlQgW1JPVyg1LGVzaSxTSVpFT0ZfSU5UKV0KLQlvcgllYXgsIElOVCBbUk9XKDcsZXNpLFNJWkVPRl9JTlQpXQotCWpueglzaG9ydCAucm93RENUCi0KLQk7IC0tIEFDIHRlcm1zIGFsbCB6ZXJvCi0KLQltb3YJZWF4LCBJTlQgW1JPVygwLGVzaSxTSVpFT0ZfSU5UKV0KLQotCW1vdgllZHgsIFBPSU5URVIgW3JhbmdlX2xpbWl0XQk7IChKU0FNUExFICopCi0KLQlkZXNjYWxlCWVheCwoUEFTUzFfQklUUyszKQotCWFuZAllYXgsUkFOR0VfTUFTSwotCW1vdglhbCwgSlNBTVBMRSBbZWR4K2VheCpTSVpFT0ZfSlNBTVBMRV0KLQltb3YJSlNBTVBMRSBbZWRpKzAqU0laRU9GX0pTQU1QTEVdLCBhbAotCW1vdglKU0FNUExFIFtlZGkrMSpTSVpFT0ZfSlNBTVBMRV0sIGFsCi0Jam1wCXNob3J0IC5uZXh0cm93Ci0JYWxpZ254CTE2LDcKLSVlbmRpZgotLnJvd0RDVDoKLQlwdXNoCWVjeAk7IGN0cgotCi0JOyAtLSBPZGQgcGFydAotCi0JbW92CWVheCwgSU5UIFtST1coMSxlc2ksU0laRU9GX0lOVCldCi0JbW92CWVieCwgSU5UIFtST1coMyxlc2ksU0laRU9GX0lOVCldCi0JbW92CWVjeCwgSU5UIFtST1coNSxlc2ksU0laRU9GX0lOVCldCi0JbW92CWVkeCwgSU5UIFtST1coNyxlc2ksU0laRU9GX0lOVCldCi0KLQlpbXVsCWVheCwoRl8zXzYyNCkJOyBlYXg9TVVMVElQTFkoZGF0YTEsRklYXzNfNjI0NTA5Nzg1KQotCWltdWwJZWJ4LCgtRl8xXzI3MikJOyBlYng9TVVMVElQTFkoZGF0YTMsLUZJWF8xXzI3Mjc1ODU4MCkKLQlpbXVsCWVjeCwoRl8wXzg1MCkJOyBlY3g9TVVMVElQTFkoZGF0YTUsRklYXzBfODUwNDMwMDk1KQotCWltdWwJZWR4LCgtRl8wXzcyMCkJOyBlZHg9TVVMVElQTFkoZGF0YTcsLUZJWF8wXzcyMDk1OTgyMikKLQotCWFkZAllYXgsZWJ4Ci0JYWRkCWVjeCxlZHgKLQlhZGQJZWN4LGVheAkJOyBlY3g9dG1wMAotCi0JOyAtLSBFdmVuIHBhcnQKLQotCW1vdgllYXgsIElOVCBbUk9XKDAsZXNpLFNJWkVPRl9JTlQpXQotCi0Jc2FsCWVheCwoQ09OU1RfQklUUysyKQk7IGVheD10bXAxMAotCi0JOyAtLSBGaW5hbCBvdXRwdXQgc3RhZ2UKLQotCW1vdgllZHgsIFBPSU5URVIgW3JhbmdlX2xpbWl0XQk7IChKU0FNUExFICopCi0KLQlsZWEJZWJ4LFtlYXgrZWN4XQk7IGVieD1kYXRhMCg9dG1wMTArdG1wMCkKLQlzdWIJZWF4LGVjeAkJOyBlYXg9ZGF0YTEoPXRtcDEwLXRtcDApCi0KLQlwb3AJZWN4CTsgY3RyCi0KLQlkZXNjYWxlCWVieCwoQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMikKLQlkZXNjYWxlCWVheCwoQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMikKLQotCWFuZAllYngsUkFOR0VfTUFTSwotCWFuZAllYXgsUkFOR0VfTUFTSwotCW1vdglibCwgSlNBTVBMRSBbZWR4K2VieCpTSVpFT0ZfSlNBTVBMRV0KLQltb3YJYWwsIEpTQU1QTEUgW2VkeCtlYXgqU0laRU9GX0pTQU1QTEVdCi0JbW92CUpTQU1QTEUgW2VkaSswKlNJWkVPRl9KU0FNUExFXSwgYmwKLQltb3YJSlNBTVBMRSBbZWRpKzEqU0laRU9GX0pTQU1QTEVdLCBhbAotCi0ubmV4dHJvdzoKLQlwb3AJZWRpCi0JYWRkCWVzaSwgYnl0ZSBEQ1RTSVpFKlNJWkVPRl9JTlQJOyBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cKLQlhZGQJZWRpLCBieXRlIFNJWkVPRl9KU0FNUFJPVwotCWRlYwllY3gKLQlqbnoJbmVhciAucm93bG9vcAotCi0JcG9wCWVkaQotCXBvcAllc2kKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwb3AJZWJ4Ci0JbW92CWVzcCxlYnAKLQlwb3AJZWJwCi0JcmV0Ci0KLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOwotOyBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAotOyBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgMXgxIG91dHB1dCBibG9jay4KLTsKLTsgR0xPQkFMKHZvaWQpCi07IGpwZWdfaWRjdF8xeDEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotOyAgICAgICAgICAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotOyAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLTsKLQotJWRlZmluZSBjaW5mbyhiKQkoYikrOAkJOyBqX2RlY29tcHJlc3NfcHRyIGNpbmZvCi0lZGVmaW5lIGNvbXBwdHIoYikJKGIpKzEyCQk7IGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyCi0lZGVmaW5lIGNvZWZfYmxvY2soYikJKGIpKzE2CQk7IEpDT0VGUFRSIGNvZWZfYmxvY2sKLSVkZWZpbmUgb3V0cHV0X2J1ZihiKQkoYikrMjAJCTsgSlNBTVBBUlJBWSBvdXRwdXRfYnVmCi0lZGVmaW5lIG91dHB1dF9jb2woYikJKGIpKzI0CQk7IEpESU1FTlNJT04gb3V0cHV0X2NvbAotCi0lZGVmaW5lIGVicAkJZXNwLTQJCTsgdXNlIGVzcCBpbnN0ZWFkIG9mIGVicAotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2lkY3RfMXgxKQotCi1FWFROKGpwZWdfaWRjdF8xeDEpOgotOwlwdXNoCWVicAotOwltb3YJZWJwLGVzcAotOwlwdXNoCWVieAkJOyB1bnVzZWQKLTsJcHVzaAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXB1c2gJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwdXNoCWVzaQkJOyB1bnVzZWQKLTsJcHVzaAllZGkJCTsgdW51c2VkCi0KLQk7IFdlIGhhcmRseSBuZWVkIGFuIGludmVyc2UgRENUIHJvdXRpbmUgZm9yIHRoaXM6IGp1c3QgdGFrZSB0aGUKLQk7IGF2ZXJhZ2UgcGl4ZWwgdmFsdWUsIHdoaWNoIGlzIG9uZS1laWdodGggb2YgdGhlIERDIGNvZWZmaWNpZW50LgotCi0JbW92CWVkeCwgUE9JTlRFUiBbY29tcHB0cihlYnApXQotCW1vdgllY3gsIEpDT0VGUFRSIFtjb2VmX2Jsb2NrKGVicCldCQk7IGlucHRyCi0JbW92CWVkeCwgUE9JTlRFUiBbamNvbXBpbmZvX2RjdF90YWJsZShlZHgpXQk7IHF1YW50cHRyCi0KLQltb3YJYXgsIEpDT0VGIFtDT0woMCxlY3gsU0laRU9GX0pDT0VGKV0KLQlpbXVsCWF4LCBJU0xPV19NVUxUX1RZUEUgW0NPTCgwLGVkeCxTSVpFT0ZfSVNMT1dfTVVMVF9UWVBFKV0KLQotCW1vdgllY3gsIEpTQU1QQVJSQVkgW291dHB1dF9idWYoZWJwKV0JOyAoSlNBTVBST1cgKikKLQltb3YJZWR4LCBKRElNRU5TSU9OIFtvdXRwdXRfY29sKGVicCldCi0JbW92CWVjeCwgSlNBTVBST1cgW2VjeF0JCQk7IChKU0FNUExFICopCi0KLQlhZGQJYXgsICgxIDw8ICgzLTEpKSArIChDRU5URVJKU0FNUExFIDw8IDMpCi0Jc2FyCWF4LDMJCTsgZGVzY2FsZQotCi0JdGVzdAlhaCxhaAkJOyB1bnNpZ25lZCBzYXR1cmF0aW9uCi0JanoJc2hvcnQgLm91dHB1dAotCW5vdAlheAotCXNhcglheCwxNQotCWFsaWdueAkxNiwzCi0ub3V0cHV0OgotCW1vdglKU0FNUExFIFtlY3grZWR4KlNJWkVPRl9KU0FNUExFXSwgYWwKLQotOwlwb3AJZWRpCQk7IHVudXNlZAotOwlwb3AJZXNpCQk7IHVudXNlZAotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWJ4CQk7IHVudXNlZAotOwlwb3AJZWJwCi0JcmV0Ci0KLSVlbmRpZiA7IElEQ1RfU0NBTElOR19TVVBQT1JURUQKZGlmZiAtLWdpdCBhL3VudXNlZC9qaWRjdHJlZC5jIGIvamlkY3RyZWQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdW51c2VkL2ppZGN0cmVkLmMKcmVuYW1lIHRvIGppZGN0cmVkLmMKZGlmZiAtLWdpdCBhL2ppc3MyZmx0LmFzbSBiL2ppc3MyZmx0LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA1NjVhMy4uMDAwMDAwMAotLS0gYS9qaXNzMmZsdC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotOwotOyBqaXNzMmZsdC5hc20gLSBmbG9hdGluZy1wb2ludCBJRENUIChTU0UgJiBTU0UyKQotOwotOyB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLTsgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KLTsgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGpzaW1kZXh0LmluYwotOwotOyBUaGlzIGZpbGUgc2hvdWxkIGJlIGFzc2VtYmxlZCB3aXRoIE5BU00gKE5ldHdpZGUgQXNzZW1ibGVyKSwKLTsgY2FuICpub3QqIGJlIGFzc2VtYmxlZCB3aXRoIE1pY3Jvc29mdCdzIE1BU00gb3IgYW55IGNvbXBhdGlibGUKLTsgYXNzZW1ibGVyIChpbmNsdWRpbmcgQm9ybGFuZCdzIFR1cmJvIEFzc2VtYmxlcikuCi07IE5BU00gaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL25hc20uc291cmNlZm9yZ2UubmV0LyBvcgotOyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD02MjA4Ci07Ci07IFRoaXMgZmlsZSBjb250YWlucyBhIGZsb2F0aW5nLXBvaW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnZlcnNlIERDVAotOyAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBiYXNlZCBkaXJlY3RseSBvbgotOyB0aGUgSUpHJ3Mgb3JpZ2luYWwgamlkY3RmbHQuYzsgc2VlIHRoZSBqaWRjdGZsdC5jIGZvciBtb3JlIGRldGFpbHMuCi07Ci07IExhc3QgTW9kaWZpZWQgOiBGZWJydWFyeSA0LCAyMDA2Ci07Ci07IFtUQUI4XQotCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotJWluY2x1ZGUgImpkY3QuaW5jIgotCi0laWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotJWlmZGVmIEpJRENUX0ZMVF9TU0VfU1NFMl9TVVBQT1JURUQKLQotOyBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLTsKLSVpZiBEQ1RTSVpFICE9IDgKLSVlcnJvciAiU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIgotJWVuZGlmCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJW1hY3JvCXVucGNrbHBzMiAyCTsgJTE9KDAgMSAyIDMpIC8gJTI9KDQgNSA2IDcpID0+ICUxPSgwIDEgNCA1KQotCXNodWZwcwklMSwlMiwweDQ0Ci0lZW5kbWFjcm8KLQotJW1hY3JvCXVucGNraHBzMiAyCTsgJTE9KDAgMSAyIDMpIC8gJTI9KDQgNSA2IDcpID0+ICUxPSgyIDMgNiA3KQotCXNodWZwcwklMSwlMiwweEVFCi0lZW5kbWFjcm8KLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX0NPTlNUCi0KLQlhbGlnbnoJMTYKLQlnbG9iYWwJRVhUTihqY29uc3RfaWRjdF9mbG9hdF9zc2UyKQotCi1FWFROKGpjb25zdF9pZGN0X2Zsb2F0X3NzZTIpOgotCi1QRF8xXzQxNAl0aW1lcyA0IGRkICAxLjQxNDIxMzU2MjM3MzA5NTA0ODgwMTY4OQotUERfMV84NDcJdGltZXMgNCBkZCAgMS44NDc3NTkwNjUwMjI1NzM1MTIyNTYzNjYKLVBEXzFfMDgyCXRpbWVzIDQgZGQgIDEuMDgyMzkyMjAwMjkyMzkzOTY4Nzk5NDQ2Ci1QRF9NMl82MTMJdGltZXMgNCBkZCAtMi42MTMxMjU5Mjk3NTI3NTMwNTU3MTMyODYKLVBEX1JORElOVF9NQUdJQwl0aW1lcyA0IGRkICAxMDA2NjMyOTYuMAk7IChmbG9hdCkoMHgwMEMwMDAwMCA8PCAzKQotUEJfQ0VOVEVSSlNBTVAJdGltZXMgMTYgZGIgQ0VOVEVSSlNBTVBMRQotCi0JYWxpZ256CTE2Ci0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19URVhUCi0JQklUUwkzMgotOwotOyBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLgotOwotOyBHTE9CQUwodm9pZCkKLTsganBlZ19pZGN0X2Zsb2F0X3NzZTIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotOyAgICAgICAgICAgICAgICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKLTsgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQotOwotCi0lZGVmaW5lIGNpbmZvKGIpCShiKSs4CQk7IGpfZGVjb21wcmVzc19wdHIgY2luZm8KLSVkZWZpbmUgY29tcHB0cihiKQkoYikrMTIJCTsganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIKLSVkZWZpbmUgY29lZl9ibG9jayhiKQkoYikrMTYJCTsgSkNPRUZQVFIgY29lZl9ibG9jawotJWRlZmluZSBvdXRwdXRfYnVmKGIpCShiKSsyMAkJOyBKU0FNUEFSUkFZIG91dHB1dF9idWYKLSVkZWZpbmUgb3V0cHV0X2NvbChiKQkoYikrMjQJCTsgSkRJTUVOU0lPTiBvdXRwdXRfY29sCi0KLSVkZWZpbmUgb3JpZ2luYWxfZWJwCWVicCswCi0lZGVmaW5lIHdrKGkpCQllYnAtKFdLX05VTS0oaSkpKlNJWkVPRl9YTU1XT1JECTsgeG1td29yZCB3a1tXS19OVU1dCi0lZGVmaW5lIFdLX05VTQkJMgotJWRlZmluZSB3b3Jrc3BhY2UJd2soMCktRENUU0laRTIqU0laRU9GX0ZBU1RfRkxPQVQKLQkJCQkJOyBGQVNUX0ZMT0FUIHdvcmtzcGFjZVtEQ1RTSVpFMl0KLQotCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19pZGN0X2Zsb2F0X3NzZTIpCi0KLUVYVE4oanBlZ19pZGN0X2Zsb2F0X3NzZTIpOgotCXB1c2gJZWJwCi0JbW92CWVheCxlc3AJCQkJOyBlYXggPSBvcmlnaW5hbCBlYnAKLQlzdWIJZXNwLCBieXRlIDQKLQlhbmQJZXNwLCBieXRlICgtU0laRU9GX1hNTVdPUkQpCTsgYWxpZ24gdG8gMTI4IGJpdHMKLQltb3YJW2VzcF0sZWF4Ci0JbW92CWVicCxlc3AJCQkJOyBlYnAgPSBhbGlnbmVkIGVicAotCWxlYQllc3AsIFt3b3Jrc3BhY2VdCi0JcHVzaAllYngKLTsJcHVzaAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXB1c2gJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXB1c2gJZXNpCi0JcHVzaAllZGkKLQotCWdldF9HT1QJZWJ4CQk7IGdldCBHT1QgYWRkcmVzcwotCi0JOyAtLS0tIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4KLQotOwltb3YJZWF4LCBbb3JpZ2luYWxfZWJwXQotCW1vdgllZHgsIFBPSU5URVIgW2NvbXBwdHIoZWF4KV0KLQltb3YJZWR4LCBQT0lOVEVSIFtqY29tcGluZm9fZGN0X3RhYmxlKGVkeCldCTsgcXVhbnRwdHIKLQltb3YJZXNpLCBKQ09FRlBUUiBbY29lZl9ibG9jayhlYXgpXQkJOyBpbnB0cgotCWxlYQllZGksIFt3b3Jrc3BhY2VdCQkJOyBGQVNUX0ZMT0FUICogd3NwdHIKLQltb3YJZWN4LCBEQ1RTSVpFLzQJCQkJOyBjdHIKLQlhbGlnbngJMTYsNwotLmNvbHVtbmxvb3A6Ci0laWZuZGVmIE5PX1pFUk9fQ09MVU1OX1RFU1RfRkxPQVRfU1NFCi0JbW92CWVheCwgRFdPUkQgW0RXQkxPQ0soMSwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW9yCWVheCwgRFdPUkQgW0RXQkxPQ0soMiwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCWpuegluZWFyIC5jb2x1bW5EQ1QKLQotCW1vdnEJeG1tMSwgX01NV09SRCBbTU1CTE9DSygxLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92cQl4bW0yLCBfTU1XT1JEIFtNTUJMT0NLKDIsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQltb3ZxCXhtbTMsIF9NTVdPUkQgW01NQkxPQ0soMywwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdnEJeG1tNCwgX01NV09SRCBbTU1CTE9DSyg0LDAsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92cQl4bW01LCBfTU1XT1JEIFtNTUJMT0NLKDUsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQltb3ZxCXhtbTYsIF9NTVdPUkQgW01NQkxPQ0soNiwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdnEJeG1tNywgX01NV09SRCBbTU1CTE9DSyg3LDAsZXNpLFNJWkVPRl9KQ09FRildCi0JcG9yCXhtbTEseG1tMgotCXBvcgl4bW0zLHhtbTQKLQlwb3IJeG1tNSx4bW02Ci0JcG9yCXhtbTEseG1tMwotCXBvcgl4bW01LHhtbTcKLQlwb3IJeG1tMSx4bW01Ci0JcGFja3Nzd2IgeG1tMSx4bW0xCi0JbW92ZAllYXgseG1tMQotCXRlc3QJZWF4LGVheAotCWpueglzaG9ydCAuY29sdW1uRENUCi0KLQk7IC0tIEFDIHRlcm1zIGFsbCB6ZXJvCi0KLQltb3ZxICAgICAgeG1tMCwgX01NV09SRCBbTU1CTE9DSygwLDAsZXNpLFNJWkVPRl9KQ09FRildCi0KLQlwdW5wY2tsd2QgeG1tMCx4bW0wCQk7IHhtbTA9KDAwIDAwIDAxIDAxIDAyIDAyIDAzIDAzKQotCXBzcmFkICAgICB4bW0wLChEV09SRF9CSVQtV09SRF9CSVQpCTsgeG1tMD1pbjA9KDAwIDAxIDAyIDAzKQotCWN2dGRxMnBzICB4bW0wLHhtbTAJCQk7IHhtbTA9aW4wPSgwMCAwMSAwMiAwMykKLQotCW11bHBzCXhtbTAsIFhNTVdPUkQgW1hNTUJMT0NLKDAsMCxlZHgsU0laRU9GX0ZMT0FUX01VTFRfVFlQRSldCi0KLQltb3ZhcHMJeG1tMSx4bW0wCi0JbW92YXBzCXhtbTIseG1tMAotCW1vdmFwcwl4bW0zLHhtbTAKLQotCXNodWZwcwl4bW0wLHhtbTAsMHgwMAkJCTsgeG1tMD0oMDAgMDAgMDAgMDApCi0Jc2h1ZnBzCXhtbTEseG1tMSwweDU1CQkJOyB4bW0xPSgwMSAwMSAwMSAwMSkKLQlzaHVmcHMJeG1tMix4bW0yLDB4QUEJCQk7IHhtbTI9KDAyIDAyIDAyIDAyKQotCXNodWZwcwl4bW0zLHhtbTMsMHhGRgkJCTsgeG1tMz0oMDMgMDMgMDMgMDMpCi0KLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soMCwwLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW0wCi0JbW92YXBzCVhNTVdPUkQgW1hNTUJMT0NLKDAsMSxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgeG1tMAotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSygxLDAsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTEKLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soMSwxLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW0xCi0JbW92YXBzCVhNTVdPUkQgW1hNTUJMT0NLKDIsMCxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgeG1tMgotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSygyLDEsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTIKLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soMywwLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW0zCi0JbW92YXBzCVhNTVdPUkQgW1hNTUJMT0NLKDMsMSxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgeG1tMwotCWptcAluZWFyIC5uZXh0Y29sdW1uCi0JYWxpZ254CTE2LDcKLSVlbmRpZgotLmNvbHVtbkRDVDoKLQotCTsgLS0gRXZlbiBwYXJ0Ci0KLQltb3ZxICAgICAgeG1tMCwgX01NV09SRCBbTU1CTE9DSygwLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92cSAgICAgIHhtbTEsIF9NTVdPUkQgW01NQkxPQ0soMiwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdnEgICAgICB4bW0yLCBfTU1XT1JEIFtNTUJMT0NLKDQsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQltb3ZxICAgICAgeG1tMywgX01NV09SRCBbTU1CTE9DSyg2LDAsZXNpLFNJWkVPRl9KQ09FRildCi0KLQlwdW5wY2tsd2QgeG1tMCx4bW0wCQk7IHhtbTA9KDAwIDAwIDAxIDAxIDAyIDAyIDAzIDAzKQotCXB1bnBja2x3ZCB4bW0xLHhtbTEJCTsgeG1tMT0oMjAgMjAgMjEgMjEgMjIgMjIgMjMgMjMpCi0JcHNyYWQgICAgIHhtbTAsKERXT1JEX0JJVC1XT1JEX0JJVCkJOyB4bW0wPWluMD0oMDAgMDEgMDIgMDMpCi0JcHNyYWQgICAgIHhtbTEsKERXT1JEX0JJVC1XT1JEX0JJVCkJOyB4bW0xPWluMj0oMjAgMjEgMjIgMjMpCi0JY3Z0ZHEycHMgIHhtbTAseG1tMAkJCTsgeG1tMD1pbjA9KDAwIDAxIDAyIDAzKQotCWN2dGRxMnBzICB4bW0xLHhtbTEJCQk7IHhtbTE9aW4yPSgyMCAyMSAyMiAyMykKLQotCXB1bnBja2x3ZCB4bW0yLHhtbTIJCTsgeG1tMj0oNDAgNDAgNDEgNDEgNDIgNDIgNDMgNDMpCi0JcHVucGNrbHdkIHhtbTMseG1tMwkJOyB4bW0zPSg2MCA2MCA2MSA2MSA2MiA2MiA2MyA2MykKLQlwc3JhZCAgICAgeG1tMiwoRFdPUkRfQklULVdPUkRfQklUKQk7IHhtbTI9aW40PSg0MCA0MSA0MiA0MykKLQlwc3JhZCAgICAgeG1tMywoRFdPUkRfQklULVdPUkRfQklUKQk7IHhtbTM9aW42PSg2MCA2MSA2MiA2MykKLQljdnRkcTJwcyAgeG1tMix4bW0yCQkJOyB4bW0yPWluND0oNDAgNDEgNDIgNDMpCi0JY3Z0ZHEycHMgIHhtbTMseG1tMwkJCTsgeG1tMz1pbjY9KDYwIDYxIDYyIDYzKQotCi0JbXVscHMgICAgIHhtbTAsIFhNTVdPUkQgW1hNTUJMT0NLKDAsMCxlZHgsU0laRU9GX0ZMT0FUX01VTFRfVFlQRSldCi0JbXVscHMgICAgIHhtbTEsIFhNTVdPUkQgW1hNTUJMT0NLKDIsMCxlZHgsU0laRU9GX0ZMT0FUX01VTFRfVFlQRSldCi0JbXVscHMgICAgIHhtbTIsIFhNTVdPUkQgW1hNTUJMT0NLKDQsMCxlZHgsU0laRU9GX0ZMT0FUX01VTFRfVFlQRSldCi0JbXVscHMgICAgIHhtbTMsIFhNTVdPUkQgW1hNTUJMT0NLKDYsMCxlZHgsU0laRU9GX0ZMT0FUX01VTFRfVFlQRSldCi0KLQltb3ZhcHMJeG1tNCx4bW0wCi0JbW92YXBzCXhtbTUseG1tMQotCXN1YnBzCXhtbTAseG1tMgkJOyB4bW0wPXRtcDExCi0Jc3VicHMJeG1tMSx4bW0zCi0JYWRkcHMJeG1tNCx4bW0yCQk7IHhtbTQ9dG1wMTAKLQlhZGRwcwl4bW01LHhtbTMJCTsgeG1tNT10bXAxMwotCi0JbXVscHMJeG1tMSxbR09UT0ZGKGVieCxQRF8xXzQxNCldCi0Jc3VicHMJeG1tMSx4bW01CQk7IHhtbTE9dG1wMTIKLQotCW1vdmFwcwl4bW02LHhtbTQKLQltb3ZhcHMJeG1tNyx4bW0wCi0Jc3VicHMJeG1tNCx4bW01CQk7IHhtbTQ9dG1wMwotCXN1YnBzCXhtbTAseG1tMQkJOyB4bW0wPXRtcDIKLQlhZGRwcwl4bW02LHhtbTUJCTsgeG1tNj10bXAwCi0JYWRkcHMJeG1tNyx4bW0xCQk7IHhtbTc9dG1wMQotCi0JbW92YXBzCVhNTVdPUkQgW3drKDEpXSwgeG1tNAk7IHRtcDMKLQltb3ZhcHMJWE1NV09SRCBbd2soMCldLCB4bW0wCTsgdG1wMgotCi0JOyAtLSBPZGQgcGFydAotCi0JbW92cSAgICAgIHhtbTIsIF9NTVdPUkQgW01NQkxPQ0soMSwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdnEgICAgICB4bW0zLCBfTU1XT1JEIFtNTUJMT0NLKDMsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQltb3ZxICAgICAgeG1tNSwgX01NV09SRCBbTU1CTE9DSyg1LDAsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92cSAgICAgIHhtbTEsIF9NTVdPUkQgW01NQkxPQ0soNywwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCi0JcHVucGNrbHdkIHhtbTIseG1tMgkJOyB4bW0yPSgxMCAxMCAxMSAxMSAxMiAxMiAxMyAxMykKLQlwdW5wY2tsd2QgeG1tMyx4bW0zCQk7IHhtbTM9KDMwIDMwIDMxIDMxIDMyIDMyIDMzIDMzKQotCXBzcmFkICAgICB4bW0yLChEV09SRF9CSVQtV09SRF9CSVQpCTsgeG1tMj1pbjE9KDEwIDExIDEyIDEzKQotCXBzcmFkICAgICB4bW0zLChEV09SRF9CSVQtV09SRF9CSVQpCTsgeG1tMz1pbjM9KDMwIDMxIDMyIDMzKQotCWN2dGRxMnBzICB4bW0yLHhtbTIJCQk7IHhtbTI9aW4xPSgxMCAxMSAxMiAxMykKLQljdnRkcTJwcyAgeG1tMyx4bW0zCQkJOyB4bW0zPWluMz0oMzAgMzEgMzIgMzMpCi0KLQlwdW5wY2tsd2QgeG1tNSx4bW01CQk7IHhtbTU9KDUwIDUwIDUxIDUxIDUyIDUyIDUzIDUzKQotCXB1bnBja2x3ZCB4bW0xLHhtbTEJCTsgeG1tMT0oNzAgNzAgNzEgNzEgNzIgNzIgNzMgNzMpCi0JcHNyYWQgICAgIHhtbTUsKERXT1JEX0JJVC1XT1JEX0JJVCkJOyB4bW01PWluNT0oNTAgNTEgNTIgNTMpCi0JcHNyYWQgICAgIHhtbTEsKERXT1JEX0JJVC1XT1JEX0JJVCkJOyB4bW0xPWluNz0oNzAgNzEgNzIgNzMpCi0JY3Z0ZHEycHMgIHhtbTUseG1tNQkJCTsgeG1tNT1pbjU9KDUwIDUxIDUyIDUzKQotCWN2dGRxMnBzICB4bW0xLHhtbTEJCQk7IHhtbTE9aW43PSg3MCA3MSA3MiA3MykKLQotCW11bHBzICAgICB4bW0yLCBYTU1XT1JEIFtYTU1CTE9DSygxLDAsZWR4LFNJWkVPRl9GTE9BVF9NVUxUX1RZUEUpXQotCW11bHBzICAgICB4bW0zLCBYTU1XT1JEIFtYTU1CTE9DSygzLDAsZWR4LFNJWkVPRl9GTE9BVF9NVUxUX1RZUEUpXQotCW11bHBzICAgICB4bW01LCBYTU1XT1JEIFtYTU1CTE9DSyg1LDAsZWR4LFNJWkVPRl9GTE9BVF9NVUxUX1RZUEUpXQotCW11bHBzICAgICB4bW0xLCBYTU1XT1JEIFtYTU1CTE9DSyg3LDAsZWR4LFNJWkVPRl9GTE9BVF9NVUxUX1RZUEUpXQotCi0JbW92YXBzCXhtbTQseG1tMgotCW1vdmFwcwl4bW0wLHhtbTUKLQlhZGRwcwl4bW0yLHhtbTEJCTsgeG1tMj16MTEKLQlhZGRwcwl4bW01LHhtbTMJCTsgeG1tNT16MTMKLQlzdWJwcwl4bW00LHhtbTEJCTsgeG1tND16MTIKLQlzdWJwcwl4bW0wLHhtbTMJCTsgeG1tMD16MTAKLQotCW1vdmFwcwl4bW0xLHhtbTIKLQlzdWJwcwl4bW0yLHhtbTUKLQlhZGRwcwl4bW0xLHhtbTUJCTsgeG1tMT10bXA3Ci0KLQltdWxwcwl4bW0yLFtHT1RPRkYoZWJ4LFBEXzFfNDE0KV0JOyB4bW0yPXRtcDExCi0KLQltb3ZhcHMJeG1tMyx4bW0wCi0JYWRkcHMJeG1tMCx4bW00Ci0JbXVscHMJeG1tMCxbR09UT0ZGKGVieCxQRF8xXzg0NyldCTsgeG1tMD16NQotCW11bHBzCXhtbTMsW0dPVE9GRihlYngsUERfTTJfNjEzKV0JOyB4bW0zPSh6MTAgKiAtMi42MTMxMjU5MzApCi0JbXVscHMJeG1tNCxbR09UT0ZGKGVieCxQRF8xXzA4MildCTsgeG1tND0oejEyICogMS4wODIzOTIyMDApCi0JYWRkcHMJeG1tMyx4bW0wCQk7IHhtbTM9dG1wMTIKLQlzdWJwcwl4bW00LHhtbTAJCTsgeG1tND10bXAxMAotCi0JOyAtLSBGaW5hbCBvdXRwdXQgc3RhZ2UKLQotCXN1YnBzCXhtbTMseG1tMQkJOyB4bW0zPXRtcDYKLQltb3ZhcHMJeG1tNSx4bW02Ci0JbW92YXBzCXhtbTAseG1tNwotCWFkZHBzCXhtbTYseG1tMQkJOyB4bW02PWRhdGEwPSgwMCAwMSAwMiAwMykKLQlhZGRwcwl4bW03LHhtbTMJCTsgeG1tNz1kYXRhMT0oMTAgMTEgMTIgMTMpCi0Jc3VicHMJeG1tNSx4bW0xCQk7IHhtbTU9ZGF0YTc9KDcwIDcxIDcyIDczKQotCXN1YnBzCXhtbTAseG1tMwkJOyB4bW0wPWRhdGE2PSg2MCA2MSA2MiA2MykKLQlzdWJwcwl4bW0yLHhtbTMJCTsgeG1tMj10bXA1Ci0KLQltb3ZhcHMgICAgeG1tMSx4bW02CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMSkKLQl1bnBja2xwcyAgeG1tNix4bW03CQk7IHhtbTY9KDAwIDEwIDAxIDExKQotCXVucGNraHBzICB4bW0xLHhtbTcJCTsgeG1tMT0oMDIgMTIgMDMgMTMpCi0JbW92YXBzICAgIHhtbTMseG1tMAkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDEpCi0JdW5wY2tscHMgIHhtbTAseG1tNQkJOyB4bW0wPSg2MCA3MCA2MSA3MSkKLQl1bnBja2hwcyAgeG1tMyx4bW01CQk7IHhtbTM9KDYyIDcyIDYzIDczKQotCi0JbW92YXBzCXhtbTcsIFhNTVdPUkQgW3drKDApXQk7IHhtbTc9dG1wMgotCW1vdmFwcwl4bW01LCBYTU1XT1JEIFt3aygxKV0JOyB4bW01PXRtcDMKLQotCW1vdmFwcwlYTU1XT1JEIFt3aygwKV0sIHhtbTAJOyB3aygwKT0oNjAgNzAgNjEgNzEpCi0JbW92YXBzCVhNTVdPUkQgW3drKDEpXSwgeG1tMwk7IHdrKDEpPSg2MiA3MiA2MyA3MykKLQotCWFkZHBzCXhtbTQseG1tMgkJOyB4bW00PXRtcDQKLQltb3ZhcHMJeG1tMCx4bW03Ci0JbW92YXBzCXhtbTMseG1tNQotCWFkZHBzCXhtbTcseG1tMgkJOyB4bW03PWRhdGEyPSgyMCAyMSAyMiAyMykKLQlhZGRwcwl4bW01LHhtbTQJCTsgeG1tNT1kYXRhND0oNDAgNDEgNDIgNDMpCi0Jc3VicHMJeG1tMCx4bW0yCQk7IHhtbTA9ZGF0YTU9KDUwIDUxIDUyIDUzKQotCXN1YnBzCXhtbTMseG1tNAkJOyB4bW0zPWRhdGEzPSgzMCAzMSAzMiAzMykKLQotCW1vdmFwcyAgICB4bW0yLHhtbTcJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAxKQotCXVucGNrbHBzICB4bW03LHhtbTMJCTsgeG1tNz0oMjAgMzAgMjEgMzEpCi0JdW5wY2tocHMgIHhtbTIseG1tMwkJOyB4bW0yPSgyMiAzMiAyMyAzMykKLQltb3ZhcHMgICAgeG1tNCx4bW01CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMSkKLQl1bnBja2xwcyAgeG1tNSx4bW0wCQk7IHhtbTU9KDQwIDUwIDQxIDUxKQotCXVucGNraHBzICB4bW00LHhtbTAJCTsgeG1tND0oNDIgNTIgNDMgNTMpCi0KLQltb3ZhcHMgICAgeG1tMyx4bW02CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMikKLQl1bnBja2xwczIgeG1tNix4bW03CQk7IHhtbTY9KDAwIDEwIDIwIDMwKQotCXVucGNraHBzMiB4bW0zLHhtbTcJCTsgeG1tMz0oMDEgMTEgMjEgMzEpCi0JbW92YXBzICAgIHhtbTAseG1tMQkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDIpCi0JdW5wY2tscHMyIHhtbTEseG1tMgkJOyB4bW0xPSgwMiAxMiAyMiAzMikKLQl1bnBja2hwczIgeG1tMCx4bW0yCQk7IHhtbTA9KDAzIDEzIDIzIDMzKQotCi0JbW92YXBzCXhtbTcsIFhNTVdPUkQgW3drKDApXQk7IHhtbTc9KDYwIDcwIDYxIDcxKQotCW1vdmFwcwl4bW0yLCBYTU1XT1JEIFt3aygxKV0JOyB4bW0yPSg2MiA3MiA2MyA3MykKLQotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSygwLDAsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTYKLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soMSwwLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW0zCi0JbW92YXBzCVhNTVdPUkQgW1hNTUJMT0NLKDIsMCxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgeG1tMQotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSygzLDAsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTAKLQotCW1vdmFwcyAgICB4bW02LHhtbTUJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXVucGNrbHBzMiB4bW01LHhtbTcJCTsgeG1tNT0oNDAgNTAgNjAgNzApCi0JdW5wY2tocHMyIHhtbTYseG1tNwkJOyB4bW02PSg0MSA1MSA2MSA3MSkKLQltb3ZhcHMgICAgeG1tMyx4bW00CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMikKLQl1bnBja2xwczIgeG1tNCx4bW0yCQk7IHhtbTQ9KDQyIDUyIDYyIDcyKQotCXVucGNraHBzMiB4bW0zLHhtbTIJCTsgeG1tMz0oNDMgNTMgNjMgNzMpCi0KLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soMCwxLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW01Ci0JbW92YXBzCVhNTVdPUkQgW1hNTUJMT0NLKDEsMSxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgeG1tNgotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSygyLDEsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTQKLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soMywxLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW0zCi0KLS5uZXh0Y29sdW1uOgotCWFkZAllc2ksIGJ5dGUgNCpTSVpFT0ZfSkNPRUYJCTsgY29lZl9ibG9jawotCWFkZAllZHgsIGJ5dGUgNCpTSVpFT0ZfRkxPQVRfTVVMVF9UWVBFCTsgcXVhbnRwdHIKLQlhZGQJZWRpLCAgICAgIDQqRENUU0laRSpTSVpFT0ZfRkFTVF9GTE9BVAk7IHdzcHRyCi0JZGVjCWVjeAkJCQkJOyBjdHIKLQlqbnoJbmVhciAuY29sdW1ubG9vcAotCi0JOyAtLSBQcmVmZXRjaCB0aGUgbmV4dCBjb2VmZmljaWVudCBibG9jawotCi0JcHJlZmV0Y2hudGEgW2VzaSArIChEQ1RTSVpFMi04KSpTSVpFT0ZfSkNPRUYgKyAwKjMyXQotCXByZWZldGNobnRhIFtlc2kgKyAoRENUU0laRTItOCkqU0laRU9GX0pDT0VGICsgMSozMl0KLQlwcmVmZXRjaG50YSBbZXNpICsgKERDVFNJWkUyLTgpKlNJWkVPRl9KQ09FRiArIDIqMzJdCi0JcHJlZmV0Y2hudGEgW2VzaSArIChEQ1RTSVpFMi04KSpTSVpFT0ZfSkNPRUYgKyAzKjMyXQotCi0JOyAtLS0tIFBhc3MgMjogcHJvY2VzcyByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuCi0KLQltb3YJZWF4LCBbb3JpZ2luYWxfZWJwXQotCWxlYQllc2ksIFt3b3Jrc3BhY2VdCQkJOyBGQVNUX0ZMT0FUICogd3NwdHIKLQltb3YJZWRpLCBKU0FNUEFSUkFZIFtvdXRwdXRfYnVmKGVheCldCTsgKEpTQU1QUk9XICopCi0JbW92CWVheCwgSkRJTUVOU0lPTiBbb3V0cHV0X2NvbChlYXgpXQotCW1vdgllY3gsIERDVFNJWkUvNAkJCQk7IGN0cgotCWFsaWdueAkxNiw3Ci0ucm93bG9vcDoKLQotCTsgLS0gRXZlbiBwYXJ0Ci0KLQltb3ZhcHMJeG1tMCwgWE1NV09SRCBbWE1NQkxPQ0soMCwwLGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92YXBzCXhtbTEsIFhNTVdPUkQgW1hNTUJMT0NLKDIsMCxlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCW1vdmFwcwl4bW0yLCBYTU1XT1JEIFtYTU1CTE9DSyg0LDAsZXNpLFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQltb3ZhcHMJeG1tMywgWE1NV09SRCBbWE1NQkxPQ0soNiwwLGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0KLQltb3ZhcHMJeG1tNCx4bW0wCi0JbW92YXBzCXhtbTUseG1tMQotCXN1YnBzCXhtbTAseG1tMgkJOyB4bW0wPXRtcDExCi0Jc3VicHMJeG1tMSx4bW0zCi0JYWRkcHMJeG1tNCx4bW0yCQk7IHhtbTQ9dG1wMTAKLQlhZGRwcwl4bW01LHhtbTMJCTsgeG1tNT10bXAxMwotCi0JbXVscHMJeG1tMSxbR09UT0ZGKGVieCxQRF8xXzQxNCldCi0Jc3VicHMJeG1tMSx4bW01CQk7IHhtbTE9dG1wMTIKLQotCW1vdmFwcwl4bW02LHhtbTQKLQltb3ZhcHMJeG1tNyx4bW0wCi0Jc3VicHMJeG1tNCx4bW01CQk7IHhtbTQ9dG1wMwotCXN1YnBzCXhtbTAseG1tMQkJOyB4bW0wPXRtcDIKLQlhZGRwcwl4bW02LHhtbTUJCTsgeG1tNj10bXAwCi0JYWRkcHMJeG1tNyx4bW0xCQk7IHhtbTc9dG1wMQotCi0JbW92YXBzCVhNTVdPUkQgW3drKDEpXSwgeG1tNAk7IHRtcDMKLQltb3ZhcHMJWE1NV09SRCBbd2soMCldLCB4bW0wCTsgdG1wMgotCi0JOyAtLSBPZGQgcGFydAotCi0JbW92YXBzCXhtbTIsIFhNTVdPUkQgW1hNTUJMT0NLKDEsMCxlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCW1vdmFwcwl4bW0zLCBYTU1XT1JEIFtYTU1CTE9DSygzLDAsZXNpLFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQltb3ZhcHMJeG1tNSwgWE1NV09SRCBbWE1NQkxPQ0soNSwwLGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92YXBzCXhtbTEsIFhNTVdPUkQgW1hNTUJMT0NLKDcsMCxlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCi0JbW92YXBzCXhtbTQseG1tMgotCW1vdmFwcwl4bW0wLHhtbTUKLQlhZGRwcwl4bW0yLHhtbTEJCTsgeG1tMj16MTEKLQlhZGRwcwl4bW01LHhtbTMJCTsgeG1tNT16MTMKLQlzdWJwcwl4bW00LHhtbTEJCTsgeG1tND16MTIKLQlzdWJwcwl4bW0wLHhtbTMJCTsgeG1tMD16MTAKLQotCW1vdmFwcwl4bW0xLHhtbTIKLQlzdWJwcwl4bW0yLHhtbTUKLQlhZGRwcwl4bW0xLHhtbTUJCTsgeG1tMT10bXA3Ci0KLQltdWxwcwl4bW0yLFtHT1RPRkYoZWJ4LFBEXzFfNDE0KV0JOyB4bW0yPXRtcDExCi0KLQltb3ZhcHMJeG1tMyx4bW0wCi0JYWRkcHMJeG1tMCx4bW00Ci0JbXVscHMJeG1tMCxbR09UT0ZGKGVieCxQRF8xXzg0NyldCTsgeG1tMD16NQotCW11bHBzCXhtbTMsW0dPVE9GRihlYngsUERfTTJfNjEzKV0JOyB4bW0zPSh6MTAgKiAtMi42MTMxMjU5MzApCi0JbXVscHMJeG1tNCxbR09UT0ZGKGVieCxQRF8xXzA4MildCTsgeG1tND0oejEyICogMS4wODIzOTIyMDApCi0JYWRkcHMJeG1tMyx4bW0wCQk7IHhtbTM9dG1wMTIKLQlzdWJwcwl4bW00LHhtbTAJCTsgeG1tND10bXAxMAotCi0JOyAtLSBGaW5hbCBvdXRwdXQgc3RhZ2UKLQotCXN1YnBzCXhtbTMseG1tMQkJOyB4bW0zPXRtcDYKLQltb3ZhcHMJeG1tNSx4bW02Ci0JbW92YXBzCXhtbTAseG1tNwotCWFkZHBzCXhtbTYseG1tMQkJOyB4bW02PWRhdGEwPSgwMCAxMCAyMCAzMCkKLQlhZGRwcwl4bW03LHhtbTMJCTsgeG1tNz1kYXRhMT0oMDEgMTEgMjEgMzEpCi0Jc3VicHMJeG1tNSx4bW0xCQk7IHhtbTU9ZGF0YTc9KDA3IDE3IDI3IDM3KQotCXN1YnBzCXhtbTAseG1tMwkJOyB4bW0wPWRhdGE2PSgwNiAxNiAyNiAzNikKLQlzdWJwcwl4bW0yLHhtbTMJCTsgeG1tMj10bXA1Ci0KLQltb3ZhcHMJeG1tMSxbR09UT0ZGKGVieCxQRF9STkRJTlRfTUFHSUMpXQk7IHhtbTE9W1BEX1JORElOVF9NQUdJQ10KLQlwY21wZXFkCXhtbTMseG1tMwotCXBzcmxkCXhtbTMsV09SRF9CSVQJCTsgeG1tMz17MHhGRkZGIDB4MDAwMCAweEZGRkYgMHgwMDAwIC4ufQotCi0JYWRkcHMJeG1tNix4bW0xCTsgeG1tNj1yb3VuZGludChkYXRhMC84KT0oMDAgKiogMTAgKiogMjAgKiogMzAgKiopCi0JYWRkcHMJeG1tNyx4bW0xCTsgeG1tNz1yb3VuZGludChkYXRhMS84KT0oMDEgKiogMTEgKiogMjEgKiogMzEgKiopCi0JYWRkcHMJeG1tMCx4bW0xCTsgeG1tMD1yb3VuZGludChkYXRhNi84KT0oMDYgKiogMTYgKiogMjYgKiogMzYgKiopCi0JYWRkcHMJeG1tNSx4bW0xCTsgeG1tNT1yb3VuZGludChkYXRhNy84KT0oMDcgKiogMTcgKiogMjcgKiogMzcgKiopCi0KLQlwYW5kCXhtbTYseG1tMwkJOyB4bW02PSgwMCAtLSAxMCAtLSAyMCAtLSAzMCAtLSkKLQlwc2xsZAl4bW03LFdPUkRfQklUCQk7IHhtbTc9KC0tIDAxIC0tIDExIC0tIDIxIC0tIDMxKQotCXBhbmQJeG1tMCx4bW0zCQk7IHhtbTA9KDA2IC0tIDE2IC0tIDI2IC0tIDM2IC0tKQotCXBzbGxkCXhtbTUsV09SRF9CSVQJCTsgeG1tNT0oLS0gMDcgLS0gMTcgLS0gMjcgLS0gMzcpCi0JcG9yCXhtbTYseG1tNwkJOyB4bW02PSgwMCAwMSAxMCAxMSAyMCAyMSAzMCAzMSkKLQlwb3IJeG1tMCx4bW01CQk7IHhtbTA9KDA2IDA3IDE2IDE3IDI2IDI3IDM2IDM3KQotCi0JbW92YXBzCXhtbTEsIFhNTVdPUkQgW3drKDApXQk7IHhtbTE9dG1wMgotCW1vdmFwcwl4bW0zLCBYTU1XT1JEIFt3aygxKV0JOyB4bW0zPXRtcDMKLQotCWFkZHBzCXhtbTQseG1tMgkJOyB4bW00PXRtcDQKLQltb3ZhcHMJeG1tNyx4bW0xCi0JbW92YXBzCXhtbTUseG1tMwotCWFkZHBzCXhtbTEseG1tMgkJOyB4bW0xPWRhdGEyPSgwMiAxMiAyMiAzMikKLQlhZGRwcwl4bW0zLHhtbTQJCTsgeG1tMz1kYXRhND0oMDQgMTQgMjQgMzQpCi0Jc3VicHMJeG1tNyx4bW0yCQk7IHhtbTc9ZGF0YTU9KDA1IDE1IDI1IDM1KQotCXN1YnBzCXhtbTUseG1tNAkJOyB4bW01PWRhdGEzPSgwMyAxMyAyMyAzMykKLQotCW1vdmFwcwl4bW0yLFtHT1RPRkYoZWJ4LFBEX1JORElOVF9NQUdJQyldCTsgeG1tMj1bUERfUk5ESU5UX01BR0lDXQotCXBjbXBlcWQJeG1tNCx4bW00Ci0JcHNybGQJeG1tNCxXT1JEX0JJVAkJOyB4bW00PXsweEZGRkYgMHgwMDAwIDB4RkZGRiAweDAwMDAgLi59Ci0KLQlhZGRwcwl4bW0zLHhtbTIJOyB4bW0zPXJvdW5kaW50KGRhdGE0LzgpPSgwNCAqKiAxNCAqKiAyNCAqKiAzNCAqKikKLQlhZGRwcwl4bW03LHhtbTIJOyB4bW03PXJvdW5kaW50KGRhdGE1LzgpPSgwNSAqKiAxNSAqKiAyNSAqKiAzNSAqKikKLQlhZGRwcwl4bW0xLHhtbTIJOyB4bW0xPXJvdW5kaW50KGRhdGEyLzgpPSgwMiAqKiAxMiAqKiAyMiAqKiAzMiAqKikKLQlhZGRwcwl4bW01LHhtbTIJOyB4bW01PXJvdW5kaW50KGRhdGEzLzgpPSgwMyAqKiAxMyAqKiAyMyAqKiAzMyAqKikKLQotCXBhbmQJeG1tMyx4bW00CQk7IHhtbTM9KDA0IC0tIDE0IC0tIDI0IC0tIDM0IC0tKQotCXBzbGxkCXhtbTcsV09SRF9CSVQJCTsgeG1tNz0oLS0gMDUgLS0gMTUgLS0gMjUgLS0gMzUpCi0JcGFuZAl4bW0xLHhtbTQJCTsgeG1tMT0oMDIgLS0gMTIgLS0gMjIgLS0gMzIgLS0pCi0JcHNsbGQJeG1tNSxXT1JEX0JJVAkJOyB4bW01PSgtLSAwMyAtLSAxMyAtLSAyMyAtLSAzMykKLQlwb3IJeG1tMyx4bW03CQk7IHhtbTM9KDA0IDA1IDE0IDE1IDI0IDI1IDM0IDM1KQotCXBvcgl4bW0xLHhtbTUJCTsgeG1tMT0oMDIgMDMgMTIgMTMgMjIgMjMgMzIgMzMpCi0KLQltb3ZkcWEgICAgeG1tMixbR09UT0ZGKGVieCxQQl9DRU5URVJKU0FNUCldCTsgeG1tMj1bUEJfQ0VOVEVSSlNBTVBdCi0KLQlwYWNrc3N3YiAgeG1tNix4bW0zCTsgeG1tNj0oMDAgMDEgMTAgMTEgMjAgMjEgMzAgMzEgMDQgMDUgMTQgMTUgMjQgMjUgMzQgMzUpCi0JcGFja3Nzd2IgIHhtbTEseG1tMAk7IHhtbTE9KDAyIDAzIDEyIDEzIDIyIDIzIDMyIDMzIDA2IDA3IDE2IDE3IDI2IDI3IDM2IDM3KQotCXBhZGRiICAgICB4bW02LHhtbTIKLQlwYWRkYiAgICAgeG1tMSx4bW0yCi0KLQltb3ZkcWEgICAgeG1tNCx4bW02CTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXB1bnBja2x3ZCB4bW02LHhtbTEJOyB4bW02PSgwMCAwMSAwMiAwMyAxMCAxMSAxMiAxMyAyMCAyMSAyMiAyMyAzMCAzMSAzMiAzMykKLQlwdW5wY2tod2QgeG1tNCx4bW0xCTsgeG1tND0oMDQgMDUgMDYgMDcgMTQgMTUgMTYgMTcgMjQgMjUgMjYgMjcgMzQgMzUgMzYgMzcpCi0KLQltb3ZkcWEgICAgeG1tNyx4bW02CTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAzKQotCXB1bnBja2xkcSB4bW02LHhtbTQJOyB4bW02PSgwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNykKLQlwdW5wY2toZHEgeG1tNyx4bW00CTsgeG1tNz0oMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMzAgMzEgMzIgMzMgMzQgMzUgMzYgMzcpCi0KLQlwc2h1ZmQJeG1tNSx4bW02LDB4NEUJOyB4bW01PSgxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNykKLQlwc2h1ZmQJeG1tMyx4bW03LDB4NEUJOyB4bW0zPSgzMCAzMSAzMiAzMyAzNCAzNSAzNiAzNyAyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNykKLQotCXB1c2hwaWMJZWJ4CQkJOyBzYXZlIEdPVCBhZGRyZXNzCi0KLQltb3YJZWR4LCBKU0FNUFJPVyBbZWRpKzAqU0laRU9GX0pTQU1QUk9XXQotCW1vdgllYngsIEpTQU1QUk9XIFtlZGkrMipTSVpFT0ZfSlNBTVBST1ddCi0JbW92cQlfTU1XT1JEIFtlZHgrZWF4KlNJWkVPRl9KU0FNUExFXSwgeG1tNgotCW1vdnEJX01NV09SRCBbZWJ4K2VheCpTSVpFT0ZfSlNBTVBMRV0sIHhtbTcKLQltb3YJZWR4LCBKU0FNUFJPVyBbZWRpKzEqU0laRU9GX0pTQU1QUk9XXQotCW1vdgllYngsIEpTQU1QUk9XIFtlZGkrMypTSVpFT0ZfSlNBTVBST1ddCi0JbW92cQlfTU1XT1JEIFtlZHgrZWF4KlNJWkVPRl9KU0FNUExFXSwgeG1tNQotCW1vdnEJX01NV09SRCBbZWJ4K2VheCpTSVpFT0ZfSlNBTVBMRV0sIHhtbTMKLQotCXBvcHBpYwllYngJCQk7IHJlc3RvcmUgR09UIGFkZHJlc3MKLQotCWFkZAllc2ksIGJ5dGUgNCpTSVpFT0ZfRkFTVF9GTE9BVAk7IHdzcHRyCi0JYWRkCWVkaSwgYnl0ZSA0KlNJWkVPRl9KU0FNUFJPVwotCWRlYwllY3gJCQkJOyBjdHIKLQlqbnoJbmVhciAucm93bG9vcAotCi0JcG9wCWVkaQotCXBvcAllc2kKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwb3AJZWJ4Ci0JbW92CWVzcCxlYnAJCTsgZXNwIDwtIGFsaWduZWQgZWJwCi0JcG9wCWVzcAkJOyBlc3AgPC0gb3JpZ2luYWwgZWJwCi0JcG9wCWVicAotCXJldAotCi0lZW5kaWYgOyBKSURDVF9GTFRfU1NFX1NTRTJfU1VQUE9SVEVECi0lZW5kaWYgOyBEQ1RfRkxPQVRfU1VQUE9SVEVECmRpZmYgLS1naXQgYS9qaXNzMmZzdC5hc20gYi9qaXNzMmZzdC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzN2EyNjAuLjAwMDAwMDAKLS0tIGEvamlzczJmc3QuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNTEyICswLDAgQEAKLTsKLTsgamlzczJmc3QuYXNtIC0gZmFzdCBpbnRlZ2VyIElEQ1QgKFNTRTIpCi07Ci07IHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotOyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgotOyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4ganNpbWRleHQuaW5jCi07Ci07IFRoaXMgZmlsZSBzaG91bGQgYmUgYXNzZW1ibGVkIHdpdGggTkFTTSAoTmV0d2lkZSBBc3NlbWJsZXIpLAotOyBjYW4gKm5vdCogYmUgYXNzZW1ibGVkIHdpdGggTWljcm9zb2Z0J3MgTUFTTSBvciBhbnkgY29tcGF0aWJsZQotOyBhc3NlbWJsZXIgKGluY2x1ZGluZyBCb3JsYW5kJ3MgVHVyYm8gQXNzZW1ibGVyKS4KLTsgTkFTTSBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vbmFzbS5zb3VyY2Vmb3JnZS5uZXQvIG9yCi07IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTYyMDgKLTsKLTsgVGhpcyBmaWxlIGNvbnRhaW5zIGEgZmFzdCwgbm90IHNvIGFjY3VyYXRlIGludGVnZXIgaW1wbGVtZW50YXRpb24gb2YKLTsgdGhlIGludmVyc2UgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4gVGhlIGZvbGxvd2luZyBjb2RlIGlzCi07IGJhc2VkIGRpcmVjdGx5IG9uIHRoZSBJSkcncyBvcmlnaW5hbCBqaWRjdGZzdC5jOyBzZWUgdGhlIGppZGN0ZnN0LmMKLTsgZm9yIG1vcmUgZGV0YWlscy4KLTsKLTsgTGFzdCBNb2RpZmllZCA6IEZlYnJ1YXJ5IDQsIDIwMDYKLTsKLTsgW1RBQjhdCi0KLSVpbmNsdWRlICJqc2ltZGV4dC5pbmMiCi0laW5jbHVkZSAiamRjdC5pbmMiCi0KLSVpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0laWZkZWYgSklEQ1RfSU5UX1NTRTJfU1VQUE9SVEVECi0KLTsgVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCi07Ci0laWYgRENUU0laRSAhPSA4Ci0lZXJyb3IgIlNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiIKLSVlbmRpZgotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSVkZWZpbmUgQ09OU1RfQklUUwk4CTsgMTQgaXMgYWxzbyBPSy4KLSVkZWZpbmUgUEFTUzFfQklUUwkyCi0KLSVpZiBJRkFTVF9TQ0FMRV9CSVRTICE9IFBBU1MxX0JJVFMKLSVlcnJvciAiJ0lGQVNUX1NDQUxFX0JJVFMnIG11c3QgYmUgZXF1YWwgdG8gJ1BBU1MxX0JJVFMnLiIKLSVlbmRpZgotCi0laWYgQ09OU1RfQklUUyA9PSA4Ci1GXzFfMDgyCWVxdQkyNzcJCTsgRklYKDEuMDgyMzkyMjAwKQotRl8xXzQxNAllcXUJMzYyCQk7IEZJWCgxLjQxNDIxMzU2MikKLUZfMV84NDcJZXF1CTQ3MwkJOyBGSVgoMS44NDc3NTkwNjUpCi1GXzJfNjEzCWVxdQk2NjkJCTsgRklYKDIuNjEzMTI1OTMwKQotRl8xXzYxMwllcXUJKEZfMl82MTMgLSAyNTYpCTsgRklYKDIuNjEzMTI1OTMwKSAtIEZJWCgxKQotJWVsc2UKLTsgTkFTTSBjYW5ub3QgZG8gY29tcGlsZS10aW1lIGFyaXRobWV0aWMgb24gZmxvYXRpbmctcG9pbnQgY29uc3RhbnRzLgotJWRlZmluZQlERVNDQUxFKHgsbikgICgoKHgpKygxPDwoKG4pLTEpKSk+PihuKSkKLUZfMV8wODIJZXF1CURFU0NBTEUoMTE2MjIwOTc3NSwzMC1DT05TVF9CSVRTKQk7IEZJWCgxLjA4MjM5MjIwMCkKLUZfMV80MTQJZXF1CURFU0NBTEUoMTUxODUwMDI0OSwzMC1DT05TVF9CSVRTKQk7IEZJWCgxLjQxNDIxMzU2MikKLUZfMV84NDcJZXF1CURFU0NBTEUoMTk4NDAxNjE4OCwzMC1DT05TVF9CSVRTKQk7IEZJWCgxLjg0Nzc1OTA2NSkKLUZfMl82MTMJZXF1CURFU0NBTEUoMjgwNTgyMjYwMiwzMC1DT05TVF9CSVRTKQk7IEZJWCgyLjYxMzEyNTkzMCkKLUZfMV82MTMJZXF1CShGXzJfNjEzIC0gKDEgPDwgQ09OU1RfQklUUykpCTsgRklYKDIuNjEzMTI1OTMwKSAtIEZJWCgxKQotJWVuZGlmCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19DT05TVAotCi07IFBSRV9NVUxUSVBMWV9TQ0FMRV9CSVRTIDw9IDIgKHRvIGF2b2lkIG92ZXJmbG93KQotOyBDT05TVF9CSVRTICsgQ09OU1RfU0hJRlQgKyBQUkVfTVVMVElQTFlfU0NBTEVfQklUUyA9PSAxNiAoZm9yIHBtdWxodykKLQotJWRlZmluZSBQUkVfTVVMVElQTFlfU0NBTEVfQklUUyAgIDIKLSVkZWZpbmUgQ09OU1RfU0hJRlQgICAgICgxNiAtIFBSRV9NVUxUSVBMWV9TQ0FMRV9CSVRTIC0gQ09OU1RfQklUUykKLQotCWFsaWduegkxNgotCWdsb2JhbAlFWFROKGpjb25zdF9pZGN0X2lmYXN0X3NzZTIpCi0KLUVYVE4oamNvbnN0X2lkY3RfaWZhc3Rfc3NlMik6Ci0KLVBXX0YxNDE0CXRpbWVzIDggZHcgIEZfMV80MTQgPDwgQ09OU1RfU0hJRlQKLVBXX0YxODQ3CXRpbWVzIDggZHcgIEZfMV84NDcgPDwgQ09OU1RfU0hJRlQKLVBXX01GMTYxMwl0aW1lcyA4IGR3IC1GXzFfNjEzIDw8IENPTlNUX1NISUZUCi1QV19GMTA4Mgl0aW1lcyA4IGR3ICBGXzFfMDgyIDw8IENPTlNUX1NISUZUCi1QQl9DRU5URVJKU0FNUAl0aW1lcyAxNiBkYiBDRU5URVJKU0FNUExFCi0KLQlhbGlnbnoJMTYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX1RFWFQKLQlCSVRTCTMyCi07Ci07IFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMuCi07Ci07IEdMT0JBTCh2b2lkKQotOyBqcGVnX2lkY3RfaWZhc3Rfc3NlMiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi07ICAgICAgICAgICAgICAgICAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotOyAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCi07Ci0KLSVkZWZpbmUgY2luZm8oYikJKGIpKzgJCTsgal9kZWNvbXByZXNzX3B0ciBjaW5mbwotJWRlZmluZSBjb21wcHRyKGIpCShiKSsxMgkJOyBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cgotJWRlZmluZSBjb2VmX2Jsb2NrKGIpCShiKSsxNgkJOyBKQ09FRlBUUiBjb2VmX2Jsb2NrCi0lZGVmaW5lIG91dHB1dF9idWYoYikJKGIpKzIwCQk7IEpTQU1QQVJSQVkgb3V0cHV0X2J1ZgotJWRlZmluZSBvdXRwdXRfY29sKGIpCShiKSsyNAkJOyBKRElNRU5TSU9OIG91dHB1dF9jb2wKLQotJWRlZmluZSBvcmlnaW5hbF9lYnAJZWJwKzAKLSVkZWZpbmUgd2soaSkJCWVicC0oV0tfTlVNLShpKSkqU0laRU9GX1hNTVdPUkQJOyB4bW13b3JkIHdrW1dLX05VTV0KLSVkZWZpbmUgV0tfTlVNCQkyCi0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfaWRjdF9pZmFzdF9zc2UyKQotCi1FWFROKGpwZWdfaWRjdF9pZmFzdF9zc2UyKToKLQlwdXNoCWVicAotCW1vdgllYXgsZXNwCQkJCTsgZWF4ID0gb3JpZ2luYWwgZWJwCi0Jc3ViCWVzcCwgYnl0ZSA0Ci0JYW5kCWVzcCwgYnl0ZSAoLVNJWkVPRl9YTU1XT1JEKQk7IGFsaWduIHRvIDEyOCBiaXRzCi0JbW92CVtlc3BdLGVheAotCW1vdgllYnAsZXNwCQkJCTsgZWJwID0gYWxpZ25lZCBlYnAKLQlsZWEJZXNwLCBbd2soMCldCi0JcHVzaHBpYwllYngKLTsJcHVzaAllY3gJCTsgdW51c2VkCi07CXB1c2gJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXB1c2gJZXNpCi0JcHVzaAllZGkKLQotCWdldF9HT1QJZWJ4CQk7IGdldCBHT1QgYWRkcmVzcwotCi0JOyAtLS0tIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQuCi0KLTsJbW92CWVheCwgW29yaWdpbmFsX2VicF0KLQltb3YJZWR4LCBQT0lOVEVSIFtjb21wcHRyKGVheCldCi0JbW92CWVkeCwgUE9JTlRFUiBbamNvbXBpbmZvX2RjdF90YWJsZShlZHgpXQk7IHF1YW50cHRyCi0JbW92CWVzaSwgSkNPRUZQVFIgW2NvZWZfYmxvY2soZWF4KV0JCTsgaW5wdHIKLQotJWlmbmRlZiBOT19aRVJPX0NPTFVNTl9URVNUX0lGQVNUX1NTRTIKLQltb3YJZWF4LCBEV09SRCBbRFdCTE9DSygxLDAsZXNpLFNJWkVPRl9KQ09FRildCi0Jb3IJZWF4LCBEV09SRCBbRFdCTE9DSygyLDAsZXNpLFNJWkVPRl9KQ09FRildCi0Jam56CW5lYXIgLmNvbHVtbkRDVAotCi0JbW92ZHFhCXhtbTAsIFhNTVdPUkQgW1hNTUJMT0NLKDEsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQltb3ZkcWEJeG1tMSwgWE1NV09SRCBbWE1NQkxPQ0soMiwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCXBvcgl4bW0wLCBYTU1XT1JEIFtYTU1CTE9DSygzLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JcG9yCXhtbTEsIFhNTVdPUkQgW1hNTUJMT0NLKDQsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQlwb3IJeG1tMCwgWE1NV09SRCBbWE1NQkxPQ0soNSwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCXBvcgl4bW0xLCBYTU1XT1JEIFtYTU1CTE9DSyg2LDAsZXNpLFNJWkVPRl9KQ09FRildCi0JcG9yCXhtbTAsIFhNTVdPUkQgW1hNTUJMT0NLKDcsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQlwb3IJeG1tMSx4bW0wCi0JcGFja3Nzd2IgeG1tMSx4bW0xCi0JcGFja3Nzd2IgeG1tMSx4bW0xCi0JbW92ZAllYXgseG1tMQotCXRlc3QJZWF4LGVheAotCWpueglzaG9ydCAuY29sdW1uRENUCi0KLQk7IC0tIEFDIHRlcm1zIGFsbCB6ZXJvCi0KLQltb3ZkcWEJeG1tMCwgWE1NV09SRCBbWE1NQkxPQ0soMCwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCXBtdWxsdwl4bW0wLCBYTU1XT1JEIFtYTU1CTE9DSygwLDAsZWR4LFNJWkVPRl9JU0xPV19NVUxUX1RZUEUpXQotCi0JbW92ZHFhICAgIHhtbTcseG1tMAkJOyB4bW0wPWluMD0oMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcpCi0JcHVucGNrbHdkIHhtbTAseG1tMAkJOyB4bW0wPSgwMCAwMCAwMSAwMSAwMiAwMiAwMyAwMykKLQlwdW5wY2tod2QgeG1tNyx4bW03CQk7IHhtbTc9KDA0IDA0IDA1IDA1IDA2IDA2IDA3IDA3KQotCi0JcHNodWZkCXhtbTYseG1tMCwweDAwCQk7IHhtbTY9Y29sMD0oMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDApCi0JcHNodWZkCXhtbTIseG1tMCwweDU1CQk7IHhtbTI9Y29sMT0oMDEgMDEgMDEgMDEgMDEgMDEgMDEgMDEpCi0JcHNodWZkCXhtbTUseG1tMCwweEFBCQk7IHhtbTU9Y29sMj0oMDIgMDIgMDIgMDIgMDIgMDIgMDIgMDIpCi0JcHNodWZkCXhtbTAseG1tMCwweEZGCQk7IHhtbTA9Y29sMz0oMDMgMDMgMDMgMDMgMDMgMDMgMDMgMDMpCi0JcHNodWZkCXhtbTEseG1tNywweDAwCQk7IHhtbTE9Y29sND0oMDQgMDQgMDQgMDQgMDQgMDQgMDQgMDQpCi0JcHNodWZkCXhtbTQseG1tNywweDU1CQk7IHhtbTQ9Y29sNT0oMDUgMDUgMDUgMDUgMDUgMDUgMDUgMDUpCi0JcHNodWZkCXhtbTMseG1tNywweEFBCQk7IHhtbTM9Y29sNj0oMDYgMDYgMDYgMDYgMDYgMDYgMDYgMDYpCi0JcHNodWZkCXhtbTcseG1tNywweEZGCQk7IHhtbTc9Y29sNz0oMDcgMDcgMDcgMDcgMDcgMDcgMDcgMDcpCi0KLQltb3ZkcWEJWE1NV09SRCBbd2soMCldLCB4bW0yCTsgd2soMCk9Y29sMQotCW1vdmRxYQlYTU1XT1JEIFt3aygxKV0sIHhtbTAJOyB3aygxKT1jb2wzCi0Jam1wCW5lYXIgLmNvbHVtbl9lbmQKLQlhbGlnbngJMTYsNwotJWVuZGlmCi0uY29sdW1uRENUOgotCi0JOyAtLSBFdmVuIHBhcnQKLQotCW1vdmRxYQl4bW0wLCBYTU1XT1JEIFtYTU1CTE9DSygwLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92ZHFhCXhtbTEsIFhNTVdPUkQgW1hNTUJMT0NLKDIsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQlwbXVsbHcJeG1tMCwgWE1NV09SRCBbWE1NQkxPQ0soMCwwLGVkeCxTSVpFT0ZfSUZBU1RfTVVMVF9UWVBFKV0KLQlwbXVsbHcJeG1tMSwgWE1NV09SRCBbWE1NQkxPQ0soMiwwLGVkeCxTSVpFT0ZfSUZBU1RfTVVMVF9UWVBFKV0KLQltb3ZkcWEJeG1tMiwgWE1NV09SRCBbWE1NQkxPQ0soNCwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdmRxYQl4bW0zLCBYTU1XT1JEIFtYTU1CTE9DSyg2LDAsZXNpLFNJWkVPRl9KQ09FRildCi0JcG11bGx3CXhtbTIsIFhNTVdPUkQgW1hNTUJMT0NLKDQsMCxlZHgsU0laRU9GX0lGQVNUX01VTFRfVFlQRSldCi0JcG11bGx3CXhtbTMsIFhNTVdPUkQgW1hNTUJMT0NLKDYsMCxlZHgsU0laRU9GX0lGQVNUX01VTFRfVFlQRSldCi0KLQltb3ZkcWEJeG1tNCx4bW0wCi0JbW92ZHFhCXhtbTUseG1tMQotCXBzdWJ3CXhtbTAseG1tMgkJOyB4bW0wPXRtcDExCi0JcHN1YncJeG1tMSx4bW0zCi0JcGFkZHcJeG1tNCx4bW0yCQk7IHhtbTQ9dG1wMTAKLQlwYWRkdwl4bW01LHhtbTMJCTsgeG1tNT10bXAxMwotCi0JcHNsbHcJeG1tMSxQUkVfTVVMVElQTFlfU0NBTEVfQklUUwotCXBtdWxodwl4bW0xLFtHT1RPRkYoZWJ4LFBXX0YxNDE0KV0KLQlwc3Vidwl4bW0xLHhtbTUJCTsgeG1tMT10bXAxMgotCi0JbW92ZHFhCXhtbTYseG1tNAotCW1vdmRxYQl4bW03LHhtbTAKLQlwc3Vidwl4bW00LHhtbTUJCTsgeG1tND10bXAzCi0JcHN1YncJeG1tMCx4bW0xCQk7IHhtbTA9dG1wMgotCXBhZGR3CXhtbTYseG1tNQkJOyB4bW02PXRtcDAKLQlwYWRkdwl4bW03LHhtbTEJCTsgeG1tNz10bXAxCi0KLQltb3ZkcWEJWE1NV09SRCBbd2soMSldLCB4bW00CTsgd2soMSk9dG1wMwotCW1vdmRxYQlYTU1XT1JEIFt3aygwKV0sIHhtbTAJOyB3aygwKT10bXAyCi0KLQk7IC0tIE9kZCBwYXJ0Ci0KLQltb3ZkcWEJeG1tMiwgWE1NV09SRCBbWE1NQkxPQ0soMSwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdmRxYQl4bW0zLCBYTU1XT1JEIFtYTU1CTE9DSygzLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JcG11bGx3CXhtbTIsIFhNTVdPUkQgW1hNTUJMT0NLKDEsMCxlZHgsU0laRU9GX0lGQVNUX01VTFRfVFlQRSldCi0JcG11bGx3CXhtbTMsIFhNTVdPUkQgW1hNTUJMT0NLKDMsMCxlZHgsU0laRU9GX0lGQVNUX01VTFRfVFlQRSldCi0JbW92ZHFhCXhtbTUsIFhNTVdPUkQgW1hNTUJMT0NLKDUsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQltb3ZkcWEJeG1tMSwgWE1NV09SRCBbWE1NQkxPQ0soNywwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCXBtdWxsdwl4bW01LCBYTU1XT1JEIFtYTU1CTE9DSyg1LDAsZWR4LFNJWkVPRl9JRkFTVF9NVUxUX1RZUEUpXQotCXBtdWxsdwl4bW0xLCBYTU1XT1JEIFtYTU1CTE9DSyg3LDAsZWR4LFNJWkVPRl9JRkFTVF9NVUxUX1RZUEUpXQotCi0JbW92ZHFhCXhtbTQseG1tMgotCW1vdmRxYQl4bW0wLHhtbTUKLQlwc3Vidwl4bW0yLHhtbTEJCTsgeG1tMj16MTIKLQlwc3Vidwl4bW01LHhtbTMJCTsgeG1tNT16MTAKLQlwYWRkdwl4bW00LHhtbTEJCTsgeG1tND16MTEKLQlwYWRkdwl4bW0wLHhtbTMJCTsgeG1tMD16MTMKLQotCW1vdmRxYQl4bW0xLHhtbTUJCTsgeG1tMT16MTAodW5zY2FsZWQpCi0JcHNsbHcJeG1tMixQUkVfTVVMVElQTFlfU0NBTEVfQklUUwotCXBzbGx3CXhtbTUsUFJFX01VTFRJUExZX1NDQUxFX0JJVFMKLQotCW1vdmRxYQl4bW0zLHhtbTQKLQlwc3Vidwl4bW00LHhtbTAKLQlwYWRkdwl4bW0zLHhtbTAJCTsgeG1tMz10bXA3Ci0KLQlwc2xsdwl4bW00LFBSRV9NVUxUSVBMWV9TQ0FMRV9CSVRTCi0JcG11bGh3CXhtbTQsW0dPVE9GRihlYngsUFdfRjE0MTQpXQk7IHhtbTQ9dG1wMTEKLQotCTsgVG8gYXZvaWQgb3ZlcmZsb3cuLi4KLQk7Ci0JOyAoT3JpZ2luYWwpCi0JOyB0bXAxMiA9IC0yLjYxMzEyNTkzMCAqIHoxMCArIHo1OwotCTsKLQk7IChUaGlzIGltcGxlbWVudGF0aW9uKQotCTsgdG1wMTIgPSAoLTEuNjEzMTI1OTMwIC0gMSkgKiB6MTAgKyB6NTsKLQk7ICAgICAgID0gLTEuNjEzMTI1OTMwICogejEwIC0gejEwICsgejU7Ci0KLQltb3ZkcWEJeG1tMCx4bW01Ci0JcGFkZHcJeG1tNSx4bW0yCi0JcG11bGh3CXhtbTUsW0dPVE9GRihlYngsUFdfRjE4NDcpXQk7IHhtbTU9ejUKLQlwbXVsaHcJeG1tMCxbR09UT0ZGKGVieCxQV19NRjE2MTMpXQotCXBtdWxodwl4bW0yLFtHT1RPRkYoZWJ4LFBXX0YxMDgyKV0KLQlwc3Vidwl4bW0wLHhtbTEKLQlwc3Vidwl4bW0yLHhtbTUJCTsgeG1tMj10bXAxMAotCXBhZGR3CXhtbTAseG1tNQkJOyB4bW0wPXRtcDEyCi0KLQk7IC0tIEZpbmFsIG91dHB1dCBzdGFnZQotCi0JcHN1YncJeG1tMCx4bW0zCQk7IHhtbTA9dG1wNgotCW1vdmRxYQl4bW0xLHhtbTYKLQltb3ZkcWEJeG1tNSx4bW03Ci0JcGFkZHcJeG1tNix4bW0zCQk7IHhtbTY9ZGF0YTA9KDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3KQotCXBhZGR3CXhtbTcseG1tMAkJOyB4bW03PWRhdGExPSgxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNykKLQlwc3Vidwl4bW0xLHhtbTMJCTsgeG1tMT1kYXRhNz0oNzAgNzEgNzIgNzMgNzQgNzUgNzYgNzcpCi0JcHN1YncJeG1tNSx4bW0wCQk7IHhtbTU9ZGF0YTY9KDYwIDYxIDYyIDYzIDY0IDY1IDY2IDY3KQotCXBzdWJ3CXhtbTQseG1tMAkJOyB4bW00PXRtcDUKLQotCW1vdmRxYSAgICB4bW0zLHhtbTYJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAxKQotCXB1bnBja2x3ZCB4bW02LHhtbTcJCTsgeG1tNj0oMDAgMTAgMDEgMTEgMDIgMTIgMDMgMTMpCi0JcHVucGNraHdkIHhtbTMseG1tNwkJOyB4bW0zPSgwNCAxNCAwNSAxNSAwNiAxNiAwNyAxNykKLQltb3ZkcWEgICAgeG1tMCx4bW01CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMSkKLQlwdW5wY2tsd2QgeG1tNSx4bW0xCQk7IHhtbTU9KDYwIDcwIDYxIDcxIDYyIDcyIDYzIDczKQotCXB1bnBja2h3ZCB4bW0wLHhtbTEJCTsgeG1tMD0oNjQgNzQgNjUgNzUgNjYgNzYgNjcgNzcpCi0KLQltb3ZkcWEJeG1tNywgWE1NV09SRCBbd2soMCldCTsgeG1tNz10bXAyCi0JbW92ZHFhCXhtbTEsIFhNTVdPUkQgW3drKDEpXQk7IHhtbTE9dG1wMwotCi0JbW92ZHFhCVhNTVdPUkQgW3drKDApXSwgeG1tNQk7IHdrKDApPSg2MCA3MCA2MSA3MSA2MiA3MiA2MyA3MykKLQltb3ZkcWEJWE1NV09SRCBbd2soMSldLCB4bW0wCTsgd2soMSk9KDY0IDc0IDY1IDc1IDY2IDc2IDY3IDc3KQotCi0JcGFkZHcJeG1tMix4bW00CQk7IHhtbTI9dG1wNAotCW1vdmRxYQl4bW01LHhtbTcKLQltb3ZkcWEJeG1tMCx4bW0xCi0JcGFkZHcJeG1tNyx4bW00CQk7IHhtbTc9ZGF0YTI9KDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3KQotCXBhZGR3CXhtbTEseG1tMgkJOyB4bW0xPWRhdGE0PSg0MCA0MSA0MiA0MyA0NCA0NSA0NiA0NykKLQlwc3Vidwl4bW01LHhtbTQJCTsgeG1tNT1kYXRhNT0oNTAgNTEgNTIgNTMgNTQgNTUgNTYgNTcpCi0JcHN1YncJeG1tMCx4bW0yCQk7IHhtbTA9ZGF0YTM9KDMwIDMxIDMyIDMzIDM0IDM1IDM2IDM3KQotCi0JbW92ZHFhICAgIHhtbTQseG1tNwkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDEpCi0JcHVucGNrbHdkIHhtbTcseG1tMAkJOyB4bW03PSgyMCAzMCAyMSAzMSAyMiAzMiAyMyAzMykKLQlwdW5wY2tod2QgeG1tNCx4bW0wCQk7IHhtbTQ9KDI0IDM0IDI1IDM1IDI2IDM2IDI3IDM3KQotCW1vdmRxYSAgICB4bW0yLHhtbTEJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAxKQotCXB1bnBja2x3ZCB4bW0xLHhtbTUJCTsgeG1tMT0oNDAgNTAgNDEgNTEgNDIgNTIgNDMgNTMpCi0JcHVucGNraHdkIHhtbTIseG1tNQkJOyB4bW0yPSg0NCA1NCA0NSA1NSA0NiA1NiA0NyA1NykKLQotCW1vdmRxYSAgICB4bW0wLHhtbTMJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXB1bnBja2xkcSB4bW0zLHhtbTQJCTsgeG1tMz0oMDQgMTQgMjQgMzQgMDUgMTUgMjUgMzUpCi0JcHVucGNraGRxIHhtbTAseG1tNAkJOyB4bW0wPSgwNiAxNiAyNiAzNiAwNyAxNyAyNyAzNykKLQltb3ZkcWEgICAgeG1tNSx4bW02CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMikKLQlwdW5wY2tsZHEgeG1tNix4bW03CQk7IHhtbTY9KDAwIDEwIDIwIDMwIDAxIDExIDIxIDMxKQotCXB1bnBja2hkcSB4bW01LHhtbTcJCTsgeG1tNT0oMDIgMTIgMjIgMzIgMDMgMTMgMjMgMzMpCi0KLQltb3ZkcWEJeG1tNCwgWE1NV09SRCBbd2soMCldCTsgeG1tND0oNjAgNzAgNjEgNzEgNjIgNzIgNjMgNzMpCi0JbW92ZHFhCXhtbTcsIFhNTVdPUkQgW3drKDEpXQk7IHhtbTc9KDY0IDc0IDY1IDc1IDY2IDc2IDY3IDc3KQotCi0JbW92ZHFhCVhNTVdPUkQgW3drKDApXSwgeG1tMwk7IHdrKDApPSgwNCAxNCAyNCAzNCAwNSAxNSAyNSAzNSkKLQltb3ZkcWEJWE1NV09SRCBbd2soMSldLCB4bW0wCTsgd2soMSk9KDA2IDE2IDI2IDM2IDA3IDE3IDI3IDM3KQotCi0JbW92ZHFhICAgIHhtbTMseG1tMQkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDIpCi0JcHVucGNrbGRxIHhtbTEseG1tNAkJOyB4bW0xPSg0MCA1MCA2MCA3MCA0MSA1MSA2MSA3MSkKLQlwdW5wY2toZHEgeG1tMyx4bW00CQk7IHhtbTM9KDQyIDUyIDYyIDcyIDQzIDUzIDYzIDczKQotCW1vdmRxYSAgICB4bW0wLHhtbTIJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXB1bnBja2xkcSB4bW0yLHhtbTcJCTsgeG1tMj0oNDQgNTQgNjQgNzQgNDUgNTUgNjUgNzUpCi0JcHVucGNraGRxIHhtbTAseG1tNwkJOyB4bW0wPSg0NiA1NiA2NiA3NiA0NyA1NyA2NyA3NykKLQotCW1vdmRxYSAgICAgeG1tNCx4bW02CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMykKLQlwdW5wY2tscWRxIHhtbTYseG1tMQkJOyB4bW02PWNvbDA9KDAwIDEwIDIwIDMwIDQwIDUwIDYwIDcwKQotCXB1bnBja2hxZHEgeG1tNCx4bW0xCQk7IHhtbTQ9Y29sMT0oMDEgMTEgMjEgMzEgNDEgNTEgNjEgNzEpCi0JbW92ZHFhICAgICB4bW03LHhtbTUJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAzKQotCXB1bnBja2xxZHEgeG1tNSx4bW0zCQk7IHhtbTU9Y29sMj0oMDIgMTIgMjIgMzIgNDIgNTIgNjIgNzIpCi0JcHVucGNraHFkcSB4bW03LHhtbTMJCTsgeG1tNz1jb2wzPSgwMyAxMyAyMyAzMyA0MyA1MyA2MyA3MykKLQotCW1vdmRxYQl4bW0xLCBYTU1XT1JEIFt3aygwKV0JOyB4bW0xPSgwNCAxNCAyNCAzNCAwNSAxNSAyNSAzNSkKLQltb3ZkcWEJeG1tMywgWE1NV09SRCBbd2soMSldCTsgeG1tMz0oMDYgMTYgMjYgMzYgMDcgMTcgMjcgMzcpCi0KLQltb3ZkcWEJWE1NV09SRCBbd2soMCldLCB4bW00CTsgd2soMCk9Y29sMQotCW1vdmRxYQlYTU1XT1JEIFt3aygxKV0sIHhtbTcJOyB3aygxKT1jb2wzCi0KLQltb3ZkcWEgICAgIHhtbTQseG1tMQkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDMpCi0JcHVucGNrbHFkcSB4bW0xLHhtbTIJCTsgeG1tMT1jb2w0PSgwNCAxNCAyNCAzNCA0NCA1NCA2NCA3NCkKLQlwdW5wY2tocWRxIHhtbTQseG1tMgkJOyB4bW00PWNvbDU9KDA1IDE1IDI1IDM1IDQ1IDU1IDY1IDc1KQotCW1vdmRxYSAgICAgeG1tNyx4bW0zCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMykKLQlwdW5wY2tscWRxIHhtbTMseG1tMAkJOyB4bW0zPWNvbDY9KDA2IDE2IDI2IDM2IDQ2IDU2IDY2IDc2KQotCXB1bnBja2hxZHEgeG1tNyx4bW0wCQk7IHhtbTc9Y29sNz0oMDcgMTcgMjcgMzcgNDcgNTcgNjcgNzcpCi0uY29sdW1uX2VuZDoKLQotCTsgLS0gUHJlZmV0Y2ggdGhlIG5leHQgY29lZmZpY2llbnQgYmxvY2sKLQotCXByZWZldGNobnRhIFtlc2kgKyBEQ1RTSVpFMipTSVpFT0ZfSkNPRUYgKyAwKjMyXQotCXByZWZldGNobnRhIFtlc2kgKyBEQ1RTSVpFMipTSVpFT0ZfSkNPRUYgKyAxKjMyXQotCXByZWZldGNobnRhIFtlc2kgKyBEQ1RTSVpFMipTSVpFT0ZfSkNPRUYgKyAyKjMyXQotCXByZWZldGNobnRhIFtlc2kgKyBEQ1RTSVpFMipTSVpFT0ZfSkNPRUYgKyAzKjMyXQotCi0JOyAtLS0tIFBhc3MgMjogcHJvY2VzcyByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuCi0KLQltb3YJZWF4LCBbb3JpZ2luYWxfZWJwXQotCW1vdgllZGksIEpTQU1QQVJSQVkgW291dHB1dF9idWYoZWF4KV0JOyAoSlNBTVBST1cgKikKLQltb3YJZWF4LCBKRElNRU5TSU9OIFtvdXRwdXRfY29sKGVheCldCi0KLQk7IC0tIEV2ZW4gcGFydAotCi0JOyB4bW02PWNvbDAsIHhtbTU9Y29sMiwgeG1tMT1jb2w0LCB4bW0zPWNvbDYKLQotCW1vdmRxYQl4bW0yLHhtbTYKLQltb3ZkcWEJeG1tMCx4bW01Ci0JcHN1YncJeG1tNix4bW0xCQk7IHhtbTY9dG1wMTEKLQlwc3Vidwl4bW01LHhtbTMKLQlwYWRkdwl4bW0yLHhtbTEJCTsgeG1tMj10bXAxMAotCXBhZGR3CXhtbTAseG1tMwkJOyB4bW0wPXRtcDEzCi0KLQlwc2xsdwl4bW01LFBSRV9NVUxUSVBMWV9TQ0FMRV9CSVRTCi0JcG11bGh3CXhtbTUsW0dPVE9GRihlYngsUFdfRjE0MTQpXQotCXBzdWJ3CXhtbTUseG1tMAkJOyB4bW01PXRtcDEyCi0KLQltb3ZkcWEJeG1tMSx4bW0yCi0JbW92ZHFhCXhtbTMseG1tNgotCXBzdWJ3CXhtbTIseG1tMAkJOyB4bW0yPXRtcDMKLQlwc3Vidwl4bW02LHhtbTUJCTsgeG1tNj10bXAyCi0JcGFkZHcJeG1tMSx4bW0wCQk7IHhtbTE9dG1wMAotCXBhZGR3CXhtbTMseG1tNQkJOyB4bW0zPXRtcDEKLQotCW1vdmRxYQl4bW0wLCBYTU1XT1JEIFt3aygwKV0JOyB4bW0wPWNvbDEKLQltb3ZkcWEJeG1tNSwgWE1NV09SRCBbd2soMSldCTsgeG1tNT1jb2wzCi0KLQltb3ZkcWEJWE1NV09SRCBbd2soMCldLCB4bW0yCTsgd2soMCk9dG1wMwotCW1vdmRxYQlYTU1XT1JEIFt3aygxKV0sIHhtbTYJOyB3aygxKT10bXAyCi0KLQk7IC0tIE9kZCBwYXJ0Ci0KLQk7IHhtbTA9Y29sMSwgeG1tNT1jb2wzLCB4bW00PWNvbDUsIHhtbTc9Y29sNwotCi0JbW92ZHFhCXhtbTIseG1tMAotCW1vdmRxYQl4bW02LHhtbTQKLQlwc3Vidwl4bW0wLHhtbTcJCTsgeG1tMD16MTIKLQlwc3Vidwl4bW00LHhtbTUJCTsgeG1tND16MTAKLQlwYWRkdwl4bW0yLHhtbTcJCTsgeG1tMj16MTEKLQlwYWRkdwl4bW02LHhtbTUJCTsgeG1tNj16MTMKLQotCW1vdmRxYQl4bW03LHhtbTQJCTsgeG1tNz16MTAodW5zY2FsZWQpCi0JcHNsbHcJeG1tMCxQUkVfTVVMVElQTFlfU0NBTEVfQklUUwotCXBzbGx3CXhtbTQsUFJFX01VTFRJUExZX1NDQUxFX0JJVFMKLQotCW1vdmRxYQl4bW01LHhtbTIKLQlwc3Vidwl4bW0yLHhtbTYKLQlwYWRkdwl4bW01LHhtbTYJCTsgeG1tNT10bXA3Ci0KLQlwc2xsdwl4bW0yLFBSRV9NVUxUSVBMWV9TQ0FMRV9CSVRTCi0JcG11bGh3CXhtbTIsW0dPVE9GRihlYngsUFdfRjE0MTQpXQk7IHhtbTI9dG1wMTEKLQotCTsgVG8gYXZvaWQgb3ZlcmZsb3cuLi4KLQk7Ci0JOyAoT3JpZ2luYWwpCi0JOyB0bXAxMiA9IC0yLjYxMzEyNTkzMCAqIHoxMCArIHo1OwotCTsKLQk7IChUaGlzIGltcGxlbWVudGF0aW9uKQotCTsgdG1wMTIgPSAoLTEuNjEzMTI1OTMwIC0gMSkgKiB6MTAgKyB6NTsKLQk7ICAgICAgID0gLTEuNjEzMTI1OTMwICogejEwIC0gejEwICsgejU7Ci0KLQltb3ZkcWEJeG1tNix4bW00Ci0JcGFkZHcJeG1tNCx4bW0wCi0JcG11bGh3CXhtbTQsW0dPVE9GRihlYngsUFdfRjE4NDcpXQk7IHhtbTQ9ejUKLQlwbXVsaHcJeG1tNixbR09UT0ZGKGVieCxQV19NRjE2MTMpXQotCXBtdWxodwl4bW0wLFtHT1RPRkYoZWJ4LFBXX0YxMDgyKV0KLQlwc3Vidwl4bW02LHhtbTcKLQlwc3Vidwl4bW0wLHhtbTQJCTsgeG1tMD10bXAxMAotCXBhZGR3CXhtbTYseG1tNAkJOyB4bW02PXRtcDEyCi0KLQk7IC0tIEZpbmFsIG91dHB1dCBzdGFnZQotCi0JcHN1YncJeG1tNix4bW01CQk7IHhtbTY9dG1wNgotCW1vdmRxYQl4bW03LHhtbTEKLQltb3ZkcWEJeG1tNCx4bW0zCi0JcGFkZHcJeG1tMSx4bW01CQk7IHhtbTE9ZGF0YTA9KDAwIDEwIDIwIDMwIDQwIDUwIDYwIDcwKQotCXBhZGR3CXhtbTMseG1tNgkJOyB4bW0zPWRhdGExPSgwMSAxMSAyMSAzMSA0MSA1MSA2MSA3MSkKLQlwc3Jhdwl4bW0xLChQQVNTMV9CSVRTKzMpCTsgZGVzY2FsZQotCXBzcmF3CXhtbTMsKFBBU1MxX0JJVFMrMykJOyBkZXNjYWxlCi0JcHN1YncJeG1tNyx4bW01CQk7IHhtbTc9ZGF0YTc9KDA3IDE3IDI3IDM3IDQ3IDU3IDY3IDc3KQotCXBzdWJ3CXhtbTQseG1tNgkJOyB4bW00PWRhdGE2PSgwNiAxNiAyNiAzNiA0NiA1NiA2NiA3NikKLQlwc3Jhdwl4bW03LChQQVNTMV9CSVRTKzMpCTsgZGVzY2FsZQotCXBzcmF3CXhtbTQsKFBBU1MxX0JJVFMrMykJOyBkZXNjYWxlCi0JcHN1YncJeG1tMix4bW02CQk7IHhtbTI9dG1wNQotCi0JcGFja3Nzd2IgIHhtbTEseG1tNAk7IHhtbTE9KDAwIDEwIDIwIDMwIDQwIDUwIDYwIDcwIDA2IDE2IDI2IDM2IDQ2IDU2IDY2IDc2KQotCXBhY2tzc3diICB4bW0zLHhtbTcJOyB4bW0zPSgwMSAxMSAyMSAzMSA0MSA1MSA2MSA3MSAwNyAxNyAyNyAzNyA0NyA1NyA2NyA3NykKLQotCW1vdmRxYQl4bW01LCBYTU1XT1JEIFt3aygxKV0JOyB4bW01PXRtcDIKLQltb3ZkcWEJeG1tNiwgWE1NV09SRCBbd2soMCldCTsgeG1tNj10bXAzCi0KLQlwYWRkdwl4bW0wLHhtbTIJCTsgeG1tMD10bXA0Ci0JbW92ZHFhCXhtbTQseG1tNQotCW1vdmRxYQl4bW03LHhtbTYKLQlwYWRkdwl4bW01LHhtbTIJCTsgeG1tNT1kYXRhMj0oMDIgMTIgMjIgMzIgNDIgNTIgNjIgNzIpCi0JcGFkZHcJeG1tNix4bW0wCQk7IHhtbTY9ZGF0YTQ9KDA0IDE0IDI0IDM0IDQ0IDU0IDY0IDc0KQotCXBzcmF3CXhtbTUsKFBBU1MxX0JJVFMrMykJOyBkZXNjYWxlCi0JcHNyYXcJeG1tNiwoUEFTUzFfQklUUyszKQk7IGRlc2NhbGUKLQlwc3Vidwl4bW00LHhtbTIJCTsgeG1tND1kYXRhNT0oMDUgMTUgMjUgMzUgNDUgNTUgNjUgNzUpCi0JcHN1YncJeG1tNyx4bW0wCQk7IHhtbTc9ZGF0YTM9KDAzIDEzIDIzIDMzIDQzIDUzIDYzIDczKQotCXBzcmF3CXhtbTQsKFBBU1MxX0JJVFMrMykJOyBkZXNjYWxlCi0JcHNyYXcJeG1tNywoUEFTUzFfQklUUyszKQk7IGRlc2NhbGUKLQotCW1vdmRxYSAgICB4bW0yLFtHT1RPRkYoZWJ4LFBCX0NFTlRFUkpTQU1QKV0JOyB4bW0yPVtQQl9DRU5URVJKU0FNUF0KLQotCXBhY2tzc3diICB4bW01LHhtbTYJOyB4bW01PSgwMiAxMiAyMiAzMiA0MiA1MiA2MiA3MiAwNCAxNCAyNCAzNCA0NCA1NCA2NCA3NCkKLQlwYWNrc3N3YiAgeG1tNyx4bW00CTsgeG1tNz0oMDMgMTMgMjMgMzMgNDMgNTMgNjMgNzMgMDUgMTUgMjUgMzUgNDUgNTUgNjUgNzUpCi0KLQlwYWRkYiAgICAgeG1tMSx4bW0yCi0JcGFkZGIgICAgIHhtbTMseG1tMgotCXBhZGRiICAgICB4bW01LHhtbTIKLQlwYWRkYiAgICAgeG1tNyx4bW0yCi0KLQltb3ZkcWEgICAgeG1tMCx4bW0xCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAxKQotCXB1bnBja2xidyB4bW0xLHhtbTMJOyB4bW0xPSgwMCAwMSAxMCAxMSAyMCAyMSAzMCAzMSA0MCA0MSA1MCA1MSA2MCA2MSA3MCA3MSkKLQlwdW5wY2toYncgeG1tMCx4bW0zCTsgeG1tMD0oMDYgMDcgMTYgMTcgMjYgMjcgMzYgMzcgNDYgNDcgNTYgNTcgNjYgNjcgNzYgNzcpCi0JbW92ZHFhICAgIHhtbTYseG1tNQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMSkKLQlwdW5wY2tsYncgeG1tNSx4bW03CTsgeG1tNT0oMDIgMDMgMTIgMTMgMjIgMjMgMzIgMzMgNDIgNDMgNTIgNTMgNjIgNjMgNzIgNzMpCi0JcHVucGNraGJ3IHhtbTYseG1tNwk7IHhtbTY9KDA0IDA1IDE0IDE1IDI0IDI1IDM0IDM1IDQ0IDQ1IDU0IDU1IDY0IDY1IDc0IDc1KQotCi0JbW92ZHFhICAgIHhtbTQseG1tMQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMikKLQlwdW5wY2tsd2QgeG1tMSx4bW01CTsgeG1tMT0oMDAgMDEgMDIgMDMgMTAgMTEgMTIgMTMgMjAgMjEgMjIgMjMgMzAgMzEgMzIgMzMpCi0JcHVucGNraHdkIHhtbTQseG1tNQk7IHhtbTQ9KDQwIDQxIDQyIDQzIDUwIDUxIDUyIDUzIDYwIDYxIDYyIDYzIDcwIDcxIDcyIDczKQotCW1vdmRxYSAgICB4bW0yLHhtbTYJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDIpCi0JcHVucGNrbHdkIHhtbTYseG1tMAk7IHhtbTY9KDA0IDA1IDA2IDA3IDE0IDE1IDE2IDE3IDI0IDI1IDI2IDI3IDM0IDM1IDM2IDM3KQotCXB1bnBja2h3ZCB4bW0yLHhtbTAJOyB4bW0yPSg0NCA0NSA0NiA0NyA1NCA1NSA1NiA1NyA2NCA2NSA2NiA2NyA3NCA3NSA3NiA3NykKLQotCW1vdmRxYSAgICB4bW0zLHhtbTEJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDMpCi0JcHVucGNrbGRxIHhtbTEseG1tNgk7IHhtbTE9KDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3IDEwIDExIDEyIDEzIDE0IDE1IDE2IDE3KQotCXB1bnBja2hkcSB4bW0zLHhtbTYJOyB4bW0zPSgyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNyAzMCAzMSAzMiAzMyAzNCAzNSAzNiAzNykKLQltb3ZkcWEgICAgeG1tNyx4bW00CTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAzKQotCXB1bnBja2xkcSB4bW00LHhtbTIJOyB4bW00PSg0MCA0MSA0MiA0MyA0NCA0NSA0NiA0NyA1MCA1MSA1MiA1MyA1NCA1NSA1NiA1NykKLQlwdW5wY2toZHEgeG1tNyx4bW0yCTsgeG1tNz0oNjAgNjEgNjIgNjMgNjQgNjUgNjYgNjcgNzAgNzEgNzIgNzMgNzQgNzUgNzYgNzcpCi0KLQlwc2h1ZmQJeG1tNSx4bW0xLDB4NEUJOyB4bW01PSgxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNykKLQlwc2h1ZmQJeG1tMCx4bW0zLDB4NEUJOyB4bW0wPSgzMCAzMSAzMiAzMyAzNCAzNSAzNiAzNyAyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNykKLQlwc2h1ZmQJeG1tNix4bW00LDB4NEUJOyB4bW02PSg1MCA1MSA1MiA1MyA1NCA1NSA1NiA1NyA0MCA0MSA0MiA0MyA0NCA0NSA0NiA0NykKLQlwc2h1ZmQJeG1tMix4bW03LDB4NEUJOyB4bW0yPSg3MCA3MSA3MiA3MyA3NCA3NSA3NiA3NyA2MCA2MSA2MiA2MyA2NCA2NSA2NiA2NykKLQotCW1vdgllZHgsIEpTQU1QUk9XIFtlZGkrMCpTSVpFT0ZfSlNBTVBST1ddCi0JbW92CWVzaSwgSlNBTVBST1cgW2VkaSsyKlNJWkVPRl9KU0FNUFJPV10KLQltb3ZxCV9NTVdPUkQgW2VkeCtlYXgqU0laRU9GX0pTQU1QTEVdLCB4bW0xCi0JbW92cQlfTU1XT1JEIFtlc2krZWF4KlNJWkVPRl9KU0FNUExFXSwgeG1tMwotCW1vdgllZHgsIEpTQU1QUk9XIFtlZGkrNCpTSVpFT0ZfSlNBTVBST1ddCi0JbW92CWVzaSwgSlNBTVBST1cgW2VkaSs2KlNJWkVPRl9KU0FNUFJPV10KLQltb3ZxCV9NTVdPUkQgW2VkeCtlYXgqU0laRU9GX0pTQU1QTEVdLCB4bW00Ci0JbW92cQlfTU1XT1JEIFtlc2krZWF4KlNJWkVPRl9KU0FNUExFXSwgeG1tNwotCi0JbW92CWVkeCwgSlNBTVBST1cgW2VkaSsxKlNJWkVPRl9KU0FNUFJPV10KLQltb3YJZXNpLCBKU0FNUFJPVyBbZWRpKzMqU0laRU9GX0pTQU1QUk9XXQotCW1vdnEJX01NV09SRCBbZWR4K2VheCpTSVpFT0ZfSlNBTVBMRV0sIHhtbTUKLQltb3ZxCV9NTVdPUkQgW2VzaStlYXgqU0laRU9GX0pTQU1QTEVdLCB4bW0wCi0JbW92CWVkeCwgSlNBTVBST1cgW2VkaSs1KlNJWkVPRl9KU0FNUFJPV10KLQltb3YJZXNpLCBKU0FNUFJPVyBbZWRpKzcqU0laRU9GX0pTQU1QUk9XXQotCW1vdnEJX01NV09SRCBbZWR4K2VheCpTSVpFT0ZfSlNBTVBMRV0sIHhtbTYKLQltb3ZxCV9NTVdPUkQgW2VzaStlYXgqU0laRU9GX0pTQU1QTEVdLCB4bW0yCi0KLQlwb3AJZWRpCi0JcG9wCWVzaQotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IHVudXNlZAotCXBvcHBpYwllYngKLQltb3YJZXNwLGVicAkJOyBlc3AgPC0gYWxpZ25lZCBlYnAKLQlwb3AJZXNwCQk7IGVzcCA8LSBvcmlnaW5hbCBlYnAKLQlwb3AJZWJwCi0JcmV0Ci0KLSVlbmRpZiA7IEpJRENUX0lOVF9TU0UyX1NVUFBPUlRFRAotJWVuZGlmIDsgRENUX0lGQVNUX1NVUFBPUlRFRApkaWZmIC0tZ2l0IGEvamlzczJpbnQuYXNtIGIvamlzczJpbnQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGU3MTA5Li4wMDAwMDAwCi0tLSBhL2ppc3MyaW50LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDg2OSArMCwwIEBACi07Ci07IGppc3MyaW50LmFzbSAtIGFjY3VyYXRlIGludGVnZXIgSURDVCAoU1NFMikKLTsKLTsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Ci07IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi07IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKLTsKLTsgVGhpcyBmaWxlIHNob3VsZCBiZSBhc3NlbWJsZWQgd2l0aCBOQVNNIChOZXR3aWRlIEFzc2VtYmxlciksCi07IGNhbiAqbm90KiBiZSBhc3NlbWJsZWQgd2l0aCBNaWNyb3NvZnQncyBNQVNNIG9yIGFueSBjb21wYXRpYmxlCi07IGFzc2VtYmxlciAoaW5jbHVkaW5nIEJvcmxhbmQncyBUdXJibyBBc3NlbWJsZXIpLgotOyBOQVNNIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9uYXNtLnNvdXJjZWZvcmdlLm5ldC8gb3IKLTsgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NjIwOAotOwotOyBUaGlzIGZpbGUgY29udGFpbnMgYSBzbG93LWJ1dC1hY2N1cmF0ZSBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIG9mIHRoZQotOyBpbnZlcnNlIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBiYXNlZAotOyBkaXJlY3RseSBvbiB0aGUgSUpHJ3Mgb3JpZ2luYWwgamlkY3RpbnQuYzsgc2VlIHRoZSBqaWRjdGludC5jIGZvcgotOyBtb3JlIGRldGFpbHMuCi07Ci07IExhc3QgTW9kaWZpZWQgOiBGZWJydWFyeSA0LCAyMDA2Ci07Ci07IFtUQUI4XQotCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotJWluY2x1ZGUgImpkY3QuaW5jIgotCi0laWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotJWlmZGVmIEpJRENUX0lOVF9TU0UyX1NVUFBPUlRFRAotCi07IFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotOwotJWlmIERDVFNJWkUgIT0gOAotJWVycm9yICJTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4iCi0lZW5kaWYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0lZGVmaW5lIENPTlNUX0JJVFMJMTMKLSVkZWZpbmUgUEFTUzFfQklUUwkyCi0KLSVkZWZpbmUgREVTQ0FMRV9QMQkoQ09OU1RfQklUUy1QQVNTMV9CSVRTKQotJWRlZmluZSBERVNDQUxFX1AyCShDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKLQotJWlmIENPTlNUX0JJVFMgPT0gMTMKLUZfMF8yOTgJZXF1CSAyNDQ2CQk7IEZJWCgwLjI5ODYzMTMzNikKLUZfMF8zOTAJZXF1CSAzMTk2CQk7IEZJWCgwLjM5MDE4MDY0NCkKLUZfMF81NDEJZXF1CSA0NDMzCQk7IEZJWCgwLjU0MTE5NjEwMCkKLUZfMF83NjUJZXF1CSA2MjcwCQk7IEZJWCgwLjc2NTM2Njg2NSkKLUZfMF84OTkJZXF1CSA3MzczCQk7IEZJWCgwLjg5OTk3NjIyMykKLUZfMV8xNzUJZXF1CSA5NjMzCQk7IEZJWCgxLjE3NTg3NTYwMikKLUZfMV81MDEJZXF1CTEyMjk5CQk7IEZJWCgxLjUwMTMyMTExMCkKLUZfMV84NDcJZXF1CTE1MTM3CQk7IEZJWCgxLjg0Nzc1OTA2NSkKLUZfMV85NjEJZXF1CTE2MDY5CQk7IEZJWCgxLjk2MTU3MDU2MCkKLUZfMl8wNTMJZXF1CTE2ODE5CQk7IEZJWCgyLjA1MzExOTg2OSkKLUZfMl81NjIJZXF1CTIwOTk1CQk7IEZJWCgyLjU2MjkxNTQ0NykKLUZfM18wNzIJZXF1CTI1MTcyCQk7IEZJWCgzLjA3MjcxMTAyNikKLSVlbHNlCi07IE5BU00gY2Fubm90IGRvIGNvbXBpbGUtdGltZSBhcml0aG1ldGljIG9uIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50cy4KLSVkZWZpbmUgREVTQ0FMRSh4LG4pICAoKCh4KSsoMTw8KChuKS0xKSkpPj4obikpCi1GXzBfMjk4CWVxdQlERVNDQUxFKCAzMjA2NTI5NTUsMzAtQ09OU1RfQklUUykJOyBGSVgoMC4yOTg2MzEzMzYpCi1GXzBfMzkwCWVxdQlERVNDQUxFKCA0MTg5NTMyNzYsMzAtQ09OU1RfQklUUykJOyBGSVgoMC4zOTAxODA2NDQpCi1GXzBfNTQxCWVxdQlERVNDQUxFKCA1ODExMDQ4ODcsMzAtQ09OU1RfQklUUykJOyBGSVgoMC41NDExOTYxMDApCi1GXzBfNzY1CWVxdQlERVNDQUxFKCA4MjE4MDY0MTMsMzAtQ09OU1RfQklUUykJOyBGSVgoMC43NjUzNjY4NjUpCi1GXzBfODk5CWVxdQlERVNDQUxFKCA5NjYzNDIxMTEsMzAtQ09OU1RfQklUUykJOyBGSVgoMC44OTk5NzYyMjMpCi1GXzFfMTc1CWVxdQlERVNDQUxFKDEyNjI1ODY4MTMsMzAtQ09OU1RfQklUUykJOyBGSVgoMS4xNzU4NzU2MDIpCi1GXzFfNTAxCWVxdQlERVNDQUxFKDE2MTIwMzEyNjcsMzAtQ09OU1RfQklUUykJOyBGSVgoMS41MDEzMjExMTApCi1GXzFfODQ3CWVxdQlERVNDQUxFKDE5ODQwMTYxODgsMzAtQ09OU1RfQklUUykJOyBGSVgoMS44NDc3NTkwNjUpCi1GXzFfOTYxCWVxdQlERVNDQUxFKDIxMDYyMjAzNTAsMzAtQ09OU1RfQklUUykJOyBGSVgoMS45NjE1NzA1NjApCi1GXzJfMDUzCWVxdQlERVNDQUxFKDIyMDQ1MjA2NzMsMzAtQ09OU1RfQklUUykJOyBGSVgoMi4wNTMxMTk4NjkpCi1GXzJfNTYyCWVxdQlERVNDQUxFKDI3NTE5MDk1MDYsMzAtQ09OU1RfQklUUykJOyBGSVgoMi41NjI5MTU0NDcpCi1GXzNfMDcyCWVxdQlERVNDQUxFKDMyOTkyOTgzNDEsMzAtQ09OU1RfQklUUykJOyBGSVgoMy4wNzI3MTEwMjYpCi0lZW5kaWYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX0NPTlNUCi0KLQlhbGlnbnoJMTYKLQlnbG9iYWwJRVhUTihqY29uc3RfaWRjdF9pc2xvd19zc2UyKQotCi1FWFROKGpjb25zdF9pZGN0X2lzbG93X3NzZTIpOgotCi1QV19GMTMwX0YwNTQJdGltZXMgNCBkdyAgKEZfMF81NDErRl8wXzc2NSksIEZfMF81NDEKLVBXX0YwNTRfTUYxMzAJdGltZXMgNCBkdyAgRl8wXzU0MSwgKEZfMF81NDEtRl8xXzg0NykKLVBXX01GMDc4X0YxMTcJdGltZXMgNCBkdyAgKEZfMV8xNzUtRl8xXzk2MSksIEZfMV8xNzUKLVBXX0YxMTdfRjA3OAl0aW1lcyA0IGR3ICBGXzFfMTc1LCAoRl8xXzE3NS1GXzBfMzkwKQotUFdfTUYwNjBfTUYwODkJdGltZXMgNCBkdyAgKEZfMF8yOTgtRl8wXzg5OSksLUZfMF84OTkKLVBXX01GMDg5X0YwNjAJdGltZXMgNCBkdyAtRl8wXzg5OSwgKEZfMV81MDEtRl8wXzg5OSkKLVBXX01GMDUwX01GMjU2CXRpbWVzIDQgZHcgIChGXzJfMDUzLUZfMl81NjIpLC1GXzJfNTYyCi1QV19NRjI1Nl9GMDUwCXRpbWVzIDQgZHcgLUZfMl81NjIsIChGXzNfMDcyLUZfMl81NjIpCi1QRF9ERVNDQUxFX1AxCXRpbWVzIDQgZGQgIDEgPDwgKERFU0NBTEVfUDEtMSkKLVBEX0RFU0NBTEVfUDIJdGltZXMgNCBkZCAgMSA8PCAoREVTQ0FMRV9QMi0xKQotUEJfQ0VOVEVSSlNBTVAJdGltZXMgMTYgZGIgQ0VOVEVSSlNBTVBMRQotCi0JYWxpZ256CTE2Ci0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19URVhUCi0JQklUUwkzMgotOwotOyBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLgotOwotOyBHTE9CQUwodm9pZCkKLTsganBlZ19pZGN0X2lzbG93X3NzZTIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotOyAgICAgICAgICAgICAgICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKLTsgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQotOwotCi0lZGVmaW5lIGNpbmZvKGIpCShiKSs4CQk7IGpfZGVjb21wcmVzc19wdHIgY2luZm8KLSVkZWZpbmUgY29tcHB0cihiKQkoYikrMTIJCTsganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIKLSVkZWZpbmUgY29lZl9ibG9jayhiKQkoYikrMTYJCTsgSkNPRUZQVFIgY29lZl9ibG9jawotJWRlZmluZSBvdXRwdXRfYnVmKGIpCShiKSsyMAkJOyBKU0FNUEFSUkFZIG91dHB1dF9idWYKLSVkZWZpbmUgb3V0cHV0X2NvbChiKQkoYikrMjQJCTsgSkRJTUVOU0lPTiBvdXRwdXRfY29sCi0KLSVkZWZpbmUgb3JpZ2luYWxfZWJwCWVicCswCi0lZGVmaW5lIHdrKGkpCQllYnAtKFdLX05VTS0oaSkpKlNJWkVPRl9YTU1XT1JECTsgeG1td29yZCB3a1tXS19OVU1dCi0lZGVmaW5lIFdLX05VTQkJMTIKLQotCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19pZGN0X2lzbG93X3NzZTIpCi0KLUVYVE4oanBlZ19pZGN0X2lzbG93X3NzZTIpOgotCXB1c2gJZWJwCi0JbW92CWVheCxlc3AJCQkJOyBlYXggPSBvcmlnaW5hbCBlYnAKLQlzdWIJZXNwLCBieXRlIDQKLQlhbmQJZXNwLCBieXRlICgtU0laRU9GX1hNTVdPUkQpCTsgYWxpZ24gdG8gMTI4IGJpdHMKLQltb3YJW2VzcF0sZWF4Ci0JbW92CWVicCxlc3AJCQkJOyBlYnAgPSBhbGlnbmVkIGVicAotCWxlYQllc3AsIFt3aygwKV0KLQlwdXNocGljCWVieAotOwlwdXNoCWVjeAkJOyB1bnVzZWQKLTsJcHVzaAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi0JcHVzaAllc2kKLQlwdXNoCWVkaQotCi0JZ2V0X0dPVAllYngJCTsgZ2V0IEdPVCBhZGRyZXNzCi0KLQk7IC0tLS0gUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dC4KLQotOwltb3YJZWF4LCBbb3JpZ2luYWxfZWJwXQotCW1vdgllZHgsIFBPSU5URVIgW2NvbXBwdHIoZWF4KV0KLQltb3YJZWR4LCBQT0lOVEVSIFtqY29tcGluZm9fZGN0X3RhYmxlKGVkeCldCTsgcXVhbnRwdHIKLQltb3YJZXNpLCBKQ09FRlBUUiBbY29lZl9ibG9jayhlYXgpXQkJOyBpbnB0cgotCi0laWZuZGVmIE5PX1pFUk9fQ09MVU1OX1RFU1RfSVNMT1dfU1NFMgotCW1vdgllYXgsIERXT1JEIFtEV0JMT0NLKDEsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQlvcgllYXgsIERXT1JEIFtEV0JMT0NLKDIsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQlqbnoJbmVhciAuY29sdW1uRENUCi0KLQltb3ZkcWEJeG1tMCwgWE1NV09SRCBbWE1NQkxPQ0soMSwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdmRxYQl4bW0xLCBYTU1XT1JEIFtYTU1CTE9DSygyLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JcG9yCXhtbTAsIFhNTVdPUkQgW1hNTUJMT0NLKDMsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQlwb3IJeG1tMSwgWE1NV09SRCBbWE1NQkxPQ0soNCwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCXBvcgl4bW0wLCBYTU1XT1JEIFtYTU1CTE9DSyg1LDAsZXNpLFNJWkVPRl9KQ09FRildCi0JcG9yCXhtbTEsIFhNTVdPUkQgW1hNTUJMT0NLKDYsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQlwb3IJeG1tMCwgWE1NV09SRCBbWE1NQkxPQ0soNywwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCXBvcgl4bW0xLHhtbTAKLQlwYWNrc3N3YiB4bW0xLHhtbTEKLQlwYWNrc3N3YiB4bW0xLHhtbTEKLQltb3ZkCWVheCx4bW0xCi0JdGVzdAllYXgsZWF4Ci0Jam56CXNob3J0IC5jb2x1bW5EQ1QKLQotCTsgLS0gQUMgdGVybXMgYWxsIHplcm8KLQotCW1vdmRxYQl4bW01LCBYTU1XT1JEIFtYTU1CTE9DSygwLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JcG11bGx3CXhtbTUsIFhNTVdPUkQgW1hNTUJMT0NLKDAsMCxlZHgsU0laRU9GX0lTTE9XX01VTFRfVFlQRSldCi0KLQlwc2xsdwl4bW01LFBBU1MxX0JJVFMKLQotCW1vdmRxYSAgICB4bW00LHhtbTUJCTsgeG1tNT1pbjA9KDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3KQotCXB1bnBja2x3ZCB4bW01LHhtbTUJCTsgeG1tNT0oMDAgMDAgMDEgMDEgMDIgMDIgMDMgMDMpCi0JcHVucGNraHdkIHhtbTQseG1tNAkJOyB4bW00PSgwNCAwNCAwNSAwNSAwNiAwNiAwNyAwNykKLQotCXBzaHVmZAl4bW03LHhtbTUsMHgwMAkJOyB4bW03PWNvbDA9KDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwKQotCXBzaHVmZAl4bW02LHhtbTUsMHg1NQkJOyB4bW02PWNvbDE9KDAxIDAxIDAxIDAxIDAxIDAxIDAxIDAxKQotCXBzaHVmZAl4bW0xLHhtbTUsMHhBQQkJOyB4bW0xPWNvbDI9KDAyIDAyIDAyIDAyIDAyIDAyIDAyIDAyKQotCXBzaHVmZAl4bW01LHhtbTUsMHhGRgkJOyB4bW01PWNvbDM9KDAzIDAzIDAzIDAzIDAzIDAzIDAzIDAzKQotCXBzaHVmZAl4bW0wLHhtbTQsMHgwMAkJOyB4bW0wPWNvbDQ9KDA0IDA0IDA0IDA0IDA0IDA0IDA0IDA0KQotCXBzaHVmZAl4bW0zLHhtbTQsMHg1NQkJOyB4bW0zPWNvbDU9KDA1IDA1IDA1IDA1IDA1IDA1IDA1IDA1KQotCXBzaHVmZAl4bW0yLHhtbTQsMHhBQQkJOyB4bW0yPWNvbDY9KDA2IDA2IDA2IDA2IDA2IDA2IDA2IDA2KQotCXBzaHVmZAl4bW00LHhtbTQsMHhGRgkJOyB4bW00PWNvbDc9KDA3IDA3IDA3IDA3IDA3IDA3IDA3IDA3KQotCi0JbW92ZHFhCVhNTVdPUkQgW3drKDgpXSwgeG1tNgk7IHdrKDgpPWNvbDEKLQltb3ZkcWEJWE1NV09SRCBbd2soOSldLCB4bW01CTsgd2soOSk9Y29sMwotCW1vdmRxYQlYTU1XT1JEIFt3aygxMCldLCB4bW0zCTsgd2soMTApPWNvbDUKLQltb3ZkcWEJWE1NV09SRCBbd2soMTEpXSwgeG1tNAk7IHdrKDExKT1jb2w3Ci0Jam1wCW5lYXIgLmNvbHVtbl9lbmQKLQlhbGlnbngJMTYsNwotJWVuZGlmCi0uY29sdW1uRENUOgotCi0JOyAtLSBFdmVuIHBhcnQKLQotCW1vdmRxYQl4bW0wLCBYTU1XT1JEIFtYTU1CTE9DSygwLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92ZHFhCXhtbTEsIFhNTVdPUkQgW1hNTUJMT0NLKDIsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQlwbXVsbHcJeG1tMCwgWE1NV09SRCBbWE1NQkxPQ0soMCwwLGVkeCxTSVpFT0ZfSVNMT1dfTVVMVF9UWVBFKV0KLQlwbXVsbHcJeG1tMSwgWE1NV09SRCBbWE1NQkxPQ0soMiwwLGVkeCxTSVpFT0ZfSVNMT1dfTVVMVF9UWVBFKV0KLQltb3ZkcWEJeG1tMiwgWE1NV09SRCBbWE1NQkxPQ0soNCwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdmRxYQl4bW0zLCBYTU1XT1JEIFtYTU1CTE9DSyg2LDAsZXNpLFNJWkVPRl9KQ09FRildCi0JcG11bGx3CXhtbTIsIFhNTVdPUkQgW1hNTUJMT0NLKDQsMCxlZHgsU0laRU9GX0lTTE9XX01VTFRfVFlQRSldCi0JcG11bGx3CXhtbTMsIFhNTVdPUkQgW1hNTUJMT0NLKDYsMCxlZHgsU0laRU9GX0lTTE9XX01VTFRfVFlQRSldCi0KLQk7IChPcmlnaW5hbCkKLQk7IHoxID0gKHoyICsgejMpICogMC41NDExOTYxMDA7Ci0JOyB0bXAyID0gejEgKyB6MyAqIC0xLjg0Nzc1OTA2NTsKLQk7IHRtcDMgPSB6MSArIHoyICogMC43NjUzNjY4NjU7Ci0JOwotCTsgKFRoaXMgaW1wbGVtZW50YXRpb24pCi0JOyB0bXAyID0gejIgKiAwLjU0MTE5NjEwMCArIHozICogKDAuNTQxMTk2MTAwIC0gMS44NDc3NTkwNjUpOwotCTsgdG1wMyA9IHoyICogKDAuNTQxMTk2MTAwICsgMC43NjUzNjY4NjUpICsgejMgKiAwLjU0MTE5NjEwMDsKLQotCW1vdmRxYSAgICB4bW00LHhtbTEJCTsgeG1tMT1pbjI9ejIKLQltb3ZkcWEgICAgeG1tNSx4bW0xCi0JcHVucGNrbHdkIHhtbTQseG1tMwkJOyB4bW0zPWluNj16MwotCXB1bnBja2h3ZCB4bW01LHhtbTMKLQltb3ZkcWEgICAgeG1tMSx4bW00Ci0JbW92ZHFhICAgIHhtbTMseG1tNQotCXBtYWRkd2QgICB4bW00LFtHT1RPRkYoZWJ4LFBXX0YxMzBfRjA1NCldCTsgeG1tND10bXAzTAotCXBtYWRkd2QgICB4bW01LFtHT1RPRkYoZWJ4LFBXX0YxMzBfRjA1NCldCTsgeG1tNT10bXAzSAotCXBtYWRkd2QgICB4bW0xLFtHT1RPRkYoZWJ4LFBXX0YwNTRfTUYxMzApXQk7IHhtbTE9dG1wMkwKLQlwbWFkZHdkICAgeG1tMyxbR09UT0ZGKGVieCxQV19GMDU0X01GMTMwKV0JOyB4bW0zPXRtcDJICi0KLQltb3ZkcWEgICAgeG1tNix4bW0wCi0JcGFkZHcgICAgIHhtbTAseG1tMgkJOyB4bW0wPWluMCtpbjQKLQlwc3VidyAgICAgeG1tNix4bW0yCQk7IHhtbTY9aW4wLWluNAotCi0JcHhvciAgICAgIHhtbTcseG1tNwotCXB4b3IgICAgICB4bW0yLHhtbTIKLQlwdW5wY2tsd2QgeG1tNyx4bW0wCQk7IHhtbTc9dG1wMEwKLQlwdW5wY2tod2QgeG1tMix4bW0wCQk7IHhtbTI9dG1wMEgKLQlwc3JhZCAgICAgeG1tNywoMTYtQ09OU1RfQklUUykJOyBwc3JhZCB4bW03LDE2ICYgcHNsbGQgeG1tNyxDT05TVF9CSVRTCi0JcHNyYWQgICAgIHhtbTIsKDE2LUNPTlNUX0JJVFMpCTsgcHNyYWQgeG1tMiwxNiAmIHBzbGxkIHhtbTIsQ09OU1RfQklUUwotCi0JbW92ZHFhCXhtbTAseG1tNwotCXBhZGRkCXhtbTcseG1tNAkJOyB4bW03PXRtcDEwTAotCXBzdWJkCXhtbTAseG1tNAkJOyB4bW0wPXRtcDEzTAotCW1vdmRxYQl4bW00LHhtbTIKLQlwYWRkZAl4bW0yLHhtbTUJCTsgeG1tMj10bXAxMEgKLQlwc3ViZAl4bW00LHhtbTUJCTsgeG1tND10bXAxM0gKLQotCW1vdmRxYQlYTU1XT1JEIFt3aygwKV0sIHhtbTcJOyB3aygwKT10bXAxMEwKLQltb3ZkcWEJWE1NV09SRCBbd2soMSldLCB4bW0yCTsgd2soMSk9dG1wMTBICi0JbW92ZHFhCVhNTVdPUkQgW3drKDIpXSwgeG1tMAk7IHdrKDIpPXRtcDEzTAotCW1vdmRxYQlYTU1XT1JEIFt3aygzKV0sIHhtbTQJOyB3aygzKT10bXAxM0gKLQotCXB4b3IgICAgICB4bW01LHhtbTUKLQlweG9yICAgICAgeG1tNyx4bW03Ci0JcHVucGNrbHdkIHhtbTUseG1tNgkJOyB4bW01PXRtcDFMCi0JcHVucGNraHdkIHhtbTcseG1tNgkJOyB4bW03PXRtcDFICi0JcHNyYWQgICAgIHhtbTUsKDE2LUNPTlNUX0JJVFMpCTsgcHNyYWQgeG1tNSwxNiAmIHBzbGxkIHhtbTUsQ09OU1RfQklUUwotCXBzcmFkICAgICB4bW03LCgxNi1DT05TVF9CSVRTKQk7IHBzcmFkIHhtbTcsMTYgJiBwc2xsZCB4bW03LENPTlNUX0JJVFMKLQotCW1vdmRxYQl4bW0yLHhtbTUKLQlwYWRkZAl4bW01LHhtbTEJCTsgeG1tNT10bXAxMUwKLQlwc3ViZAl4bW0yLHhtbTEJCTsgeG1tMj10bXAxMkwKLQltb3ZkcWEJeG1tMCx4bW03Ci0JcGFkZGQJeG1tNyx4bW0zCQk7IHhtbTc9dG1wMTFICi0JcHN1YmQJeG1tMCx4bW0zCQk7IHhtbTA9dG1wMTJICi0KLQltb3ZkcWEJWE1NV09SRCBbd2soNCldLCB4bW01CTsgd2soNCk9dG1wMTFMCi0JbW92ZHFhCVhNTVdPUkQgW3drKDUpXSwgeG1tNwk7IHdrKDUpPXRtcDExSAotCW1vdmRxYQlYTU1XT1JEIFt3ayg2KV0sIHhtbTIJOyB3ayg2KT10bXAxMkwKLQltb3ZkcWEJWE1NV09SRCBbd2soNyldLCB4bW0wCTsgd2soNyk9dG1wMTJICi0KLQk7IC0tIE9kZCBwYXJ0Ci0KLQltb3ZkcWEJeG1tNCwgWE1NV09SRCBbWE1NQkxPQ0soMSwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdmRxYQl4bW02LCBYTU1XT1JEIFtYTU1CTE9DSygzLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JcG11bGx3CXhtbTQsIFhNTVdPUkQgW1hNTUJMT0NLKDEsMCxlZHgsU0laRU9GX0lTTE9XX01VTFRfVFlQRSldCi0JcG11bGx3CXhtbTYsIFhNTVdPUkQgW1hNTUJMT0NLKDMsMCxlZHgsU0laRU9GX0lTTE9XX01VTFRfVFlQRSldCi0JbW92ZHFhCXhtbTEsIFhNTVdPUkQgW1hNTUJMT0NLKDUsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQltb3ZkcWEJeG1tMywgWE1NV09SRCBbWE1NQkxPQ0soNywwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCXBtdWxsdwl4bW0xLCBYTU1XT1JEIFtYTU1CTE9DSyg1LDAsZWR4LFNJWkVPRl9JU0xPV19NVUxUX1RZUEUpXQotCXBtdWxsdwl4bW0zLCBYTU1XT1JEIFtYTU1CTE9DSyg3LDAsZWR4LFNJWkVPRl9JU0xPV19NVUxUX1RZUEUpXQotCi0JbW92ZHFhCXhtbTUseG1tNgotCW1vdmRxYQl4bW03LHhtbTQKLQlwYWRkdwl4bW01LHhtbTMJCTsgeG1tNT16MwotCXBhZGR3CXhtbTcseG1tMQkJOyB4bW03PXo0Ci0KLQk7IChPcmlnaW5hbCkKLQk7IHo1ID0gKHozICsgejQpICogMS4xNzU4NzU2MDI7Ci0JOyB6MyA9IHozICogLTEuOTYxNTcwNTYwOyAgejQgPSB6NCAqIC0wLjM5MDE4MDY0NDsKLQk7IHozICs9IHo1OyAgejQgKz0gejU7Ci0JOwotCTsgKFRoaXMgaW1wbGVtZW50YXRpb24pCi0JOyB6MyA9IHozICogKDEuMTc1ODc1NjAyIC0gMS45NjE1NzA1NjApICsgejQgKiAxLjE3NTg3NTYwMjsKLQk7IHo0ID0gejMgKiAxLjE3NTg3NTYwMiArIHo0ICogKDEuMTc1ODc1NjAyIC0gMC4zOTAxODA2NDQpOwotCi0JbW92ZHFhICAgIHhtbTIseG1tNQotCW1vdmRxYSAgICB4bW0wLHhtbTUKLQlwdW5wY2tsd2QgeG1tMix4bW03Ci0JcHVucGNraHdkIHhtbTAseG1tNwotCW1vdmRxYSAgICB4bW01LHhtbTIKLQltb3ZkcWEgICAgeG1tNyx4bW0wCi0JcG1hZGR3ZCAgIHhtbTIsW0dPVE9GRihlYngsUFdfTUYwNzhfRjExNyldCTsgeG1tMj16M0wKLQlwbWFkZHdkICAgeG1tMCxbR09UT0ZGKGVieCxQV19NRjA3OF9GMTE3KV0JOyB4bW0wPXozSAotCXBtYWRkd2QgICB4bW01LFtHT1RPRkYoZWJ4LFBXX0YxMTdfRjA3OCldCTsgeG1tNT16NEwKLQlwbWFkZHdkICAgeG1tNyxbR09UT0ZGKGVieCxQV19GMTE3X0YwNzgpXQk7IHhtbTc9ejRICi0KLQltb3ZkcWEJWE1NV09SRCBbd2soMTApXSwgeG1tMgk7IHdrKDEwKT16M0wKLQltb3ZkcWEJWE1NV09SRCBbd2soMTEpXSwgeG1tMAk7IHdrKDExKT16M0gKLQotCTsgKE9yaWdpbmFsKQotCTsgejEgPSB0bXAwICsgdG1wMzsgIHoyID0gdG1wMSArIHRtcDI7Ci0JOyB0bXAwID0gdG1wMCAqIDAuMjk4NjMxMzM2OyAgdG1wMSA9IHRtcDEgKiAyLjA1MzExOTg2OTsKLQk7IHRtcDIgPSB0bXAyICogMy4wNzI3MTEwMjY7ICB0bXAzID0gdG1wMyAqIDEuNTAxMzIxMTEwOwotCTsgejEgPSB6MSAqIC0wLjg5OTk3NjIyMzsgIHoyID0gejIgKiAtMi41NjI5MTU0NDc7Ci0JOyB0bXAwICs9IHoxICsgejM7ICB0bXAxICs9IHoyICsgejQ7Ci0JOyB0bXAyICs9IHoyICsgejM7ICB0bXAzICs9IHoxICsgejQ7Ci0JOwotCTsgKFRoaXMgaW1wbGVtZW50YXRpb24pCi0JOyB0bXAwID0gdG1wMCAqICgwLjI5ODYzMTMzNiAtIDAuODk5OTc2MjIzKSArIHRtcDMgKiAtMC44OTk5NzYyMjM7Ci0JOyB0bXAxID0gdG1wMSAqICgyLjA1MzExOTg2OSAtIDIuNTYyOTE1NDQ3KSArIHRtcDIgKiAtMi41NjI5MTU0NDc7Ci0JOyB0bXAyID0gdG1wMSAqIC0yLjU2MjkxNTQ0NyArIHRtcDIgKiAoMy4wNzI3MTEwMjYgLSAyLjU2MjkxNTQ0Nyk7Ci0JOyB0bXAzID0gdG1wMCAqIC0wLjg5OTk3NjIyMyArIHRtcDMgKiAoMS41MDEzMjExMTAgLSAwLjg5OTk3NjIyMyk7Ci0JOyB0bXAwICs9IHozOyAgdG1wMSArPSB6NDsKLQk7IHRtcDIgKz0gejM7ICB0bXAzICs9IHo0OwotCi0JbW92ZHFhICAgIHhtbTIseG1tMwotCW1vdmRxYSAgICB4bW0wLHhtbTMKLQlwdW5wY2tsd2QgeG1tMix4bW00Ci0JcHVucGNraHdkIHhtbTAseG1tNAotCW1vdmRxYSAgICB4bW0zLHhtbTIKLQltb3ZkcWEgICAgeG1tNCx4bW0wCi0JcG1hZGR3ZCAgIHhtbTIsW0dPVE9GRihlYngsUFdfTUYwNjBfTUYwODkpXQk7IHhtbTI9dG1wMEwKLQlwbWFkZHdkICAgeG1tMCxbR09UT0ZGKGVieCxQV19NRjA2MF9NRjA4OSldCTsgeG1tMD10bXAwSAotCXBtYWRkd2QgICB4bW0zLFtHT1RPRkYoZWJ4LFBXX01GMDg5X0YwNjApXQk7IHhtbTM9dG1wM0wKLQlwbWFkZHdkICAgeG1tNCxbR09UT0ZGKGVieCxQV19NRjA4OV9GMDYwKV0JOyB4bW00PXRtcDNICi0KLQlwYWRkZAl4bW0yLCBYTU1XT1JEIFt3aygxMCldCTsgeG1tMj10bXAwTAotCXBhZGRkCXhtbTAsIFhNTVdPUkQgW3drKDExKV0JOyB4bW0wPXRtcDBICi0JcGFkZGQJeG1tMyx4bW01CQk7IHhtbTM9dG1wM0wKLQlwYWRkZAl4bW00LHhtbTcJCTsgeG1tND10bXAzSAotCi0JbW92ZHFhCVhNTVdPUkQgW3drKDgpXSwgeG1tMgk7IHdrKDgpPXRtcDBMCi0JbW92ZHFhCVhNTVdPUkQgW3drKDkpXSwgeG1tMAk7IHdrKDkpPXRtcDBICi0KLQltb3ZkcWEgICAgeG1tMix4bW0xCi0JbW92ZHFhICAgIHhtbTAseG1tMQotCXB1bnBja2x3ZCB4bW0yLHhtbTYKLQlwdW5wY2tod2QgeG1tMCx4bW02Ci0JbW92ZHFhICAgIHhtbTEseG1tMgotCW1vdmRxYSAgICB4bW02LHhtbTAKLQlwbWFkZHdkICAgeG1tMixbR09UT0ZGKGVieCxQV19NRjA1MF9NRjI1NildCTsgeG1tMj10bXAxTAotCXBtYWRkd2QgICB4bW0wLFtHT1RPRkYoZWJ4LFBXX01GMDUwX01GMjU2KV0JOyB4bW0wPXRtcDFICi0JcG1hZGR3ZCAgIHhtbTEsW0dPVE9GRihlYngsUFdfTUYyNTZfRjA1MCldCTsgeG1tMT10bXAyTAotCXBtYWRkd2QgICB4bW02LFtHT1RPRkYoZWJ4LFBXX01GMjU2X0YwNTApXQk7IHhtbTY9dG1wMkgKLQotCXBhZGRkCXhtbTIseG1tNQkJOyB4bW0yPXRtcDFMCi0JcGFkZGQJeG1tMCx4bW03CQk7IHhtbTA9dG1wMUgKLQlwYWRkZAl4bW0xLCBYTU1XT1JEIFt3aygxMCldCTsgeG1tMT10bXAyTAotCXBhZGRkCXhtbTYsIFhNTVdPUkQgW3drKDExKV0JOyB4bW02PXRtcDJICi0KLQltb3ZkcWEJWE1NV09SRCBbd2soMTApXSwgeG1tMgk7IHdrKDEwKT10bXAxTAotCW1vdmRxYQlYTU1XT1JEIFt3aygxMSldLCB4bW0wCTsgd2soMTEpPXRtcDFICi0KLQk7IC0tIEZpbmFsIG91dHB1dCBzdGFnZQotCi0JbW92ZHFhCXhtbTUsIFhNTVdPUkQgW3drKDApXQk7IHhtbTU9dG1wMTBMCi0JbW92ZHFhCXhtbTcsIFhNTVdPUkQgW3drKDEpXQk7IHhtbTc9dG1wMTBICi0KLQltb3ZkcWEJeG1tMix4bW01Ci0JbW92ZHFhCXhtbTAseG1tNwotCXBhZGRkCXhtbTUseG1tMwkJOyB4bW01PWRhdGEwTAotCXBhZGRkCXhtbTcseG1tNAkJOyB4bW03PWRhdGEwSAotCXBzdWJkCXhtbTIseG1tMwkJOyB4bW0yPWRhdGE3TAotCXBzdWJkCXhtbTAseG1tNAkJOyB4bW0wPWRhdGE3SAotCi0JbW92ZHFhCXhtbTMsW0dPVE9GRihlYngsUERfREVTQ0FMRV9QMSldCTsgeG1tMz1bUERfREVTQ0FMRV9QMV0KLQotCXBhZGRkCXhtbTUseG1tMwotCXBhZGRkCXhtbTcseG1tMwotCXBzcmFkCXhtbTUsREVTQ0FMRV9QMQotCXBzcmFkCXhtbTcsREVTQ0FMRV9QMQotCXBhZGRkCXhtbTIseG1tMwotCXBhZGRkCXhtbTAseG1tMwotCXBzcmFkCXhtbTIsREVTQ0FMRV9QMQotCXBzcmFkCXhtbTAsREVTQ0FMRV9QMQotCi0JcGFja3NzZHcgIHhtbTUseG1tNwkJOyB4bW01PWRhdGEwPSgwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNykKLQlwYWNrc3NkdyAgeG1tMix4bW0wCQk7IHhtbTI9ZGF0YTc9KDcwIDcxIDcyIDczIDc0IDc1IDc2IDc3KQotCi0JbW92ZHFhCXhtbTQsIFhNTVdPUkQgW3drKDQpXQk7IHhtbTQ9dG1wMTFMCi0JbW92ZHFhCXhtbTMsIFhNTVdPUkQgW3drKDUpXQk7IHhtbTM9dG1wMTFICi0KLQltb3ZkcWEJeG1tNyx4bW00Ci0JbW92ZHFhCXhtbTAseG1tMwotCXBhZGRkCXhtbTQseG1tMQkJOyB4bW00PWRhdGExTAotCXBhZGRkCXhtbTMseG1tNgkJOyB4bW0zPWRhdGExSAotCXBzdWJkCXhtbTcseG1tMQkJOyB4bW03PWRhdGE2TAotCXBzdWJkCXhtbTAseG1tNgkJOyB4bW0wPWRhdGE2SAotCi0JbW92ZHFhCXhtbTEsW0dPVE9GRihlYngsUERfREVTQ0FMRV9QMSldCTsgeG1tMT1bUERfREVTQ0FMRV9QMV0KLQotCXBhZGRkCXhtbTQseG1tMQotCXBhZGRkCXhtbTMseG1tMQotCXBzcmFkCXhtbTQsREVTQ0FMRV9QMQotCXBzcmFkCXhtbTMsREVTQ0FMRV9QMQotCXBhZGRkCXhtbTcseG1tMQotCXBhZGRkCXhtbTAseG1tMQotCXBzcmFkCXhtbTcsREVTQ0FMRV9QMQotCXBzcmFkCXhtbTAsREVTQ0FMRV9QMQotCi0JcGFja3NzZHcgIHhtbTQseG1tMwkJOyB4bW00PWRhdGExPSgxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNykKLQlwYWNrc3NkdyAgeG1tNyx4bW0wCQk7IHhtbTc9ZGF0YTY9KDYwIDYxIDYyIDYzIDY0IDY1IDY2IDY3KQotCi0JbW92ZHFhICAgIHhtbTYseG1tNQkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDEpCi0JcHVucGNrbHdkIHhtbTUseG1tNAkJOyB4bW01PSgwMCAxMCAwMSAxMSAwMiAxMiAwMyAxMykKLQlwdW5wY2tod2QgeG1tNix4bW00CQk7IHhtbTY9KDA0IDE0IDA1IDE1IDA2IDE2IDA3IDE3KQotCW1vdmRxYSAgICB4bW0xLHhtbTcJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAxKQotCXB1bnBja2x3ZCB4bW03LHhtbTIJCTsgeG1tNz0oNjAgNzAgNjEgNzEgNjIgNzIgNjMgNzMpCi0JcHVucGNraHdkIHhtbTEseG1tMgkJOyB4bW0xPSg2NCA3NCA2NSA3NSA2NiA3NiA2NyA3NykKLQotCW1vdmRxYQl4bW0zLCBYTU1XT1JEIFt3ayg2KV0JOyB4bW0zPXRtcDEyTAotCW1vdmRxYQl4bW0wLCBYTU1XT1JEIFt3ayg3KV0JOyB4bW0wPXRtcDEySAotCW1vdmRxYQl4bW00LCBYTU1XT1JEIFt3aygxMCldCTsgeG1tND10bXAxTAotCW1vdmRxYQl4bW0yLCBYTU1XT1JEIFt3aygxMSldCTsgeG1tMj10bXAxSAotCi0JbW92ZHFhCVhNTVdPUkQgW3drKDApXSwgeG1tNQk7IHdrKDApPSgwMCAxMCAwMSAxMSAwMiAxMiAwMyAxMykKLQltb3ZkcWEJWE1NV09SRCBbd2soMSldLCB4bW02CTsgd2soMSk9KDA0IDE0IDA1IDE1IDA2IDE2IDA3IDE3KQotCW1vdmRxYQlYTU1XT1JEIFt3ayg0KV0sIHhtbTcJOyB3ayg0KT0oNjAgNzAgNjEgNzEgNjIgNzIgNjMgNzMpCi0JbW92ZHFhCVhNTVdPUkQgW3drKDUpXSwgeG1tMQk7IHdrKDUpPSg2NCA3NCA2NSA3NSA2NiA3NiA2NyA3NykKLQotCW1vdmRxYQl4bW01LHhtbTMKLQltb3ZkcWEJeG1tNix4bW0wCi0JcGFkZGQJeG1tMyx4bW00CQk7IHhtbTM9ZGF0YTJMCi0JcGFkZGQJeG1tMCx4bW0yCQk7IHhtbTA9ZGF0YTJICi0JcHN1YmQJeG1tNSx4bW00CQk7IHhtbTU9ZGF0YTVMCi0JcHN1YmQJeG1tNix4bW0yCQk7IHhtbTY9ZGF0YTVICi0KLQltb3ZkcWEJeG1tNyxbR09UT0ZGKGVieCxQRF9ERVNDQUxFX1AxKV0JOyB4bW03PVtQRF9ERVNDQUxFX1AxXQotCi0JcGFkZGQJeG1tMyx4bW03Ci0JcGFkZGQJeG1tMCx4bW03Ci0JcHNyYWQJeG1tMyxERVNDQUxFX1AxCi0JcHNyYWQJeG1tMCxERVNDQUxFX1AxCi0JcGFkZGQJeG1tNSx4bW03Ci0JcGFkZGQJeG1tNix4bW03Ci0JcHNyYWQJeG1tNSxERVNDQUxFX1AxCi0JcHNyYWQJeG1tNixERVNDQUxFX1AxCi0KLQlwYWNrc3NkdyAgeG1tMyx4bW0wCQk7IHhtbTM9ZGF0YTI9KDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3KQotCXBhY2tzc2R3ICB4bW01LHhtbTYJCTsgeG1tNT1kYXRhNT0oNTAgNTEgNTIgNTMgNTQgNTUgNTYgNTcpCi0KLQltb3ZkcWEJeG1tMSwgWE1NV09SRCBbd2soMildCTsgeG1tMT10bXAxM0wKLQltb3ZkcWEJeG1tNCwgWE1NV09SRCBbd2soMyldCTsgeG1tND10bXAxM0gKLQltb3ZkcWEJeG1tMiwgWE1NV09SRCBbd2soOCldCTsgeG1tMj10bXAwTAotCW1vdmRxYQl4bW03LCBYTU1XT1JEIFt3ayg5KV0JOyB4bW03PXRtcDBICi0KLQltb3ZkcWEJeG1tMCx4bW0xCi0JbW92ZHFhCXhtbTYseG1tNAotCXBhZGRkCXhtbTEseG1tMgkJOyB4bW0xPWRhdGEzTAotCXBhZGRkCXhtbTQseG1tNwkJOyB4bW00PWRhdGEzSAotCXBzdWJkCXhtbTAseG1tMgkJOyB4bW0wPWRhdGE0TAotCXBzdWJkCXhtbTYseG1tNwkJOyB4bW02PWRhdGE0SAotCi0JbW92ZHFhCXhtbTIsW0dPVE9GRihlYngsUERfREVTQ0FMRV9QMSldCTsgeG1tMj1bUERfREVTQ0FMRV9QMV0KLQotCXBhZGRkCXhtbTEseG1tMgotCXBhZGRkCXhtbTQseG1tMgotCXBzcmFkCXhtbTEsREVTQ0FMRV9QMQotCXBzcmFkCXhtbTQsREVTQ0FMRV9QMQotCXBhZGRkCXhtbTAseG1tMgotCXBhZGRkCXhtbTYseG1tMgotCXBzcmFkCXhtbTAsREVTQ0FMRV9QMQotCXBzcmFkCXhtbTYsREVTQ0FMRV9QMQotCi0JcGFja3NzZHcgIHhtbTEseG1tNAkJOyB4bW0xPWRhdGEzPSgzMCAzMSAzMiAzMyAzNCAzNSAzNiAzNykKLQlwYWNrc3NkdyAgeG1tMCx4bW02CQk7IHhtbTA9ZGF0YTQ9KDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3KQotCi0JbW92ZHFhCXhtbTcsIFhNTVdPUkQgW3drKDApXQk7IHhtbTc9KDAwIDEwIDAxIDExIDAyIDEyIDAzIDEzKQotCW1vdmRxYQl4bW0yLCBYTU1XT1JEIFt3aygxKV0JOyB4bW0yPSgwNCAxNCAwNSAxNSAwNiAxNiAwNyAxNykKLQotCW1vdmRxYSAgICB4bW00LHhtbTMJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAxKQotCXB1bnBja2x3ZCB4bW0zLHhtbTEJCTsgeG1tMz0oMjAgMzAgMjEgMzEgMjIgMzIgMjMgMzMpCi0JcHVucGNraHdkIHhtbTQseG1tMQkJOyB4bW00PSgyNCAzNCAyNSAzNSAyNiAzNiAyNyAzNykKLQltb3ZkcWEgICAgeG1tNix4bW0wCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMSkKLQlwdW5wY2tsd2QgeG1tMCx4bW01CQk7IHhtbTA9KDQwIDUwIDQxIDUxIDQyIDUyIDQzIDUzKQotCXB1bnBja2h3ZCB4bW02LHhtbTUJCTsgeG1tNj0oNDQgNTQgNDUgNTUgNDYgNTYgNDcgNTcpCi0KLQltb3ZkcWEgICAgeG1tMSx4bW03CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMikKLQlwdW5wY2tsZHEgeG1tNyx4bW0zCQk7IHhtbTc9KDAwIDEwIDIwIDMwIDAxIDExIDIxIDMxKQotCXB1bnBja2hkcSB4bW0xLHhtbTMJCTsgeG1tMT0oMDIgMTIgMjIgMzIgMDMgMTMgMjMgMzMpCi0JbW92ZHFhICAgIHhtbTUseG1tMgkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDIpCi0JcHVucGNrbGRxIHhtbTIseG1tNAkJOyB4bW0yPSgwNCAxNCAyNCAzNCAwNSAxNSAyNSAzNSkKLQlwdW5wY2toZHEgeG1tNSx4bW00CQk7IHhtbTU9KDA2IDE2IDI2IDM2IDA3IDE3IDI3IDM3KQotCi0JbW92ZHFhCXhtbTMsIFhNTVdPUkQgW3drKDQpXQk7IHhtbTM9KDYwIDcwIDYxIDcxIDYyIDcyIDYzIDczKQotCW1vdmRxYQl4bW00LCBYTU1XT1JEIFt3ayg1KV0JOyB4bW00PSg2NCA3NCA2NSA3NSA2NiA3NiA2NyA3NykKLQotCW1vdmRxYQlYTU1XT1JEIFt3ayg2KV0sIHhtbTIJOyB3ayg2KT0oMDQgMTQgMjQgMzQgMDUgMTUgMjUgMzUpCi0JbW92ZHFhCVhNTVdPUkQgW3drKDcpXSwgeG1tNQk7IHdrKDcpPSgwNiAxNiAyNiAzNiAwNyAxNyAyNyAzNykKLQotCW1vdmRxYSAgICB4bW0yLHhtbTAJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXB1bnBja2xkcSB4bW0wLHhtbTMJCTsgeG1tMD0oNDAgNTAgNjAgNzAgNDEgNTEgNjEgNzEpCi0JcHVucGNraGRxIHhtbTIseG1tMwkJOyB4bW0yPSg0MiA1MiA2MiA3MiA0MyA1MyA2MyA3MykKLQltb3ZkcWEgICAgeG1tNSx4bW02CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMikKLQlwdW5wY2tsZHEgeG1tNix4bW00CQk7IHhtbTY9KDQ0IDU0IDY0IDc0IDQ1IDU1IDY1IDc1KQotCXB1bnBja2hkcSB4bW01LHhtbTQJCTsgeG1tNT0oNDYgNTYgNjYgNzYgNDcgNTcgNjcgNzcpCi0KLQltb3ZkcWEgICAgIHhtbTMseG1tNwkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDMpCi0JcHVucGNrbHFkcSB4bW03LHhtbTAJCTsgeG1tNz1jb2wwPSgwMCAxMCAyMCAzMCA0MCA1MCA2MCA3MCkKLQlwdW5wY2tocWRxIHhtbTMseG1tMAkJOyB4bW0zPWNvbDE9KDAxIDExIDIxIDMxIDQxIDUxIDYxIDcxKQotCW1vdmRxYSAgICAgeG1tNCx4bW0xCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMykKLQlwdW5wY2tscWRxIHhtbTEseG1tMgkJOyB4bW0xPWNvbDI9KDAyIDEyIDIyIDMyIDQyIDUyIDYyIDcyKQotCXB1bnBja2hxZHEgeG1tNCx4bW0yCQk7IHhtbTQ9Y29sMz0oMDMgMTMgMjMgMzMgNDMgNTMgNjMgNzMpCi0KLQltb3ZkcWEJeG1tMCwgWE1NV09SRCBbd2soNildCTsgeG1tMD0oMDQgMTQgMjQgMzQgMDUgMTUgMjUgMzUpCi0JbW92ZHFhCXhtbTIsIFhNTVdPUkQgW3drKDcpXQk7IHhtbTI9KDA2IDE2IDI2IDM2IDA3IDE3IDI3IDM3KQotCi0JbW92ZHFhCVhNTVdPUkQgW3drKDgpXSwgeG1tMwk7IHdrKDgpPWNvbDEKLQltb3ZkcWEJWE1NV09SRCBbd2soOSldLCB4bW00CTsgd2soOSk9Y29sMwotCi0JbW92ZHFhICAgICB4bW0zLHhtbTAJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAzKQotCXB1bnBja2xxZHEgeG1tMCx4bW02CQk7IHhtbTA9Y29sND0oMDQgMTQgMjQgMzQgNDQgNTQgNjQgNzQpCi0JcHVucGNraHFkcSB4bW0zLHhtbTYJCTsgeG1tMz1jb2w1PSgwNSAxNSAyNSAzNSA0NSA1NSA2NSA3NSkKLQltb3ZkcWEgICAgIHhtbTQseG1tMgkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDMpCi0JcHVucGNrbHFkcSB4bW0yLHhtbTUJCTsgeG1tMj1jb2w2PSgwNiAxNiAyNiAzNiA0NiA1NiA2NiA3NikKLQlwdW5wY2tocWRxIHhtbTQseG1tNQkJOyB4bW00PWNvbDc9KDA3IDE3IDI3IDM3IDQ3IDU3IDY3IDc3KQotCi0JbW92ZHFhCVhNTVdPUkQgW3drKDEwKV0sIHhtbTMJOyB3aygxMCk9Y29sNQotCW1vdmRxYQlYTU1XT1JEIFt3aygxMSldLCB4bW00CTsgd2soMTEpPWNvbDcKLS5jb2x1bW5fZW5kOgotCi0JOyAtLSBQcmVmZXRjaCB0aGUgbmV4dCBjb2VmZmljaWVudCBibG9jawotCi0JcHJlZmV0Y2hudGEgW2VzaSArIERDVFNJWkUyKlNJWkVPRl9KQ09FRiArIDAqMzJdCi0JcHJlZmV0Y2hudGEgW2VzaSArIERDVFNJWkUyKlNJWkVPRl9KQ09FRiArIDEqMzJdCi0JcHJlZmV0Y2hudGEgW2VzaSArIERDVFNJWkUyKlNJWkVPRl9KQ09FRiArIDIqMzJdCi0JcHJlZmV0Y2hudGEgW2VzaSArIERDVFNJWkUyKlNJWkVPRl9KQ09FRiArIDMqMzJdCi0KLQk7IC0tLS0gUGFzcyAyOiBwcm9jZXNzIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4KLQotCW1vdgllYXgsIFtvcmlnaW5hbF9lYnBdCi0JbW92CWVkaSwgSlNBTVBBUlJBWSBbb3V0cHV0X2J1ZihlYXgpXQk7IChKU0FNUFJPVyAqKQotCW1vdgllYXgsIEpESU1FTlNJT04gW291dHB1dF9jb2woZWF4KV0KLQotCTsgLS0gRXZlbiBwYXJ0Ci0KLQk7IHhtbTc9Y29sMCwgeG1tMT1jb2wyLCB4bW0wPWNvbDQsIHhtbTI9Y29sNgotCi0JOyAoT3JpZ2luYWwpCi0JOyB6MSA9ICh6MiArIHozKSAqIDAuNTQxMTk2MTAwOwotCTsgdG1wMiA9IHoxICsgejMgKiAtMS44NDc3NTkwNjU7Ci0JOyB0bXAzID0gejEgKyB6MiAqIDAuNzY1MzY2ODY1OwotCTsKLQk7IChUaGlzIGltcGxlbWVudGF0aW9uKQotCTsgdG1wMiA9IHoyICogMC41NDExOTYxMDAgKyB6MyAqICgwLjU0MTE5NjEwMCAtIDEuODQ3NzU5MDY1KTsKLQk7IHRtcDMgPSB6MiAqICgwLjU0MTE5NjEwMCArIDAuNzY1MzY2ODY1KSArIHozICogMC41NDExOTYxMDA7Ci0KLQltb3ZkcWEgICAgeG1tNix4bW0xCQk7IHhtbTE9aW4yPXoyCi0JbW92ZHFhICAgIHhtbTUseG1tMQotCXB1bnBja2x3ZCB4bW02LHhtbTIJCTsgeG1tMj1pbjY9ejMKLQlwdW5wY2tod2QgeG1tNSx4bW0yCi0JbW92ZHFhICAgIHhtbTEseG1tNgotCW1vdmRxYSAgICB4bW0yLHhtbTUKLQlwbWFkZHdkICAgeG1tNixbR09UT0ZGKGVieCxQV19GMTMwX0YwNTQpXQk7IHhtbTY9dG1wM0wKLQlwbWFkZHdkICAgeG1tNSxbR09UT0ZGKGVieCxQV19GMTMwX0YwNTQpXQk7IHhtbTU9dG1wM0gKLQlwbWFkZHdkICAgeG1tMSxbR09UT0ZGKGVieCxQV19GMDU0X01GMTMwKV0JOyB4bW0xPXRtcDJMCi0JcG1hZGR3ZCAgIHhtbTIsW0dPVE9GRihlYngsUFdfRjA1NF9NRjEzMCldCTsgeG1tMj10bXAySAotCi0JbW92ZHFhICAgIHhtbTMseG1tNwotCXBhZGR3ICAgICB4bW03LHhtbTAJCTsgeG1tNz1pbjAraW40Ci0JcHN1YncgICAgIHhtbTMseG1tMAkJOyB4bW0zPWluMC1pbjQKLQotCXB4b3IgICAgICB4bW00LHhtbTQKLQlweG9yICAgICAgeG1tMCx4bW0wCi0JcHVucGNrbHdkIHhtbTQseG1tNwkJOyB4bW00PXRtcDBMCi0JcHVucGNraHdkIHhtbTAseG1tNwkJOyB4bW0wPXRtcDBICi0JcHNyYWQgICAgIHhtbTQsKDE2LUNPTlNUX0JJVFMpCTsgcHNyYWQgeG1tNCwxNiAmIHBzbGxkIHhtbTQsQ09OU1RfQklUUwotCXBzcmFkICAgICB4bW0wLCgxNi1DT05TVF9CSVRTKQk7IHBzcmFkIHhtbTAsMTYgJiBwc2xsZCB4bW0wLENPTlNUX0JJVFMKLQotCW1vdmRxYQl4bW03LHhtbTQKLQlwYWRkZAl4bW00LHhtbTYJCTsgeG1tND10bXAxMEwKLQlwc3ViZAl4bW03LHhtbTYJCTsgeG1tNz10bXAxM0wKLQltb3ZkcWEJeG1tNix4bW0wCi0JcGFkZGQJeG1tMCx4bW01CQk7IHhtbTA9dG1wMTBICi0JcHN1YmQJeG1tNix4bW01CQk7IHhtbTY9dG1wMTNICi0KLQltb3ZkcWEJWE1NV09SRCBbd2soMCldLCB4bW00CTsgd2soMCk9dG1wMTBMCi0JbW92ZHFhCVhNTVdPUkQgW3drKDEpXSwgeG1tMAk7IHdrKDEpPXRtcDEwSAotCW1vdmRxYQlYTU1XT1JEIFt3aygyKV0sIHhtbTcJOyB3aygyKT10bXAxM0wKLQltb3ZkcWEJWE1NV09SRCBbd2soMyldLCB4bW02CTsgd2soMyk9dG1wMTNICi0KLQlweG9yICAgICAgeG1tNSx4bW01Ci0JcHhvciAgICAgIHhtbTQseG1tNAotCXB1bnBja2x3ZCB4bW01LHhtbTMJCTsgeG1tNT10bXAxTAotCXB1bnBja2h3ZCB4bW00LHhtbTMJCTsgeG1tND10bXAxSAotCXBzcmFkICAgICB4bW01LCgxNi1DT05TVF9CSVRTKQk7IHBzcmFkIHhtbTUsMTYgJiBwc2xsZCB4bW01LENPTlNUX0JJVFMKLQlwc3JhZCAgICAgeG1tNCwoMTYtQ09OU1RfQklUUykJOyBwc3JhZCB4bW00LDE2ICYgcHNsbGQgeG1tNCxDT05TVF9CSVRTCi0KLQltb3ZkcWEJeG1tMCx4bW01Ci0JcGFkZGQJeG1tNSx4bW0xCQk7IHhtbTU9dG1wMTFMCi0JcHN1YmQJeG1tMCx4bW0xCQk7IHhtbTA9dG1wMTJMCi0JbW92ZHFhCXhtbTcseG1tNAotCXBhZGRkCXhtbTQseG1tMgkJOyB4bW00PXRtcDExSAotCXBzdWJkCXhtbTcseG1tMgkJOyB4bW03PXRtcDEySAotCi0JbW92ZHFhCVhNTVdPUkQgW3drKDQpXSwgeG1tNQk7IHdrKDQpPXRtcDExTAotCW1vdmRxYQlYTU1XT1JEIFt3ayg1KV0sIHhtbTQJOyB3ayg1KT10bXAxMUgKLQltb3ZkcWEJWE1NV09SRCBbd2soNildLCB4bW0wCTsgd2soNik9dG1wMTJMCi0JbW92ZHFhCVhNTVdPUkQgW3drKDcpXSwgeG1tNwk7IHdrKDcpPXRtcDEySAotCi0JOyAtLSBPZGQgcGFydAotCi0JbW92ZHFhCXhtbTYsIFhNTVdPUkQgW3drKDkpXQk7IHhtbTY9Y29sMwotCW1vdmRxYQl4bW0zLCBYTU1XT1JEIFt3ayg4KV0JOyB4bW0zPWNvbDEKLQltb3ZkcWEJeG1tMSwgWE1NV09SRCBbd2soMTEpXQk7IHhtbTE9Y29sNwotCW1vdmRxYQl4bW0yLCBYTU1XT1JEIFt3aygxMCldCTsgeG1tMj1jb2w1Ci0KLQltb3ZkcWEJeG1tNSx4bW02Ci0JbW92ZHFhCXhtbTQseG1tMwotCXBhZGR3CXhtbTUseG1tMQkJOyB4bW01PXozCi0JcGFkZHcJeG1tNCx4bW0yCQk7IHhtbTQ9ejQKLQotCTsgKE9yaWdpbmFsKQotCTsgejUgPSAoejMgKyB6NCkgKiAxLjE3NTg3NTYwMjsKLQk7IHozID0gejMgKiAtMS45NjE1NzA1NjA7ICB6NCA9IHo0ICogLTAuMzkwMTgwNjQ0OwotCTsgejMgKz0gejU7ICB6NCArPSB6NTsKLQk7Ci0JOyAoVGhpcyBpbXBsZW1lbnRhdGlvbikKLQk7IHozID0gejMgKiAoMS4xNzU4NzU2MDIgLSAxLjk2MTU3MDU2MCkgKyB6NCAqIDEuMTc1ODc1NjAyOwotCTsgejQgPSB6MyAqIDEuMTc1ODc1NjAyICsgejQgKiAoMS4xNzU4NzU2MDIgLSAwLjM5MDE4MDY0NCk7Ci0KLQltb3ZkcWEgICAgeG1tMCx4bW01Ci0JbW92ZHFhICAgIHhtbTcseG1tNQotCXB1bnBja2x3ZCB4bW0wLHhtbTQKLQlwdW5wY2tod2QgeG1tNyx4bW00Ci0JbW92ZHFhICAgIHhtbTUseG1tMAotCW1vdmRxYSAgICB4bW00LHhtbTcKLQlwbWFkZHdkICAgeG1tMCxbR09UT0ZGKGVieCxQV19NRjA3OF9GMTE3KV0JOyB4bW0wPXozTAotCXBtYWRkd2QgICB4bW03LFtHT1RPRkYoZWJ4LFBXX01GMDc4X0YxMTcpXQk7IHhtbTc9ejNICi0JcG1hZGR3ZCAgIHhtbTUsW0dPVE9GRihlYngsUFdfRjExN19GMDc4KV0JOyB4bW01PXo0TAotCXBtYWRkd2QgICB4bW00LFtHT1RPRkYoZWJ4LFBXX0YxMTdfRjA3OCldCTsgeG1tND16NEgKLQotCW1vdmRxYQlYTU1XT1JEIFt3aygxMCldLCB4bW0wCTsgd2soMTApPXozTAotCW1vdmRxYQlYTU1XT1JEIFt3aygxMSldLCB4bW03CTsgd2soMTEpPXozSAotCi0JOyAoT3JpZ2luYWwpCi0JOyB6MSA9IHRtcDAgKyB0bXAzOyAgejIgPSB0bXAxICsgdG1wMjsKLQk7IHRtcDAgPSB0bXAwICogMC4yOTg2MzEzMzY7ICB0bXAxID0gdG1wMSAqIDIuMDUzMTE5ODY5OwotCTsgdG1wMiA9IHRtcDIgKiAzLjA3MjcxMTAyNjsgIHRtcDMgPSB0bXAzICogMS41MDEzMjExMTA7Ci0JOyB6MSA9IHoxICogLTAuODk5OTc2MjIzOyAgejIgPSB6MiAqIC0yLjU2MjkxNTQ0NzsKLQk7IHRtcDAgKz0gejEgKyB6MzsgIHRtcDEgKz0gejIgKyB6NDsKLQk7IHRtcDIgKz0gejIgKyB6MzsgIHRtcDMgKz0gejEgKyB6NDsKLQk7Ci0JOyAoVGhpcyBpbXBsZW1lbnRhdGlvbikKLQk7IHRtcDAgPSB0bXAwICogKDAuMjk4NjMxMzM2IC0gMC44OTk5NzYyMjMpICsgdG1wMyAqIC0wLjg5OTk3NjIyMzsKLQk7IHRtcDEgPSB0bXAxICogKDIuMDUzMTE5ODY5IC0gMi41NjI5MTU0NDcpICsgdG1wMiAqIC0yLjU2MjkxNTQ0NzsKLQk7IHRtcDIgPSB0bXAxICogLTIuNTYyOTE1NDQ3ICsgdG1wMiAqICgzLjA3MjcxMTAyNiAtIDIuNTYyOTE1NDQ3KTsKLQk7IHRtcDMgPSB0bXAwICogLTAuODk5OTc2MjIzICsgdG1wMyAqICgxLjUwMTMyMTExMCAtIDAuODk5OTc2MjIzKTsKLQk7IHRtcDAgKz0gejM7ICB0bXAxICs9IHo0OwotCTsgdG1wMiArPSB6MzsgIHRtcDMgKz0gejQ7Ci0KLQltb3ZkcWEgICAgeG1tMCx4bW0xCi0JbW92ZHFhICAgIHhtbTcseG1tMQotCXB1bnBja2x3ZCB4bW0wLHhtbTMKLQlwdW5wY2tod2QgeG1tNyx4bW0zCi0JbW92ZHFhICAgIHhtbTEseG1tMAotCW1vdmRxYSAgICB4bW0zLHhtbTcKLQlwbWFkZHdkICAgeG1tMCxbR09UT0ZGKGVieCxQV19NRjA2MF9NRjA4OSldCTsgeG1tMD10bXAwTAotCXBtYWRkd2QgICB4bW03LFtHT1RPRkYoZWJ4LFBXX01GMDYwX01GMDg5KV0JOyB4bW03PXRtcDBICi0JcG1hZGR3ZCAgIHhtbTEsW0dPVE9GRihlYngsUFdfTUYwODlfRjA2MCldCTsgeG1tMT10bXAzTAotCXBtYWRkd2QgICB4bW0zLFtHT1RPRkYoZWJ4LFBXX01GMDg5X0YwNjApXQk7IHhtbTM9dG1wM0gKLQotCXBhZGRkCXhtbTAsIFhNTVdPUkQgW3drKDEwKV0JOyB4bW0wPXRtcDBMCi0JcGFkZGQJeG1tNywgWE1NV09SRCBbd2soMTEpXQk7IHhtbTc9dG1wMEgKLQlwYWRkZAl4bW0xLHhtbTUJCTsgeG1tMT10bXAzTAotCXBhZGRkCXhtbTMseG1tNAkJOyB4bW0zPXRtcDNICi0KLQltb3ZkcWEJWE1NV09SRCBbd2soOCldLCB4bW0wCTsgd2soOCk9dG1wMEwKLQltb3ZkcWEJWE1NV09SRCBbd2soOSldLCB4bW03CTsgd2soOSk9dG1wMEgKLQotCW1vdmRxYSAgICB4bW0wLHhtbTIKLQltb3ZkcWEgICAgeG1tNyx4bW0yCi0JcHVucGNrbHdkIHhtbTAseG1tNgotCXB1bnBja2h3ZCB4bW03LHhtbTYKLQltb3ZkcWEgICAgeG1tMix4bW0wCi0JbW92ZHFhICAgIHhtbTYseG1tNwotCXBtYWRkd2QgICB4bW0wLFtHT1RPRkYoZWJ4LFBXX01GMDUwX01GMjU2KV0JOyB4bW0wPXRtcDFMCi0JcG1hZGR3ZCAgIHhtbTcsW0dPVE9GRihlYngsUFdfTUYwNTBfTUYyNTYpXQk7IHhtbTc9dG1wMUgKLQlwbWFkZHdkICAgeG1tMixbR09UT0ZGKGVieCxQV19NRjI1Nl9GMDUwKV0JOyB4bW0yPXRtcDJMCi0JcG1hZGR3ZCAgIHhtbTYsW0dPVE9GRihlYngsUFdfTUYyNTZfRjA1MCldCTsgeG1tNj10bXAySAotCi0JcGFkZGQJeG1tMCx4bW01CQk7IHhtbTA9dG1wMUwKLQlwYWRkZAl4bW03LHhtbTQJCTsgeG1tNz10bXAxSAotCXBhZGRkCXhtbTIsIFhNTVdPUkQgW3drKDEwKV0JOyB4bW0yPXRtcDJMCi0JcGFkZGQJeG1tNiwgWE1NV09SRCBbd2soMTEpXQk7IHhtbTY9dG1wMkgKLQotCW1vdmRxYQlYTU1XT1JEIFt3aygxMCldLCB4bW0wCTsgd2soMTApPXRtcDFMCi0JbW92ZHFhCVhNTVdPUkQgW3drKDExKV0sIHhtbTcJOyB3aygxMSk9dG1wMUgKLQotCTsgLS0gRmluYWwgb3V0cHV0IHN0YWdlCi0KLQltb3ZkcWEJeG1tNSwgWE1NV09SRCBbd2soMCldCTsgeG1tNT10bXAxMEwKLQltb3ZkcWEJeG1tNCwgWE1NV09SRCBbd2soMSldCTsgeG1tND10bXAxMEgKLQotCW1vdmRxYQl4bW0wLHhtbTUKLQltb3ZkcWEJeG1tNyx4bW00Ci0JcGFkZGQJeG1tNSx4bW0xCQk7IHhtbTU9ZGF0YTBMCi0JcGFkZGQJeG1tNCx4bW0zCQk7IHhtbTQ9ZGF0YTBICi0JcHN1YmQJeG1tMCx4bW0xCQk7IHhtbTA9ZGF0YTdMCi0JcHN1YmQJeG1tNyx4bW0zCQk7IHhtbTc9ZGF0YTdICi0KLQltb3ZkcWEJeG1tMSxbR09UT0ZGKGVieCxQRF9ERVNDQUxFX1AyKV0JOyB4bW0xPVtQRF9ERVNDQUxFX1AyXQotCi0JcGFkZGQJeG1tNSx4bW0xCi0JcGFkZGQJeG1tNCx4bW0xCi0JcHNyYWQJeG1tNSxERVNDQUxFX1AyCi0JcHNyYWQJeG1tNCxERVNDQUxFX1AyCi0JcGFkZGQJeG1tMCx4bW0xCi0JcGFkZGQJeG1tNyx4bW0xCi0JcHNyYWQJeG1tMCxERVNDQUxFX1AyCi0JcHNyYWQJeG1tNyxERVNDQUxFX1AyCi0KLQlwYWNrc3NkdyAgeG1tNSx4bW00CQk7IHhtbTU9ZGF0YTA9KDAwIDEwIDIwIDMwIDQwIDUwIDYwIDcwKQotCXBhY2tzc2R3ICB4bW0wLHhtbTcJCTsgeG1tMD1kYXRhNz0oMDcgMTcgMjcgMzcgNDcgNTcgNjcgNzcpCi0KLQltb3ZkcWEJeG1tMywgWE1NV09SRCBbd2soNCldCTsgeG1tMz10bXAxMUwKLQltb3ZkcWEJeG1tMSwgWE1NV09SRCBbd2soNSldCTsgeG1tMT10bXAxMUgKLQotCW1vdmRxYQl4bW00LHhtbTMKLQltb3ZkcWEJeG1tNyx4bW0xCi0JcGFkZGQJeG1tMyx4bW0yCQk7IHhtbTM9ZGF0YTFMCi0JcGFkZGQJeG1tMSx4bW02CQk7IHhtbTE9ZGF0YTFICi0JcHN1YmQJeG1tNCx4bW0yCQk7IHhtbTQ9ZGF0YTZMCi0JcHN1YmQJeG1tNyx4bW02CQk7IHhtbTc9ZGF0YTZICi0KLQltb3ZkcWEJeG1tMixbR09UT0ZGKGVieCxQRF9ERVNDQUxFX1AyKV0JOyB4bW0yPVtQRF9ERVNDQUxFX1AyXQotCi0JcGFkZGQJeG1tMyx4bW0yCi0JcGFkZGQJeG1tMSx4bW0yCi0JcHNyYWQJeG1tMyxERVNDQUxFX1AyCi0JcHNyYWQJeG1tMSxERVNDQUxFX1AyCi0JcGFkZGQJeG1tNCx4bW0yCi0JcGFkZGQJeG1tNyx4bW0yCi0JcHNyYWQJeG1tNCxERVNDQUxFX1AyCi0JcHNyYWQJeG1tNyxERVNDQUxFX1AyCi0KLQlwYWNrc3NkdyAgeG1tMyx4bW0xCQk7IHhtbTM9ZGF0YTE9KDAxIDExIDIxIDMxIDQxIDUxIDYxIDcxKQotCXBhY2tzc2R3ICB4bW00LHhtbTcJCTsgeG1tND1kYXRhNj0oMDYgMTYgMjYgMzYgNDYgNTYgNjYgNzYpCi0KLQlwYWNrc3N3YiAgeG1tNSx4bW00CQk7IHhtbTU9KDAwIDEwIDIwIDMwIDQwIDUwIDYwIDcwIDA2IDE2IDI2IDM2IDQ2IDU2IDY2IDc2KQotCXBhY2tzc3diICB4bW0zLHhtbTAJCTsgeG1tMz0oMDEgMTEgMjEgMzEgNDEgNTEgNjEgNzEgMDcgMTcgMjcgMzcgNDcgNTcgNjcgNzcpCi0KLQltb3ZkcWEJeG1tNiwgWE1NV09SRCBbd2soNildCTsgeG1tNj10bXAxMkwKLQltb3ZkcWEJeG1tMiwgWE1NV09SRCBbd2soNyldCTsgeG1tMj10bXAxMkgKLQltb3ZkcWEJeG1tMSwgWE1NV09SRCBbd2soMTApXQk7IHhtbTE9dG1wMUwKLQltb3ZkcWEJeG1tNywgWE1NV09SRCBbd2soMTEpXQk7IHhtbTc9dG1wMUgKLQotCW1vdmRxYQlYTU1XT1JEIFt3aygwKV0sIHhtbTUJOyB3aygwKT0oMDAgMTAgMjAgMzAgNDAgNTAgNjAgNzAgMDYgMTYgMjYgMzYgNDYgNTYgNjYgNzYpCi0JbW92ZHFhCVhNTVdPUkQgW3drKDEpXSwgeG1tMwk7IHdrKDEpPSgwMSAxMSAyMSAzMSA0MSA1MSA2MSA3MSAwNyAxNyAyNyAzNyA0NyA1NyA2NyA3NykKLQotCW1vdmRxYQl4bW00LHhtbTYKLQltb3ZkcWEJeG1tMCx4bW0yCi0JcGFkZGQJeG1tNix4bW0xCQk7IHhtbTY9ZGF0YTJMCi0JcGFkZGQJeG1tMix4bW03CQk7IHhtbTI9ZGF0YTJICi0JcHN1YmQJeG1tNCx4bW0xCQk7IHhtbTQ9ZGF0YTVMCi0JcHN1YmQJeG1tMCx4bW03CQk7IHhtbTA9ZGF0YTVICi0KLQltb3ZkcWEJeG1tNSxbR09UT0ZGKGVieCxQRF9ERVNDQUxFX1AyKV0JOyB4bW01PVtQRF9ERVNDQUxFX1AyXQotCi0JcGFkZGQJeG1tNix4bW01Ci0JcGFkZGQJeG1tMix4bW01Ci0JcHNyYWQJeG1tNixERVNDQUxFX1AyCi0JcHNyYWQJeG1tMixERVNDQUxFX1AyCi0JcGFkZGQJeG1tNCx4bW01Ci0JcGFkZGQJeG1tMCx4bW01Ci0JcHNyYWQJeG1tNCxERVNDQUxFX1AyCi0JcHNyYWQJeG1tMCxERVNDQUxFX1AyCi0KLQlwYWNrc3NkdyAgeG1tNix4bW0yCQk7IHhtbTY9ZGF0YTI9KDAyIDEyIDIyIDMyIDQyIDUyIDYyIDcyKQotCXBhY2tzc2R3ICB4bW00LHhtbTAJCTsgeG1tND1kYXRhNT0oMDUgMTUgMjUgMzUgNDUgNTUgNjUgNzUpCi0KLQltb3ZkcWEJeG1tMywgWE1NV09SRCBbd2soMildCTsgeG1tMz10bXAxM0wKLQltb3ZkcWEJeG1tMSwgWE1NV09SRCBbd2soMyldCTsgeG1tMT10bXAxM0gKLQltb3ZkcWEJeG1tNywgWE1NV09SRCBbd2soOCldCTsgeG1tNz10bXAwTAotCW1vdmRxYQl4bW01LCBYTU1XT1JEIFt3ayg5KV0JOyB4bW01PXRtcDBICi0KLQltb3ZkcWEJeG1tMix4bW0zCi0JbW92ZHFhCXhtbTAseG1tMQotCXBhZGRkCXhtbTMseG1tNwkJOyB4bW0zPWRhdGEzTAotCXBhZGRkCXhtbTEseG1tNQkJOyB4bW0xPWRhdGEzSAotCXBzdWJkCXhtbTIseG1tNwkJOyB4bW0yPWRhdGE0TAotCXBzdWJkCXhtbTAseG1tNQkJOyB4bW0wPWRhdGE0SAotCi0JbW92ZHFhCXhtbTcsW0dPVE9GRihlYngsUERfREVTQ0FMRV9QMildCTsgeG1tNz1bUERfREVTQ0FMRV9QMl0KLQotCXBhZGRkCXhtbTMseG1tNwotCXBhZGRkCXhtbTEseG1tNwotCXBzcmFkCXhtbTMsREVTQ0FMRV9QMgotCXBzcmFkCXhtbTEsREVTQ0FMRV9QMgotCXBhZGRkCXhtbTIseG1tNwotCXBhZGRkCXhtbTAseG1tNwotCXBzcmFkCXhtbTIsREVTQ0FMRV9QMgotCXBzcmFkCXhtbTAsREVTQ0FMRV9QMgotCi0JbW92ZHFhICAgIHhtbTUsW0dPVE9GRihlYngsUEJfQ0VOVEVSSlNBTVApXQk7IHhtbTU9W1BCX0NFTlRFUkpTQU1QXQotCi0JcGFja3NzZHcgIHhtbTMseG1tMQkJOyB4bW0zPWRhdGEzPSgwMyAxMyAyMyAzMyA0MyA1MyA2MyA3MykKLQlwYWNrc3NkdyAgeG1tMix4bW0wCQk7IHhtbTI9ZGF0YTQ9KDA0IDE0IDI0IDM0IDQ0IDU0IDY0IDc0KQotCi0JbW92ZHFhICAgIHhtbTcsIFhNTVdPUkQgW3drKDApXQk7IHhtbTc9KDAwIDEwIDIwIDMwIDQwIDUwIDYwIDcwIDA2IDE2IDI2IDM2IDQ2IDU2IDY2IDc2KQotCW1vdmRxYSAgICB4bW0xLCBYTU1XT1JEIFt3aygxKV0JOyB4bW0xPSgwMSAxMSAyMSAzMSA0MSA1MSA2MSA3MSAwNyAxNyAyNyAzNyA0NyA1NyA2NyA3NykKLQotCXBhY2tzc3diICB4bW02LHhtbTIJCTsgeG1tNj0oMDIgMTIgMjIgMzIgNDIgNTIgNjIgNzIgMDQgMTQgMjQgMzQgNDQgNTQgNjQgNzQpCi0JcGFja3Nzd2IgIHhtbTMseG1tNAkJOyB4bW0zPSgwMyAxMyAyMyAzMyA0MyA1MyA2MyA3MyAwNSAxNSAyNSAzNSA0NSA1NSA2NSA3NSkKLQotCXBhZGRiICAgICB4bW03LHhtbTUKLQlwYWRkYiAgICAgeG1tMSx4bW01Ci0JcGFkZGIgICAgIHhtbTYseG1tNQotCXBhZGRiICAgICB4bW0zLHhtbTUKLQotCW1vdmRxYSAgICB4bW0wLHhtbTcJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDEpCi0JcHVucGNrbGJ3IHhtbTcseG1tMQk7IHhtbTc9KDAwIDAxIDEwIDExIDIwIDIxIDMwIDMxIDQwIDQxIDUwIDUxIDYwIDYxIDcwIDcxKQotCXB1bnBja2hidyB4bW0wLHhtbTEJOyB4bW0wPSgwNiAwNyAxNiAxNyAyNiAyNyAzNiAzNyA0NiA0NyA1NiA1NyA2NiA2NyA3NiA3NykKLQltb3ZkcWEgICAgeG1tMix4bW02CTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAxKQotCXB1bnBja2xidyB4bW02LHhtbTMJOyB4bW02PSgwMiAwMyAxMiAxMyAyMiAyMyAzMiAzMyA0MiA0MyA1MiA1MyA2MiA2MyA3MiA3MykKLQlwdW5wY2toYncgeG1tMix4bW0zCTsgeG1tMj0oMDQgMDUgMTQgMTUgMjQgMjUgMzQgMzUgNDQgNDUgNTQgNTUgNjQgNjUgNzQgNzUpCi0KLQltb3ZkcWEgICAgeG1tNCx4bW03CTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXB1bnBja2x3ZCB4bW03LHhtbTYJOyB4bW03PSgwMCAwMSAwMiAwMyAxMCAxMSAxMiAxMyAyMCAyMSAyMiAyMyAzMCAzMSAzMiAzMykKLQlwdW5wY2tod2QgeG1tNCx4bW02CTsgeG1tND0oNDAgNDEgNDIgNDMgNTAgNTEgNTIgNTMgNjAgNjEgNjIgNjMgNzAgNzEgNzIgNzMpCi0JbW92ZHFhICAgIHhtbTUseG1tMgk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMikKLQlwdW5wY2tsd2QgeG1tMix4bW0wCTsgeG1tMj0oMDQgMDUgMDYgMDcgMTQgMTUgMTYgMTcgMjQgMjUgMjYgMjcgMzQgMzUgMzYgMzcpCi0JcHVucGNraHdkIHhtbTUseG1tMAk7IHhtbTU9KDQ0IDQ1IDQ2IDQ3IDU0IDU1IDU2IDU3IDY0IDY1IDY2IDY3IDc0IDc1IDc2IDc3KQotCi0JbW92ZHFhICAgIHhtbTEseG1tNwk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMykKLQlwdW5wY2tsZHEgeG1tNyx4bW0yCTsgeG1tNz0oMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcpCi0JcHVucGNraGRxIHhtbTEseG1tMgk7IHhtbTE9KDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDMwIDMxIDMyIDMzIDM0IDM1IDM2IDM3KQotCW1vdmRxYSAgICB4bW0zLHhtbTQJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDMpCi0JcHVucGNrbGRxIHhtbTQseG1tNQk7IHhtbTQ9KDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3IDUwIDUxIDUyIDUzIDU0IDU1IDU2IDU3KQotCXB1bnBja2hkcSB4bW0zLHhtbTUJOyB4bW0zPSg2MCA2MSA2MiA2MyA2NCA2NSA2NiA2NyA3MCA3MSA3MiA3MyA3NCA3NSA3NiA3NykKLQotCXBzaHVmZAl4bW02LHhtbTcsMHg0RQk7IHhtbTY9KDEwIDExIDEyIDEzIDE0IDE1IDE2IDE3IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3KQotCXBzaHVmZAl4bW0wLHhtbTEsMHg0RQk7IHhtbTA9KDMwIDMxIDMyIDMzIDM0IDM1IDM2IDM3IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3KQotCXBzaHVmZAl4bW0yLHhtbTQsMHg0RQk7IHhtbTI9KDUwIDUxIDUyIDUzIDU0IDU1IDU2IDU3IDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3KQotCXBzaHVmZAl4bW01LHhtbTMsMHg0RQk7IHhtbTU9KDcwIDcxIDcyIDczIDc0IDc1IDc2IDc3IDYwIDYxIDYyIDYzIDY0IDY1IDY2IDY3KQotCi0JbW92CWVkeCwgSlNBTVBST1cgW2VkaSswKlNJWkVPRl9KU0FNUFJPV10KLQltb3YJZXNpLCBKU0FNUFJPVyBbZWRpKzIqU0laRU9GX0pTQU1QUk9XXQotCW1vdnEJX01NV09SRCBbZWR4K2VheCpTSVpFT0ZfSlNBTVBMRV0sIHhtbTcKLQltb3ZxCV9NTVdPUkQgW2VzaStlYXgqU0laRU9GX0pTQU1QTEVdLCB4bW0xCi0JbW92CWVkeCwgSlNBTVBST1cgW2VkaSs0KlNJWkVPRl9KU0FNUFJPV10KLQltb3YJZXNpLCBKU0FNUFJPVyBbZWRpKzYqU0laRU9GX0pTQU1QUk9XXQotCW1vdnEJX01NV09SRCBbZWR4K2VheCpTSVpFT0ZfSlNBTVBMRV0sIHhtbTQKLQltb3ZxCV9NTVdPUkQgW2VzaStlYXgqU0laRU9GX0pTQU1QTEVdLCB4bW0zCi0KLQltb3YJZWR4LCBKU0FNUFJPVyBbZWRpKzEqU0laRU9GX0pTQU1QUk9XXQotCW1vdgllc2ksIEpTQU1QUk9XIFtlZGkrMypTSVpFT0ZfSlNBTVBST1ddCi0JbW92cQlfTU1XT1JEIFtlZHgrZWF4KlNJWkVPRl9KU0FNUExFXSwgeG1tNgotCW1vdnEJX01NV09SRCBbZXNpK2VheCpTSVpFT0ZfSlNBTVBMRV0sIHhtbTAKLQltb3YJZWR4LCBKU0FNUFJPVyBbZWRpKzUqU0laRU9GX0pTQU1QUk9XXQotCW1vdgllc2ksIEpTQU1QUk9XIFtlZGkrNypTSVpFT0ZfSlNBTVBST1ddCi0JbW92cQlfTU1XT1JEIFtlZHgrZWF4KlNJWkVPRl9KU0FNUExFXSwgeG1tMgotCW1vdnEJX01NV09SRCBbZXNpK2VheCpTSVpFT0ZfSlNBTVBMRV0sIHhtbTUKLQotCXBvcAllZGkKLQlwb3AJZXNpCi07CXBvcAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCi07CXBvcAllY3gJCTsgdW51c2VkCi0JcG9wcGljCWVieAotCW1vdgllc3AsZWJwCQk7IGVzcCA8LSBhbGlnbmVkIGVicAotCXBvcAllc3AJCTsgZXNwIDwtIG9yaWdpbmFsIGVicAotCXBvcAllYnAKLQlyZXQKLQotJWVuZGlmIDsgSklEQ1RfSU5UX1NTRTJfU1VQUE9SVEVECi0lZW5kaWYgOyBEQ1RfSVNMT1dfU1VQUE9SVEVECmRpZmYgLS1naXQgYS9qaXNzMnJlZC5hc20gYi9qaXNzMnJlZC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYWY2ZmUuLjAwMDAwMDAKLS0tIGEvamlzczJyZWQuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNjA3ICswLDAgQEAKLTsKLTsgamlzczJyZWQuYXNtIC0gcmVkdWNlZC1zaXplIElEQ1QgKFNTRTIpCi07Ci07IHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotOyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgotOyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4ganNpbWRleHQuaW5jCi07Ci07IFRoaXMgZmlsZSBzaG91bGQgYmUgYXNzZW1ibGVkIHdpdGggTkFTTSAoTmV0d2lkZSBBc3NlbWJsZXIpLAotOyBjYW4gKm5vdCogYmUgYXNzZW1ibGVkIHdpdGggTWljcm9zb2Z0J3MgTUFTTSBvciBhbnkgY29tcGF0aWJsZQotOyBhc3NlbWJsZXIgKGluY2x1ZGluZyBCb3JsYW5kJ3MgVHVyYm8gQXNzZW1ibGVyKS4KLTsgTkFTTSBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vbmFzbS5zb3VyY2Vmb3JnZS5uZXQvIG9yCi07IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTYyMDgKLTsKLTsgVGhpcyBmaWxlIGNvbnRhaW5zIGludmVyc2UtRENUIHJvdXRpbmVzIHRoYXQgcHJvZHVjZSByZWR1Y2VkLXNpemUKLTsgb3V0cHV0OiBlaXRoZXIgNHg0IG9yIDJ4MiBwaXhlbHMgZnJvbSBhbiA4eDggRENUIGJsb2NrLgotOyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgYmFzZWQgZGlyZWN0bHkgb24gdGhlIElKRydzIG9yaWdpbmFsIGppZGN0cmVkLmM7Ci07IHNlZSB0aGUgamlkY3RyZWQuYyBmb3IgbW9yZSBkZXRhaWxzLgotOwotOyBMYXN0IE1vZGlmaWVkIDogRmVicnVhcnkgNCwgMjAwNgotOwotOyBbVEFCOF0KLQotJWluY2x1ZGUgImpzaW1kZXh0LmluYyIKLSVpbmNsdWRlICJqZGN0LmluYyIKLQotJWlmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKLSVpZmRlZiBKSURDVF9JTlRfU1NFMl9TVVBQT1JURUQKLQotOyBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLTsKLSVpZiBEQ1RTSVpFICE9IDgKLSVlcnJvciAiU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIgotJWVuZGlmCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJWRlZmluZSBDT05TVF9CSVRTCTEzCi0lZGVmaW5lIFBBU1MxX0JJVFMJMgotCi0lZGVmaW5lIERFU0NBTEVfUDFfNAkoQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpCi0lZGVmaW5lIERFU0NBTEVfUDJfNAkoQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMSkKLSVkZWZpbmUgREVTQ0FMRV9QMV8yCShDT05TVF9CSVRTLVBBU1MxX0JJVFMrMikKLSVkZWZpbmUgREVTQ0FMRV9QMl8yCShDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysyKQotCi0laWYgQ09OU1RfQklUUyA9PSAxMwotRl8wXzIxMQllcXUJIDE3MzAJCTsgRklYKDAuMjExMTY0MjQzKQotRl8wXzUwOQllcXUJIDQxNzYJCTsgRklYKDAuNTA5Nzk1NTc5KQotRl8wXzYwMQllcXUJIDQ5MjYJCTsgRklYKDAuNjAxMzQ0ODg3KQotRl8wXzcyMAllcXUJIDU5MDYJCTsgRklYKDAuNzIwOTU5ODIyKQotRl8wXzc2NQllcXUJIDYyNzAJCTsgRklYKDAuNzY1MzY2ODY1KQotRl8wXzg1MAllcXUJIDY5NjcJCTsgRklYKDAuODUwNDMwMDk1KQotRl8wXzg5OQllcXUJIDczNzMJCTsgRklYKDAuODk5OTc2MjIzKQotRl8xXzA2MQllcXUJIDg2OTcJCTsgRklYKDEuMDYxNTk0MzM3KQotRl8xXzI3MgllcXUJMTA0MjYJCTsgRklYKDEuMjcyNzU4NTgwKQotRl8xXzQ1MQllcXUJMTE4OTMJCTsgRklYKDEuNDUxNzc0OTgxKQotRl8xXzg0NwllcXUJMTUxMzcJCTsgRklYKDEuODQ3NzU5MDY1KQotRl8yXzE3MgllcXUJMTc3OTkJCTsgRklYKDIuMTcyNzM0ODAzKQotRl8yXzU2MgllcXUJMjA5OTUJCTsgRklYKDIuNTYyOTE1NDQ3KQotRl8zXzYyNAllcXUJMjk2OTIJCTsgRklYKDMuNjI0NTA5Nzg1KQotJWVsc2UKLTsgTkFTTSBjYW5ub3QgZG8gY29tcGlsZS10aW1lIGFyaXRobWV0aWMgb24gZmxvYXRpbmctcG9pbnQgY29uc3RhbnRzLgotJWRlZmluZSBERVNDQUxFKHgsbikgICgoKHgpKygxPDwoKG4pLTEpKSk+PihuKSkKLUZfMF8yMTEJZXF1CURFU0NBTEUoIDIyNjczNTg3OSwzMC1DT05TVF9CSVRTKQk7IEZJWCgwLjIxMTE2NDI0MykKLUZfMF81MDkJZXF1CURFU0NBTEUoIDU0NzM4ODgzNCwzMC1DT05TVF9CSVRTKQk7IEZJWCgwLjUwOTc5NTU3OSkKLUZfMF82MDEJZXF1CURFU0NBTEUoIDY0NTY4OTE1NSwzMC1DT05TVF9CSVRTKQk7IEZJWCgwLjYwMTM0NDg4NykKLUZfMF83MjAJZXF1CURFU0NBTEUoIDc3NDEyNDcxNCwzMC1DT05TVF9CSVRTKQk7IEZJWCgwLjcyMDk1OTgyMikKLUZfMF83NjUJZXF1CURFU0NBTEUoIDgyMTgwNjQxMywzMC1DT05TVF9CSVRTKQk7IEZJWCgwLjc2NTM2Njg2NSkKLUZfMF84NTAJZXF1CURFU0NBTEUoIDkxMzE0MjM2MSwzMC1DT05TVF9CSVRTKQk7IEZJWCgwLjg1MDQzMDA5NSkKLUZfMF84OTkJZXF1CURFU0NBTEUoIDk2NjM0MjExMSwzMC1DT05TVF9CSVRTKQk7IEZJWCgwLjg5OTk3NjIyMykKLUZfMV8wNjEJZXF1CURFU0NBTEUoMTEzOTg3ODIzOSwzMC1DT05TVF9CSVRTKQk7IEZJWCgxLjA2MTU5NDMzNykKLUZfMV8yNzIJZXF1CURFU0NBTEUoMTM2NjYxNDExOSwzMC1DT05TVF9CSVRTKQk7IEZJWCgxLjI3Mjc1ODU4MCkKLUZfMV80NTEJZXF1CURFU0NBTEUoMTU1ODgzMTUxNiwzMC1DT05TVF9CSVRTKQk7IEZJWCgxLjQ1MTc3NDk4MSkKLUZfMV84NDcJZXF1CURFU0NBTEUoMTk4NDAxNjE4OCwzMC1DT05TVF9CSVRTKQk7IEZJWCgxLjg0Nzc1OTA2NSkKLUZfMl8xNzIJZXF1CURFU0NBTEUoMjMzMjk1NjIzMCwzMC1DT05TVF9CSVRTKQk7IEZJWCgyLjE3MjczNDgwMykKLUZfMl81NjIJZXF1CURFU0NBTEUoMjc1MTkwOTUwNiwzMC1DT05TVF9CSVRTKQk7IEZJWCgyLjU2MjkxNTQ0NykKLUZfM182MjQJZXF1CURFU0NBTEUoMzg5MTc4Nzc0NywzMC1DT05TVF9CSVRTKQk7IEZJWCgzLjYyNDUwOTc4NSkKLSVlbmRpZgotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JU0VDVElPTglTRUdfQ09OU1QKLQotCWFsaWduegkxNgotCWdsb2JhbAlFWFROKGpjb25zdF9pZGN0X3JlZF9zc2UyKQotCi1FWFROKGpjb25zdF9pZGN0X3JlZF9zc2UyKToKLQotUFdfRjE4NF9NRjA3Ngl0aW1lcyA0IGR3ICBGXzFfODQ3LC1GXzBfNzY1Ci1QV19GMjU2X0YwODkJdGltZXMgNCBkdyAgRl8yXzU2MiwgRl8wXzg5OQotUFdfRjEwNl9NRjIxNwl0aW1lcyA0IGR3ICBGXzFfMDYxLC1GXzJfMTcyCi1QV19NRjA2MF9NRjA1MAl0aW1lcyA0IGR3IC1GXzBfNjAxLC1GXzBfNTA5Ci1QV19GMTQ1X01GMDIxCXRpbWVzIDQgZHcgIEZfMV80NTEsLUZfMF8yMTEKLVBXX0YzNjJfTUYxMjcJdGltZXMgNCBkdyAgRl8zXzYyNCwtRl8xXzI3MgotUFdfRjA4NV9NRjA3Mgl0aW1lcyA0IGR3ICBGXzBfODUwLC1GXzBfNzIwCi1QRF9ERVNDQUxFX1AxXzQJdGltZXMgNCBkZCAgMSA8PCAoREVTQ0FMRV9QMV80LTEpCi1QRF9ERVNDQUxFX1AyXzQJdGltZXMgNCBkZCAgMSA8PCAoREVTQ0FMRV9QMl80LTEpCi1QRF9ERVNDQUxFX1AxXzIJdGltZXMgNCBkZCAgMSA8PCAoREVTQ0FMRV9QMV8yLTEpCi1QRF9ERVNDQUxFX1AyXzIJdGltZXMgNCBkZCAgMSA8PCAoREVTQ0FMRV9QMl8yLTEpCi1QQl9DRU5URVJKU0FNUAl0aW1lcyAxNiBkYiBDRU5URVJKU0FNUExFCi0KLQlhbGlnbnoJMTYKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX1RFWFQKLQlCSVRTCTMyCi07Ci07IFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCi07IHByb2R1Y2luZyBhIHJlZHVjZWQtc2l6ZSA0eDQgb3V0cHV0IGJsb2NrLgotOwotOyBHTE9CQUwodm9pZCkKLTsganBlZ19pZGN0XzR4NF9zc2UyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLTsgICAgICAgICAgICAgICAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotOyAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQotOwotCi0lZGVmaW5lIGNpbmZvKGIpCShiKSs4CQk7IGpfZGVjb21wcmVzc19wdHIgY2luZm8KLSVkZWZpbmUgY29tcHB0cihiKQkoYikrMTIJCTsganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIKLSVkZWZpbmUgY29lZl9ibG9jayhiKQkoYikrMTYJCTsgSkNPRUZQVFIgY29lZl9ibG9jawotJWRlZmluZSBvdXRwdXRfYnVmKGIpCShiKSsyMAkJOyBKU0FNUEFSUkFZIG91dHB1dF9idWYKLSVkZWZpbmUgb3V0cHV0X2NvbChiKQkoYikrMjQJCTsgSkRJTUVOU0lPTiBvdXRwdXRfY29sCi0KLSVkZWZpbmUgb3JpZ2luYWxfZWJwCWVicCswCi0lZGVmaW5lIHdrKGkpCQllYnAtKFdLX05VTS0oaSkpKlNJWkVPRl9YTU1XT1JECTsgeG1td29yZCB3a1tXS19OVU1dCi0lZGVmaW5lIFdLX05VTQkJMgotCi0JYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2lkY3RfNHg0X3NzZTIpCi0KLUVYVE4oanBlZ19pZGN0XzR4NF9zc2UyKToKLQlwdXNoCWVicAotCW1vdgllYXgsZXNwCQkJCTsgZWF4ID0gb3JpZ2luYWwgZWJwCi0Jc3ViCWVzcCwgYnl0ZSA0Ci0JYW5kCWVzcCwgYnl0ZSAoLVNJWkVPRl9YTU1XT1JEKQk7IGFsaWduIHRvIDEyOCBiaXRzCi0JbW92CVtlc3BdLGVheAotCW1vdgllYnAsZXNwCQkJCTsgZWJwID0gYWxpZ25lZCBlYnAKLQlsZWEJZXNwLCBbd2soMCldCi0JcHVzaHBpYwllYngKLTsJcHVzaAllY3gJCTsgdW51c2VkCi07CXB1c2gJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXB1c2gJZXNpCi0JcHVzaAllZGkKLQotCWdldF9HT1QJZWJ4CQk7IGdldCBHT1QgYWRkcmVzcwotCi0JOyAtLS0tIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQuCi0KLTsJbW92CWVheCwgW29yaWdpbmFsX2VicF0KLQltb3YJZWR4LCBQT0lOVEVSIFtjb21wcHRyKGVheCldCi0JbW92CWVkeCwgUE9JTlRFUiBbamNvbXBpbmZvX2RjdF90YWJsZShlZHgpXQk7IHF1YW50cHRyCi0JbW92CWVzaSwgSkNPRUZQVFIgW2NvZWZfYmxvY2soZWF4KV0JCTsgaW5wdHIKLQotJWlmbmRlZiBOT19aRVJPX0NPTFVNTl9URVNUXzRYNF9TU0UyCi0JbW92CWVheCwgRFdPUkQgW0RXQkxPQ0soMSwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW9yCWVheCwgRFdPUkQgW0RXQkxPQ0soMiwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCWpueglzaG9ydCAuY29sdW1uRENUCi0KLQltb3ZkcWEJeG1tMCwgWE1NV09SRCBbWE1NQkxPQ0soMSwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdmRxYQl4bW0xLCBYTU1XT1JEIFtYTU1CTE9DSygyLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JcG9yCXhtbTAsIFhNTVdPUkQgW1hNTUJMT0NLKDMsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQlwb3IJeG1tMSwgWE1NV09SRCBbWE1NQkxPQ0soNSwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCXBvcgl4bW0wLCBYTU1XT1JEIFtYTU1CTE9DSyg2LDAsZXNpLFNJWkVPRl9KQ09FRildCi0JcG9yCXhtbTEsIFhNTVdPUkQgW1hNTUJMT0NLKDcsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQlwb3IJeG1tMCx4bW0xCi0JcGFja3Nzd2IgeG1tMCx4bW0wCi0JcGFja3Nzd2IgeG1tMCx4bW0wCi0JbW92ZAllYXgseG1tMAotCXRlc3QJZWF4LGVheAotCWpueglzaG9ydCAuY29sdW1uRENUCi0KLQk7IC0tIEFDIHRlcm1zIGFsbCB6ZXJvCi0KLQltb3ZkcWEJeG1tMCwgWE1NV09SRCBbWE1NQkxPQ0soMCwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCXBtdWxsdwl4bW0wLCBYTU1XT1JEIFtYTU1CTE9DSygwLDAsZWR4LFNJWkVPRl9JU0xPV19NVUxUX1RZUEUpXQotCi0JcHNsbHcJeG1tMCxQQVNTMV9CSVRTCi0KLQltb3ZkcWEgICAgeG1tMyx4bW0wCTsgeG1tMD1pbjA9KDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3KQotCXB1bnBja2x3ZCB4bW0wLHhtbTAJOyB4bW0wPSgwMCAwMCAwMSAwMSAwMiAwMiAwMyAwMykKLQlwdW5wY2tod2QgeG1tMyx4bW0zCTsgeG1tMz0oMDQgMDQgMDUgMDUgMDYgMDYgMDcgMDcpCi0KLQlwc2h1ZmQJeG1tMSx4bW0wLDB4NTAJOyB4bW0xPVtjb2wwIGNvbDFdPSgwMCAwMCAwMCAwMCAwMSAwMSAwMSAwMSkKLQlwc2h1ZmQJeG1tMCx4bW0wLDB4RkEJOyB4bW0wPVtjb2wyIGNvbDNdPSgwMiAwMiAwMiAwMiAwMyAwMyAwMyAwMykKLQlwc2h1ZmQJeG1tNix4bW0zLDB4NTAJOyB4bW02PVtjb2w0IGNvbDVdPSgwNCAwNCAwNCAwNCAwNSAwNSAwNSAwNSkKLQlwc2h1ZmQJeG1tMyx4bW0zLDB4RkEJOyB4bW0zPVtjb2w2IGNvbDddPSgwNiAwNiAwNiAwNiAwNyAwNyAwNyAwNykKLQotCWptcAluZWFyIC5jb2x1bW5fZW5kCi0JYWxpZ254CTE2LDcKLSVlbmRpZgotLmNvbHVtbkRDVDoKLQotCTsgLS0gT2RkIHBhcnQKLQotCW1vdmRxYQl4bW0wLCBYTU1XT1JEIFtYTU1CTE9DSygxLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92ZHFhCXhtbTEsIFhNTVdPUkQgW1hNTUJMT0NLKDMsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQlwbXVsbHcJeG1tMCwgWE1NV09SRCBbWE1NQkxPQ0soMSwwLGVkeCxTSVpFT0ZfSVNMT1dfTVVMVF9UWVBFKV0KLQlwbXVsbHcJeG1tMSwgWE1NV09SRCBbWE1NQkxPQ0soMywwLGVkeCxTSVpFT0ZfSVNMT1dfTVVMVF9UWVBFKV0KLQltb3ZkcWEJeG1tMiwgWE1NV09SRCBbWE1NQkxPQ0soNSwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdmRxYQl4bW0zLCBYTU1XT1JEIFtYTU1CTE9DSyg3LDAsZXNpLFNJWkVPRl9KQ09FRildCi0JcG11bGx3CXhtbTIsIFhNTVdPUkQgW1hNTUJMT0NLKDUsMCxlZHgsU0laRU9GX0lTTE9XX01VTFRfVFlQRSldCi0JcG11bGx3CXhtbTMsIFhNTVdPUkQgW1hNTUJMT0NLKDcsMCxlZHgsU0laRU9GX0lTTE9XX01VTFRfVFlQRSldCi0KLQltb3ZkcWEgICAgeG1tNCx4bW0wCi0JbW92ZHFhICAgIHhtbTUseG1tMAotCXB1bnBja2x3ZCB4bW00LHhtbTEKLQlwdW5wY2tod2QgeG1tNSx4bW0xCi0JbW92ZHFhICAgIHhtbTAseG1tNAotCW1vdmRxYSAgICB4bW0xLHhtbTUKLQlwbWFkZHdkICAgeG1tNCxbR09UT0ZGKGVieCxQV19GMjU2X0YwODkpXQk7IHhtbTQ9KHRtcDJMKQotCXBtYWRkd2QgICB4bW01LFtHT1RPRkYoZWJ4LFBXX0YyNTZfRjA4OSldCTsgeG1tNT0odG1wMkgpCi0JcG1hZGR3ZCAgIHhtbTAsW0dPVE9GRihlYngsUFdfRjEwNl9NRjIxNyldCTsgeG1tMD0odG1wMEwpCi0JcG1hZGR3ZCAgIHhtbTEsW0dPVE9GRihlYngsUFdfRjEwNl9NRjIxNyldCTsgeG1tMT0odG1wMEgpCi0KLQltb3ZkcWEgICAgeG1tNix4bW0yCi0JbW92ZHFhICAgIHhtbTcseG1tMgotCXB1bnBja2x3ZCB4bW02LHhtbTMKLQlwdW5wY2tod2QgeG1tNyx4bW0zCi0JbW92ZHFhICAgIHhtbTIseG1tNgotCW1vdmRxYSAgICB4bW0zLHhtbTcKLQlwbWFkZHdkICAgeG1tNixbR09UT0ZGKGVieCxQV19NRjA2MF9NRjA1MCldCTsgeG1tNj0odG1wMkwpCi0JcG1hZGR3ZCAgIHhtbTcsW0dPVE9GRihlYngsUFdfTUYwNjBfTUYwNTApXQk7IHhtbTc9KHRtcDJIKQotCXBtYWRkd2QgICB4bW0yLFtHT1RPRkYoZWJ4LFBXX0YxNDVfTUYwMjEpXQk7IHhtbTI9KHRtcDBMKQotCXBtYWRkd2QgICB4bW0zLFtHT1RPRkYoZWJ4LFBXX0YxNDVfTUYwMjEpXQk7IHhtbTM9KHRtcDBIKQotCi0JcGFkZGQJeG1tNix4bW00CQk7IHhtbTY9dG1wMkwKLQlwYWRkZAl4bW03LHhtbTUJCTsgeG1tNz10bXAySAotCXBhZGRkCXhtbTIseG1tMAkJOyB4bW0yPXRtcDBMCi0JcGFkZGQJeG1tMyx4bW0xCQk7IHhtbTM9dG1wMEgKLQotCW1vdmRxYQlYTU1XT1JEIFt3aygwKV0sIHhtbTIJOyB3aygwKT10bXAwTAotCW1vdmRxYQlYTU1XT1JEIFt3aygxKV0sIHhtbTMJOyB3aygxKT10bXAwSAotCi0JOyAtLSBFdmVuIHBhcnQKLQotCW1vdmRxYQl4bW00LCBYTU1XT1JEIFtYTU1CTE9DSygwLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92ZHFhCXhtbTUsIFhNTVdPUkQgW1hNTUJMT0NLKDIsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQltb3ZkcWEJeG1tMCwgWE1NV09SRCBbWE1NQkxPQ0soNiwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCXBtdWxsdwl4bW00LCBYTU1XT1JEIFtYTU1CTE9DSygwLDAsZWR4LFNJWkVPRl9JU0xPV19NVUxUX1RZUEUpXQotCXBtdWxsdwl4bW01LCBYTU1XT1JEIFtYTU1CTE9DSygyLDAsZWR4LFNJWkVPRl9JU0xPV19NVUxUX1RZUEUpXQotCXBtdWxsdwl4bW0wLCBYTU1XT1JEIFtYTU1CTE9DSyg2LDAsZWR4LFNJWkVPRl9JU0xPV19NVUxUX1RZUEUpXQotCi0JcHhvciAgICAgIHhtbTEseG1tMQotCXB4b3IgICAgICB4bW0yLHhtbTIKLQlwdW5wY2tsd2QgeG1tMSx4bW00CQk7IHhtbTE9dG1wMEwKLQlwdW5wY2tod2QgeG1tMix4bW00CQk7IHhtbTI9dG1wMEgKLQlwc3JhZCAgICAgeG1tMSwoMTYtQ09OU1RfQklUUy0xKSA7IHBzcmFkIHhtbTEsMTYgJiBwc2xsZCB4bW0xLENPTlNUX0JJVFMrMQotCXBzcmFkICAgICB4bW0yLCgxNi1DT05TVF9CSVRTLTEpIDsgcHNyYWQgeG1tMiwxNiAmIHBzbGxkIHhtbTIsQ09OU1RfQklUUysxCi0KLQltb3ZkcWEgICAgeG1tMyx4bW01CQk7IHhtbTU9aW4yPXoyCi0JcHVucGNrbHdkIHhtbTUseG1tMAkJOyB4bW0wPWluNj16MwotCXB1bnBja2h3ZCB4bW0zLHhtbTAKLQlwbWFkZHdkICAgeG1tNSxbR09UT0ZGKGVieCxQV19GMTg0X01GMDc2KV0JOyB4bW01PXRtcDJMCi0JcG1hZGR3ZCAgIHhtbTMsW0dPVE9GRihlYngsUFdfRjE4NF9NRjA3NildCTsgeG1tMz10bXAySAotCi0JbW92ZHFhCXhtbTQseG1tMQotCW1vdmRxYQl4bW0wLHhtbTIKLQlwYWRkZAl4bW0xLHhtbTUJCTsgeG1tMT10bXAxMEwKLQlwYWRkZAl4bW0yLHhtbTMJCTsgeG1tMj10bXAxMEgKLQlwc3ViZAl4bW00LHhtbTUJCTsgeG1tND10bXAxMkwKLQlwc3ViZAl4bW0wLHhtbTMJCTsgeG1tMD10bXAxMkgKLQotCTsgLS0gRmluYWwgb3V0cHV0IHN0YWdlCi0KLQltb3ZkcWEJeG1tNSx4bW0xCi0JbW92ZHFhCXhtbTMseG1tMgotCXBhZGRkCXhtbTEseG1tNgkJOyB4bW0xPWRhdGEwTAotCXBhZGRkCXhtbTIseG1tNwkJOyB4bW0yPWRhdGEwSAotCXBzdWJkCXhtbTUseG1tNgkJOyB4bW01PWRhdGEzTAotCXBzdWJkCXhtbTMseG1tNwkJOyB4bW0zPWRhdGEzSAotCi0JbW92ZHFhCXhtbTYsW0dPVE9GRihlYngsUERfREVTQ0FMRV9QMV80KV0JOyB4bW02PVtQRF9ERVNDQUxFX1AxXzRdCi0KLQlwYWRkZAl4bW0xLHhtbTYKLQlwYWRkZAl4bW0yLHhtbTYKLQlwc3JhZAl4bW0xLERFU0NBTEVfUDFfNAotCXBzcmFkCXhtbTIsREVTQ0FMRV9QMV80Ci0JcGFkZGQJeG1tNSx4bW02Ci0JcGFkZGQJeG1tMyx4bW02Ci0JcHNyYWQJeG1tNSxERVNDQUxFX1AxXzQKLQlwc3JhZAl4bW0zLERFU0NBTEVfUDFfNAotCi0JcGFja3NzZHcgIHhtbTEseG1tMgkJOyB4bW0xPWRhdGEwPSgwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNykKLQlwYWNrc3NkdyAgeG1tNSx4bW0zCQk7IHhtbTU9ZGF0YTM9KDMwIDMxIDMyIDMzIDM0IDM1IDM2IDM3KQotCi0JbW92ZHFhCXhtbTcsIFhNTVdPUkQgW3drKDApXQk7IHhtbTc9dG1wMEwKLQltb3ZkcWEJeG1tNiwgWE1NV09SRCBbd2soMSldCTsgeG1tNj10bXAwSAotCi0JbW92ZHFhCXhtbTIseG1tNAotCW1vdmRxYQl4bW0zLHhtbTAKLQlwYWRkZAl4bW00LHhtbTcJCTsgeG1tND1kYXRhMUwKLQlwYWRkZAl4bW0wLHhtbTYJCTsgeG1tMD1kYXRhMUgKLQlwc3ViZAl4bW0yLHhtbTcJCTsgeG1tMj1kYXRhMkwKLQlwc3ViZAl4bW0zLHhtbTYJCTsgeG1tMz1kYXRhMkgKLQotCW1vdmRxYQl4bW03LFtHT1RPRkYoZWJ4LFBEX0RFU0NBTEVfUDFfNCldCTsgeG1tNz1bUERfREVTQ0FMRV9QMV80XQotCi0JcGFkZGQJeG1tNCx4bW03Ci0JcGFkZGQJeG1tMCx4bW03Ci0JcHNyYWQJeG1tNCxERVNDQUxFX1AxXzQKLQlwc3JhZAl4bW0wLERFU0NBTEVfUDFfNAotCXBhZGRkCXhtbTIseG1tNwotCXBhZGRkCXhtbTMseG1tNwotCXBzcmFkCXhtbTIsREVTQ0FMRV9QMV80Ci0JcHNyYWQJeG1tMyxERVNDQUxFX1AxXzQKLQotCXBhY2tzc2R3ICB4bW00LHhtbTAJCTsgeG1tND1kYXRhMT0oMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcpCi0JcGFja3NzZHcgIHhtbTIseG1tMwkJOyB4bW0yPWRhdGEyPSgyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNykKLQotCW1vdmRxYSAgICB4bW02LHhtbTEJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDEpCi0JcHVucGNrbHdkIHhtbTEseG1tNAk7IHhtbTE9KDAwIDEwIDAxIDExIDAyIDEyIDAzIDEzKQotCXB1bnBja2h3ZCB4bW02LHhtbTQJOyB4bW02PSgwNCAxNCAwNSAxNSAwNiAxNiAwNyAxNykKLQltb3ZkcWEgICAgeG1tNyx4bW0yCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAxKQotCXB1bnBja2x3ZCB4bW0yLHhtbTUJOyB4bW0yPSgyMCAzMCAyMSAzMSAyMiAzMiAyMyAzMykKLQlwdW5wY2tod2QgeG1tNyx4bW01CTsgeG1tNz0oMjQgMzQgMjUgMzUgMjYgMzYgMjcgMzcpCi0KLQltb3ZkcWEgICAgeG1tMCx4bW0xCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXB1bnBja2xkcSB4bW0xLHhtbTIJOyB4bW0xPVtjb2wwIGNvbDFdPSgwMCAxMCAyMCAzMCAwMSAxMSAyMSAzMSkKLQlwdW5wY2toZHEgeG1tMCx4bW0yCTsgeG1tMD1bY29sMiBjb2wzXT0oMDIgMTIgMjIgMzIgMDMgMTMgMjMgMzMpCi0JbW92ZHFhICAgIHhtbTMseG1tNgk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMikKLQlwdW5wY2tsZHEgeG1tNix4bW03CTsgeG1tNj1bY29sNCBjb2w1XT0oMDQgMTQgMjQgMzQgMDUgMTUgMjUgMzUpCi0JcHVucGNraGRxIHhtbTMseG1tNwk7IHhtbTM9W2NvbDYgY29sN109KDA2IDE2IDI2IDM2IDA3IDE3IDI3IDM3KQotLmNvbHVtbl9lbmQ6Ci0KLQk7IC0tIFByZWZldGNoIHRoZSBuZXh0IGNvZWZmaWNpZW50IGJsb2NrCi0KLQlwcmVmZXRjaG50YSBbZXNpICsgRENUU0laRTIqU0laRU9GX0pDT0VGICsgMCozMl0KLQlwcmVmZXRjaG50YSBbZXNpICsgRENUU0laRTIqU0laRU9GX0pDT0VGICsgMSozMl0KLQlwcmVmZXRjaG50YSBbZXNpICsgRENUU0laRTIqU0laRU9GX0pDT0VGICsgMiozMl0KLQlwcmVmZXRjaG50YSBbZXNpICsgRENUU0laRTIqU0laRU9GX0pDT0VGICsgMyozMl0KLQotCTsgLS0tLSBQYXNzIDI6IHByb2Nlc3Mgcm93cywgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuCi0KLQltb3YJZWF4LCBbb3JpZ2luYWxfZWJwXQotCW1vdgllZGksIEpTQU1QQVJSQVkgW291dHB1dF9idWYoZWF4KV0JOyAoSlNBTVBST1cgKikKLQltb3YJZWF4LCBKRElNRU5TSU9OIFtvdXRwdXRfY29sKGVheCldCi0KLQk7IC0tIEV2ZW4gcGFydAotCi0JcHhvciAgICAgIHhtbTQseG1tNAotCXB1bnBja2x3ZCB4bW00LHhtbTEJCTsgeG1tND10bXAwCi0JcHNyYWQgICAgIHhtbTQsKDE2LUNPTlNUX0JJVFMtMSkgOyBwc3JhZCB4bW00LDE2ICYgcHNsbGQgeG1tNCxDT05TVF9CSVRTKzEKLQotCTsgLS0gT2RkIHBhcnQKLQotCXB1bnBja2h3ZCB4bW0xLHhtbTAKLQlwdW5wY2tod2QgeG1tNix4bW0zCi0JbW92ZHFhICAgIHhtbTUseG1tMQotCW1vdmRxYSAgICB4bW0yLHhtbTYKLQlwbWFkZHdkICAgeG1tMSxbR09UT0ZGKGVieCxQV19GMjU2X0YwODkpXQk7IHhtbTE9KHRtcDIpCi0JcG1hZGR3ZCAgIHhtbTYsW0dPVE9GRihlYngsUFdfTUYwNjBfTUYwNTApXQk7IHhtbTY9KHRtcDIpCi0JcG1hZGR3ZCAgIHhtbTUsW0dPVE9GRihlYngsUFdfRjEwNl9NRjIxNyldCTsgeG1tNT0odG1wMCkKLQlwbWFkZHdkICAgeG1tMixbR09UT0ZGKGVieCxQV19GMTQ1X01GMDIxKV0JOyB4bW0yPSh0bXAwKQotCi0JcGFkZGQgICAgIHhtbTYseG1tMQkJOyB4bW02PXRtcDIKLQlwYWRkZCAgICAgeG1tMix4bW01CQk7IHhtbTI9dG1wMAotCi0JOyAtLSBFdmVuIHBhcnQKLQotCXB1bnBja2x3ZCB4bW0wLHhtbTMKLQlwbWFkZHdkICAgeG1tMCxbR09UT0ZGKGVieCxQV19GMTg0X01GMDc2KV0JOyB4bW0wPXRtcDIKLQotCW1vdmRxYSAgICB4bW03LHhtbTQKLQlwYWRkZCAgICAgeG1tNCx4bW0wCQk7IHhtbTQ9dG1wMTAKLQlwc3ViZCAgICAgeG1tNyx4bW0wCQk7IHhtbTc9dG1wMTIKLQotCTsgLS0gRmluYWwgb3V0cHV0IHN0YWdlCi0KLQltb3ZkcWEJeG1tMSxbR09UT0ZGKGVieCxQRF9ERVNDQUxFX1AyXzQpXQk7IHhtbTE9W1BEX0RFU0NBTEVfUDJfNF0KLQotCW1vdmRxYQl4bW01LHhtbTQKLQltb3ZkcWEJeG1tMyx4bW03Ci0JcGFkZGQJeG1tNCx4bW02CQk7IHhtbTQ9ZGF0YTA9KDAwIDEwIDIwIDMwKQotCXBhZGRkCXhtbTcseG1tMgkJOyB4bW03PWRhdGExPSgwMSAxMSAyMSAzMSkKLQlwc3ViZAl4bW01LHhtbTYJCTsgeG1tNT1kYXRhMz0oMDMgMTMgMjMgMzMpCi0JcHN1YmQJeG1tMyx4bW0yCQk7IHhtbTM9ZGF0YTI9KDAyIDEyIDIyIDMyKQotCi0JcGFkZGQJeG1tNCx4bW0xCi0JcGFkZGQJeG1tNyx4bW0xCi0JcHNyYWQJeG1tNCxERVNDQUxFX1AyXzQKLQlwc3JhZAl4bW03LERFU0NBTEVfUDJfNAotCXBhZGRkCXhtbTUseG1tMQotCXBhZGRkCXhtbTMseG1tMQotCXBzcmFkCXhtbTUsREVTQ0FMRV9QMl80Ci0JcHNyYWQJeG1tMyxERVNDQUxFX1AyXzQKLQotCXBhY2tzc2R3ICB4bW00LHhtbTMJCTsgeG1tND0oMDAgMTAgMjAgMzAgMDIgMTIgMjIgMzIpCi0JcGFja3NzZHcgIHhtbTcseG1tNQkJOyB4bW03PSgwMSAxMSAyMSAzMSAwMyAxMyAyMyAzMykKLQotCW1vdmRxYSAgICB4bW0wLHhtbTQJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAxKQotCXB1bnBja2x3ZCB4bW00LHhtbTcJCTsgeG1tND0oMDAgMDEgMTAgMTEgMjAgMjEgMzAgMzEpCi0JcHVucGNraHdkIHhtbTAseG1tNwkJOyB4bW0wPSgwMiAwMyAxMiAxMyAyMiAyMyAzMiAzMykKLQotCW1vdmRxYSAgICB4bW02LHhtbTQJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXB1bnBja2xkcSB4bW00LHhtbTAJCTsgeG1tND0oMDAgMDEgMDIgMDMgMTAgMTEgMTIgMTMpCi0JcHVucGNraGRxIHhtbTYseG1tMAkJOyB4bW02PSgyMCAyMSAyMiAyMyAzMCAzMSAzMiAzMykKLQotCXBhY2tzc3diICB4bW00LHhtbTYJCTsgeG1tND0oMDAgMDEgMDIgMDMgMTAgMTEgMTIgMTMgMjAgLi4pCi0JcGFkZGIgICAgIHhtbTQsW0dPVE9GRihlYngsUEJfQ0VOVEVSSlNBTVApXQotCi0JcHNodWZkICAgIHhtbTIseG1tNCwweDM5CTsgeG1tMj0oMTAgMTEgMTIgMTMgMjAgMjEgMjIgMjMgMzAgLi4pCi0JcHNodWZkICAgIHhtbTEseG1tNCwweDRFCTsgeG1tMT0oMjAgMjEgMjIgMjMgMzAgMzEgMzIgMzMgMDAgLi4pCi0JcHNodWZkICAgIHhtbTMseG1tNCwweDkzCTsgeG1tMz0oMzAgMzEgMzIgMzMgMDAgMDEgMDIgMDMgMTAgLi4pCi0KLQltb3YJZWR4LCBKU0FNUFJPVyBbZWRpKzAqU0laRU9GX0pTQU1QUk9XXQotCW1vdgllc2ksIEpTQU1QUk9XIFtlZGkrMSpTSVpFT0ZfSlNBTVBST1ddCi0JbW92ZAlfRFdPUkQgW2VkeCtlYXgqU0laRU9GX0pTQU1QTEVdLCB4bW00Ci0JbW92ZAlfRFdPUkQgW2VzaStlYXgqU0laRU9GX0pTQU1QTEVdLCB4bW0yCi0JbW92CWVkeCwgSlNBTVBST1cgW2VkaSsyKlNJWkVPRl9KU0FNUFJPV10KLQltb3YJZXNpLCBKU0FNUFJPVyBbZWRpKzMqU0laRU9GX0pTQU1QUk9XXQotCW1vdmQJX0RXT1JEIFtlZHgrZWF4KlNJWkVPRl9KU0FNUExFXSwgeG1tMQotCW1vdmQJX0RXT1JEIFtlc2krZWF4KlNJWkVPRl9KU0FNUExFXSwgeG1tMwotCi0JcG9wCWVkaQotCXBvcAllc2kKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyB1bnVzZWQKLQlwb3BwaWMJZWJ4Ci0JbW92CWVzcCxlYnAJCTsgZXNwIDwtIGFsaWduZWQgZWJwCi0JcG9wCWVzcAkJOyBlc3AgPC0gb3JpZ2luYWwgZWJwCi0JcG9wCWVicAotCXJldAotCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsKLTsgUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKLTsgcHJvZHVjaW5nIGEgcmVkdWNlZC1zaXplIDJ4MiBvdXRwdXQgYmxvY2suCi07Ci07IEdMT0JBTCh2b2lkKQotOyBqcGVnX2lkY3RfMngyX3NzZTIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotOyAgICAgICAgICAgICAgICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCi07ICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCi07Ci0KLSVkZWZpbmUgY2luZm8oYikJKGIpKzgJCTsgal9kZWNvbXByZXNzX3B0ciBjaW5mbwotJWRlZmluZSBjb21wcHRyKGIpCShiKSsxMgkJOyBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cgotJWRlZmluZSBjb2VmX2Jsb2NrKGIpCShiKSsxNgkJOyBKQ09FRlBUUiBjb2VmX2Jsb2NrCi0lZGVmaW5lIG91dHB1dF9idWYoYikJKGIpKzIwCQk7IEpTQU1QQVJSQVkgb3V0cHV0X2J1ZgotJWRlZmluZSBvdXRwdXRfY29sKGIpCShiKSsyNAkJOyBKRElNRU5TSU9OIG91dHB1dF9jb2wKLQotCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19pZGN0XzJ4Ml9zc2UyKQotCi1FWFROKGpwZWdfaWRjdF8yeDJfc3NlMik6Ci0JcHVzaAllYnAKLQltb3YJZWJwLGVzcAotCXB1c2gJZWJ4Ci07CXB1c2gJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwdXNoCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwdXNoCWVzaQotCXB1c2gJZWRpCi0KLQlnZXRfR09UCWVieAkJOyBnZXQgR09UIGFkZHJlc3MKLQotCTsgLS0tLSBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LgotCi0JbW92CWVkeCwgUE9JTlRFUiBbY29tcHB0cihlYnApXQotCW1vdgllZHgsIFBPSU5URVIgW2pjb21waW5mb19kY3RfdGFibGUoZWR4KV0JOyBxdWFudHB0cgotCW1vdgllc2ksIEpDT0VGUFRSIFtjb2VmX2Jsb2NrKGVicCldCQk7IGlucHRyCi0KLQk7IHwgaW5wdXQ6ICAgICAgICAgICAgICAgICAgfCByZXN1bHQ6ICAgICAgICB8Ci0JOyB8IDAwIDAxICoqIDAzICoqIDA1ICoqIDA3IHwgICAgICAgICAgICAgICAgfAotCTsgfCAxMCAxMSAqKiAxMyAqKiAxNSAqKiAxNyB8ICAgICAgICAgICAgICAgIHwKLQk7IHwgKiogKiogKiogKiogKiogKiogKiogKiogfCAgICAgICAgICAgICAgICB8Ci0JOyB8IDMwIDMxICoqIDMzICoqIDM1ICoqIDM3IHwgQTAgQTEgQTMgQTUgQTcgfAotCTsgfCAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiB8IEIwIEIxIEIzIEI1IEI3IHwKLQk7IHwgNTAgNTEgKiogNTMgKiogNTUgKiogNTcgfCAgICAgICAgICAgICAgICB8Ci0JOyB8ICoqICoqICoqICoqICoqICoqICoqICoqIHwgICAgICAgICAgICAgICAgfAotCTsgfCA3MCA3MSAqKiA3MyAqKiA3NSAqKiA3NyB8ICAgICAgICAgICAgICAgIHwKLQotCTsgLS0gT2RkIHBhcnQKLQotCW1vdmRxYQl4bW0wLCBYTU1XT1JEIFtYTU1CTE9DSygxLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92ZHFhCXhtbTEsIFhNTVdPUkQgW1hNTUJMT0NLKDMsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQlwbXVsbHcJeG1tMCwgWE1NV09SRCBbWE1NQkxPQ0soMSwwLGVkeCxTSVpFT0ZfSVNMT1dfTVVMVF9UWVBFKV0KLQlwbXVsbHcJeG1tMSwgWE1NV09SRCBbWE1NQkxPQ0soMywwLGVkeCxTSVpFT0ZfSVNMT1dfTVVMVF9UWVBFKV0KLQltb3ZkcWEJeG1tMiwgWE1NV09SRCBbWE1NQkxPQ0soNSwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdmRxYQl4bW0zLCBYTU1XT1JEIFtYTU1CTE9DSyg3LDAsZXNpLFNJWkVPRl9KQ09FRildCi0JcG11bGx3CXhtbTIsIFhNTVdPUkQgW1hNTUJMT0NLKDUsMCxlZHgsU0laRU9GX0lTTE9XX01VTFRfVFlQRSldCi0JcG11bGx3CXhtbTMsIFhNTVdPUkQgW1hNTUJMT0NLKDcsMCxlZHgsU0laRU9GX0lTTE9XX01VTFRfVFlQRSldCi0KLQk7IHhtbTA9KDEwIDExICoqIDEzICoqIDE1ICoqIDE3KSwgeG1tMT0oMzAgMzEgKiogMzMgKiogMzUgKiogMzcpCi0JOyB4bW0yPSg1MCA1MSAqKiA1MyAqKiA1NSAqKiA1NyksIHhtbTM9KDcwIDcxICoqIDczICoqIDc1ICoqIDc3KQotCi0JcGNtcGVxZCAgIHhtbTcseG1tNwotCXBzbGxkICAgICB4bW03LFdPUkRfQklUCQk7IHhtbTc9ezB4MDAwMCAweEZGRkYgMHgwMDAwIDB4RkZGRiAuLn0KLQotCW1vdmRxYSAgICB4bW00LHhtbTAJCTsgeG1tND0oMTAgMTEgKiogMTMgKiogMTUgKiogMTcpCi0JbW92ZHFhICAgIHhtbTUseG1tMgkJOyB4bW01PSg1MCA1MSAqKiA1MyAqKiA1NSAqKiA1NykKLQlwdW5wY2tsd2QgeG1tNCx4bW0xCQk7IHhtbTQ9KDEwIDMwIDExIDMxICoqICoqIDEzIDMzKQotCXB1bnBja2x3ZCB4bW01LHhtbTMJCTsgeG1tNT0oNTAgNzAgNTEgNzEgKiogKiogNTMgNzMpCi0JcG1hZGR3ZCAgIHhtbTQsW0dPVE9GRihlYngsUFdfRjM2Ml9NRjEyNyldCi0JcG1hZGR3ZCAgIHhtbTUsW0dPVE9GRihlYngsUFdfRjA4NV9NRjA3MildCi0KLQlwc3JsZAl4bW0wLFdPUkRfQklUCQk7IHhtbTA9KDExIC0tIDEzIC0tIDE1IC0tIDE3IC0tKQotCXBhbmQJeG1tMSx4bW03CQk7IHhtbTE9KC0tIDMxIC0tIDMzIC0tIDM1IC0tIDM3KQotCXBzcmxkCXhtbTIsV09SRF9CSVQJCTsgeG1tMj0oNTEgLS0gNTMgLS0gNTUgLS0gNTcgLS0pCi0JcGFuZAl4bW0zLHhtbTcJCTsgeG1tMz0oLS0gNzEgLS0gNzMgLS0gNzUgLS0gNzcpCi0JcG9yCXhtbTAseG1tMQkJOyB4bW0wPSgxMSAzMSAxMyAzMyAxNSAzNSAxNyAzNykKLQlwb3IJeG1tMix4bW0zCQk7IHhtbTI9KDUxIDcxIDUzIDczIDU1IDc1IDU3IDc3KQotCXBtYWRkd2QJeG1tMCxbR09UT0ZGKGVieCxQV19GMzYyX01GMTI3KV0KLQlwbWFkZHdkCXhtbTIsW0dPVE9GRihlYngsUFdfRjA4NV9NRjA3MildCi0KLQlwYWRkZAl4bW00LHhtbTUJCTsgeG1tND10bXAwW2NvbDAgY29sMSAqKioqIGNvbDNdCi0JcGFkZGQJeG1tMCx4bW0yCQk7IHhtbTA9dG1wMFtjb2wxIGNvbDMgY29sNSBjb2w3XQotCi0JOyAtLSBFdmVuIHBhcnQKLQotCW1vdmRxYQl4bW02LCBYTU1XT1JEIFtYTU1CTE9DSygwLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JcG11bGx3CXhtbTYsIFhNTVdPUkQgW1hNTUJMT0NLKDAsMCxlZHgsU0laRU9GX0lTTE9XX01VTFRfVFlQRSldCi0KLQk7IHhtbTY9KDAwIDAxICoqIDAzICoqIDA1ICoqIDA3KQotCi0JbW92ZHFhCXhtbTEseG1tNgkJOyB4bW0xPSgwMCAwMSAqKiAwMyAqKiAwNSAqKiAwNykKLQlwc2xsZAl4bW02LFdPUkRfQklUCQk7IHhtbTY9KC0tIDAwIC0tICoqIC0tICoqIC0tICoqKQotCXBhbmQJeG1tMSx4bW03CQk7IHhtbTE9KC0tIDAxIC0tIDAzIC0tIDA1IC0tIDA3KQotCXBzcmFkCXhtbTYsKFdPUkRfQklULUNPTlNUX0JJVFMtMikgOyB4bW02PXRtcDEwW2NvbDAgKioqKiAqKioqICoqKipdCi0JcHNyYWQJeG1tMSwoV09SRF9CSVQtQ09OU1RfQklUUy0yKSA7IHhtbTE9dG1wMTBbY29sMSBjb2wzIGNvbDUgY29sN10KLQotCTsgLS0gRmluYWwgb3V0cHV0IHN0YWdlCi0KLQltb3ZkcWEJeG1tMyx4bW02Ci0JbW92ZHFhCXhtbTUseG1tMQotCXBhZGRkCXhtbTYseG1tNAk7IHhtbTY9ZGF0YTBbY29sMCAqKioqICoqKiogKioqKl09KEEwICoqICoqICoqKQotCXBhZGRkCXhtbTEseG1tMAk7IHhtbTE9ZGF0YTBbY29sMSBjb2wzIGNvbDUgY29sN109KEExIEEzIEE1IEE3KQotCXBzdWJkCXhtbTMseG1tNAk7IHhtbTM9ZGF0YTFbY29sMCAqKioqICoqKiogKioqKl09KEIwICoqICoqICoqKQotCXBzdWJkCXhtbTUseG1tMAk7IHhtbTU9ZGF0YTFbY29sMSBjb2wzIGNvbDUgY29sN109KEIxIEIzIEI1IEI3KQotCi0JbW92ZHFhCXhtbTIsW0dPVE9GRihlYngsUERfREVTQ0FMRV9QMV8yKV0JOyB4bW0yPVtQRF9ERVNDQUxFX1AxXzJdCi0KLQlwdW5wY2tsZHEgIHhtbTYseG1tMwkJOyB4bW02PShBMCBCMCAqKiAqKikKLQotCW1vdmRxYSAgICAgeG1tNyx4bW0xCi0JcHVucGNrbHFkcSB4bW0xLHhtbTUJCTsgeG1tMT0oQTEgQTMgQjEgQjMpCi0JcHVucGNraHFkcSB4bW03LHhtbTUJCTsgeG1tNz0oQTUgQTcgQjUgQjcpCi0KLQlwYWRkZAl4bW02LHhtbTIKLQlwc3JhZAl4bW02LERFU0NBTEVfUDFfMgotCi0JcGFkZGQJeG1tMSx4bW0yCi0JcGFkZGQJeG1tNyx4bW0yCi0JcHNyYWQJeG1tMSxERVNDQUxFX1AxXzIKLQlwc3JhZAl4bW03LERFU0NBTEVfUDFfMgotCi0JOyAtLSBQcmVmZXRjaCB0aGUgbmV4dCBjb2VmZmljaWVudCBibG9jawotCi0JcHJlZmV0Y2hudGEgW2VzaSArIERDVFNJWkUyKlNJWkVPRl9KQ09FRiArIDAqMzJdCi0JcHJlZmV0Y2hudGEgW2VzaSArIERDVFNJWkUyKlNJWkVPRl9KQ09FRiArIDEqMzJdCi0JcHJlZmV0Y2hudGEgW2VzaSArIERDVFNJWkUyKlNJWkVPRl9KQ09FRiArIDIqMzJdCi0JcHJlZmV0Y2hudGEgW2VzaSArIERDVFNJWkUyKlNJWkVPRl9KQ09FRiArIDMqMzJdCi0KLQk7IC0tLS0gUGFzcyAyOiBwcm9jZXNzIHJvd3MsIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LgotCi0JbW92CWVkaSwgSlNBTVBBUlJBWSBbb3V0cHV0X2J1ZihlYnApXQk7IChKU0FNUFJPVyAqKQotCW1vdgllYXgsIEpESU1FTlNJT04gW291dHB1dF9jb2woZWJwKV0KLQotCTsgfCBpbnB1dDp8IHJlc3VsdDp8Ci0JOyB8IEEwIEIwIHwgICAgICAgIHwKLQk7IHwgQTEgQjEgfCBDMCBDMSAgfAotCTsgfCBBMyBCMyB8IEQwIEQxICB8Ci0JOyB8IEE1IEI1IHwgICAgICAgIHwKLQk7IHwgQTcgQjcgfCAgICAgICAgfAotCi0JOyAtLSBPZGQgcGFydAotCi0JcGFja3NzZHcgIHhtbTEseG1tMQkJOyB4bW0xPShBMSBBMyBCMSBCMyBBMSBBMyBCMSBCMykKLQlwYWNrc3NkdyAgeG1tNyx4bW03CQk7IHhtbTc9KEE1IEE3IEI1IEI3IEE1IEE3IEI1IEI3KQotCXBtYWRkd2QgICB4bW0xLFtHT1RPRkYoZWJ4LFBXX0YzNjJfTUYxMjcpXQotCXBtYWRkd2QgICB4bW03LFtHT1RPRkYoZWJ4LFBXX0YwODVfTUYwNzIpXQotCi0JcGFkZGQgICAgIHhtbTEseG1tNwkJOyB4bW0xPXRtcDBbcm93MCByb3cxIHJvdzAgcm93MV0KLQotCTsgLS0gRXZlbiBwYXJ0Ci0KLQlwc2xsZCAgICAgeG1tNiwoQ09OU1RfQklUUysyKQk7IHhtbTY9dG1wMTBbcm93MCByb3cxICoqKiogKioqKl0KLQotCTsgLS0gRmluYWwgb3V0cHV0IHN0YWdlCi0KLQltb3ZkcWEgICAgeG1tNCx4bW02Ci0JcGFkZGQgICAgIHhtbTYseG1tMQk7IHhtbTY9ZGF0YTBbcm93MCByb3cxICoqKiogKioqKl09KEMwIEMxICoqICoqKQotCXBzdWJkICAgICB4bW00LHhtbTEJOyB4bW00PWRhdGExW3JvdzAgcm93MSAqKioqICoqKipdPShEMCBEMSAqKiAqKikKLQotCXB1bnBja2xkcSB4bW02LHhtbTQJOyB4bW02PShDMCBEMCBDMSBEMSkKLQotCXBhZGRkICAgICB4bW02LFtHT1RPRkYoZWJ4LFBEX0RFU0NBTEVfUDJfMildCi0JcHNyYWQgICAgIHhtbTYsREVTQ0FMRV9QMl8yCi0KLQlwYWNrc3NkdyAgeG1tNix4bW02CQk7IHhtbTY9KEMwIEQwIEMxIEQxIEMwIEQwIEMxIEQxKQotCXBhY2tzc3diICB4bW02LHhtbTYJCTsgeG1tNj0oQzAgRDAgQzEgRDEgQzAgRDAgQzEgRDEgLi4pCi0JcGFkZGIgICAgIHhtbTYsW0dPVE9GRihlYngsUEJfQ0VOVEVSSlNBTVApXQotCi0JcGV4dHJ3CWVieCx4bW02LDB4MDAJCTsgZWJ4PShDMCBEMCAtLSAtLSkKLQlwZXh0cncJZWN4LHhtbTYsMHgwMQkJOyBlY3g9KEMxIEQxIC0tIC0tKQotCi0JbW92CWVkeCwgSlNBTVBST1cgW2VkaSswKlNJWkVPRl9KU0FNUFJPV10KLQltb3YJZXNpLCBKU0FNUFJPVyBbZWRpKzEqU0laRU9GX0pTQU1QUk9XXQotCW1vdglXT1JEIFtlZHgrZWF4KlNJWkVPRl9KU0FNUExFXSwgYngKLQltb3YJV09SRCBbZXNpK2VheCpTSVpFT0ZfSlNBTVBMRV0sIGN4Ci0KLQlwb3AJZWRpCi0JcG9wCWVzaQotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXBvcAllYngKLQlwb3AJZWJwCi0JcmV0Ci0KLSVlbmRpZiA7IEpJRENUX0lOVF9TU0UyX1NVUFBPUlRFRAotJWVuZGlmIDsgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRApkaWZmIC0tZ2l0IGEvamlzc2VmbHQuYXNtIGIvamlzc2VmbHQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGVhZWViLi4wMDAwMDAwCi0tLSBhL2ppc3NlZmx0LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDU4MiArMCwwIEBACi07Ci07IGppc3NlZmx0LmFzbSAtIGZsb2F0aW5nLXBvaW50IElEQ1QgKFNTRSAmIE1NWCkKLTsKLTsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Ci07IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi07IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKLTsKLTsgVGhpcyBmaWxlIHNob3VsZCBiZSBhc3NlbWJsZWQgd2l0aCBOQVNNIChOZXR3aWRlIEFzc2VtYmxlciksCi07IGNhbiAqbm90KiBiZSBhc3NlbWJsZWQgd2l0aCBNaWNyb3NvZnQncyBNQVNNIG9yIGFueSBjb21wYXRpYmxlCi07IGFzc2VtYmxlciAoaW5jbHVkaW5nIEJvcmxhbmQncyBUdXJibyBBc3NlbWJsZXIpLgotOyBOQVNNIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9uYXNtLnNvdXJjZWZvcmdlLm5ldC8gb3IKLTsgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NjIwOAotOwotOyBUaGlzIGZpbGUgY29udGFpbnMgYSBmbG9hdGluZy1wb2ludCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW52ZXJzZSBEQ1QKLTsgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgYmFzZWQgZGlyZWN0bHkgb24KLTsgdGhlIElKRydzIG9yaWdpbmFsIGppZGN0Zmx0LmM7IHNlZSB0aGUgamlkY3RmbHQuYyBmb3IgbW9yZSBkZXRhaWxzLgotOwotOyBMYXN0IE1vZGlmaWVkIDogRmVicnVhcnkgNCwgMjAwNgotOwotOyBbVEFCOF0KLQotJWluY2x1ZGUgImpzaW1kZXh0LmluYyIKLSVpbmNsdWRlICJqZGN0LmluYyIKLQotJWlmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLSVpZmRlZiBKSURDVF9GTFRfU1NFX01NWF9TVVBQT1JURUQKLQotOyBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLTsKLSVpZiBEQ1RTSVpFICE9IDgKLSVlcnJvciAiU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIgotJWVuZGlmCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJW1hY3JvCXVucGNrbHBzMiAyCTsgJTE9KDAgMSAyIDMpIC8gJTI9KDQgNSA2IDcpID0+ICUxPSgwIDEgNCA1KQotCXNodWZwcwklMSwlMiwweDQ0Ci0lZW5kbWFjcm8KLQotJW1hY3JvCXVucGNraHBzMiAyCTsgJTE9KDAgMSAyIDMpIC8gJTI9KDQgNSA2IDcpID0+ICUxPSgyIDMgNiA3KQotCXNodWZwcwklMSwlMiwweEVFCi0lZW5kbWFjcm8KLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNFQ1RJT04JU0VHX0NPTlNUCi0KLQlhbGlnbnoJMTYKLQlnbG9iYWwJRVhUTihqY29uc3RfaWRjdF9mbG9hdF9zc2UpCi0KLUVYVE4oamNvbnN0X2lkY3RfZmxvYXRfc3NlKToKLQotUERfMV80MTQJdGltZXMgNCBkZCAgMS40MTQyMTM1NjIzNzMwOTUwNDg4MDE2ODkKLVBEXzFfODQ3CXRpbWVzIDQgZGQgIDEuODQ3NzU5MDY1MDIyNTczNTEyMjU2MzY2Ci1QRF8xXzA4Mgl0aW1lcyA0IGRkICAxLjA4MjM5MjIwMDI5MjM5Mzk2ODc5OTQ0NgotUERfTTJfNjEzCXRpbWVzIDQgZGQgLTIuNjEzMTI1OTI5NzUyNzUzMDU1NzEzMjg2Ci1QRF8wXzEyNQl0aW1lcyA0IGRkICAwLjEyNQk7IDEvOAotUEJfQ0VOVEVSSlNBTVAJdGltZXMgOCBkYiAgQ0VOVEVSSlNBTVBMRQotCi0JYWxpZ256CTE2Ci0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19URVhUCi0JQklUUwkzMgotOwotOyBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLgotOwotOyBHTE9CQUwodm9pZCkKLTsganBlZ19pZGN0X2Zsb2F0X3NzZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi07ICAgICAgICAgICAgICAgICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCi07ICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQotOwotCi0lZGVmaW5lIGNpbmZvKGIpCShiKSs4CQk7IGpfZGVjb21wcmVzc19wdHIgY2luZm8KLSVkZWZpbmUgY29tcHB0cihiKQkoYikrMTIJCTsganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIKLSVkZWZpbmUgY29lZl9ibG9jayhiKQkoYikrMTYJCTsgSkNPRUZQVFIgY29lZl9ibG9jawotJWRlZmluZSBvdXRwdXRfYnVmKGIpCShiKSsyMAkJOyBKU0FNUEFSUkFZIG91dHB1dF9idWYKLSVkZWZpbmUgb3V0cHV0X2NvbChiKQkoYikrMjQJCTsgSkRJTUVOU0lPTiBvdXRwdXRfY29sCi0KLSVkZWZpbmUgb3JpZ2luYWxfZWJwCWVicCswCi0lZGVmaW5lIHdrKGkpCQllYnAtKFdLX05VTS0oaSkpKlNJWkVPRl9YTU1XT1JECTsgeG1td29yZCB3a1tXS19OVU1dCi0lZGVmaW5lIFdLX05VTQkJMgotJWRlZmluZSB3b3Jrc3BhY2UJd2soMCktRENUU0laRTIqU0laRU9GX0ZBU1RfRkxPQVQKLQkJCQkJOyBGQVNUX0ZMT0FUIHdvcmtzcGFjZVtEQ1RTSVpFMl0KLQotCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19pZGN0X2Zsb2F0X3NzZSkKLQotRVhUTihqcGVnX2lkY3RfZmxvYXRfc3NlKToKLQlwdXNoCWVicAotCW1vdgllYXgsZXNwCQkJCTsgZWF4ID0gb3JpZ2luYWwgZWJwCi0Jc3ViCWVzcCwgYnl0ZSA0Ci0JYW5kCWVzcCwgYnl0ZSAoLVNJWkVPRl9YTU1XT1JEKQk7IGFsaWduIHRvIDEyOCBiaXRzCi0JbW92CVtlc3BdLGVheAotCW1vdgllYnAsZXNwCQkJCTsgZWJwID0gYWxpZ25lZCBlYnAKLQlsZWEJZXNwLCBbd29ya3NwYWNlXQotCXB1c2gJZWJ4Ci07CXB1c2gJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwdXNoCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwdXNoCWVzaQotCXB1c2gJZWRpCi0KLQlnZXRfR09UCWVieAkJOyBnZXQgR09UIGFkZHJlc3MKLQotCTsgLS0tLSBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuCi0KLTsJbW92CWVheCwgW29yaWdpbmFsX2VicF0KLQltb3YJZWR4LCBQT0lOVEVSIFtjb21wcHRyKGVheCldCi0JbW92CWVkeCwgUE9JTlRFUiBbamNvbXBpbmZvX2RjdF90YWJsZShlZHgpXQk7IHF1YW50cHRyCi0JbW92CWVzaSwgSkNPRUZQVFIgW2NvZWZfYmxvY2soZWF4KV0JCTsgaW5wdHIKLQlsZWEJZWRpLCBbd29ya3NwYWNlXQkJCTsgRkFTVF9GTE9BVCAqIHdzcHRyCi0JbW92CWVjeCwgRENUU0laRS80CQkJCTsgY3RyCi0JYWxpZ254CTE2LDcKLS5jb2x1bW5sb29wOgotJWlmbmRlZiBOT19aRVJPX0NPTFVNTl9URVNUX0ZMT0FUX1NTRQotCW1vdgllYXgsIERXT1JEIFtEV0JMT0NLKDEsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQlvcgllYXgsIERXT1JEIFtEV0JMT0NLKDIsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQlqbnoJbmVhciAuY29sdW1uRENUCi0KLQltb3ZxCW1tMCwgTU1XT1JEIFtNTUJMT0NLKDEsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQltb3ZxCW1tMSwgTU1XT1JEIFtNTUJMT0NLKDIsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQlwb3IJbW0wLCBNTVdPUkQgW01NQkxPQ0soMywwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCXBvcgltbTEsIE1NV09SRCBbTU1CTE9DSyg0LDAsZXNpLFNJWkVPRl9KQ09FRildCi0JcG9yCW1tMCwgTU1XT1JEIFtNTUJMT0NLKDUsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQlwb3IJbW0xLCBNTVdPUkQgW01NQkxPQ0soNiwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCXBvcgltbTAsIE1NV09SRCBbTU1CTE9DSyg3LDAsZXNpLFNJWkVPRl9KQ09FRildCi0JcG9yCW1tMSxtbTAKLQlwYWNrc3N3YiBtbTEsbW0xCi0JbW92ZAllYXgsbW0xCi0JdGVzdAllYXgsZWF4Ci0Jam56CXNob3J0IC5jb2x1bW5EQ1QKLQotCTsgLS0gQUMgdGVybXMgYWxsIHplcm8KLQotCW1vdnEgICAgICBtbTAsIE1NV09SRCBbTU1CTE9DSygwLDAsZXNpLFNJWkVPRl9KQ09FRildCi0KLQlwdW5wY2tod2QgbW0xLG1tMAkJCTsgbW0xPSgqKiAwMiAqKiAwMykKLQlwdW5wY2tsd2QgbW0wLG1tMAkJCTsgbW0wPSgwMCAwMCAwMSAwMSkKLQlwc3JhZCAgICAgbW0xLChEV09SRF9CSVQtV09SRF9CSVQpCTsgbW0xPWluMEg9KDAyIDAzKQotCXBzcmFkICAgICBtbTAsKERXT1JEX0JJVC1XT1JEX0JJVCkJOyBtbTA9aW4wTD0oMDAgMDEpCi0JY3Z0cGkycHMgIHhtbTMsbW0xCQkJOyB4bW0zPSgwMiAwMyAqKiAqKikKLQljdnRwaTJwcyAgeG1tMCxtbTAJCQk7IHhtbTA9KDAwIDAxICoqICoqKQotCW1vdmxocHMgICB4bW0wLHhtbTMJCQk7IHhtbTA9aW4wPSgwMCAwMSAwMiAwMykKLQotCW11bHBzCXhtbTAsIFhNTVdPUkQgW1hNTUJMT0NLKDAsMCxlZHgsU0laRU9GX0ZMT0FUX01VTFRfVFlQRSldCi0KLQltb3ZhcHMJeG1tMSx4bW0wCi0JbW92YXBzCXhtbTIseG1tMAotCW1vdmFwcwl4bW0zLHhtbTAKLQotCXNodWZwcwl4bW0wLHhtbTAsMHgwMAkJCTsgeG1tMD0oMDAgMDAgMDAgMDApCi0Jc2h1ZnBzCXhtbTEseG1tMSwweDU1CQkJOyB4bW0xPSgwMSAwMSAwMSAwMSkKLQlzaHVmcHMJeG1tMix4bW0yLDB4QUEJCQk7IHhtbTI9KDAyIDAyIDAyIDAyKQotCXNodWZwcwl4bW0zLHhtbTMsMHhGRgkJCTsgeG1tMz0oMDMgMDMgMDMgMDMpCi0KLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soMCwwLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW0wCi0JbW92YXBzCVhNTVdPUkQgW1hNTUJMT0NLKDAsMSxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgeG1tMAotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSygxLDAsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTEKLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soMSwxLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW0xCi0JbW92YXBzCVhNTVdPUkQgW1hNTUJMT0NLKDIsMCxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgeG1tMgotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSygyLDEsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTIKLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soMywwLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW0zCi0JbW92YXBzCVhNTVdPUkQgW1hNTUJMT0NLKDMsMSxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgeG1tMwotCWptcAluZWFyIC5uZXh0Y29sdW1uCi0JYWxpZ254CTE2LDcKLSVlbmRpZgotLmNvbHVtbkRDVDoKLQotCTsgLS0gRXZlbiBwYXJ0Ci0KLQltb3ZxICAgICAgbW0wLCBNTVdPUkQgW01NQkxPQ0soMCwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdnEgICAgICBtbTEsIE1NV09SRCBbTU1CTE9DSygyLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92cSAgICAgIG1tMiwgTU1XT1JEIFtNTUJMT0NLKDQsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQltb3ZxICAgICAgbW0zLCBNTVdPUkQgW01NQkxPQ0soNiwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCi0JcHVucGNraHdkIG1tNCxtbTAJCQk7IG1tND0oKiogMDIgKiogMDMpCi0JcHVucGNrbHdkIG1tMCxtbTAJCQk7IG1tMD0oMDAgMDAgMDEgMDEpCi0JcHVucGNraHdkIG1tNSxtbTEJCQk7IG1tNT0oKiogMjIgKiogMjMpCi0JcHVucGNrbHdkIG1tMSxtbTEJCQk7IG1tMT0oMjAgMjAgMjEgMjEpCi0KLQlwc3JhZCAgICAgbW00LChEV09SRF9CSVQtV09SRF9CSVQpCTsgbW00PWluMEg9KDAyIDAzKQotCXBzcmFkICAgICBtbTAsKERXT1JEX0JJVC1XT1JEX0JJVCkJOyBtbTA9aW4wTD0oMDAgMDEpCi0JY3Z0cGkycHMgIHhtbTQsbW00CQkJOyB4bW00PSgwMiAwMyAqKiAqKikKLQljdnRwaTJwcyAgeG1tMCxtbTAJCQk7IHhtbTA9KDAwIDAxICoqICoqKQotCXBzcmFkICAgICBtbTUsKERXT1JEX0JJVC1XT1JEX0JJVCkJOyBtbTU9aW4ySD0oMjIgMjMpCi0JcHNyYWQgICAgIG1tMSwoRFdPUkRfQklULVdPUkRfQklUKQk7IG1tMT1pbjJMPSgyMCAyMSkKLQljdnRwaTJwcyAgeG1tNSxtbTUJCQk7IHhtbTU9KDIyIDIzICoqICoqKQotCWN2dHBpMnBzICB4bW0xLG1tMQkJCTsgeG1tMT0oMjAgMjEgKiogKiopCi0KLQlwdW5wY2tod2QgbW02LG1tMgkJCTsgbW02PSgqKiA0MiAqKiA0MykKLQlwdW5wY2tsd2QgbW0yLG1tMgkJCTsgbW0yPSg0MCA0MCA0MSA0MSkKLQlwdW5wY2tod2QgbW03LG1tMwkJCTsgbW03PSgqKiA2MiAqKiA2MykKLQlwdW5wY2tsd2QgbW0zLG1tMwkJCTsgbW0zPSg2MCA2MCA2MSA2MSkKLQotCXBzcmFkICAgICBtbTYsKERXT1JEX0JJVC1XT1JEX0JJVCkJOyBtbTY9aW40SD0oNDIgNDMpCi0JcHNyYWQgICAgIG1tMiwoRFdPUkRfQklULVdPUkRfQklUKQk7IG1tMj1pbjRMPSg0MCA0MSkKLQljdnRwaTJwcyAgeG1tNixtbTYJCQk7IHhtbTY9KDQyIDQzICoqICoqKQotCWN2dHBpMnBzICB4bW0yLG1tMgkJCTsgeG1tMj0oNDAgNDEgKiogKiopCi0JcHNyYWQgICAgIG1tNywoRFdPUkRfQklULVdPUkRfQklUKQk7IG1tNz1pbjZIPSg2MiA2MykKLQlwc3JhZCAgICAgbW0zLChEV09SRF9CSVQtV09SRF9CSVQpCTsgbW0zPWluNkw9KDYwIDYxKQotCWN2dHBpMnBzICB4bW03LG1tNwkJCTsgeG1tNz0oNjIgNjMgKiogKiopCi0JY3Z0cGkycHMgIHhtbTMsbW0zCQkJOyB4bW0zPSg2MCA2MSAqKiAqKikKLQotCW1vdmxocHMgICB4bW0wLHhtbTQJCQk7IHhtbTA9aW4wPSgwMCAwMSAwMiAwMykKLQltb3ZsaHBzICAgeG1tMSx4bW01CQkJOyB4bW0xPWluMj0oMjAgMjEgMjIgMjMpCi0JbXVscHMgICAgIHhtbTAsIFhNTVdPUkQgW1hNTUJMT0NLKDAsMCxlZHgsU0laRU9GX0ZMT0FUX01VTFRfVFlQRSldCi0JbXVscHMgICAgIHhtbTEsIFhNTVdPUkQgW1hNTUJMT0NLKDIsMCxlZHgsU0laRU9GX0ZMT0FUX01VTFRfVFlQRSldCi0KLQltb3ZsaHBzICAgeG1tMix4bW02CQkJOyB4bW0yPWluND0oNDAgNDEgNDIgNDMpCi0JbW92bGhwcyAgIHhtbTMseG1tNwkJCTsgeG1tMz1pbjY9KDYwIDYxIDYyIDYzKQotCW11bHBzICAgICB4bW0yLCBYTU1XT1JEIFtYTU1CTE9DSyg0LDAsZWR4LFNJWkVPRl9GTE9BVF9NVUxUX1RZUEUpXQotCW11bHBzICAgICB4bW0zLCBYTU1XT1JEIFtYTU1CTE9DSyg2LDAsZWR4LFNJWkVPRl9GTE9BVF9NVUxUX1RZUEUpXQotCi0JbW92YXBzCXhtbTQseG1tMAotCW1vdmFwcwl4bW01LHhtbTEKLQlzdWJwcwl4bW0wLHhtbTIJCTsgeG1tMD10bXAxMQotCXN1YnBzCXhtbTEseG1tMwotCWFkZHBzCXhtbTQseG1tMgkJOyB4bW00PXRtcDEwCi0JYWRkcHMJeG1tNSx4bW0zCQk7IHhtbTU9dG1wMTMKLQotCW11bHBzCXhtbTEsW0dPVE9GRihlYngsUERfMV80MTQpXQotCXN1YnBzCXhtbTEseG1tNQkJOyB4bW0xPXRtcDEyCi0KLQltb3ZhcHMJeG1tNix4bW00Ci0JbW92YXBzCXhtbTcseG1tMAotCXN1YnBzCXhtbTQseG1tNQkJOyB4bW00PXRtcDMKLQlzdWJwcwl4bW0wLHhtbTEJCTsgeG1tMD10bXAyCi0JYWRkcHMJeG1tNix4bW01CQk7IHhtbTY9dG1wMAotCWFkZHBzCXhtbTcseG1tMQkJOyB4bW03PXRtcDEKLQotCW1vdmFwcwlYTU1XT1JEIFt3aygxKV0sIHhtbTQJOyB0bXAzCi0JbW92YXBzCVhNTVdPUkQgW3drKDApXSwgeG1tMAk7IHRtcDIKLQotCTsgLS0gT2RkIHBhcnQKLQotCW1vdnEgICAgICBtbTQsIE1NV09SRCBbTU1CTE9DSygxLDAsZXNpLFNJWkVPRl9KQ09FRildCi0JbW92cSAgICAgIG1tMCwgTU1XT1JEIFtNTUJMT0NLKDMsMCxlc2ksU0laRU9GX0pDT0VGKV0KLQltb3ZxICAgICAgbW01LCBNTVdPUkQgW01NQkxPQ0soNSwwLGVzaSxTSVpFT0ZfSkNPRUYpXQotCW1vdnEgICAgICBtbTEsIE1NV09SRCBbTU1CTE9DSyg3LDAsZXNpLFNJWkVPRl9KQ09FRildCi0KLQlwdW5wY2tod2QgbW02LG1tNAkJCTsgbW02PSgqKiAxMiAqKiAxMykKLQlwdW5wY2tsd2QgbW00LG1tNAkJCTsgbW00PSgxMCAxMCAxMSAxMSkKLQlwdW5wY2tod2QgbW0yLG1tMAkJCTsgbW0yPSgqKiAzMiAqKiAzMykKLQlwdW5wY2tsd2QgbW0wLG1tMAkJCTsgbW0wPSgzMCAzMCAzMSAzMSkKLQotCXBzcmFkICAgICBtbTYsKERXT1JEX0JJVC1XT1JEX0JJVCkJOyBtbTY9aW4xSD0oMTIgMTMpCi0JcHNyYWQgICAgIG1tNCwoRFdPUkRfQklULVdPUkRfQklUKQk7IG1tND1pbjFMPSgxMCAxMSkKLQljdnRwaTJwcyAgeG1tNCxtbTYJCQk7IHhtbTQ9KDEyIDEzICoqICoqKQotCWN2dHBpMnBzICB4bW0yLG1tNAkJCTsgeG1tMj0oMTAgMTEgKiogKiopCi0JcHNyYWQgICAgIG1tMiwoRFdPUkRfQklULVdPUkRfQklUKQk7IG1tMj1pbjNIPSgzMiAzMykKLQlwc3JhZCAgICAgbW0wLChEV09SRF9CSVQtV09SRF9CSVQpCTsgbW0wPWluM0w9KDMwIDMxKQotCWN2dHBpMnBzICB4bW0wLG1tMgkJCTsgeG1tMD0oMzIgMzMgKiogKiopCi0JY3Z0cGkycHMgIHhtbTMsbW0wCQkJOyB4bW0zPSgzMCAzMSAqKiAqKikKLQotCXB1bnBja2h3ZCBtbTcsbW01CQkJOyBtbTc9KCoqIDUyICoqIDUzKQotCXB1bnBja2x3ZCBtbTUsbW01CQkJOyBtbTU9KDUwIDUwIDUxIDUxKQotCXB1bnBja2h3ZCBtbTMsbW0xCQkJOyBtbTM9KCoqIDcyICoqIDczKQotCXB1bnBja2x3ZCBtbTEsbW0xCQkJOyBtbTE9KDcwIDcwIDcxIDcxKQotCi0JbW92bGhwcyAgIHhtbTIseG1tNAkJCTsgeG1tMj1pbjE9KDEwIDExIDEyIDEzKQotCW1vdmxocHMgICB4bW0zLHhtbTAJCQk7IHhtbTM9aW4zPSgzMCAzMSAzMiAzMykKLQotCXBzcmFkICAgICBtbTcsKERXT1JEX0JJVC1XT1JEX0JJVCkJOyBtbTc9aW41SD0oNTIgNTMpCi0JcHNyYWQgICAgIG1tNSwoRFdPUkRfQklULVdPUkRfQklUKQk7IG1tNT1pbjVMPSg1MCA1MSkKLQljdnRwaTJwcyAgeG1tNCxtbTcJCQk7IHhtbTQ9KDUyIDUzICoqICoqKQotCWN2dHBpMnBzICB4bW01LG1tNQkJCTsgeG1tNT0oNTAgNTEgKiogKiopCi0JcHNyYWQgICAgIG1tMywoRFdPUkRfQklULVdPUkRfQklUKQk7IG1tMz1pbjdIPSg3MiA3MykKLQlwc3JhZCAgICAgbW0xLChEV09SRF9CSVQtV09SRF9CSVQpCTsgbW0xPWluN0w9KDcwIDcxKQotCWN2dHBpMnBzICB4bW0wLG1tMwkJCTsgeG1tMD0oNzIgNzMgKiogKiopCi0JY3Z0cGkycHMgIHhtbTEsbW0xCQkJOyB4bW0xPSg3MCA3MSAqKiAqKikKLQotCW11bHBzICAgICB4bW0yLCBYTU1XT1JEIFtYTU1CTE9DSygxLDAsZWR4LFNJWkVPRl9GTE9BVF9NVUxUX1RZUEUpXQotCW11bHBzICAgICB4bW0zLCBYTU1XT1JEIFtYTU1CTE9DSygzLDAsZWR4LFNJWkVPRl9GTE9BVF9NVUxUX1RZUEUpXQotCi0JbW92bGhwcyAgIHhtbTUseG1tNAkJCTsgeG1tNT1pbjU9KDUwIDUxIDUyIDUzKQotCW1vdmxocHMgICB4bW0xLHhtbTAJCQk7IHhtbTE9aW43PSg3MCA3MSA3MiA3MykKLQltdWxwcyAgICAgeG1tNSwgWE1NV09SRCBbWE1NQkxPQ0soNSwwLGVkeCxTSVpFT0ZfRkxPQVRfTVVMVF9UWVBFKV0KLQltdWxwcyAgICAgeG1tMSwgWE1NV09SRCBbWE1NQkxPQ0soNywwLGVkeCxTSVpFT0ZfRkxPQVRfTVVMVF9UWVBFKV0KLQotCW1vdmFwcwl4bW00LHhtbTIKLQltb3ZhcHMJeG1tMCx4bW01Ci0JYWRkcHMJeG1tMix4bW0xCQk7IHhtbTI9ejExCi0JYWRkcHMJeG1tNSx4bW0zCQk7IHhtbTU9ejEzCi0Jc3VicHMJeG1tNCx4bW0xCQk7IHhtbTQ9ejEyCi0Jc3VicHMJeG1tMCx4bW0zCQk7IHhtbTA9ejEwCi0KLQltb3ZhcHMJeG1tMSx4bW0yCi0Jc3VicHMJeG1tMix4bW01Ci0JYWRkcHMJeG1tMSx4bW01CQk7IHhtbTE9dG1wNwotCi0JbXVscHMJeG1tMixbR09UT0ZGKGVieCxQRF8xXzQxNCldCTsgeG1tMj10bXAxMQotCi0JbW92YXBzCXhtbTMseG1tMAotCWFkZHBzCXhtbTAseG1tNAotCW11bHBzCXhtbTAsW0dPVE9GRihlYngsUERfMV84NDcpXQk7IHhtbTA9ejUKLQltdWxwcwl4bW0zLFtHT1RPRkYoZWJ4LFBEX00yXzYxMyldCTsgeG1tMz0oejEwICogLTIuNjEzMTI1OTMwKQotCW11bHBzCXhtbTQsW0dPVE9GRihlYngsUERfMV8wODIpXQk7IHhtbTQ9KHoxMiAqIDEuMDgyMzkyMjAwKQotCWFkZHBzCXhtbTMseG1tMAkJOyB4bW0zPXRtcDEyCi0Jc3VicHMJeG1tNCx4bW0wCQk7IHhtbTQ9dG1wMTAKLQotCTsgLS0gRmluYWwgb3V0cHV0IHN0YWdlCi0KLQlzdWJwcwl4bW0zLHhtbTEJCTsgeG1tMz10bXA2Ci0JbW92YXBzCXhtbTUseG1tNgotCW1vdmFwcwl4bW0wLHhtbTcKLQlhZGRwcwl4bW02LHhtbTEJCTsgeG1tNj1kYXRhMD0oMDAgMDEgMDIgMDMpCi0JYWRkcHMJeG1tNyx4bW0zCQk7IHhtbTc9ZGF0YTE9KDEwIDExIDEyIDEzKQotCXN1YnBzCXhtbTUseG1tMQkJOyB4bW01PWRhdGE3PSg3MCA3MSA3MiA3MykKLQlzdWJwcwl4bW0wLHhtbTMJCTsgeG1tMD1kYXRhNj0oNjAgNjEgNjIgNjMpCi0Jc3VicHMJeG1tMix4bW0zCQk7IHhtbTI9dG1wNQotCi0JbW92YXBzICAgIHhtbTEseG1tNgkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDEpCi0JdW5wY2tscHMgIHhtbTYseG1tNwkJOyB4bW02PSgwMCAxMCAwMSAxMSkKLQl1bnBja2hwcyAgeG1tMSx4bW03CQk7IHhtbTE9KDAyIDEyIDAzIDEzKQotCW1vdmFwcyAgICB4bW0zLHhtbTAJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAxKQotCXVucGNrbHBzICB4bW0wLHhtbTUJCTsgeG1tMD0oNjAgNzAgNjEgNzEpCi0JdW5wY2tocHMgIHhtbTMseG1tNQkJOyB4bW0zPSg2MiA3MiA2MyA3MykKLQotCW1vdmFwcwl4bW03LCBYTU1XT1JEIFt3aygwKV0JOyB4bW03PXRtcDIKLQltb3ZhcHMJeG1tNSwgWE1NV09SRCBbd2soMSldCTsgeG1tNT10bXAzCi0KLQltb3ZhcHMJWE1NV09SRCBbd2soMCldLCB4bW0wCTsgd2soMCk9KDYwIDcwIDYxIDcxKQotCW1vdmFwcwlYTU1XT1JEIFt3aygxKV0sIHhtbTMJOyB3aygxKT0oNjIgNzIgNjMgNzMpCi0KLQlhZGRwcwl4bW00LHhtbTIJCTsgeG1tND10bXA0Ci0JbW92YXBzCXhtbTAseG1tNwotCW1vdmFwcwl4bW0zLHhtbTUKLQlhZGRwcwl4bW03LHhtbTIJCTsgeG1tNz1kYXRhMj0oMjAgMjEgMjIgMjMpCi0JYWRkcHMJeG1tNSx4bW00CQk7IHhtbTU9ZGF0YTQ9KDQwIDQxIDQyIDQzKQotCXN1YnBzCXhtbTAseG1tMgkJOyB4bW0wPWRhdGE1PSg1MCA1MSA1MiA1MykKLQlzdWJwcwl4bW0zLHhtbTQJCTsgeG1tMz1kYXRhMz0oMzAgMzEgMzIgMzMpCi0KLQltb3ZhcHMgICAgeG1tMix4bW03CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMSkKLQl1bnBja2xwcyAgeG1tNyx4bW0zCQk7IHhtbTc9KDIwIDMwIDIxIDMxKQotCXVucGNraHBzICB4bW0yLHhtbTMJCTsgeG1tMj0oMjIgMzIgMjMgMzMpCi0JbW92YXBzICAgIHhtbTQseG1tNQkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDEpCi0JdW5wY2tscHMgIHhtbTUseG1tMAkJOyB4bW01PSg0MCA1MCA0MSA1MSkKLQl1bnBja2hwcyAgeG1tNCx4bW0wCQk7IHhtbTQ9KDQyIDUyIDQzIDUzKQotCi0JbW92YXBzICAgIHhtbTMseG1tNgkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDIpCi0JdW5wY2tscHMyIHhtbTYseG1tNwkJOyB4bW02PSgwMCAxMCAyMCAzMCkKLQl1bnBja2hwczIgeG1tMyx4bW03CQk7IHhtbTM9KDAxIDExIDIxIDMxKQotCW1vdmFwcyAgICB4bW0wLHhtbTEJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXVucGNrbHBzMiB4bW0xLHhtbTIJCTsgeG1tMT0oMDIgMTIgMjIgMzIpCi0JdW5wY2tocHMyIHhtbTAseG1tMgkJOyB4bW0wPSgwMyAxMyAyMyAzMykKLQotCW1vdmFwcwl4bW03LCBYTU1XT1JEIFt3aygwKV0JOyB4bW03PSg2MCA3MCA2MSA3MSkKLQltb3ZhcHMJeG1tMiwgWE1NV09SRCBbd2soMSldCTsgeG1tMj0oNjIgNzIgNjMgNzMpCi0KLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soMCwwLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW02Ci0JbW92YXBzCVhNTVdPUkQgW1hNTUJMT0NLKDEsMCxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgeG1tMwotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSygyLDAsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTEKLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soMywwLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW0wCi0KLQltb3ZhcHMgICAgeG1tNix4bW01CQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMikKLQl1bnBja2xwczIgeG1tNSx4bW03CQk7IHhtbTU9KDQwIDUwIDYwIDcwKQotCXVucGNraHBzMiB4bW02LHhtbTcJCTsgeG1tNj0oNDEgNTEgNjEgNzEpCi0JbW92YXBzICAgIHhtbTMseG1tNAkJOyB0cmFuc3Bvc2UgY29lZmZpY2llbnRzKHBoYXNlIDIpCi0JdW5wY2tscHMyIHhtbTQseG1tMgkJOyB4bW00PSg0MiA1MiA2MiA3MikKLQl1bnBja2hwczIgeG1tMyx4bW0yCQk7IHhtbTM9KDQzIDUzIDYzIDczKQotCi0JbW92YXBzCVhNTVdPUkQgW1hNTUJMT0NLKDAsMSxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgeG1tNQotCW1vdmFwcwlYTU1XT1JEIFtYTU1CTE9DSygxLDEsZWRpLFNJWkVPRl9GQVNUX0ZMT0FUKV0sIHhtbTYKLQltb3ZhcHMJWE1NV09SRCBbWE1NQkxPQ0soMiwxLGVkaSxTSVpFT0ZfRkFTVF9GTE9BVCldLCB4bW00Ci0JbW92YXBzCVhNTVdPUkQgW1hNTUJMT0NLKDMsMSxlZGksU0laRU9GX0ZBU1RfRkxPQVQpXSwgeG1tMwotCi0ubmV4dGNvbHVtbjoKLQlhZGQJZXNpLCBieXRlIDQqU0laRU9GX0pDT0VGCQk7IGNvZWZfYmxvY2sKLQlhZGQJZWR4LCBieXRlIDQqU0laRU9GX0ZMT0FUX01VTFRfVFlQRQk7IHF1YW50cHRyCi0JYWRkCWVkaSwgICAgICA0KkRDVFNJWkUqU0laRU9GX0ZBU1RfRkxPQVQJOyB3c3B0cgotCWRlYwllY3gJCQkJCTsgY3RyCi0Jam56CW5lYXIgLmNvbHVtbmxvb3AKLQotCTsgLS0gUHJlZmV0Y2ggdGhlIG5leHQgY29lZmZpY2llbnQgYmxvY2sKLQotCXByZWZldGNobnRhIFtlc2kgKyAoRENUU0laRTItOCkqU0laRU9GX0pDT0VGICsgMCozMl0KLQlwcmVmZXRjaG50YSBbZXNpICsgKERDVFNJWkUyLTgpKlNJWkVPRl9KQ09FRiArIDEqMzJdCi0JcHJlZmV0Y2hudGEgW2VzaSArIChEQ1RTSVpFMi04KSpTSVpFT0ZfSkNPRUYgKyAyKjMyXQotCXByZWZldGNobnRhIFtlc2kgKyAoRENUU0laRTItOCkqU0laRU9GX0pDT0VGICsgMyozMl0KLQotCTsgLS0tLSBQYXNzIDI6IHByb2Nlc3Mgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LgotCi0JbW92CWVheCwgW29yaWdpbmFsX2VicF0KLQlsZWEJZXNpLCBbd29ya3NwYWNlXQkJCTsgRkFTVF9GTE9BVCAqIHdzcHRyCi0JbW92CWVkaSwgSlNBTVBBUlJBWSBbb3V0cHV0X2J1ZihlYXgpXQk7IChKU0FNUFJPVyAqKQotCW1vdgllYXgsIEpESU1FTlNJT04gW291dHB1dF9jb2woZWF4KV0KLQltb3YJZWN4LCBEQ1RTSVpFLzQJCQkJOyBjdHIKLQlhbGlnbngJMTYsNwotLnJvd2xvb3A6Ci0KLQk7IC0tIEV2ZW4gcGFydAotCi0JbW92YXBzCXhtbTAsIFhNTVdPUkQgW1hNTUJMT0NLKDAsMCxlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCW1vdmFwcwl4bW0xLCBYTU1XT1JEIFtYTU1CTE9DSygyLDAsZXNpLFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQltb3ZhcHMJeG1tMiwgWE1NV09SRCBbWE1NQkxPQ0soNCwwLGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92YXBzCXhtbTMsIFhNTVdPUkQgW1hNTUJMT0NLKDYsMCxlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCi0JbW92YXBzCXhtbTQseG1tMAotCW1vdmFwcwl4bW01LHhtbTEKLQlzdWJwcwl4bW0wLHhtbTIJCTsgeG1tMD10bXAxMQotCXN1YnBzCXhtbTEseG1tMwotCWFkZHBzCXhtbTQseG1tMgkJOyB4bW00PXRtcDEwCi0JYWRkcHMJeG1tNSx4bW0zCQk7IHhtbTU9dG1wMTMKLQotCW11bHBzCXhtbTEsW0dPVE9GRihlYngsUERfMV80MTQpXQotCXN1YnBzCXhtbTEseG1tNQkJOyB4bW0xPXRtcDEyCi0KLQltb3ZhcHMJeG1tNix4bW00Ci0JbW92YXBzCXhtbTcseG1tMAotCXN1YnBzCXhtbTQseG1tNQkJOyB4bW00PXRtcDMKLQlzdWJwcwl4bW0wLHhtbTEJCTsgeG1tMD10bXAyCi0JYWRkcHMJeG1tNix4bW01CQk7IHhtbTY9dG1wMAotCWFkZHBzCXhtbTcseG1tMQkJOyB4bW03PXRtcDEKLQotCW1vdmFwcwlYTU1XT1JEIFt3aygxKV0sIHhtbTQJOyB0bXAzCi0JbW92YXBzCVhNTVdPUkQgW3drKDApXSwgeG1tMAk7IHRtcDIKLQotCTsgLS0gT2RkIHBhcnQKLQotCW1vdmFwcwl4bW0yLCBYTU1XT1JEIFtYTU1CTE9DSygxLDAsZXNpLFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQltb3ZhcHMJeG1tMywgWE1NV09SRCBbWE1NQkxPQ0soMywwLGVzaSxTSVpFT0ZfRkFTVF9GTE9BVCldCi0JbW92YXBzCXhtbTUsIFhNTVdPUkQgW1hNTUJMT0NLKDUsMCxlc2ksU0laRU9GX0ZBU1RfRkxPQVQpXQotCW1vdmFwcwl4bW0xLCBYTU1XT1JEIFtYTU1CTE9DSyg3LDAsZXNpLFNJWkVPRl9GQVNUX0ZMT0FUKV0KLQotCW1vdmFwcwl4bW00LHhtbTIKLQltb3ZhcHMJeG1tMCx4bW01Ci0JYWRkcHMJeG1tMix4bW0xCQk7IHhtbTI9ejExCi0JYWRkcHMJeG1tNSx4bW0zCQk7IHhtbTU9ejEzCi0Jc3VicHMJeG1tNCx4bW0xCQk7IHhtbTQ9ejEyCi0Jc3VicHMJeG1tMCx4bW0zCQk7IHhtbTA9ejEwCi0KLQltb3ZhcHMJeG1tMSx4bW0yCi0Jc3VicHMJeG1tMix4bW01Ci0JYWRkcHMJeG1tMSx4bW01CQk7IHhtbTE9dG1wNwotCi0JbXVscHMJeG1tMixbR09UT0ZGKGVieCxQRF8xXzQxNCldCTsgeG1tMj10bXAxMQotCi0JbW92YXBzCXhtbTMseG1tMAotCWFkZHBzCXhtbTAseG1tNAotCW11bHBzCXhtbTAsW0dPVE9GRihlYngsUERfMV84NDcpXQk7IHhtbTA9ejUKLQltdWxwcwl4bW0zLFtHT1RPRkYoZWJ4LFBEX00yXzYxMyldCTsgeG1tMz0oejEwICogLTIuNjEzMTI1OTMwKQotCW11bHBzCXhtbTQsW0dPVE9GRihlYngsUERfMV8wODIpXQk7IHhtbTQ9KHoxMiAqIDEuMDgyMzkyMjAwKQotCWFkZHBzCXhtbTMseG1tMAkJOyB4bW0zPXRtcDEyCi0Jc3VicHMJeG1tNCx4bW0wCQk7IHhtbTQ9dG1wMTAKLQotCTsgLS0gRmluYWwgb3V0cHV0IHN0YWdlCi0KLQlzdWJwcwl4bW0zLHhtbTEJCTsgeG1tMz10bXA2Ci0JbW92YXBzCXhtbTUseG1tNgotCW1vdmFwcwl4bW0wLHhtbTcKLQlhZGRwcwl4bW02LHhtbTEJCTsgeG1tNj1kYXRhMD0oMDAgMTAgMjAgMzApCi0JYWRkcHMJeG1tNyx4bW0zCQk7IHhtbTc9ZGF0YTE9KDAxIDExIDIxIDMxKQotCXN1YnBzCXhtbTUseG1tMQkJOyB4bW01PWRhdGE3PSgwNyAxNyAyNyAzNykKLQlzdWJwcwl4bW0wLHhtbTMJCTsgeG1tMD1kYXRhNj0oMDYgMTYgMjYgMzYpCi0Jc3VicHMJeG1tMix4bW0zCQk7IHhtbTI9dG1wNQotCi0JbW92YXBzCXhtbTEsW0dPVE9GRihlYngsUERfMF8xMjUpXQk7IHhtbTE9W1BEXzBfMTI1XQotCi0JbXVscHMJeG1tNix4bW0xCQk7IGRlc2NhbGUoMS84KQotCW11bHBzCXhtbTcseG1tMQkJOyBkZXNjYWxlKDEvOCkKLQltdWxwcwl4bW01LHhtbTEJCTsgZGVzY2FsZSgxLzgpCi0JbXVscHMJeG1tMCx4bW0xCQk7IGRlc2NhbGUoMS84KQotCi0JbW92aGxwcyAgIHhtbTMseG1tNgotCW1vdmhscHMgICB4bW0xLHhtbTcKLQljdnRwczJwaSAgbW0wLHhtbTYJCTsgcm91bmQgdG8gaW50MzIsIG1tMD1kYXRhMEw9KDAwIDEwKQotCWN2dHBzMnBpICBtbTEseG1tNwkJOyByb3VuZCB0byBpbnQzMiwgbW0xPWRhdGExTD0oMDEgMTEpCi0JY3Z0cHMycGkgIG1tMix4bW0zCQk7IHJvdW5kIHRvIGludDMyLCBtbTI9ZGF0YTBIPSgyMCAzMCkKLQljdnRwczJwaSAgbW0zLHhtbTEJCTsgcm91bmQgdG8gaW50MzIsIG1tMz1kYXRhMUg9KDIxIDMxKQotCXBhY2tzc2R3ICBtbTAsbW0yCQk7IG1tMD1kYXRhMD0oMDAgMTAgMjAgMzApCi0JcGFja3NzZHcgIG1tMSxtbTMJCTsgbW0xPWRhdGExPSgwMSAxMSAyMSAzMSkKLQotCW1vdmhscHMgICB4bW02LHhtbTUKLQltb3ZobHBzICAgeG1tNyx4bW0wCi0JY3Z0cHMycGkgIG1tNCx4bW01CQk7IHJvdW5kIHRvIGludDMyLCBtbTQ9ZGF0YTdMPSgwNyAxNykKLQljdnRwczJwaSAgbW01LHhtbTAJCTsgcm91bmQgdG8gaW50MzIsIG1tNT1kYXRhNkw9KDA2IDE2KQotCWN2dHBzMnBpICBtbTYseG1tNgkJOyByb3VuZCB0byBpbnQzMiwgbW02PWRhdGE3SD0oMjcgMzcpCi0JY3Z0cHMycGkgIG1tNyx4bW03CQk7IHJvdW5kIHRvIGludDMyLCBtbTc9ZGF0YTZIPSgyNiAzNikKLQlwYWNrc3NkdyAgbW00LG1tNgkJOyBtbTQ9ZGF0YTc9KDA3IDE3IDI3IDM3KQotCXBhY2tzc2R3ICBtbTUsbW03CQk7IG1tNT1kYXRhNj0oMDYgMTYgMjYgMzYpCi0KLQlwYWNrc3N3YiAgbW0wLG1tNQkJOyBtbTA9KDAwIDEwIDIwIDMwIDA2IDE2IDI2IDM2KQotCXBhY2tzc3diICBtbTEsbW00CQk7IG1tMT0oMDEgMTEgMjEgMzEgMDcgMTcgMjcgMzcpCi0KLQltb3ZhcHMJeG1tMywgWE1NV09SRCBbd2soMCldCTsgeG1tMz10bXAyCi0JbW92YXBzCXhtbTEsIFhNTVdPUkQgW3drKDEpXQk7IHhtbTE9dG1wMwotCi0JbW92YXBzCXhtbTYsW0dPVE9GRihlYngsUERfMF8xMjUpXQk7IHhtbTY9W1BEXzBfMTI1XQotCi0JYWRkcHMJeG1tNCx4bW0yCQk7IHhtbTQ9dG1wNAotCW1vdmFwcwl4bW01LHhtbTMKLQltb3ZhcHMJeG1tMCx4bW0xCi0JYWRkcHMJeG1tMyx4bW0yCQk7IHhtbTM9ZGF0YTI9KDAyIDEyIDIyIDMyKQotCWFkZHBzCXhtbTEseG1tNAkJOyB4bW0xPWRhdGE0PSgwNCAxNCAyNCAzNCkKLQlzdWJwcwl4bW01LHhtbTIJCTsgeG1tNT1kYXRhNT0oMDUgMTUgMjUgMzUpCi0Jc3VicHMJeG1tMCx4bW00CQk7IHhtbTA9ZGF0YTM9KDAzIDEzIDIzIDMzKQotCi0JbXVscHMJeG1tMyx4bW02CQk7IGRlc2NhbGUoMS84KQotCW11bHBzCXhtbTEseG1tNgkJOyBkZXNjYWxlKDEvOCkKLQltdWxwcwl4bW01LHhtbTYJCTsgZGVzY2FsZSgxLzgpCi0JbXVscHMJeG1tMCx4bW02CQk7IGRlc2NhbGUoMS84KQotCi0JbW92aGxwcyAgIHhtbTcseG1tMwotCW1vdmhscHMgICB4bW0yLHhtbTEKLQljdnRwczJwaSAgbW0yLHhtbTMJCTsgcm91bmQgdG8gaW50MzIsIG1tMj1kYXRhMkw9KDAyIDEyKQotCWN2dHBzMnBpICBtbTMseG1tMQkJOyByb3VuZCB0byBpbnQzMiwgbW0zPWRhdGE0TD0oMDQgMTQpCi0JY3Z0cHMycGkgIG1tNix4bW03CQk7IHJvdW5kIHRvIGludDMyLCBtbTY9ZGF0YTJIPSgyMiAzMikKLQljdnRwczJwaSAgbW03LHhtbTIJCTsgcm91bmQgdG8gaW50MzIsIG1tNz1kYXRhNEg9KDI0IDM0KQotCXBhY2tzc2R3ICBtbTIsbW02CQk7IG1tMj1kYXRhMj0oMDIgMTIgMjIgMzIpCi0JcGFja3NzZHcgIG1tMyxtbTcJCTsgbW0zPWRhdGE0PSgwNCAxNCAyNCAzNCkKLQotCW1vdmhscHMgICB4bW00LHhtbTUKLQltb3ZobHBzICAgeG1tNix4bW0wCi0JY3Z0cHMycGkgIG1tNSx4bW01CQk7IHJvdW5kIHRvIGludDMyLCBtbTU9ZGF0YTVMPSgwNSAxNSkKLQljdnRwczJwaSAgbW00LHhtbTAJCTsgcm91bmQgdG8gaW50MzIsIG1tND1kYXRhM0w9KDAzIDEzKQotCWN2dHBzMnBpICBtbTYseG1tNAkJOyByb3VuZCB0byBpbnQzMiwgbW02PWRhdGE1SD0oMjUgMzUpCi0JY3Z0cHMycGkgIG1tNyx4bW02CQk7IHJvdW5kIHRvIGludDMyLCBtbTc9ZGF0YTNIPSgyMyAzMykKLQlwYWNrc3NkdyAgbW01LG1tNgkJOyBtbTU9ZGF0YTU9KDA1IDE1IDI1IDM1KQotCXBhY2tzc2R3ICBtbTQsbW03CQk7IG1tND1kYXRhMz0oMDMgMTMgMjMgMzMpCi0KLQltb3ZxICAgICAgbW02LFtHT1RPRkYoZWJ4LFBCX0NFTlRFUkpTQU1QKV0JOyBtbTY9W1BCX0NFTlRFUkpTQU1QXQotCi0JcGFja3Nzd2IgIG1tMixtbTMJCTsgbW0yPSgwMiAxMiAyMiAzMiAwNCAxNCAyNCAzNCkKLQlwYWNrc3N3YiAgbW00LG1tNQkJOyBtbTQ9KDAzIDEzIDIzIDMzIDA1IDE1IDI1IDM1KQotCi0JcGFkZGIgICAgIG1tMCxtbTYKLQlwYWRkYiAgICAgbW0xLG1tNgotCXBhZGRiICAgICBtbTIsbW02Ci0JcGFkZGIgICAgIG1tNCxtbTYKLQotCW1vdnEgICAgICBtbTcsbW0wCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMSkKLQlwdW5wY2tsYncgbW0wLG1tMQkJOyBtbTA9KDAwIDAxIDEwIDExIDIwIDIxIDMwIDMxKQotCXB1bnBja2hidyBtbTcsbW0xCQk7IG1tNz0oMDYgMDcgMTYgMTcgMjYgMjcgMzYgMzcpCi0JbW92cSAgICAgIG1tMyxtbTIJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAxKQotCXB1bnBja2xidyBtbTIsbW00CQk7IG1tMj0oMDIgMDMgMTIgMTMgMjIgMjMgMzIgMzMpCi0JcHVucGNraGJ3IG1tMyxtbTQJCTsgbW0zPSgwNCAwNSAxNCAxNSAyNCAyNSAzNCAzNSkKLQotCW1vdnEgICAgICBtbTUsbW0wCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMikKLQlwdW5wY2tsd2QgbW0wLG1tMgkJOyBtbTA9KDAwIDAxIDAyIDAzIDEwIDExIDEyIDEzKQotCXB1bnBja2h3ZCBtbTUsbW0yCQk7IG1tNT0oMjAgMjEgMjIgMjMgMzAgMzEgMzIgMzMpCi0JbW92cSAgICAgIG1tNixtbTMJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAyKQotCXB1bnBja2x3ZCBtbTMsbW03CQk7IG1tMz0oMDQgMDUgMDYgMDcgMTQgMTUgMTYgMTcpCi0JcHVucGNraHdkIG1tNixtbTcJCTsgbW02PSgyNCAyNSAyNiAyNyAzNCAzNSAzNiAzNykKLQotCW1vdnEgICAgICBtbTEsbW0wCQk7IHRyYW5zcG9zZSBjb2VmZmljaWVudHMocGhhc2UgMykKLQlwdW5wY2tsZHEgbW0wLG1tMwkJOyBtbTA9KDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3KQotCXB1bnBja2hkcSBtbTEsbW0zCQk7IG1tMT0oMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcpCi0JbW92cSAgICAgIG1tNCxtbTUJCTsgdHJhbnNwb3NlIGNvZWZmaWNpZW50cyhwaGFzZSAzKQotCXB1bnBja2xkcSBtbTUsbW02CQk7IG1tNT0oMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcpCi0JcHVucGNraGRxIG1tNCxtbTYJCTsgbW00PSgzMCAzMSAzMiAzMyAzNCAzNSAzNiAzNykKLQotCXB1c2hwaWMJZWJ4CQkJOyBzYXZlIEdPVCBhZGRyZXNzCi0KLQltb3YJZWR4LCBKU0FNUFJPVyBbZWRpKzAqU0laRU9GX0pTQU1QUk9XXQotCW1vdgllYngsIEpTQU1QUk9XIFtlZGkrMSpTSVpFT0ZfSlNBTVBST1ddCi0JbW92cQlNTVdPUkQgW2VkeCtlYXgqU0laRU9GX0pTQU1QTEVdLCBtbTAKLQltb3ZxCU1NV09SRCBbZWJ4K2VheCpTSVpFT0ZfSlNBTVBMRV0sIG1tMQotCW1vdgllZHgsIEpTQU1QUk9XIFtlZGkrMipTSVpFT0ZfSlNBTVBST1ddCi0JbW92CWVieCwgSlNBTVBST1cgW2VkaSszKlNJWkVPRl9KU0FNUFJPV10KLQltb3ZxCU1NV09SRCBbZWR4K2VheCpTSVpFT0ZfSlNBTVBMRV0sIG1tNQotCW1vdnEJTU1XT1JEIFtlYngrZWF4KlNJWkVPRl9KU0FNUExFXSwgbW00Ci0KLQlwb3BwaWMJZWJ4CQkJOyByZXN0b3JlIEdPVCBhZGRyZXNzCi0KLQlhZGQJZXNpLCBieXRlIDQqU0laRU9GX0ZBU1RfRkxPQVQJOyB3c3B0cgotCWFkZAllZGksIGJ5dGUgNCpTSVpFT0ZfSlNBTVBST1cKLQlkZWMJZWN4CQkJCTsgY3RyCi0Jam56CW5lYXIgLnJvd2xvb3AKLQotCWVtbXMJCTsgZW1wdHkgTU1YIHN0YXRlCi0KLQlwb3AJZWRpCi0JcG9wCWVzaQotOwlwb3AJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwb3AJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotCXBvcAllYngKLQltb3YJZXNwLGVicAkJOyBlc3AgPC0gYWxpZ25lZCBlYnAKLQlwb3AJZXNwCQk7IGVzcCA8LSBvcmlnaW5hbCBlYnAKLQlwb3AJZWJwCi0JcmV0Ci0KLSVlbmRpZiA7IEpJRENUX0ZMVF9TU0VfTU1YX1NVUFBPUlRFRAotJWVuZGlmIDsgRENUX0ZMT0FUX1NVUFBPUlRFRApkaWZmIC0tZ2l0IGEvam1lbWFuc2kuYyBiL2ptZW1hbnNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkOTNlNDkuLjAwMDAwMDAKLS0tIGEvam1lbWFuc2kuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogam1lbWFuc2kuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIHByb3ZpZGVzIGEgc2ltcGxlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN5c3RlbS0KLSAqIGRlcGVuZGVudCBwb3J0aW9uIG9mIHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyLiAgVGhpcyBpbXBsZW1lbnRhdGlvbgotICogYXNzdW1lcyB0aGF0IHlvdSBoYXZlIHRoZSBBTlNJLXN0YW5kYXJkIGxpYnJhcnkgcm91dGluZSB0bXBmaWxlKCkuCi0gKiBBbHNvLCB0aGUgcHJvYmxlbSBvZiBkZXRlcm1pbmluZyB0aGUgYW1vdW50IG9mIG1lbW9yeSBhdmFpbGFibGUKLSAqIGlzIHNob3ZlZCBvbnRvIHRoZSB1c2VyLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqbWVtc3lzLmgiCQkvKiBpbXBvcnQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zICovCi0KLSNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSBtYWxsb2MoKSxmcmVlKCkgKi8KLWV4dGVybiB2b2lkICogbWFsbG9jIEpQUCgoc2l6ZV90IHNpemUpKTsKLWV4dGVybiB2b2lkIGZyZWUgSlBQKCh2b2lkICpwdHIpKTsKLSNlbmRpZgotCi0jaWZuZGVmIFNFRUtfU0VUCQkvKiBwcmUtQU5TSSBzeXN0ZW1zIG1heSBub3QgZGVmaW5lIHRoaXM7ICovCi0jZGVmaW5lIFNFRUtfU0VUICAwCQkvKiBpZiBub3QsIGFzc3VtZSAwIGlzIGNvcnJlY3QgKi8KLSNlbmRpZgotCi0KLS8qCi0gKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBhcmUgY29udHJvbGxlZCBieSB0aGUgcmVndWxhciBsaWJyYXJ5Ci0gKiByb3V0aW5lcyBtYWxsb2MoKSBhbmQgZnJlZSgpLgotICovCi0KLUdMT0JBTCh2b2lkICopCi1qcGVnX2dldF9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICByZXR1cm4gKHZvaWQgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19mcmVlX3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIGZyZWUob2JqZWN0KTsKLX0KLQotCi0vKgotICogIkxhcmdlIiBvYmplY3RzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzICJzbWFsbCIgb25lcy4KLSAqIE5COiBhbHRob3VnaCB3ZSBpbmNsdWRlIEZBUiBrZXl3b3JkcyBpbiB0aGUgcm91dGluZSBkZWNsYXJhdGlvbnMsCi0gKiB0aGlzIGZpbGUgd29uJ3QgYWN0dWFsbHkgd29yayBpbiA4MHg4NiBzbWFsbC9tZWRpdW0gbW9kZWw7IGF0IGxlYXN0LAotICogeW91IHByb2JhYmx5IHdvbid0IGJlIGFibGUgdG8gcHJvY2VzcyB1c2VmdWwtc2l6ZSBpbWFnZXMgaW4gb25seSA2NEtCLgotICovCi0KLUdMT0JBTCh2b2lkIEZBUiAqKQotanBlZ19nZXRfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgcmV0dXJuICh2b2lkIEZBUiAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2ZyZWVfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCBGQVIgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIGZyZWUob2JqZWN0KTsKLX0KLQotCi0vKgotICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBtZW1vcnkgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgotICogSXQncyBpbXBvc3NpYmxlIHRvIGRvIHRoaXMgaW4gYSBwb3J0YWJsZSB3YXk7IG91ciBjdXJyZW50IHNvbHV0aW9uIGlzCi0gKiB0byBtYWtlIHRoZSB1c2VyIHRlbGwgdXMgKHdpdGggYSBkZWZhdWx0IHZhbHVlIHNldCBhdCBjb21waWxlIHRpbWUpLgotICogSWYgeW91IGNhbiBhY3R1YWxseSBnZXQgdGhlIGF2YWlsYWJsZSBzcGFjZSwgaXQncyBhIGdvb2QgaWRlYSB0byBzdWJ0cmFjdAotICogYSBzbG9wIGZhY3RvciBvZiA1JSBvciBzby4KLSAqLwotCi0jaWZuZGVmIERFRkFVTFRfTUFYX01FTQkJLyogc28gY2FuIG92ZXJyaWRlIGZyb20gbWFrZWZpbGUgKi8KLSNkZWZpbmUgREVGQVVMVF9NQVhfTUVNCQkxMDAwMDAwTCAvKiBkZWZhdWx0OiBvbmUgbWVnYWJ5dGUgKi8KLSNlbmRpZgotCi1HTE9CQUwobG9uZykKLWpwZWdfbWVtX2F2YWlsYWJsZSAoal9jb21tb25fcHRyIGNpbmZvLCBsb25nIG1pbl9ieXRlc19uZWVkZWQsCi0JCSAgICBsb25nIG1heF9ieXRlc19uZWVkZWQsIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpCi17Ci0gIHJldHVybiBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSAtIGFscmVhZHlfYWxsb2NhdGVkOwotfQotCi0KLS8qCi0gKiBCYWNraW5nIHN0b3JlICh0ZW1wb3JhcnkgZmlsZSkgbWFuYWdlbWVudC4KLSAqIEJhY2tpbmcgc3RvcmUgb2JqZWN0cyBhcmUgb25seSB1c2VkIHdoZW4gdGhlIHZhbHVlIHJldHVybmVkIGJ5Ci0gKiBqcGVnX21lbV9hdmFpbGFibGUgaXMgbGVzcyB0aGFuIHRoZSB0b3RhbCBzcGFjZSBuZWVkZWQuICBZb3UgY2FuIGRpc3BlbnNlCi0gKiB3aXRoIHRoZXNlIHJvdXRpbmVzIGlmIHlvdSBoYXZlIHBsZW50eSBvZiB2aXJ0dWFsIG1lbW9yeTsgc2VlIGptZW1ub2JzLmMuCi0gKi8KLQotCi1NRVRIT0RERUYodm9pZCkKLXJlYWRfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJICAgIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKLXsKLSAgaWYgKGZzZWVrKGluZm8tPnRlbXBfZmlsZSwgZmlsZV9vZmZzZXQsIFNFRUtfU0VUKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1NFRUspOwotICBpZiAoSkZSRUFEKGluZm8tPnRlbXBfZmlsZSwgYnVmZmVyX2FkZHJlc3MsIGJ5dGVfY291bnQpCi0gICAgICAhPSAoc2l6ZV90KSBieXRlX2NvdW50KQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfUkVBRCk7Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCSAgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCi17Ci0gIGlmIChmc2VlayhpbmZvLT50ZW1wX2ZpbGUsIGZpbGVfb2Zmc2V0LCBTRUVLX1NFVCkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKLSAgaWYgKEpGV1JJVEUoaW5mby0+dGVtcF9maWxlLCBidWZmZXJfYWRkcmVzcywgYnl0ZV9jb3VudCkKLSAgICAgICE9IChzaXplX3QpIGJ5dGVfY291bnQpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9XUklURSk7Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi1jbG9zZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8pCi17Ci0gIGZjbG9zZShpbmZvLT50ZW1wX2ZpbGUpOwotICAvKiBTaW5jZSB0aGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdG1wZmlsZSgpIHRvIGNyZWF0ZSB0aGUgZmlsZSwKLSAgICogbm8gZXhwbGljaXQgZmlsZSBkZWxldGlvbiBpcyBuZWVkZWQuCi0gICAqLwotfQotCi0KLS8qCi0gKiBJbml0aWFsIG9wZW5pbmcgb2YgYSBiYWNraW5nLXN0b3JlIG9iamVjdC4KLSAqCi0gKiBUaGlzIHZlcnNpb24gdXNlcyB0bXBmaWxlKCksIHdoaWNoIGNvbnN0cnVjdHMgYSBzdWl0YWJsZSBmaWxlIG5hbWUKLSAqIGJlaGluZCB0aGUgc2NlbmVzLiAgV2UgZG9uJ3QgaGF2ZSB0byB1c2UgaW5mby0+dGVtcF9uYW1lW10gYXQgYWxsOwotICogaW5kZWVkLCB3ZSBjYW4ndCBldmVuIGZpbmQgb3V0IHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUgdGVtcCBmaWxlLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJCSBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKLXsKLSAgaWYgKChpbmZvLT50ZW1wX2ZpbGUgPSB0bXBmaWxlKCkpID09IE5VTEwpCi0gICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCAiIik7Ci0gIGluZm8tPnJlYWRfYmFja2luZ19zdG9yZSA9IHJlYWRfYmFja2luZ19zdG9yZTsKLSAgaW5mby0+d3JpdGVfYmFja2luZ19zdG9yZSA9IHdyaXRlX2JhY2tpbmdfc3RvcmU7Ci0gIGluZm8tPmNsb3NlX2JhY2tpbmdfc3RvcmUgPSBjbG9zZV9iYWNraW5nX3N0b3JlOwotfQotCi0KLS8qCi0gKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCi0gKiBjbGVhbnVwIHJlcXVpcmVkLgotICovCi0KLUdMT0JBTChsb25nKQotanBlZ19tZW1faW5pdCAoal9jb21tb25fcHRyIGNpbmZvKQotewotICByZXR1cm4gREVGQVVMVF9NQVhfTUVNOwkvKiBkZWZhdWx0IGZvciBtYXhfbWVtb3J5X3RvX3VzZSAqLwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfbWVtX3Rlcm0gKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgLyogbm8gd29yayAqLwotfQpkaWZmIC0tZ2l0IGEvam1lbW1nci5jIGIvam1lbW1nci5jCmluZGV4IGUzMTQ5ZTUuLjViMzM1NjcgMTAwNjQ0Ci0tLSBhL2ptZW1tZ3IuYworKysgYi9qbWVtbWdyLmMKQEAgLTUsMTMgKzUsNiBAQAogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KICAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KLSAqIFRoaXMgZmlsZSBoYXMgYmVlbiBtb2RpZmllZCBmb3IgU0lNRCBleHRlbnNpb24uCi0gKiBMYXN0IE1vZGlmaWVkIDogSmFudWFyeSAyNywgMjAwNAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgogICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBKUEVHIHN5c3RlbS1pbmRlcGVuZGVudCBtZW1vcnkgbWFuYWdlbWVudAogICogcm91dGluZXMuICBUaGlzIGNvZGUgaXMgdXNhYmxlIGFjcm9zcyBhIHdpZGUgdmFyaWV0eSBvZiBtYWNoaW5lczsgbW9zdAogICogb2YgdGhlIHN5c3RlbSBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGlzb2xhdGVkIGluIGEgc2VwYXJhdGUgZmlsZS4KQEAgLTU4LDEzICs1MSwyNyBAQAogCiAKIC8qCi0gKiBTSU1EIEV4dDogTW9zdCBvZiBTU0UvU1NFMiBpbnN0cnVjdGlvbnMgcmVxdWlyZSB0aGF0IHRoZSBtZW1vcnkgYWRkcmVzcwotICogaXMgYWxpZ25lZCB0byBhIDE2LWJ5dGUgYm91bmRhcnk7IGlmIG5vdCwgYSBnZW5lcmFsLXByb3RlY3Rpb24gZXhjZXB0aW9uCi0gKiAoI0dQKSBpcyBnZW5lcmF0ZWQuCisgKiBNYW55IG1hY2hpbmVzIHJlcXVpcmUgc3RvcmFnZSBhbGlnbm1lbnQ6IGxvbmdzIG11c3Qgc3RhcnQgb24gNC1ieXRlCisgKiBib3VuZGFyaWVzLCBkb3VibGVzIG9uIDgtYnl0ZSBib3VuZGFyaWVzLCBldGMuICBPbiBzdWNoIG1hY2hpbmVzLCBtYWxsb2MoKQorICogYWx3YXlzIHJldHVybnMgcG9pbnRlcnMgdGhhdCBhcmUgbXVsdGlwbGVzIG9mIHRoZSB3b3JzdC1jYXNlIGFsaWdubWVudAorICogcmVxdWlyZW1lbnQsIGFuZCB3ZSBoYWQgYmV0dGVyIGRvIHNvIHRvby4KKyAqIFRoZXJlIGlzbid0IGFueSByZWFsbHkgcG9ydGFibGUgd2F5IHRvIGRldGVybWluZSB0aGUgd29yc3QtY2FzZSBhbGlnbm1lbnQKKyAqIHJlcXVpcmVtZW50LiAgVGhpcyBtb2R1bGUgYXNzdW1lcyB0aGF0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgaXMKKyAqIG11bHRpcGxlcyBvZiBBTElHTl9TSVpFLgorICogQnkgZGVmYXVsdCwgd2UgZGVmaW5lIEFMSUdOX1NJWkUgYXMgc2l6ZW9mKGRvdWJsZSkuICBUaGlzIGlzIG5lY2Vzc2FyeSBvbiBzb21lCisgKiB3b3Jrc3RhdGlvbnMgKHdoZXJlIGRvdWJsZXMgcmVhbGx5IGRvIG5lZWQgOC1ieXRlIGFsaWdubWVudCkgYW5kIHdpbGwgd29yaworICogZmluZSBvbiBuZWFybHkgZXZlcnl0aGluZy4gIElmIHlvdXIgbWFjaGluZSBoYXMgbGVzc2VyIGFsaWdubWVudCBuZWVkcywKKyAqIHlvdSBjYW4gc2F2ZSBhIGZldyBieXRlcyBieSBtYWtpbmcgQUxJR05fU0laRSBzbWFsbGVyLgorICogVGhlIG9ubHkgcGxhY2UgSSBrbm93IG9mIHdoZXJlIHRoaXMgd2lsbCBOT1Qgd29yayBpcyBjZXJ0YWluIE1hY2ludG9zaAorICogNjgweDAgY29tcGlsZXJzIHRoYXQgZGVmaW5lIGRvdWJsZSBhcyBhIDEwLWJ5dGUgSUVFRSBleHRlbmRlZCBmbG9hdC4KKyAqIERvaW5nIDEwLWJ5dGUgYWxpZ25tZW50IGlzIGNvdW50ZXJwcm9kdWN0aXZlIGJlY2F1c2UgbG9uZ3dvcmRzIHdvbid0IGJlCisgKiBhbGlnbmVkIHdlbGwuICBQdXQgIiNkZWZpbmUgQUxJR05fU0laRSA0IiBpbiBqY29uZmlnLmggaWYgeW91IGhhdmUKKyAqIHN1Y2ggYSBjb21waWxlci4KICAqLwogCi0jZGVmaW5lIEFMSUdOX1NJWkUgIDE2CQkvKiBzaXplb2YgU1NFL1NTRTIgcmVnaXN0ZXIgKi8KLQorI2lmbmRlZiBBTElHTl9TSVpFCQkvKiBzbyBjYW4gb3ZlcnJpZGUgZnJvbSBqY29uZmlnLmggKi8KKyNkZWZpbmUgQUxJR05fU0laRSAgU0laRU9GKGRvdWJsZSkKKyNlbmRpZgogCiAvKgogICogV2UgYWxsb2NhdGUgb2JqZWN0cyBmcm9tICJwb29scyIsIHdoZXJlIGVhY2ggcG9vbCBpcyBnb3R0ZW4gd2l0aCBhIHNpbmdsZQpAQCAtNzgsMjIgKzg1LDE5IEBACiB0eXBlZGVmIHN0cnVjdCBzbWFsbF9wb29sX3N0cnVjdCAqIHNtYWxsX3Bvb2xfcHRyOwogCiB0eXBlZGVmIHN0cnVjdCBzbWFsbF9wb29sX3N0cnVjdCB7Ci0gIHNtYWxsX3Bvb2xfcHRyIG5leHQ7CQkvKiBuZXh0IGluIGxpc3Qgb2YgcG9vbHMgKi8KKyAgc21hbGxfcG9vbF9wdHIgbmV4dDsJLyogbmV4dCBpbiBsaXN0IG9mIHBvb2xzICovCiAgIHNpemVfdCBieXRlc191c2VkOwkJLyogaG93IG1hbnkgYnl0ZXMgYWxyZWFkeSB1c2VkIHdpdGhpbiBwb29sICovCiAgIHNpemVfdCBieXRlc19sZWZ0OwkJLyogYnl0ZXMgc3RpbGwgYXZhaWxhYmxlIGluIHRoaXMgcG9vbCAqLwotICBjaGFyIGR1bW15W0FMSUdOX1NJWkUtMV07CiB9IHNtYWxsX3Bvb2xfaGRyOwogCiB0eXBlZGVmIHN0cnVjdCBsYXJnZV9wb29sX3N0cnVjdCBGQVIgKiBsYXJnZV9wb29sX3B0cjsKIAogdHlwZWRlZiBzdHJ1Y3QgbGFyZ2VfcG9vbF9zdHJ1Y3QgewotICBsYXJnZV9wb29sX3B0ciBuZXh0OwkJLyogbmV4dCBpbiBsaXN0IG9mIHBvb2xzICovCisgIGxhcmdlX3Bvb2xfcHRyIG5leHQ7CS8qIG5leHQgaW4gbGlzdCBvZiBwb29scyAqLwogICBzaXplX3QgYnl0ZXNfdXNlZDsJCS8qIGhvdyBtYW55IGJ5dGVzIGFscmVhZHkgdXNlZCB3aXRoaW4gcG9vbCAqLwogICBzaXplX3QgYnl0ZXNfbGVmdDsJCS8qIGJ5dGVzIHN0aWxsIGF2YWlsYWJsZSBpbiB0aGlzIHBvb2wgKi8KLSAgY2hhciBkdW1teVtBTElHTl9TSVpFLTFdOwogfSBsYXJnZV9wb29sX2hkcjsKIAotCiAvKgogICogSGVyZSBpcyB0aGUgZnVsbCBkZWZpbml0aW9uIG9mIGEgbWVtb3J5IG1hbmFnZXIgb2JqZWN0LgogICovCkBAIC0yMjEsNiArMjI1LDEwIEBACiAgKiBhbmQgd2UgYWxzbyBkaXN0aW5ndWlzaCB0aGUgZmlyc3QgcG9vbCBvZiBhIGNsYXNzIGZyb20gbGF0ZXIgb25lcy4KICAqIE5PVEU6IHRoZSB2YWx1ZXMgZ2l2ZW4gd29yayBmYWlybHkgd2VsbCBvbiBib3RoIDE2LSBhbmQgMzItYml0LWludAogICogbWFjaGluZXMsIGJ1dCBtYXkgYmUgdG9vIHNtYWxsIGlmIGxvbmdzIGFyZSA2NCBiaXRzIG9yIG1vcmUuCisgKgorICogU2luY2Ugd2UgZG8gbm90IGtub3cgd2hhdCBhbGlnbm1lbnQgbWFsbG9jKCkgZ2l2ZXMgdXMsIHdlIGhhdmUgdG8KKyAqIGFsbG9jYXRlIEFMSUdOX1NJWkUtMSBleHRyYSBzcGFjZSBwZXIgcG9vbCB0byBoYXZlIHJvb20gZm9yIGFsaWdubWVudAorICogYWRqdXN0bWVudC4KICAqLwogCiBzdGF0aWMgY29uc3Qgc2l6ZV90IGZpcnN0X3Bvb2xfc2xvcFtKUE9PTF9OVU1QT09MU10gPSAKQEAgLTI0NSwxNyArMjUzLDIwIEBACiAgIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07CiAgIHNtYWxsX3Bvb2xfcHRyIGhkcl9wdHIsIHByZXZfaGRyX3B0cjsKICAgY2hhciAqIGRhdGFfcHRyOwotICBzaXplX3Qgb2RkX2J5dGVzLCBtaW5fcmVxdWVzdCwgc2xvcDsKKyAgc2l6ZV90IG1pbl9yZXF1ZXN0LCBzbG9wOworCisgIC8qCisgICAqIFJvdW5kIHVwIHRoZSByZXF1ZXN0ZWQgc2l6ZSB0byBhIG11bHRpcGxlIG9mIEFMSUdOX1NJWkUgaW4gb3JkZXIKKyAgICogdG8gYXNzdXJlIGFsaWdubWVudCBmb3IgdGhlIG5leHQgb2JqZWN0IGFsbG9jYXRlZCBpbiB0aGUgc2FtZSBwb29sCisgICAqIGFuZCBzbyB0aGF0IGFsZ29yaXRobXMgY2FuIHN0cmFkZGxlIG91dHNpZGUgdGhlIHByb3BlciBhcmVhIHVwCisgICAqIHRvIHRoZSBuZXh0IGFsaWdubWVudC4KKyAgICovCisgIHNpemVvZm9iamVjdCA9IGpyb3VuZF91cChzaXplb2ZvYmplY3QsIEFMSUdOX1NJWkUpOwogCiAgIC8qIENoZWNrIGZvciB1bnNhdGlzZmlhYmxlIHJlcXVlc3QgKGRvIG5vdyB0byBlbnN1cmUgbm8gb3ZlcmZsb3cgYmVsb3cpICovCi0gIGlmIChzaXplb2ZvYmplY3QgPiAoc2l6ZV90KSAoTUFYX0FMTE9DX0NIVU5LLVNJWkVPRihzbWFsbF9wb29sX2hkcikpKQorICBpZiAoKFNJWkVPRihzbWFsbF9wb29sX2hkcikgKyBzaXplb2ZvYmplY3QgKyBBTElHTl9TSVpFIC0gMSkgPiBNQVhfQUxMT0NfQ0hVTkspCiAgICAgb3V0X29mX21lbW9yeShjaW5mbywgMSk7CS8qIHJlcXVlc3QgZXhjZWVkcyBtYWxsb2MncyBhYmlsaXR5ICovCiAKLSAgLyogUm91bmQgdXAgdGhlIHJlcXVlc3RlZCBzaXplIHRvIGEgbXVsdGlwbGUgb2YgQUxJR05fU0laRSAqLwotICBvZGRfYnl0ZXMgPSBzaXplb2ZvYmplY3QgJSBBTElHTl9TSVpFOwotICBpZiAob2RkX2J5dGVzID4gMCkKLSAgICBzaXplb2ZvYmplY3QgKz0gQUxJR05fU0laRSAtIG9kZF9ieXRlczsKLQogICAvKiBTZWUgaWYgc3BhY2UgaXMgYXZhaWxhYmxlIGluIGFueSBleGlzdGluZyBwb29sICovCiAgIGlmIChwb29sX2lkIDwgMCB8fCBwb29sX2lkID49IEpQT09MX05VTVBPT0xTKQogICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QT09MX0lELCBwb29sX2lkKTsJLyogc2FmZXR5IGNoZWNrICovCkBAIC0yNzEsNyArMjgyLDcgQEAKICAgLyogVGltZSB0byBtYWtlIGEgbmV3IHBvb2w/ICovCiAgIGlmIChoZHJfcHRyID09IE5VTEwpIHsKICAgICAvKiBtaW5fcmVxdWVzdCBpcyB3aGF0IHdlIG5lZWQgbm93LCBzbG9wIGlzIHdoYXQgd2lsbCBiZSBsZWZ0b3ZlciAqLwotICAgIG1pbl9yZXF1ZXN0ID0gc2l6ZW9mb2JqZWN0ICsgU0laRU9GKHNtYWxsX3Bvb2xfaGRyKTsKKyAgICBtaW5fcmVxdWVzdCA9IFNJWkVPRihzbWFsbF9wb29sX2hkcikgKyBzaXplb2ZvYmplY3QgKyBBTElHTl9TSVpFIC0gMTsKICAgICBpZiAocHJldl9oZHJfcHRyID09IE5VTEwpCS8qIGZpcnN0IHBvb2wgaW4gY2xhc3M/ICovCiAgICAgICBzbG9wID0gZmlyc3RfcG9vbF9zbG9wW3Bvb2xfaWRdOwogICAgIGVsc2UKQEAgLTMwMCw3ICszMTEsMTAgQEAKICAgfQogCiAgIC8qIE9LLCBhbGxvY2F0ZSB0aGUgb2JqZWN0IGZyb20gdGhlIGN1cnJlbnQgcG9vbCAqLwotICBkYXRhX3B0ciA9IChjaGFyICopICgoc2l6ZV90KSAoaGRyX3B0ciArIDEpICYgLUFMSUdOX1NJWkUpOworICBkYXRhX3B0ciA9IChjaGFyICopIGhkcl9wdHI7IC8qIHBvaW50IHRvIGZpcnN0IGRhdGEgYnl0ZSBpbiBwb29sLi4uICovCisgIGRhdGFfcHRyICs9IFNJWkVPRihzbWFsbF9wb29sX2hkcik7IC8qIC4uLmJ5IHNraXBwaW5nIHRoZSBoZWFkZXIuLi4gKi8KKyAgaWYgKCh1bnNpZ25lZCBsb25nKWRhdGFfcHRyICUgQUxJR05fU0laRSkgLyogLi4uYW5kIGFkanVzdCBmb3IgYWxpZ25tZW50ICovCisgICAgZGF0YV9wdHIgKz0gQUxJR05fU0laRSAtICh1bnNpZ25lZCBsb25nKWRhdGFfcHRyICUgQUxJR05fU0laRTsKICAgZGF0YV9wdHIgKz0gaGRyX3B0ci0+Ynl0ZXNfdXNlZDsgLyogcG9pbnQgdG8gcGxhY2UgZm9yIG9iamVjdCAqLwogICBoZHJfcHRyLT5ieXRlc191c2VkICs9IHNpemVvZm9iamVjdDsKICAgaGRyX3B0ci0+Ynl0ZXNfbGVmdCAtPSBzaXplb2ZvYmplY3Q7CkBAIC0zMjksMjYgKzM0MywyOSBAQAogewogICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOwogICBsYXJnZV9wb29sX3B0ciBoZHJfcHRyOwotICBzaXplX3Qgb2RkX2J5dGVzOworICBjaGFyIEZBUiAqIGRhdGFfcHRyOworCisgIC8qCisgICAqIFJvdW5kIHVwIHRoZSByZXF1ZXN0ZWQgc2l6ZSB0byBhIG11bHRpcGxlIG9mIEFMSUdOX1NJWkUgc28gdGhhdAorICAgKiBhbGdvcml0aG1zIGNhbiBzdHJhZGRsZSBvdXRzaWRlIHRoZSBwcm9wZXIgYXJlYSB1cCB0byB0aGUgbmV4dAorICAgKiBhbGlnbm1lbnQuCisgICAqLworICBzaXplb2ZvYmplY3QgPSBqcm91bmRfdXAoc2l6ZW9mb2JqZWN0LCBBTElHTl9TSVpFKTsKIAogICAvKiBDaGVjayBmb3IgdW5zYXRpc2ZpYWJsZSByZXF1ZXN0IChkbyBub3cgdG8gZW5zdXJlIG5vIG92ZXJmbG93IGJlbG93KSAqLwotICBpZiAoc2l6ZW9mb2JqZWN0ID4gKHNpemVfdCkgKE1BWF9BTExPQ19DSFVOSy1TSVpFT0YobGFyZ2VfcG9vbF9oZHIpKSkKKyAgaWYgKChTSVpFT0YobGFyZ2VfcG9vbF9oZHIpICsgc2l6ZW9mb2JqZWN0ICsgQUxJR05fU0laRSAtIDEpID4gTUFYX0FMTE9DX0NIVU5LKQogICAgIG91dF9vZl9tZW1vcnkoY2luZm8sIDMpOwkvKiByZXF1ZXN0IGV4Y2VlZHMgbWFsbG9jJ3MgYWJpbGl0eSAqLwogCi0gIC8qIFJvdW5kIHVwIHRoZSByZXF1ZXN0ZWQgc2l6ZSB0byBhIG11bHRpcGxlIG9mIEFMSUdOX1NJWkUgKi8KLSAgb2RkX2J5dGVzID0gc2l6ZW9mb2JqZWN0ICUgQUxJR05fU0laRTsKLSAgaWYgKG9kZF9ieXRlcyA+IDApCi0gICAgc2l6ZW9mb2JqZWN0ICs9IEFMSUdOX1NJWkUgLSBvZGRfYnl0ZXM7Ci0KICAgLyogQWx3YXlzIG1ha2UgYSBuZXcgcG9vbCAqLwogICBpZiAocG9vbF9pZCA8IDAgfHwgcG9vbF9pZCA+PSBKUE9PTF9OVU1QT09MUykKICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUE9PTF9JRCwgcG9vbF9pZCk7CS8qIHNhZmV0eSBjaGVjayAqLwogCiAgIGhkcl9wdHIgPSAobGFyZ2VfcG9vbF9wdHIpIGpwZWdfZ2V0X2xhcmdlKGNpbmZvLCBzaXplb2ZvYmplY3QgKwotCQkJCQkgICAgU0laRU9GKGxhcmdlX3Bvb2xfaGRyKSk7CisJCQkJCSAgICBTSVpFT0YobGFyZ2VfcG9vbF9oZHIpICsKKwkJCQkJICAgIEFMSUdOX1NJWkUgLSAxKTsKICAgaWYgKGhkcl9wdHIgPT0gTlVMTCkKICAgICBvdXRfb2ZfbWVtb3J5KGNpbmZvLCA0KTsJLyoganBlZ19nZXRfbGFyZ2UgZmFpbGVkICovCi0gIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkICs9IHNpemVvZm9iamVjdCArIFNJWkVPRihsYXJnZV9wb29sX2hkcik7CisgIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkICs9IHNpemVvZm9iamVjdCArIFNJWkVPRihsYXJnZV9wb29sX2hkcikgKyBBTElHTl9TSVpFIC0gMTsKIAogICAvKiBTdWNjZXNzLCBpbml0aWFsaXplIHRoZSBuZXcgcG9vbCBoZWFkZXIgYW5kIGFkZCB0byBsaXN0ICovCiAgIGhkcl9wdHItPm5leHQgPSBtZW0tPmxhcmdlX2xpc3RbcG9vbF9pZF07CkBAIC0zNTksNyArMzc2LDEyIEBACiAgIGhkcl9wdHItPmJ5dGVzX2xlZnQgPSAwOwogICBtZW0tPmxhcmdlX2xpc3RbcG9vbF9pZF0gPSBoZHJfcHRyOwogCi0gIHJldHVybiAodm9pZCBGQVIgKikgKChzaXplX3QpIChoZHJfcHRyICsgMSkgJiAtQUxJR05fU0laRSk7CisgIGRhdGFfcHRyID0gKGNoYXIgKikgaGRyX3B0cjsgLyogcG9pbnQgdG8gZmlyc3QgZGF0YSBieXRlIGluIHBvb2wuLi4gKi8KKyAgZGF0YV9wdHIgKz0gU0laRU9GKHNtYWxsX3Bvb2xfaGRyKTsgLyogLi4uYnkgc2tpcHBpbmcgdGhlIGhlYWRlci4uLiAqLworICBpZiAoKHVuc2lnbmVkIGxvbmcpZGF0YV9wdHIgJSBBTElHTl9TSVpFKSAvKiAuLi5hbmQgYWRqdXN0IGZvciBhbGlnbm1lbnQgKi8KKyAgICBkYXRhX3B0ciArPSBBTElHTl9TSVpFIC0gKHVuc2lnbmVkIGxvbmcpZGF0YV9wdHIgJSBBTElHTl9TSVpFOworCisgIHJldHVybiAodm9pZCBGQVIgKikgZGF0YV9wdHI7CiB9CiAKIApAQCAtMzc0LDYgKzM5NiwxMCBAQAogICogdGhpcyBjaHVua2luZyBvZiByb3dzLiAgVGhlIHJvd3NwZXJjaHVuayB2YWx1ZSBpcyBsZWZ0IGluIHRoZSBtZW0gbWFuYWdlcgogICogb2JqZWN0IHNvIHRoYXQgaXQgY2FuIGJlIHNhdmVkIGF3YXkgaWYgdGhpcyBzYXJyYXkgaXMgdGhlIHdvcmtzcGFjZSBmb3IKICAqIGEgdmlydHVhbCBhcnJheS4KKyAqCisgKiBTaW5jZSB3ZSBhcmUgb2Z0ZW4gdXBzYW1wbGluZyB3aXRoIGEgZmFjdG9yIDIsIHdlIGFsaWduIHRoZSBzaXplIChub3QKKyAqIHRoZSBzdGFydCkgdG8gMiAqIEFMSUdOX1NJWkUgc28gdGhhdCB0aGUgdXBzYW1wbGluZyByb3V0aW5lcyBkb24ndCBoYXZlCisgKiB0byBiZSBhcyBjYXJlZnVsIGFib3V0IHNpemUuCiAgKi8KIAogTUVUSE9EREVGKEpTQU1QQVJSQVkpCkBAIC0zODYsMTIgKzQxMiwxMSBAQAogICBKU0FNUFJPVyB3b3Jrc3BhY2U7CiAgIEpESU1FTlNJT04gcm93c3BlcmNodW5rLCBjdXJyb3csIGk7CiAgIGxvbmcgbHRlbXA7Ci0gIEpESU1FTlNJT04gb2RkX3NhbXBsZXM7CiAKLSAgLyogUm91bmQgdXAgdGhlIHJvdyBieXRlcyB0byBhIG11bHRpcGxlIG9mIEFMSUdOX1NJWkUgKi8KLSAgb2RkX3NhbXBsZXMgPSBzYW1wbGVzcGVycm93ICUgKEFMSUdOX1NJWkUgLyBTSVpFT0YoSlNBTVBMRSkpOwotICBpZiAob2RkX3NhbXBsZXMgPiAwKQotICAgIHNhbXBsZXNwZXJyb3cgKz0gKEFMSUdOX1NJWkUgLyBTSVpFT0YoSlNBTVBMRSkpIC0gb2RkX3NhbXBsZXM7CisgIC8qIE1ha2Ugc3VyZSBlYWNoIHJvdyBpcyBwcm9wZXJseSBhbGlnbmVkICovCisgIGlmICgoQUxJR05fU0laRSAlIFNJWkVPRihKU0FNUExFKSkgIT0gMCkKKyAgICBvdXRfb2ZfbWVtb3J5KGNpbmZvLCA1KTsJLyogc2FmZXR5IGNoZWNrICovCisgIHNhbXBsZXNwZXJyb3cgPSBqcm91bmRfdXAoc2FtcGxlc3BlcnJvdywgKDIgKiBBTElHTl9TSVpFKSAvIFNJWkVPRihKU0FNUExFKSk7CiAKICAgLyogQ2FsY3VsYXRlIG1heCAjIG9mIHJvd3MgYWxsb3dlZCBpbiBvbmUgYWxsb2NhdGlvbiBjaHVuayAqLwogICBsdGVtcCA9IChNQVhfQUxMT0NfQ0hVTkstU0laRU9GKGxhcmdlX3Bvb2xfaGRyKSkgLwpAQCAtNDQxLDYgKzQ2NiwxMCBAQAogICBKRElNRU5TSU9OIHJvd3NwZXJjaHVuaywgY3Vycm93LCBpOwogICBsb25nIGx0ZW1wOwogCisgIC8qIE1ha2Ugc3VyZSBlYWNoIHJvdyBpcyBwcm9wZXJseSBhbGlnbmVkICovCisgIGlmICgoU0laRU9GKEpCTE9DSykgJSBBTElHTl9TSVpFKSAhPSAwKQorICAgIG91dF9vZl9tZW1vcnkoY2luZm8sIDYpOwkvKiBzYWZldHkgY2hlY2sgKi8KKwogICAvKiBDYWxjdWxhdGUgbWF4ICMgb2Ygcm93cyBhbGxvd2VkIGluIG9uZSBhbGxvY2F0aW9uIGNodW5rICovCiAgIGx0ZW1wID0gKE1BWF9BTExPQ19DSFVOSy1TSVpFT0YobGFyZ2VfcG9vbF9oZHIpKSAvCiAJICAoKGxvbmcpIGJsb2Nrc3BlcnJvdyAqIFNJWkVPRihKQkxPQ0spKTsKQEAgLTEwMjYsNyArMTA1NSw3IEBACiAgIGNpbmZvLT5tZW0gPSBOVUxMOwkJLyogZm9yIHNhZmV0eSBpZiBpbml0IGZhaWxzICovCiAKICAgLyogQ2hlY2sgZm9yIGNvbmZpZ3VyYXRpb24gZXJyb3JzLgotICAgKiBBTElHTl9TSVpFIHNob3VsZCBiZSBhIHBvd2VyIG9mIDI7IG90aGVyd2lzZSwgaXQgcHJvYmFibHkKKyAgICogU0laRU9GKEFMSUdOX1RZUEUpIHNob3VsZCBiZSBhIHBvd2VyIG9mIDI7IG90aGVyd2lzZSwgaXQgcHJvYmFibHkKICAgICogZG9lc24ndCByZWZsZWN0IGFueSByZWFsIGhhcmR3YXJlIGFsaWdubWVudCByZXF1aXJlbWVudC4KICAgICogVGhlIHRlc3QgaXMgYSBsaXR0bGUgdHJpY2t5OiBmb3IgWD4wLCBYIGFuZCBYLTEgaGF2ZSBubyBvbmUtYml0cwogICAgKiBpbiBjb21tb24gaWYgYW5kIG9ubHkgaWYgWCBpcyBhIHBvd2VyIG9mIDIsIGllIGhhcyBvbmx5IG9uZSBvbmUtYml0LgpkaWZmIC0tZ2l0IGEvam1lbW5hbWUuYyBiL2ptZW1uYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOTZkZWUuLjAwMDAwMDAKLS0tIGEvam1lbW5hbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKgotICogam1lbW5hbWUuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIHByb3ZpZGVzIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3lzdGVtLWRlcGVuZGVudAotICogcG9ydGlvbiBvZiB0aGUgSlBFRyBtZW1vcnkgbWFuYWdlci4gIFRoaXMgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0Ci0gKiB5b3UgbXVzdCBleHBsaWNpdGx5IGNvbnN0cnVjdCBhIG5hbWUgZm9yIGVhY2ggdGVtcCBmaWxlLgotICogQWxzbywgdGhlIHByb2JsZW0gb2YgZGV0ZXJtaW5pbmcgdGhlIGFtb3VudCBvZiBtZW1vcnkgYXZhaWxhYmxlCi0gKiBpcyBzaG92ZWQgb250byB0aGUgdXNlci4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiam1lbXN5cy5oIgkJLyogaW1wb3J0IHRoZSBzeXN0ZW0tZGVwZW5kZW50IGRlY2xhcmF0aW9ucyAqLwotCi0jaWZuZGVmIEhBVkVfU1RETElCX0gJCS8qIDxzdGRsaWIuaD4gc2hvdWxkIGRlY2xhcmUgbWFsbG9jKCksZnJlZSgpICovCi1leHRlcm4gdm9pZCAqIG1hbGxvYyBKUFAoKHNpemVfdCBzaXplKSk7Ci1leHRlcm4gdm9pZCBmcmVlIEpQUCgodm9pZCAqcHRyKSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBTRUVLX1NFVAkJLyogcHJlLUFOU0kgc3lzdGVtcyBtYXkgbm90IGRlZmluZSB0aGlzOyAqLwotI2RlZmluZSBTRUVLX1NFVCAgMAkJLyogaWYgbm90LCBhc3N1bWUgMCBpcyBjb3JyZWN0ICovCi0jZW5kaWYKLQotI2lmZGVmIERPTlRfVVNFX0JfTU9ERQkJLyogZGVmaW5lIG1vZGUgcGFyYW1ldGVycyBmb3IgZm9wZW4oKSAqLwotI2RlZmluZSBSRUFEX0JJTkFSWQkiciIKLSNkZWZpbmUgUldfQklOQVJZCSJ3KyIKLSNlbHNlCi0jaWZkZWYgVk1TCQkJLyogVk1TIGlzIHZlcnkgbm9uc3RhbmRhcmQgKi8KLSNkZWZpbmUgUkVBRF9CSU5BUlkJInJiIiwgImN0eD1zdG0iCi0jZGVmaW5lIFJXX0JJTkFSWQkidytiIiwgImN0eD1zdG0iCi0jZWxzZQkJCQkvKiBzdGFuZGFyZCBBTlNJLWNvbXBsaWFudCBjYXNlICovCi0jZGVmaW5lIFJFQURfQklOQVJZCSJyYiIKLSNkZWZpbmUgUldfQklOQVJZCSJ3K2IiCi0jZW5kaWYKLSNlbmRpZgotCi0KLS8qCi0gKiBTZWxlY3Rpb24gb2YgYSBmaWxlIG5hbWUgZm9yIGEgdGVtcG9yYXJ5IGZpbGUuCi0gKiBUaGlzIGlzIHN5c3RlbS1kZXBlbmRlbnQhCi0gKgotICogVGhlIGNvZGUgYXMgZ2l2ZW4gaXMgc3VpdGFibGUgZm9yIG1vc3QgVW5peCBzeXN0ZW1zLCBhbmQgaXQgaXMgZWFzaWx5Ci0gKiBtb2RpZmllZCBmb3IgbW9zdCBub24tVW5peCBzeXN0ZW1zLiAgU29tZSBub3RlczoKLSAqICAxLiAgVGhlIHRlbXAgZmlsZSBpcyBjcmVhdGVkIGluIHRoZSBkaXJlY3RvcnkgbmFtZWQgYnkgVEVNUF9ESVJFQ1RPUlkuCi0gKiAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIC91c3IvdG1wLCB3aGljaCBpcyB0aGUgY29udmVudGlvbmFsIHBsYWNlIGZvcgotICogICAgICBjcmVhdGluZyBsYXJnZSB0ZW1wIGZpbGVzIG9uIFVuaXguICBPbiBvdGhlciBzeXN0ZW1zIHlvdSdsbCBwcm9iYWJseQotICogICAgICB3YW50IHRvIGNoYW5nZSB0aGUgZmlsZSBsb2NhdGlvbi4gIFlvdSBjYW4gZG8gdGhpcyBieSBlZGl0aW5nIHRoZQotICogICAgICAjZGVmaW5lLCBvciAocHJlZmVycmVkKSBieSBkZWZpbmluZyBURU1QX0RJUkVDVE9SWSBpbiBqY29uZmlnLmguCi0gKgotICogIDIuICBJZiB5b3UgbmVlZCB0byBjaGFuZ2UgdGhlIGZpbGUgbmFtZSBhcyB3ZWxsIGFzIGl0cyBsb2NhdGlvbiwKLSAqICAgICAgeW91IGNhbiBvdmVycmlkZSB0aGUgVEVNUF9GSUxFX05BTUUgbWFjcm8uICAoTm90ZSB0aGF0IHRoaXMgaXMKLSAqICAgICAgYWN0dWFsbHkgYSBwcmludGYgZm9ybWF0IHN0cmluZzsgaXQgbXVzdCBjb250YWluICVzIGFuZCAlZC4pCi0gKiAgICAgIEZldyBwZW9wbGUgc2hvdWxkIG5lZWQgdG8gZG8gdGhpcy4KLSAqCi0gKiAgMy4gIG1rdGVtcCgpIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgbXVsdGlwbGUgcHJvY2Vzc2VzIHJ1bm5pbmcKLSAqICAgICAgc2ltdWx0YW5lb3VzbHkgd29uJ3Qgc2VsZWN0IHRoZSBzYW1lIGZpbGUgbmFtZXMuICBJZiB5b3VyIHN5c3RlbQotICogICAgICBkb2Vzbid0IGhhdmUgbWt0ZW1wKCksIGRlZmluZSBOT19NS1RFTVAgdG8gZG8gaXQgdGhlIGhhcmQgd2F5LgotICogICAgICAoSWYgeW91IGRvbid0IGhhdmUgPGVycm5vLmg+LCBhbHNvIGRlZmluZSBOT19FUlJOT19ILikKLSAqCi0gKiAgNC4gIFlvdSBwcm9iYWJseSB3YW50IHRvIGRlZmluZSBORUVEX1NJR05BTF9DQVRDSEVSIHNvIHRoYXQgY2pwZWcuYy9kanBlZy5jCi0gKiAgICAgIHdpbGwgY2F1c2UgdGhlIHRlbXAgZmlsZXMgdG8gYmUgcmVtb3ZlZCBpZiB5b3Ugc3RvcCB0aGUgcHJvZ3JhbSBlYXJseS4KLSAqLwotCi0jaWZuZGVmIFRFTVBfRElSRUNUT1JZCQkvKiBjYW4gb3ZlcnJpZGUgZnJvbSBqY29uZmlnLmggb3IgTWFrZWZpbGUgKi8KLSNkZWZpbmUgVEVNUF9ESVJFQ1RPUlkgICIvdXNyL3RtcC8iIC8qIHJlY29tbWVuZGVkIHNldHRpbmcgZm9yIFVuaXggKi8KLSNlbmRpZgotCi1zdGF0aWMgaW50IG5leHRfZmlsZV9udW07CS8qIHRvIGRpc3Rpbmd1aXNoIGFtb25nIHNldmVyYWwgdGVtcCBmaWxlcyAqLwotCi0jaWZkZWYgTk9fTUtURU1QCi0KLSNpZm5kZWYgVEVNUF9GSUxFX05BTUUJCS8qIGNhbiBvdmVycmlkZSBmcm9tIGpjb25maWcuaCBvciBNYWtlZmlsZSAqLwotI2RlZmluZSBURU1QX0ZJTEVfTkFNRSAgIiVzSlBHJTAzZC5UTVAiCi0jZW5kaWYKLQotI2lmbmRlZiBOT19FUlJOT19ICi0jaW5jbHVkZSA8ZXJybm8uaD4JCS8qIHRvIGRlZmluZSBFTk9FTlQgKi8KLSNlbmRpZgotCi0vKiBBTlNJIEMgc3BlY2lmaWVzIHRoYXQgZXJybm8gaXMgYSBtYWNybywgYnV0IG9uIG9sZGVyIHN5c3RlbXMgaXQncyBtb3JlCi0gKiBsaWtlbHkgdG8gYmUgYSBwbGFpbiBpbnQgdmFyaWFibGUuICBBbmQgbm90IGFsbCB2ZXJzaW9ucyBvZiBlcnJuby5oCi0gKiBib3RoZXIgdG8gZGVjbGFyZSBpdCwgc28gd2UgaGF2ZSB0byBpbiBvcmRlciB0byBiZSBtb3N0IHBvcnRhYmxlLiAgVGh1czoKLSAqLwotI2lmbmRlZiBlcnJubwotZXh0ZXJuIGludCBlcnJubzsKLSNlbmRpZgotCi0KLUxPQ0FMKHZvaWQpCi1zZWxlY3RfZmlsZV9uYW1lIChjaGFyICogZm5hbWUpCi17Ci0gIEZJTEUgKiB0ZmlsZTsKLQotICAvKiBLZWVwIGdlbmVyYXRpbmcgZmlsZSBuYW1lcyB0aWxsIHdlIGZpbmQgb25lIHRoYXQncyBub3QgaW4gdXNlICovCi0gIGZvciAoOzspIHsKLSAgICBuZXh0X2ZpbGVfbnVtKys7CQkvKiBhZHZhbmNlIGNvdW50ZXIgKi8KLSAgICBzcHJpbnRmKGZuYW1lLCBURU1QX0ZJTEVfTkFNRSwgVEVNUF9ESVJFQ1RPUlksIG5leHRfZmlsZV9udW0pOwotICAgIGlmICgodGZpbGUgPSBmb3BlbihmbmFtZSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKSB7Ci0gICAgICAvKiBmb3BlbiBjb3VsZCBoYXZlIGZhaWxlZCBmb3IgYSByZWFzb24gb3RoZXIgdGhhbiB0aGUgZmlsZSBub3QKLSAgICAgICAqIGJlaW5nIHRoZXJlOyBmb3IgZXhhbXBsZSwgZmlsZSB0aGVyZSBidXQgdW5yZWFkYWJsZS4KLSAgICAgICAqIElmIDxlcnJuby5oPiBpc24ndCBhdmFpbGFibGUsIHRoZW4gd2UgY2Fubm90IHRlc3QgdGhlIGNhdXNlLgotICAgICAgICovCi0jaWZkZWYgRU5PRU5UCi0gICAgICBpZiAoZXJybm8gIT0gRU5PRU5UKQotCWNvbnRpbnVlOwotI2VuZGlmCi0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZmNsb3NlKHRmaWxlKTsJCS8qIG9vcHMsIGl0J3MgdGhlcmU7IGNsb3NlIHRmaWxlICYgdHJ5IGFnYWluICovCi0gIH0KLX0KLQotI2Vsc2UgLyogISBOT19NS1RFTVAgKi8KLQotLyogTm90ZSB0aGF0IG1rdGVtcCgpIHJlcXVpcmVzIHRoZSBpbml0aWFsIGZpbGVuYW1lIHRvIGVuZCBpbiBzaXggWCdzICovCi0jaWZuZGVmIFRFTVBfRklMRV9OQU1FCQkvKiBjYW4gb3ZlcnJpZGUgZnJvbSBqY29uZmlnLmggb3IgTWFrZWZpbGUgKi8KLSNkZWZpbmUgVEVNUF9GSUxFX05BTUUgICIlc0pQRyVkWFhYWFhYIgotI2VuZGlmCi0KLUxPQ0FMKHZvaWQpCi1zZWxlY3RfZmlsZV9uYW1lIChjaGFyICogZm5hbWUpCi17Ci0gIG5leHRfZmlsZV9udW0rKzsJCS8qIGFkdmFuY2UgY291bnRlciAqLwotICBzcHJpbnRmKGZuYW1lLCBURU1QX0ZJTEVfTkFNRSwgVEVNUF9ESVJFQ1RPUlksIG5leHRfZmlsZV9udW0pOwotICBta3RlbXAoZm5hbWUpOwkJLyogbWFrZSBzdXJlIGZpbGUgbmFtZSBpcyB1bmlxdWUgKi8KLSAgLyogbWt0ZW1wIHJlcGxhY2VzIHRoZSB0cmFpbGluZyBYWFhYWFggd2l0aCBhIHVuaXF1ZSBzdHJpbmcgb2YgY2hhcmFjdGVycyAqLwotfQotCi0jZW5kaWYgLyogTk9fTUtURU1QICovCi0KLQotLyoKLSAqIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlaW5nIGFyZSBjb250cm9sbGVkIGJ5IHRoZSByZWd1bGFyIGxpYnJhcnkKLSAqIHJvdXRpbmVzIG1hbGxvYygpIGFuZCBmcmVlKCkuCi0gKi8KLQotR0xPQkFMKHZvaWQgKikKLWpwZWdfZ2V0X3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIHJldHVybiAodm9pZCAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2ZyZWVfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgZnJlZShvYmplY3QpOwotfQotCi0KLS8qCi0gKiAiTGFyZ2UiIG9iamVjdHMgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgInNtYWxsIiBvbmVzLgotICogTkI6IGFsdGhvdWdoIHdlIGluY2x1ZGUgRkFSIGtleXdvcmRzIGluIHRoZSByb3V0aW5lIGRlY2xhcmF0aW9ucywKLSAqIHRoaXMgZmlsZSB3b24ndCBhY3R1YWxseSB3b3JrIGluIDgweDg2IHNtYWxsL21lZGl1bSBtb2RlbDsgYXQgbGVhc3QsCi0gKiB5b3UgcHJvYmFibHkgd29uJ3QgYmUgYWJsZSB0byBwcm9jZXNzIHVzZWZ1bC1zaXplIGltYWdlcyBpbiBvbmx5IDY0S0IuCi0gKi8KLQotR0xPQkFMKHZvaWQgRkFSICopCi1qcGVnX2dldF9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICByZXR1cm4gKHZvaWQgRkFSICopIG1hbGxvYyhzaXplb2ZvYmplY3QpOwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfZnJlZV9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgZnJlZShvYmplY3QpOwotfQotCi0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIG1lbW9yeSBzcGFjZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24uCi0gKiBJdCdzIGltcG9zc2libGUgdG8gZG8gdGhpcyBpbiBhIHBvcnRhYmxlIHdheTsgb3VyIGN1cnJlbnQgc29sdXRpb24gaXMKLSAqIHRvIG1ha2UgdGhlIHVzZXIgdGVsbCB1cyAod2l0aCBhIGRlZmF1bHQgdmFsdWUgc2V0IGF0IGNvbXBpbGUgdGltZSkuCi0gKiBJZiB5b3UgY2FuIGFjdHVhbGx5IGdldCB0aGUgYXZhaWxhYmxlIHNwYWNlLCBpdCdzIGEgZ29vZCBpZGVhIHRvIHN1YnRyYWN0Ci0gKiBhIHNsb3AgZmFjdG9yIG9mIDUlIG9yIHNvLgotICovCi0KLSNpZm5kZWYgREVGQVVMVF9NQVhfTUVNCQkvKiBzbyBjYW4gb3ZlcnJpZGUgZnJvbSBtYWtlZmlsZSAqLwotI2RlZmluZSBERUZBVUxUX01BWF9NRU0JCTEwMDAwMDBMIC8qIGRlZmF1bHQ6IG9uZSBtZWdhYnl0ZSAqLwotI2VuZGlmCi0KLUdMT0JBTChsb25nKQotanBlZ19tZW1fYXZhaWxhYmxlIChqX2NvbW1vbl9wdHIgY2luZm8sIGxvbmcgbWluX2J5dGVzX25lZWRlZCwKLQkJICAgIGxvbmcgbWF4X2J5dGVzX25lZWRlZCwgbG9uZyBhbHJlYWR5X2FsbG9jYXRlZCkKLXsKLSAgcmV0dXJuIGNpbmZvLT5tZW0tPm1heF9tZW1vcnlfdG9fdXNlIC0gYWxyZWFkeV9hbGxvY2F0ZWQ7Ci19Ci0KLQotLyoKLSAqIEJhY2tpbmcgc3RvcmUgKHRlbXBvcmFyeSBmaWxlKSBtYW5hZ2VtZW50LgotICogQmFja2luZyBzdG9yZSBvYmplY3RzIGFyZSBvbmx5IHVzZWQgd2hlbiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKLSAqIGpwZWdfbWVtX2F2YWlsYWJsZSBpcyBsZXNzIHRoYW4gdGhlIHRvdGFsIHNwYWNlIG5lZWRlZC4gIFlvdSBjYW4gZGlzcGVuc2UKLSAqIHdpdGggdGhlc2Ugcm91dGluZXMgaWYgeW91IGhhdmUgcGxlbnR5IG9mIHZpcnR1YWwgbWVtb3J5OyBzZWUgam1lbW5vYnMuYy4KLSAqLwotCi0KLU1FVEhPRERFRih2b2lkKQotcmVhZF9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCSAgICB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAotCQkgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQotewotICBpZiAoZnNlZWsoaW5mby0+dGVtcF9maWxlLCBmaWxlX29mZnNldCwgU0VFS19TRVQpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfU0VFSyk7Ci0gIGlmIChKRlJFQUQoaW5mby0+dGVtcF9maWxlLCBidWZmZXJfYWRkcmVzcywgYnl0ZV9jb3VudCkKLSAgICAgICE9IChzaXplX3QpIGJ5dGVfY291bnQpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9SRUFEKTsKLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLXdyaXRlX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJICAgICB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAotCQkgICAgIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKLXsKLSAgaWYgKGZzZWVrKGluZm8tPnRlbXBfZmlsZSwgZmlsZV9vZmZzZXQsIFNFRUtfU0VUKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1NFRUspOwotICBpZiAoSkZXUklURShpbmZvLT50ZW1wX2ZpbGUsIGJ1ZmZlcl9hZGRyZXNzLCBieXRlX2NvdW50KQotICAgICAgIT0gKHNpemVfdCkgYnl0ZV9jb3VudCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1dSSVRFKTsKLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLWNsb3NlX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKLXsKLSAgZmNsb3NlKGluZm8tPnRlbXBfZmlsZSk7CS8qIGNsb3NlIHRoZSBmaWxlICovCi0gIHVubGluayhpbmZvLT50ZW1wX25hbWUpOwkvKiBkZWxldGUgdGhlIGZpbGUgKi8KLS8qIElmIHlvdXIgc3lzdGVtIGRvZXNuJ3QgaGF2ZSB1bmxpbmsoKSwgdXNlIHJlbW92ZSgpIGluc3RlYWQuCi0gKiByZW1vdmUoKSBpcyB0aGUgQU5TSS1zdGFuZGFyZCBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uLCBidXQgaWYKLSAqIHlvdXIgc3lzdGVtIHdhcyBBTlNJIHlvdSdkIGJlIHVzaW5nIGptZW1hbnNpLmMsIHJpZ2h0PwotICovCi0gIFRSQUNFTVNTKGNpbmZvLCAxLCBKVFJDX1RGSUxFX0NMT1NFLCBpbmZvLT50ZW1wX25hbWUpOwotfQotCi0KLS8qCi0gKiBJbml0aWFsIG9wZW5pbmcgb2YgYSBiYWNraW5nLXN0b3JlIG9iamVjdC4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfb3Blbl9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCQkgbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCi17Ci0gIHNlbGVjdF9maWxlX25hbWUoaW5mby0+dGVtcF9uYW1lKTsKLSAgaWYgKChpbmZvLT50ZW1wX2ZpbGUgPSBmb3BlbihpbmZvLT50ZW1wX25hbWUsIFJXX0JJTkFSWSkpID09IE5VTEwpCi0gICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCBpbmZvLT50ZW1wX25hbWUpOwotICBpbmZvLT5yZWFkX2JhY2tpbmdfc3RvcmUgPSByZWFkX2JhY2tpbmdfc3RvcmU7Ci0gIGluZm8tPndyaXRlX2JhY2tpbmdfc3RvcmUgPSB3cml0ZV9iYWNraW5nX3N0b3JlOwotICBpbmZvLT5jbG9zZV9iYWNraW5nX3N0b3JlID0gY2xvc2VfYmFja2luZ19zdG9yZTsKLSAgVFJBQ0VNU1MoY2luZm8sIDEsIEpUUkNfVEZJTEVfT1BFTiwgaW5mby0+dGVtcF9uYW1lKTsKLX0KLQotCi0vKgotICogVGhlc2Ugcm91dGluZXMgdGFrZSBjYXJlIG9mIGFueSBzeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uIGFuZAotICogY2xlYW51cCByZXF1aXJlZC4KLSAqLwotCi1HTE9CQUwobG9uZykKLWpwZWdfbWVtX2luaXQgKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgbmV4dF9maWxlX251bSA9IDA7CQkvKiBpbml0aWFsaXplIHRlbXAgZmlsZSBuYW1lIGdlbmVyYXRvciAqLwotICByZXR1cm4gREVGQVVMVF9NQVhfTUVNOwkvKiBkZWZhdWx0IGZvciBtYXhfbWVtb3J5X3RvX3VzZSAqLwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfbWVtX3Rlcm0gKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgLyogbm8gd29yayAqLwotfQpkaWZmIC0tZ2l0IGEvam1vcmVjZmcuaCBiL2ptb3JlY2ZnLmgKaW5kZXggYjQyNTUxOS4uMTg2NzBlYyAxMDA2NDQKLS0tIGEvam1vcmVjZmcuaAorKysgYi9qbW9yZWNmZy5oCkBAIC01LDEzICs1LDYgQEAKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi0gKiBUaGlzIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgZm9yIFNJTUQgZXh0ZW5zaW9uLgotICogTGFzdCBNb2RpZmllZCA6IE1hcmNoIDI4LCAyMDA1Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCiAgKiBUaGlzIGZpbGUgY29udGFpbnMgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBjdXN0b21pemUgdGhlCiAgKiBKUEVHIHNvZnR3YXJlIGZvciBzcGVjaWFsIGFwcGxpY2F0aW9ucyBvciBzdXBwb3J0IG1hY2hpbmUtZGVwZW5kZW50CiAgKiBvcHRpbWl6YXRpb25zLiAgTW9zdCB1c2VycyB3aWxsIG5vdCBuZWVkIHRvIHRvdWNoIHRoaXMgZmlsZS4KQEAgLTI3LDkgKzIwLDcgQEAKICAqIFdlIGRvIG5vdCBzdXBwb3J0IHJ1bi10aW1lIHNlbGVjdGlvbiBvZiBkYXRhIHByZWNpc2lvbiwgc29ycnkuCiAgKi8KIAotLyogU0lNRCBFeHQ6IFRoaXMgU0lNRCBjb2RlIG9ubHkgY29wZXMgd2l0aCA4LWJpdCBzYW1wbGUgdmFsdWVzLiAqLwotCi0jZGVmaW5lIEJJVFNfSU5fSlNBTVBMRSAgOAkvKiBTSU1EIEV4dDogY2Fubm90IGJlIGNoYW5nZWQhICovCisjZGVmaW5lIEJJVFNfSU5fSlNBTVBMRSAgOAkvKiB1c2UgOCBvciAxMiAqLwogCiAKIC8qCkBAIC03MSwxMSArNjIsMTEgQEAKICNlbHNlIC8qIG5vdCBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KIAogdHlwZWRlZiBjaGFyIEpTQU1QTEU7Ci0jaWZkZWYgQ0hBUl9JU19VTlNJR05FRAorI2lmZGVmIF9fQ0hBUl9VTlNJR05FRF9fCiAjZGVmaW5lIEdFVEpTQU1QTEUodmFsdWUpICAoKGludCkgKHZhbHVlKSkKICNlbHNlCiAjZGVmaW5lIEdFVEpTQU1QTEUodmFsdWUpICAoKGludCkgKHZhbHVlKSAmIDB4RkYpCi0jZW5kaWYgLyogQ0hBUl9JU19VTlNJR05FRCAqLworI2VuZGlmIC8qIF9fQ0hBUl9VTlNJR05FRF9fICovCiAKICNlbmRpZiAvKiBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KIApAQCAtMTIyLDExICsxMTMsMTEgQEAKICNlbHNlIC8qIG5vdCBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KIAogdHlwZWRlZiBjaGFyIEpPQ1RFVDsKLSNpZmRlZiBDSEFSX0lTX1VOU0lHTkVECisjaWZkZWYgX19DSEFSX1VOU0lHTkVEX18KICNkZWZpbmUgR0VUSk9DVEVUKHZhbHVlKSAgKHZhbHVlKQogI2Vsc2UKICNkZWZpbmUgR0VUSk9DVEVUKHZhbHVlKSAgKCh2YWx1ZSkgJiAweEZGKQotI2VuZGlmIC8qIENIQVJfSVNfVU5TSUdORUQgKi8KKyNlbmRpZiAvKiBfX0NIQVJfVU5TSUdORURfXyAqLwogCiAjZW5kaWYgLyogSEFWRV9VTlNJR05FRF9DSEFSICovCiAKQEAgLTE0MywxMSArMTM0LDExIEBACiAjaWZkZWYgSEFWRV9VTlNJR05FRF9DSEFSCiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUlOVDg7CiAjZWxzZSAvKiBub3QgSEFWRV9VTlNJR05FRF9DSEFSICovCi0jaWZkZWYgQ0hBUl9JU19VTlNJR05FRAorI2lmZGVmIF9fQ0hBUl9VTlNJR05FRF9fCiB0eXBlZGVmIGNoYXIgVUlOVDg7Ci0jZWxzZSAvKiBub3QgQ0hBUl9JU19VTlNJR05FRCAqLworI2Vsc2UgLyogbm90IF9fQ0hBUl9VTlNJR05FRF9fICovCiB0eXBlZGVmIHNob3J0IFVJTlQ4OwotI2VuZGlmIC8qIENIQVJfSVNfVU5TSUdORUQgKi8KKyNlbmRpZiAvKiBfX0NIQVJfVU5TSUdORURfXyAqLwogI2VuZGlmIC8qIEhBVkVfVU5TSUdORURfQ0hBUiAqLwogCiAvKiBVSU5UMTYgbXVzdCBob2xkIGF0IGxlYXN0IHRoZSB2YWx1ZXMgMC4uNjU1MzUuICovCkBAIC0xNjYsOCArMTU3LDcgQEAKIAogLyogSU5UMzIgbXVzdCBob2xkIGF0IGxlYXN0IHNpZ25lZCAzMi1iaXQgdmFsdWVzLiAqLwogCi0JLyogWDExL3htZC5oIGFuZCBiYXNldHNkLmggKFdpbjMyIFNESykgY29ycmVjdGx5IGRlZmluZSBJTlQzMiAqLwotI2lmICFkZWZpbmVkKFhNRF9IKSAmJiAhZGVmaW5lZChfQkFTRVRTRF9IXykgJiYgIWRlZmluZWQoX0JBU0VUU0RfSCkKKyNpZm5kZWYgWE1EX0gJCQkvKiBYMTEveG1kLmggY29ycmVjdGx5IGRlZmluZXMgSU5UMzIgKi8KIHR5cGVkZWYgbG9uZyBJTlQzMjsKICNlbmRpZgogCkBAIC0xOTAsMjQgKzE4MCwxNCBAQAogICogb3IgY29kZSBwcm9maWxlcnMgdGhhdCByZXF1aXJlIGl0LgogICovCiAKLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykgfHwgXAotICAgIGRlZmluZWQoX19XQVRDT01DX18pIHx8IGRlZmluZWQoX19NV0VSS1NfXykgfHwgXAotICAgIGRlZmluZWQoX19JQ0MpIHx8IGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikKLSNkZWZpbmUgSkNERUNMICBfX2NkZWNsCi0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKQotI2RlZmluZSBKQ0RFQ0wgIF9fYXR0cmlidXRlX18oKF9fY2RlY2xfXykpCi0jZWxzZQotI2RlZmluZSBKQ0RFQ0wKLSNlbmRpZgotCiAvKiBhIGZ1bmN0aW9uIGNhbGxlZCB0aHJvdWdoIG1ldGhvZCBwb2ludGVyczogKi8KLSNkZWZpbmUgTUVUSE9EREVGKHR5cGUpCQlzdGF0aWMgdHlwZSBKQ0RFQ0wKKyNkZWZpbmUgTUVUSE9EREVGKHR5cGUpCQlzdGF0aWMgdHlwZQogLyogYSBmdW5jdGlvbiB1c2VkIG9ubHkgaW4gaXRzIG1vZHVsZTogKi8KICNkZWZpbmUgTE9DQUwodHlwZSkJCXN0YXRpYyB0eXBlCiAvKiBhIGZ1bmN0aW9uIHJlZmVyZW5jZWQgdGhydSBFWFRFUk5zOiAqLwotI2RlZmluZSBHTE9CQUwodHlwZSkJCXR5cGUgSkNERUNMCisjZGVmaW5lIEdMT0JBTCh0eXBlKQkJdHlwZQogLyogYSByZWZlcmVuY2UgdG8gYSBHTE9CQUwgZnVuY3Rpb246ICovCi0jZGVmaW5lIEVYVEVSTih0eXBlKQkJZXh0ZXJuIHR5cGUgSkNERUNMCisjZGVmaW5lIEVYVEVSTih0eXBlKQkJZXh0ZXJuIHR5cGUKIAogCiAvKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gZGVjbGFyZSBhICJtZXRob2QiLCB0aGF0IGlzLCBhIGZ1bmN0aW9uIHBvaW50ZXIuCkBAIC0yMTcsOSArMTk3LDkgQEAKICAqLwogCiAjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCi0jZGVmaW5lIEpNRVRIT0QodHlwZSxtZXRob2RuYW1lLGFyZ2xpc3QpICB0eXBlIChKQ0RFQ0wgKm1ldGhvZG5hbWUpIGFyZ2xpc3QKKyNkZWZpbmUgSk1FVEhPRCh0eXBlLG1ldGhvZG5hbWUsYXJnbGlzdCkgIHR5cGUgKCptZXRob2RuYW1lKSBhcmdsaXN0CiAjZWxzZQotI2RlZmluZSBKTUVUSE9EKHR5cGUsbWV0aG9kbmFtZSxhcmdsaXN0KSAgdHlwZSAoSkNERUNMICptZXRob2RuYW1lKSAoKQorI2RlZmluZSBKTUVUSE9EKHR5cGUsbWV0aG9kbmFtZSxhcmdsaXN0KSAgdHlwZSAoKm1ldGhvZG5hbWUpICgpCiAjZW5kaWYKIAogCkBAIC0yMjksMTMgKzIwOSwxMSBAQAogICogZXhwbGljaXQgY29kaW5nIGlzIG5lZWRlZDsgc2VlIHVzZXMgb2YgdGhlIE5FRURfRkFSX1BPSU5URVJTIHN5bWJvbC4KICAqLwogCi0jaWZuZGVmIEZBUgogI2lmZGVmIE5FRURfRkFSX1BPSU5URVJTCiAjZGVmaW5lIEZBUiAgZmFyCiAjZWxzZQogI2RlZmluZSBGQVIKICNlbmRpZgotI2VuZGlmIC8qICFGQVIgKi8KIAogCiAvKgpAQCAtMjQ2LDE0ICsyMjQsOCBAQAogICovCiAKICNpZm5kZWYgSEFWRV9CT09MRUFOCi0jaWZkZWYgVFlQRURFRl9VQ0hBUl9CT09MRUFOCi0jaWZuZGVmIF9fUlBDTkRSX0hfXwkJLyogZG9uJ3QgY29uZmxpY3QgaWYgcnBjbmRyLmggYWxyZWFkeSByZWFkICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgYm9vbGVhbjsKLSNlbmRpZgotI2Vsc2UgLyogIVRZUEVERUZfVUNIQVJfQk9PTEVBTiAqLwogdHlwZWRlZiBpbnQgYm9vbGVhbjsKLSNlbmRpZiAvKiBUWVBFREVGX1VDSEFSX0JPT0xFQU4gKi8KLSNlbmRpZiAvKiAhSEFWRV9CT09MRUFOICovCisjZW5kaWYKICNpZm5kZWYgRkFMU0UJCQkvKiBpbiBjYXNlIHRoZXNlIG1hY3JvcyBhbHJlYWR5IGV4aXN0ICovCiAjZGVmaW5lIEZBTFNFCTAJCS8qIHZhbHVlcyBvZiBib29sZWFuICovCiAjZW5kaWYKQEAgLTMxOCw3ICsyOTAsNiBAQAogI2RlZmluZSBJRENUX1NDQUxJTkdfU1VQUE9SVEVECSAgICAvKiBPdXRwdXQgcmVzY2FsaW5nIHZpYSBJRENUPyAqLwogI3VuZGVmICBVUFNBTVBMRV9TQ0FMSU5HX1NVUFBPUlRFRCAgLyogT3V0cHV0IHJlc2NhbGluZyBhdCB1cHNhbXBsZSBzdGFnZT8gKi8KICNkZWZpbmUgVVBTQU1QTEVfTUVSR0lOR19TVVBQT1JURUQgIC8qIEZhc3QgcGF0aCBmb3Igc2xvcHB5IHVwc2FtcGxpbmc/ICovCi0jZGVmaW5lIFVQU0FNUExFX0gxVjJfU1VQUE9SVEVECSAgICAvKiBGYXN0L2ZhbmN5IHByb2Nlc3NpbmcgZm9yIDFoMnY/ICovCiAjZGVmaW5lIFFVQU5UXzFQQVNTX1NVUFBPUlRFRAkgICAgLyogMS1wYXNzIGNvbG9yIHF1YW50aXphdGlvbj8gKi8KICNkZWZpbmUgUVVBTlRfMlBBU1NfU1VQUE9SVEVECSAgICAvKiAyLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uPyAqLwogCkBAIC0zNDUsMTEyICszMTYsMjAgQEAKICNkZWZpbmUgUkdCX0JMVUUJMgkvKiBPZmZzZXQgb2YgQmx1ZSAqLwogI2RlZmluZSBSR0JfUElYRUxTSVpFCTMJLyogSlNBTVBMRXMgcGVyIFJHQiBzY2FubGluZSBlbGVtZW50ICovCiAKLSN1bmRlZiBSR0JYX0ZJTExFUl8wWEZGIAkvKiBmaWxsIGR1bW15IGJ5dGVzIHdpdGggMHhGRiBpbiBSR0JYIGZvcm1hdCAqLwotCi0KLS8qIFNJTUQgc3VwcG9ydCBvcHRpb25zOiAqLwotCi0jaWZuZGVmIEpTSU1EX01NWF9OT1RfU1VQUE9SVEVECi0jZGVmaW5lIEpTSU1EX0VOQ09ERVJfTU1YX1NVUFBPUlRFRAkvKiBVc2UgTU1YICAgIGluIGVuY29kaW5nIHByb2Nlc3MgKi8KLSNkZWZpbmUgSlNJTURfREVDT0RFUl9NTVhfU1VQUE9SVEVECS8qIFVzZSBNTVggICAgaW4gZGVjb2RpbmcgcHJvY2VzcyAqLwotI2VuZGlmCi0jaWZuZGVmIEpTSU1EXzNETk9XX05PVF9TVVBQT1JURUQKLSNkZWZpbmUgSlNJTURfRU5DT0RFUl8zRE5PV19TVVBQT1JURUQJLyogVXNlIDNETm93ISBpbiBlbmNvZGluZyBwcm9jZXNzICovCi0jZGVmaW5lIEpTSU1EX0RFQ09ERVJfM0ROT1dfU1VQUE9SVEVECS8qIFVzZSAzRE5vdyEgaW4gZGVjb2RpbmcgcHJvY2VzcyAqLwotI2VuZGlmCi0jaWZuZGVmIEpTSU1EX1NTRV9OT1RfU1VQUE9SVEVECi0jZGVmaW5lIEpTSU1EX0VOQ09ERVJfU1NFX1NVUFBPUlRFRAkvKiBVc2UgU1NFICAgIGluIGVuY29kaW5nIHByb2Nlc3MgKi8KLSNkZWZpbmUgSlNJTURfREVDT0RFUl9TU0VfU1VQUE9SVEVECS8qIFVzZSBTU0UgICAgaW4gZGVjb2RpbmcgcHJvY2VzcyAqLwotI2VuZGlmCi0jaWZuZGVmIEpTSU1EX1NTRTJfTk9UX1NVUFBPUlRFRAotI2RlZmluZSBKU0lNRF9FTkNPREVSX1NTRTJfU1VQUE9SVEVECS8qIFVzZSBTU0UyICAgaW4gZW5jb2RpbmcgcHJvY2VzcyAqLwotI2RlZmluZSBKU0lNRF9ERUNPREVSX1NTRTJfU1VQUE9SVEVECS8qIFVzZSBTU0UyICAgaW4gZGVjb2RpbmcgcHJvY2VzcyAqLwotI2VuZGlmCi0KLS8qIChlbmNvZGVyIHBhcnQpOiAqLwotCi0jdW5kZWYgSkZEQ1RfSU5UX1FVQU5USVpFX1dJVEhfRElWSVNJT04gLyogVXNlIGdlbmVyYWwgcXVhbnRpemF0aW9uIG1ldGhvZCAqLwotCi0jaWYgZGVmaW5lZChKU0lNRF9FTkNPREVSX01NWF9TVVBQT1JURUQpCi0jZGVmaW5lIEpDQ09MT1JfUkdCWUNDX01NWF9TVVBQT1JURUQJLyogUkdCLT5ZQ0MgY29udmVyc2lvbiB3aXRoIE1NWCAqLwotI2RlZmluZSBKQ1NBTVBMRV9NTVhfU1VQUE9SVEVECQkvKiBkb3duc2FtcGxpbmcgd2l0aCBNTVggKi8KLSNkZWZpbmUgSkZEQ1RfSU5UX01NWF9TVVBQT1JURUQJCS8qIGZvcndhcmQgRENUIHdpdGggTU1YICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkKEpTSU1EX0VOQ09ERVJfU1NFMl9TVVBQT1JURUQpCi0jZGVmaW5lIEpDQ09MT1JfUkdCWUNDX1NTRTJfU1VQUE9SVEVECS8qIFJHQi0+WUNDIGNvbnZlcnNpb24gd2l0aCBTU0UyICovCi0jZGVmaW5lIEpDU0FNUExFX1NTRTJfU1VQUE9SVEVECQkvKiBkb3duc2FtcGxpbmcgd2l0aCBTU0UyICovCi0jZGVmaW5lIEpGRENUX0lOVF9TU0UyX1NVUFBPUlRFRAkvKiBmb3J3YXJkIERDVCB3aXRoIFNTRTIgKi8KLSNlbmRpZgotI2lmIGRlZmluZWQoSlNJTURfRU5DT0RFUl8zRE5PV19TVVBQT1JURUQpICYmIFwKLSAgICBkZWZpbmVkKEpTSU1EX0VOQ09ERVJfTU1YX1NVUFBPUlRFRCkKLSNkZWZpbmUgSkZEQ1RfRkxUXzNETk9XX01NWF9TVVBQT1JURUQJLyogZm9yd2FyZCBEQ1Qgd2l0aCAzRE5vdyEvTU1YICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkKEpTSU1EX0VOQ09ERVJfU1NFX1NVUFBPUlRFRCkgJiYgXAotICAgIGRlZmluZWQoSlNJTURfRU5DT0RFUl9NTVhfU1VQUE9SVEVEKQotI2RlZmluZSBKRkRDVF9GTFRfU1NFX01NWF9TVVBQT1JURUQJLyogZm9yd2FyZCBEQ1Qgd2l0aCBTU0UvTU1YICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkKEpTSU1EX0VOQ09ERVJfU1NFX1NVUFBPUlRFRCkgJiYgXAotICAgIGRlZmluZWQoSlNJTURfRU5DT0RFUl9TU0UyX1NVUFBPUlRFRCkKLSNkZWZpbmUgSkZEQ1RfRkxUX1NTRV9TU0UyX1NVUFBPUlRFRAkvKiBmb3J3YXJkIERDVCB3aXRoIFNTRS9TU0UyICovCi0jZW5kaWYKLQotLyogKGRlY29kZXIgcGFydCk6ICovCi0KLSNpZiBkZWZpbmVkKEpTSU1EX0RFQ09ERVJfTU1YX1NVUFBPUlRFRCkKLSNkZWZpbmUgSkRDT0xPUl9ZQ0NSR0JfTU1YX1NVUFBPUlRFRAkvKiBZQ0MtPlJHQiBjb252ZXJzaW9uIHdpdGggTU1YICovCi0jZGVmaW5lIEpETUVSR0VfTU1YX1NVUFBPUlRFRAkJLyogbWVyZ2VkIHVwc2FtcGxpbmcgd2l0aCBNTVggKi8KLSNkZWZpbmUgSkRTQU1QTEVfRkFOQ1lfTU1YX1NVUFBPUlRFRAkvKiBmYW5jeSB1cHNhbXBsaW5nIHdpdGggTU1YICovCi0jZGVmaW5lIEpEU0FNUExFX1NJTVBMRV9NTVhfU1VQUE9SVEVECS8qIHNsb3BweSB1cHNhbXBsaW5nIHdpdGggTU1YICovCi0jZGVmaW5lIEpJRENUX0lOVF9NTVhfU1VQUE9SVEVECQkvKiBpbnZlcnNlIERDVCB3aXRoIE1NWCAqLwotI2VuZGlmCi0jaWYgZGVmaW5lZChKU0lNRF9ERUNPREVSX1NTRTJfU1VQUE9SVEVEKQotI2RlZmluZSBKRENPTE9SX1lDQ1JHQl9TU0UyX1NVUFBPUlRFRAkvKiBZQ0MtPlJHQiBjb252ZXJzaW9uIHdpdGggU1NFMiAqLwotI2RlZmluZSBKRE1FUkdFX1NTRTJfU1VQUE9SVEVECQkvKiBtZXJnZWQgdXBzYW1wbGluZyB3aXRoIFNTRTIgKi8KLSNkZWZpbmUgSkRTQU1QTEVfRkFOQ1lfU1NFMl9TVVBQT1JURUQJLyogZmFuY3kgdXBzYW1wbGluZyB3aXRoIFNTRTIgKi8KLSNkZWZpbmUgSkRTQU1QTEVfU0lNUExFX1NTRTJfU1VQUE9SVEVECS8qIHNsb3BweSB1cHNhbXBsaW5nIHdpdGggU1NFMiAqLwotI2RlZmluZSBKSURDVF9JTlRfU1NFMl9TVVBQT1JURUQJLyogaW52ZXJzZSBEQ1Qgd2l0aCBTU0UyICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkKEpTSU1EX0RFQ09ERVJfM0ROT1dfU1VQUE9SVEVEKSAmJiBcCi0gICAgZGVmaW5lZChKU0lNRF9ERUNPREVSX01NWF9TVVBQT1JURUQpCi0jZGVmaW5lIEpJRENUX0ZMVF8zRE5PV19NTVhfU1VQUE9SVEVECS8qIGludmVyc2UgRENUIHdpdGggM0ROb3chL01NWCAqLwotI2VuZGlmCi0jaWYgZGVmaW5lZChKU0lNRF9ERUNPREVSX1NTRV9TVVBQT1JURUQpICYmIFwKLSAgICBkZWZpbmVkKEpTSU1EX0RFQ09ERVJfTU1YX1NVUFBPUlRFRCkKLSNkZWZpbmUgSklEQ1RfRkxUX1NTRV9NTVhfU1VQUE9SVEVECS8qIGludmVyc2UgRENUIHdpdGggU1NFL01NWCAqLwotI2VuZGlmCi0jaWYgZGVmaW5lZChKU0lNRF9ERUNPREVSX1NTRV9TVVBQT1JURUQpICYmIFwKLSAgICBkZWZpbmVkKEpTSU1EX0RFQ09ERVJfU1NFMl9TVVBQT1JURUQpCi0jZGVmaW5lIEpJRENUX0ZMVF9TU0VfU1NFMl9TVVBQT1JURUQJLyogaW52ZXJzZSBEQ1Qgd2l0aCBTU0UvU1NFMiAqLwotI2VuZGlmCi0KIAogLyogRGVmaW5pdGlvbnMgZm9yIHNwZWVkLXJlbGF0ZWQgb3B0aW1pemF0aW9ucy4gKi8KIAotCi0vKiBJZiB5b3VyIGNvbXBpbGVyIHN1cHBvcnRzIGlubGluZSBmdW5jdGlvbnMsIGRlZmluZSBJTkxJTkUKLSAqIGFzIHRoZSBpbmxpbmUga2V5d29yZDsgb3RoZXJ3aXNlIGRlZmluZSBpdCBhcyBlbXB0eS4KLSAqLwotCi0jaWZuZGVmIElOTElORQotI2lmZGVmIF9fR05VQ19fCQkJLyogZm9yIGluc3RhbmNlLCBHTlUgQyBrbm93cyBhYm91dCBpbmxpbmUgKi8KLSNkZWZpbmUgSU5MSU5FIF9faW5saW5lX18KLSNlbmRpZgotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIElOTElORSBfX2lubGluZQotI2VuZGlmCi0jaWZuZGVmIElOTElORQotI2RlZmluZSBJTkxJTkUJCQkvKiBkZWZhdWx0IGlzIHRvIGRlZmluZSBpdCBhcyBlbXB0eSAqLwotI2VuZGlmCi0jZW5kaWYKLQotCiAvKiBPbiBzb21lIG1hY2hpbmVzIChub3RhYmx5IDY4MDAwIHNlcmllcykgImludCIgaXMgMzIgYml0cywgYnV0IG11bHRpcGx5aW5nCiAgKiB0d28gMTYtYml0IHNob3J0cyBpcyBmYXN0ZXIgdGhhbiBtdWx0aXBseWluZyB0d28gaW50cy4gIERlZmluZSBNVUxUSVBMSUVSCiAgKiBhcyBzaG9ydCBvbiBzdWNoIGEgbWFjaGluZS4gIE1VTFRJUExJRVIgbXVzdCBiZSBhdCBsZWFzdCAxNiBiaXRzIHdpZGUuCiAgKi8KIAogI2lmbmRlZiBNVUxUSVBMSUVSCisjaWZuZGVmIFdJVEhfU0lNRAogI2RlZmluZSBNVUxUSVBMSUVSICBpbnQJCS8qIHR5cGUgZm9yIGZhc3Rlc3QgaW50ZWdlciBtdWx0aXBseSAqLworI2Vsc2UKKyNkZWZpbmUgTVVMVElQTElFUiBzaG9ydCAgLyogcHJlZmVyIDE2LWJpdCB3aXRoIFNJTUQgZm9yIHBhcmVsbGVsaXNtICovCisjZW5kaWYKICNlbmRpZgogCiAKZGlmZiAtLWdpdCBhL2pwZWcuZHNwIGIvanBlZy5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdlZGFiZgotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcuZHNwCkBAIC0wLDAgKzEsMzIwIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9ImpwZWciIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IiAweDAxMDQNCisNCitDRkc9anBlZyAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJqcGVnLm1hayIuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UNCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJqcGVnLm1hayIgQ0ZHPSJqcGVnIC0gV2luMzIgRGVidWciDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgImpwZWcgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCishTUVTU0FHRSAianBlZyAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAianBlZyAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICIuLlxSZWxlYXNlIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxSZWxlYXNlXGpwZWciDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiTkRFQlVHIiAvRCAiX0xJQiIgL0QgIldJTjMyIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MgL0kgIndpbiINCisjIEFERCBCQVNFIFJTQyAvbCAweDQxOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJQjMyPWxpbmsuZXhlIC1saWINCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28NCisjIEFERCBMSUIzMiAvbm9sb2dvDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImpwZWcgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuLlxEZWJ1ZyINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuLlxEZWJ1Z1xqcGVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvWVggL0ZEIC9HWiAgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIl9ERUJVRyIgL0QgIl9MSUIiIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAvYyAvSSAid2luIg0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDE5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElCMzI9bGluay5leGUgLWxpYg0KKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KKyMgQUREIExJQjMyIC9ub2xvZ28NCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgImpwZWcgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAianBlZyAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpjYXBpbWluLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqY2FwaXN0ZC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camNjb2VmY3QuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpjY29sb3IuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpjZGN0bWdyLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqY2h1ZmYuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpjaW5pdC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camNtYWluY3QuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpjbWFya2VyLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqY21hc3Rlci5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camNvbWFwaS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camNwYXJhbS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camNwaHVmZi5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camNwcmVwY3QuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpjc2FtcGxlLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqY3RyYW5zLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqZGFwaW1pbi5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camRhcGlzdGQuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpkYXRhZHN0LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqZGF0YXNyYy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camRjb2VmY3QuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpkY29sb3IuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpkZGN0bWdyLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqZGh1ZmYuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpkaW5wdXQuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpkbWFpbmN0LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqZG1hcmtlci5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camRtYXN0ZXIuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpkbWVyZ2UuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpkcGh1ZmYuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpkcG9zdGN0LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqZHNhbXBsZS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camR0cmFucy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camVycm9yLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqZmRjdGZsdC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camZkY3Rmc3QuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpmZGN0aW50LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqaWRjdGZsdC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camlkY3Rmc3QuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGppZGN0aW50LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqaWRjdHJlZC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cam1lbW1nci5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cam1lbW5vYnMuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpxdWFudDEuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpxdWFudDIuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGp1dGlscy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpjaHVmZi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camNvbmZpZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camRjdC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camRodWZmLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqZXJyb3IuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGppbmNsdWRlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqbWVtc3lzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqbW9yZWNmZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5canBlZ2ludC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5canBlZ2xpYi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5canZlcnNpb24uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvanBlZ2RsbC5kZWYgYi9qcGVnZGxsLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4NmNkNi4uMDAwMDAwMAotLS0gYS9qcGVnZGxsLmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTsKLTsganBlZ2RsbC5kZWYgLSBtb2R1bGUgZGVmaW5pdGlvbiBmaWxlIGZvciBXaW4zMiBETEwKLTsKLQotOyBzZWQgLWUgIi9cKGppbml0XHxqcGVnX3NpbWRfXChjcHVcfG9zXHxtZXJnZWRcKVwpL2QiIC1lICJzL15FWFRFUk4oLi4qKSBcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKS4qLyAgXDEvcCIgLWUgZCBqcGVnbGliLmgganBlZ2ludC5oCi0KLUVYUE9SVFMKLSAgOyBBUEkgZnVuY3Rpb25zIGluIGpwZWdsaWIuaCwgd2hpY2ggYXJlIGludGVuZGVkCi0gIDsgdG8gYmUgY2FsbGVkIGJ5IHRoZSB1c2VyIGFwcGxpY2F0aW9ucy4KLSAganBlZ19zdGRfZXJyb3IKLSAganBlZ19DcmVhdGVDb21wcmVzcwotICBqcGVnX0NyZWF0ZURlY29tcHJlc3MKLSAganBlZ19kZXN0cm95X2NvbXByZXNzCi0gIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzCi0gIGpwZWdfc3RkaW9fZGVzdAotICBqcGVnX3N0ZGlvX3NyYwotICBqcGVnX3NldF9kZWZhdWx0cwotICBqcGVnX3NldF9jb2xvcnNwYWNlCi0gIGpwZWdfZGVmYXVsdF9jb2xvcnNwYWNlCi0gIGpwZWdfc2V0X3F1YWxpdHkKLSAganBlZ19zZXRfbGluZWFyX3F1YWxpdHkKLSAganBlZ19hZGRfcXVhbnRfdGFibGUKLSAganBlZ19xdWFsaXR5X3NjYWxpbmcKLSAganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24KLSAganBlZ19zdXBwcmVzc190YWJsZXMKLSAganBlZ19hbGxvY19xdWFudF90YWJsZQotICBqcGVnX2FsbG9jX2h1ZmZfdGFibGUKLSAganBlZ19zdGFydF9jb21wcmVzcwotICBqcGVnX3dyaXRlX3NjYW5saW5lcwotICBqcGVnX2ZpbmlzaF9jb21wcmVzcwotICBqcGVnX3dyaXRlX3Jhd19kYXRhCi0gIGpwZWdfd3JpdGVfbWFya2VyCi0gIGpwZWdfd3JpdGVfbV9oZWFkZXIKLSAganBlZ193cml0ZV9tX2J5dGUKLSAganBlZ193cml0ZV90YWJsZXMKLSAganBlZ19yZWFkX2hlYWRlcgotICBqcGVnX3N0YXJ0X2RlY29tcHJlc3MKLSAganBlZ19yZWFkX3NjYW5saW5lcwotICBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzCi0gIGpwZWdfcmVhZF9yYXdfZGF0YQotICBqcGVnX2hhc19tdWx0aXBsZV9zY2FucwotICBqcGVnX3N0YXJ0X291dHB1dAotICBqcGVnX2ZpbmlzaF9vdXRwdXQKLSAganBlZ19pbnB1dF9jb21wbGV0ZQotICBqcGVnX25ld19jb2xvcm1hcAotICBqcGVnX2NvbnN1bWVfaW5wdXQKLSAganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zCi0gIGpwZWdfc2F2ZV9tYXJrZXJzCi0gIGpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IKLSAganBlZ19yZWFkX2NvZWZmaWNpZW50cwotICBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cwotICBqcGVnX2NvcHlfY3JpdGljYWxfcGFyYW1ldGVycwotICBqcGVnX2Fib3J0X2NvbXByZXNzCi0gIGpwZWdfYWJvcnRfZGVjb21wcmVzcwotICBqcGVnX2Fib3J0Ci0gIGpwZWdfZGVzdHJveQotICBqcGVnX3Jlc3luY190b19yZXN0YXJ0Ci0gIDsgRnVuY3Rpb25zIHRoYXQgYXJlIGludHJvZHVjZWQgYnkgU0lNRCBleHRlbnNpb24uCi0gIGpwZWdfc2ltZF9zdXBwb3J0Ci0gIGpwZWdfc2ltZF9tYXNrCi0gIGpwZWdfc2ltZF9jb2xvcl9jb252ZXJ0ZXIKLSAganBlZ19zaW1kX2Rvd25zYW1wbGVyCi0gIGpwZWdfc2ltZF9mb3J3YXJkX2RjdAotICBqcGVnX3NpbWRfY29sb3JfZGVjb252ZXJ0ZXIKLSAganBlZ19zaW1kX3Vwc2FtcGxlcgotICBqcGVnX3NpbWRfaW52ZXJzZV9kY3QKLSAgOyBVdGlsaXR5IGZ1bmN0aW9ucyBpbiBqdXRpbHMuYy4KLSAgOyBUaGVzZSBhcmUgbmVlZGVkIGJ5IHNvbWUgYXBwbGljYXRpb25zLgotICBqZGl2X3JvdW5kX3VwCi0gIGpyb3VuZF91cAotICBqY29weV9zYW1wbGVfcm93cwotICBqY29weV9ibG9ja19yb3cKLSAganplcm9fZmFyCmRpZmYgLS1naXQgYS9qcGVnZGxsLnJjIGIvanBlZ2RsbC5yYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzZDMyNy4uMDAwMDAwMAotLS0gYS9qcGVnZGxsLnJjCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8KLS8vIGpwZWdkbGwucmMgLSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciBXaW4zMiBETEwKLS8vCi0KLS8vIGZyb20gPHdpbnZlci5oPgotI2RlZmluZSBWU19WRVJTSU9OX0lORk8gICAgICAgICAxCi0jZGVmaW5lIFZTX0ZGSV9GSUxFRkxBR1NNQVNLICAgIDB4MDAwMDAwM0ZMCi0jZGVmaW5lIFZTX0ZGX0RFQlVHICAgICAgICAgICAgIDB4MDAwMDAwMDFMCi0jZGVmaW5lIFZPU19fV0lORE9XUzMyICAgICAgICAgIDB4MDAwMDAwMDRMCi0jZGVmaW5lIFZGVF9ETEwgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCi0jZGVmaW5lIFZGVDJfVU5LTk9XTiAgICAgICAgICAgIDB4MDAwMDAwMDBMCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyBWZXJzaW9uCi0vLwotCi1WU19WRVJTSU9OX0lORk8gVkVSU0lPTklORk8KLSBGSUxFVkVSU0lPTiAgICA2LDIsMSwyCi0gUFJPRFVDVFZFUlNJT04gNiwyLDEsMgotIEZJTEVGTEFHU01BU0sgIFZTX0ZGSV9GSUxFRkxBR1NNQVNLCi0jaWZkZWYgX0RFQlVHCi0gRklMRUZMQUdTICAgICAgVlNfRkZfREVCVUcKLSNlbHNlCi0gRklMRUZMQUdTICAgICAgMHgwMDAwMDAwMEwKLSNlbmRpZgotIEZJTEVPUyAgICAgICAgIFZPU19fV0lORE9XUzMyCi0gRklMRVRZUEUgICAgICAgVkZUX0RMTAotIEZJTEVTVUJUWVBFICAgIFZGVDJfVU5LTk9XTgotQkVHSU4KLSAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCi0gICAgQkVHSU4KLSAgICAgICAgQkxPQ0sgIjAwMDAwMDAwIgotICAgICAgICBCRUdJTgotICAgICAgICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgICJDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBUaG9tYXMgRy4gTGFuZVwwIgotICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFRyBMaWJyYXJ5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCBTSU1EIHN1cHBvcnRcMCIKLSAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICJUaGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIEpQRUcgc29mdHdhcmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlbGVhc2UgNmIgICB3aXRoIHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIElKRyBKUEVHIGxpYnJhcnkgdmVyc2lvbiAxLjAyXDAiCi0gICAgICAgICAgICBWQUxVRSAiQ29tbWVudHMiLCAiVGhpcyBpcyBub3QgYW4gb2ZmaWNpYWwgYmluYXJ5IGZyb20gSUpHLiAgICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgU0lNRCBjb2RlIGluIHRoaXMgRExMIGlzIGNvcHlyaWdodCAoQykiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIDE5OTktMjAwNiBNSVlBU0FLQSBNYXNhcnUuXDAiCi0gICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCAgICAgICI2LjIuMS4wMlwwIgotICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgICAiNi4yLjEuMDJcMCIKLSAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgImpwZWc2Mi5kbGxcMCIKLSAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAgICAgImpwZWc2MlwwIgotICAgICAgICBFTkQKLSAgICBFTkQKLSAgICBCTE9DSyAiVmFyRmlsZUluZm8iCi0gICAgQkVHSU4KLSAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHgwLCAwCi0gICAgRU5ECi1FTkQKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KZGlmZiAtLWdpdCBhL2pwZWdpbnQuaCBiL2pwZWdpbnQuaAppbmRleCA1MTFlMDdjLi45NWIwMGQ0IDEwMDY0NAotLS0gYS9qcGVnaW50LmgKKysrIGIvanBlZ2ludC5oCkBAIC01LDEzICs1LDYgQEAKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi0gKiBUaGlzIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgZm9yIFNJTUQgZXh0ZW5zaW9uLgotICogTGFzdCBNb2RpZmllZCA6IEZlYnJ1YXJ5IDQsIDIwMDYKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKICAqIFRoaXMgZmlsZSBwcm92aWRlcyBjb21tb24gZGVjbGFyYXRpb25zIGZvciB0aGUgdmFyaW91cyBKUEVHIG1vZHVsZXMuCiAgKiBUaGVzZSBkZWNsYXJhdGlvbnMgYXJlIGNvbnNpZGVyZWQgaW50ZXJuYWwgdG8gdGhlIEpQRUcgbGlicmFyeTsgbW9zdAogICogYXBwbGljYXRpb25zIHVzaW5nIHRoZSBsaWJyYXJ5IHNob3VsZG4ndCBuZWVkIHRvIGluY2x1ZGUgdGhpcyBmaWxlLgpAQCAtMjk4LDE5ICsyOTEsNiBAQAogI2VuZGlmCiAKIAotLyogU0lNRCBFeHQ6IFRoaXMgbWFjcm8gY2hlY2tzIGlmIGNvbnN0YW50cyBmb3IgU1NFL1NTRTIgaW5zdHJ1Y3Rpb25zIGFyZQotICogYWxpZ25lZCB0byBhIDE2LWJ5dGUgYm91bmRhcnkuIE1vc3Qgb2YgU1NFL1NTRTIgaW5zdHJ1Y3Rpb25zIHJlcXVpcmUKLSAqIHRoYXQgdGhlIG1lbW9yeSBvcGVyYW5kIGlzIGFsaWduZWQgdG8gYSAxNi1ieXRlIGJvdW5kYXJ5OyBpZiBub3QsCi0gKiBhIGdlbmVyYWwtcHJvdGVjdGlvbiBleGNlcHRpb24gKCNHUCkgaXMgZ2VuZXJhdGVkLgotICovCi0KLSNpZmRlZiBKU0lNRF9OT19TU0VDT05TVF9BTElHTk1FTlRfQ0hFQ0sKLSNkZWZpbmUgSVNfQ09OU1RfQUxJR05FRF8xNihwKQkoMSkKLSNlbHNlCi0jZGVmaW5lIElTX0NPTlNUX0FMSUdORURfMTYocCkJKCgodW5zaWduZWQpKHApICYgMHgwRikgPT0gMCkKLSNlbmRpZgotCi0KIC8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLiAqLwogCiAjaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwpAQCAtMzQ3LDggKzMyNyw2IEBACiAjZGVmaW5lIGp6ZXJvX2ZhcgkJalplcm9GYXIKICNkZWZpbmUganBlZ196aWd6YWdfb3JkZXIJalpJR1RhYmxlCiAjZGVmaW5lIGpwZWdfbmF0dXJhbF9vcmRlcglqWkFHVGFibGUKLSNkZWZpbmUganBlZ19zaW1kX2NwdV9zdXBwb3J0CWpTaUNwdVN1cHBvcnQKLSNkZWZpbmUganBlZ19zaW1kX29zX3N1cHBvcnQJalNpT3NTdXBwb3J0CiAjZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLwogCiAKQEAgLTQwNCwxMCArMzgyLDYgQEAKICNlbmRpZgogZXh0ZXJuIGNvbnN0IGludCBqcGVnX25hdHVyYWxfb3JkZXJbXTsgLyogemlnemFnIGNvZWYgb3JkZXIgdG8gbmF0dXJhbCBvcmRlciAqLwogCi0vKiBTSU1EIEV4dDogcmV0cmlldmUgU0lNRC9DUFUgaW5mb3JtYXRpb24gKi8KLUVYVEVSTih1bnNpZ25lZCBpbnQpIGpwZWdfc2ltZF9jcHVfc3VwcG9ydCBKUFAoKHZvaWQpKTsKLUVYVEVSTih1bnNpZ25lZCBpbnQpIGpwZWdfc2ltZF9vc19zdXBwb3J0IEpQUCgodW5zaWduZWQgaW50IHNpbWQpKTsKLQogLyogU3VwcHJlc3MgdW5kZWZpbmVkLXN0cnVjdHVyZSBjb21wbGFpbnRzIGlmIG5lY2Vzc2FyeS4gKi8KIAogI2lmZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCmRpZmYgLS1naXQgYS9qcGVnbGliLmggYi9qcGVnbGliLmgKaW5kZXggMDUwNjMxNi4uZDFiZThkZCAxMDA2NDQKLS0tIGEvanBlZ2xpYi5oCisrKyBiL2pwZWdsaWIuaApAQCAtNSwxMyArNSw2IEBACiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgogICoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgotICogVGhpcyBmaWxlIGhhcyBiZWVuIG1vZGlmaWVkIGZvciBTSU1EIGV4dGVuc2lvbi4KLSAqIExhc3QgTW9kaWZpZWQgOiBGZWJydWFyeSA0LCAyMDA2Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCiAgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgYXBwbGljYXRpb24gaW50ZXJmYWNlIGZvciB0aGUgSlBFRyBsaWJyYXJ5LgogICogTW9zdCBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkgbmVlZCBvbmx5IGluY2x1ZGUgdGhpcyBmaWxlLAogICogYW5kIHBlcmhhcHMgamVycm9yLmggaWYgdGhleSB3YW50IHRvIGtub3cgdGhlIGV4YWN0IGVycm9yIGNvZGVzLgpAQCAtMjAsMTAgKzEzLDYgQEAKICNpZm5kZWYgSlBFR0xJQl9ICiAjZGVmaW5lIEpQRUdMSUJfSAogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KIC8qCiAgKiBGaXJzdCB3ZSBpbmNsdWRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIHRoYXQgcmVjb3JkIGhvdyB0aGlzCiAgKiBpbnN0YWxsYXRpb24gb2YgdGhlIEpQRUcgbGlicmFyeSBpcyBzZXQgdXAuICBqY29uZmlnLmggY2FuIGJlCkBAIC00NCwxMyArMzMsNiBAQAogI2RlZmluZSBKUEVHX0xJQl9WRVJTSU9OICA2MgkvKiBWZXJzaW9uIDZiICovCiAKIAotLyogU0lNRCBFeHQ6IFZlcnNpb24gSUQgZm9yIHRoZSBTSU1EIGV4dGVuc2lvbi4KLSAqLwotCi0jZGVmaW5lIEpQRUdfU0lNREVYVF9WRVJTSU9OICAxMDIJLyogdmVyc2lvbiAxLjAyICovCi0jZGVmaW5lIEpQRUdfU0lNREVYVF9WRVJfU1RSICAiMS4wMiIKLQotCiAvKiBWYXJpb3VzIGNvbnN0YW50cyBkZXRlcm1pbmluZyB0aGUgc2l6ZXMgb2YgdGhpbmdzLgogICogQWxsIG9mIHRoZXNlIGFyZSBzcGVjaWZpZWQgYnkgdGhlIEpQRUcgc3RhbmRhcmQsIHNvIGRvbid0IGNoYW5nZSB0aGVtCiAgKiBpZiB5b3Ugd2FudCB0byBiZSBjb21wYXRpYmxlLgpAQCAtMjUzLDE1ICsyMzUsNiBAQAogCUpESVRIRVJfRlMJCS8qIEZsb3lkLVN0ZWluYmVyZyBlcnJvciBkaWZmdXNpb24gZGl0aGVyICovCiB9IEpfRElUSEVSX01PREU7CiAKLS8qIFNJTUQgRXh0OiBiaXRmbGFncyBmb3IganBlZ19zaW1kX3N1cHBvcnQoKSBhbmQganBlZ19zaW1kX21hc2soKSAqLwotCi0jZGVmaW5lIEpTSU1EX05PTkUgICAgMHgwMAotI2RlZmluZSBKU0lNRF9NTVggICAgIDB4MDEKLSNkZWZpbmUgSlNJTURfM0ROT1cgICAweDAyCi0jZGVmaW5lIEpTSU1EX1NTRSAgICAgMHgwNAotI2RlZmluZSBKU0lNRF9TU0UyICAgIDB4MDgKLSNkZWZpbmUgSlNJTURfQUxMICAgICAoSlNJTURfTU1YIHwgSlNJTURfM0ROT1cgfCBKU0lNRF9TU0UgfCBKU0lNRF9TU0UyKQotCiAKIC8qIENvbW1vbiBmaWVsZHMgYmV0d2VlbiBKUEVHIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG1hc3RlciBzdHJ1Y3RzLiAqLwogCkBAIC05MDQsMTggKzg3Nyw2IEBACiAjZGVmaW5lIGpwZWdfYWJvcnQJCWpBYm9ydAogI2RlZmluZSBqcGVnX2Rlc3Ryb3kJCWpEZXN0cm95CiAjZGVmaW5lIGpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQJalJlc3luY1Jlc3RhcnQKLSNkZWZpbmUganBlZ19zaW1kX3N1cHBvcnQJalNpU3VwcG9ydAotI2lmbmRlZiBKU0lNRF9NQVNLRlVOQ19OT1RfU1VQUE9SVEVECi0jZGVmaW5lIGpwZWdfc2ltZF9tYXNrCQlqU2lNYXNrCi0jZW5kaWYKLSNpZm5kZWYgSlNJTURfTU9ERUlORk9fTk9UX1NVUFBPUlRFRAotI2RlZmluZSBqcGVnX3NpbWRfY29sb3JfY29udmVydGVyCWpTaUNDb2xvcgotI2RlZmluZSBqcGVnX3NpbWRfZG93bnNhbXBsZXIJCWpTaURvd25zYW1wbGVyCi0jZGVmaW5lIGpwZWdfc2ltZF9mb3J3YXJkX2RjdAkJalNpRkRDVAotI2RlZmluZSBqcGVnX3NpbWRfY29sb3JfZGVjb252ZXJ0ZXIJalNpRENvbG9yCi0jZGVmaW5lIGpwZWdfc2ltZF91cHNhbXBsZXIJCWpTaVVwc2FtcGxlcgotI2RlZmluZSBqcGVnX3NpbWRfaW52ZXJzZV9kY3QJCWpTaUlEQ1QKLSNlbmRpZiAvKiAhSlNJTURfTU9ERUlORk9fTk9UX1NVUFBPUlRFRCAqLwogI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KIAogCkBAIC0xMDc2LDI0ICsxMDM3LDYgQEAKIEVYVEVSTihib29sZWFuKSBqcGVnX3Jlc3luY190b19yZXN0YXJ0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKIAkJCQkJICAgIGludCBkZXNpcmVkKSk7CiAKLS8qIFNJTUQgRXh0OiByZXRyaWV2ZSBTSU1EL0NQVSBpbmZvcm1hdGlvbiAqLwotRVhURVJOKHVuc2lnbmVkIGludCkganBlZ19zaW1kX3N1cHBvcnQgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLSNpZm5kZWYgSlNJTURfTUFTS0ZVTkNfTk9UX1NVUFBPUlRFRAotRVhURVJOKHVuc2lnbmVkIGludCkganBlZ19zaW1kX21hc2sKLQlKUFAoKGpfY29tbW9uX3B0ciBjaW5mbywgdW5zaWduZWQgaW50IHJlbW92ZSwgdW5zaWduZWQgaW50IGFkZCkpOwotI2VuZGlmCi0jaWZuZGVmIEpTSU1EX01PREVJTkZPX05PVF9TVVBQT1JURUQKLUVYVEVSTih1bnNpZ25lZCBpbnQpIGpwZWdfc2ltZF9jb2xvcl9jb252ZXJ0ZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHVuc2lnbmVkIGludCkganBlZ19zaW1kX2Rvd25zYW1wbGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih1bnNpZ25lZCBpbnQpIGpwZWdfc2ltZF9mb3J3YXJkX2RjdCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkJaW50IG1ldGhvZCkpOwotRVhURVJOKHVuc2lnbmVkIGludCkganBlZ19zaW1kX2NvbG9yX2RlY29udmVydGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHVuc2lnbmVkIGludCkganBlZ19zaW1kX3Vwc2FtcGxlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICAgIGludCBkb19mYW5jeSkpOwotRVhURVJOKHVuc2lnbmVkIGludCkganBlZ19zaW1kX2ludmVyc2VfZGN0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJCWludCBtZXRob2QpKTsKLSNlbmRpZiAvKiAhSlNJTURfTU9ERUlORk9fTk9UX1NVUFBPUlRFRCAqLwotCiAKIC8qIFRoZXNlIG1hcmtlciBjb2RlcyBhcmUgZXhwb3J0ZWQgc2luY2UgYXBwbGljYXRpb25zIGFuZCBkYXRhIHNvdXJjZSBtb2R1bGVzCiAgKiBhcmUgbGlrZWx5IHRvIHdhbnQgdG8gdXNlIHRoZW0uCkBAIC0xMTUwLDggKzEwOTMsNCBAQAogI2luY2x1ZGUgImplcnJvci5oIgkJLyogZmV0Y2ggZXJyb3IgY29kZXMgdG9vICovCiAjZW5kaWYKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQogI2VuZGlmIC8qIEpQRUdMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvanBlZ3RyYW4uMSBiL2pwZWd0cmFuLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZTE4ZTIuLjAwMDAwMDAKLS0tIGEvanBlZ3RyYW4uMQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0uVEggSlBFR1RSQU4gMSAiMyBBdWd1c3QgMTk5NyIKLS5TSCBOQU1FCi1qcGVndHJhbiBcLSBsb3NzbGVzcyB0cmFuc2Zvcm1hdGlvbiBvZiBKUEVHIGZpbGVzCi0uU0ggU1lOT1BTSVMKLS5CIGpwZWd0cmFuCi1bCi0uSSBvcHRpb25zCi1dCi1bCi0uSSBmaWxlbmFtZQotXQotLkxQCi0uU0ggREVTQ1JJUFRJT04KLS5MUAotLkIganBlZ3RyYW4KLXBlcmZvcm1zIHZhcmlvdXMgdXNlZnVsIHRyYW5zZm9ybWF0aW9ucyBvZiBKUEVHIGZpbGVzLgotSXQgY2FuIHRyYW5zbGF0ZSB0aGUgY29kZWQgcmVwcmVzZW50YXRpb24gZnJvbSBvbmUgdmFyaWFudCBvZiBKUEVHIHRvIGFub3RoZXIsCi1mb3IgZXhhbXBsZSBmcm9tIGJhc2VsaW5lIEpQRUcgdG8gcHJvZ3Jlc3NpdmUgSlBFRyBvciB2aWNlIHZlcnNhLiAgSXQgY2FuIGFsc28KLXBlcmZvcm0gc29tZSByZWFycmFuZ2VtZW50cyBvZiB0aGUgaW1hZ2UgZGF0YSwgZm9yIGV4YW1wbGUgdHVybmluZyBhbiBpbWFnZQotZnJvbSBsYW5kc2NhcGUgdG8gcG9ydHJhaXQgZm9ybWF0IGJ5IHJvdGF0aW9uLgotLlBQCi0uQiBqcGVndHJhbgotd29ya3MgYnkgcmVhcnJhbmdpbmcgdGhlIGNvbXByZXNzZWQgZGF0YSAoRENUIGNvZWZmaWNpZW50cyksIHdpdGhvdXQKLWV2ZXIgZnVsbHkgZGVjb2RpbmcgdGhlIGltYWdlLiAgVGhlcmVmb3JlLCBpdHMgdHJhbnNmb3JtYXRpb25zIGFyZSBsb3NzbGVzczoKLXRoZXJlIGlzIG5vIGltYWdlIGRlZ3JhZGF0aW9uIGF0IGFsbCwgd2hpY2ggd291bGQgbm90IGJlIHRydWUgaWYgeW91IHVzZWQKLS5CIGRqcGVnCi1mb2xsb3dlZCBieQotLkIgY2pwZWcKLXRvIGFjY29tcGxpc2ggdGhlIHNhbWUgY29udmVyc2lvbi4gIEJ1dCBieSB0aGUgc2FtZSB0b2tlbiwKLS5CIGpwZWd0cmFuCi1jYW5ub3QgcGVyZm9ybSBsb3NzeSBvcGVyYXRpb25zIHN1Y2ggYXMgY2hhbmdpbmcgdGhlIGltYWdlIHF1YWxpdHkuCi0uUFAKLS5CIGpwZWd0cmFuCi1yZWFkcyB0aGUgbmFtZWQgSlBFRy9KRklGIGZpbGUsIG9yIHRoZSBzdGFuZGFyZCBpbnB1dCBpZiBubyBmaWxlIGlzCi1uYW1lZCwgYW5kIHByb2R1Y2VzIGEgSlBFRy9KRklGIGZpbGUgb24gdGhlIHN0YW5kYXJkIG91dHB1dC4KLS5TSCBPUFRJT05TCi1BbGwgc3dpdGNoIG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZDsgZm9yIGV4YW1wbGUsCi0uQiBcLW9wdGltaXplCi1tYXkgYmUgd3JpdHRlbgotLkIgXC1vcHQKLW9yCi0uQlIgXC1vIC4KLVVwcGVyIGFuZCBsb3dlciBjYXNlIGFyZSBlcXVpdmFsZW50LgotQnJpdGlzaCBzcGVsbGluZ3MgYXJlIGFsc28gYWNjZXB0ZWQgKGUuZy4sCi0uQlIgXC1vcHRpbWlzZSApLAotdGhvdWdoIGZvciBicmV2aXR5IHRoZXNlIGFyZSBub3QgbWVudGlvbmVkIGJlbG93LgotLlBQCi1UbyBzcGVjaWZ5IHRoZSBjb2RlZCBKUEVHIHJlcHJlc2VudGF0aW9uIHVzZWQgaW4gdGhlIG91dHB1dCBmaWxlLAotLkIganBlZ3RyYW4KLWFjY2VwdHMgYSBzdWJzZXQgb2YgdGhlIHN3aXRjaGVzIHJlY29nbml6ZWQgYnkKLS5CUiBjanBlZyA6Ci0uVFAKLS5CIFwtb3B0aW1pemUKLVBlcmZvcm0gb3B0aW1pemF0aW9uIG9mIGVudHJvcHkgZW5jb2RpbmcgcGFyYW1ldGVycy4KLS5UUAotLkIgXC1wcm9ncmVzc2l2ZQotQ3JlYXRlIHByb2dyZXNzaXZlIEpQRUcgZmlsZS4KLS5UUAotLkJJIFwtcmVzdGFydCAiIE4iCi1FbWl0IGEgSlBFRyByZXN0YXJ0IG1hcmtlciBldmVyeSBOIE1DVSByb3dzLCBvciBldmVyeSBOIE1DVSBibG9ja3MgaWYgIkIiIGlzCi1hdHRhY2hlZCB0byB0aGUgbnVtYmVyLgotLlRQCi0uQkkgXC1zY2FucyAiIGZpbGUiCi1Vc2UgdGhlIHNjYW4gc2NyaXB0IGdpdmVuIGluIHRoZSBzcGVjaWZpZWQgdGV4dCBmaWxlLgotLlBQCi1TZWUKLS5CUiBjanBlZyAoMSkKLWZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhlc2Ugc3dpdGNoZXMuCi1JZiB5b3Ugc3BlY2lmeSBub25lIG9mIHRoZXNlIHN3aXRjaGVzLCB5b3UgZ2V0IGEgcGxhaW4gYmFzZWxpbmUtSlBFRyBvdXRwdXQKLWZpbGUuICBUaGUgcXVhbGl0eSBzZXR0aW5nIGFuZCBzbyBmb3J0aCBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgaW5wdXQgZmlsZS4KLS5QUAotVGhlIGltYWdlIGNhbiBiZSBsb3NzbGVzc2x5IHRyYW5zZm9ybWVkIGJ5IGdpdmluZyBvbmUgb2YgdGhlc2Ugc3dpdGNoZXM6Ci0uVFAKLS5CIFwtZmxpcCBob3Jpem9udGFsCi1NaXJyb3IgaW1hZ2UgaG9yaXpvbnRhbGx5IChsZWZ0LXJpZ2h0KS4KLS5UUAotLkIgXC1mbGlwIHZlcnRpY2FsCi1NaXJyb3IgaW1hZ2UgdmVydGljYWxseSAodG9wLWJvdHRvbSkuCi0uVFAKLS5CIFwtcm90YXRlIDkwCi1Sb3RhdGUgaW1hZ2UgOTAgZGVncmVlcyBjbG9ja3dpc2UuCi0uVFAKLS5CIFwtcm90YXRlIDE4MAotUm90YXRlIGltYWdlIDE4MCBkZWdyZWVzLgotLlRQCi0uQiBcLXJvdGF0ZSAyNzAKLVJvdGF0ZSBpbWFnZSAyNzAgZGVncmVlcyBjbG9ja3dpc2UgKG9yIDkwIGNjdykuCi0uVFAKLS5CIFwtdHJhbnNwb3NlCi1UcmFuc3Bvc2UgaW1hZ2UgKGFjcm9zcyBVTC10by1MUiBheGlzKS4KLS5UUAotLkIgXC10cmFuc3ZlcnNlCi1UcmFuc3ZlcnNlIHRyYW5zcG9zZSAoYWNyb3NzIFVSLXRvLUxMIGF4aXMpLgotLlBQCi1UaGUgdHJhbnNwb3NlIHRyYW5zZm9ybWF0aW9uIGhhcyBubyByZXN0cmljdGlvbnMgcmVnYXJkaW5nIGltYWdlIGRpbWVuc2lvbnMuCi1UaGUgb3RoZXIgdHJhbnNmb3JtYXRpb25zIG9wZXJhdGUgcmF0aGVyIG9kZGx5IGlmIHRoZSBpbWFnZSBkaW1lbnNpb25zIGFyZSBub3QKLWEgbXVsdGlwbGUgb2YgdGhlIGlNQ1Ugc2l6ZSAodXN1YWxseSA4IG9yIDE2IHBpeGVscyksIGJlY2F1c2UgdGhleSBjYW4gb25seQotdHJhbnNmb3JtIGNvbXBsZXRlIGJsb2NrcyBvZiBEQ1QgY29lZmZpY2llbnQgZGF0YSBpbiB0aGUgZGVzaXJlZCB3YXkuCi0uUFAKLS5CUiBqcGVndHJhbiAncwotZGVmYXVsdCBiZWhhdmlvciB3aGVuIHRyYW5zZm9ybWluZyBhbiBvZGQtc2l6ZSBpbWFnZSBpcyBkZXNpZ25lZAotdG8gcHJlc2VydmUgZXhhY3QgcmV2ZXJzaWJpbGl0eSBhbmQgbWF0aGVtYXRpY2FsIGNvbnNpc3RlbmN5IG9mIHRoZQotdHJhbnNmb3JtYXRpb24gc2V0LiAgQXMgc3RhdGVkLCB0cmFuc3Bvc2UgaXMgYWJsZSB0byBmbGlwIHRoZSBlbnRpcmUgaW1hZ2UKLWFyZWEuICBIb3Jpem9udGFsIG1pcnJvcmluZyBsZWF2ZXMgYW55IHBhcnRpYWwgaU1DVSBjb2x1bW4gYXQgdGhlIHJpZ2h0IGVkZ2UKLXVudG91Y2hlZCwgYnV0IGlzIGFibGUgdG8gZmxpcCBhbGwgcm93cyBvZiB0aGUgaW1hZ2UuICBTaW1pbGFybHksIHZlcnRpY2FsCi1taXJyb3JpbmcgbGVhdmVzIGFueSBwYXJ0aWFsIGlNQ1Ugcm93IGF0IHRoZSBib3R0b20gZWRnZSB1bnRvdWNoZWQsIGJ1dCBpcwotYWJsZSB0byBmbGlwIGFsbCBjb2x1bW5zLiAgVGhlIG90aGVyIHRyYW5zZm9ybXMgY2FuIGJlIGJ1aWx0IHVwIGFzIHNlcXVlbmNlcwotb2YgdHJhbnNwb3NlIGFuZCBmbGlwIG9wZXJhdGlvbnM7IGZvciBjb25zaXN0ZW5jeSwgdGhlaXIgYWN0aW9ucyBvbiBlZGdlCi1waXhlbHMgYXJlIGRlZmluZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIGVuZCByZXN1bHQgb2YgdGhlIGNvcnJlc3BvbmRpbmcKLXRyYW5zcG9zZS1hbmQtZmxpcCBzZXF1ZW5jZS4KLS5QUAotRm9yIHByYWN0aWNhbCB1c2UsIHlvdSBtYXkgcHJlZmVyIHRvIGRpc2NhcmQgYW55IHVudHJhbnNmb3JtYWJsZSBlZGdlIHBpeGVscwotcmF0aGVyIHRoYW4gaGF2aW5nIGEgc3RyYW5nZS1sb29raW5nIHN0cmlwIGFsb25nIHRoZSByaWdodCBhbmQvb3IgYm90dG9tIGVkZ2VzCi1vZiBhIHRyYW5zZm9ybWVkIGltYWdlLiAgVG8gZG8gdGhpcywgYWRkIHRoZQotLkIgXC10cmltCi1zd2l0Y2g6Ci0uVFAKLS5CIFwtdHJpbQotRHJvcCBub24tdHJhbnNmb3JtYWJsZSBlZGdlIGJsb2Nrcy4KLS5QUAotT2J2aW91c2x5LCBhIHRyYW5zZm9ybWF0aW9uIHdpdGgKLS5CIFwtdHJpbQotaXMgbm90IHJldmVyc2libGUsIHNvIHN0cmljdGx5IHNwZWFraW5nCi0uQiBqcGVndHJhbgotd2l0aCB0aGlzIHN3aXRjaCBpcyBub3QgbG9zc2xlc3MuICBBbHNvLCB0aGUgZXhwZWN0ZWQgbWF0aGVtYXRpY2FsCi1lcXVpdmFsZW5jZXMgYmV0d2VlbiB0aGUgdHJhbnNmb3JtYXRpb25zIG5vIGxvbmdlciBob2xkLiAgRm9yIGV4YW1wbGUsCi0uQiBcLXJvdCAyNzAgLXRyaW0KLXRyaW1zIG9ubHkgdGhlIGJvdHRvbSBlZGdlLCBidXQKLS5CIFwtcm90IDkwIC10cmltCi1mb2xsb3dlZCBieQotLkIgXC1yb3QgMTgwIC10cmltCi10cmltcyBib3RoIGVkZ2VzLgotLlBQCi1Bbm90aGVyIG5vdC1zdHJpY3RseS1sb3NzbGVzcyB0cmFuc2Zvcm1hdGlvbiBzd2l0Y2ggaXM6Ci0uVFAKLS5CIFwtZ3JheXNjYWxlCi1Gb3JjZSBncmF5c2NhbGUgb3V0cHV0LgotLlBQCi1UaGlzIG9wdGlvbiBkaXNjYXJkcyB0aGUgY2hyb21pbmFuY2UgY2hhbm5lbHMgaWYgdGhlIGlucHV0IGltYWdlIGlzIFlDYkNyCi0oaWUsIGEgc3RhbmRhcmQgY29sb3IgSlBFRyksIHJlc3VsdGluZyBpbiBhIGdyYXlzY2FsZSBKUEVHIGZpbGUuICBUaGUKLWx1bWluYW5jZSBjaGFubmVsIGlzIHByZXNlcnZlZCBleGFjdGx5LCBzbyB0aGlzIGlzIGEgYmV0dGVyIG1ldGhvZCBvZiByZWR1Y2luZwotdG8gZ3JheXNjYWxlIHRoYW4gZGVjb21wcmVzc2lvbiwgY29udmVyc2lvbiwgYW5kIHJlY29tcHJlc3Npb24uICBUaGlzIHN3aXRjaAotaXMgcGFydGljdWxhcmx5IGhhbmR5IGZvciBmaXhpbmcgYSBtb25vY2hyb21lIHBpY3R1cmUgdGhhdCB3YXMgbWlzdGFrZW5seQotZW5jb2RlZCBhcyBhIGNvbG9yIEpQRUcuICAoSW4gc3VjaCBhIGNhc2UsIHRoZSBzcGFjZSBzYXZpbmdzIGZyb20gZ2V0dGluZyByaWQKLW9mIHRoZSBuZWFyLWVtcHR5IGNocm9tYSBjaGFubmVscyB3b24ndCBiZSBsYXJnZTsgYnV0IHRoZSBkZWNvZGluZyB0aW1lIGZvcgotYSBncmF5c2NhbGUgSlBFRyBpcyBzdWJzdGFudGlhbGx5IGxlc3MgdGhhbiB0aGF0IGZvciBhIGNvbG9yIEpQRUcuKQotLlBQCi0uQiBqcGVndHJhbgotYWxzbyByZWNvZ25pemVzIHRoZXNlIHN3aXRjaGVzIHRoYXQgY29udHJvbCB3aGF0IHRvIGRvIHdpdGggImV4dHJhIiBtYXJrZXJzLAotc3VjaCBhcyBjb21tZW50IGJsb2NrczoKLS5UUAotLkIgXC1jb3B5IG5vbmUKLUNvcHkgbm8gZXh0cmEgbWFya2VycyBmcm9tIHNvdXJjZSBmaWxlLiAgVGhpcyBzZXR0aW5nIHN1cHByZXNzZXMgYWxsCi1jb21tZW50cyBhbmQgb3RoZXIgZXhjZXNzIGJhZ2dhZ2UgcHJlc2VudCBpbiB0aGUgc291cmNlIGZpbGUuCi0uVFAKLS5CIFwtY29weSBjb21tZW50cwotQ29weSBvbmx5IGNvbW1lbnQgbWFya2Vycy4gIFRoaXMgc2V0dGluZyBjb3BpZXMgY29tbWVudHMgZnJvbSB0aGUgc291cmNlIGZpbGUsCi1idXQgZGlzY2FyZHMgYW55IG90aGVyIGluZXNzZW50aWFsIGRhdGEuCi0uVFAKLS5CIFwtY29weSBhbGwKLUNvcHkgYWxsIGV4dHJhIG1hcmtlcnMuICBUaGlzIHNldHRpbmcgcHJlc2VydmVzIG1pc2NlbGxhbmVvdXMgbWFya2VycwotZm91bmQgaW4gdGhlIHNvdXJjZSBmaWxlLCBzdWNoIGFzIEpGSUYgdGh1bWJuYWlscyBhbmQgUGhvdG9zaG9wIHNldHRpbmdzLgotSW4gc29tZSBmaWxlcyB0aGVzZSBleHRyYSBtYXJrZXJzIGNhbiBiZSBzaXphYmxlLgotLlBQCi1UaGUgZGVmYXVsdCBiZWhhdmlvciBpcwotLkJSICJcLWNvcHkgY29tbWVudHMiIC4KLShOb3RlOiBpbiBJSkcgcmVsZWFzZXMgdjYgYW5kIHY2YSwKLS5CIGpwZWd0cmFuCi1hbHdheXMgZGlkIHRoZSBlcXVpdmFsZW50IG9mCi0uQlIgIlwtY29weSBub25lIiAuKQotLlBQCi1BZGRpdGlvbmFsIHN3aXRjaGVzIHJlY29nbml6ZWQgYnkganBlZ3RyYW4gYXJlOgotLlRQCi0uQkkgXC1tYXhtZW1vcnkgIiBOIgotU2V0IGxpbWl0IGZvciBhbW91bnQgb2YgbWVtb3J5IHRvIHVzZSBpbiBwcm9jZXNzaW5nIGxhcmdlIGltYWdlcy4gIFZhbHVlIGlzCi1pbiB0aG91c2FuZHMgb2YgYnl0ZXMsIG9yIG1pbGxpb25zIG9mIGJ5dGVzIGlmICJNIiBpcyBhdHRhY2hlZCB0byB0aGUKLW51bWJlci4gIEZvciBleGFtcGxlLAotLkIgXC1tYXggNG0KLXNlbGVjdHMgNDAwMDAwMCBieXRlcy4gIElmIG1vcmUgc3BhY2UgaXMgbmVlZGVkLCB0ZW1wb3JhcnkgZmlsZXMgd2lsbCBiZSB1c2VkLgotLlRQCi0uQkkgXC1vdXRmaWxlICIgbmFtZSIKLVNlbmQgb3V0cHV0IGltYWdlIHRvIHRoZSBuYW1lZCBmaWxlLCBub3QgdG8gc3RhbmRhcmQgb3V0cHV0LgotLlRQCi0uQiBcLXZlcmJvc2UKLUVuYWJsZSBkZWJ1ZyBwcmludG91dC4gIE1vcmUKLS5CUiBcLXYgJ3MKLWdpdmUgbW9yZSBvdXRwdXQuICBBbHNvLCB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIHByaW50ZWQgYXQgc3RhcnR1cC4KLS5UUAotLkIgXC1kZWJ1ZwotU2FtZSBhcwotLkJSIFwtdmVyYm9zZSAuCi0uU0ggRVhBTVBMRVMKLS5MUAotVGhpcyBleGFtcGxlIGNvbnZlcnRzIGEgYmFzZWxpbmUgSlBFRyBmaWxlIHRvIHByb2dyZXNzaXZlIGZvcm06Ci0uSVAKLS5CIGpwZWd0cmFuIFwtcHJvZ3Jlc3NpdmUKLS5JIGZvby5qcGcKLS5CID4KLS5JIGZvb3Byb2cuanBnCi0uUFAKLVRoaXMgZXhhbXBsZSByb3RhdGVzIGFuIGltYWdlIDkwIGRlZ3JlZXMgY2xvY2t3aXNlLCBkaXNjYXJkaW5nIGFueQotdW5yb3RhdGFibGUgZWRnZSBwaXhlbHM6Ci0uSVAKLS5CIGpwZWd0cmFuIFwtcm90IDkwIC10cmltCi0uSSBmb28uanBnCi0uQiA+Ci0uSSBmb285MC5qcGcKLS5TSCBFTlZJUk9OTUVOVAotLlRQCi0uQiBKUEVHTUVNCi1JZiB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCwgaXRzIHZhbHVlIGlzIHRoZSBkZWZhdWx0IG1lbW9yeSBsaW1pdC4KLVRoZSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXMgZGVzY3JpYmVkIGZvciB0aGUKLS5CIFwtbWF4bWVtb3J5Ci1zd2l0Y2guCi0uQiBKUEVHTUVNCi1vdmVycmlkZXMgdGhlIGRlZmF1bHQgdmFsdWUgc3BlY2lmaWVkIHdoZW4gdGhlIHByb2dyYW0gd2FzIGNvbXBpbGVkLCBhbmQKLWl0c2VsZiBpcyBvdmVycmlkZGVuIGJ5IGFuIGV4cGxpY2l0Ci0uQlIgXC1tYXhtZW1vcnkgLgotLlNIIFNFRSBBTFNPCi0uQlIgY2pwZWcgKDEpLAotLkJSIGRqcGVnICgxKSwKLS5CUiByZGpwZ2NvbSAoMSksCi0uQlIgd3JqcGdjb20gKDEpCi0uYnIKLVdhbGxhY2UsIEdyZWdvcnkgSy4gICJUaGUgSlBFRyBTdGlsbCBQaWN0dXJlIENvbXByZXNzaW9uIFN0YW5kYXJkIiwKLUNvbW11bmljYXRpb25zIG9mIHRoZSBBQ00sIEFwcmlsIDE5OTEgKHZvbC4gMzQsIG5vLiA0KSwgcHAuIDMwLTQ0LgotLlNIIEFVVEhPUgotSW5kZXBlbmRlbnQgSlBFRyBHcm91cAotLlNIIEJVR1MKLUFyaXRobWV0aWMgY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGxlZ2FsIHJlYXNvbnMuCi0uUFAKLVRoZSB0cmFuc2Zvcm0gb3B0aW9ucyBjYW4ndCB0cmFuc2Zvcm0gb2RkLXNpemUgaW1hZ2VzIHBlcmZlY3RseS4gIFVzZQotLkIgXC10cmltCi1pZiB5b3UgZG9uJ3QgbGlrZSB0aGUgcmVzdWx0cyB3aXRob3V0IGl0LgotLlBQCi1UaGUgZW50aXJlIGltYWdlIGlzIHJlYWQgaW50byBtZW1vcnkgYW5kIHRoZW4gd3JpdHRlbiBvdXQgYWdhaW4sIGV2ZW4gaW4KLWNhc2VzIHdoZXJlIHRoaXMgaXNuJ3QgcmVhbGx5IG5lY2Vzc2FyeS4gIEV4cGVjdCBzd2FwcGluZyBvbiBsYXJnZSBpbWFnZXMsCi1lc3BlY2lhbGx5IHdoZW4gdXNpbmcgdGhlIG1vcmUgY29tcGxleCB0cmFuc2Zvcm0gb3B0aW9ucy4KZGlmZiAtLWdpdCBhL2pwZWd0cmFuLmMgYi9qcGVndHJhbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGVmMTExLi4wMDAwMDAwCi0tLSBhL2pwZWd0cmFuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotLyoKLSAqIGpwZWd0cmFuLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhIGNvbW1hbmQtbGluZSB1c2VyIGludGVyZmFjZSBmb3IgSlBFRyB0cmFuc2NvZGluZy4KLSAqIEl0IGlzIHZlcnkgc2ltaWxhciB0byBjanBlZy5jLCBidXQgcHJvdmlkZXMgbG9zc2xlc3MgdHJhbnNjb2RpbmcgYmV0d2VlbgotICogZGlmZmVyZW50IEpQRUcgZmlsZSBmb3JtYXRzLiAgSXQgYWxzbyBwcm92aWRlcyBzb21lIGxvc3NsZXNzIGFuZCBzb3J0LW9mLQotICogbG9zc2xlc3MgdHJhbnNmb3JtYXRpb25zIG9mIEpQRUcgZGF0YS4KLSAqLwotCi0jaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLwotI2luY2x1ZGUgInRyYW5zdXBwLmgiCQkvKiBTdXBwb3J0IHJvdXRpbmVzIGZvciBqcGVndHJhbiAqLwotI2luY2x1ZGUgImp2ZXJzaW9uLmgiCQkvKiBmb3IgdmVyc2lvbiBtZXNzYWdlICovCi0KLSNpZmRlZiBVU0VfQ0NPTU1BTkQJCS8qIGNvbW1hbmQtbGluZSByZWFkZXIgZm9yIE1hY2ludG9zaCAqLwotI2lmZGVmIF9fTVdFUktTX18KLSNpbmNsdWRlIDxTSU9VWC5oPiAgICAgICAgICAgICAgLyogTWV0cm93ZXJrcyBuZWVkcyB0aGlzICovCi0jaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogLi4uIGFuZCB0aGlzICovCi0jZW5kaWYKLSNpZmRlZiBUSElOS19DCi0jaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogVGhpbmsgZGVjbGFyZXMgaXQgaGVyZSAqLwotI2VuZGlmCi0jZW5kaWYKLQotCi0vKgotICogQXJndW1lbnQtcGFyc2luZyBjb2RlLgotICogVGhlIHN3aXRjaCBwYXJzZXIgaXMgZGVzaWduZWQgdG8gYmUgdXNlZnVsIHdpdGggRE9TLXN0eWxlIGNvbW1hbmQgbGluZQotICogc3ludGF4LCBpZSwgaW50ZXJtaXhlZCBzd2l0Y2hlcyBhbmQgZmlsZSBuYW1lcywgd2hlcmUgb25seSB0aGUgc3dpdGNoZXMKLSAqIHRvIHRoZSBsZWZ0IG9mIGEgZ2l2ZW4gZmlsZSBuYW1lIGFmZmVjdCBwcm9jZXNzaW5nIG9mIHRoYXQgZmlsZS4KLSAqIFRoZSBtYWluIHByb2dyYW0gaW4gdGhpcyBmaWxlIGRvZXNuJ3QgYWN0dWFsbHkgdXNlIHRoaXMgY2FwYWJpbGl0eS4uLgotICovCi0KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBwcm9nbmFtZTsJLyogcHJvZ3JhbSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcyAqLwotc3RhdGljIGNoYXIgKiBvdXRmaWxlbmFtZTsJLyogZm9yIC1vdXRmaWxlIHN3aXRjaCAqLwotc3RhdGljIEpDT1BZX09QVElPTiBjb3B5b3B0aW9uOwkvKiAtY29weSBzd2l0Y2ggKi8KLXN0YXRpYyBqcGVnX3RyYW5zZm9ybV9pbmZvIHRyYW5zZm9ybW9wdGlvbjsgLyogaW1hZ2UgdHJhbnNmb3JtYXRpb24gb3B0aW9ucyAqLwotCi0KLUxPQ0FMKHZvaWQpCi11c2FnZSAodm9pZCkKLS8qIGNvbXBsYWluIGFib3V0IGJhZCBjb21tYW5kIGxpbmUgKi8KLXsKLSAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgW3N3aXRjaGVzXSAiLCBwcm9nbmFtZSk7Ci0jaWZkZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKLSAgZnByaW50ZihzdGRlcnIsICJpbnB1dGZpbGUgb3V0cHV0ZmlsZVxuIik7Ci0jZWxzZQotICBmcHJpbnRmKHN0ZGVyciwgIltpbnB1dGZpbGVdXG4iKTsKLSNlbmRpZgotCi0gIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgKG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCk6XG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1jb3B5IG5vbmUgICAgIENvcHkgbm8gZXh0cmEgbWFya2VycyBmcm9tIHNvdXJjZSBmaWxlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1jb3B5IGNvbW1lbnRzIENvcHkgb25seSBjb21tZW50IG1hcmtlcnMgKGRlZmF1bHQpXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1jb3B5IGFsbCAgICAgIENvcHkgYWxsIGV4dHJhIG1hcmtlcnNcbiIpOwotI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW9wdGltaXplICAgICAgT3B0aW1pemUgSHVmZm1hbiB0YWJsZSAoc21hbGxlciBmaWxlLCBidXQgc2xvdyBjb21wcmVzc2lvbilcbiIpOwotI2VuZGlmCi0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1wcm9ncmVzc2l2ZSAgIENyZWF0ZSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGVcbiIpOwotI2VuZGlmCi0jaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3IgbW9kaWZ5aW5nIHRoZSBpbWFnZTpcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWdyYXlzY2FsZSAgICAgUmVkdWNlIHRvIGdyYXlzY2FsZSAob21pdCBjb2xvciBkYXRhKVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtZmxpcCBbaG9yaXpvbnRhbHx2ZXJ0aWNhbF0gIE1pcnJvciBpbWFnZSAobGVmdC1yaWdodCBvciB0b3AtYm90dG9tKVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtcm90YXRlIFs5MHwxODB8MjcwXSAgICAgICAgIFJvdGF0ZSBpbWFnZSAoZGVncmVlcyBjbG9ja3dpc2UpXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC10cmFuc3Bvc2UgICAgIFRyYW5zcG9zZSBpbWFnZVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtdHJhbnN2ZXJzZSAgICBUcmFuc3ZlcnNlIHRyYW5zcG9zZSBpbWFnZVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtdHJpbSAgICAgICAgICBEcm9wIG5vbi10cmFuc2Zvcm1hYmxlIGVkZ2UgYmxvY2tzXG4iKTsKLSNlbmRpZiAvKiBUUkFOU0ZPUk1TX1NVUFBPUlRFRCAqLwotICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIGZvciBhZHZhbmNlZCB1c2VyczpcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJlc3RhcnQgTiAgICAgU2V0IHJlc3RhcnQgaW50ZXJ2YWwgaW4gcm93cywgb3IgaW4gYmxvY2tzIHdpdGggQlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtbWF4bWVtb3J5IE4gICBNYXhpbXVtIG1lbW9yeSB0byB1c2UgKGluIGtieXRlcylcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW91dGZpbGUgbmFtZSAgU3BlY2lmeSBuYW1lIGZvciBvdXRwdXQgZmlsZVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtdmVyYm9zZSAgb3IgIC1kZWJ1ZyAgIEVtaXQgZGVidWcgb3V0cHV0XG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3Igd2l6YXJkczpcbiIpOwotI2lmZGVmIENfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWFyaXRobWV0aWMgICAgVXNlIGFyaXRobWV0aWMgY29kaW5nXG4iKTsKLSNlbmRpZgotI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXNjYW5zIGZpbGUgICAgQ3JlYXRlIG11bHRpLXNjYW4gSlBFRyBwZXIgc2NyaXB0IGZpbGVcbiIpOwotI2VuZGlmCi0gIGV4aXQoRVhJVF9GQUlMVVJFKTsKLX0KLQotCi1MT0NBTCh2b2lkKQotc2VsZWN0X3RyYW5zZm9ybSAoSlhGT1JNX0NPREUgdHJhbnNmb3JtKQotLyogU2lsbHkgbGl0dGxlIHJvdXRpbmUgdG8gZGV0ZWN0IG11bHRpcGxlIHRyYW5zZm9ybSBvcHRpb25zLAotICogd2hpY2ggd2UgY2FuJ3QgaGFuZGxlLgotICovCi17Ci0jaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKLSAgaWYgKHRyYW5zZm9ybW9wdGlvbi50cmFuc2Zvcm0gPT0gSlhGT1JNX05PTkUgfHwKLSAgICAgIHRyYW5zZm9ybW9wdGlvbi50cmFuc2Zvcm0gPT0gdHJhbnNmb3JtKSB7Ci0gICAgdHJhbnNmb3Jtb3B0aW9uLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKLSAgfSBlbHNlIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4gb25seSBkbyBvbmUgaW1hZ2UgdHJhbnNmb3JtYXRpb24gYXQgYSB0aW1lXG4iLAotCSAgICBwcm9nbmFtZSk7Ci0gICAgdXNhZ2UoKTsKLSAgfQotI2Vsc2UKLSAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIGltYWdlIHRyYW5zZm9ybWF0aW9uIHdhcyBub3QgY29tcGlsZWRcbiIsCi0JICBwcm9nbmFtZSk7Ci0gIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSNlbmRpZgotfQotCi0KLUxPQ0FMKGludCkKLXBhcnNlX3N3aXRjaGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAotCQlpbnQgbGFzdF9maWxlX2FyZ19zZWVuLCBib29sZWFuIGZvcl9yZWFsKQotLyogUGFyc2Ugb3B0aW9uYWwgc3dpdGNoZXMuCi0gKiBSZXR1cm5zIGFyZ3ZbXSBpbmRleCBvZiBmaXJzdCBmaWxlLW5hbWUgYXJndW1lbnQgKD09IGFyZ2MgaWYgbm9uZSkuCi0gKiBBbnkgZmlsZSBuYW1lcyB3aXRoIGluZGV4ZXMgPD0gbGFzdF9maWxlX2FyZ19zZWVuIGFyZSBpZ25vcmVkOwotICogdGhleSBoYXZlIHByZXN1bWFibHkgYmVlbiBwcm9jZXNzZWQgaW4gYSBwcmV2aW91cyBpdGVyYXRpb24uCi0gKiAoUGFzcyAwIGZvciBsYXN0X2ZpbGVfYXJnX3NlZW4gb24gdGhlIGZpcnN0IG9yIG9ubHkgaXRlcmF0aW9uLikKLSAqIGZvcl9yZWFsIGlzIEZBTFNFIG9uIHRoZSBmaXJzdCAoZHVtbXkpIHBhc3M7IHdlIG1heSBza2lwIGFueSBleHBlbnNpdmUKLSAqIHByb2Nlc3NpbmcuCi0gKi8KLXsKLSAgaW50IGFyZ247Ci0gIGNoYXIgKiBhcmc7Ci0gIGJvb2xlYW4gc2ltcGxlX3Byb2dyZXNzaXZlOwotICBjaGFyICogc2NhbnNhcmcgPSBOVUxMOwkvKiBzYXZlcyAtc2NhbnMgcGFybSBpZiBhbnkgKi8KLQotICAvKiBTZXQgdXAgZGVmYXVsdCBKUEVHIHBhcmFtZXRlcnMuICovCi0gIHNpbXBsZV9wcm9ncmVzc2l2ZSA9IEZBTFNFOwotICBvdXRmaWxlbmFtZSA9IE5VTEw7Ci0gIGNvcHlvcHRpb24gPSBKQ09QWU9QVF9ERUZBVUxUOwotICB0cmFuc2Zvcm1vcHRpb24udHJhbnNmb3JtID0gSlhGT1JNX05PTkU7Ci0gIHRyYW5zZm9ybW9wdGlvbi50cmltID0gRkFMU0U7Ci0gIHRyYW5zZm9ybW9wdGlvbi5mb3JjZV9ncmF5c2NhbGUgPSBGQUxTRTsKLSAgY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPSAwOwotCi0gIC8qIFNjYW4gY29tbWFuZCBsaW5lIG9wdGlvbnMsIGFkanVzdCBwYXJhbWV0ZXJzICovCi0KLSAgZm9yIChhcmduID0gMTsgYXJnbiA8IGFyZ2M7IGFyZ24rKykgewotICAgIGFyZyA9IGFyZ3ZbYXJnbl07Ci0gICAgaWYgKCphcmcgIT0gJy0nKSB7Ci0gICAgICAvKiBOb3QgYSBzd2l0Y2gsIG11c3QgYmUgYSBmaWxlIG5hbWUgYXJndW1lbnQgKi8KLSAgICAgIGlmIChhcmduIDw9IGxhc3RfZmlsZV9hcmdfc2VlbikgewotCW91dGZpbGVuYW1lID0gTlVMTDsJLyogLW91dGZpbGUgYXBwbGllcyB0byBqdXN0IG9uZSBpbnB1dCBmaWxlICovCi0JY29udGludWU7CQkvKiBpZ25vcmUgdGhpcyBuYW1lIGlmIHByZXZpb3VzbHkgcHJvY2Vzc2VkICovCi0gICAgICB9Ci0gICAgICBicmVhazsJCQkvKiBlbHNlIGRvbmUgcGFyc2luZyBzd2l0Y2hlcyAqLwotICAgIH0KLSAgICBhcmcrKzsJCQkvKiBhZHZhbmNlIHBhc3Qgc3dpdGNoIG1hcmtlciBjaGFyYWN0ZXIgKi8KLQotICAgIGlmIChrZXltYXRjaChhcmcsICJhcml0aG1ldGljIiwgMSkpIHsKLSAgICAgIC8qIFVzZSBhcml0aG1ldGljIGNvZGluZy4gKi8KLSNpZmRlZiBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQKLSAgICAgIGNpbmZvLT5hcml0aF9jb2RlID0gVFJVRTsKLSNlbHNlCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSwgYXJpdGhtZXRpYyBjb2Rpbmcgbm90IHN1cHBvcnRlZFxuIiwKLQkgICAgICBwcm9nbmFtZSk7Ci0gICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0jZW5kaWYKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiY29weSIsIDEpKSB7Ci0gICAgICAvKiBTZWxlY3Qgd2hpY2ggZXh0cmEgbWFya2VycyB0byBjb3B5LiAqLwotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJub25lIiwgMSkpIHsKLQljb3B5b3B0aW9uID0gSkNPUFlPUFRfTk9ORTsKLSAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImNvbW1lbnRzIiwgMSkpIHsKLQljb3B5b3B0aW9uID0gSkNPUFlPUFRfQ09NTUVOVFM7Ci0gICAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJhbGwiLCAxKSkgewotCWNvcHlvcHRpb24gPSBKQ09QWU9QVF9BTEw7Ci0gICAgICB9IGVsc2UKLQl1c2FnZSgpOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJkZWJ1ZyIsIDEpIHx8IGtleW1hdGNoKGFyZywgInZlcmJvc2UiLCAxKSkgewotICAgICAgLyogRW5hYmxlIGRlYnVnIHByaW50b3V0cy4gKi8KLSAgICAgIC8qIE9uIGZpcnN0IC1kLCBwcmludCB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uICovCi0gICAgICBzdGF0aWMgYm9vbGVhbiBwcmludGVkX3ZlcnNpb24gPSBGQUxTRTsKLQotICAgICAgaWYgKCEgcHJpbnRlZF92ZXJzaW9uKSB7Ci0JZnByaW50ZihzdGRlcnIsICJJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFR1RSQU4sIHZlcnNpb24gJXNcbiVzXG4iLAotCQlKVkVSU0lPTiwgSkNPUFlSSUdIVCk7Ci0JcHJpbnRlZF92ZXJzaW9uID0gVFJVRTsKLSAgICAgIH0KLSAgICAgIGNpbmZvLT5lcnItPnRyYWNlX2xldmVsKys7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImZsaXAiLCAxKSkgewotICAgICAgLyogTWlycm9yIGxlZnQtcmlnaHQgb3IgdG9wLWJvdHRvbS4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiaG9yaXpvbnRhbCIsIDEpKQotCXNlbGVjdF90cmFuc2Zvcm0oSlhGT1JNX0ZMSVBfSCk7Ci0gICAgICBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAidmVydGljYWwiLCAxKSkKLQlzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9GTElQX1YpOwotICAgICAgZWxzZQotCXVzYWdlKCk7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImdyYXlzY2FsZSIsIDEpIHx8IGtleW1hdGNoKGFyZywgImdyZXlzY2FsZSIsMSkpIHsKLSAgICAgIC8qIEZvcmNlIHRvIGdyYXlzY2FsZS4gKi8KLSNpZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAotICAgICAgdHJhbnNmb3Jtb3B0aW9uLmZvcmNlX2dyYXlzY2FsZSA9IFRSVUU7Ci0jZWxzZQotICAgICAgc2VsZWN0X3RyYW5zZm9ybShKWEZPUk1fTk9ORSk7CS8qIGZvcmNlIGFuIGVycm9yICovCi0jZW5kaWYKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibWF4bWVtb3J5IiwgMykpIHsKLSAgICAgIC8qIE1heGltdW0gbWVtb3J5IGluIEtiIChvciBNYiB3aXRoICdtJykuICovCi0gICAgICBsb25nIGx2YWw7Ci0gICAgICBjaGFyIGNoID0gJ3gnOwotCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlbGQlYyIsICZsdmFsLCAmY2gpIDwgMSkKLQl1c2FnZSgpOwotICAgICAgaWYgKGNoID09ICdtJyB8fCBjaCA9PSAnTScpCi0JbHZhbCAqPSAxMDAwTDsKLSAgICAgIGNpbmZvLT5tZW0tPm1heF9tZW1vcnlfdG9fdXNlID0gbHZhbCAqIDEwMDBMOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJvcHRpbWl6ZSIsIDEpIHx8IGtleW1hdGNoKGFyZywgIm9wdGltaXNlIiwgMSkpIHsKLSAgICAgIC8qIEVuYWJsZSBlbnRyb3B5IHBhcm0gb3B0aW1pemF0aW9uLiAqLwotI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAotICAgICAgY2luZm8tPm9wdGltaXplX2NvZGluZyA9IFRSVUU7Ci0jZWxzZQotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIGVudHJvcHkgb3B0aW1pemF0aW9uIHdhcyBub3QgY29tcGlsZWRcbiIsCi0JICAgICAgcHJvZ25hbWUpOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotI2VuZGlmCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm91dGZpbGUiLCA0KSkgewotICAgICAgLyogU2V0IG91dHB1dCBmaWxlIG5hbWUuICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBvdXRmaWxlbmFtZSA9IGFyZ3ZbYXJnbl07CS8qIHNhdmUgaXQgYXdheSBmb3IgbGF0ZXIgdXNlICovCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInByb2dyZXNzaXZlIiwgMSkpIHsKLSAgICAgIC8qIFNlbGVjdCBzaW1wbGUgcHJvZ3Jlc3NpdmUgbW9kZS4gKi8KLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICAgICAgc2ltcGxlX3Byb2dyZXNzaXZlID0gVFJVRTsKLSAgICAgIC8qIFdlIG11c3QgcG9zdHBvbmUgZXhlY3V0aW9uIHVudGlsIG51bV9jb21wb25lbnRzIGlzIGtub3duLiAqLwotI2Vsc2UKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBwcm9ncmVzc2l2ZSBvdXRwdXQgd2FzIG5vdCBjb21waWxlZFxuIiwKLQkgICAgICBwcm9nbmFtZSk7Ci0gICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0jZW5kaWYKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicmVzdGFydCIsIDEpKSB7Ci0gICAgICAvKiBSZXN0YXJ0IGludGVydmFsIGluIE1DVSByb3dzIChvciBpbiBNQ1VzIHdpdGggJ2InKS4gKi8KLSAgICAgIGxvbmcgbHZhbDsKLSAgICAgIGNoYXIgY2ggPSAneCc7Ci0KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVsZCVjIiwgJmx2YWwsICZjaCkgPCAxKQotCXVzYWdlKCk7Ci0gICAgICBpZiAobHZhbCA8IDAgfHwgbHZhbCA+IDY1NTM1TCkKLQl1c2FnZSgpOwotICAgICAgaWYgKGNoID09ICdiJyB8fCBjaCA9PSAnQicpIHsKLQljaW5mby0+cmVzdGFydF9pbnRlcnZhbCA9ICh1bnNpZ25lZCBpbnQpIGx2YWw7Ci0JY2luZm8tPnJlc3RhcnRfaW5fcm93cyA9IDA7IC8qIGVsc2UgcHJpb3IgJy1yZXN0YXJ0IG4nIG92ZXJyaWRlcyBtZSAqLwotICAgICAgfSBlbHNlIHsKLQljaW5mby0+cmVzdGFydF9pbl9yb3dzID0gKGludCkgbHZhbDsKLQkvKiByZXN0YXJ0X2ludGVydmFsIHdpbGwgYmUgY29tcHV0ZWQgZHVyaW5nIHN0YXJ0dXAgKi8KLSAgICAgIH0KLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicm90YXRlIiwgMikpIHsKLSAgICAgIC8qIFJvdGF0ZSA5MCwgMTgwLCBvciAyNzAgZGVncmVlcyAobWVhc3VyZWQgY2xvY2t3aXNlKS4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiOTAiLCAyKSkKLQlzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9ST1RfOTApOwotICAgICAgZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgIjE4MCIsIDMpKQotCXNlbGVjdF90cmFuc2Zvcm0oSlhGT1JNX1JPVF8xODApOwotICAgICAgZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgIjI3MCIsIDMpKQotCXNlbGVjdF90cmFuc2Zvcm0oSlhGT1JNX1JPVF8yNzApOwotICAgICAgZWxzZQotCXVzYWdlKCk7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInNjYW5zIiwgMSkpIHsKLSAgICAgIC8qIFNldCBzY2FuIHNjcmlwdC4gKi8KLSNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIHNjYW5zYXJnID0gYXJndlthcmduXTsKLSAgICAgIC8qIFdlIG11c3QgcG9zdHBvbmUgcmVhZGluZyB0aGUgZmlsZSBpbiBjYXNlIC1wcm9ncmVzc2l2ZSBhcHBlYXJzLiAqLwotI2Vsc2UKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBtdWx0aS1zY2FuIG91dHB1dCB3YXMgbm90IGNvbXBpbGVkXG4iLAotCSAgICAgIHByb2duYW1lKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSNlbmRpZgotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJ0cmFuc3Bvc2UiLCAxKSkgewotICAgICAgLyogVHJhbnNwb3NlIChhY3Jvc3MgVUwtdG8tTFIgYXhpcykuICovCi0gICAgICBzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9UUkFOU1BPU0UpOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJ0cmFuc3ZlcnNlIiwgNikpIHsKLSAgICAgIC8qIFRyYW5zdmVyc2UgdHJhbnNwb3NlIChhY3Jvc3MgVVItdG8tTEwgYXhpcykuICovCi0gICAgICBzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9UUkFOU1ZFUlNFKTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAidHJpbSIsIDMpKSB7Ci0gICAgICAvKiBUcmltIG9mZiBhbnkgcGFydGlhbCBlZGdlIE1DVXMgdGhhdCB0aGUgdHJhbnNmb3JtIGNhbid0IGhhbmRsZS4gKi8KLSAgICAgIHRyYW5zZm9ybW9wdGlvbi50cmltID0gVFJVRTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICB1c2FnZSgpOwkJCS8qIGJvZ3VzIHN3aXRjaCAqLwotICAgIH0KLSAgfQotCi0gIC8qIFBvc3Qtc3dpdGNoLXNjYW5uaW5nIGNsZWFudXAgKi8KLQotICBpZiAoZm9yX3JlYWwpIHsKLQotI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0gICAgaWYgKHNpbXBsZV9wcm9ncmVzc2l2ZSkJLyogcHJvY2VzcyAtcHJvZ3Jlc3NpdmU7IC1zY2FucyBjYW4gb3ZlcnJpZGUgKi8KLSAgICAgIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uKGNpbmZvKTsKLSNlbmRpZgotCi0jaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0gICAgaWYgKHNjYW5zYXJnICE9IE5VTEwpCS8qIHByb2Nlc3MgLXNjYW5zIGlmIGl0IHdhcyBwcmVzZW50ICovCi0gICAgICBpZiAoISByZWFkX3NjYW5fc2NyaXB0KGNpbmZvLCBzY2Fuc2FyZykpCi0JdXNhZ2UoKTsKLSNlbmRpZgotICB9Ci0KLSAgcmV0dXJuIGFyZ247CQkJLyogcmV0dXJuIGluZGV4IG9mIG5leHQgYXJnIChmaWxlIG5hbWUpICovCi19Ci0KLQotLyoKLSAqIFRoZSBtYWluIHByb2dyYW0uCi0gKi8KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IHNyY2luZm87Ci0gIHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBkc3RpbmZvOwotICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IganNyY2VyciwgamRzdGVycjsKLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgc3RydWN0IGNkanBlZ19wcm9ncmVzc19tZ3IgcHJvZ3Jlc3M7Ci0jZW5kaWYKLSAganZpcnRfYmFycmF5X3B0ciAqIHNyY19jb2VmX2FycmF5czsKLSAganZpcnRfYmFycmF5X3B0ciAqIGRzdF9jb2VmX2FycmF5czsKLSAgaW50IGZpbGVfaW5kZXg7Ci0gIEZJTEUgKiBpbnB1dF9maWxlOwotICBGSUxFICogb3V0cHV0X2ZpbGU7Ci0KLSAgLyogT24gTWFjLCBmZXRjaCBhIGNvbW1hbmQgbGluZS4gKi8KLSNpZmRlZiBVU0VfQ0NPTU1BTkQKLSAgYXJnYyA9IGNjb21tYW5kKCZhcmd2KTsKLSNlbmRpZgotCi0gIHByb2duYW1lID0gYXJndlswXTsKLSAgaWYgKHByb2duYW1lID09IE5VTEwgfHwgcHJvZ25hbWVbMF0gPT0gMCkKLSAgICBwcm9nbmFtZSA9ICJqcGVndHJhbiI7CS8qIGluIGNhc2UgQyBsaWJyYXJ5IGRvZXNuJ3QgcHJvdmlkZSBpdCAqLwotCi0gIC8qIEluaXRpYWxpemUgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3Qgd2l0aCBkZWZhdWx0IGVycm9yIGhhbmRsaW5nLiAqLwotICBzcmNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZqc3JjZXJyKTsKLSAganBlZ19jcmVhdGVfZGVjb21wcmVzcygmc3JjaW5mbyk7Ci0gIC8qIEluaXRpYWxpemUgdGhlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0IHdpdGggZGVmYXVsdCBlcnJvciBoYW5kbGluZy4gKi8KLSAgZHN0aW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamRzdGVycik7Ci0gIGpwZWdfY3JlYXRlX2NvbXByZXNzKCZkc3RpbmZvKTsKLQotICAvKiBOb3cgc2FmZSB0byBlbmFibGUgc2lnbmFsIGNhdGNoZXIuCi0gICAqIE5vdGU6IHdlIGFzc3VtZSBvbmx5IHRoZSBkZWNvbXByZXNzaW9uIG9iamVjdCB3aWxsIGhhdmUgdmlydHVhbCBhcnJheXMuCi0gICAqLwotI2lmZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKLSAgZW5hYmxlX3NpZ25hbF9jYXRjaGVyKChqX2NvbW1vbl9wdHIpICZzcmNpbmZvKTsKLSNlbmRpZgotCi0gIC8qIFNjYW4gY29tbWFuZCBsaW5lIHRvIGZpbmQgZmlsZSBuYW1lcy4KLSAgICogSXQgaXMgY29udmVuaWVudCB0byB1c2UganVzdCBvbmUgc3dpdGNoLXBhcnNpbmcgcm91dGluZSwgYnV0IHRoZSBzd2l0Y2gKLSAgICogdmFsdWVzIHJlYWQgaGVyZSBhcmUgbW9zdGx5IGlnbm9yZWQ7IHdlIHdpbGwgcmVzY2FuIHRoZSBzd2l0Y2hlcyBhZnRlcgotICAgKiBvcGVuaW5nIHRoZSBpbnB1dCBmaWxlLiAgQWxzbyBub3RlIHRoYXQgbW9zdCBvZiB0aGUgc3dpdGNoZXMgYWZmZWN0IHRoZQotICAgKiBkZXN0aW5hdGlvbiBKUEVHIG9iamVjdCwgc28gd2UgcGFyc2UgaW50byB0aGF0IGFuZCB0aGVuIGNvcHkgb3ZlciB3aGF0Ci0gICAqIG5lZWRzIHRvIGFmZmVjdHMgdGhlIHNvdXJjZSB0b28uCi0gICAqLwotCi0gIGZpbGVfaW5kZXggPSBwYXJzZV9zd2l0Y2hlcygmZHN0aW5mbywgYXJnYywgYXJndiwgMCwgRkFMU0UpOwotICBqc3JjZXJyLnRyYWNlX2xldmVsID0gamRzdGVyci50cmFjZV9sZXZlbDsKLSAgc3JjaW5mby5tZW0tPm1heF9tZW1vcnlfdG9fdXNlID0gZHN0aW5mby5tZW0tPm1heF9tZW1vcnlfdG9fdXNlOwotCi0jaWZkZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKLSAgLyogTXVzdCBoYXZlIGVpdGhlciAtb3V0ZmlsZSBzd2l0Y2ggb3IgZXhwbGljaXQgb3V0cHV0IGZpbGUgbmFtZSAqLwotICBpZiAob3V0ZmlsZW5hbWUgPT0gTlVMTCkgewotICAgIGlmIChmaWxlX2luZGV4ICE9IGFyZ2MtMikgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbXVzdCBuYW1lIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCBmaWxlXG4iLAotCSAgICAgIHByb2duYW1lKTsKLSAgICAgIHVzYWdlKCk7Ci0gICAgfQotICAgIG91dGZpbGVuYW1lID0gYXJndltmaWxlX2luZGV4KzFdOwotICB9IGVsc2UgewotICAgIGlmIChmaWxlX2luZGV4ICE9IGFyZ2MtMSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbXVzdCBuYW1lIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCBmaWxlXG4iLAotCSAgICAgIHByb2duYW1lKTsKLSAgICAgIHVzYWdlKCk7Ci0gICAgfQotICB9Ci0jZWxzZQotICAvKiBVbml4IHN0eWxlOiBleHBlY3QgemVybyBvciBvbmUgZmlsZSBuYW1lICovCi0gIGlmIChmaWxlX2luZGV4IDwgYXJnYy0xKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlczogb25seSBvbmUgaW5wdXQgZmlsZVxuIiwgcHJvZ25hbWUpOwotICAgIHVzYWdlKCk7Ci0gIH0KLSNlbmRpZiAvKiBUV09fRklMRV9DT01NQU5ETElORSAqLwotCi0gIC8qIE9wZW4gdGhlIGlucHV0IGZpbGUuICovCi0gIGlmIChmaWxlX2luZGV4IDwgYXJnYykgewotICAgIGlmICgoaW5wdXRfZmlsZSA9IGZvcGVuKGFyZ3ZbZmlsZV9pbmRleF0sIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbZmlsZV9pbmRleF0pOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBkZWZhdWx0IGlucHV0IGZpbGUgaXMgc3RkaW4gKi8KLSAgICBpbnB1dF9maWxlID0gcmVhZF9zdGRpbigpOwotICB9Ci0KLSAgLyogT3BlbiB0aGUgb3V0cHV0IGZpbGUuICovCi0gIGlmIChvdXRmaWxlbmFtZSAhPSBOVUxMKSB7Ci0gICAgaWYgKChvdXRwdXRfZmlsZSA9IGZvcGVuKG91dGZpbGVuYW1lLCBXUklURV9CSU5BUlkpKSA9PSBOVUxMKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgb3V0ZmlsZW5hbWUpOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBkZWZhdWx0IG91dHB1dCBmaWxlIGlzIHN0ZG91dCAqLwotICAgIG91dHB1dF9maWxlID0gd3JpdGVfc3Rkb3V0KCk7Ci0gIH0KLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBzdGFydF9wcm9ncmVzc19tb25pdG9yKChqX2NvbW1vbl9wdHIpICZkc3RpbmZvLCAmcHJvZ3Jlc3MpOwotI2VuZGlmCi0KLSAgLyogU3BlY2lmeSBkYXRhIHNvdXJjZSBmb3IgZGVjb21wcmVzc2lvbiAqLwotICBqcGVnX3N0ZGlvX3NyYygmc3JjaW5mbywgaW5wdXRfZmlsZSk7Ci0KLSAgLyogRW5hYmxlIHNhdmluZyBvZiBleHRyYSBtYXJrZXJzIHRoYXQgd2Ugd2FudCB0byBjb3B5ICovCi0gIGpjb3B5X21hcmtlcnNfc2V0dXAoJnNyY2luZm8sIGNvcHlvcHRpb24pOwotCi0gIC8qIFJlYWQgZmlsZSBoZWFkZXIgKi8KLSAgKHZvaWQpIGpwZWdfcmVhZF9oZWFkZXIoJnNyY2luZm8sIFRSVUUpOwotCi0gIC8qIEFueSBzcGFjZSBuZWVkZWQgYnkgYSB0cmFuc2Zvcm0gb3B0aW9uIG11c3QgYmUgcmVxdWVzdGVkIGJlZm9yZQotICAgKiBqcGVnX3JlYWRfY29lZmZpY2llbnRzIHNvIHRoYXQgbWVtb3J5IGFsbG9jYXRpb24gd2lsbCBiZSBkb25lIHJpZ2h0LgotICAgKi8KLSNpZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAotICBqdHJhbnNmb3JtX3JlcXVlc3Rfd29ya3NwYWNlKCZzcmNpbmZvLCAmdHJhbnNmb3Jtb3B0aW9uKTsKLSNlbmRpZgotCi0gIC8qIFJlYWQgc291cmNlIGZpbGUgYXMgRENUIGNvZWZmaWNpZW50cyAqLwotICBzcmNfY29lZl9hcnJheXMgPSBqcGVnX3JlYWRfY29lZmZpY2llbnRzKCZzcmNpbmZvKTsKLQotICAvKiBJbml0aWFsaXplIGRlc3RpbmF0aW9uIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgZnJvbSBzb3VyY2UgdmFsdWVzICovCi0gIGpwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzKCZzcmNpbmZvLCAmZHN0aW5mbyk7Ci0KLSAgLyogQWRqdXN0IGRlc3RpbmF0aW9uIHBhcmFtZXRlcnMgaWYgcmVxdWlyZWQgYnkgdHJhbnNmb3JtIG9wdGlvbnM7Ci0gICAqIGFsc28gZmluZCBvdXQgd2hpY2ggc2V0IG9mIGNvZWZmaWNpZW50IGFycmF5cyB3aWxsIGhvbGQgdGhlIG91dHB1dC4KLSAgICovCi0jaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKLSAgZHN0X2NvZWZfYXJyYXlzID0ganRyYW5zZm9ybV9hZGp1c3RfcGFyYW1ldGVycygmc3JjaW5mbywgJmRzdGluZm8sCi0JCQkJCQkgc3JjX2NvZWZfYXJyYXlzLAotCQkJCQkJICZ0cmFuc2Zvcm1vcHRpb24pOwotI2Vsc2UKLSAgZHN0X2NvZWZfYXJyYXlzID0gc3JjX2NvZWZfYXJyYXlzOwotI2VuZGlmCi0KLSAgLyogQWRqdXN0IGRlZmF1bHQgY29tcHJlc3Npb24gcGFyYW1ldGVycyBieSByZS1wYXJzaW5nIHRoZSBvcHRpb25zICovCi0gIGZpbGVfaW5kZXggPSBwYXJzZV9zd2l0Y2hlcygmZHN0aW5mbywgYXJnYywgYXJndiwgMCwgVFJVRSk7Ci0KLSAgLyogU3BlY2lmeSBkYXRhIGRlc3RpbmF0aW9uIGZvciBjb21wcmVzc2lvbiAqLwotICBqcGVnX3N0ZGlvX2Rlc3QoJmRzdGluZm8sIG91dHB1dF9maWxlKTsKLQotICAvKiBTdGFydCBjb21wcmVzc29yIChub3RlIG5vIGltYWdlIGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbiBoZXJlKSAqLwotICBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygmZHN0aW5mbywgZHN0X2NvZWZfYXJyYXlzKTsKLQotICAvKiBDb3B5IHRvIHRoZSBvdXRwdXQgZmlsZSBhbnkgZXh0cmEgbWFya2VycyB0aGF0IHdlIHdhbnQgdG8gcHJlc2VydmUgKi8KLSAgamNvcHlfbWFya2Vyc19leGVjdXRlKCZzcmNpbmZvLCAmZHN0aW5mbywgY29weW9wdGlvbik7Ci0KLSAgLyogRXhlY3V0ZSBpbWFnZSB0cmFuc2Zvcm1hdGlvbiwgaWYgYW55ICovCi0jaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKLSAganRyYW5zZm9ybV9leGVjdXRlX3RyYW5zZm9ybWF0aW9uKCZzcmNpbmZvLCAmZHN0aW5mbywKLQkJCQkgICAgc3JjX2NvZWZfYXJyYXlzLAotCQkJCSAgICAmdHJhbnNmb3Jtb3B0aW9uKTsKLSNlbmRpZgotCi0gIC8qIEZpbmlzaCBjb21wcmVzc2lvbiBhbmQgcmVsZWFzZSBtZW1vcnkgKi8KLSAganBlZ19maW5pc2hfY29tcHJlc3MoJmRzdGluZm8pOwotICBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoJmRzdGluZm8pOwotICAodm9pZCkganBlZ19maW5pc2hfZGVjb21wcmVzcygmc3JjaW5mbyk7Ci0gIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZzcmNpbmZvKTsKLQotICAvKiBDbG9zZSBmaWxlcywgaWYgd2Ugb3BlbmVkIHRoZW0gKi8KLSAgaWYgKGlucHV0X2ZpbGUgIT0gc3RkaW4pCi0gICAgZmNsb3NlKGlucHV0X2ZpbGUpOwotICBpZiAob3V0cHV0X2ZpbGUgIT0gc3Rkb3V0KQotICAgIGZjbG9zZShvdXRwdXRfZmlsZSk7Ci0KLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgZW5kX3Byb2dyZXNzX21vbml0b3IoKGpfY29tbW9uX3B0cikgJmRzdGluZm8pOwotI2VuZGlmCi0KLSAgLyogQWxsIGRvbmUuICovCi0gIGV4aXQoanNyY2Vyci5udW1fd2FybmluZ3MgKyBqZHN0ZXJyLm51bV93YXJuaW5ncyA/RVhJVF9XQVJOSU5HOkVYSVRfU1VDQ0VTUyk7Ci0gIHJldHVybiAwOwkJCS8qIHN1cHByZXNzIG5vLXJldHVybi12YWx1ZSB3YXJuaW5ncyAqLwotfQpkaWZmIC0tZ2l0IGEvanNpbWQuYyBiL2pzaW1kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIxZjM3YgotLS0gL2Rldi9udWxsCisrKyBiL2pzaW1kLmMKQEAgLTAsMCArMSw2NDYgQEAKKy8qCisgKiBqc2ltZC5jCisgKgorICogQ29weXJpZ2h0IDIwMDkgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorICogCisgKiBCYXNlZCBvbiB0aGUgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5LAorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSAibm9ybWFsIiBwb3J0aW9ucworICogb2YgdGhlIGxpYnJhcnkgYW5kIHRoZSBTSU1EIGltcGxlbWVudGF0aW9ucy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAianNpbWQuaCIKKyNpbmNsdWRlICJqZGN0LmgiCisjaW5jbHVkZSAianNpbWRkY3QuaCIKKyNpbmNsdWRlICJzaW1kL2pzaW1kLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2ltZF9zdXBwb3J0ID0gfjA7CisKKy8qCisgKiBDaGVjayB3aGF0IFNJTUQgYWNjZWxlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICoKKyAqIEZJWE1FOiBUaGlzIGNvZGUgaXMgcmFjeSB1bmRlciBhIG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50LgorICovCitMT0NBTCh2b2lkKQoraW5pdF9zaW1kICh2b2lkKQoreworICBpZiAoc2ltZF9zdXBwb3J0ICE9IH4wKQorICAgIHJldHVybjsKKworI2lmZGVmIFdJVEhfU0lNRAorICBzaW1kX3N1cHBvcnQgPSBqcGVnX3NpbWRfY3B1X3N1cHBvcnQoKTsKKyNlbHNlCisgIHNpbWRfc3VwcG9ydCA9IEpTSU1EX05PTkU7CisjZW5kaWYKK30KKworR0xPQkFMKGludCkKK2pzaW1kX2Nhbl9yZ2JfeWNjICh2b2lkKQoreworICBpbml0X3NpbWQoKTsKKworICAvKiBUaGUgY29kZSBpcyBvcHRpbWlzZWQgZm9yIHRoZXNlIHZhbHVlcyBvbmx5ICovCisgIGlmIChCSVRTX0lOX0pTQU1QTEUgIT0gOCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNpemVvZihKRElNRU5TSU9OKSAhPSA0KQorICAgIHJldHVybiAwOworICBpZiAoKFJHQl9QSVhFTFNJWkUgIT0gMykgJiYgKFJHQl9QSVhFTFNJWkUgIT0gNCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHNpbWRfc3VwcG9ydCAmIEpTSU1EX01NWCkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworR0xPQkFMKGludCkKK2pzaW1kX2Nhbl95Y2NfcmdiICh2b2lkKQoreworICBpbml0X3NpbWQoKTsKKworICAvKiBUaGUgY29kZSBpcyBvcHRpbWlzZWQgZm9yIHRoZXNlIHZhbHVlcyBvbmx5ICovCisgIGlmIChCSVRTX0lOX0pTQU1QTEUgIT0gOCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNpemVvZihKRElNRU5TSU9OKSAhPSA0KQorICAgIHJldHVybiAwOworICBpZiAoKFJHQl9QSVhFTFNJWkUgIT0gMykgJiYgKFJHQl9QSVhFTFNJWkUgIT0gNCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHNpbWRfc3VwcG9ydCAmIEpTSU1EX01NWCkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworR0xPQkFMKHZvaWQpCitqc2ltZF9yZ2JfeWNjX2NvbnZlcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICBKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykKK3sKKyNpZmRlZiBXSVRIX1NJTUQKKyAgaWYgKHNpbWRfc3VwcG9ydCAmIEpTSU1EX01NWCkKKyAgICBqc2ltZF9yZ2JfeWNjX2NvbnZlcnRfbW14KGNpbmZvLT5pbWFnZV93aWR0aCwgaW5wdXRfYnVmLAorICAgICAgICBvdXRwdXRfYnVmLCBvdXRwdXRfcm93LCBudW1fcm93cyk7CisjZW5kaWYKK30KKworR0xPQkFMKHZvaWQpCitqc2ltZF95Y2NfcmdiX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisjaWZkZWYgV0lUSF9TSU1ECisgIGlmIChzaW1kX3N1cHBvcnQgJiBKU0lNRF9NTVgpCisgICAganNpbWRfeWNjX3JnYl9jb252ZXJ0X21teChjaW5mby0+b3V0cHV0X3dpZHRoLCBpbnB1dF9idWYsCisgICAgICAgIGlucHV0X3Jvdywgb3V0cHV0X2J1ZiwgbnVtX3Jvd3MpOworI2VuZGlmCit9CisKK0dMT0JBTChpbnQpCitqc2ltZF9jYW5faDJ2Ml9kb3duc2FtcGxlICh2b2lkKQoreworICBpbml0X3NpbWQoKTsKKworICAvKiBUaGUgY29kZSBpcyBvcHRpbWlzZWQgZm9yIHRoZXNlIHZhbHVlcyBvbmx5ICovCisgIGlmIChCSVRTX0lOX0pTQU1QTEUgIT0gOCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNpemVvZihKRElNRU5TSU9OKSAhPSA0KQorICAgIHJldHVybiAwOworCisgIGlmIChzaW1kX3N1cHBvcnQgJiBKU0lNRF9NTVgpCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9CisKK0dMT0JBTChpbnQpCitqc2ltZF9jYW5faDJ2MV9kb3duc2FtcGxlICh2b2lkKQoreworICBpbml0X3NpbWQoKTsKKworICAvKiBUaGUgY29kZSBpcyBvcHRpbWlzZWQgZm9yIHRoZXNlIHZhbHVlcyBvbmx5ICovCisgIGlmIChCSVRTX0lOX0pTQU1QTEUgIT0gOCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNpemVvZihKRElNRU5TSU9OKSAhPSA0KQorICAgIHJldHVybiAwOworCisgIGlmIChzaW1kX3N1cHBvcnQgJiBKU0lNRF9NTVgpCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9CisKK0dMT0JBTCh2b2lkKQoranNpbWRfaDJ2Ml9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKK3sKKyNpZmRlZiBXSVRIX1NJTUQKKyAgaWYgKHNpbWRfc3VwcG9ydCAmIEpTSU1EX01NWCkKKyAgICBqc2ltZF9oMnYyX2Rvd25zYW1wbGVfbW14KGNpbmZvLT5pbWFnZV93aWR0aCwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLAorICAgICAgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MsCisgICAgICAgIGlucHV0X2RhdGEsIG91dHB1dF9kYXRhKTsKKyNlbmRpZgorfQorCitHTE9CQUwodm9pZCkKK2pzaW1kX2gydjFfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCit7CisjaWZkZWYgV0lUSF9TSU1ECisgIGlmIChzaW1kX3N1cHBvcnQgJiBKU0lNRF9NTVgpCisgICAganNpbWRfaDJ2MV9kb3duc2FtcGxlX21teChjaW5mby0+aW1hZ2Vfd2lkdGgsIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKKyAgICAgICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzLAorICAgICAgICBpbnB1dF9kYXRhLCBvdXRwdXRfZGF0YSk7CisjZW5kaWYKK30KKworR0xPQkFMKGludCkKK2pzaW1kX2Nhbl9oMnYyX3Vwc2FtcGxlICh2b2lkKQoreworICBpbml0X3NpbWQoKTsKKworICAvKiBUaGUgY29kZSBpcyBvcHRpbWlzZWQgZm9yIHRoZXNlIHZhbHVlcyBvbmx5ICovCisgIGlmIChCSVRTX0lOX0pTQU1QTEUgIT0gOCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNpemVvZihKRElNRU5TSU9OKSAhPSA0KQorICAgIHJldHVybiAwOworCisgIGlmIChzaW1kX3N1cHBvcnQgJiBKU0lNRF9NTVgpCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9CisKK0dMT0JBTChpbnQpCitqc2ltZF9jYW5faDJ2MV91cHNhbXBsZSAodm9pZCkKK3sKKyAgaW5pdF9zaW1kKCk7CisKKyAgLyogVGhlIGNvZGUgaXMgb3B0aW1pc2VkIGZvciB0aGVzZSB2YWx1ZXMgb25seSAqLworICBpZiAoQklUU19JTl9KU0FNUExFICE9IDgpCisgICAgcmV0dXJuIDA7CisgIGlmIChzaXplb2YoSkRJTUVOU0lPTikgIT0gNCkKKyAgICByZXR1cm4gMDsKKworICBpZiAoc2ltZF9zdXBwb3J0ICYgSlNJTURfTU1YKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCitHTE9CQUwodm9pZCkKK2pzaW1kX2gydjJfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgICAgICAgICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwgCisgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworI2lmZGVmIFdJVEhfU0lNRAorICBpZiAoc2ltZF9zdXBwb3J0ICYgSlNJTURfTU1YKQorICAgIGpzaW1kX2gydjJfdXBzYW1wbGVfbW14KGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKKyAgICAgICAgY2luZm8tPm91dHB1dF93aWR0aCwgaW5wdXRfZGF0YSwgb3V0cHV0X2RhdGFfcHRyKTsKKyNlbmRpZgorfQorCitHTE9CQUwodm9pZCkKK2pzaW1kX2gydjFfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgICAgICAgICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwgCisgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworI2lmZGVmIFdJVEhfU0lNRAorICBpZiAoc2ltZF9zdXBwb3J0ICYgSlNJTURfTU1YKQorICAgIGpzaW1kX2gydjFfdXBzYW1wbGVfbW14KGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKKyAgICAgICAgY2luZm8tPm91dHB1dF93aWR0aCwgaW5wdXRfZGF0YSwgb3V0cHV0X2RhdGFfcHRyKTsKKyNlbmRpZgorfQorCitHTE9CQUwoaW50KQoranNpbWRfY2FuX2gydjJfZmFuY3lfdXBzYW1wbGUgKHZvaWQpCit7CisgIGluaXRfc2ltZCgpOworCisgIC8qIFRoZSBjb2RlIGlzIG9wdGltaXNlZCBmb3IgdGhlc2UgdmFsdWVzIG9ubHkgKi8KKyAgaWYgKEJJVFNfSU5fSlNBTVBMRSAhPSA4KQorICAgIHJldHVybiAwOworICBpZiAoc2l6ZW9mKEpESU1FTlNJT04pICE9IDQpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHNpbWRfc3VwcG9ydCAmIEpTSU1EX01NWCkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworR0xPQkFMKGludCkKK2pzaW1kX2Nhbl9oMnYxX2ZhbmN5X3Vwc2FtcGxlICh2b2lkKQoreworICBpbml0X3NpbWQoKTsKKworICAvKiBUaGUgY29kZSBpcyBvcHRpbWlzZWQgZm9yIHRoZXNlIHZhbHVlcyBvbmx5ICovCisgIGlmIChCSVRTX0lOX0pTQU1QTEUgIT0gOCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNpemVvZihKRElNRU5TSU9OKSAhPSA0KQorICAgIHJldHVybiAwOworCisgIGlmIChzaW1kX3N1cHBvcnQgJiBKU0lNRF9NTVgpCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9CisKK0dMT0JBTCh2b2lkKQoranNpbWRfaDJ2Ml9mYW5jeV91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCit7CisjaWZkZWYgV0lUSF9TSU1ECisgIGlmIChzaW1kX3N1cHBvcnQgJiBKU0lNRF9NTVgpCisgICAganNpbWRfaDJ2Ml9mYW5jeV91cHNhbXBsZV9tbXgoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLAorICAgICAgICBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCwgaW5wdXRfZGF0YSwgb3V0cHV0X2RhdGFfcHRyKTsKKyNlbmRpZgorfQorCitHTE9CQUwodm9pZCkKK2pzaW1kX2gydjFfZmFuY3lfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworI2lmZGVmIFdJVEhfU0lNRAorICBpZiAoc2ltZF9zdXBwb3J0ICYgSlNJTURfTU1YKQorICAgIGpzaW1kX2gydjFfZmFuY3lfdXBzYW1wbGVfbW14KGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKKyAgICAgICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGgsIGlucHV0X2RhdGEsIG91dHB1dF9kYXRhX3B0cik7CisjZW5kaWYKK30KKworR0xPQkFMKGludCkKK2pzaW1kX2Nhbl9oMnYyX21lcmdlZF91cHNhbXBsZSAodm9pZCkKK3sKKyAgaW5pdF9zaW1kKCk7CisKKyAgLyogVGhlIGNvZGUgaXMgb3B0aW1pc2VkIGZvciB0aGVzZSB2YWx1ZXMgb25seSAqLworICBpZiAoQklUU19JTl9KU0FNUExFICE9IDgpCisgICAgcmV0dXJuIDA7CisgIGlmIChzaXplb2YoSkRJTUVOU0lPTikgIT0gNCkKKyAgICByZXR1cm4gMDsKKworICBpZiAoc2ltZF9zdXBwb3J0ICYgSlNJTURfTU1YKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCitHTE9CQUwoaW50KQoranNpbWRfY2FuX2gydjFfbWVyZ2VkX3Vwc2FtcGxlICh2b2lkKQoreworICBpbml0X3NpbWQoKTsKKworICAvKiBUaGUgY29kZSBpcyBvcHRpbWlzZWQgZm9yIHRoZXNlIHZhbHVlcyBvbmx5ICovCisgIGlmIChCSVRTX0lOX0pTQU1QTEUgIT0gOCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNpemVvZihKRElNRU5TSU9OKSAhPSA0KQorICAgIHJldHVybiAwOworCisgIGlmIChzaW1kX3N1cHBvcnQgJiBKU0lNRF9NTVgpCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9CisKK0dMT0JBTCh2b2lkKQoranNpbWRfaDJ2Ml9tZXJnZWRfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikKK3sKKyNpZmRlZiBXSVRIX1NJTUQKKyAgaWYgKHNpbWRfc3VwcG9ydCAmIEpTSU1EX01NWCkKKyAgICBqc2ltZF9oMnYyX21lcmdlZF91cHNhbXBsZV9tbXgoY2luZm8tPm91dHB1dF93aWR0aCwgaW5wdXRfYnVmLAorICAgICAgICBpbl9yb3dfZ3JvdXBfY3RyLCBvdXRwdXRfYnVmKTsKKyNlbmRpZgorfQorCitHTE9CQUwodm9pZCkKK2pzaW1kX2gydjFfbWVyZ2VkX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYpCit7CisjaWZkZWYgV0lUSF9TSU1ECisgIGlmIChzaW1kX3N1cHBvcnQgJiBKU0lNRF9NTVgpCisgICAganNpbWRfaDJ2MV9tZXJnZWRfdXBzYW1wbGVfbW14KGNpbmZvLT5vdXRwdXRfd2lkdGgsIGlucHV0X2J1ZiwKKyAgICAgICAgaW5fcm93X2dyb3VwX2N0ciwgb3V0cHV0X2J1Zik7CisjZW5kaWYKK30KKworR0xPQkFMKGludCkKK2pzaW1kX2Nhbl9jb252c2FtcCAodm9pZCkKK3sKKyAgaW5pdF9zaW1kKCk7CisKKyAgLyogVGhlIGNvZGUgaXMgb3B0aW1pc2VkIGZvciB0aGVzZSB2YWx1ZXMgb25seSAqLworICBpZiAoRENUU0laRSAhPSA4KQorICAgIHJldHVybiAwOworICBpZiAoQklUU19JTl9KU0FNUExFICE9IDgpCisgICAgcmV0dXJuIDA7CisgIGlmIChzaXplb2YoSkRJTUVOU0lPTikgIT0gNCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNpemVvZihEQ1RFTEVNKSAhPSAyKQorICAgIHJldHVybiAwOworCisgIGlmIChzaW1kX3N1cHBvcnQgJiBKU0lNRF9NTVgpCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9CisKK0dMT0JBTChpbnQpCitqc2ltZF9jYW5fY29udnNhbXBfZmxvYXQgKHZvaWQpCit7CisgIGluaXRfc2ltZCgpOworCisgIHJldHVybiAwOworfQorCitHTE9CQUwodm9pZCkKK2pzaW1kX2NvbnZzYW1wIChKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCwKKyAgICAgICAgICAgICAgICBEQ1RFTEVNICogd29ya3NwYWNlKQoreworI2lmZGVmIFdJVEhfU0lNRAorICBpZiAoc2ltZF9zdXBwb3J0ICYgSlNJTURfTU1YKQorICAgIGpzaW1kX2NvbnZzYW1wX21teChzYW1wbGVfZGF0YSwgc3RhcnRfY29sLCB3b3Jrc3BhY2UpOworI2VuZGlmCit9CisKK0dMT0JBTCh2b2lkKQoranNpbWRfY29udnNhbXBfZmxvYXQgKEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sLAorICAgICAgICAgICAgICAgICAgICAgIEZBU1RfRkxPQVQgKiB3b3Jrc3BhY2UpCit7Cit9CisKK0dMT0JBTChpbnQpCitqc2ltZF9jYW5fZmRjdF9pc2xvdyAodm9pZCkKK3sKKyAgaW5pdF9zaW1kKCk7CisKKyAgLyogVGhlIGNvZGUgaXMgb3B0aW1pc2VkIGZvciB0aGVzZSB2YWx1ZXMgb25seSAqLworICBpZiAoRENUU0laRSAhPSA4KQorICAgIHJldHVybiAwOworICBpZiAoc2l6ZW9mKERDVEVMRU0pICE9IDIpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHNpbWRfc3VwcG9ydCAmIEpTSU1EX01NWCkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworR0xPQkFMKGludCkKK2pzaW1kX2Nhbl9mZGN0X2lmYXN0ICh2b2lkKQoreworICBpbml0X3NpbWQoKTsKKworICAvKiBUaGUgY29kZSBpcyBvcHRpbWlzZWQgZm9yIHRoZXNlIHZhbHVlcyBvbmx5ICovCisgIGlmIChEQ1RTSVpFICE9IDgpCisgICAgcmV0dXJuIDA7CisgIGlmIChzaXplb2YoRENURUxFTSkgIT0gMikKKyAgICByZXR1cm4gMDsKKworICBpZiAoc2ltZF9zdXBwb3J0ICYgSlNJTURfTU1YKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCitHTE9CQUwoaW50KQoranNpbWRfY2FuX2ZkY3RfZmxvYXQgKHZvaWQpCit7CisgIGluaXRfc2ltZCgpOworCisgIHJldHVybiAwOworfQorCitHTE9CQUwodm9pZCkKK2pzaW1kX2ZkY3RfaXNsb3cgKERDVEVMRU0gKiBkYXRhKQoreworI2lmZGVmIFdJVEhfU0lNRAorICBpZiAoc2ltZF9zdXBwb3J0ICYgSlNJTURfTU1YKQorICAgIGpzaW1kX2ZkY3RfaXNsb3dfbW14KGRhdGEpOworI2VuZGlmCit9CisKK0dMT0JBTCh2b2lkKQoranNpbWRfZmRjdF9pZmFzdCAoRENURUxFTSAqIGRhdGEpCit7CisjaWZkZWYgV0lUSF9TSU1ECisgIGlmIChzaW1kX3N1cHBvcnQgJiBKU0lNRF9NTVgpCisgICAganNpbWRfZmRjdF9pZmFzdF9tbXgoZGF0YSk7CisjZW5kaWYKK30KKworR0xPQkFMKHZvaWQpCitqc2ltZF9mZGN0X2Zsb2F0IChGQVNUX0ZMT0FUICogZGF0YSkKK3sKK30KKworR0xPQkFMKGludCkKK2pzaW1kX2Nhbl9xdWFudGl6ZSAodm9pZCkKK3sKKyAgaW5pdF9zaW1kKCk7CisKKyAgLyogVGhlIGNvZGUgaXMgb3B0aW1pc2VkIGZvciB0aGVzZSB2YWx1ZXMgb25seSAqLworICBpZiAoRENUU0laRSAhPSA4KQorICAgIHJldHVybiAwOworICBpZiAoc2l6ZW9mKEpDT0VGKSAhPSAyKQorICAgIHJldHVybiAwOworICBpZiAoc2l6ZW9mKERDVEVMRU0pICE9IDIpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHNpbWRfc3VwcG9ydCAmIEpTSU1EX01NWCkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworR0xPQkFMKGludCkKK2pzaW1kX2Nhbl9xdWFudGl6ZV9mbG9hdCAodm9pZCkKK3sKKyAgaW5pdF9zaW1kKCk7CisKKyAgcmV0dXJuIDA7Cit9CisKK0dMT0JBTCh2b2lkKQoranNpbWRfcXVhbnRpemUgKEpDT0VGUFRSIGNvZWZfYmxvY2ssIERDVEVMRU0gKiBkaXZpc29ycywKKyAgICAgICAgICAgICAgICBEQ1RFTEVNICogd29ya3NwYWNlKQoreworI2lmZGVmIFdJVEhfU0lNRAorICBpZiAoc2ltZF9zdXBwb3J0ICYgSlNJTURfTU1YKQorICAgIGpzaW1kX3F1YW50aXplX21teChjb2VmX2Jsb2NrLCBkaXZpc29ycywgd29ya3NwYWNlKTsKKyNlbmRpZgorfQorCitHTE9CQUwodm9pZCkKK2pzaW1kX3F1YW50aXplX2Zsb2F0IChKQ09FRlBUUiBjb2VmX2Jsb2NrLCBGQVNUX0ZMT0FUICogZGl2aXNvcnMsCisgICAgICAgICAgICAgICAgICAgICAgRkFTVF9GTE9BVCAqIHdvcmtzcGFjZSkKK3sKK30KKworR0xPQkFMKGludCkKK2pzaW1kX2Nhbl9pZGN0XzJ4MiAodm9pZCkKK3sKKyAgaW5pdF9zaW1kKCk7CisKKyAgLyogVGhlIGNvZGUgaXMgb3B0aW1pc2VkIGZvciB0aGVzZSB2YWx1ZXMgb25seSAqLworICBpZiAoRENUU0laRSAhPSA4KQorICAgIHJldHVybiAwOworICBpZiAoc2l6ZW9mKEpDT0VGKSAhPSAyKQorICAgIHJldHVybiAwOworICBpZiAoQklUU19JTl9KU0FNUExFICE9IDgpCisgICAgcmV0dXJuIDA7CisgIGlmIChzaXplb2YoSkRJTUVOU0lPTikgIT0gNCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNpemVvZihJU0xPV19NVUxUX1RZUEUpICE9IDIpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHNpbWRfc3VwcG9ydCAmIEpTSU1EX01NWCkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworR0xPQkFMKGludCkKK2pzaW1kX2Nhbl9pZGN0XzR4NCAodm9pZCkKK3sKKyAgaW5pdF9zaW1kKCk7CisKKyAgLyogVGhlIGNvZGUgaXMgb3B0aW1pc2VkIGZvciB0aGVzZSB2YWx1ZXMgb25seSAqLworICBpZiAoRENUU0laRSAhPSA4KQorICAgIHJldHVybiAwOworICBpZiAoc2l6ZW9mKEpDT0VGKSAhPSAyKQorICAgIHJldHVybiAwOworICBpZiAoQklUU19JTl9KU0FNUExFICE9IDgpCisgICAgcmV0dXJuIDA7CisgIGlmIChzaXplb2YoSkRJTUVOU0lPTikgIT0gNCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNpemVvZihJU0xPV19NVUxUX1RZUEUpICE9IDIpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHNpbWRfc3VwcG9ydCAmIEpTSU1EX01NWCkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworR0xPQkFMKHZvaWQpCitqc2ltZF9pZGN0XzJ4MiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisgICAgICAgICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyNpZiBXSVRIX1NJTUQKKyAgaWYgKHNpbWRfc3VwcG9ydCAmIEpTSU1EX01NWCkKKyAgICBqc2ltZF9pZGN0XzJ4Ml9tbXgoY29tcHB0ci0+ZGN0X3RhYmxlLCBjb2VmX2Jsb2NrLCBvdXRwdXRfYnVmLCBvdXRwdXRfY29sKTsKKyNlbmRpZgorfQorCitHTE9CQUwodm9pZCkKK2pzaW1kX2lkY3RfNHg0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKyAgICAgICAgICAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsCisgICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworI2lmIFdJVEhfU0lNRAorICBpZiAoc2ltZF9zdXBwb3J0ICYgSlNJTURfTU1YKQorICAgIGpzaW1kX2lkY3RfNHg0X21teChjb21wcHRyLT5kY3RfdGFibGUsIGNvZWZfYmxvY2ssIG91dHB1dF9idWYsIG91dHB1dF9jb2wpOworI2VuZGlmCit9CisKK0dMT0JBTChpbnQpCitqc2ltZF9jYW5faWRjdF9pc2xvdyAodm9pZCkKK3sKKyAgaW5pdF9zaW1kKCk7CisKKyAgLyogVGhlIGNvZGUgaXMgb3B0aW1pc2VkIGZvciB0aGVzZSB2YWx1ZXMgb25seSAqLworICBpZiAoRENUU0laRSAhPSA4KQorICAgIHJldHVybiAwOworICBpZiAoc2l6ZW9mKEpDT0VGKSAhPSAyKQorICAgIHJldHVybiAwOworICBpZiAoQklUU19JTl9KU0FNUExFICE9IDgpCisgICAgcmV0dXJuIDA7CisgIGlmIChzaXplb2YoSkRJTUVOU0lPTikgIT0gNCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNpemVvZihJU0xPV19NVUxUX1RZUEUpICE9IDIpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHNpbWRfc3VwcG9ydCAmIEpTSU1EX01NWCkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworR0xPQkFMKGludCkKK2pzaW1kX2Nhbl9pZGN0X2lmYXN0ICh2b2lkKQoreworICBpbml0X3NpbWQoKTsKKworICAvKiBUaGUgY29kZSBpcyBvcHRpbWlzZWQgZm9yIHRoZXNlIHZhbHVlcyBvbmx5ICovCisgIGlmIChEQ1RTSVpFICE9IDgpCisgICAgcmV0dXJuIDA7CisgIGlmIChzaXplb2YoSkNPRUYpICE9IDIpCisgICAgcmV0dXJuIDA7CisgIGlmIChCSVRTX0lOX0pTQU1QTEUgIT0gOCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNpemVvZihKRElNRU5TSU9OKSAhPSA0KQorICAgIHJldHVybiAwOworICBpZiAoc2l6ZW9mKElGQVNUX01VTFRfVFlQRSkgIT0gMikKKyAgICByZXR1cm4gMDsKKyAgaWYgKElGQVNUX1NDQUxFX0JJVFMgIT0gMikKKyAgICByZXR1cm4gMDsKKworICBpZiAoc2ltZF9zdXBwb3J0ICYgSlNJTURfTU1YKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCitHTE9CQUwoaW50KQoranNpbWRfY2FuX2lkY3RfZmxvYXQgKHZvaWQpCit7CisgIGluaXRfc2ltZCgpOworCisgIHJldHVybiAwOworfQorCitHTE9CQUwodm9pZCkKK2pzaW1kX2lkY3RfaXNsb3cgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorICAgICAgICAgICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKKyAgICAgICAgICAgICAgICBKRElNRU5TSU9OIG91dHB1dF9jb2wpCit7CisjaWYgV0lUSF9TSU1ECisgIGlmIChzaW1kX3N1cHBvcnQgJiBKU0lNRF9NTVgpCisgICAganNpbWRfaWRjdF9pc2xvd19tbXgoY29tcHB0ci0+ZGN0X3RhYmxlLCBjb2VmX2Jsb2NrLCBvdXRwdXRfYnVmLCBvdXRwdXRfY29sKTsKKyNlbmRpZgorfQorCitHTE9CQUwodm9pZCkKK2pzaW1kX2lkY3RfaWZhc3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorICAgICAgICAgICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKKyAgICAgICAgICAgICAgICBKRElNRU5TSU9OIG91dHB1dF9jb2wpCit7CisjaWYgV0lUSF9TSU1ECisgIGlmIChzaW1kX3N1cHBvcnQgJiBKU0lNRF9NTVgpCisgICAganNpbWRfaWRjdF9pZmFzdF9tbXgoY29tcHB0ci0+ZGN0X3RhYmxlLCBjb2VmX2Jsb2NrLCBvdXRwdXRfYnVmLCBvdXRwdXRfY29sKTsKKyNlbmRpZgorfQorCitHTE9CQUwodm9pZCkKK2pzaW1kX2lkY3RfZmxvYXQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorICAgICAgICAgICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKKyAgICAgICAgICAgICAgICBKRElNRU5TSU9OIG91dHB1dF9jb2wpCit7Cit9CisKZGlmZiAtLWdpdCBhL2pzaW1kLmggYi9qc2ltZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYmUxOWUKLS0tIC9kZXYvbnVsbAorKysgYi9qc2ltZC5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBqc2ltZC5oCisgKgorICogQ29weXJpZ2h0IDIwMDkgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorICogCisgKiBCYXNlZCBvbiB0aGUgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5LAorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KKyAqCisgKi8KKworLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCisKKyNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjZGVmaW5lIGpzaW1kX2Nhbl9yZ2JfeWNjICAgICAgICAgICAgICAgICBqU0NhblJnYlljYworI2RlZmluZSBqc2ltZF9jYW5feWNjX3JnYiAgICAgICAgICAgICAgICAgalNDYW5ZY2NSZ2IKKyNkZWZpbmUganNpbWRfcmdiX3ljY19jb252ZXJ0ICAgICAgICAgICAgIGpTUmdiWWNjQ29udgorI2RlZmluZSBqc2ltZF95Y2NfcmdiX2NvbnZlcnQgICAgICAgICAgICAgalNZY2NSZ2JDb252CisjZGVmaW5lIGpzaW1kX2Nhbl9oMnYyX2Rvd25zYW1wbGUgICAgICAgICBqU0NhbkgyVjJEb3duCisjZGVmaW5lIGpzaW1kX2Nhbl9oMnYxX2Rvd25zYW1wbGUgICAgICAgICBqU0NhbkgyVjFEb3duCisjZGVmaW5lIGpzaW1kX2gydjJfZG93bnNhbXBsZSAgICAgICAgICAgICBqU0gyVjJEb3duCisjZGVmaW5lIGpzaW1kX2gydjFfZG93bnNhbXBsZSAgICAgICAgICAgICBqU0gyVjFEb3duCisjZGVmaW5lIGpzaW1kX2Nhbl9oMnYyX3Vwc2FtcGxlICAgICAgICAgICBqU0NhbkgyVjJVcAorI2RlZmluZSBqc2ltZF9jYW5faDJ2MV91cHNhbXBsZSAgICAgICAgICAgalNDYW5IMlYxVXAKKyNkZWZpbmUganNpbWRfaDJ2Ml91cHNhbXBsZSAgICAgICAgICAgICAgIGpTSDJWMlVwCisjZGVmaW5lIGpzaW1kX2gydjFfdXBzYW1wbGUgICAgICAgICAgICAgICBqU0gyVjFVcAorI2RlZmluZSBqc2ltZF9jYW5faDJ2Ml9mYW5jeV91cHNhbXBsZSAgICAgalNDYW5IMlYyRlVwCisjZGVmaW5lIGpzaW1kX2Nhbl9oMnYxX2ZhbmN5X3Vwc2FtcGxlICAgICBqU0NhbkgyVjFGVXAKKyNkZWZpbmUganNpbWRfaDJ2Ml9mYW5jeV91cHNhbXBsZSAgICAgICAgIGpTSDJWMkZVcAorI2RlZmluZSBqc2ltZF9oMnYxX2ZhbmN5X3Vwc2FtcGxlICAgICAgICAgalNIMlYxRlVwCisjZGVmaW5lIGpzaW1kX2Nhbl9oMnYyX21lcmdlZF91cHNhbXBsZSAgICBqU0NhbkgyVjJNVXAKKyNkZWZpbmUganNpbWRfY2FuX2gydjFfbWVyZ2VkX3Vwc2FtcGxlICAgIGpTQ2FuSDJWMU1VcAorI2RlZmluZSBqc2ltZF9oMnYyX21lcmdlZF91cHNhbXBsZSAgICAgICAgalNIMlYyTVVwCisjZGVmaW5lIGpzaW1kX2gydjFfbWVyZ2VkX3Vwc2FtcGxlICAgICAgICBqU0gyVjFNVXAKKyNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCisKK0VYVEVSTihpbnQpIGpzaW1kX2Nhbl9yZ2JfeWNjIEpQUCgodm9pZCkpOworRVhURVJOKGludCkganNpbWRfY2FuX3ljY19yZ2IgSlBQKCh2b2lkKSk7CisKK0VYVEVSTih2b2lkKSBqc2ltZF9yZ2JfeWNjX2NvbnZlcnQKKyAgICAgICAgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAorICAgICAgICAgICAgIEpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKSk7CitFWFRFUk4odm9pZCkganNpbWRfeWNjX3JnYl9jb252ZXJ0CisgICAgICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpKTsKKworRVhURVJOKGludCkganNpbWRfY2FuX2gydjJfZG93bnNhbXBsZSBKUFAoKHZvaWQpKTsKK0VYVEVSTihpbnQpIGpzaW1kX2Nhbl9oMnYxX2Rvd25zYW1wbGUgSlBQKCh2b2lkKSk7CisKK0VYVEVSTih2b2lkKSBqc2ltZF9oMnYyX2Rvd25zYW1wbGUKKyAgICAgICAgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisgICAgICAgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKSk7CitFWFRFUk4odm9pZCkganNpbWRfaDJ2MV9kb3duc2FtcGxlCisgICAgICAgIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorICAgICAgICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkpOworCitFWFRFUk4oaW50KSBqc2ltZF9jYW5faDJ2Ml91cHNhbXBsZSBKUFAoKHZvaWQpKTsKK0VYVEVSTihpbnQpIGpzaW1kX2Nhbl9oMnYxX3Vwc2FtcGxlIEpQUCgodm9pZCkpOworCitFWFRFUk4odm9pZCkganNpbWRfaDJ2Ml91cHNhbXBsZQorICAgICAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorICAgICAgICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikpOworRVhURVJOKHZvaWQpIGpzaW1kX2gydjFfdXBzYW1wbGUKKyAgICAgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKyAgICAgICAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpKTsKKworRVhURVJOKGludCkganNpbWRfY2FuX2gydjJfZmFuY3lfdXBzYW1wbGUgSlBQKCh2b2lkKSk7CitFWFRFUk4oaW50KSBqc2ltZF9jYW5faDJ2MV9mYW5jeV91cHNhbXBsZSBKUFAoKHZvaWQpKTsKKworRVhURVJOKHZvaWQpIGpzaW1kX2gydjJfZmFuY3lfdXBzYW1wbGUKKyAgICAgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKyAgICAgICAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpKTsKK0VYVEVSTih2b2lkKSBqc2ltZF9oMnYxX2ZhbmN5X3Vwc2FtcGxlCisgICAgICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisgICAgICAgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKSk7CisKK0VYVEVSTihpbnQpIGpzaW1kX2Nhbl9oMnYyX21lcmdlZF91cHNhbXBsZSBKUFAoKHZvaWQpKTsKK0VYVEVSTihpbnQpIGpzaW1kX2Nhbl9oMnYxX21lcmdlZF91cHNhbXBsZSBKUFAoKHZvaWQpKTsKKworRVhURVJOKHZvaWQpIGpzaW1kX2gydjJfbWVyZ2VkX3Vwc2FtcGxlCisgICAgICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAorICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikpOworRVhURVJOKHZvaWQpIGpzaW1kX2gydjFfbWVyZ2VkX3Vwc2FtcGxlCisgICAgICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAorICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikpOworCmRpZmYgLS1naXQgYS9qc2ltZGRjdC5oIGIvanNpbWRkY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzNkMGM0Ci0tLSAvZGV2L251bGwKKysrIGIvanNpbWRkY3QuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIGpzaW1kZGN0LmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOSBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisgKiAKKyAqIEJhc2VkIG9uIHRoZSB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnksCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgorICoKKyAqLworCisvKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4gKi8KKworI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyNkZWZpbmUganNpbWRfY2FuX2NvbnZzYW1wICAgICAgICAgICAgICAgIGpTQ2FuQ29udgorI2RlZmluZSBqc2ltZF9jYW5fY29udnNhbXBfZmxvYXQgICAgICAgICAgalNDYW5Db252RgorI2RlZmluZSBqc2ltZF9jb252c2FtcCAgICAgICAgICAgICAgICAgICAgalNDb252CisjZGVmaW5lIGpzaW1kX2NvbnZzYW1wX2Zsb2F0ICAgICAgICAgICAgICBqU0NvbnZGCisjZGVmaW5lIGpzaW1kX2Nhbl9mZGN0X2lzbG93ICAgICAgICAgICAgICBqU0NhbkZEQ1RJUworI2RlZmluZSBqc2ltZF9jYW5fZmRjdF9pZmFzdCAgICAgICAgICAgICAgalNDYW5GRENUSUYKKyNkZWZpbmUganNpbWRfY2FuX2ZkY3RfZmxvYXQgICAgICAgICAgICAgIGpTQ2FuRkRDVEZsCisjZGVmaW5lIGpzaW1kX2ZkY3RfaXNsb3cgICAgICAgICAgICAgICAgICBqU0ZEQ1RJUworI2RlZmluZSBqc2ltZF9mZGN0X2lmYXN0ICAgICAgICAgICAgICAgICAgalNGRENUSUYKKyNkZWZpbmUganNpbWRfZmRjdF9mbG9hdCAgICAgICAgICAgICAgICAgIGpTRkRDVEZsCisjZGVmaW5lIGpzaW1kX2Nhbl9xdWFudGl6ZSAgICAgICAgICAgICAgICBqU0NhblF1YW50CisjZGVmaW5lIGpzaW1kX2Nhbl9xdWFudGl6ZV9mbG9hdCAgICAgICAgICBqU0NhblF1YW50RgorI2RlZmluZSBqc2ltZF9xdWFudGl6ZSAgICAgICAgICAgICAgICAgICAgalNRdWFudAorI2RlZmluZSBqc2ltZF9xdWFudGl6ZV9mbG9hdCAgICAgICAgICAgICAgalNRdWFudEYKKyNkZWZpbmUganNpbWRfY2FuX2lkY3RfMngyICAgICAgICAgICAgICAgIGpTQ2FuSURDVDIyCisjZGVmaW5lIGpzaW1kX2Nhbl9pZGN0XzR4NCAgICAgICAgICAgICAgICBqU0NhbklEQ1Q0NAorI2RlZmluZSBqc2ltZF9pZGN0XzJ4MiAgICAgICAgICAgICAgICAgICAgalNJRENUMjIKKyNkZWZpbmUganNpbWRfaWRjdF80eDQgICAgICAgICAgICAgICAgICAgIGpTSURDVDQ0CisjZGVmaW5lIGpzaW1kX2Nhbl9pZGN0X2lzbG93ICAgICAgICAgICAgICBqU0NhbklEQ1RJUworI2RlZmluZSBqc2ltZF9jYW5faWRjdF9pZmFzdCAgICAgICAgICAgICAgalNDYW5JRENUSUYKKyNkZWZpbmUganNpbWRfY2FuX2lkY3RfZmxvYXQgICAgICAgICAgICAgIGpTQ2FuSURDVEZsCisjZGVmaW5lIGpzaW1kX2lkY3RfaXNsb3cgICAgICAgICAgICAgICAgICBqU0lEQ1RJUworI2RlZmluZSBqc2ltZF9pZGN0X2lmYXN0ICAgICAgICAgICAgICAgICAgalNJRENUSUYKKyNkZWZpbmUganNpbWRfaWRjdF9mbG9hdCAgICAgICAgICAgICAgICAgIGpTSURDVEZsCisjZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLworCitFWFRFUk4oaW50KSBqc2ltZF9jYW5fY29udnNhbXAgSlBQKCh2b2lkKSk7CitFWFRFUk4oaW50KSBqc2ltZF9jYW5fY29udnNhbXBfZmxvYXQgSlBQKCh2b2lkKSk7CisKK0VYVEVSTih2b2lkKSBqc2ltZF9jb252c2FtcCBKUFAoKEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKRElNRU5TSU9OIHN0YXJ0X2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDVEVMRU0gKiB3b3Jrc3BhY2UpKTsKK0VYVEVSTih2b2lkKSBqc2ltZF9jb252c2FtcF9mbG9hdCBKUFAoKEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKRElNRU5TSU9OIHN0YXJ0X2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBU1RfRkxPQVQgKiB3b3Jrc3BhY2UpKTsKKworRVhURVJOKGludCkganNpbWRfY2FuX2ZkY3RfaXNsb3cgSlBQKCh2b2lkKSk7CitFWFRFUk4oaW50KSBqc2ltZF9jYW5fZmRjdF9pZmFzdCBKUFAoKHZvaWQpKTsKK0VYVEVSTihpbnQpIGpzaW1kX2Nhbl9mZGN0X2Zsb2F0IEpQUCgodm9pZCkpOworCitFWFRFUk4odm9pZCkganNpbWRfZmRjdF9pc2xvdyBKUFAoKERDVEVMRU0gKiBkYXRhKSk7CitFWFRFUk4odm9pZCkganNpbWRfZmRjdF9pZmFzdCBKUFAoKERDVEVMRU0gKiBkYXRhKSk7CitFWFRFUk4odm9pZCkganNpbWRfZmRjdF9mbG9hdCBKUFAoKEZBU1RfRkxPQVQgKiBkYXRhKSk7CisKK0VYVEVSTihpbnQpIGpzaW1kX2Nhbl9xdWFudGl6ZSBKUFAoKHZvaWQpKTsKK0VYVEVSTihpbnQpIGpzaW1kX2Nhbl9xdWFudGl6ZV9mbG9hdCBKUFAoKHZvaWQpKTsKKworRVhURVJOKHZvaWQpIGpzaW1kX3F1YW50aXplIEpQUCgoSkNPRUZQVFIgY29lZl9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDVEVMRU0gKiBkaXZpc29ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDVEVMRU0gKiB3b3Jrc3BhY2UpKTsKK0VYVEVSTih2b2lkKSBqc2ltZF9xdWFudGl6ZV9mbG9hdCBKUFAoKEpDT0VGUFRSIGNvZWZfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVNUX0ZMT0FUICogZGl2aXNvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVNUX0ZMT0FUICogd29ya3NwYWNlKSk7CisKK0VYVEVSTihpbnQpIGpzaW1kX2Nhbl9pZGN0XzJ4MiBKUFAoKHZvaWQpKTsKK0VYVEVSTihpbnQpIGpzaW1kX2Nhbl9pZGN0XzR4NCBKUFAoKHZvaWQpKTsKKworRVhURVJOKHZvaWQpIGpzaW1kX2lkY3RfMngyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOworRVhURVJOKHZvaWQpIGpzaW1kX2lkY3RfNHg0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOworCitFWFRFUk4oaW50KSBqc2ltZF9jYW5faWRjdF9pc2xvdyBKUFAoKHZvaWQpKTsKK0VYVEVSTihpbnQpIGpzaW1kX2Nhbl9pZGN0X2lmYXN0IEpQUCgodm9pZCkpOworRVhURVJOKGludCkganNpbWRfY2FuX2lkY3RfZmxvYXQgSlBQKCh2b2lkKSk7CisKK0VYVEVSTih2b2lkKSBqc2ltZF9pZGN0X2lzbG93IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CitFWFRFUk4odm9pZCkganNpbWRfaWRjdF9pZmFzdCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOworRVhURVJOKHZvaWQpIGpzaW1kX2lkY3RfZmxvYXQgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKKwpkaWZmIC0tZ2l0IGEvanNpbWRkamcuYXNtIGIvanNpbWRkamcuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmM4MmU0Li4wMDAwMDAwCi0tLSBhL2pzaW1kZGpnLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi07Ci07IGpzaW1kZGpnLmFzbSAtIFNJTUQgaW5zdHJ1Y3Rpb24gc3VwcG9ydCBjaGVjayAoZm9yIERKR1BQIFYuMikKLTsKLTsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Ci07IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi07IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKLTsKLTsgVGhpcyBmaWxlIHNob3VsZCBiZSBhc3NlbWJsZWQgd2l0aCBOQVNNIChOZXR3aWRlIEFzc2VtYmxlciksCi07IGNhbiAqbm90KiBiZSBhc3NlbWJsZWQgd2l0aCBNaWNyb3NvZnQncyBNQVNNIG9yIGFueSBjb21wYXRpYmxlCi07IGFzc2VtYmxlciAoaW5jbHVkaW5nIEJvcmxhbmQncyBUdXJibyBBc3NlbWJsZXIpLgotOyBOQVNNIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9uYXNtLnNvdXJjZWZvcmdlLm5ldC8gb3IKLTsgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NjIwOAotOwotOyBMYXN0IE1vZGlmaWVkIDogU2VwdGVtYmVyIDI2LCAyMDA0Ci07Ci07IFtUQUI4XQotCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JU0VDVElPTglTRUdfVEVYVAotCUJJVFMJMzIKLTsKLTsgQ2hlY2sgaWYgdGhlIE9TIHN1cHBvcnRzIFNJTUQgaW5zdHJ1Y3Rpb25zIChESkdQUCBWLjIpCi07Ci07IEdMT0JBTCh1bnNpZ25lZCBpbnQpCi07IGpwZWdfc2ltZF9vc19zdXBwb3J0ICh1bnNpZ25lZCBpbnQgc2ltZCkKLTsKLQotJWRlZmluZSBFWENFUFRJT05fSUxMRUdBTF9JTlNUUlVDVElPTgk2CTsgdmVjdG9yIG51bWJlciBvZiAjVUQKLQotJWRlZmluZSBzaW1kCWVicCs4CQkJOyB1bnNpZ25lZCBpbnQgc2ltZAotJWRlZmluZSBteGNzcgllYnAtNAkJCTsgdW5zaWduZWQgaW50IG14Y3NyID0gMHgxRjgwCi0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfc2ltZF9vc19zdXBwb3J0KQotCi1FWFROKGpwZWdfc2ltZF9vc19zdXBwb3J0KToKLQlwdXNoCWVicAotCW1vdgllYnAsZXNwCi0JcHVzaAlkd29yZCAweDFGODAJCTsgZGVmYXVsdCB2YWx1ZSBvZiBNWENTUiByZWdpc3RlcgotCXB1c2gJZWJ4Ci0KLQlwdXNoCURXT1JEIFtzaW1kXQk7IHNpbWRfZmxhZ3MgLSBtb2RpZmllZCBmcm9tIGV4Y2VwdGlvbl9oYW5kbGVyCi0KLQltb3YJYmwsIEVYQ0VQVElPTl9JTExFR0FMX0lOU1RSVUNUSU9OCi0JbW92CWF4LCAweDAyMDIJOyBHZXQgUHJvY2Vzc29yIEV4Y2VwdGlvbiBIYW5kbGVyIFZlY3RvcgotCWludAkweDMxCQk7IERQTUkgZnVuY3Rpb24gY2FsbAotCXB1c2gJZWN4CQk7IHNlbGVjdG9yIG9mIG9sZCBleGNlcHRpb24gaGFuZGxlcgotCXB1c2gJZWR4CQk7IG9mZnNldCAgIG9mIG9sZCBleGNlcHRpb24gaGFuZGxlcgotCi0JbW92CWVjeCxjcwotCW1vdgllZHgsIGV4Y2VwdGlvbl9oYW5kbGVyCi0JbW92CWJsLCBFWENFUFRJT05fSUxMRUdBTF9JTlNUUlVDVElPTgotCW1vdglheCwgMHgwMjAzCTsgU2V0IFByb2Nlc3NvciBFeGNlcHRpb24gSGFuZGxlciBWZWN0b3IKLQlpbnQJMHgzMQkJOyBEUE1JIGZ1bmN0aW9uIGNhbGwKLQotCW1vdgllYXgsIERXT1JEIFtzaW1kXQotCi0JOyBJZiBmbG9hdGluZyBwb2ludCBlbXVsYXRpb24gaXMgZW5hYmxlZCAoQ1IwLkVNID0gMSksCi0JOyBleGVjdXRpbmcgYW4gTU1YLzNETm93ISBpbnN0cnVjdGlvbiBnZW5lcmF0ZXMgaW52YWxpZAotCTsgb3Bjb2RlIGV4Y2VwdGlvbiAoI1VEKS4KLQotCXB1c2gJYnl0ZSAoLm1teF8xIC0gLm1teF8wKQkJOyBpbnN0X2J5dGVzCi0JcHVzaAlieXRlIChKU0lNRF9NTVggfCBKU0lNRF8zRE5PVykJOyB0ZXN0X2ZsYWdzCi0JdGVzdAllYXgsIERXT1JEIFtlc3BdCi0JanoJc2hvcnQgLm1teF8xCi0ubW14XzA6CWVtbXMJCQkJOyBleGVjdXRpbmcgTU1YIGluc3RydWN0aW9uCi0ubW14XzE6CWFkZAllc3AsIGJ5dGUgOAotCi0JcHVzaAlieXRlICguc3NlXzEgLSAuc3NlXzApCi0JcHVzaAlieXRlIChKU0lNRF9TU0UgfCBKU0lNRF9TU0UyKQotCXRlc3QJZWF4LCBEV09SRCBbZXNwXQotCWp6CXNob3J0IC5zc2VfMQotLnNzZV8wOglsZG14Y3NyCURXT1JEIFtteGNzcl0JCTsgZXhlY3V0aW5nIFNTRSBpbnN0cnVjdGlvbgotLnNzZV8xOglhZGQJZXNwLCBieXRlIDgKLQotCXBvcAllZHgJCTsgb2Zmc2V0ICAgb2Ygb2xkIGV4Y2VwdGlvbiBoYW5kbGVyCi0JcG9wCWVjeAkJOyBzZWxlY3RvciBvZiBvbGQgZXhjZXB0aW9uIGhhbmRsZXIKLQltb3YJYmwsIEVYQ0VQVElPTl9JTExFR0FMX0lOU1RSVUNUSU9OCi0JbW92CWF4LCAweDAyMDMJOyBTZXQgUHJvY2Vzc29yIEV4Y2VwdGlvbiBIYW5kbGVyIFZlY3RvcgotCWludAkweDMxCQk7IERQTUkgZnVuY3Rpb24gY2FsbAotCi0JcG9wCWVheAkJOyByZXR1cm4gc2ltZF9mbGFncwotCWFuZAllYXgsIGJ5dGUgSlNJTURfQUxMCi0KLQlwb3AJZWJ4Ci0JbW92CWVzcCxlYnAKLQlwb3AJZWJwCi0JcmV0Ci0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsKLTsgTE9DQUwodm9pZCkgZmFyCi07IGV4Y2VwdGlvbl9oYW5kbGVyICh1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUsCi07ICAgICAgICAgICAgICAgICAgICB2b2lkICogY29udGV4dF9laXAsIHVuc2lnbmVkIHNob3J0IGNvbnRleHRfY3MsCi07ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHRfZWZsYWdzLAotOyAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGNvbnRleHRfZXNwLCB1bnNpZ25lZCBzaG9ydCBjb250ZXh0X3NzKTsKLTsKLQotJWRlZmluZSBlcnJvcl9jb2RlCWVzcCsxMis4CTsgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlCi0lZGVmaW5lIGNvbnRleHRfZWlwCWVzcCsxMisxMgk7IHZvaWQgKiBjb250ZXh0X2VpcAotJWRlZmluZSBjb250ZXh0X2NzCWVzcCsxMisxNgk7IHVuc2lnbmVkIHNob3J0IGNvbnRleHRfY3MKLSVkZWZpbmUgY29udGV4dF9lZmxhZ3MJZXNwKzEyKzIwCTsgdW5zaWduZWQgbG9uZyBjb250ZXh0X2VmbGFncwotJWRlZmluZSBjb250ZXh0X2VzcAllc3ArMTIrMjQJOyB2b2lkICogY29udGV4dF9lc3AKLSVkZWZpbmUgY29udGV4dF9zcwllc3ArMTIrMjgJOyB1bnNpZ25lZCBzaG9ydCBjb250ZXh0X3NzCi0KLSVkZWZpbmUgdGVzdF9mbGFncyhiKQkoYikrMAotJWRlZmluZSBpbnN0X2J5dGVzKGIpCShiKSs0Ci0lZGVmaW5lIHNpbWRfZmxhZ3MoYikJKGIpKzE2Ci0KLQlhbGlnbgkxNgotCi1leGNlcHRpb25faGFuZGxlcjoKLQlwdXNoCWVheAotCXB1c2gJZWN4Ci0JcHVzaAllZHgKLQotCW1vdgllYXgsIFBPSU5URVIgW2NvbnRleHRfZXNwXQotCW1vdgllY3gsIERXT1JEIFt0ZXN0X2ZsYWdzKGVheCldCi0JbW92CWVkeCwgRFdPUkQgW2luc3RfYnl0ZXMoZWF4KV0KLQlub3QJZWN4Ci0JYWRkCVBPSU5URVIgW2NvbnRleHRfZWlwXSwgZWR4CTsgbmV4dCBpbnN0cnVjdGlvbgotCWFuZAlEV09SRCBbc2ltZF9mbGFncyhlYXgpXSwgZWN4CTsgdHVybiBvZmYgZmxhZwotCi0JcG9wCWVkeAotCXBvcAllY3gKLQlwb3AJZWF4Ci0JcmV0ZgotCmRpZmYgLS1naXQgYS9qc2ltZGdjYy5jIGIvanNpbWRnY2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhZDc1Yi4uMDAwMDAwMAotLS0gYS9qc2ltZGdjYy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIGpzaW1kZ2NjLmMgLSBTSU1EIGluc3RydWN0aW9uIHN1cHBvcnQgY2hlY2sgKGdjYykKLSAqCi0gKiB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4ganNpbWRleHQuaW5jCi0gKgotICogTGFzdCBNb2RpZmllZCA6IEphbnVhcnkgMjQsIDIwMDYKLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotCi1zdGF0aWMgdm9sYXRpbGUgaW50IGxvY2tmIC8qID0gMCAqLzsKLXN0YXRpYyBqbXBfYnVmIGptcGJ1ZjsKLQotCi0vKgotICogRXhjZXB0aW9uIGhhbmRsZXIgZm9yIHNpZ25hbCgpCi0gKi8KLQotTE9DQUwodm9pZCkKLWV4Y2VwdGlvbl9oYW5kbGVyIChpbnQgc2lnKQotewotICBzaWduYWwoU0lHSUxMLCBTSUdfREZMKTsKLSAgbG9uZ2ptcChqbXBidWYsIDEpOwotfQotCi0KLS8qCi0gKiBDaGVjayBpZiB0aGUgT1Mgc3VwcG9ydHMgU0lNRCBpbnN0cnVjdGlvbnMKLSAqLwotCi1HTE9CQUwodW5zaWduZWQgaW50KQotanBlZ19zaW1kX29zX3N1cHBvcnQgKHVuc2lnbmVkIGludCBzaW1kKQotewotI2lmZGVmIF9fR05VQ19fCQkvKiBnY2MgKGkzODYpICovCi0gIHVuc2lnbmVkIGludCBteGNzciA9IDB4MUY4MDsKLQotICAvKiBlbnRlciBjcml0aWNhbCBzZWN0aW9uICovCi0gIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgImdldF9sb2NrOiAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgIm1vdmwgICQxLCUlZWF4ICAgICAgICAgICBcblx0IgotICAgICJ4Y2hnbCAlMCwlJWVheCAgICAgICAgICAgXG5cdCIJLyogdHJ5IHRvIGdldCBsb2NrICovCi0gICAgImNtcGwgICQwLCUlZWF4ICAgICAgICAgICBcblx0IgkvKiB0ZXN0IGlmIHN1Y2Nlc3NmdWwgKi8KLSAgICAiamUgICAgY3JpdGljYWxfc2VjdGlvbiAgIFxuIgotICAic3Bpbl9sb29wOiAgICAgICAgICAgICAgICAgXG5cdCIKLSAgLyoiLmJ5dGUgMHhGMywweDkwICAgICAgICAgIFxuXHQiKi8JLyogInBhdXNlIiBvbiBQNCAoc2hvcnQgZGVsYXkpICovCi0gICAgImNtcGwgICQwLCUwICAgICAgICAgICAgICBcblx0IgkvKiBjaGVjayBpZiBsb2NrIGlzIGZyZWUgKi8KLSAgICAiam5lICAgc3Bpbl9sb29wICAgICAgICAgIFxuXHQiCi0gICAgImptcCAgIGdldF9sb2NrICAgICAgICAgICBcbiIKLSAgImNyaXRpY2FsX3NlY3Rpb246ICAgICAgICAgIFxuXHQiCi0gICAgIDogIj1tIiAobG9ja2YpIDogIm0iIChsb2NrZikgOiAiJWVheCIKLSAgKTsKLQotICAvKiBJZiBmbG9hdGluZyBwb2ludCBlbXVsYXRpb24gaXMgZW5hYmxlZCAoQ1IwLkVNID0gMSksCi0gICAqIGV4ZWN1dGluZyBhbiBNTVgvM0ROb3chIGluc3RydWN0aW9uIGdlbmVyYXRlcyBpbnZhbGlkCi0gICAqIG9wY29kZSBleGNlcHRpb24gKCNVRCkuCi0gICAqLwotICBpZiAoc2ltZCAmIChKU0lNRF9NTVggfCBKU0lNRF8zRE5PVykpIHsKLSAgICBpZiAoIXNldGptcChqbXBidWYpKSB7Ci0gICAgICBzaWduYWwoU0lHSUxMLCBleGNlcHRpb25faGFuZGxlcik7Ci0gICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICIuYnl0ZSAweDBGLDB4NzciCQkvKiBlbW1zICovCi0gICAgICApOwotICAgICAgc2lnbmFsKFNJR0lMTCwgU0lHX0RGTCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNpbWQgJj0gfihKU0lNRF9NTVggfCBKU0lNRF8zRE5PVyk7Ci0gICAgfQotICB9Ci0gIGlmIChzaW1kICYgKEpTSU1EX1NTRSB8IEpTSU1EX1NTRTIpKSB7Ci0gICAgaWYgKCFzZXRqbXAoam1wYnVmKSkgewotICAgICAgc2lnbmFsKFNJR0lMTCwgZXhjZXB0aW9uX2hhbmRsZXIpOwotICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAibGVhbCAgJTAsJSVlYXggICAgICAgIFxuXHQiCi0gICAgICAgICIuYnl0ZSAweDBGLDB4QUUsMHgxMCAgXG5cdCIJLyogbGRteGNzciBbZWF4XSAqLwotICAgICAgICAgOiA6ICJtIiAobXhjc3IpIDogIiVlYXgiCi0gICAgICApOwotICAgICAgc2lnbmFsKFNJR0lMTCwgU0lHX0RGTCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNpbWQgJj0gfihKU0lNRF9TU0UgfCBKU0lNRF9TU0UyKTsKLSAgICB9Ci0gIH0KLQotICAvKiBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uICovCi0gIGxvY2tmID0gMDsJLyogcmVsZWFzZSBsb2NrICovCi0jZW5kaWYJLyogX19HTlVDX18gKi8KLQotICByZXR1cm4gc2ltZDsKLX0KZGlmZiAtLWdpdCBhL2pzaW1kdzMyLmFzbSBiL2pzaW1kdzMyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YyY2RiYy4uMDAwMDAwMAotLS0gYS9qc2ltZHczMi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotOwotOyBqc2ltZHczMi5hc20gLSBTSU1EIGluc3RydWN0aW9uIHN1cHBvcnQgY2hlY2sgKGZvciBXaW4zMikKLTsKLTsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Ci07IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi07IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKLTsKLTsgVGhpcyBmaWxlIHNob3VsZCBiZSBhc3NlbWJsZWQgd2l0aCBOQVNNIChOZXR3aWRlIEFzc2VtYmxlciksCi07IGNhbiAqbm90KiBiZSBhc3NlbWJsZWQgd2l0aCBNaWNyb3NvZnQncyBNQVNNIG9yIGFueSBjb21wYXRpYmxlCi07IGFzc2VtYmxlciAoaW5jbHVkaW5nIEJvcmxhbmQncyBUdXJibyBBc3NlbWJsZXIpLgotOyBOQVNNIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9uYXNtLnNvdXJjZWZvcmdlLm5ldC8gb3IKLTsgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NjIwOAotOwotOyBMYXN0IE1vZGlmaWVkIDogU2VwdGVtYmVyIDI2LCAyMDA0Ci07Ci07IFtUQUI4XQotCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JU0VDVElPTglTRUdfVEVYVAotCUJJVFMJMzIKLTsKLTsgQ2hlY2sgaWYgdGhlIE9TIHN1cHBvcnRzIFNJTUQgaW5zdHJ1Y3Rpb25zIChXaW4zMikKLTsKLTsgUmVmZXJlbmNlOiAiV2luMzIgRXhjZXB0aW9uIGhhbmRsaW5nIGZvciBhc3NlbWJsZXIgcHJvZ3JhbW1lcnMiCi07ICAgICAgICAgICAgICAgaHR0cDovL3d3dy5qb3Jnb24uZnJlZXNlcnZlLmNvLnVrL0V4Y2VwdC9FeGNlcHQuaHRtCi07Ci07IEdMT0JBTCh1bnNpZ25lZCBpbnQpCi07IGpwZWdfc2ltZF9vc19zdXBwb3J0ICh1bnNpZ25lZCBpbnQgc2ltZCkKLTsKLQotJWRlZmluZSBzaW1kCWVicCs4CQkJOyB1bnNpZ25lZCBpbnQgc2ltZAotJWRlZmluZSBteGNzcgllYnAtNAkJCTsgdW5zaWduZWQgaW50IG14Y3NyID0gMHgxRjgwCi0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfc2ltZF9vc19zdXBwb3J0KQotCi1FWFROKGpwZWdfc2ltZF9vc19zdXBwb3J0KToKLQlwdXNoCWVicAotCW1vdgllYnAsZXNwCi0JcHVzaAlkd29yZCAweDFGODAJCTsgZGVmYXVsdCB2YWx1ZSBvZiBNWENTUiByZWdpc3RlcgotCXB1c2gJZXhjZXB0aW9uX2hhbmRsZXIKLQlwdXNoCVBPSU5URVIgW2ZzOjBdCQk7IHByZXZfcmVjb3JkX3B0cgotCW1vdglQT0lOVEVSIFtmczowXSwgZXNwCTsgdGhpc19yZWNvcmRfcHRyCi0KLQltb3YJZWF4LCBEV09SRCBbc2ltZF0KLQlhbmQJZWF4LCBieXRlIEpTSU1EX0FMTAotCXhvcgllY3gsZWN4Ci0JeG9yCWVkeCxlZHgKLQotCTsgSWYgZmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uIGlzIGVuYWJsZWQgKENSMC5FTSA9IDEpLAotCTsgZXhlY3V0aW5nIGFuIE1NWC8zRE5vdyEgaW5zdHJ1Y3Rpb24gZ2VuZXJhdGVzIGludmFsaWQKLQk7IG9wY29kZSBleGNlcHRpb24gKCNVRCkuCi0KLQltb3YJY2wsIChKU0lNRF9NTVggfCBKU0lNRF8zRE5PVykKLQltb3YJZGwsICgubW14XzEgLSAubW14XzApCi0JdGVzdAlhbCxjbAotCWp6CXNob3J0IC5tbXhfMQotLm1teF8wOgllbW1zCQkJCTsgZXhlY3V0aW5nIE1NWCBpbnN0cnVjdGlvbgotLm1teF8xOgotCW1vdgljbCwgKEpTSU1EX1NTRSB8IEpTSU1EX1NTRTIpCi0JbW92CWRsLCAoLnNzZV8xIC0gLnNzZV8wKQotCXRlc3QJYWwsY2wKLQlqeglzaG9ydCAuc3NlXzEKLS5zc2VfMDoJbGRteGNzcglEV09SRCBbbXhjc3JdCQk7IGV4ZWN1dGluZyBTU0UgaW5zdHJ1Y3Rpb24KLS5zc2VfMToKLQotCXBvcAlQT0lOVEVSIFtmczowXQkJOyBwcmV2X3JlY29yZF9wdHIKLQltb3YJZXNwLGVicAotCXBvcAllYnAKLQlyZXQKLQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOwotOyBMT0NBTChFWENFUFRJT05fRElTUE9TSVRJT04pCi07IGV4Y2VwdGlvbl9oYW5kbGVyIChzdHJ1Y3QgX0VYQ0VQVElPTl9SRUNPUkQgKiBFeGNlcHRpb25SZWNvcmQsCi07ICAgICAgICAgICAgICAgICAgICB2b2lkICogRXN0YWJsaXNoZXJGcmFtZSwgc3RydWN0IF9DT05URVhUICogQ29udGV4dFJlY29yZCwKLTsgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBEaXNwYXRjaGVyQ29udGV4dCk7Ci07Ci0KLSVkZWZpbmUgRXhjZXB0aW9uQ29udGludWVFeGVjdXRpb24gIDAJOyBmcm9tIDxleGNwdC5oPgotJWRlZmluZSBFeGNlcHRpb25Db250aW51ZVNlYXJjaCAgICAgMQk7IHR5cGVkZWYgZW51bSBfRVhDRVBUSU9OX0RJU1BPU0lUSU9OIHsKLSVkZWZpbmUgRXhjZXB0aW9uTmVzdGVkRXhjZXB0aW9uICAgIDIJOyAgIC4uLgotJWRlZmluZSBFeGNlcHRpb25Db2xsaWRlZFVud2luZCAgICAgMwk7IH0gRVhDRVBUSU9OX0RJU1BPU0lUSU9OCi0KLSVkZWZpbmUgRVhDRVBUSU9OX0lMTEVHQUxfSU5TVFJVQ1RJT04gICAweEMwMDAwMDFECTsgZnJvbSA8d2luYmFzZS5oPgotCi0lZGVmaW5lIEV4Y2VwdGlvblJlY29yZCAgICAgZXNwKzQJOyBzdHJ1Y3QgX0VYQ0VQVElPTl9SRUNPUkQgKgotJWRlZmluZSBFc3RhYmxpc2hlckZyYW1lICAgIGVzcCs4CTsgdm9pZCAqIEVzdGFibGlzaGVyRnJhbWUKLSVkZWZpbmUgQ29udGV4dFJlY29yZCAgICAgICBlc3ArMTIJOyBzdHJ1Y3QgX0NPTlRFWFQgKiBDb250ZXh0UmVjb3JkCi0lZGVmaW5lIERpc3BhdGNoZXJDb250ZXh0ICAgZXNwKzE2CTsgdm9pZCAqIERpc3BhdGNoZXJDb250ZXh0Ci0KLSVkZWZpbmUgRXhjZXB0aW9uQ29kZShiKSAgICAoYikrMAk7IEV4Y2VwdGlvblJlY29yZC0+RXhjZXB0aW9uQ29kZQotJWRlZmluZSBFeGNlcHRpb25GbGFncyhiKSAgIChiKSs0CTsgRXhjZXB0aW9uUmVjb3JkLT5FeGNlcHRpb25GbGFncwotJWRlZmluZSBDb250ZXh0X0VkeChiKSAgICAgIChiKSsxNjgJOyBDb250ZXh0UmVjb3JkLT5FZHgKLSVkZWZpbmUgQ29udGV4dF9FY3goYikgICAgICAoYikrMTcyCTsgQ29udGV4dFJlY29yZC0+RWN4Ci0lZGVmaW5lIENvbnRleHRfRWF4KGIpICAgICAgKGIpKzE3Ngk7IENvbnRleHRSZWNvcmQtPkVheAotJWRlZmluZSBDb250ZXh0X0VpcChiKSAgICAgIChiKSsxODQJOyBDb250ZXh0UmVjb3JkLT5FaXAKLQotCWFsaWduCTE2Ci0KLWV4Y2VwdGlvbl9oYW5kbGVyOgotCW1vdgllZHgsIFBPSU5URVIgW0V4Y2VwdGlvblJlY29yZF0KLQltb3YJZWF4LCBFeGNlcHRpb25Db250aW51ZVNlYXJjaAotCi0JY21wCURXT1JEIFtFeGNlcHRpb25GbGFncyhlZHgpXSwgYnl0ZSAwCi0Jam5lCXNob3J0IC5yZXR1cm4JCQk7IG5vbmNvbnRpbnVhYmxlIGV4Y2VwdGlvbgotCWNtcAlEV09SRCBbRXhjZXB0aW9uQ29kZShlZHgpXSwgRVhDRVBUSU9OX0lMTEVHQUxfSU5TVFJVQ1RJT04KLQlqbmUJc2hvcnQgLnJldHVybgkJCTsgbm90IGEgI1VEIGV4Y2VwdGlvbgotCi0JbW92CWVheCwgUE9JTlRFUiBbQ29udGV4dFJlY29yZF0KLQltb3YJZWN4LCBEV09SRCBbQ29udGV4dF9FY3goZWF4KV0KLQltb3YJZWR4LCBEV09SRCBbQ29udGV4dF9FZHgoZWF4KV0KLQlub3QJZWN4Ci0JYWRkCURXT1JEIFtDb250ZXh0X0VpcChlYXgpXSwgZWR4CTsgbmV4dCBpbnN0cnVjdGlvbgotCWFuZAlEV09SRCBbQ29udGV4dF9FYXgoZWF4KV0sIGVjeAk7IHR1cm4gb2ZmIGZsYWcKLQltb3YJZWF4LCBFeGNlcHRpb25Db250aW51ZUV4ZWN1dGlvbgotLnJldHVybjoKLQlyZXQKLQpkaWZmIC0tZ2l0IGEvbGlianBlZy5kb2MgYi9saWJqcGVnLmRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg5YjIwNi4uMDAwMDAwMAotLS0gYS9saWJqcGVnLmRvYworKysgL2Rldi9udWxsCkBAIC0xLDMwMDYgKzAsMCBAQAotVVNJTkcgVEhFIElKRyBKUEVHIExJQlJBUlkKLQotQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIFRob21hcyBHLiBMYW5lLgotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLUZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLQotCi1UaGlzIGZpbGUgZGVzY3JpYmVzIGhvdyB0byB1c2UgdGhlIElKRyBKUEVHIGxpYnJhcnkgd2l0aGluIGFuIGFwcGxpY2F0aW9uCi1wcm9ncmFtLiAgUmVhZCBpdCBpZiB5b3Ugd2FudCB0byB3cml0ZSBhIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBsaWJyYXJ5LgotCi1UaGUgZmlsZSBleGFtcGxlLmMgcHJvdmlkZXMgaGVhdmlseSBjb21tZW50ZWQgc2tlbGV0b24gY29kZSBmb3IgY2FsbGluZyB0aGUKLUpQRUcgbGlicmFyeS4gIEFsc28gc2VlIGpwZWdsaWIuaCAodGhlIGluY2x1ZGUgZmlsZSB0byBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9uCi1wcm9ncmFtcykgZm9yIGZ1bGwgZGV0YWlscyBhYm91dCBkYXRhIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uIHBhcmFtZXRlciBsaXN0cy4KLVRoZSBsaWJyYXJ5IHNvdXJjZSBjb2RlLCBvZiBjb3Vyc2UsIGlzIHRoZSB1bHRpbWF0ZSByZWZlcmVuY2UuCi0KLU5vdGUgdGhhdCB0aGVyZSBoYXZlIGJlZW4gKm1ham9yKiBjaGFuZ2VzIGZyb20gdGhlIGFwcGxpY2F0aW9uIGludGVyZmFjZQotcHJlc2VudGVkIGJ5IElKRyB2ZXJzaW9uIDQgYW5kIGVhcmxpZXIgdmVyc2lvbnMuICBUaGUgb2xkIGRlc2lnbiBoYWQgc2V2ZXJhbAotaW5oZXJlbnQgbGltaXRhdGlvbnMsIGFuZCBpdCBoYWQgYWNjdW11bGF0ZWQgYSBsb3Qgb2YgY3J1ZnQgYXMgd2UgYWRkZWQKLWZlYXR1cmVzIHdoaWxlIHRyeWluZyB0byBtaW5pbWl6ZSBhcHBsaWNhdGlvbi1pbnRlcmZhY2UgY2hhbmdlcy4gIFdlIGhhdmUKLXNhY3JpZmljZWQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpbiB0aGUgdmVyc2lvbiA1IHJld3JpdGUsIGJ1dCB3ZSB0aGluayB0aGUKLWltcHJvdmVtZW50cyBqdXN0aWZ5IHRoaXMuCi0KLQotVEFCTEUgT0YgQ09OVEVOVFMKLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU92ZXJ2aWV3OgotCUZ1bmN0aW9ucyBwcm92aWRlZCBieSB0aGUgbGlicmFyeQotCU91dGxpbmUgb2YgdHlwaWNhbCB1c2FnZQotQmFzaWMgbGlicmFyeSB1c2FnZToKLQlEYXRhIGZvcm1hdHMKLQlDb21wcmVzc2lvbiBkZXRhaWxzCi0JRGVjb21wcmVzc2lvbiBkZXRhaWxzCi0JTWVjaGFuaWNzIG9mIHVzYWdlOiBpbmNsdWRlIGZpbGVzLCBsaW5raW5nLCBldGMKLUFkdmFuY2VkIGZlYXR1cmVzOgotCUNvbXByZXNzaW9uIHBhcmFtZXRlciBzZWxlY3Rpb24KLQlEZWNvbXByZXNzaW9uIHBhcmFtZXRlciBzZWxlY3Rpb24KLQlTcGVjaWFsIGNvbG9yIHNwYWNlcwotCUVycm9yIGhhbmRsaW5nCi0JQ29tcHJlc3NlZCBkYXRhIGhhbmRsaW5nIChzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1hbmFnZXJzKQotCUkvTyBzdXNwZW5zaW9uCi0JUHJvZ3Jlc3NpdmUgSlBFRyBzdXBwb3J0Ci0JQnVmZmVyZWQtaW1hZ2UgbW9kZQotCUFiYnJldmlhdGVkIGRhdGFzdHJlYW1zIGFuZCBtdWx0aXBsZSBpbWFnZXMKLQlTcGVjaWFsIG1hcmtlcnMKLQlSYXcgKGRvd25zYW1wbGVkKSBpbWFnZSBkYXRhCi0JUmVhbGx5IHJhdyBkYXRhOiBEQ1QgY29lZmZpY2llbnRzCi0JUHJvZ3Jlc3MgbW9uaXRvcmluZwotCU1lbW9yeSBtYW5hZ2VtZW50Ci0JTWVtb3J5IHVzYWdlCi0JTGlicmFyeSBjb21waWxlLXRpbWUgb3B0aW9ucwotCVBvcnRhYmlsaXR5IGNvbnNpZGVyYXRpb25zCi0JTm90ZXMgZm9yIE1TLURPUyBpbXBsZW1lbnRvcnMKLQotWW91IHNob3VsZCByZWFkIGF0IGxlYXN0IHRoZSBvdmVydmlldyBhbmQgYmFzaWMgdXNhZ2Ugc2VjdGlvbnMgYmVmb3JlIHRyeWluZwotdG8gcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LiAgVGhlIHNlY3Rpb25zIG9uIGFkdmFuY2VkIGZlYXR1cmVzIGNhbiBiZSByZWFkCi1pZiBhbmQgd2hlbiB5b3UgbmVlZCB0aGVtLgotCi0KLU9WRVJWSUVXCi09PT09PT09PQotCi1GdW5jdGlvbnMgcHJvdmlkZWQgYnkgdGhlIGxpYnJhcnkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgSUpHIEpQRUcgbGlicmFyeSBwcm92aWRlcyBDIGNvZGUgdG8gcmVhZCBhbmQgd3JpdGUgSlBFRy1jb21wcmVzc2VkIGltYWdlCi1maWxlcy4gIFRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBwcm9ncmFtIHJlY2VpdmVzIG9yIHN1cHBsaWVzIGltYWdlIGRhdGEgYQotc2NhbmxpbmUgYXQgYSB0aW1lLCB1c2luZyBhIHN0cmFpZ2h0Zm9yd2FyZCB1bmNvbXByZXNzZWQgaW1hZ2UgZm9ybWF0LiAgQWxsCi1kZXRhaWxzIG9mIGNvbG9yIGNvbnZlcnNpb24gYW5kIG90aGVyIHByZXByb2Nlc3NpbmcvcG9zdHByb2Nlc3NpbmcgY2FuIGJlCi1oYW5kbGVkIGJ5IHRoZSBsaWJyYXJ5LgotCi1UaGUgbGlicmFyeSBpbmNsdWRlcyBhIHN1YnN0YW50aWFsIGFtb3VudCBvZiBjb2RlIHRoYXQgaXMgbm90IGNvdmVyZWQgYnkgdGhlCi1KUEVHIHN0YW5kYXJkIGJ1dCBpcyBuZWNlc3NhcnkgZm9yIHR5cGljYWwgYXBwbGljYXRpb25zIG9mIEpQRUcuICBUaGVzZQotZnVuY3Rpb25zIHByZXByb2Nlc3MgdGhlIGltYWdlIGJlZm9yZSBKUEVHIGNvbXByZXNzaW9uIG9yIHBvc3Rwcm9jZXNzIGl0IGFmdGVyCi1kZWNvbXByZXNzaW9uLiAgVGhleSBpbmNsdWRlIGNvbG9yc3BhY2UgY29udmVyc2lvbiwgZG93bnNhbXBsaW5nL3Vwc2FtcGxpbmcsCi1hbmQgY29sb3IgcXVhbnRpemF0aW9uLiAgVGhlIGFwcGxpY2F0aW9uIGluZGlyZWN0bHkgc2VsZWN0cyB1c2Ugb2YgdGhpcyBjb2RlCi1ieSBzcGVjaWZ5aW5nIHRoZSBmb3JtYXQgaW4gd2hpY2ggaXQgd2lzaGVzIHRvIHN1cHBseSBvciByZWNlaXZlIGltYWdlIGRhdGEuCi1Gb3IgZXhhbXBsZSwgaWYgY29sb3JtYXBwZWQgb3V0cHV0IGlzIHJlcXVlc3RlZCwgdGhlbiB0aGUgZGVjb21wcmVzc2lvbgotbGlicmFyeSBhdXRvbWF0aWNhbGx5IGludm9rZXMgY29sb3IgcXVhbnRpemF0aW9uLgotCi1BIHdpZGUgcmFuZ2Ugb2YgcXVhbGl0eSB2cy4gc3BlZWQgdHJhZGVvZmZzIGFyZSBwb3NzaWJsZSBpbiBKUEVHIHByb2Nlc3NpbmcsCi1hbmQgZXZlbiBtb3JlIHNvIGluIGRlY29tcHJlc3Npb24gcG9zdHByb2Nlc3NpbmcuICBUaGUgZGVjb21wcmVzc2lvbiBsaWJyYXJ5Ci1wcm92aWRlcyBtdWx0aXBsZSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjb3ZlciBtb3N0IG9mIHRoZSB1c2VmdWwgdHJhZGVvZmZzLAotcmFuZ2luZyBmcm9tIHZlcnktaGlnaC1xdWFsaXR5IGRvd24gdG8gZmFzdC1wcmV2aWV3IG9wZXJhdGlvbi4gIE9uIHRoZQotY29tcHJlc3Npb24gc2lkZSB3ZSBoYXZlIGdlbmVyYWxseSBub3QgcHJvdmlkZWQgbG93LXF1YWxpdHkgY2hvaWNlcywgc2luY2UKLWNvbXByZXNzaW9uIGlzIG5vcm1hbGx5IGxlc3MgdGltZS1jcml0aWNhbC4gIEl0IHNob3VsZCBiZSB1bmRlcnN0b29kIHRoYXQgdGhlCi1sb3ctcXVhbGl0eSBtb2RlcyBtYXkgbm90IG1lZXQgdGhlIEpQRUcgc3RhbmRhcmQncyBhY2N1cmFjeSByZXF1aXJlbWVudHM7Ci1ub25ldGhlbGVzcywgdGhleSBhcmUgdXNlZnVsIGZvciB2aWV3ZXJzLgotCi1BIHdvcmQgYWJvdXQgZnVuY3Rpb25zICpub3QqIHByb3ZpZGVkIGJ5IHRoZSBsaWJyYXJ5LiAgV2UgaGFuZGxlIGEgc3Vic2V0IG9mCi10aGUgSVNPIEpQRUcgc3RhbmRhcmQ7IG1vc3QgYmFzZWxpbmUsIGV4dGVuZGVkLXNlcXVlbnRpYWwsIGFuZCBwcm9ncmVzc2l2ZQotSlBFRyBwcm9jZXNzZXMgYXJlIHN1cHBvcnRlZC4gIChPdXIgc3Vic2V0IGluY2x1ZGVzIGFsbCBmZWF0dXJlcyBub3cgaW4gY29tbW9uCi11c2UuKSAgVW5zdXBwb3J0ZWQgSVNPIG9wdGlvbnMgaW5jbHVkZToKLQkqIEhpZXJhcmNoaWNhbCBzdG9yYWdlCi0JKiBMb3NzbGVzcyBKUEVHCi0JKiBBcml0aG1ldGljIGVudHJvcHkgY29kaW5nICh1bnN1cHBvcnRlZCBmb3IgbGVnYWwgcmVhc29ucykKLQkqIEROTCBtYXJrZXIKLQkqIE5vbmludGVncmFsIHN1YnNhbXBsaW5nIHJhdGlvcwotV2Ugc3VwcG9ydCBib3RoIDgtIGFuZCAxMi1iaXQgZGF0YSBwcmVjaXNpb24sIGJ1dCB0aGlzIGlzIGEgY29tcGlsZS10aW1lCi1jaG9pY2UgcmF0aGVyIHRoYW4gYSBydW4tdGltZSBjaG9pY2U7IGhlbmNlIGl0IGlzIGRpZmZpY3VsdCB0byB1c2UgYm90aAotcHJlY2lzaW9ucyBpbiBhIHNpbmdsZSBhcHBsaWNhdGlvbi4KLQotQnkgaXRzZWxmLCB0aGUgbGlicmFyeSBoYW5kbGVzIG9ubHkgaW50ZXJjaGFuZ2UgSlBFRyBkYXRhc3RyZWFtcyAtLS0gaW4KLXBhcnRpY3VsYXIgdGhlIHdpZGVseSB1c2VkIEpGSUYgZmlsZSBmb3JtYXQuICBUaGUgbGlicmFyeSBjYW4gYmUgdXNlZCBieQotc3Vycm91bmRpbmcgY29kZSB0byBwcm9jZXNzIGludGVyY2hhbmdlIG9yIGFiYnJldmlhdGVkIEpQRUcgZGF0YXN0cmVhbXMgdGhhdAotYXJlIGVtYmVkZGVkIGluIG1vcmUgY29tcGxleCBmaWxlIGZvcm1hdHMuICAoRm9yIGV4YW1wbGUsIHRoaXMgbGlicmFyeSBpcwotdXNlZCBieSB0aGUgZnJlZSBMSUJUSUZGIGxpYnJhcnkgdG8gc3VwcG9ydCBKUEVHIGNvbXByZXNzaW9uIGluIFRJRkYuKQotCi0KLU91dGxpbmUgb2YgdHlwaWNhbCB1c2FnZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSByb3VnaCBvdXRsaW5lIG9mIGEgSlBFRyBjb21wcmVzc2lvbiBvcGVyYXRpb24gaXM6Ci0KLQlBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0Ci0JU3BlY2lmeSB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBjb21wcmVzc2VkIGRhdGEgKGVnLCBhIGZpbGUpCi0JU2V0IHBhcmFtZXRlcnMgZm9yIGNvbXByZXNzaW9uLCBpbmNsdWRpbmcgaW1hZ2Ugc2l6ZSAmIGNvbG9yc3BhY2UKLQlqcGVnX3N0YXJ0X2NvbXByZXNzKC4uLik7Ci0Jd2hpbGUgKHNjYW4gbGluZXMgcmVtYWluIHRvIGJlIHdyaXR0ZW4pCi0JCWpwZWdfd3JpdGVfc2NhbmxpbmVzKC4uLik7Ci0JanBlZ19maW5pc2hfY29tcHJlc3MoLi4uKTsKLQlSZWxlYXNlIHRoZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdAotCi1BIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0IGhvbGRzIHBhcmFtZXRlcnMgYW5kIHdvcmtpbmcgc3RhdGUgZm9yIHRoZSBKUEVHCi1saWJyYXJ5LiAgV2UgbWFrZSBjcmVhdGlvbi9kZXN0cnVjdGlvbiBvZiB0aGUgb2JqZWN0IHNlcGFyYXRlIGZyb20gc3RhcnRpbmcKLW9yIGZpbmlzaGluZyBjb21wcmVzc2lvbiBvZiBhbiBpbWFnZTsgdGhlIHNhbWUgb2JqZWN0IGNhbiBiZSByZS11c2VkIGZvciBhCi1zZXJpZXMgb2YgaW1hZ2UgY29tcHJlc3Npb24gb3BlcmF0aW9ucy4gIFRoaXMgbWFrZXMgaXQgZWFzeSB0byByZS11c2UgdGhlCi1zYW1lIHBhcmFtZXRlciBzZXR0aW5ncyBmb3IgYSBzZXF1ZW5jZSBvZiBpbWFnZXMuICBSZS11c2Ugb2YgYSBKUEVHIG9iamVjdAotYWxzbyBoYXMgaW1wb3J0YW50IGltcGxpY2F0aW9ucyBmb3IgcHJvY2Vzc2luZyBhYmJyZXZpYXRlZCBKUEVHIGRhdGFzdHJlYW1zLAotYXMgZGlzY3Vzc2VkIGxhdGVyLgotCi1UaGUgaW1hZ2UgZGF0YSB0byBiZSBjb21wcmVzc2VkIGlzIHN1cHBsaWVkIHRvIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkgZnJvbQotaW4tbWVtb3J5IGJ1ZmZlcnMuICBJZiB0aGUgYXBwbGljYXRpb24gaXMgZG9pbmcgZmlsZS10by1maWxlIGNvbXByZXNzaW9uLAotcmVhZGluZyBpbWFnZSBkYXRhIGZyb20gdGhlIHNvdXJjZSBmaWxlIGlzIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5LgotVGhlIGxpYnJhcnkgZW1pdHMgY29tcHJlc3NlZCBkYXRhIGJ5IGNhbGxpbmcgYSAiZGF0YSBkZXN0aW5hdGlvbiBtYW5hZ2VyIiwKLXdoaWNoIHR5cGljYWxseSB3aWxsIHdyaXRlIHRoZSBkYXRhIGludG8gYSBmaWxlOyBidXQgdGhlIGFwcGxpY2F0aW9uIGNhbgotcHJvdmlkZSBpdHMgb3duIGRlc3RpbmF0aW9uIG1hbmFnZXIgdG8gZG8gc29tZXRoaW5nIGVsc2UuCi0KLVNpbWlsYXJseSwgdGhlIHJvdWdoIG91dGxpbmUgb2YgYSBKUEVHIGRlY29tcHJlc3Npb24gb3BlcmF0aW9uIGlzOgotCi0JQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0Ci0JU3BlY2lmeSB0aGUgc291cmNlIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgKGVnLCBhIGZpbGUpCi0JQ2FsbCBqcGVnX3JlYWRfaGVhZGVyKCkgdG8gb2J0YWluIGltYWdlIGluZm8KLQlTZXQgcGFyYW1ldGVycyBmb3IgZGVjb21wcmVzc2lvbgotCWpwZWdfc3RhcnRfZGVjb21wcmVzcyguLi4pOwotCXdoaWxlIChzY2FuIGxpbmVzIHJlbWFpbiB0byBiZSByZWFkKQotCQlqcGVnX3JlYWRfc2NhbmxpbmVzKC4uLik7Ci0JanBlZ19maW5pc2hfZGVjb21wcmVzcyguLi4pOwotCVJlbGVhc2UgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QKLQotVGhpcyBpcyBjb21wYXJhYmxlIHRvIHRoZSBjb21wcmVzc2lvbiBvdXRsaW5lIGV4Y2VwdCB0aGF0IHJlYWRpbmcgdGhlCi1kYXRhc3RyZWFtIGhlYWRlciBpcyBhIHNlcGFyYXRlIHN0ZXAuICBUaGlzIGlzIGhlbHBmdWwgYmVjYXVzZSBpbmZvcm1hdGlvbgotYWJvdXQgdGhlIGltYWdlJ3Mgc2l6ZSwgY29sb3JzcGFjZSwgZXRjIGlzIGF2YWlsYWJsZSB3aGVuIHRoZSBhcHBsaWNhdGlvbgotc2VsZWN0cyBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMuICBGb3IgZXhhbXBsZSwgdGhlIGFwcGxpY2F0aW9uIGNhbiBjaG9vc2UgYW4KLW91dHB1dCBzY2FsaW5nIHJhdGlvIHRoYXQgd2lsbCBmaXQgdGhlIGltYWdlIGludG8gdGhlIGF2YWlsYWJsZSBzY3JlZW4gc2l6ZS4KLQotVGhlIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYnRhaW5zIGNvbXByZXNzZWQgZGF0YSBieSBjYWxsaW5nIGEgZGF0YSBzb3VyY2UKLW1hbmFnZXIsIHdoaWNoIHR5cGljYWxseSB3aWxsIHJlYWQgdGhlIGRhdGEgZnJvbSBhIGZpbGU7IGJ1dCBvdGhlciBiZWhhdmlvcnMKLWNhbiBiZSBvYnRhaW5lZCB3aXRoIGEgY3VzdG9tIHNvdXJjZSBtYW5hZ2VyLiAgRGVjb21wcmVzc2VkIGRhdGEgaXMgZGVsaXZlcmVkCi1pbnRvIGluLW1lbW9yeSBidWZmZXJzIHBhc3NlZCB0byBqcGVnX3JlYWRfc2NhbmxpbmVzKCkuCi0KLUl0IGlzIHBvc3NpYmxlIHRvIGFib3J0IGFuIGluY29tcGxldGUgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBvcGVyYXRpb24KLWJ5IGNhbGxpbmcganBlZ19hYm9ydCgpOyBvciwgaWYgeW91IGRvIG5vdCBuZWVkIHRvIHJldGFpbiB0aGUgSlBFRyBvYmplY3QsCi1zaW1wbHkgcmVsZWFzZSBpdCBieSBjYWxsaW5nIGpwZWdfZGVzdHJveSgpLgotCi1KUEVHIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG9iamVjdHMgYXJlIHR3byBzZXBhcmF0ZSBzdHJ1Y3QgdHlwZXMuCi1Ib3dldmVyLCB0aGV5IHNoYXJlIHNvbWUgY29tbW9uIGZpZWxkcywgYW5kIGNlcnRhaW4gcm91dGluZXMgc3VjaCBhcwotanBlZ19kZXN0cm95KCkgY2FuIHdvcmsgb24gZWl0aGVyIHR5cGUgb2Ygb2JqZWN0LgotCi1UaGUgSlBFRyBsaWJyYXJ5IGhhcyBubyBzdGF0aWMgdmFyaWFibGVzOiBhbGwgc3RhdGUgaXMgaW4gdGhlIGNvbXByZXNzaW9uCi1vciBkZWNvbXByZXNzaW9uIG9iamVjdC4gIFRoZXJlZm9yZSBpdCBpcyBwb3NzaWJsZSB0byBwcm9jZXNzIG11bHRpcGxlCi1jb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBvcGVyYXRpb25zIGNvbmN1cnJlbnRseSwgdXNpbmcgbXVsdGlwbGUgSlBFRwotb2JqZWN0cy4KLQotQm90aCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBjYW4gYmUgZG9uZSBpbiBhbiBpbmNyZW1lbnRhbCBtZW1vcnktdG8tCi1tZW1vcnkgZmFzaGlvbiwgaWYgc3VpdGFibGUgc291cmNlL2Rlc3RpbmF0aW9uIG1hbmFnZXJzIGFyZSB1c2VkLiAgU2VlIHRoZQotc2VjdGlvbiBvbiAiSS9PIHN1c3BlbnNpb24iIGZvciBtb3JlIGRldGFpbHMuCi0KLQotQkFTSUMgTElCUkFSWSBVU0FHRQotPT09PT09PT09PT09PT09PT09PQotCi1EYXRhIGZvcm1hdHMKLS0tLS0tLS0tLS0tLQotCi1CZWZvcmUgZGl2aW5nIGludG8gcHJvY2VkdXJhbCBkZXRhaWxzLCBpdCBpcyBoZWxwZnVsIHRvIHVuZGVyc3RhbmQgdGhlCi1pbWFnZSBkYXRhIGZvcm1hdCB0aGF0IHRoZSBKUEVHIGxpYnJhcnkgZXhwZWN0cyBvciByZXR1cm5zLgotCi1UaGUgc3RhbmRhcmQgaW5wdXQgaW1hZ2UgZm9ybWF0IGlzIGEgcmVjdGFuZ3VsYXIgYXJyYXkgb2YgcGl4ZWxzLCB3aXRoIGVhY2gKLXBpeGVsIGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2YgImNvbXBvbmVudCIgb3IgInNhbXBsZSIgdmFsdWVzIChjb2xvcgotY2hhbm5lbHMpLiAgWW91IG11c3Qgc3BlY2lmeSBob3cgbWFueSBjb21wb25lbnRzIHRoZXJlIGFyZSBhbmQgdGhlIGNvbG9yc3BhY2UKLWludGVycHJldGF0aW9uIG9mIHRoZSBjb21wb25lbnRzLiAgTW9zdCBhcHBsaWNhdGlvbnMgd2lsbCB1c2UgUkdCIGRhdGEKLSh0aHJlZSBjb21wb25lbnRzIHBlciBwaXhlbCkgb3IgZ3JheXNjYWxlIGRhdGEgKG9uZSBjb21wb25lbnQgcGVyIHBpeGVsKS4KLVBMRUFTRSBOT1RFIFRIQVQgUkdCIERBVEEgSVMgVEhSRUUgU0FNUExFUyBQRVIgUElYRUwsIEdSQVlTQ0FMRSBPTkxZIE9ORS4KLUEgcmVtYXJrYWJsZSBudW1iZXIgb2YgcGVvcGxlIG1hbmFnZSB0byBtaXNzIHRoaXMsIG9ubHkgdG8gZmluZCB0aGF0IHRoZWlyCi1wcm9ncmFtcyBkb24ndCB3b3JrIHdpdGggZ3JheXNjYWxlIEpQRUcgZmlsZXMuCi0KLVRoZXJlIGlzIG5vIHByb3Zpc2lvbiBmb3IgY29sb3JtYXBwZWQgaW5wdXQuICBKUEVHIGZpbGVzIGFyZSBhbHdheXMgZnVsbC1jb2xvcgotb3IgZnVsbCBncmF5c2NhbGUgKG9yIHNvbWV0aW1lcyBhbm90aGVyIGNvbG9yc3BhY2Ugc3VjaCBhcyBDTVlLKS4gIFlvdSBjYW4KLWZlZWQgaW4gYSBjb2xvcm1hcHBlZCBpbWFnZSBieSBleHBhbmRpbmcgaXQgdG8gZnVsbC1jb2xvciBmb3JtYXQuICBIb3dldmVyCi1KUEVHIG9mdGVuIGRvZXNuJ3Qgd29yayB2ZXJ5IHdlbGwgd2l0aCBzb3VyY2UgZGF0YSB0aGF0IGhhcyBiZWVuIGNvbG9ybWFwcGVkLAotYmVjYXVzZSBvZiBkaXRoZXJpbmcgbm9pc2UuICBUaGlzIGlzIGRpc2N1c3NlZCBpbiBtb3JlIGRldGFpbCBpbiB0aGUgSlBFRyBGQVEKLWFuZCB0aGUgb3RoZXIgcmVmZXJlbmNlcyBtZW50aW9uZWQgaW4gdGhlIFJFQURNRSBmaWxlLgotCi1QaXhlbHMgYXJlIHN0b3JlZCBieSBzY2FubGluZXMsIHdpdGggZWFjaCBzY2FubGluZSBydW5uaW5nIGZyb20gbGVmdCB0bwotcmlnaHQuICBUaGUgY29tcG9uZW50IHZhbHVlcyBmb3IgZWFjaCBwaXhlbCBhcmUgYWRqYWNlbnQgaW4gdGhlIHJvdzsgZm9yCi1leGFtcGxlLCBSLEcsQixSLEcsQixSLEcsQiwuLi4gZm9yIDI0LWJpdCBSR0IgY29sb3IuICBFYWNoIHNjYW5saW5lIGlzIGFuCi1hcnJheSBvZiBkYXRhIHR5cGUgSlNBTVBMRSAtLS0gd2hpY2ggaXMgdHlwaWNhbGx5ICJ1bnNpZ25lZCBjaGFyIiwgdW5sZXNzCi15b3UndmUgY2hhbmdlZCBqbW9yZWNmZy5oLiAgKFlvdSBjYW4gYWxzbyBjaGFuZ2UgdGhlIFJHQiBwaXhlbCBsYXlvdXQsIHNheQotdG8gQixHLFIgb3JkZXIsIGJ5IG1vZGlmeWluZyBqbW9yZWNmZy5oLiAgQnV0IHNlZSB0aGUgcmVzdHJpY3Rpb25zIGxpc3RlZCBpbgotdGhhdCBmaWxlIGJlZm9yZSBkb2luZyBzby4pCi0KLUEgMi1EIGFycmF5IG9mIHBpeGVscyBpcyBmb3JtZWQgYnkgbWFraW5nIGEgbGlzdCBvZiBwb2ludGVycyB0byB0aGUgc3RhcnRzIG9mCi1zY2FubGluZXM7IHNvIHRoZSBzY2FubGluZXMgbmVlZCBub3QgYmUgcGh5c2ljYWxseSBhZGphY2VudCBpbiBtZW1vcnkuICBFdmVuCi1pZiB5b3UgcHJvY2VzcyBqdXN0IG9uZSBzY2FubGluZSBhdCBhIHRpbWUsIHlvdSBtdXN0IG1ha2UgYSBvbmUtZWxlbWVudAotcG9pbnRlciBhcnJheSB0byBjb25mb3JtIHRvIHRoaXMgc3RydWN0dXJlLiAgUG9pbnRlcnMgdG8gSlNBTVBMRSByb3dzIGFyZSBvZgotdHlwZSBKU0FNUFJPVywgYW5kIHRoZSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIGFycmF5IGlzIG9mIHR5cGUgSlNBTVBBUlJBWS4KLQotVGhlIGxpYnJhcnkgYWNjZXB0cyBvciBzdXBwbGllcyBvbmUgb3IgbW9yZSBjb21wbGV0ZSBzY2FubGluZXMgcGVyIGNhbGwuCi1JdCBpcyBub3QgcG9zc2libGUgdG8gcHJvY2VzcyBwYXJ0IG9mIGEgcm93IGF0IGEgdGltZS4gIFNjYW5saW5lcyBhcmUgYWx3YXlzCi1wcm9jZXNzZWQgdG9wLXRvLWJvdHRvbS4gIFlvdSBjYW4gcHJvY2VzcyBhbiBlbnRpcmUgaW1hZ2UgaW4gb25lIGNhbGwgaWYgeW91Ci1oYXZlIGl0IGFsbCBpbiBtZW1vcnksIGJ1dCB1c3VhbGx5IGl0J3Mgc2ltcGxlc3QgdG8gcHJvY2VzcyBvbmUgc2NhbmxpbmUgYXQKLWEgdGltZS4KLQotRm9yIGJlc3QgcmVzdWx0cywgc291cmNlIGRhdGEgdmFsdWVzIHNob3VsZCBoYXZlIHRoZSBwcmVjaXNpb24gc3BlY2lmaWVkIGJ5Ci1CSVRTX0lOX0pTQU1QTEUgKG5vcm1hbGx5IDggYml0cykuICBGb3IgaW5zdGFuY2UsIGlmIHlvdSBjaG9vc2UgdG8gY29tcHJlc3MKLWRhdGEgdGhhdCdzIG9ubHkgNiBiaXRzL2NoYW5uZWwsIHlvdSBzaG91bGQgbGVmdC1qdXN0aWZ5IGVhY2ggdmFsdWUgaW4gYQotYnl0ZSBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgY29tcHJlc3Nvci4gIElmIHlvdSBuZWVkIHRvIGNvbXByZXNzIGRhdGEKLXRoYXQgaGFzIG1vcmUgdGhhbiA4IGJpdHMvY2hhbm5lbCwgY29tcGlsZSB3aXRoIEJJVFNfSU5fSlNBTVBMRSA9IDEyLgotKFNlZSAiTGlicmFyeSBjb21waWxlLXRpbWUgb3B0aW9ucyIsIGxhdGVyLikKLQotCi1UaGUgZGF0YSBmb3JtYXQgcmV0dXJuZWQgYnkgdGhlIGRlY29tcHJlc3NvciBpcyB0aGUgc2FtZSBpbiBhbGwgZGV0YWlscywKLWV4Y2VwdCB0aGF0IGNvbG9ybWFwcGVkIG91dHB1dCBpcyBzdXBwb3J0ZWQuICAoQWdhaW4sIGEgSlBFRyBmaWxlIGlzIG5ldmVyCi1jb2xvcm1hcHBlZC4gIEJ1dCB5b3UgY2FuIGFzayB0aGUgZGVjb21wcmVzc29yIHRvIHBlcmZvcm0gb24tdGhlLWZseSBjb2xvcgotcXVhbnRpemF0aW9uIHRvIGRlbGl2ZXIgY29sb3JtYXBwZWQgb3V0cHV0LikgIElmIHlvdSByZXF1ZXN0IGNvbG9ybWFwcGVkCi1vdXRwdXQgdGhlbiB0aGUgcmV0dXJuZWQgZGF0YSBhcnJheSBjb250YWlucyBhIHNpbmdsZSBKU0FNUExFIHBlciBwaXhlbDsKLWl0cyB2YWx1ZSBpcyBhbiBpbmRleCBpbnRvIGEgY29sb3IgbWFwLiAgVGhlIGNvbG9yIG1hcCBpcyByZXByZXNlbnRlZCBhcwotYSAyLUQgSlNBTVBBUlJBWSBpbiB3aGljaCBlYWNoIHJvdyBob2xkcyB0aGUgdmFsdWVzIG9mIG9uZSBjb2xvciBjb21wb25lbnQsCi10aGF0IGlzLCBjb2xvcm1hcFtpXVtqXSBpcyB0aGUgdmFsdWUgb2YgdGhlIGkndGggY29sb3IgY29tcG9uZW50IGZvciBwaXhlbAotdmFsdWUgKG1hcCBpbmRleCkgai4gIE5vdGUgdGhhdCBzaW5jZSB0aGUgY29sb3JtYXAgaW5kZXhlcyBhcmUgc3RvcmVkIGluCi1KU0FNUExFcywgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbG9ycyBpcyBsaW1pdGVkIGJ5IHRoZSBzaXplIG9mIEpTQU1QTEUKLShpZSwgYXQgbW9zdCAyNTYgY29sb3JzIGZvciBhbiA4LWJpdCBKUEVHIGxpYnJhcnkpLgotCi0KLUNvbXByZXNzaW9uIGRldGFpbHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSGVyZSB3ZSByZXZpc2l0IHRoZSBKUEVHIGNvbXByZXNzaW9uIG91dGxpbmUgZ2l2ZW4gaW4gdGhlIG92ZXJ2aWV3LgotCi0xLiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0LgotCi1BIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0IGlzIGEgInN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCIuICAoSXQgYWxzbyBoYXMKLWEgYnVuY2ggb2Ygc3Vic2lkaWFyeSBzdHJ1Y3R1cmVzIHdoaWNoIGFyZSBhbGxvY2F0ZWQgdmlhIG1hbGxvYygpLCBidXQgdGhlCi1hcHBsaWNhdGlvbiBkb2Vzbid0IGNvbnRyb2wgdGhvc2UgZGlyZWN0bHkuKSAgVGhpcyBzdHJ1Y3QgY2FuIGJlIGp1c3QgYSBsb2NhbAotdmFyaWFibGUgaW4gdGhlIGNhbGxpbmcgcm91dGluZSwgaWYgYSBzaW5nbGUgcm91dGluZSBpcyBnb2luZyB0byBleGVjdXRlIHRoZQotd2hvbGUgSlBFRyBjb21wcmVzc2lvbiBzZXF1ZW5jZS4gIE90aGVyd2lzZSBpdCBjYW4gYmUgc3RhdGljIG9yIGFsbG9jYXRlZAotZnJvbSBtYWxsb2MoKS4KLQotWW91IHdpbGwgYWxzbyBuZWVkIGEgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhIEpQRUcgZXJyb3IgaGFuZGxlci4gIFRoZSBwYXJ0Ci1vZiB0aGlzIHRoYXQgdGhlIGxpYnJhcnkgY2FyZXMgYWJvdXQgaXMgYSAic3RydWN0IGpwZWdfZXJyb3JfbWdyIi4gIElmIHlvdQotYXJlIHByb3ZpZGluZyB5b3VyIG93biBlcnJvciBoYW5kbGVyLCB5b3UnbGwgdHlwaWNhbGx5IHdhbnQgdG8gZW1iZWQgdGhlCi1qcGVnX2Vycm9yX21nciBzdHJ1Y3QgaW4gYSBsYXJnZXIgc3RydWN0dXJlOyB0aGlzIGlzIGRpc2N1c3NlZCBsYXRlciB1bmRlcgotIkVycm9yIGhhbmRsaW5nIi4gIEZvciBub3cgd2UnbGwgYXNzdW1lIHlvdSBhcmUganVzdCB1c2luZyB0aGUgZGVmYXVsdCBlcnJvcgotaGFuZGxlci4gIFRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXIgd2lsbCBwcmludCBKUEVHIGVycm9yL3dhcm5pbmcgbWVzc2FnZXMKLW9uIHN0ZGVyciwgYW5kIGl0IHdpbGwgY2FsbCBleGl0KCkgaWYgYSBmYXRhbCBlcnJvciBvY2N1cnMuCi0KLVlvdSBtdXN0IGluaXRpYWxpemUgdGhlIGVycm9yIGhhbmRsZXIgc3RydWN0dXJlLCBzdG9yZSBhIHBvaW50ZXIgdG8gaXQgaW50bwotdGhlIEpQRUcgb2JqZWN0J3MgImVyciIgZmllbGQsIGFuZCB0aGVuIGNhbGwganBlZ19jcmVhdGVfY29tcHJlc3MoKSB0bwotaW5pdGlhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgSlBFRyBvYmplY3QuCi0KLVR5cGljYWwgY29kZSBmb3IgdGhpcyBzdGVwLCBpZiB5b3UgYXJlIHVzaW5nIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXIsIGlzCi0KLQlzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm87Ci0Jc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7Ci0JLi4uCi0JY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIpOwotCWpwZWdfY3JlYXRlX2NvbXByZXNzKCZjaW5mbyk7Ci0KLWpwZWdfY3JlYXRlX2NvbXByZXNzIGFsbG9jYXRlcyBhIHNtYWxsIGFtb3VudCBvZiBtZW1vcnksIHNvIGl0IGNvdWxkIGZhaWwKLWlmIHlvdSBhcmUgb3V0IG9mIG1lbW9yeS4gIEluIHRoYXQgY2FzZSBpdCB3aWxsIGV4aXQgdmlhIHRoZSBlcnJvciBoYW5kbGVyOwotdGhhdCdzIHdoeSB0aGUgZXJyb3IgaGFuZGxlciBtdXN0IGJlIGluaXRpYWxpemVkIGZpcnN0LgotCi0KLTIuIFNwZWNpZnkgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgY29tcHJlc3NlZCBkYXRhIChlZywgYSBmaWxlKS4KLQotQXMgcHJldmlvdXNseSBtZW50aW9uZWQsIHRoZSBKUEVHIGxpYnJhcnkgZGVsaXZlcnMgY29tcHJlc3NlZCBkYXRhIHRvIGEKLSJkYXRhIGRlc3RpbmF0aW9uIiBtb2R1bGUuICBUaGUgbGlicmFyeSBpbmNsdWRlcyBvbmUgZGF0YSBkZXN0aW5hdGlvbgotbW9kdWxlIHdoaWNoIGtub3dzIGhvdyB0byB3cml0ZSB0byBhIHN0ZGlvIHN0cmVhbS4gIFlvdSBjYW4gdXNlIHlvdXIgb3duCi1kZXN0aW5hdGlvbiBtb2R1bGUgaWYgeW91IHdhbnQgdG8gZG8gc29tZXRoaW5nIGVsc2UsIGFzIGRpc2N1c3NlZCBsYXRlci4KLQotSWYgeW91IHVzZSB0aGUgc3RhbmRhcmQgZGVzdGluYXRpb24gbW9kdWxlLCB5b3UgbXVzdCBvcGVuIHRoZSB0YXJnZXQgc3RkaW8KLXN0cmVhbSBiZWZvcmVoYW5kLiAgVHlwaWNhbCBjb2RlIGZvciB0aGlzIHN0ZXAgbG9va3MgbGlrZToKLQotCUZJTEUgKiBvdXRmaWxlOwotCS4uLgotCWlmICgob3V0ZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAid2IiKSkgPT0gTlVMTCkgewotCSAgICBmcHJpbnRmKHN0ZGVyciwgImNhbid0IG9wZW4gJXNcbiIsIGZpbGVuYW1lKTsKLQkgICAgZXhpdCgxKTsKLQl9Ci0JanBlZ19zdGRpb19kZXN0KCZjaW5mbywgb3V0ZmlsZSk7Ci0KLXdoZXJlIHRoZSBsYXN0IGxpbmUgaW52b2tlcyB0aGUgc3RhbmRhcmQgZGVzdGluYXRpb24gbW9kdWxlLgotCi1XQVJOSU5HOiBpdCBpcyBjcml0aWNhbCB0aGF0IHRoZSBiaW5hcnkgY29tcHJlc3NlZCBkYXRhIGJlIGRlbGl2ZXJlZCB0byB0aGUKLW91dHB1dCBmaWxlIHVuY2hhbmdlZC4gIE9uIG5vbi1Vbml4IHN5c3RlbXMgdGhlIHN0ZGlvIGxpYnJhcnkgbWF5IHBlcmZvcm0KLW5ld2xpbmUgdHJhbnNsYXRpb24gb3Igb3RoZXJ3aXNlIGNvcnJ1cHQgYmluYXJ5IGRhdGEuICBUbyBzdXBwcmVzcyB0aGlzCi1iZWhhdmlvciwgeW91IG1heSBuZWVkIHRvIHVzZSBhICJiIiBvcHRpb24gdG8gZm9wZW4gKGFzIHNob3duIGFib3ZlKSwgb3IgdXNlCi1zZXRtb2RlKCkgb3IgYW5vdGhlciByb3V0aW5lIHRvIHB1dCB0aGUgc3RkaW8gc3RyZWFtIGluIGJpbmFyeSBtb2RlLiAgU2VlCi1janBlZy5jIGFuZCBkanBlZy5jIGZvciBjb2RlIHRoYXQgaGFzIGJlZW4gZm91bmQgdG8gd29yayBvbiBtYW55IHN5c3RlbXMuCi0KLVlvdSBjYW4gc2VsZWN0IHRoZSBkYXRhIGRlc3RpbmF0aW9uIGFmdGVyIHNldHRpbmcgb3RoZXIgcGFyYW1ldGVycyAoc3RlcCAzKSwKLWlmIHRoYXQncyBtb3JlIGNvbnZlbmllbnQuICBZb3UgbWF5IG5vdCBjaGFuZ2UgdGhlIGRlc3RpbmF0aW9uIGJldHdlZW4KLWNhbGxpbmcganBlZ19zdGFydF9jb21wcmVzcygpIGFuZCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpLgotCi0KLTMuIFNldCBwYXJhbWV0ZXJzIGZvciBjb21wcmVzc2lvbiwgaW5jbHVkaW5nIGltYWdlIHNpemUgJiBjb2xvcnNwYWNlLgotCi1Zb3UgbXVzdCBzdXBwbHkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNvdXJjZSBpbWFnZSBieSBzZXR0aW5nIHRoZSBmb2xsb3dpbmcKLWZpZWxkcyBpbiB0aGUgSlBFRyBvYmplY3QgKGNpbmZvIHN0cnVjdHVyZSk6Ci0KLQlpbWFnZV93aWR0aAkJV2lkdGggb2YgaW1hZ2UsIGluIHBpeGVscwotCWltYWdlX2hlaWdodAkJSGVpZ2h0IG9mIGltYWdlLCBpbiBwaXhlbHMKLQlpbnB1dF9jb21wb25lbnRzCU51bWJlciBvZiBjb2xvciBjaGFubmVscyAoc2FtcGxlcyBwZXIgcGl4ZWwpCi0JaW5fY29sb3Jfc3BhY2UJCUNvbG9yIHNwYWNlIG9mIHNvdXJjZSBpbWFnZQotCi1UaGUgaW1hZ2UgZGltZW5zaW9ucyBhcmUsIGhvcGVmdWxseSwgb2J2aW91cy4gIEpQRUcgc3VwcG9ydHMgaW1hZ2UgZGltZW5zaW9ucwotb2YgMSB0byA2NEsgcGl4ZWxzIGluIGVpdGhlciBkaXJlY3Rpb24uICBUaGUgaW5wdXQgY29sb3Igc3BhY2UgaXMgdHlwaWNhbGx5Ci1SR0Igb3IgZ3JheXNjYWxlLCBhbmQgaW5wdXRfY29tcG9uZW50cyBpcyAzIG9yIDEgYWNjb3JkaW5nbHkuICAoU2VlICJTcGVjaWFsCi1jb2xvciBzcGFjZXMiLCBsYXRlciwgZm9yIG1vcmUgaW5mby4pICBUaGUgaW5fY29sb3Jfc3BhY2UgZmllbGQgbXVzdCBiZQotYXNzaWduZWQgb25lIG9mIHRoZSBKX0NPTE9SX1NQQUNFIGVudW0gY29uc3RhbnRzLCB0eXBpY2FsbHkgSkNTX1JHQiBvcgotSkNTX0dSQVlTQ0FMRS4KLQotSlBFRyBoYXMgYSBsYXJnZSBudW1iZXIgb2YgY29tcHJlc3Npb24gcGFyYW1ldGVycyB0aGF0IGRldGVybWluZSBob3cgdGhlCi1pbWFnZSBpcyBlbmNvZGVkLiAgTW9zdCBhcHBsaWNhdGlvbnMgZG9uJ3QgbmVlZCBvciB3YW50IHRvIGtub3cgYWJvdXQgYWxsCi10aGVzZSBwYXJhbWV0ZXJzLiAgWW91IGNhbiBzZXQgYWxsIHRoZSBwYXJhbWV0ZXJzIHRvIHJlYXNvbmFibGUgZGVmYXVsdHMgYnkKLWNhbGxpbmcganBlZ19zZXRfZGVmYXVsdHMoKTsgdGhlbiwgaWYgdGhlcmUgYXJlIHBhcnRpY3VsYXIgdmFsdWVzIHlvdSB3YW50Ci10byBjaGFuZ2UsIHlvdSBjYW4gZG8gc28gYWZ0ZXIgdGhhdC4gIFRoZSAiQ29tcHJlc3Npb24gcGFyYW1ldGVyIHNlbGVjdGlvbiIKLXNlY3Rpb24gdGVsbHMgYWJvdXQgYWxsIHRoZSBwYXJhbWV0ZXJzLgotCi1Zb3UgbXVzdCBzZXQgaW5fY29sb3Jfc3BhY2UgY29ycmVjdGx5IGJlZm9yZSBjYWxsaW5nIGpwZWdfc2V0X2RlZmF1bHRzKCksCi1iZWNhdXNlIHRoZSBkZWZhdWx0cyBkZXBlbmQgb24gdGhlIHNvdXJjZSBpbWFnZSBjb2xvcnNwYWNlLiAgSG93ZXZlciB0aGUKLW90aGVyIHRocmVlIHNvdXJjZSBpbWFnZSBwYXJhbWV0ZXJzIG5lZWQgbm90IGJlIHZhbGlkIHVudGlsIHlvdSBjYWxsCi1qcGVnX3N0YXJ0X2NvbXByZXNzKCkuICBUaGVyZSdzIG5vIGhhcm0gaW4gY2FsbGluZyBqcGVnX3NldF9kZWZhdWx0cygpIG1vcmUKLXRoYW4gb25jZSwgaWYgdGhhdCBoYXBwZW5zIHRvIGJlIGNvbnZlbmllbnQuCi0KLVR5cGljYWwgY29kZSBmb3IgYSAyNC1iaXQgUkdCIHNvdXJjZSBpbWFnZSBpcwotCi0JY2luZm8uaW1hZ2Vfd2lkdGggPSBXaWR0aDsgCS8qIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQsIGluIHBpeGVscyAqLwotCWNpbmZvLmltYWdlX2hlaWdodCA9IEhlaWdodDsKLQljaW5mby5pbnB1dF9jb21wb25lbnRzID0gMzsJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIHBlciBwaXhlbCAqLwotCWNpbmZvLmluX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsgLyogY29sb3JzcGFjZSBvZiBpbnB1dCBpbWFnZSAqLwotCi0JanBlZ19zZXRfZGVmYXVsdHMoJmNpbmZvKTsKLQkvKiBNYWtlIG9wdGlvbmFsIHBhcmFtZXRlciBzZXR0aW5ncyBoZXJlICovCi0KLQotNC4ganBlZ19zdGFydF9jb21wcmVzcyguLi4pOwotCi1BZnRlciB5b3UgaGF2ZSBlc3RhYmxpc2hlZCB0aGUgZGF0YSBkZXN0aW5hdGlvbiBhbmQgc2V0IGFsbCB0aGUgbmVjZXNzYXJ5Ci1zb3VyY2UgaW1hZ2UgaW5mbyBhbmQgb3RoZXIgcGFyYW1ldGVycywgY2FsbCBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgdG8gYmVnaW4KLWEgY29tcHJlc3Npb24gY3ljbGUuICBUaGlzIHdpbGwgaW5pdGlhbGl6ZSBpbnRlcm5hbCBzdGF0ZSwgYWxsb2NhdGUgd29ya2luZwotc3RvcmFnZSwgYW5kIGVtaXQgdGhlIGZpcnN0IGZldyBieXRlcyBvZiB0aGUgSlBFRyBkYXRhc3RyZWFtIGhlYWRlci4KLQotVHlwaWNhbCBjb2RlOgotCi0JanBlZ19zdGFydF9jb21wcmVzcygmY2luZm8sIFRSVUUpOwotCi1UaGUgIlRSVUUiIHBhcmFtZXRlciBlbnN1cmVzIHRoYXQgYSBjb21wbGV0ZSBKUEVHIGludGVyY2hhbmdlIGRhdGFzdHJlYW0KLXdpbGwgYmUgd3JpdHRlbi4gIFRoaXMgaXMgYXBwcm9wcmlhdGUgaW4gbW9zdCBjYXNlcy4gIElmIHlvdSB0aGluayB5b3UgbWlnaHQKLXdhbnQgdG8gdXNlIGFuIGFiYnJldmlhdGVkIGRhdGFzdHJlYW0sIHJlYWQgdGhlIHNlY3Rpb24gb24gYWJicmV2aWF0ZWQKLWRhdGFzdHJlYW1zLCBiZWxvdy4KLQotT25jZSB5b3UgaGF2ZSBjYWxsZWQganBlZ19zdGFydF9jb21wcmVzcygpLCB5b3UgbWF5IG5vdCBhbHRlciBhbnkgSlBFRwotcGFyYW1ldGVycyBvciBvdGhlciBmaWVsZHMgb2YgdGhlIEpQRUcgb2JqZWN0IHVudGlsIHlvdSBoYXZlIGNvbXBsZXRlZAotdGhlIGNvbXByZXNzaW9uIGN5Y2xlLgotCi0KLTUuIHdoaWxlIChzY2FuIGxpbmVzIHJlbWFpbiB0byBiZSB3cml0dGVuKQotCWpwZWdfd3JpdGVfc2NhbmxpbmVzKC4uLik7Ci0KLU5vdyB3cml0ZSBhbGwgdGhlIHJlcXVpcmVkIGltYWdlIGRhdGEgYnkgY2FsbGluZyBqcGVnX3dyaXRlX3NjYW5saW5lcygpCi1vbmUgb3IgbW9yZSB0aW1lcy4gIFlvdSBjYW4gcGFzcyBvbmUgb3IgbW9yZSBzY2FubGluZXMgaW4gZWFjaCBjYWxsLCB1cAotdG8gdGhlIHRvdGFsIGltYWdlIGhlaWdodC4gIEluIG1vc3QgYXBwbGljYXRpb25zIGl0IGlzIGNvbnZlbmllbnQgdG8gcGFzcwotanVzdCBvbmUgb3IgYSBmZXcgc2NhbmxpbmVzIGF0IGEgdGltZS4gIFRoZSBleHBlY3RlZCBmb3JtYXQgZm9yIHRoZSBwYXNzZWQKLWRhdGEgaXMgZGlzY3Vzc2VkIHVuZGVyICJEYXRhIGZvcm1hdHMiLCBhYm92ZS4KLQotSW1hZ2UgZGF0YSBzaG91bGQgYmUgd3JpdHRlbiBpbiB0b3AtdG8tYm90dG9tIHNjYW5saW5lIG9yZGVyLiAgVGhlIEpQRUcgc3BlYwotY29udGFpbnMgc29tZSB3ZWFzZWwgd29yZGluZyBhYm91dCBob3cgdG9wIGFuZCBib3R0b20gYXJlIGFwcGxpY2F0aW9uLWRlZmluZWQKLXRlcm1zIChhIGN1cmlvdXMgaW50ZXJwcmV0YXRpb24gb2YgdGhlIEVuZ2xpc2ggbGFuZ3VhZ2UuLi4pIGJ1dCBpZiB5b3Ugd2FudAoteW91ciBmaWxlcyB0byBiZSBjb21wYXRpYmxlIHdpdGggZXZlcnlvbmUgZWxzZSdzLCB5b3UgV0lMTCB1c2UgdG9wLXRvLWJvdHRvbQotb3JkZXIuICBJZiB0aGUgc291cmNlIGRhdGEgbXVzdCBiZSByZWFkIGluIGJvdHRvbS10by10b3Agb3JkZXIsIHlvdSBjYW4gdXNlCi10aGUgSlBFRyBsaWJyYXJ5J3MgdmlydHVhbCBhcnJheSBtZWNoYW5pc20gdG8gaW52ZXJ0IHRoZSBkYXRhIGVmZmljaWVudGx5LgotRXhhbXBsZXMgb2YgdGhpcyBjYW4gYmUgZm91bmQgaW4gdGhlIHNhbXBsZSBhcHBsaWNhdGlvbiBjanBlZy4KLQotVGhlIGxpYnJhcnkgbWFpbnRhaW5zIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBzY2FubGluZXMgd3JpdHRlbiBzbyBmYXIKLWluIHRoZSBuZXh0X3NjYW5saW5lIGZpZWxkIG9mIHRoZSBKUEVHIG9iamVjdC4gIFVzdWFsbHkgeW91IGNhbiBqdXN0IHVzZQotdGhpcyB2YXJpYWJsZSBhcyB0aGUgbG9vcCBjb3VudGVyLCBzbyB0aGF0IHRoZSBsb29wIHRlc3QgbG9va3MgbGlrZQotIndoaWxlIChjaW5mby5uZXh0X3NjYW5saW5lIDwgY2luZm8uaW1hZ2VfaGVpZ2h0KSIuCi0KLUNvZGUgZm9yIHRoaXMgc3RlcCBkZXBlbmRzIGhlYXZpbHkgb24gdGhlIHdheSB0aGF0IHlvdSBzdG9yZSB0aGUgc291cmNlIGRhdGEuCi1leGFtcGxlLmMgc2hvd3MgdGhlIGZvbGxvd2luZyBjb2RlIGZvciB0aGUgY2FzZSBvZiBhIGZ1bGwtc2l6ZSAyLUQgc291cmNlCi1hcnJheSBjb250YWluaW5nIDMtYnl0ZSBSR0IgcGl4ZWxzOgotCi0JSlNBTVBST1cgcm93X3BvaW50ZXJbMV07CS8qIHBvaW50ZXIgdG8gYSBzaW5nbGUgcm93ICovCi0JaW50IHJvd19zdHJpZGU7CQkJLyogcGh5c2ljYWwgcm93IHdpZHRoIGluIGJ1ZmZlciAqLwotCi0Jcm93X3N0cmlkZSA9IGltYWdlX3dpZHRoICogMzsJLyogSlNBTVBMRXMgcGVyIHJvdyBpbiBpbWFnZV9idWZmZXIgKi8KLQotCXdoaWxlIChjaW5mby5uZXh0X3NjYW5saW5lIDwgY2luZm8uaW1hZ2VfaGVpZ2h0KSB7Ci0JICAgIHJvd19wb2ludGVyWzBdID0gJiBpbWFnZV9idWZmZXJbY2luZm8ubmV4dF9zY2FubGluZSAqIHJvd19zdHJpZGVdOwotCSAgICBqcGVnX3dyaXRlX3NjYW5saW5lcygmY2luZm8sIHJvd19wb2ludGVyLCAxKTsKLQl9Ci0KLWpwZWdfd3JpdGVfc2NhbmxpbmVzKCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNjYW5saW5lcyBhY3R1YWxseSB3cml0dGVuLgotVGhpcyB3aWxsIG5vcm1hbGx5IGJlIGVxdWFsIHRvIHRoZSBudW1iZXIgcGFzc2VkIGluLCBzbyB5b3UgY2FuIHVzdWFsbHkKLWlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlLiAgSXQgaXMgZGlmZmVyZW50IGluIGp1c3QgdHdvIGNhc2VzOgotICAqIElmIHlvdSB0cnkgdG8gd3JpdGUgbW9yZSBzY2FubGluZXMgdGhhbiB0aGUgZGVjbGFyZWQgaW1hZ2UgaGVpZ2h0LAotICAgIHRoZSBhZGRpdGlvbmFsIHNjYW5saW5lcyBhcmUgaWdub3JlZC4KLSAgKiBJZiB5b3UgdXNlIGEgc3VzcGVuZGluZyBkYXRhIGRlc3RpbmF0aW9uIG1hbmFnZXIsIG91dHB1dCBidWZmZXIgb3ZlcnJ1bgotICAgIHdpbGwgY2F1c2UgdGhlIGNvbXByZXNzb3IgdG8gcmV0dXJuIGJlZm9yZSBhY2NlcHRpbmcgYWxsIHRoZSBwYXNzZWQgbGluZXMuCi0gICAgVGhpcyBmZWF0dXJlIGlzIGRpc2N1c3NlZCB1bmRlciAiSS9PIHN1c3BlbnNpb24iLCBiZWxvdy4gIFRoZSBub3JtYWwKLSAgICBzdGRpbyBkZXN0aW5hdGlvbiBtYW5hZ2VyIHdpbGwgTk9UIGNhdXNlIHRoaXMgdG8gaGFwcGVuLgotSW4gYW55IGNhc2UsIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIGNoYW5nZSBpbiB0aGUgdmFsdWUgb2YKLW5leHRfc2NhbmxpbmUuCi0KLQotNi4ganBlZ19maW5pc2hfY29tcHJlc3MoLi4uKTsKLQotQWZ0ZXIgYWxsIHRoZSBpbWFnZSBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4sIGNhbGwganBlZ19maW5pc2hfY29tcHJlc3MoKSB0bwotY29tcGxldGUgdGhlIGNvbXByZXNzaW9uIGN5Y2xlLiAgVGhpcyBzdGVwIGlzIEVTU0VOVElBTCB0byBlbnN1cmUgdGhhdCB0aGUKLWxhc3QgYnVmZmVybG9hZCBvZiBkYXRhIGlzIHdyaXR0ZW4gdG8gdGhlIGRhdGEgZGVzdGluYXRpb24uCi1qcGVnX2ZpbmlzaF9jb21wcmVzcygpIGFsc28gcmVsZWFzZXMgd29ya2luZyBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBKUEVHCi1vYmplY3QuCi0KLVR5cGljYWwgY29kZToKLQotCWpwZWdfZmluaXNoX2NvbXByZXNzKCZjaW5mbyk7Ci0KLUlmIHVzaW5nIHRoZSBzdGRpbyBkZXN0aW5hdGlvbiBtYW5hZ2VyLCBkb24ndCBmb3JnZXQgdG8gY2xvc2UgdGhlIG91dHB1dAotc3RkaW8gc3RyZWFtIChpZiBuZWNlc3NhcnkpIGFmdGVyd2FyZHMuCi0KLUlmIHlvdSBoYXZlIHJlcXVlc3RlZCBhIG11bHRpLXBhc3Mgb3BlcmF0aW5nIG1vZGUsIHN1Y2ggYXMgSHVmZm1hbiBjb2RlCi1vcHRpbWl6YXRpb24sIGpwZWdfZmluaXNoX2NvbXByZXNzKCkgd2lsbCBwZXJmb3JtIHRoZSBhZGRpdGlvbmFsIHBhc3NlcyB1c2luZwotZGF0YSBidWZmZXJlZCBieSB0aGUgZmlyc3QgcGFzcy4gIEluIHRoaXMgY2FzZSBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIG1heSB0YWtlCi1xdWl0ZSBhIHdoaWxlIHRvIGNvbXBsZXRlLiAgV2l0aCB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLCB0aGlzIHdpbGwKLW5vdCBoYXBwZW4uCi0KLUl0IGlzIGFuIGVycm9yIHRvIGNhbGwganBlZ19maW5pc2hfY29tcHJlc3MoKSBiZWZvcmUgd3JpdGluZyB0aGUgbmVjZXNzYXJ5Ci10b3RhbCBudW1iZXIgb2Ygc2NhbmxpbmVzLiAgSWYgeW91IHdpc2ggdG8gYWJvcnQgY29tcHJlc3Npb24sIGNhbGwKLWpwZWdfYWJvcnQoKSBhcyBkaXNjdXNzZWQgYmVsb3cuCi0KLUFmdGVyIGNvbXBsZXRpbmcgYSBjb21wcmVzc2lvbiBjeWNsZSwgeW91IG1heSBkaXNwb3NlIG9mIHRoZSBKUEVHIG9iamVjdAotYXMgZGlzY3Vzc2VkIG5leHQsIG9yIHlvdSBtYXkgdXNlIGl0IHRvIGNvbXByZXNzIGFub3RoZXIgaW1hZ2UuICBJbiB0aGF0IGNhc2UKLXJldHVybiB0byBzdGVwIDIsIDMsIG9yIDQgYXMgYXBwcm9wcmlhdGUuICBJZiB5b3UgZG8gbm90IGNoYW5nZSB0aGUKLWRlc3RpbmF0aW9uIG1hbmFnZXIsIHRoZSBuZXcgZGF0YXN0cmVhbSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIHNhbWUgdGFyZ2V0LgotSWYgeW91IGRvIG5vdCBjaGFuZ2UgYW55IEpQRUcgcGFyYW1ldGVycywgdGhlIG5ldyBkYXRhc3RyZWFtIHdpbGwgYmUgd3JpdHRlbgotd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIGJlZm9yZS4gIE5vdGUgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgaW5wdXQgaW1hZ2UKLWRpbWVuc2lvbnMgZnJlZWx5IGJldHdlZW4gY3ljbGVzLCBidXQgaWYgeW91IGNoYW5nZSB0aGUgaW5wdXQgY29sb3JzcGFjZSwgeW91Ci1zaG91bGQgY2FsbCBqcGVnX3NldF9kZWZhdWx0cygpIHRvIGFkanVzdCBmb3IgdGhlIG5ldyBjb2xvcnNwYWNlOyBhbmQgdGhlbgoteW91J2xsIG5lZWQgdG8gcmVwZWF0IGFsbCBvZiBzdGVwIDMuCi0KLQotNy4gUmVsZWFzZSB0aGUgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QuCi0KLVdoZW4geW91IGFyZSBkb25lIHdpdGggYSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdCwgZGVzdHJveSBpdCBieSBjYWxsaW5nCi1qcGVnX2Rlc3Ryb3lfY29tcHJlc3MoKS4gIFRoaXMgd2lsbCBmcmVlIGFsbCBzdWJzaWRpYXJ5IG1lbW9yeSAocmVnYXJkbGVzcyBvZgotdGhlIHByZXZpb3VzIHN0YXRlIG9mIHRoZSBvYmplY3QpLiAgT3IgeW91IGNhbiBjYWxsIGpwZWdfZGVzdHJveSgpLCB3aGljaAotd29ya3MgZm9yIGVpdGhlciBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIG9iamVjdHMgLS0tIHRoaXMgbWF5IGJlIG1vcmUKLWNvbnZlbmllbnQgaWYgeW91IGFyZSBzaGFyaW5nIGNvZGUgYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotY2FzZXMuICAoQWN0dWFsbHksIHRoZXNlIHJvdXRpbmVzIGFyZSBlcXVpdmFsZW50IGV4Y2VwdCBmb3IgdGhlIGRlY2xhcmVkIHR5cGUKLW9mIHRoZSBwYXNzZWQgcG9pbnRlci4gIFRvIGF2b2lkIGdyaXBlcyBmcm9tIEFOU0kgQyBjb21waWxlcnMsIGpwZWdfZGVzdHJveSgpCi1zaG91bGQgYmUgcGFzc2VkIGEgal9jb21tb25fcHRyLikKLQotSWYgeW91IGFsbG9jYXRlZCB0aGUganBlZ19jb21wcmVzc19zdHJ1Y3Qgc3RydWN0dXJlIGZyb20gbWFsbG9jKCksIGZyZWVpbmcKLWl0IGlzIHlvdXIgcmVzcG9uc2liaWxpdHkgLS0tIGpwZWdfZGVzdHJveSgpIHdvbid0LiAgRGl0dG8gZm9yIHRoZSBlcnJvcgotaGFuZGxlciBzdHJ1Y3R1cmUuCi0KLVR5cGljYWwgY29kZToKLQotCWpwZWdfZGVzdHJveV9jb21wcmVzcygmY2luZm8pOwotCi0KLTguIEFib3J0aW5nLgotCi1JZiB5b3UgZGVjaWRlIHRvIGFib3J0IGEgY29tcHJlc3Npb24gY3ljbGUgYmVmb3JlIGZpbmlzaGluZywgeW91IGNhbiBjbGVhbiB1cAotaW4gZWl0aGVyIG9mIHR3byB3YXlzOgotCi0qIElmIHlvdSBkb24ndCBuZWVkIHRoZSBKUEVHIG9iamVjdCBhbnkgbW9yZSwganVzdCBjYWxsCi0gIGpwZWdfZGVzdHJveV9jb21wcmVzcygpIG9yIGpwZWdfZGVzdHJveSgpIHRvIHJlbGVhc2UgbWVtb3J5LiAgVGhpcyBpcwotICBsZWdpdGltYXRlIGF0IGFueSBwb2ludCBhZnRlciBjYWxsaW5nIGpwZWdfY3JlYXRlX2NvbXByZXNzKCkgLS0tIGluIGZhY3QsCi0gIGl0J3Mgc2FmZSBldmVuIGlmIGpwZWdfY3JlYXRlX2NvbXByZXNzKCkgZmFpbHMuCi0KLSogSWYgeW91IHdhbnQgdG8gcmUtdXNlIHRoZSBKUEVHIG9iamVjdCwgY2FsbCBqcGVnX2Fib3J0X2NvbXByZXNzKCksIG9yIGNhbGwKLSAganBlZ19hYm9ydCgpIHdoaWNoIHdvcmtzIG9uIGJvdGggY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gb2JqZWN0cy4KLSAgVGhpcyB3aWxsIHJldHVybiB0aGUgb2JqZWN0IHRvIGFuIGlkbGUgc3RhdGUsIHJlbGVhc2luZyBhbnkgd29ya2luZyBtZW1vcnkuCi0gIGpwZWdfYWJvcnQoKSBpcyBhbGxvd2VkIGF0IGFueSB0aW1lIGFmdGVyIHN1Y2Nlc3NmdWwgb2JqZWN0IGNyZWF0aW9uLgotCi1Ob3RlIHRoYXQgY2xlYW5pbmcgdXAgdGhlIGRhdGEgZGVzdGluYXRpb24sIGlmIHJlcXVpcmVkLCBpcyB5b3VyCi1yZXNwb25zaWJpbGl0eTsgbmVpdGhlciBvZiB0aGVzZSByb3V0aW5lcyB3aWxsIGNhbGwgdGVybV9kZXN0aW5hdGlvbigpLgotKFNlZSAiQ29tcHJlc3NlZCBkYXRhIGhhbmRsaW5nIiwgYmVsb3csIGZvciBtb3JlIGFib3V0IHRoYXQuKQotCi1qcGVnX2Rlc3Ryb3koKSBhbmQganBlZ19hYm9ydCgpIGFyZSB0aGUgb25seSBzYWZlIGNhbGxzIHRvIG1ha2Ugb24gYSBKUEVHCi1vYmplY3QgdGhhdCBoYXMgcmVwb3J0ZWQgYW4gZXJyb3IgYnkgY2FsbGluZyBlcnJvcl9leGl0IChzZWUgIkVycm9yIGhhbmRsaW5nIgotZm9yIG1vcmUgaW5mbykuICBUaGUgaW50ZXJuYWwgc3RhdGUgb2Ygc3VjaCBhbiBvYmplY3QgaXMgbGlrZWx5IHRvIGJlIG91dCBvZgotd2hhY2suICBFaXRoZXIgb2YgdGhlc2UgdHdvIHJvdXRpbmVzIHdpbGwgcmV0dXJuIHRoZSBvYmplY3QgdG8gYSBrbm93biBzdGF0ZS4KLQotCi1EZWNvbXByZXNzaW9uIGRldGFpbHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IZXJlIHdlIHJldmlzaXQgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBvdXRsaW5lIGdpdmVuIGluIHRoZSBvdmVydmlldy4KLQotMS4gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0LgotCi1UaGlzIGlzIGp1c3QgbGlrZSBpbml0aWFsaXphdGlvbiBmb3IgY29tcHJlc3Npb24sIGFzIGRpc2N1c3NlZCBhYm92ZSwKLWV4Y2VwdCB0aGF0IHRoZSBvYmplY3QgaXMgYSAic3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QiIGFuZCB5b3UKLWNhbGwganBlZ19jcmVhdGVfZGVjb21wcmVzcygpLiAgRXJyb3IgaGFuZGxpbmcgaXMgZXhhY3RseSB0aGUgc2FtZS4KLQotVHlwaWNhbCBjb2RlOgotCi0Jc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgY2luZm87Ci0Jc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7Ci0JLi4uCi0JY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIpOwotCWpwZWdfY3JlYXRlX2RlY29tcHJlc3MoJmNpbmZvKTsKLQotKEJvdGggaGVyZSBhbmQgaW4gdGhlIElKRyBjb2RlLCB3ZSB1c3VhbGx5IHVzZSB2YXJpYWJsZSBuYW1lICJjaW5mbyIgZm9yCi1ib3RoIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG9iamVjdHMuKQotCi0KLTIuIFNwZWNpZnkgdGhlIHNvdXJjZSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIChlZywgYSBmaWxlKS4KLQotQXMgcHJldmlvdXNseSBtZW50aW9uZWQsIHRoZSBKUEVHIGxpYnJhcnkgcmVhZHMgY29tcHJlc3NlZCBkYXRhIGZyb20gYSAiZGF0YQotc291cmNlIiBtb2R1bGUuICBUaGUgbGlicmFyeSBpbmNsdWRlcyBvbmUgZGF0YSBzb3VyY2UgbW9kdWxlIHdoaWNoIGtub3dzIGhvdwotdG8gcmVhZCBmcm9tIGEgc3RkaW8gc3RyZWFtLiAgWW91IGNhbiB1c2UgeW91ciBvd24gc291cmNlIG1vZHVsZSBpZiB5b3Ugd2FudAotdG8gZG8gc29tZXRoaW5nIGVsc2UsIGFzIGRpc2N1c3NlZCBsYXRlci4KLQotSWYgeW91IHVzZSB0aGUgc3RhbmRhcmQgc291cmNlIG1vZHVsZSwgeW91IG11c3Qgb3BlbiB0aGUgc291cmNlIHN0ZGlvIHN0cmVhbQotYmVmb3JlaGFuZC4gIFR5cGljYWwgY29kZSBmb3IgdGhpcyBzdGVwIGxvb2tzIGxpa2U6Ci0KLQlGSUxFICogaW5maWxlOwotCS4uLgotCWlmICgoaW5maWxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpKSA9PSBOVUxMKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3Qgb3BlbiAlc1xuIiwgZmlsZW5hbWUpOwotCSAgICBleGl0KDEpOwotCX0KLQlqcGVnX3N0ZGlvX3NyYygmY2luZm8sIGluZmlsZSk7Ci0KLXdoZXJlIHRoZSBsYXN0IGxpbmUgaW52b2tlcyB0aGUgc3RhbmRhcmQgc291cmNlIG1vZHVsZS4KLQotV0FSTklORzogaXQgaXMgY3JpdGljYWwgdGhhdCB0aGUgYmluYXJ5IGNvbXByZXNzZWQgZGF0YSBiZSByZWFkIHVuY2hhbmdlZC4KLU9uIG5vbi1Vbml4IHN5c3RlbXMgdGhlIHN0ZGlvIGxpYnJhcnkgbWF5IHBlcmZvcm0gbmV3bGluZSB0cmFuc2xhdGlvbiBvcgotb3RoZXJ3aXNlIGNvcnJ1cHQgYmluYXJ5IGRhdGEuICBUbyBzdXBwcmVzcyB0aGlzIGJlaGF2aW9yLCB5b3UgbWF5IG5lZWQgdG8gdXNlCi1hICJiIiBvcHRpb24gdG8gZm9wZW4gKGFzIHNob3duIGFib3ZlKSwgb3IgdXNlIHNldG1vZGUoKSBvciBhbm90aGVyIHJvdXRpbmUgdG8KLXB1dCB0aGUgc3RkaW8gc3RyZWFtIGluIGJpbmFyeSBtb2RlLiAgU2VlIGNqcGVnLmMgYW5kIGRqcGVnLmMgZm9yIGNvZGUgdGhhdAotaGFzIGJlZW4gZm91bmQgdG8gd29yayBvbiBtYW55IHN5c3RlbXMuCi0KLVlvdSBtYXkgbm90IGNoYW5nZSB0aGUgZGF0YSBzb3VyY2UgYmV0d2VlbiBjYWxsaW5nIGpwZWdfcmVhZF9oZWFkZXIoKSBhbmQKLWpwZWdfZmluaXNoX2RlY29tcHJlc3MoKS4gIElmIHlvdSB3aXNoIHRvIHJlYWQgYSBzZXJpZXMgb2YgSlBFRyBpbWFnZXMgZnJvbQotYSBzaW5nbGUgc291cmNlIGZpbGUsIHlvdSBzaG91bGQgcmVwZWF0IHRoZSBqcGVnX3JlYWRfaGVhZGVyKCkgdG8KLWpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSBzZXF1ZW5jZSB3aXRob3V0IHJlaW5pdGlhbGl6aW5nIGVpdGhlciB0aGUgSlBFRwotb2JqZWN0IG9yIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGU7IHRoaXMgcHJldmVudHMgYnVmZmVyZWQgaW5wdXQgZGF0YSBmcm9tCi1iZWluZyBkaXNjYXJkZWQuCi0KLQotMy4gQ2FsbCBqcGVnX3JlYWRfaGVhZGVyKCkgdG8gb2J0YWluIGltYWdlIGluZm8uCi0KLVR5cGljYWwgY29kZSBmb3IgdGhpcyBzdGVwIGlzIGp1c3QKLQotCWpwZWdfcmVhZF9oZWFkZXIoJmNpbmZvLCBUUlVFKTsKLQotVGhpcyB3aWxsIHJlYWQgdGhlIHNvdXJjZSBkYXRhc3RyZWFtIGhlYWRlciBtYXJrZXJzLCB1cCB0byB0aGUgYmVnaW5uaW5nCi1vZiB0aGUgY29tcHJlc3NlZCBkYXRhIHByb3Blci4gIE9uIHJldHVybiwgdGhlIGltYWdlIGRpbWVuc2lvbnMgYW5kIG90aGVyCi1pbmZvIGhhdmUgYmVlbiBzdG9yZWQgaW4gdGhlIEpQRUcgb2JqZWN0LiAgVGhlIGFwcGxpY2F0aW9uIG1heSB3aXNoIHRvCi1jb25zdWx0IHRoaXMgaW5mb3JtYXRpb24gYmVmb3JlIHNlbGVjdGluZyBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMuCi0KLU1vcmUgY29tcGxleCBjb2RlIGlzIG5lY2Vzc2FyeSBpZgotICAqIEEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkIC0tLSBpbiB0aGF0IGNhc2UganBlZ19yZWFkX2hlYWRlcigpCi0gICAgbWF5IHJldHVybiBiZWZvcmUgaXQgaGFzIHJlYWQgYWxsIHRoZSBoZWFkZXIgZGF0YS4gIFNlZSAiSS9PIHN1c3BlbnNpb24iLAotICAgIGJlbG93LiAgVGhlIG5vcm1hbCBzdGRpbyBzb3VyY2UgbWFuYWdlciB3aWxsIE5PVCBjYXVzZSB0aGlzIHRvIGhhcHBlbi4KLSAgKiBBYmJyZXZpYXRlZCBKUEVHIGZpbGVzIGFyZSB0byBiZSBwcm9jZXNzZWQgLS0tIHNlZSB0aGUgc2VjdGlvbiBvbgotICAgIGFiYnJldmlhdGVkIGRhdGFzdHJlYW1zLiAgU3RhbmRhcmQgYXBwbGljYXRpb25zIHRoYXQgZGVhbCBvbmx5IGluCi0gICAgaW50ZXJjaGFuZ2UgSlBFRyBmaWxlcyBuZWVkIG5vdCBiZSBjb25jZXJuZWQgd2l0aCB0aGlzIGNhc2UgZWl0aGVyLgotCi1JdCBpcyBwZXJtaXNzaWJsZSB0byBzdG9wIGF0IHRoaXMgcG9pbnQgaWYgeW91IGp1c3Qgd2FudGVkIHRvIGZpbmQgb3V0IHRoZQotaW1hZ2UgZGltZW5zaW9ucyBhbmQgb3RoZXIgaGVhZGVyIGluZm8gZm9yIGEgSlBFRyBmaWxlLiAgSW4gdGhhdCBjYXNlLAotY2FsbCBqcGVnX2Rlc3Ryb3koKSB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoZSBKUEVHIG9iamVjdCwgb3IgY2FsbAotanBlZ19hYm9ydCgpIHRvIHJldHVybiBpdCB0byBhbiBpZGxlIHN0YXRlIGJlZm9yZSBzZWxlY3RpbmcgYSBuZXcgZGF0YQotc291cmNlIGFuZCByZWFkaW5nIGFub3RoZXIgaGVhZGVyLgotCi0KLTQuIFNldCBwYXJhbWV0ZXJzIGZvciBkZWNvbXByZXNzaW9uLgotCi1qcGVnX3JlYWRfaGVhZGVyKCkgc2V0cyBhcHByb3ByaWF0ZSBkZWZhdWx0IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyBiYXNlZCBvbgotdGhlIHByb3BlcnRpZXMgb2YgdGhlIGltYWdlIChpbiBwYXJ0aWN1bGFyLCBpdHMgY29sb3JzcGFjZSkuICBIb3dldmVyLCB5b3UKLW1heSB3ZWxsIHdhbnQgdG8gYWx0ZXIgdGhlc2UgZGVmYXVsdHMgYmVmb3JlIGJlZ2lubmluZyB0aGUgZGVjb21wcmVzc2lvbi4KLUZvciBleGFtcGxlLCB0aGUgZGVmYXVsdCBpcyB0byBwcm9kdWNlIGZ1bGwgY29sb3Igb3V0cHV0IGZyb20gYSBjb2xvciBmaWxlLgotSWYgeW91IHdhbnQgY29sb3JtYXBwZWQgb3V0cHV0IHlvdSBtdXN0IGFzayBmb3IgaXQuICBPdGhlciBvcHRpb25zIGFsbG93IHRoZQotcmV0dXJuZWQgaW1hZ2UgdG8gYmUgc2NhbGVkIGFuZCBhbGxvdyB2YXJpb3VzIHNwZWVkL3F1YWxpdHkgdHJhZGVvZmZzIHRvIGJlCi1zZWxlY3RlZC4gICJEZWNvbXByZXNzaW9uIHBhcmFtZXRlciBzZWxlY3Rpb24iLCBiZWxvdywgZ2l2ZXMgZGV0YWlscy4KLQotSWYgdGhlIGRlZmF1bHRzIGFyZSBhcHByb3ByaWF0ZSwgbm90aGluZyBuZWVkIGJlIGRvbmUgYXQgdGhpcyBzdGVwLgotCi1Ob3RlIHRoYXQgYWxsIGRlZmF1bHQgdmFsdWVzIGFyZSBzZXQgYnkgZWFjaCBjYWxsIHRvIGpwZWdfcmVhZF9oZWFkZXIoKS4KLUlmIHlvdSByZXVzZSBhIGRlY29tcHJlc3Npb24gb2JqZWN0LCB5b3UgY2Fubm90IGV4cGVjdCB5b3VyIHBhcmFtZXRlcgotc2V0dGluZ3MgdG8gYmUgcHJlc2VydmVkIGFjcm9zcyBjeWNsZXMsIGFzIHlvdSBjYW4gZm9yIGNvbXByZXNzaW9uLgotWW91IG11c3Qgc2V0IGRlc2lyZWQgcGFyYW1ldGVyIHZhbHVlcyBlYWNoIHRpbWUuCi0KLQotNS4ganBlZ19zdGFydF9kZWNvbXByZXNzKC4uLik7Ci0KLU9uY2UgdGhlIHBhcmFtZXRlciB2YWx1ZXMgYXJlIHNhdGlzZmFjdG9yeSwgY2FsbCBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSB0bwotYmVnaW4gZGVjb21wcmVzc2lvbi4gIFRoaXMgd2lsbCBpbml0aWFsaXplIGludGVybmFsIHN0YXRlLCBhbGxvY2F0ZSB3b3JraW5nCi1tZW1vcnksIGFuZCBwcmVwYXJlIGZvciByZXR1cm5pbmcgZGF0YS4KLQotVHlwaWNhbCBjb2RlIGlzIGp1c3QKLQotCWpwZWdfc3RhcnRfZGVjb21wcmVzcygmY2luZm8pOwotCi1JZiB5b3UgaGF2ZSByZXF1ZXN0ZWQgYSBtdWx0aS1wYXNzIG9wZXJhdGluZyBtb2RlLCBzdWNoIGFzIDItcGFzcyBjb2xvcgotcXVhbnRpemF0aW9uLCBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSB3aWxsIGRvIGV2ZXJ5dGhpbmcgbmVlZGVkIGJlZm9yZSBkYXRhCi1vdXRwdXQgY2FuIGJlZ2luLiAgSW4gdGhpcyBjYXNlIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIG1heSB0YWtlIHF1aXRlIGEgd2hpbGUKLXRvIGNvbXBsZXRlLiAgV2l0aCBhIHNpbmdsZS1zY2FuIChub24gcHJvZ3Jlc3NpdmUpIEpQRUcgZmlsZSBhbmQgZGVmYXVsdAotZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLCB0aGlzIHdpbGwgbm90IGhhcHBlbjsganBlZ19zdGFydF9kZWNvbXByZXNzKCkgd2lsbAotcmV0dXJuIHF1aWNrbHkuCi0KLUFmdGVyIHRoaXMgY2FsbCwgdGhlIGZpbmFsIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zLCBpbmNsdWRpbmcgYW55IHJlcXVlc3RlZAotc2NhbGluZywgYXJlIGF2YWlsYWJsZSBpbiB0aGUgSlBFRyBvYmplY3Q7IHNvIGlzIHRoZSBzZWxlY3RlZCBjb2xvcm1hcCwgaWYKLWNvbG9ybWFwcGVkIG91dHB1dCBoYXMgYmVlbiByZXF1ZXN0ZWQuICBVc2VmdWwgZmllbGRzIGluY2x1ZGUKLQotCW91dHB1dF93aWR0aAkJaW1hZ2Ugd2lkdGggYW5kIGhlaWdodCwgYXMgc2NhbGVkCi0Jb3V0cHV0X2hlaWdodAotCW91dF9jb2xvcl9jb21wb25lbnRzCSMgb2YgY29sb3IgY29tcG9uZW50cyBpbiBvdXRfY29sb3Jfc3BhY2UKLQlvdXRwdXRfY29tcG9uZW50cwkjIG9mIGNvbG9yIGNvbXBvbmVudHMgcmV0dXJuZWQgcGVyIHBpeGVsCi0JY29sb3JtYXAJCXRoZSBzZWxlY3RlZCBjb2xvcm1hcCwgaWYgYW55Ci0JYWN0dWFsX251bWJlcl9vZl9jb2xvcnMJCW51bWJlciBvZiBlbnRyaWVzIGluIGNvbG9ybWFwCi0KLW91dHB1dF9jb21wb25lbnRzIGlzIDEgKGEgY29sb3JtYXAgaW5kZXgpIHdoZW4gcXVhbnRpemluZyBjb2xvcnM7IG90aGVyd2lzZSBpdAotZXF1YWxzIG91dF9jb2xvcl9jb21wb25lbnRzLiAgSXQgaXMgdGhlIG51bWJlciBvZiBKU0FNUExFIHZhbHVlcyB0aGF0IHdpbGwgYmUKLWVtaXR0ZWQgcGVyIHBpeGVsIGluIHRoZSBvdXRwdXQgYXJyYXlzLgotCi1UeXBpY2FsbHkgeW91IHdpbGwgbmVlZCB0byBhbGxvY2F0ZSBkYXRhIGJ1ZmZlcnMgdG8gaG9sZCB0aGUgaW5jb21pbmcgaW1hZ2UuCi1Zb3Ugd2lsbCBuZWVkIG91dHB1dF93aWR0aCAqIG91dHB1dF9jb21wb25lbnRzIEpTQU1QTEVzIHBlciBzY2FubGluZSBpbiB5b3VyCi1vdXRwdXQgYnVmZmVyLCBhbmQgYSB0b3RhbCBvZiBvdXRwdXRfaGVpZ2h0IHNjYW5saW5lcyB3aWxsIGJlIHJldHVybmVkLgotCi1Ob3RlOiBpZiB5b3UgYXJlIHVzaW5nIHRoZSBKUEVHIGxpYnJhcnkncyBpbnRlcm5hbCBtZW1vcnkgbWFuYWdlciB0byBhbGxvY2F0ZQotZGF0YSBidWZmZXJzIChhcyBkanBlZyBkb2VzKSwgdGhlbiB0aGUgbWFuYWdlcidzIHByb3RvY29sIHJlcXVpcmVzIHRoYXQgeW91Ci1yZXF1ZXN0IGxhcmdlIGJ1ZmZlcnMgKmJlZm9yZSogY2FsbGluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4gIFRoaXMgaXMgYQotbGl0dGxlIHRyaWNreSBzaW5jZSB0aGUgb3V0cHV0X1hYWCBmaWVsZHMgYXJlIG5vdCBub3JtYWxseSB2YWxpZCB0aGVuLiAgWW91Ci1jYW4gbWFrZSB0aGVtIHZhbGlkIGJ5IGNhbGxpbmcganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKCkgYWZ0ZXIgc2V0dGluZyB0aGUKLXJlbGV2YW50IHBhcmFtZXRlcnMgKHNjYWxpbmcsIG91dHB1dCBjb2xvciBzcGFjZSwgYW5kIHF1YW50aXphdGlvbiBmbGFnKS4KLQotCi02LiB3aGlsZSAoc2NhbiBsaW5lcyByZW1haW4gdG8gYmUgcmVhZCkKLQlqcGVnX3JlYWRfc2NhbmxpbmVzKC4uLik7Ci0KLU5vdyB5b3UgY2FuIHJlYWQgdGhlIGRlY29tcHJlc3NlZCBpbWFnZSBkYXRhIGJ5IGNhbGxpbmcganBlZ19yZWFkX3NjYW5saW5lcygpCi1vbmUgb3IgbW9yZSB0aW1lcy4gIEF0IGVhY2ggY2FsbCwgeW91IHBhc3MgaW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIHNjYW5saW5lcwotdG8gYmUgcmVhZCAoaWUsIHRoZSBoZWlnaHQgb2YgeW91ciB3b3JraW5nIGJ1ZmZlcik7IGpwZWdfcmVhZF9zY2FubGluZXMoKQotd2lsbCByZXR1cm4gdXAgdG8gdGhhdCBtYW55IGxpbmVzLiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGxpbmVzCi1hY3R1YWxseSByZWFkLiAgVGhlIGZvcm1hdCBvZiB0aGUgcmV0dXJuZWQgZGF0YSBpcyBkaXNjdXNzZWQgdW5kZXIgIkRhdGEKLWZvcm1hdHMiLCBhYm92ZS4gIERvbid0IGZvcmdldCB0aGF0IGdyYXlzY2FsZSBhbmQgY29sb3IgSlBFR3Mgd2lsbCByZXR1cm4KLWRpZmZlcmVudCBkYXRhIGZvcm1hdHMhCi0KLUltYWdlIGRhdGEgaXMgcmV0dXJuZWQgaW4gdG9wLXRvLWJvdHRvbSBzY2FubGluZSBvcmRlci4gIElmIHlvdSBtdXN0IHdyaXRlCi1vdXQgdGhlIGltYWdlIGluIGJvdHRvbS10by10b3Agb3JkZXIsIHlvdSBjYW4gdXNlIHRoZSBKUEVHIGxpYnJhcnkncyB2aXJ0dWFsCi1hcnJheSBtZWNoYW5pc20gdG8gaW52ZXJ0IHRoZSBkYXRhIGVmZmljaWVudGx5LiAgRXhhbXBsZXMgb2YgdGhpcyBjYW4gYmUKLWZvdW5kIGluIHRoZSBzYW1wbGUgYXBwbGljYXRpb24gZGpwZWcuCi0KLVRoZSBsaWJyYXJ5IG1haW50YWlucyBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzIHJldHVybmVkIHNvIGZhcgotaW4gdGhlIG91dHB1dF9zY2FubGluZSBmaWVsZCBvZiB0aGUgSlBFRyBvYmplY3QuICBVc3VhbGx5IHlvdSBjYW4ganVzdCB1c2UKLXRoaXMgdmFyaWFibGUgYXMgdGhlIGxvb3AgY291bnRlciwgc28gdGhhdCB0aGUgbG9vcCB0ZXN0IGxvb2tzIGxpa2UKLSJ3aGlsZSAoY2luZm8ub3V0cHV0X3NjYW5saW5lIDwgY2luZm8ub3V0cHV0X2hlaWdodCkiLiAgKE5vdGUgdGhhdCB0aGUgdGVzdAotc2hvdWxkIE5PVCBiZSBhZ2FpbnN0IGltYWdlX2hlaWdodCwgdW5sZXNzIHlvdSBuZXZlciB1c2Ugc2NhbGluZy4gIFRoZQotaW1hZ2VfaGVpZ2h0IGZpZWxkIGlzIHRoZSBoZWlnaHQgb2YgdGhlIG9yaWdpbmFsIHVuc2NhbGVkIGltYWdlLikKLVRoZSByZXR1cm4gdmFsdWUgYWx3YXlzIGVxdWFscyB0aGUgY2hhbmdlIGluIHRoZSB2YWx1ZSBvZiBvdXRwdXRfc2NhbmxpbmUuCi0KLUlmIHlvdSBkb24ndCB1c2UgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlLCBpdCBpcyBzYWZlIHRvIGFzc3VtZSB0aGF0Ci1qcGVnX3JlYWRfc2NhbmxpbmVzKCkgcmVhZHMgYXQgbGVhc3Qgb25lIHNjYW5saW5lIHBlciBjYWxsLCB1bnRpbCB0aGUKLWJvdHRvbSBvZiB0aGUgaW1hZ2UgaGFzIGJlZW4gcmVhY2hlZC4KLQotSWYgeW91IHVzZSBhIGJ1ZmZlciBsYXJnZXIgdGhhbiBvbmUgc2NhbmxpbmUsIGl0IGlzIE5PVCBzYWZlIHRvIGFzc3VtZSB0aGF0Ci1qcGVnX3JlYWRfc2NhbmxpbmVzKCkgZmlsbHMgaXQuICAoVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBvbmx5IGEKLWZldyBzY2FubGluZXMgcGVyIGNhbGwsIG5vIG1hdHRlciBob3cgbGFyZ2UgYSBidWZmZXIgeW91IHBhc3MuKSAgU28geW91IG11c3QKLWFsd2F5cyBwcm92aWRlIGEgbG9vcCB0aGF0IGNhbGxzIGpwZWdfcmVhZF9zY2FubGluZXMoKSByZXBlYXRlZGx5IHVudGlsIHRoZQotd2hvbGUgaW1hZ2UgaGFzIGJlZW4gcmVhZC4KLQotCi03LiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKC4uLik7Ci0KLUFmdGVyIGFsbCB0aGUgaW1hZ2UgZGF0YSBoYXMgYmVlbiByZWFkLCBjYWxsIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSB0bwotY29tcGxldGUgdGhlIGRlY29tcHJlc3Npb24gY3ljbGUuICBUaGlzIGNhdXNlcyB3b3JraW5nIG1lbW9yeSBhc3NvY2lhdGVkCi13aXRoIHRoZSBKUEVHIG9iamVjdCB0byBiZSByZWxlYXNlZC4KLQotVHlwaWNhbCBjb2RlOgotCi0JanBlZ19maW5pc2hfZGVjb21wcmVzcygmY2luZm8pOwotCi1JZiB1c2luZyB0aGUgc3RkaW8gc291cmNlIG1hbmFnZXIsIGRvbid0IGZvcmdldCB0byBjbG9zZSB0aGUgc291cmNlIHN0ZGlvCi1zdHJlYW0gaWYgbmVjZXNzYXJ5LgotCi1JdCBpcyBhbiBlcnJvciB0byBjYWxsIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSBiZWZvcmUgcmVhZGluZyB0aGUgY29ycmVjdAotdG90YWwgbnVtYmVyIG9mIHNjYW5saW5lcy4gIElmIHlvdSB3aXNoIHRvIGFib3J0IGRlY29tcHJlc3Npb24sIGNhbGwKLWpwZWdfYWJvcnQoKSBhcyBkaXNjdXNzZWQgYmVsb3cuCi0KLUFmdGVyIGNvbXBsZXRpbmcgYSBkZWNvbXByZXNzaW9uIGN5Y2xlLCB5b3UgbWF5IGRpc3Bvc2Ugb2YgdGhlIEpQRUcgb2JqZWN0IGFzCi1kaXNjdXNzZWQgbmV4dCwgb3IgeW91IG1heSB1c2UgaXQgdG8gZGVjb21wcmVzcyBhbm90aGVyIGltYWdlLiAgSW4gdGhhdCBjYXNlCi1yZXR1cm4gdG8gc3RlcCAyIG9yIDMgYXMgYXBwcm9wcmlhdGUuICBJZiB5b3UgZG8gbm90IGNoYW5nZSB0aGUgc291cmNlCi1tYW5hZ2VyLCB0aGUgbmV4dCBpbWFnZSB3aWxsIGJlIHJlYWQgZnJvbSB0aGUgc2FtZSBzb3VyY2UuCi0KLQotOC4gUmVsZWFzZSB0aGUgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdC4KLQotV2hlbiB5b3UgYXJlIGRvbmUgd2l0aCBhIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QsIGRlc3Ryb3kgaXQgYnkgY2FsbGluZwotanBlZ19kZXN0cm95X2RlY29tcHJlc3MoKSBvciBqcGVnX2Rlc3Ryb3koKS4gIFRoZSBwcmV2aW91cyBkaXNjdXNzaW9uIG9mCi1kZXN0cm95aW5nIGNvbXByZXNzaW9uIG9iamVjdHMgYXBwbGllcyBoZXJlIHRvby4KLQotVHlwaWNhbCBjb2RlOgotCi0JanBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKLQotCi05LiBBYm9ydGluZy4KLQotWW91IGNhbiBhYm9ydCBhIGRlY29tcHJlc3Npb24gY3ljbGUgYnkgY2FsbGluZyBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygpIG9yCi1qcGVnX2Rlc3Ryb3koKSBpZiB5b3UgZG9uJ3QgbmVlZCB0aGUgSlBFRyBvYmplY3QgYW55IG1vcmUsIG9yCi1qcGVnX2Fib3J0X2RlY29tcHJlc3MoKSBvciBqcGVnX2Fib3J0KCkgaWYgeW91IHdhbnQgdG8gcmV1c2UgdGhlIG9iamVjdC4KLVRoZSBwcmV2aW91cyBkaXNjdXNzaW9uIG9mIGFib3J0aW5nIGNvbXByZXNzaW9uIGN5Y2xlcyBhcHBsaWVzIGhlcmUgdG9vLgotCi0KLU1lY2hhbmljcyBvZiB1c2FnZTogaW5jbHVkZSBmaWxlcywgbGlua2luZywgZXRjCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BcHBsaWNhdGlvbnMgdXNpbmcgdGhlIEpQRUcgbGlicmFyeSBzaG91bGQgaW5jbHVkZSB0aGUgaGVhZGVyIGZpbGUganBlZ2xpYi5oCi10byBvYnRhaW4gZGVjbGFyYXRpb25zIG9mIGRhdGEgdHlwZXMgYW5kIHJvdXRpbmVzLiAgQmVmb3JlIGluY2x1ZGluZwotanBlZ2xpYi5oLCBpbmNsdWRlIHN5c3RlbSBoZWFkZXJzIHRoYXQgZGVmaW5lIGF0IGxlYXN0IHRoZSB0eXBlZGVmcyBGSUxFIGFuZAotc2l6ZV90LiAgT24gQU5TSS1jb25mb3JtaW5nIHN5c3RlbXMsIGluY2x1ZGluZyA8c3RkaW8uaD4gaXMgc3VmZmljaWVudDsgb24KLW9sZGVyIFVuaXggc3lzdGVtcywgeW91IG1heSBuZWVkIDxzeXMvdHlwZXMuaD4gdG8gZGVmaW5lIHNpemVfdC4KLQotSWYgdGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHJlZmVyIHRvIGluZGl2aWR1YWwgSlBFRyBsaWJyYXJ5IGVycm9yIGNvZGVzLCBhbHNvCi1pbmNsdWRlIGplcnJvci5oIHRvIGRlZmluZSB0aG9zZSBzeW1ib2xzLgotCi1qcGVnbGliLmggaW5kaXJlY3RseSBpbmNsdWRlcyB0aGUgZmlsZXMgamNvbmZpZy5oIGFuZCBqbW9yZWNmZy5oLiAgSWYgeW91IGFyZQotaW5zdGFsbGluZyB0aGUgSlBFRyBoZWFkZXIgZmlsZXMgaW4gYSBzeXN0ZW0gZGlyZWN0b3J5LCB5b3Ugd2lsbCB3YW50IHRvCi1pbnN0YWxsIGFsbCBmb3VyIGZpbGVzOiBqcGVnbGliLmgsIGplcnJvci5oLCBqY29uZmlnLmgsIGptb3JlY2ZnLmguCi0KLVRoZSBtb3N0IGNvbnZlbmllbnQgd2F5IHRvIGluY2x1ZGUgdGhlIEpQRUcgY29kZSBpbnRvIHlvdXIgZXhlY3V0YWJsZSBwcm9ncmFtCi1pcyB0byBwcmVwYXJlIGEgbGlicmFyeSBmaWxlICgibGlianBlZy5hIiwgb3IgYSBjb3JyZXNwb25kaW5nIG5hbWUgb24gbm9uLVVuaXgKLW1hY2hpbmVzKSBhbmQgcmVmZXJlbmNlIGl0IGF0IHlvdXIgbGluayBzdGVwLiAgSWYgeW91IHVzZSBvbmx5IGhhbGYgb2YgdGhlCi1saWJyYXJ5IChvbmx5IGNvbXByZXNzaW9uIG9yIG9ubHkgZGVjb21wcmVzc2lvbiksIG9ubHkgdGhhdCBtdWNoIGNvZGUgd2lsbCBiZQotaW5jbHVkZWQgZnJvbSB0aGUgbGlicmFyeSwgdW5sZXNzIHlvdXIgbGlua2VyIGlzIGhvcGVsZXNzbHkgYnJhaW4tZGFtYWdlZC4KLVRoZSBzdXBwbGllZCBtYWtlZmlsZXMgYnVpbGQgbGlianBlZy5hIGF1dG9tYXRpY2FsbHkgKHNlZSBpbnN0YWxsLmRvYykuCi0KLVdoaWxlIHlvdSBjYW4gYnVpbGQgdGhlIEpQRUcgbGlicmFyeSBhcyBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSB3aGltIHN0cmlrZXMKLXlvdSwgd2UgZG9uJ3QgcmVhbGx5IHJlY29tbWVuZCBpdC4gIFRoZSB0cm91YmxlIHdpdGggc2hhcmVkIGxpYnJhcmllcyBpcyB0aGF0Ci1hdCBzb21lIHBvaW50IHlvdSdsbCBwcm9iYWJseSB0cnkgdG8gc3Vic3RpdHV0ZSBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5Ci13aXRob3V0IHJlY29tcGlsaW5nIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9ucy4gIFRoYXQgZ2VuZXJhbGx5IGRvZXNuJ3Qgd29yawotYmVjYXVzZSB0aGUgcGFyYW1ldGVyIHN0cnVjdCBkZWNsYXJhdGlvbnMgdXN1YWxseSBjaGFuZ2Ugd2l0aCBlYWNoIG5ldwotdmVyc2lvbi4gIEluIG90aGVyIHdvcmRzLCB0aGUgbGlicmFyeSdzIEFQSSBpcyAqbm90KiBndWFyYW50ZWVkIGJpbmFyeQotY29tcGF0aWJsZSBhY3Jvc3MgdmVyc2lvbnM7IHdlIG9ubHkgdHJ5IHRvIGVuc3VyZSBzb3VyY2UtY29kZSBjb21wYXRpYmlsaXR5LgotKEluIGhpbmRzaWdodCwgaXQgbWlnaHQgaGF2ZSBiZWVuIHNtYXJ0ZXIgdG8gaGlkZSB0aGUgcGFyYW1ldGVyIHN0cnVjdHMgZnJvbQotYXBwbGljYXRpb25zIGFuZCBpbnRyb2R1Y2UgYSB0b24gb2YgYWNjZXNzIGZ1bmN0aW9ucyBpbnN0ZWFkLiAgVG9vIGxhdGUgbm93LAotaG93ZXZlci4pCi0KLU9uIHNvbWUgc3lzdGVtcyB5b3VyIGFwcGxpY2F0aW9uIG1heSBuZWVkIHRvIHNldCB1cCBhIHNpZ25hbCBoYW5kbGVyIHRvIGVuc3VyZQotdGhhdCB0ZW1wb3JhcnkgZmlsZXMgYXJlIGRlbGV0ZWQgaWYgdGhlIHByb2dyYW0gaXMgaW50ZXJydXB0ZWQuICBUaGlzIGlzIG1vc3QKLWNyaXRpY2FsIGlmIHlvdSBhcmUgb24gTVMtRE9TIGFuZCB1c2UgdGhlIGptZW1kb3MuYyBtZW1vcnkgbWFuYWdlciBiYWNrIGVuZDsKLWl0IHdpbGwgdHJ5IHRvIGdyYWIgZXh0ZW5kZWQgbWVtb3J5IGZvciB0ZW1wIGZpbGVzLCBhbmQgdGhhdCBzcGFjZSB3aWxsIE5PVCBiZQotZnJlZWQgYXV0b21hdGljYWxseS4gIFNlZSBjanBlZy5jIG9yIGRqcGVnLmMgZm9yIGFuIGV4YW1wbGUgc2lnbmFsIGhhbmRsZXIuCi0KLUl0IG1heSBiZSB3b3J0aCBwb2ludGluZyBvdXQgdGhhdCB0aGUgY29yZSBKUEVHIGxpYnJhcnkgZG9lcyBub3QgYWN0dWFsbHkKLXJlcXVpcmUgdGhlIHN0ZGlvIGxpYnJhcnk6IG9ubHkgdGhlIGRlZmF1bHQgc291cmNlL2Rlc3RpbmF0aW9uIG1hbmFnZXJzIGFuZAotZXJyb3IgaGFuZGxlciBuZWVkIGl0LiAgWW91IGNhbiB1c2UgdGhlIGxpYnJhcnkgaW4gYSBzdGRpby1sZXNzIGVudmlyb25tZW50Ci1pZiB5b3UgcmVwbGFjZSB0aG9zZSBtb2R1bGVzIGFuZCB1c2Ugam1lbW5vYnMuYyAob3IgYW5vdGhlciBtZW1vcnkgbWFuYWdlciBvZgoteW91ciBvd24gZGV2aXNpbmcpLiAgTW9yZSBpbmZvIGFib3V0IHRoZSBtaW5pbXVtIHN5c3RlbSBsaWJyYXJ5IHJlcXVpcmVtZW50cwotbWF5IGJlIGZvdW5kIGluIGppbmNsdWRlLmguCi0KLQotQURWQU5DRUQgRkVBVFVSRVMKLT09PT09PT09PT09PT09PT09Ci0KLUNvbXByZXNzaW9uIHBhcmFtZXRlciBzZWxlY3Rpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBhbGwgdGhlIG9wdGlvbmFsIHBhcmFtZXRlcnMgeW91IGNhbiBzZXQgZm9yIEpQRUcKLWNvbXByZXNzaW9uLCBhcyB3ZWxsIGFzIHRoZSAiaGVscGVyIiByb3V0aW5lcyBwcm92aWRlZCB0byBhc3Npc3QgaW4gdGhpcwotdGFzay4gIFByb3BlciBzZXR0aW5nIG9mIHNvbWUgcGFyYW1ldGVycyByZXF1aXJlcyBkZXRhaWxlZCB1bmRlcnN0YW5kaW5nCi1vZiB0aGUgSlBFRyBzdGFuZGFyZDsgaWYgeW91IGRvbid0IGtub3cgd2hhdCBhIHBhcmFtZXRlciBpcyBmb3IsIGl0J3MgYmVzdAotbm90IHRvIG1lc3Mgd2l0aCBpdCEgIFNlZSBSRUZFUkVOQ0VTIGluIHRoZSBSRUFETUUgZmlsZSBmb3IgcG9pbnRlcnMgdG8KLW1vcmUgaW5mbyBhYm91dCBKUEVHLgotCi1JdCdzIGEgZ29vZCBpZGVhIHRvIGNhbGwganBlZ19zZXRfZGVmYXVsdHMoKSBmaXJzdCwgZXZlbiBpZiB5b3UgcGxhbiB0byBzZXQKLWFsbCB0aGUgcGFyYW1ldGVyczsgdGhhdCB3YXkgeW91ciBjb2RlIGlzIG1vcmUgbGlrZWx5IHRvIHdvcmsgd2l0aCBmdXR1cmUgSlBFRwotbGlicmFyaWVzIHRoYXQgaGF2ZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuICBGb3IgdGhlIHNhbWUgcmVhc29uLCB3ZSByZWNvbW1lbmQKLXlvdSB1c2UgYSBoZWxwZXIgcm91dGluZSB3aGVyZSBvbmUgaXMgcHJvdmlkZWQsIGluIHByZWZlcmVuY2UgdG8gdHdpZGRsaW5nCi1jaW5mbyBmaWVsZHMgZGlyZWN0bHkuCi0KLVRoZSBoZWxwZXIgcm91dGluZXMgYXJlOgotCi1qcGVnX3NldF9kZWZhdWx0cyAoal9jb21wcmVzc19wdHIgY2luZm8pCi0JVGhpcyByb3V0aW5lIHNldHMgYWxsIEpQRUcgcGFyYW1ldGVycyB0byByZWFzb25hYmxlIGRlZmF1bHRzLCB1c2luZwotCW9ubHkgdGhlIGlucHV0IGltYWdlJ3MgY29sb3Igc3BhY2UgKGZpZWxkIGluX2NvbG9yX3NwYWNlLCB3aGljaCBtdXN0Ci0JYWxyZWFkeSBiZSBzZXQgaW4gY2luZm8pLiAgTWFueSBhcHBsaWNhdGlvbnMgd2lsbCBvbmx5IG5lZWQgdG8gdXNlCi0JdGhpcyByb3V0aW5lIGFuZCBwZXJoYXBzIGpwZWdfc2V0X3F1YWxpdHkoKS4KLQotanBlZ19zZXRfY29sb3JzcGFjZSAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQ09MT1JfU1BBQ0UgY29sb3JzcGFjZSkKLQlTZXRzIHRoZSBKUEVHIGZpbGUncyBjb2xvcnNwYWNlIChmaWVsZCBqcGVnX2NvbG9yX3NwYWNlKSBhcyBzcGVjaWZpZWQsCi0JYW5kIHNldHMgb3RoZXIgY29sb3Itc3BhY2UtZGVwZW5kZW50IHBhcmFtZXRlcnMgYXBwcm9wcmlhdGVseS4gIFNlZQotCSJTcGVjaWFsIGNvbG9yIHNwYWNlcyIsIGJlbG93LCBiZWZvcmUgdXNpbmcgdGhpcy4gIEEgbGFyZ2UgbnVtYmVyIG9mCi0JcGFyYW1ldGVycywgaW5jbHVkaW5nIGFsbCBwZXItY29tcG9uZW50IHBhcmFtZXRlcnMsIGFyZSBzZXQgYnkgdGhpcwotCXJvdXRpbmU7IGlmIHlvdSB3YW50IHRvIHR3aWRkbGUgaW5kaXZpZHVhbCBwYXJhbWV0ZXJzIHlvdSBzaG91bGQgY2FsbAotCWpwZWdfc2V0X2NvbG9yc3BhY2UoKSBiZWZvcmUgcmF0aGVyIHRoYW4gYWZ0ZXIuCi0KLWpwZWdfZGVmYXVsdF9jb2xvcnNwYWNlIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLQlTZWxlY3RzIGFuIGFwcHJvcHJpYXRlIEpQRUcgY29sb3JzcGFjZSBiYXNlZCBvbiBjaW5mby0+aW5fY29sb3Jfc3BhY2UsCi0JYW5kIGNhbGxzIGpwZWdfc2V0X2NvbG9yc3BhY2UoKS4gIFRoaXMgaXMgYWN0dWFsbHkgYSBzdWJyb3V0aW5lIG9mCi0JanBlZ19zZXRfZGVmYXVsdHMoKS4gIEl0J3MgYnJva2VuIG91dCBpbiBjYXNlIHlvdSB3YW50IHRvIGNoYW5nZQotCWp1c3QgdGhlIGNvbG9yc3BhY2UtZGVwZW5kZW50IEpQRUcgcGFyYW1ldGVycy4KLQotanBlZ19zZXRfcXVhbGl0eSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBxdWFsaXR5LCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQotCUNvbnN0cnVjdHMgSlBFRyBxdWFudGl6YXRpb24gdGFibGVzIGFwcHJvcHJpYXRlIGZvciB0aGUgaW5kaWNhdGVkCi0JcXVhbGl0eSBzZXR0aW5nLiAgVGhlIHF1YWxpdHkgdmFsdWUgaXMgZXhwcmVzc2VkIG9uIHRoZSAwLi4xMDAgc2NhbGUKLQlyZWNvbW1lbmRlZCBieSBJSkcgKGNqcGVnJ3MgIi1xdWFsaXR5IiBzd2l0Y2ggdXNlcyB0aGlzIHJvdXRpbmUpLgotCU5vdGUgdGhhdCB0aGUgZXhhY3QgbWFwcGluZyBmcm9tIHF1YWxpdHkgdmFsdWVzIHRvIHRhYmxlcyBtYXkgY2hhbmdlCi0JaW4gZnV0dXJlIElKRyByZWxlYXNlcyBhcyBtb3JlIGlzIGxlYXJuZWQgYWJvdXQgRENUIHF1YW50aXphdGlvbi4KLQlJZiB0aGUgZm9yY2VfYmFzZWxpbmUgcGFyYW1ldGVyIGlzIFRSVUUsIHRoZW4gdGhlIHF1YW50aXphdGlvbiB0YWJsZQotCWVudHJpZXMgYXJlIGNvbnN0cmFpbmVkIHRvIHRoZSByYW5nZSAxLi4yNTUgZm9yIGZ1bGwgSlBFRyBiYXNlbGluZQotCWNvbXBhdGliaWxpdHkuICBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhpcyBvbmx5IG1ha2VzIGEKLQlkaWZmZXJlbmNlIGZvciBxdWFsaXR5IHNldHRpbmdzIGJlbG93IDI1LCBhbmQgaXQgZWZmZWN0aXZlbHkgcHJldmVudHMKLQl2ZXJ5IHNtYWxsL2xvdyBxdWFsaXR5IGZpbGVzIGZyb20gYmVpbmcgZ2VuZXJhdGVkLiAgVGhlIElKRyBkZWNvZGVyCi0JaXMgY2FwYWJsZSBvZiByZWFkaW5nIHRoZSBub24tYmFzZWxpbmUgZmlsZXMgZ2VuZXJhdGVkIGF0IGxvdyBxdWFsaXR5Ci0Jc2V0dGluZ3Mgd2hlbiBmb3JjZV9iYXNlbGluZSBpcyBGQUxTRSwgYnV0IG90aGVyIGRlY29kZXJzIG1heSBub3QgYmUuCi0KLWpwZWdfc2V0X2xpbmVhcl9xdWFsaXR5IChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHNjYWxlX2ZhY3RvciwKLQkJCSBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQotCVNhbWUgYXMganBlZ19zZXRfcXVhbGl0eSgpIGV4Y2VwdCB0aGF0IHRoZSBnZW5lcmF0ZWQgdGFibGVzIGFyZSB0aGUKLQlzYW1wbGUgdGFibGVzIGdpdmVuIGluIHRoZSBKUEVDIHNwZWMgc2VjdGlvbiBLLjEsIG11bHRpcGxpZWQgYnkgdGhlCi0Jc3BlY2lmaWVkIHNjYWxlIGZhY3RvciAod2hpY2ggaXMgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZTsgdGh1cwotCXNjYWxlX2ZhY3RvciA9IDEwMCByZXByb2R1Y2VzIHRoZSBzcGVjJ3MgdGFibGVzKS4gIE5vdGUgdGhhdCBsYXJnZXIKLQlzY2FsZSBmYWN0b3JzIGdpdmUgbG93ZXIgcXVhbGl0eS4gIFRoaXMgZW50cnkgcG9pbnQgaXMgdXNlZnVsIGZvcgotCWNvbmZvcm1pbmcgdG8gdGhlIEFkb2JlIFBvc3RTY3JpcHQgRENUIGNvbnZlbnRpb25zLCBidXQgd2UgZG8gbm90Ci0JcmVjb21tZW5kIGxpbmVhciBzY2FsaW5nIGFzIGEgdXNlci12aXNpYmxlIHF1YWxpdHkgc2NhbGUgb3RoZXJ3aXNlLgotCWZvcmNlX2Jhc2VsaW5lIGFnYWluIGNvbnN0cmFpbnMgdGhlIGNvbXB1dGVkIHRhYmxlIGVudHJpZXMgdG8gMS4uMjU1LgotCi1pbnQganBlZ19xdWFsaXR5X3NjYWxpbmcgKGludCBxdWFsaXR5KQotCUNvbnZlcnRzIGEgdmFsdWUgb24gdGhlIElKRy1yZWNvbW1lbmRlZCBxdWFsaXR5IHNjYWxlIHRvIGEgbGluZWFyCi0Jc2NhbGluZyBwZXJjZW50YWdlLiAgTm90ZSB0aGF0IHRoaXMgcm91dGluZSBtYXkgY2hhbmdlIG9yIGdvIGF3YXkKLQlpbiBmdXR1cmUgcmVsZWFzZXMgLS0tIElKRyBtYXkgY2hvb3NlIHRvIGFkb3B0IGEgc2NhbGluZyBtZXRob2QgdGhhdAotCWNhbid0IGJlIGV4cHJlc3NlZCBhcyBhIHNpbXBsZSBzY2FsYXIgbXVsdGlwbGllciwgaW4gd2hpY2ggY2FzZSB0aGUKLQlwcmVtaXNlIG9mIHRoaXMgcm91dGluZSBjb2xsYXBzZXMuICBDYXZlYXQgdXNlci4KLQotanBlZ19hZGRfcXVhbnRfdGFibGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgd2hpY2hfdGJsLAotCQkgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgKmJhc2ljX3RhYmxlLAotCQkgICAgICBpbnQgc2NhbGVfZmFjdG9yLCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQotCUFsbG93cyBhbiBhcmJpdHJhcnkgcXVhbnRpemF0aW9uIHRhYmxlIHRvIGJlIGNyZWF0ZWQuICB3aGljaF90YmwKLQlpbmRpY2F0ZXMgd2hpY2ggdGFibGUgc2xvdCB0byBmaWxsLiAgYmFzaWNfdGFibGUgcG9pbnRzIHRvIGFuIGFycmF5Ci0Jb2YgNjQgdW5zaWduZWQgaW50cyBnaXZlbiBpbiBub3JtYWwgYXJyYXkgb3JkZXIuICBUaGVzZSB2YWx1ZXMgYXJlCi0JbXVsdGlwbGllZCBieSBzY2FsZV9mYWN0b3IvMTAwIGFuZCB0aGVuIGNsYW1wZWQgdG8gdGhlIHJhbmdlIDEuLjY1NTM1Ci0JKG9yIHRvIDEuLjI1NSBpZiBmb3JjZV9iYXNlbGluZSBpcyBUUlVFKS4KLQlDQVVUSU9OOiBwcmlvciB0byBsaWJyYXJ5IHZlcnNpb24gNmEsIGpwZWdfYWRkX3F1YW50X3RhYmxlIGV4cGVjdGVkCi0JdGhlIGJhc2ljIHRhYmxlIHRvIGJlIGdpdmVuIGluIEpQRUcgemlnemFnIG9yZGVyLiAgSWYgeW91IG5lZWQgdG8KLQl3cml0ZSBjb2RlIHRoYXQgd29ya3Mgd2l0aCBlaXRoZXIgb2xkZXIgb3IgbmV3ZXIgdmVyc2lvbnMgb2YgdGhpcwotCXJvdXRpbmUsIHlvdSBtdXN0IGNoZWNrIHRoZSBsaWJyYXJ5IHZlcnNpb24gbnVtYmVyLiAgU29tZXRoaW5nIGxpa2UKLQkiI2lmIEpQRUdfTElCX1ZFUlNJT04gPj0gNjEiIGlzIHRoZSByaWdodCB0ZXN0LgotCi1qcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCi0JR2VuZXJhdGVzIGEgZGVmYXVsdCBzY2FuIHNjcmlwdCBmb3Igd3JpdGluZyBhIHByb2dyZXNzaXZlLUpQRUcgZmlsZS4KLQlUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBtZXRob2Qgb2YgY3JlYXRpbmcgYSBwcm9ncmVzc2l2ZSBmaWxlLAotCXVubGVzcyB5b3Ugd2FudCB0byBtYWtlIGEgY3VzdG9tIHNjYW4gc2VxdWVuY2UuICBZb3UgbXVzdCBlbnN1cmUgdGhhdAotCXRoZSBKUEVHIGNvbG9yIHNwYWNlIGlzIHNldCBjb3JyZWN0bHkgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgotCi0KLUNvbXByZXNzaW9uIHBhcmFtZXRlcnMgKGNpbmZvIGZpZWxkcykgaW5jbHVkZToKLQotSl9EQ1RfTUVUSE9EIGRjdF9tZXRob2QKLQlTZWxlY3RzIHRoZSBhbGdvcml0aG0gdXNlZCBmb3IgdGhlIERDVCBzdGVwLiAgQ2hvaWNlcyBhcmU6Ci0JCUpEQ1RfSVNMT1c6IHNsb3cgYnV0IGFjY3VyYXRlIGludGVnZXIgYWxnb3JpdGhtCi0JCUpEQ1RfSUZBU1Q6IGZhc3RlciwgbGVzcyBhY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZAotCQlKRENUX0ZMT0FUOiBmbG9hdGluZy1wb2ludCBtZXRob2QKLQkJSkRDVF9ERUZBVUxUOiBkZWZhdWx0IG1ldGhvZCAobm9ybWFsbHkgSkRDVF9JU0xPVykKLQkJSkRDVF9GQVNURVNUOiBmYXN0ZXN0IG1ldGhvZCAobm9ybWFsbHkgSkRDVF9JRkFTVCkKLQlUaGUgRkxPQVQgbWV0aG9kIGlzIHZlcnkgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSBJU0xPVyBtZXRob2QsCi0JYnV0IG1heSBnaXZlIGRpZmZlcmVudCByZXN1bHRzIG9uIGRpZmZlcmVudCBtYWNoaW5lcyBkdWUgdG8gdmFyeWluZwotCXJvdW5kb2ZmIGJlaGF2aW9yLiAgVGhlIGludGVnZXIgbWV0aG9kcyBzaG91bGQgZ2l2ZSB0aGUgc2FtZSByZXN1bHRzCi0Jb24gYWxsIG1hY2hpbmVzLiAgT24gbWFjaGluZXMgd2l0aCBzdWZmaWNpZW50bHkgZmFzdCBGUCBoYXJkd2FyZSwgdGhlCi0JZmxvYXRpbmctcG9pbnQgbWV0aG9kIG1heSBhbHNvIGJlIHRoZSBmYXN0ZXN0LiAgVGhlIElGQVNUIG1ldGhvZCBpcwotCWNvbnNpZGVyYWJseSBsZXNzIGFjY3VyYXRlIHRoYW4gdGhlIG90aGVyIHR3bzsgaXRzIHVzZSBpcyBub3QKLQlyZWNvbW1lbmRlZCBpZiBoaWdoIHF1YWxpdHkgaXMgYSBjb25jZXJuLiAgSkRDVF9ERUZBVUxUIGFuZAotCUpEQ1RfRkFTVEVTVCBhcmUgbWFjcm9zIGNvbmZpZ3VyYWJsZSBieSBlYWNoIGluc3RhbGxhdGlvbi4KLQotSl9DT0xPUl9TUEFDRSBqcGVnX2NvbG9yX3NwYWNlCi1pbnQgbnVtX2NvbXBvbmVudHMKLQlUaGUgSlBFRyBjb2xvciBzcGFjZSBhbmQgY29ycmVzcG9uZGluZyBudW1iZXIgb2YgY29tcG9uZW50czsgc2VlCi0JIlNwZWNpYWwgY29sb3Igc3BhY2VzIiwgYmVsb3csIGZvciBtb3JlIGluZm8uICBXZSByZWNvbW1lbmQgdXNpbmcKLQlqcGVnX3NldF9jb2xvcl9zcGFjZSgpIGlmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGVzZS4KLQotYm9vbGVhbiBvcHRpbWl6ZV9jb2RpbmcKLQlUUlVFIGNhdXNlcyB0aGUgY29tcHJlc3NvciB0byBjb21wdXRlIG9wdGltYWwgSHVmZm1hbiBjb2RpbmcgdGFibGVzCi0JZm9yIHRoZSBpbWFnZS4gIFRoaXMgcmVxdWlyZXMgYW4gZXh0cmEgcGFzcyBvdmVyIHRoZSBkYXRhIGFuZAotCXRoZXJlZm9yZSBjb3N0cyBhIGdvb2QgZGVhbCBvZiBzcGFjZSBhbmQgdGltZS4gIFRoZSBkZWZhdWx0IGlzCi0JRkFMU0UsIHdoaWNoIHRlbGxzIHRoZSBjb21wcmVzc29yIHRvIHVzZSB0aGUgc3VwcGxpZWQgb3IgZGVmYXVsdAotCUh1ZmZtYW4gdGFibGVzLiAgSW4gbW9zdCBjYXNlcyBvcHRpbWFsIHRhYmxlcyBzYXZlIG9ubHkgYSBmZXcgcGVyY2VudAotCW9mIGZpbGUgc2l6ZSBjb21wYXJlZCB0byB0aGUgZGVmYXVsdCB0YWJsZXMuICBOb3RlIHRoYXQgd2hlbiB0aGlzIGlzCi0JVFJVRSwgeW91IG5lZWQgbm90IHN1cHBseSBIdWZmbWFuIHRhYmxlcyBhdCBhbGwsIGFuZCBhbnkgeW91IGRvCi0Jc3VwcGx5IHdpbGwgYmUgb3ZlcndyaXR0ZW4uCi0KLXVuc2lnbmVkIGludCByZXN0YXJ0X2ludGVydmFsCi1pbnQgcmVzdGFydF9pbl9yb3dzCi0JVG8gZW1pdCByZXN0YXJ0IG1hcmtlcnMgaW4gdGhlIEpQRUcgZmlsZSwgc2V0IG9uZSBvZiB0aGVzZSBub256ZXJvLgotCVNldCByZXN0YXJ0X2ludGVydmFsIHRvIHNwZWNpZnkgdGhlIGV4YWN0IGludGVydmFsIGluIE1DVSBibG9ja3MuCi0JU2V0IHJlc3RhcnRfaW5fcm93cyB0byBzcGVjaWZ5IHRoZSBpbnRlcnZhbCBpbiBNQ1Ugcm93cy4gIChJZgotCXJlc3RhcnRfaW5fcm93cyBpcyBub3QgMCwgdGhlbiByZXN0YXJ0X2ludGVydmFsIGlzIHNldCBhZnRlciB0aGUKLQlpbWFnZSB3aWR0aCBpbiBNQ1VzIGlzIGNvbXB1dGVkLikgIERlZmF1bHRzIGFyZSB6ZXJvIChubyByZXN0YXJ0cykuCi0JT25lIHJlc3RhcnQgbWFya2VyIHBlciBNQ1Ugcm93IGlzIG9mdGVuIGEgZ29vZCBjaG9pY2UuCi0JTk9URTogdGhlIG92ZXJoZWFkIG9mIHJlc3RhcnQgbWFya2VycyBpcyBoaWdoZXIgaW4gZ3JheXNjYWxlIEpQRUcKLQlmaWxlcyB0aGFuIGluIGNvbG9yIGZpbGVzLCBhbmQgTVVDSCBoaWdoZXIgaW4gcHJvZ3Jlc3NpdmUgSlBFR3MuCi0JSWYgeW91IHVzZSByZXN0YXJ0cywgeW91IG1heSB3YW50IHRvIHVzZSBsYXJnZXIgaW50ZXJ2YWxzIGluIHRob3NlCi0JY2FzZXMuCi0KLWNvbnN0IGpwZWdfc2Nhbl9pbmZvICogc2Nhbl9pbmZvCi1pbnQgbnVtX3NjYW5zCi0JQnkgZGVmYXVsdCwgc2Nhbl9pbmZvIGlzIE5VTEw7IHRoaXMgY2F1c2VzIHRoZSBjb21wcmVzc29yIHRvIHdyaXRlIGEKLQlzaW5nbGUtc2NhbiBzZXF1ZW50aWFsIEpQRUcgZmlsZS4gIElmIG5vdCBOVUxMLCBzY2FuX2luZm8gcG9pbnRzIHRvCi0JYW4gYXJyYXkgb2Ygc2NhbiBkZWZpbml0aW9uIHJlY29yZHMgb2YgbGVuZ3RoIG51bV9zY2Fucy4gIFRoZQotCWNvbXByZXNzb3Igd2lsbCB0aGVuIHdyaXRlIGEgSlBFRyBmaWxlIGhhdmluZyBvbmUgc2NhbiBmb3IgZWFjaCBzY2FuCi0JZGVmaW5pdGlvbiByZWNvcmQuICBUaGlzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgbm9uaW50ZXJsZWF2ZWQgb3IKLQlwcm9ncmVzc2l2ZSBKUEVHIGZpbGVzLiAgVGhlIGxpYnJhcnkgY2hlY2tzIHRoYXQgdGhlIHNjYW4gYXJyYXkKLQlkZWZpbmVzIGEgdmFsaWQgSlBFRyBzY2FuIHNlcXVlbmNlLiAgKGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uIGNyZWF0ZXMKLQlhIHN1aXRhYmxlIHNjYW4gZGVmaW5pdGlvbiBhcnJheSBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4pICBUaGlzIGlzCi0JZGlzY3Vzc2VkIGZ1cnRoZXIgdW5kZXIgIlByb2dyZXNzaXZlIEpQRUcgc3VwcG9ydCIuCi0KLWludCBzbW9vdGhpbmdfZmFjdG9yCi0JSWYgbm9uLXplcm8sIHRoZSBpbnB1dCBpbWFnZSBpcyBzbW9vdGhlZDsgdGhlIHZhbHVlIHNob3VsZCBiZSAxIGZvcgotCW1pbmltYWwgc21vb3RoaW5nIHRvIDEwMCBmb3IgbWF4aW11bSBzbW9vdGhpbmcuICBDb25zdWx0IGpjc2FtcGxlLmMKLQlmb3IgZGV0YWlscyBvZiB0aGUgc21vb3RoaW5nIGFsZ29yaXRobS4gIFRoZSBkZWZhdWx0IGlzIHplcm8uCi0KLWJvb2xlYW4gd3JpdGVfSkZJRl9oZWFkZXIKLQlJZiBUUlVFLCBhIEpGSUYgQVBQMCBtYXJrZXIgaXMgZW1pdHRlZC4gIGpwZWdfc2V0X2RlZmF1bHRzKCkgYW5kCi0JanBlZ19zZXRfY29sb3JzcGFjZSgpIHNldCB0aGlzIFRSVUUgaWYgYSBKRklGLWxlZ2FsIEpQRUcgY29sb3Igc3BhY2UKLQkoaWUsIFlDYkNyIG9yIGdyYXlzY2FsZSkgaXMgc2VsZWN0ZWQsIG90aGVyd2lzZSBGQUxTRS4KLQotVUlOVDggSkZJRl9tYWpvcl92ZXJzaW9uCi1VSU5UOCBKRklGX21pbm9yX3ZlcnNpb24KLQlUaGUgdmVyc2lvbiBudW1iZXIgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBKRklGIG1hcmtlci4KLQlqcGVnX3NldF9kZWZhdWx0cygpIGluaXRpYWxpemVzIHRoZSB2ZXJzaW9uIHRvIDEuMDEgKG1ham9yPW1pbm9yPTEpLgotCVlvdSBzaG91bGQgc2V0IGl0IHRvIDEuMDIgKG1ham9yPTEsIG1pbm9yPTIpIGlmIHlvdSBwbGFuIHRvIHdyaXRlCi0JYW55IEpGSUYgMS4wMiBleHRlbnNpb24gbWFya2Vycy4KLQotVUlOVDggZGVuc2l0eV91bml0Ci1VSU5UMTYgWF9kZW5zaXR5Ci1VSU5UMTYgWV9kZW5zaXR5Ci0JVGhlIHJlc29sdXRpb24gaW5mb3JtYXRpb24gdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBKRklGIG1hcmtlcjsKLQlub3QgdXNlZCBvdGhlcndpc2UuICBkZW5zaXR5X3VuaXQgbWF5IGJlIDAgZm9yIHVua25vd24sCi0JMSBmb3IgZG90cy9pbmNoLCBvciAyIGZvciBkb3RzL2NtLiAgVGhlIGRlZmF1bHQgdmFsdWVzIGFyZSAwLDEsMQotCWluZGljYXRpbmcgc3F1YXJlIHBpeGVscyBvZiB1bmtub3duIHNpemUuCi0KLWJvb2xlYW4gd3JpdGVfQWRvYmVfbWFya2VyCi0JSWYgVFJVRSwgYW4gQWRvYmUgQVBQMTQgbWFya2VyIGlzIGVtaXR0ZWQuICBqcGVnX3NldF9kZWZhdWx0cygpIGFuZAotCWpwZWdfc2V0X2NvbG9yc3BhY2UoKSBzZXQgdGhpcyBUUlVFIGlmIEpQRUcgY29sb3Igc3BhY2UgUkdCLCBDTVlLLAotCW9yIFlDQ0sgaXMgc2VsZWN0ZWQsIG90aGVyd2lzZSBGQUxTRS4gIEl0IGlzIGdlbmVyYWxseSBhIGJhZCBpZGVhCi0JdG8gc2V0IGJvdGggd3JpdGVfSkZJRl9oZWFkZXIgYW5kIHdyaXRlX0Fkb2JlX21hcmtlci4gIEluIGZhY3QsCi0JeW91IHByb2JhYmx5IHNob3VsZG4ndCBjaGFuZ2UgdGhlIGRlZmF1bHQgc2V0dGluZ3MgYXQgYWxsIC0tLSB0aGUKLQlkZWZhdWx0IGJlaGF2aW9yIGVuc3VyZXMgdGhhdCB0aGUgSlBFRyBmaWxlJ3MgY29sb3Igc3BhY2UgY2FuIGJlCi0JcmVjb2duaXplZCBieSB0aGUgZGVjb2Rlci4KLQotSlFVQU5UX1RCTCAqIHF1YW50X3RibF9wdHJzW05VTV9RVUFOVF9UQkxTXQotCVBvaW50ZXJzIHRvIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbiB0YWJsZXMsIG9uZSBwZXIgdGFibGUgc2xvdCwKLQlvciBOVUxMIGlmIG5vIHRhYmxlIGlzIGRlZmluZWQgZm9yIGEgc2xvdC4gIFVzdWFsbHkgdGhlc2Ugc2hvdWxkCi0JYmUgc2V0IHZpYSBvbmUgb2YgdGhlIGFib3ZlIGhlbHBlciByb3V0aW5lczsganBlZ19hZGRfcXVhbnRfdGFibGUoKQotCWlzIGdlbmVyYWwgZW5vdWdoIHRvIGRlZmluZSBhbnkgcXVhbnRpemF0aW9uIHRhYmxlLiAgVGhlIG90aGVyCi0Jcm91dGluZXMgd2lsbCBzZXQgdXAgdGFibGUgc2xvdCAwIGZvciBsdW1pbmFuY2UgcXVhbGl0eSBhbmQgdGFibGUKLQlzbG90IDEgZm9yIGNocm9taW5hbmNlLgotCi1KSFVGRl9UQkwgKiBkY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdCi1KSFVGRl9UQkwgKiBhY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdCi0JUG9pbnRlcnMgdG8gSHVmZm1hbiBjb2RpbmcgdGFibGVzLCBvbmUgcGVyIHRhYmxlIHNsb3QsIG9yIE5VTEwgaWYKLQlubyB0YWJsZSBpcyBkZWZpbmVkIGZvciBhIHNsb3QuICBTbG90cyAwIGFuZCAxIGFyZSBmaWxsZWQgd2l0aCB0aGUKLQlKUEVHIHNhbXBsZSB0YWJsZXMgYnkganBlZ19zZXRfZGVmYXVsdHMoKS4gIElmIHlvdSBuZWVkIHRvIGFsbG9jYXRlCi0JbW9yZSB0YWJsZSBzdHJ1Y3R1cmVzLCBqcGVnX2FsbG9jX2h1ZmZfdGFibGUoKSBtYXkgYmUgdXNlZC4KLQlOb3RlIHRoYXQgb3B0aW1hbCBIdWZmbWFuIHRhYmxlcyBjYW4gYmUgY29tcHV0ZWQgZm9yIGFuIGltYWdlCi0JYnkgc2V0dGluZyBvcHRpbWl6ZV9jb2RpbmcsIGFzIGRpc2N1c3NlZCBhYm92ZTsgdGhlcmUncyBzZWxkb20KLQlhbnkgbmVlZCB0byBtZXNzIHdpdGggcHJvdmlkaW5nIHlvdXIgb3duIEh1ZmZtYW4gdGFibGVzLgotCi1UaGVyZSBhcmUgc29tZSBhZGRpdGlvbmFsIGNpbmZvIGZpZWxkcyB3aGljaCBhcmUgbm90IGRvY3VtZW50ZWQgaGVyZQotYmVjYXVzZSB5b3UgY3VycmVudGx5IGNhbid0IGNoYW5nZSB0aGVtOyBmb3IgZXhhbXBsZSwgeW91IGNhbid0IHNldAotYXJpdGhfY29kZSBUUlVFIGJlY2F1c2UgYXJpdGhtZXRpYyBjb2RpbmcgaXMgdW5zdXBwb3J0ZWQuCi0KLQotUGVyLWNvbXBvbmVudCBwYXJhbWV0ZXJzIGFyZSBzdG9yZWQgaW4gdGhlIHN0cnVjdCBjaW5mby5jb21wX2luZm9baV0gZm9yCi1jb21wb25lbnQgbnVtYmVyIGkuICBOb3RlIHRoYXQgY29tcG9uZW50cyBoZXJlIHJlZmVyIHRvIGNvbXBvbmVudHMgb2YgdGhlCi1KUEVHIGNvbG9yIHNwYWNlLCAqbm90KiB0aGUgc291cmNlIGltYWdlIGNvbG9yIHNwYWNlLiAgQSBzdWl0YWJseSBsYXJnZQotY29tcF9pbmZvW10gYXJyYXkgaXMgYWxsb2NhdGVkIGJ5IGpwZWdfc2V0X2RlZmF1bHRzKCk7IGlmIHlvdSBjaG9vc2Ugbm90Ci10byB1c2UgdGhhdCByb3V0aW5lLCBpdCdzIHVwIHRvIHlvdSB0byBhbGxvY2F0ZSB0aGUgYXJyYXkuCi0KLWludCBjb21wb25lbnRfaWQKLQlUaGUgb25lLWJ5dGUgaWRlbnRpZmllciBjb2RlIHRvIGJlIHJlY29yZGVkIGluIHRoZSBKUEVHIGZpbGUgZm9yCi0JdGhpcyBjb21wb25lbnQuICBGb3IgdGhlIHN0YW5kYXJkIGNvbG9yIHNwYWNlcywgd2UgcmVjb21tZW5kIHlvdQotCWxlYXZlIHRoZSBkZWZhdWx0IHZhbHVlcyBhbG9uZS4KLQotaW50IGhfc2FtcF9mYWN0b3IKLWludCB2X3NhbXBfZmFjdG9yCi0JSG9yaXpvbnRhbCBhbmQgdmVydGljYWwgc2FtcGxpbmcgZmFjdG9ycyBmb3IgdGhlIGNvbXBvbmVudDsgbXVzdAotCWJlIDEuLjQgYWNjb3JkaW5nIHRvIHRoZSBKUEVHIHN0YW5kYXJkLiAgTm90ZSB0aGF0IGxhcmdlciBzYW1wbGluZwotCWZhY3RvcnMgaW5kaWNhdGUgYSBoaWdoZXItcmVzb2x1dGlvbiBjb21wb25lbnQ7IG1hbnkgcGVvcGxlIGZpbmQKLQl0aGlzIGJlaGF2aW9yIHF1aXRlIHVuaW50dWl0aXZlLiAgVGhlIGRlZmF1bHQgdmFsdWVzIGFyZSAyLDIgZm9yCi0JbHVtaW5hbmNlIGNvbXBvbmVudHMgYW5kIDEsMSBmb3IgY2hyb21pbmFuY2UgY29tcG9uZW50cywgZXhjZXB0Ci0JZm9yIGdyYXlzY2FsZSB3aGVyZSAxLDEgaXMgdXNlZC4KLQotaW50IHF1YW50X3RibF9ubwotCVF1YW50aXphdGlvbiB0YWJsZSBudW1iZXIgZm9yIGNvbXBvbmVudC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0JMCBmb3IgbHVtaW5hbmNlIGNvbXBvbmVudHMgYW5kIDEgZm9yIGNocm9taW5hbmNlIGNvbXBvbmVudHMuCi0KLWludCBkY190Ymxfbm8KLWludCBhY190Ymxfbm8KLQlEQyBhbmQgQUMgZW50cm9weSBjb2RpbmcgdGFibGUgbnVtYmVycy4gIFRoZSBkZWZhdWx0IHZhbHVlcyBhcmUKLQkwIGZvciBsdW1pbmFuY2UgY29tcG9uZW50cyBhbmQgMSBmb3IgY2hyb21pbmFuY2UgY29tcG9uZW50cy4KLQotaW50IGNvbXBvbmVudF9pbmRleAotCU11c3QgZXF1YWwgdGhlIGNvbXBvbmVudCdzIGluZGV4IGluIGNvbXBfaW5mb1tdLiAgKEJlZ2lubmluZyBpbgotCXJlbGVhc2UgdjYsIHRoZSBjb21wcmVzc29yIGxpYnJhcnkgd2lsbCBmaWxsIHRoaXMgaW4gYXV0b21hdGljYWxseTsKLQl5b3UgZG9uJ3QgaGF2ZSB0by4pCi0KLQotRGVjb21wcmVzc2lvbiBwYXJhbWV0ZXIgc2VsZWN0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRGVjb21wcmVzc2lvbiBwYXJhbWV0ZXIgc2VsZWN0aW9uIGlzIHNvbWV3aGF0IHNpbXBsZXIgdGhhbiBjb21wcmVzc2lvbgotcGFyYW1ldGVyIHNlbGVjdGlvbiwgc2luY2UgYWxsIG9mIHRoZSBKUEVHIGludGVybmFsIHBhcmFtZXRlcnMgYXJlCi1yZWNvcmRlZCBpbiB0aGUgc291cmNlIGZpbGUgYW5kIG5lZWQgbm90IGJlIHN1cHBsaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLShVbmxlc3MgeW91IGFyZSB3b3JraW5nIHdpdGggYWJicmV2aWF0ZWQgZmlsZXMsIGluIHdoaWNoIGNhc2Ugc2VlCi0iQWJicmV2aWF0ZWQgZGF0YXN0cmVhbXMiLCBiZWxvdy4pICBEZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgY29udHJvbAotdGhlIHBvc3Rwcm9jZXNzaW5nIGRvbmUgb24gdGhlIGltYWdlIHRvIGRlbGl2ZXIgaXQgaW4gYSBmb3JtYXQgc3VpdGFibGUKLWZvciB0aGUgYXBwbGljYXRpb24ncyB1c2UuICBNYW55IG9mIHRoZSBwYXJhbWV0ZXJzIGNvbnRyb2wgc3BlZWQvcXVhbGl0eQotdHJhZGVvZmZzLCBpbiB3aGljaCBmYXN0ZXIgZGVjb21wcmVzc2lvbiBtYXkgYmUgb2J0YWluZWQgYXQgdGhlIHByaWNlIG9mCi1hIHBvb3Jlci1xdWFsaXR5IGltYWdlLiAgVGhlIGRlZmF1bHRzIHNlbGVjdCB0aGUgaGlnaGVzdCBxdWFsaXR5IChzbG93ZXN0KQotcHJvY2Vzc2luZy4KLQotVGhlIGZvbGxvd2luZyBmaWVsZHMgaW4gdGhlIEpQRUcgb2JqZWN0IGFyZSBzZXQgYnkganBlZ19yZWFkX2hlYWRlcigpIGFuZAotbWF5IGJlIHVzZWZ1bCB0byB0aGUgYXBwbGljYXRpb24gaW4gY2hvb3NpbmcgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzOgotCi1KRElNRU5TSU9OIGltYWdlX3dpZHRoCQkJV2lkdGggYW5kIGhlaWdodCBvZiBpbWFnZQotSkRJTUVOU0lPTiBpbWFnZV9oZWlnaHQKLWludCBudW1fY29tcG9uZW50cwkJCU51bWJlciBvZiBjb2xvciBjb21wb25lbnRzCi1KX0NPTE9SX1NQQUNFIGpwZWdfY29sb3Jfc3BhY2UJCUNvbG9yc3BhY2Ugb2YgaW1hZ2UKLWJvb2xlYW4gc2F3X0pGSUZfbWFya2VyCQkJVFJVRSBpZiBhIEpGSUYgQVBQMCBtYXJrZXIgd2FzIHNlZW4KLSAgVUlOVDggSkZJRl9tYWpvcl92ZXJzaW9uCQlWZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gSkZJRiBtYXJrZXIKLSAgVUlOVDggSkZJRl9taW5vcl92ZXJzaW9uCi0gIFVJTlQ4IGRlbnNpdHlfdW5pdAkJCVJlc29sdXRpb24gZGF0YSBmcm9tIEpGSUYgbWFya2VyCi0gIFVJTlQxNiBYX2RlbnNpdHkKLSAgVUlOVDE2IFlfZGVuc2l0eQotYm9vbGVhbiBzYXdfQWRvYmVfbWFya2VyCQlUUlVFIGlmIGFuIEFkb2JlIEFQUDE0IG1hcmtlciB3YXMgc2VlbgotICBVSU5UOCBBZG9iZV90cmFuc2Zvcm0JCQlDb2xvciB0cmFuc2Zvcm0gY29kZSBmcm9tIEFkb2JlIG1hcmtlcgotCi1UaGUgSlBFRyBjb2xvciBzcGFjZSwgdW5mb3J0dW5hdGVseSwgaXMgc29tZXRoaW5nIG9mIGEgZ3Vlc3Mgc2luY2UgdGhlIEpQRUcKLXN0YW5kYXJkIHByb3BlciBkb2VzIG5vdCBwcm92aWRlIGEgd2F5IHRvIHJlY29yZCBpdC4gIEluIHByYWN0aWNlIG1vc3QgZmlsZXMKLWFkaGVyZSB0byB0aGUgSkZJRiBvciBBZG9iZSBjb252ZW50aW9ucywgYW5kIHRoZSBkZWNvZGVyIHdpbGwgcmVjb2duaXplIHRoZXNlCi1jb3JyZWN0bHkuICBTZWUgIlNwZWNpYWwgY29sb3Igc3BhY2VzIiwgYmVsb3csIGZvciBtb3JlIGluZm8uCi0KLQotVGhlIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyB0aGF0IGRldGVybWluZSB0aGUgYmFzaWMgcHJvcGVydGllcyBvZiB0aGUKLXJldHVybmVkIGltYWdlIGFyZToKLQotSl9DT0xPUl9TUEFDRSBvdXRfY29sb3Jfc3BhY2UKLQlPdXRwdXQgY29sb3Igc3BhY2UuICBqcGVnX3JlYWRfaGVhZGVyKCkgc2V0cyBhbiBhcHByb3ByaWF0ZSBkZWZhdWx0Ci0JYmFzZWQgb24ganBlZ19jb2xvcl9zcGFjZTsgdHlwaWNhbGx5IGl0IHdpbGwgYmUgUkdCIG9yIGdyYXlzY2FsZS4KLQlUaGUgYXBwbGljYXRpb24gY2FuIGNoYW5nZSB0aGlzIGZpZWxkIHRvIHJlcXVlc3Qgb3V0cHV0IGluIGEgZGlmZmVyZW50Ci0JY29sb3JzcGFjZS4gIEZvciBleGFtcGxlLCBzZXQgaXQgdG8gSkNTX0dSQVlTQ0FMRSB0byBnZXQgZ3JheXNjYWxlCi0Jb3V0cHV0IGZyb20gYSBjb2xvciBmaWxlLiAgKFRoaXMgaXMgdXNlZnVsIGZvciBwcmV2aWV3aW5nOiBncmF5c2NhbGUKLQlvdXRwdXQgaXMgZmFzdGVyIHRoYW4gZnVsbCBjb2xvciBzaW5jZSB0aGUgY29sb3IgY29tcG9uZW50cyBuZWVkIG5vdAotCWJlIHByb2Nlc3NlZC4pICBOb3RlIHRoYXQgbm90IGFsbCBwb3NzaWJsZSBjb2xvciBzcGFjZSB0cmFuc2Zvcm1zIGFyZQotCWN1cnJlbnRseSBpbXBsZW1lbnRlZDsgeW91IG1heSBuZWVkIHRvIGV4dGVuZCBqZGNvbG9yLmMgaWYgeW91IHdhbnQgYW4KLQl1bnVzdWFsIGNvbnZlcnNpb24uCi0KLXVuc2lnbmVkIGludCBzY2FsZV9udW0sIHNjYWxlX2Rlbm9tCi0JU2NhbGUgdGhlIGltYWdlIGJ5IHRoZSBmcmFjdGlvbiBzY2FsZV9udW0vc2NhbGVfZGVub20uICBEZWZhdWx0IGlzCi0JMS8xLCBvciBubyBzY2FsaW5nLiAgQ3VycmVudGx5LCB0aGUgb25seSBzdXBwb3J0ZWQgc2NhbGluZyByYXRpb3MKLQlhcmUgMS8xLCAxLzIsIDEvNCwgYW5kIDEvOC4gIChUaGUgbGlicmFyeSBkZXNpZ24gYWxsb3dzIGZvciBhcmJpdHJhcnkKLQlzY2FsaW5nIHJhdGlvcyBidXQgdGhpcyBpcyBub3QgbGlrZWx5IHRvIGJlIGltcGxlbWVudGVkIGFueSB0aW1lIHNvb24uKQotCVNtYWxsZXIgc2NhbGluZyByYXRpb3MgcGVybWl0IHNpZ25pZmljYW50bHkgZmFzdGVyIGRlY29kaW5nIHNpbmNlCi0JZmV3ZXIgcGl4ZWxzIG5lZWQgYmUgcHJvY2Vzc2VkIGFuZCBhIHNpbXBsZXIgSURDVCBtZXRob2QgY2FuIGJlIHVzZWQuCi0KLWJvb2xlYW4gcXVhbnRpemVfY29sb3JzCi0JSWYgc2V0IFRSVUUsIGNvbG9ybWFwcGVkIG91dHB1dCB3aWxsIGJlIGRlbGl2ZXJlZC4gIERlZmF1bHQgaXMgRkFMU0UsCi0JbWVhbmluZyB0aGF0IGZ1bGwtY29sb3Igb3V0cHV0IHdpbGwgYmUgZGVsaXZlcmVkLgotCi1UaGUgbmV4dCB0aHJlZSBwYXJhbWV0ZXJzIGFyZSByZWxldmFudCBvbmx5IGlmIHF1YW50aXplX2NvbG9ycyBpcyBUUlVFLgotCi1pbnQgZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzCi0JTWF4aW11bSBudW1iZXIgb2YgY29sb3JzIHRvIHVzZSBpbiBnZW5lcmF0aW5nIGEgbGlicmFyeS1zdXBwbGllZCBjb2xvcgotCW1hcCAodGhlIGFjdHVhbCBudW1iZXIgb2YgY29sb3JzIGlzIHJldHVybmVkIGluIGEgZGlmZmVyZW50IGZpZWxkKS4KLQlEZWZhdWx0IDI1Ni4gIElnbm9yZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gc3VwcGxpZXMgaXRzIG93biBjb2xvciBtYXAuCi0KLWJvb2xlYW4gdHdvX3Bhc3NfcXVhbnRpemUKLQlJZiBUUlVFLCBhbiBleHRyYSBwYXNzIG92ZXIgdGhlIGltYWdlIGlzIG1hZGUgdG8gc2VsZWN0IGEgY3VzdG9tIGNvbG9yCi0JbWFwIGZvciB0aGUgaW1hZ2UuICBUaGlzIHVzdWFsbHkgbG9va3MgYSBsb3QgYmV0dGVyIHRoYW4gdGhlIG9uZS1zaXplLQotCWZpdHMtYWxsIGNvbG9ybWFwIHRoYXQgaXMgdXNlZCBvdGhlcndpc2UuICBEZWZhdWx0IGlzIFRSVUUuICBJZ25vcmVkCi0Jd2hlbiB0aGUgYXBwbGljYXRpb24gc3VwcGxpZXMgaXRzIG93biBjb2xvciBtYXAuCi0KLUpfRElUSEVSX01PREUgZGl0aGVyX21vZGUKLQlTZWxlY3RzIGNvbG9yIGRpdGhlcmluZyBtZXRob2QuICBTdXBwb3J0ZWQgdmFsdWVzIGFyZToKLQkJSkRJVEhFUl9OT05FCW5vIGRpdGhlcmluZzogZmFzdCwgdmVyeSBsb3cgcXVhbGl0eQotCQlKRElUSEVSX09SREVSRUQJb3JkZXJlZCBkaXRoZXI6IG1vZGVyYXRlIHNwZWVkIGFuZCBxdWFsaXR5Ci0JCUpESVRIRVJfRlMJRmxveWQtU3RlaW5iZXJnIGRpdGhlcjogc2xvdywgaGlnaCBxdWFsaXR5Ci0JRGVmYXVsdCBpcyBKRElUSEVSX0ZTLiAgKEF0IHByZXNlbnQsIG9yZGVyZWQgZGl0aGVyIGlzIGltcGxlbWVudGVkCi0Jb25seSBpbiB0aGUgc2luZ2xlLXBhc3MsIHN0YW5kYXJkLWNvbG9ybWFwIGNhc2UuICBJZiB5b3UgYXNrIGZvcgotCW9yZGVyZWQgZGl0aGVyIHdoZW4gdHdvX3Bhc3NfcXVhbnRpemUgaXMgVFJVRSBvciB3aGVuIHlvdSBzdXBwbHkKLQlhbiBleHRlcm5hbCBjb2xvciBtYXAsIHlvdSdsbCBnZXQgRi1TIGRpdGhlcmluZy4pCi0KLVdoZW4gcXVhbnRpemVfY29sb3JzIGlzIFRSVUUsIHRoZSB0YXJnZXQgY29sb3IgbWFwIGlzIGRlc2NyaWJlZCBieSB0aGUgbmV4dAotdHdvIGZpZWxkcy4gIGNvbG9ybWFwIGlzIHNldCB0byBOVUxMIGJ5IGpwZWdfcmVhZF9oZWFkZXIoKS4gIFRoZSBhcHBsaWNhdGlvbgotY2FuIHN1cHBseSBhIGNvbG9yIG1hcCBieSBzZXR0aW5nIGNvbG9ybWFwIG5vbi1OVUxMIGFuZCBzZXR0aW5nCi1hY3R1YWxfbnVtYmVyX29mX2NvbG9ycyB0byB0aGUgbWFwIHNpemUuICBPdGhlcndpc2UsIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpCi1zZWxlY3RzIGEgc3VpdGFibGUgY29sb3IgbWFwIGFuZCBzZXRzIHRoZXNlIHR3byBmaWVsZHMgaXRzZWxmLgotW0ltcGxlbWVudGF0aW9uIHJlc3RyaWN0aW9uOiBhdCBwcmVzZW50LCBhbiBleHRlcm5hbGx5IHN1cHBsaWVkIGNvbG9ybWFwIGlzCi1vbmx5IGFjY2VwdGVkIGZvciAzLWNvbXBvbmVudCBvdXRwdXQgY29sb3Igc3BhY2VzLl0KLQotSlNBTVBBUlJBWSBjb2xvcm1hcAotCVRoZSBjb2xvciBtYXAsIHJlcHJlc2VudGVkIGFzIGEgMi1EIHBpeGVsIGFycmF5IG9mIG91dF9jb2xvcl9jb21wb25lbnRzCi0Jcm93cyBhbmQgYWN0dWFsX251bWJlcl9vZl9jb2xvcnMgY29sdW1ucy4gIElnbm9yZWQgaWYgbm90IHF1YW50aXppbmcuCi0JQ0FVVElPTjogaWYgdGhlIEpQRUcgbGlicmFyeSBjcmVhdGVzIGl0cyBvd24gY29sb3JtYXAsIHRoZSBzdG9yYWdlCi0JcG9pbnRlZCB0byBieSB0aGlzIGZpZWxkIGlzIHJlbGVhc2VkIGJ5IGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKS4KLQlDb3B5IHRoZSBjb2xvcm1hcCBzb21ld2hlcmUgZWxzZSBmaXJzdCwgaWYgeW91IHdhbnQgdG8gc2F2ZSBpdC4KLQotaW50IGFjdHVhbF9udW1iZXJfb2ZfY29sb3JzCi0JVGhlIG51bWJlciBvZiBjb2xvcnMgaW4gdGhlIGNvbG9yIG1hcC4KLQotQWRkaXRpb25hbCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgdGhhdCB0aGUgYXBwbGljYXRpb24gbWF5IHNldCBpbmNsdWRlOgotCi1KX0RDVF9NRVRIT0QgZGN0X21ldGhvZAotCVNlbGVjdHMgdGhlIGFsZ29yaXRobSB1c2VkIGZvciB0aGUgRENUIHN0ZXAuICBDaG9pY2VzIGFyZSB0aGUgc2FtZQotCWFzIGRlc2NyaWJlZCBhYm92ZSBmb3IgY29tcHJlc3Npb24uCi0KLWJvb2xlYW4gZG9fZmFuY3lfdXBzYW1wbGluZwotCUlmIFRSVUUsIGRvIGNhcmVmdWwgdXBzYW1wbGluZyBvZiBjaHJvbWEgY29tcG9uZW50cy4gIElmIEZBTFNFLAotCWEgZmFzdGVyIGJ1dCBzbG9wcGllciBtZXRob2QgaXMgdXNlZC4gIERlZmF1bHQgaXMgVFJVRS4gIFRoZSB2aXN1YWwKLQlpbXBhY3Qgb2YgdGhlIHNsb3BwaWVyIG1ldGhvZCBpcyBvZnRlbiB2ZXJ5IHNtYWxsLgotCi1ib29sZWFuIGRvX2Jsb2NrX3Ntb290aGluZwotCUlmIFRSVUUsIGludGVyYmxvY2sgc21vb3RoaW5nIGlzIGFwcGxpZWQgaW4gZWFybHkgc3RhZ2VzIG9mIGRlY29kaW5nCi0JcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlczsgaWYgRkFMU0UsIG5vdC4gIERlZmF1bHQgaXMgVFJVRS4gIEVhcmx5Ci0JcHJvZ3Jlc3Npb24gc3RhZ2VzIGxvb2sgImZ1enp5IiB3aXRoIHNtb290aGluZywgImJsb2NreSIgd2l0aG91dC4KLQlJbiBhbnkgY2FzZSwgYmxvY2sgc21vb3RoaW5nIGNlYXNlcyB0byBiZSBhcHBsaWVkIGFmdGVyIHRoZSBmaXJzdCBmZXcKLQlBQyBjb2VmZmljaWVudHMgYXJlIGtub3duIHRvIGZ1bGwgYWNjdXJhY3ksIHNvIGl0IGlzIHJlbGV2YW50IG9ubHkKLQl3aGVuIHVzaW5nIGJ1ZmZlcmVkLWltYWdlIG1vZGUgZm9yIHByb2dyZXNzaXZlIGltYWdlcy4KLQotYm9vbGVhbiBlbmFibGVfMXBhc3NfcXVhbnQKLWJvb2xlYW4gZW5hYmxlX2V4dGVybmFsX3F1YW50Ci1ib29sZWFuIGVuYWJsZV8ycGFzc19xdWFudAotCVRoZXNlIGFyZSBzaWduaWZpY2FudCBvbmx5IGluIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHdoaWNoIGlzCi0JZGVzY3JpYmVkIGluIGl0cyBvd24gc2VjdGlvbiBiZWxvdy4KLQotCi1UaGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgYXJlIGdpdmVuIGJ5IHRoZSBmb2xsb3dpbmcgZmllbGRzLiAgVGhlc2UgYXJlCi1jb21wdXRlZCBmcm9tIHRoZSBzb3VyY2UgaW1hZ2UgZGltZW5zaW9ucyBhbmQgdGhlIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycwotYnkganBlZ19zdGFydF9kZWNvbXByZXNzKCkuICBZb3UgY2FuIGFsc28gY2FsbCBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoKQotdG8gb2J0YWluIHRoZSB2YWx1ZXMgdGhhdCB3aWxsIHJlc3VsdCBmcm9tIHRoZSBjdXJyZW50IHBhcmFtZXRlciBzZXR0aW5ncy4KLVRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgYXJlIHRyeWluZyB0byBwaWNrIGEgc2NhbGluZyByYXRpbyB0aGF0IHdpbGwgZ2V0Ci1jbG9zZSB0byBhIGRlc2lyZWQgdGFyZ2V0IHNpemUuICBJdCdzIGFsc28gaW1wb3J0YW50IGlmIHlvdSBhcmUgdXNpbmcgdGhlCi1KUEVHIGxpYnJhcnkncyBtZW1vcnkgbWFuYWdlciB0byBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIHNwYWNlLCBiZWNhdXNlIHlvdQotYXJlIHN1cHBvc2VkIHRvIHJlcXVlc3Qgc3VjaCBidWZmZXJzICpiZWZvcmUqIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLgotCi1KRElNRU5TSU9OIG91dHB1dF93aWR0aAkJQWN0dWFsIGRpbWVuc2lvbnMgb2Ygb3V0cHV0IGltYWdlLgotSkRJTUVOU0lPTiBvdXRwdXRfaGVpZ2h0Ci1pbnQgb3V0X2NvbG9yX2NvbXBvbmVudHMJTnVtYmVyIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gb3V0X2NvbG9yX3NwYWNlLgotaW50IG91dHB1dF9jb21wb25lbnRzCQlOdW1iZXIgb2YgY29sb3IgY29tcG9uZW50cyByZXR1cm5lZC4KLWludCByZWNfb3V0YnVmX2hlaWdodAkJUmVjb21tZW5kZWQgaGVpZ2h0IG9mIHNjYW5saW5lIGJ1ZmZlci4KLQotV2hlbiBxdWFudGl6aW5nIGNvbG9ycywgb3V0cHV0X2NvbXBvbmVudHMgaXMgMSwgaW5kaWNhdGluZyBhIHNpbmdsZSBjb2xvciBtYXAKLWluZGV4IHBlciBwaXhlbC4gIE90aGVyd2lzZSBpdCBlcXVhbHMgb3V0X2NvbG9yX2NvbXBvbmVudHMuICBUaGUgb3V0cHV0IGFycmF5cwotYXJlIHJlcXVpcmVkIHRvIGJlIG91dHB1dF93aWR0aCAqIG91dHB1dF9jb21wb25lbnRzIEpTQU1QTEVzIHdpZGUuCi0KLXJlY19vdXRidWZfaGVpZ2h0IGlzIHRoZSByZWNvbW1lbmRlZCBtaW5pbXVtIGhlaWdodCAoaW4gc2NhbmxpbmVzKSBvZiB0aGUKLWJ1ZmZlciBwYXNzZWQgdG8ganBlZ19yZWFkX3NjYW5saW5lcygpLiAgSWYgdGhlIGJ1ZmZlciBpcyBzbWFsbGVyLCB0aGUKLWxpYnJhcnkgd2lsbCBzdGlsbCB3b3JrLCBidXQgdGltZSB3aWxsIGJlIHdhc3RlZCBkdWUgdG8gdW5uZWNlc3NhcnkgZGF0YQotY29weWluZy4gIEluIGhpZ2gtcXVhbGl0eSBtb2RlcywgcmVjX291dGJ1Zl9oZWlnaHQgaXMgYWx3YXlzIDEsIGJ1dCBzb21lCi1mYXN0ZXIsIGxvd2VyLXF1YWxpdHkgbW9kZXMgc2V0IGl0IHRvIGxhcmdlciB2YWx1ZXMgKHR5cGljYWxseSAyIHRvIDQpLgotSWYgeW91IGFyZSBnb2luZyB0byBhc2sgZm9yIGEgaGlnaC1zcGVlZCBwcm9jZXNzaW5nIG1vZGUsIHlvdSBtYXkgYXMgd2VsbAotZ28gdG8gdGhlIHRyb3VibGUgb2YgaG9ub3JpbmcgcmVjX291dGJ1Zl9oZWlnaHQgc28gYXMgdG8gYXZvaWQgZGF0YSBjb3B5aW5nLgotKEFuIG91dHB1dCBidWZmZXIgbGFyZ2VyIHRoYW4gcmVjX291dGJ1Zl9oZWlnaHQgbGluZXMgaXMgT0ssIGJ1dCB3b24ndAotcHJvdmlkZSBhbnkgbWF0ZXJpYWwgc3BlZWQgaW1wcm92ZW1lbnQgb3ZlciB0aGF0IGhlaWdodC4pCi0KLQotU3BlY2lhbCBjb2xvciBzcGFjZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBKUEVHIHN0YW5kYXJkIGl0c2VsZiBpcyAiY29sb3IgYmxpbmQiIGFuZCBkb2Vzbid0IHNwZWNpZnkgYW55IHBhcnRpY3VsYXIKLWNvbG9yIHNwYWNlLiAgSXQgaXMgY3VzdG9tYXJ5IHRvIGNvbnZlcnQgY29sb3IgZGF0YSB0byBhIGx1bWluYW5jZS9jaHJvbWluYW5jZQotY29sb3Igc3BhY2UgYmVmb3JlIGNvbXByZXNzaW5nLCBzaW5jZSB0aGlzIHBlcm1pdHMgZ3JlYXRlciBjb21wcmVzc2lvbi4gIFRoZQotZXhpc3RpbmcgZGUtZmFjdG8gSlBFRyBmaWxlIGZvcm1hdCBzdGFuZGFyZHMgc3BlY2lmeSBZQ2JDciBvciBncmF5c2NhbGUgZGF0YQotKEpGSUYpLCBvciBncmF5c2NhbGUsIFJHQiwgWUNiQ3IsIENNWUssIG9yIFlDQ0sgKEFkb2JlKS4gIEZvciBzcGVjaWFsCi1hcHBsaWNhdGlvbnMgc3VjaCBhcyBtdWx0aXNwZWN0cmFsIGltYWdlcywgb3RoZXIgY29sb3Igc3BhY2VzIGNhbiBiZSB1c2VkLAotYnV0IGl0IG11c3QgYmUgdW5kZXJzdG9vZCB0aGF0IHN1Y2ggZmlsZXMgd2lsbCBiZSB1bnBvcnRhYmxlLgotCi1UaGUgSlBFRyBsaWJyYXJ5IGNhbiBoYW5kbGUgdGhlIG1vc3QgY29tbW9uIGNvbG9yc3BhY2UgY29udmVyc2lvbnMgKG5hbWVseQotUkdCIDw9PiBZQ2JDciBhbmQgQ01ZSyA8PT4gWUNDSykuICBJdCBjYW4gYWxzbyBkZWFsIHdpdGggZGF0YSBvZiBhbiB1bmtub3duCi1jb2xvciBzcGFjZSwgcGFzc2luZyBpdCB0aHJvdWdoIHdpdGhvdXQgY29udmVyc2lvbi4gIElmIHlvdSBkZWFsIGV4dGVuc2l2ZWx5Ci13aXRoIGFuIHVudXN1YWwgY29sb3Igc3BhY2UsIHlvdSBjYW4gZWFzaWx5IGV4dGVuZCB0aGUgbGlicmFyeSB0byB1bmRlcnN0YW5kCi1hZGRpdGlvbmFsIGNvbG9yIHNwYWNlcyBhbmQgcGVyZm9ybSBhcHByb3ByaWF0ZSBjb252ZXJzaW9ucy4KLQotRm9yIGNvbXByZXNzaW9uLCB0aGUgc291cmNlIGRhdGEncyBjb2xvciBzcGFjZSBpcyBzcGVjaWZpZWQgYnkgZmllbGQKLWluX2NvbG9yX3NwYWNlLiAgVGhpcyBpcyB0cmFuc2Zvcm1lZCB0byB0aGUgSlBFRyBmaWxlJ3MgY29sb3Igc3BhY2UgZ2l2ZW4KLWJ5IGpwZWdfY29sb3Jfc3BhY2UuICBqcGVnX3NldF9kZWZhdWx0cygpIGNob29zZXMgYSByZWFzb25hYmxlIEpQRUcgY29sb3IKLXNwYWNlIGRlcGVuZGluZyBvbiBpbl9jb2xvcl9zcGFjZSwgYnV0IHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBieSBjYWxsaW5nCi1qcGVnX3NldF9jb2xvcnNwYWNlKCkuICBPZiBjb3Vyc2UgeW91IG11c3Qgc2VsZWN0IGEgc3VwcG9ydGVkIHRyYW5zZm9ybWF0aW9uLgotamNjb2xvci5jIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHRyYW5zZm9ybWF0aW9uczoKLQlSR0IgPT4gWUNiQ3IKLQlSR0IgPT4gR1JBWVNDQUxFCi0JWUNiQ3IgPT4gR1JBWVNDQUxFCi0JQ01ZSyA9PiBZQ0NLCi1wbHVzIHRoZSBudWxsIHRyYW5zZm9ybXM6IEdSQVlTQ0FMRSA9PiBHUkFZU0NBTEUsIFJHQiA9PiBSR0IsCi1ZQ2JDciA9PiBZQ2JDciwgQ01ZSyA9PiBDTVlLLCBZQ0NLID0+IFlDQ0ssIGFuZCBVTktOT1dOID0+IFVOS05PV04uCi0KLVRoZSBkZS1mYWN0byBmaWxlIGZvcm1hdCBzdGFuZGFyZHMgKEpGSUYgYW5kIEFkb2JlKSBzcGVjaWZ5IEFQUG4gbWFya2VycyB0aGF0Ci1pbmRpY2F0ZSB0aGUgY29sb3Igc3BhY2Ugb2YgdGhlIEpQRUcgZmlsZS4gIEl0IGlzIGltcG9ydGFudCB0byBlbnN1cmUgdGhhdAotdGhlc2UgYXJlIHdyaXR0ZW4gY29ycmVjdGx5LCBvciBvbWl0dGVkIGlmIHRoZSBKUEVHIGZpbGUncyBjb2xvciBzcGFjZSBpcyBub3QKLW9uZSBvZiB0aGUgb25lcyBzdXBwb3J0ZWQgYnkgdGhlIGRlLWZhY3RvIHN0YW5kYXJkcy4gIGpwZWdfc2V0X2NvbG9yc3BhY2UoKQotd2lsbCBzZXQgdGhlIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgdG8gaW5jbHVkZSBvciBvbWl0IHRoZSBBUFBuIG1hcmtlcnMKLXByb3Blcmx5LCBzbyBsb25nIGFzIGl0IGlzIHRvbGQgdGhlIHRydXRoIGFib3V0IHRoZSBKUEVHIGNvbG9yIHNwYWNlLgotRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgd3JpdGluZyBzb21lIHJhbmRvbSAzLWNvbXBvbmVudCBjb2xvciBzcGFjZSB3aXRob3V0Ci1jb252ZXJzaW9uLCBkb24ndCB0cnkgdG8gZmFrZSBvdXQgdGhlIGxpYnJhcnkgYnkgc2V0dGluZyBpbl9jb2xvcl9zcGFjZSBhbmQKLWpwZWdfY29sb3Jfc3BhY2UgdG8gSkNTX1lDYkNyOyB1c2UgSkNTX1VOS05PV04uICBZb3UgbWF5IHdhbnQgdG8gd3JpdGUgYW4KLUFQUG4gbWFya2VyIG9mIHlvdXIgb3duIGRldmlzaW5nIHRvIGlkZW50aWZ5IHRoZSBjb2xvcnNwYWNlIC0tLSBzZWUgIlNwZWNpYWwKLW1hcmtlcnMiLCBiZWxvdy4KLQotV2hlbiB0b2xkIHRoYXQgdGhlIGNvbG9yIHNwYWNlIGlzIFVOS05PV04sIHRoZSBsaWJyYXJ5IHdpbGwgZGVmYXVsdCB0byB1c2luZwotbHVtaW5hbmNlLXF1YWxpdHkgY29tcHJlc3Npb24gcGFyYW1ldGVycyBmb3IgYWxsIGNvbG9yIGNvbXBvbmVudHMuICBZb3UgbWF5Ci13ZWxsIHdhbnQgdG8gY2hhbmdlIHRoZXNlIHBhcmFtZXRlcnMuICBTZWUgdGhlIHNvdXJjZSBjb2RlIGZvcgotanBlZ19zZXRfY29sb3JzcGFjZSgpLCBpbiBqY3BhcmFtLmMsIGZvciBkZXRhaWxzLgotCi1Gb3IgZGVjb21wcmVzc2lvbiwgdGhlIEpQRUcgZmlsZSdzIGNvbG9yIHNwYWNlIGlzIGdpdmVuIGluIGpwZWdfY29sb3Jfc3BhY2UsCi1hbmQgdGhpcyBpcyB0cmFuc2Zvcm1lZCB0byB0aGUgb3V0cHV0IGNvbG9yIHNwYWNlIG91dF9jb2xvcl9zcGFjZS4KLWpwZWdfcmVhZF9oZWFkZXIncyBzZXR0aW5nIG9mIGpwZWdfY29sb3Jfc3BhY2UgY2FuIGJlIHJlbGllZCBvbiBpZiB0aGUgZmlsZQotY29uZm9ybXMgdG8gSkZJRiBvciBBZG9iZSBjb252ZW50aW9ucywgYnV0IG90aGVyd2lzZSBpdCBpcyBubyBiZXR0ZXIgdGhhbiBhCi1ndWVzcy4gIElmIHlvdSBrbm93IHRoZSBKUEVHIGZpbGUncyBjb2xvciBzcGFjZSBmb3IgY2VydGFpbiwgeW91IGNhbiBvdmVycmlkZQotanBlZ19yZWFkX2hlYWRlcidzIGd1ZXNzIGJ5IHNldHRpbmcganBlZ19jb2xvcl9zcGFjZS4gIGpwZWdfcmVhZF9oZWFkZXIgYWxzbwotc2VsZWN0cyBhIGRlZmF1bHQgb3V0cHV0IGNvbG9yIHNwYWNlIGJhc2VkIG9uIChpdHMgZ3Vlc3Mgb2YpIGpwZWdfY29sb3Jfc3BhY2U7Ci1zZXQgb3V0X2NvbG9yX3NwYWNlIHRvIG92ZXJyaWRlIHRoaXMuICBBZ2FpbiwgeW91IG11c3Qgc2VsZWN0IGEgc3VwcG9ydGVkCi10cmFuc2Zvcm1hdGlvbi4gIGpkY29sb3IuYyBjdXJyZW50bHkgc3VwcG9ydHMKLQlZQ2JDciA9PiBHUkFZU0NBTEUKLQlZQ2JDciA9PiBSR0IKLQlHUkFZU0NBTEUgPT4gUkdCCi0JWUNDSyA9PiBDTVlLCi1hcyB3ZWxsIGFzIHRoZSBudWxsIHRyYW5zZm9ybXMuICAoU2luY2UgR1JBWVNDQUxFPT5SR0IgaXMgcHJvdmlkZWQsIGFuCi1hcHBsaWNhdGlvbiBjYW4gZm9yY2UgZ3JheXNjYWxlIEpQRUdzIHRvIGxvb2sgbGlrZSBjb2xvciBKUEVHcyBpZiBpdCBvbmx5Ci13YW50cyB0byBoYW5kbGUgb25lIGNhc2UuKQotCi1UaGUgdHdvLXBhc3MgY29sb3IgcXVhbnRpemVyLCBqcXVhbnQyLmMsIGlzIHNwZWNpYWxpemVkIHRvIGhhbmRsZSBSR0IgZGF0YQotKGl0IHdlaWdodHMgZGlzdGFuY2VzIGFwcHJvcHJpYXRlbHkgZm9yIFJHQiBjb2xvcnMpLiAgWW91J2xsIG5lZWQgdG8gbW9kaWZ5Ci10aGUgY29kZSBpZiB5b3Ugd2FudCB0byB1c2UgaXQgZm9yIG5vbi1SR0Igb3V0cHV0IGNvbG9yIHNwYWNlcy4gIE5vdGUgdGhhdAotanF1YW50Mi5jIGlzIHVzZWQgdG8gbWFwIHRvIGFuIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGNvbG9ybWFwIGFzIHdlbGwgYXMgZm9yCi10aGUgbm9ybWFsIHR3by1wYXNzIGNvbG9ybWFwIHNlbGVjdGlvbiBwcm9jZXNzLgotCi1DQVVUSU9OOiBpdCBhcHBlYXJzIHRoYXQgQWRvYmUgUGhvdG9zaG9wIHdyaXRlcyBpbnZlcnRlZCBkYXRhIGluIENNWUsgSlBFRwotZmlsZXM6IDAgcmVwcmVzZW50cyAxMDAlIGluayBjb3ZlcmFnZSwgcmF0aGVyIHRoYW4gMCUgaW5rIGFzIHlvdSdkIGV4cGVjdC4KLVRoaXMgaXMgYXJndWFibHkgYSBidWcgaW4gUGhvdG9zaG9wLCBidXQgaWYgeW91IG5lZWQgdG8gd29yayB3aXRoIFBob3Rvc2hvcAotQ01ZSyBmaWxlcywgeW91IHdpbGwgaGF2ZSB0byBkZWFsIHdpdGggaXQgaW4geW91ciBhcHBsaWNhdGlvbi4gIFdlIGNhbm5vdAotImZpeCIgdGhpcyBpbiB0aGUgbGlicmFyeSBieSBpbnZlcnRpbmcgdGhlIGRhdGEgZHVyaW5nIHRoZSBDTVlLPD0+WUNDSwotdHJhbnNmb3JtLCBiZWNhdXNlIHRoYXQgd291bGQgYnJlYWsgb3RoZXIgYXBwbGljYXRpb25zLCBub3RhYmx5IEdob3N0c2NyaXB0LgotUGhvdG9zaG9wIHZlcnNpb25zIHByaW9yIHRvIDMuMCB3cml0ZSBFUFMgZmlsZXMgY29udGFpbmluZyBKUEVHLWVuY29kZWQgQ01ZSwotZGF0YSBpbiB0aGUgc2FtZSBpbnZlcnRlZC1ZQ0NLIHJlcHJlc2VudGF0aW9uIHVzZWQgaW4gYmFyZSBKUEVHIGZpbGVzLCBidXQKLXRoZSBzdXJyb3VuZGluZyBQb3N0U2NyaXB0IGNvZGUgcGVyZm9ybXMgYW4gaW52ZXJzaW9uIHVzaW5nIHRoZSBQUyBpbWFnZQotb3BlcmF0b3IuICBJIGFtIHRvbGQgdGhhdCBQaG90b3Nob3AgMy4wIHdpbGwgd3JpdGUgdW5pbnZlcnRlZCBZQ0NLIGluCi1FUFMvSlBFRyBmaWxlcywgYW5kIHdpbGwgb21pdCB0aGUgUFMtbGV2ZWwgaW52ZXJzaW9uLiAgKEJ1dCB0aGUgZGF0YQotcG9sYXJpdHkgdXNlZCBpbiBiYXJlIEpQRUcgZmlsZXMgd2lsbCBub3QgY2hhbmdlIGluIDMuMC4pICBJbiBlaXRoZXIgY2FzZSwKLXRoZSBKUEVHIGxpYnJhcnkgbXVzdCBub3QgaW52ZXJ0IHRoZSBkYXRhIGl0c2VsZiwgb3IgZWxzZSBHaG9zdHNjcmlwdCB3b3VsZAotcmVhZCB0aGVzZSBFUFMgZmlsZXMgaW5jb3JyZWN0bHkuCi0KLQotRXJyb3IgaGFuZGxpbmcKLS0tLS0tLS0tLS0tLS0tCi0KLVdoZW4gdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlciBpcyB1c2VkLCBhbnkgZXJyb3IgZGV0ZWN0ZWQgaW5zaWRlIHRoZSBKUEVHCi1yb3V0aW5lcyB3aWxsIGNhdXNlIGEgbWVzc2FnZSB0byBiZSBwcmludGVkIG9uIHN0ZGVyciwgZm9sbG93ZWQgYnkgZXhpdCgpLgotWW91IGNhbiBzdXBwbHkgeW91ciBvd24gZXJyb3IgaGFuZGxpbmcgcm91dGluZXMgdG8gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvcgotYW5kIHRvIGNvbnRyb2wgdGhlIHRyZWF0bWVudCBvZiBub25mYXRhbCB3YXJuaW5ncyBhbmQgdHJhY2UvZGVidWcgbWVzc2FnZXMuCi1UaGUgZmlsZSBleGFtcGxlLmMgaWxsdXN0cmF0ZXMgdGhlIG1vc3QgY29tbW9uIGNhc2UsIHdoaWNoIGlzIHRvIGhhdmUgdGhlCi1hcHBsaWNhdGlvbiByZWdhaW4gY29udHJvbCBhZnRlciBhbiBlcnJvciByYXRoZXIgdGhhbiBleGl0aW5nLgotCi1UaGUgSlBFRyBsaWJyYXJ5IG5ldmVyIHdyaXRlcyBhbnkgbWVzc2FnZSBkaXJlY3RseTsgaXQgYWx3YXlzIGdvZXMgdGhyb3VnaAotdGhlIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzLiAgVGhyZWUgY2xhc3NlcyBvZiBtZXNzYWdlcyBhcmUgcmVjb2duaXplZDoKLSAgKiBGYXRhbCBlcnJvcnM6IHRoZSBsaWJyYXJ5IGNhbm5vdCBjb250aW51ZS4KLSAgKiBXYXJuaW5nczogdGhlIGxpYnJhcnkgY2FuIGNvbnRpbnVlLCBidXQgdGhlIGRhdGEgaXMgY29ycnVwdCwgYW5kIGEKLSAgICBkYW1hZ2VkIG91dHB1dCBpbWFnZSBpcyBsaWtlbHkgdG8gcmVzdWx0LgotICAqIFRyYWNlL2luZm9ybWF0aW9uYWwgbWVzc2FnZXMuICBUaGVzZSBjb21lIHdpdGggYSB0cmFjZSBsZXZlbCBpbmRpY2F0aW5nCi0gICAgdGhlIGltcG9ydGFuY2Ugb2YgdGhlIG1lc3NhZ2U7IHlvdSBjYW4gY29udHJvbCB0aGUgdmVyYm9zaXR5IG9mIHRoZQotICAgIHByb2dyYW0gYnkgYWRqdXN0aW5nIHRoZSBtYXhpbXVtIHRyYWNlIGxldmVsIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQuCi0KLVlvdSBtYXksIGlmIHlvdSB3aXNoLCBzaW1wbHkgcmVwbGFjZSB0aGUgZW50aXJlIEpQRUcgZXJyb3IgaGFuZGxpbmcgbW9kdWxlCi0oamVycm9yLmMpIHdpdGggeW91ciBvd24gY29kZS4gIEhvd2V2ZXIsIHlvdSBjYW4gYXZvaWQgY29kZSBkdXBsaWNhdGlvbiBieQotb25seSByZXBsYWNpbmcgc29tZSBvZiB0aGUgcm91dGluZXMgZGVwZW5kaW5nIG9uIHRoZSBiZWhhdmlvciB5b3UgbmVlZC4KLVRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IGNhbGxpbmcganBlZ19zdGRfZXJyb3IoKSBhcyB1c3VhbCwgYnV0IHRoZW4gb3ZlcnJpZGluZwotc29tZSBvZiB0aGUgbWV0aG9kIHBvaW50ZXJzIGluIHRoZSBqcGVnX2Vycm9yX21nciBzdHJ1Y3QsIGFzIGlsbHVzdHJhdGVkIGJ5Ci1leGFtcGxlLmMuCi0KLUFsbCBvZiB0aGUgZXJyb3IgaGFuZGxpbmcgcm91dGluZXMgd2lsbCByZWNlaXZlIGEgcG9pbnRlciB0byB0aGUgSlBFRyBvYmplY3QKLShhIGpfY29tbW9uX3B0ciB3aGljaCBwb2ludHMgdG8gZWl0aGVyIGEganBlZ19jb21wcmVzc19zdHJ1Y3Qgb3IgYQotanBlZ19kZWNvbXByZXNzX3N0cnVjdDsgaWYgeW91IG5lZWQgdG8gdGVsbCB3aGljaCwgdGVzdCB0aGUgaXNfZGVjb21wcmVzc29yCi1maWVsZCkuICBUaGlzIHN0cnVjdCBpbmNsdWRlcyBhIHBvaW50ZXIgdG8gdGhlIGVycm9yIG1hbmFnZXIgc3RydWN0IGluIGl0cwotImVyciIgZmllbGQuICBGcmVxdWVudGx5LCBjdXN0b20gZXJyb3IgaGFuZGxlciByb3V0aW5lcyB3aWxsIG5lZWQgdG8gYWNjZXNzCi1hZGRpdGlvbmFsIGRhdGEgd2hpY2ggaXMgbm90IGtub3duIHRvIHRoZSBKUEVHIGxpYnJhcnkgb3IgdGhlIHN0YW5kYXJkIGVycm9yCi1oYW5kbGVyLiAgVGhlIG1vc3QgY29udmVuaWVudCB3YXkgdG8gZG8gdGhpcyBpcyB0byBlbWJlZCBlaXRoZXIgdGhlIEpQRUcKLW9iamVjdCBvciB0aGUganBlZ19lcnJvcl9tZ3Igc3RydWN0IGluIGEgbGFyZ2VyIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCi1hZGRpdGlvbmFsIGZpZWxkczsgdGhlbiBjYXN0aW5nIHRoZSBwYXNzZWQgcG9pbnRlciBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlCi1hZGRpdGlvbmFsIGZpZWxkcy4gIEFnYWluLCBzZWUgZXhhbXBsZS5jIGZvciBvbmUgd2F5IHRvIGRvIGl0LiAgKEJlZ2lubmluZwotd2l0aCBJSkcgdmVyc2lvbiA2YiwgdGhlcmUgaXMgYWxzbyBhIHZvaWQgcG9pbnRlciAiY2xpZW50X2RhdGEiIGluIGVhY2gKLUpQRUcgb2JqZWN0LCB3aGljaCB0aGUgYXBwbGljYXRpb24gY2FuIGFsc28gdXNlIHRvIGZpbmQgcmVsYXRlZCBkYXRhLgotVGhlIGxpYnJhcnkgZG9lcyBub3QgdG91Y2ggY2xpZW50X2RhdGEgYXQgYWxsLikKLQotVGhlIGluZGl2aWR1YWwgbWV0aG9kcyB0aGF0IHlvdSBtaWdodCB3aXNoIHRvIG92ZXJyaWRlIGFyZToKLQotZXJyb3JfZXhpdCAoal9jb21tb25fcHRyIGNpbmZvKQotCVJlY2VpdmVzIGNvbnRyb2wgZm9yIGEgZmF0YWwgZXJyb3IuICBJbmZvcm1hdGlvbiBzdWZmaWNpZW50IHRvCi0JZ2VuZXJhdGUgdGhlIGVycm9yIG1lc3NhZ2UgaGFzIGJlZW4gc3RvcmVkIGluIGNpbmZvLT5lcnI7IGNhbGwKLQlvdXRwdXRfbWVzc2FnZSB0byBkaXNwbGF5IGl0LiAgQ29udHJvbCBtdXN0IE5PVCByZXR1cm4gdG8gdGhlIGNhbGxlcjsKLQlnZW5lcmFsbHkgdGhpcyByb3V0aW5lIHdpbGwgZXhpdCgpIG9yIGxvbmdqbXAoKSBzb21ld2hlcmUuCi0JVHlwaWNhbGx5IHlvdSB3b3VsZCBvdmVycmlkZSB0aGlzIHJvdXRpbmUgdG8gZ2V0IHJpZCBvZiB0aGUgZXhpdCgpCi0JZGVmYXVsdCBiZWhhdmlvci4gIE5vdGUgdGhhdCBpZiB5b3UgY29udGludWUgcHJvY2Vzc2luZywgeW91IHNob3VsZAotCWNsZWFuIHVwIHRoZSBKUEVHIG9iamVjdCB3aXRoIGpwZWdfYWJvcnQoKSBvciBqcGVnX2Rlc3Ryb3koKS4KLQotb3V0cHV0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbykKLQlBY3R1YWwgb3V0cHV0IG9mIGFueSBKUEVHIG1lc3NhZ2UuICBPdmVycmlkZSB0aGlzIHRvIHNlbmQgbWVzc2FnZXMKLQlzb21ld2hlcmUgb3RoZXIgdGhhbiBzdGRlcnIuICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3Qga25vdwotCWhvdyB0byBnZW5lcmF0ZSBhIG1lc3NhZ2UsIG9ubHkgd2hlcmUgdG8gc2VuZCBpdC4KLQotZm9ybWF0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgY2hhciAqIGJ1ZmZlcikKLQlDb25zdHJ1Y3RzIGEgcmVhZGFibGUgZXJyb3IgbWVzc2FnZSBzdHJpbmcgYmFzZWQgb24gdGhlIGVycm9yIGluZm8KLQlzdG9yZWQgaW4gY2luZm8tPmVyci4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBvdXRwdXRfbWVzc2FnZS4gIEZldwotCWFwcGxpY2F0aW9ucyBzaG91bGQgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4gIE9uZSBwb3NzaWJsZQotCXJlYXNvbiBmb3IgZG9pbmcgc28gaXMgdG8gaW1wbGVtZW50IGR5bmFtaWMgc3dpdGNoaW5nIG9mIGVycm9yIG1lc3NhZ2UKLQlsYW5ndWFnZS4KLQotZW1pdF9tZXNzYWdlIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBtc2dfbGV2ZWwpCi0JRGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIGVtaXQgYSB3YXJuaW5nIG9yIHRyYWNlIG1lc3NhZ2U7IGlmIHNvLAotCWNhbGxzIG91dHB1dF9tZXNzYWdlLiAgVGhlIG1haW4gcmVhc29uIGZvciBvdmVycmlkaW5nIHRoaXMgbWV0aG9kCi0Jd291bGQgYmUgdG8gYWJvcnQgb24gd2FybmluZ3MuICBtc2dfbGV2ZWwgaXMgLTEgZm9yIHdhcm5pbmdzLAotCTAgYW5kIHVwIGZvciB0cmFjZSBtZXNzYWdlcy4KLQotT25seSBlcnJvcl9leGl0KCkgYW5kIGVtaXRfbWVzc2FnZSgpIGFyZSBjYWxsZWQgZnJvbSB0aGUgcmVzdCBvZiB0aGUgSlBFRwotbGlicmFyeTsgdGhlIG90aGVyIHR3byBhcmUgaW50ZXJuYWwgdG8gdGhlIGVycm9yIGhhbmRsZXIuCi0KLVRoZSBhY3R1YWwgbWVzc2FnZSB0ZXh0cyBhcmUgc3RvcmVkIGluIGFuIGFycmF5IG9mIHN0cmluZ3Mgd2hpY2ggaXMgcG9pbnRlZCB0bwotYnkgdGhlIGZpZWxkIGVyci0+anBlZ19tZXNzYWdlX3RhYmxlLiAgVGhlIG1lc3NhZ2VzIGFyZSBudW1iZXJlZCBmcm9tIDAgdG8KLWVyci0+bGFzdF9qcGVnX21lc3NhZ2UsIGFuZCBpdCBpcyB0aGVzZSBjb2RlIG51bWJlcnMgdGhhdCBhcmUgdXNlZCBpbiB0aGUKLUpQRUcgbGlicmFyeSBjb2RlLiAgWW91IGNvdWxkIHJlcGxhY2UgdGhlIG1lc3NhZ2UgdGV4dHMgKGZvciBpbnN0YW5jZSwgd2l0aAotbWVzc2FnZXMgaW4gRnJlbmNoIG9yIEdlcm1hbikgYnkgY2hhbmdpbmcgdGhlIG1lc3NhZ2UgdGFibGUgcG9pbnRlci4gIFNlZQotamVycm9yLmggZm9yIHRoZSBkZWZhdWx0IHRleHRzLiAgQ0FVVElPTjogdGhpcyB0YWJsZSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkKLWNoYW5nZSBvciBncm93IGZyb20gb25lIGxpYnJhcnkgdmVyc2lvbiB0byB0aGUgbmV4dC4KLQotSXQgbWF5IGJlIHVzZWZ1bCBmb3IgYW4gYXBwbGljYXRpb24gdG8gYWRkIGl0cyBvd24gbWVzc2FnZSB0ZXh0cyB0aGF0IGFyZQotaGFuZGxlZCBieSB0aGUgc2FtZSBtZWNoYW5pc20uICBUaGUgZXJyb3IgaGFuZGxlciBzdXBwb3J0cyBhIHNlY29uZCAiYWRkLW9uIgotbWVzc2FnZSB0YWJsZSBmb3IgdGhpcyBwdXJwb3NlLiAgVG8gZGVmaW5lIGFuIGFkZG9uIHRhYmxlLCBzZXQgdGhlIHBvaW50ZXIKLWVyci0+YWRkb25fbWVzc2FnZV90YWJsZSBhbmQgdGhlIG1lc3NhZ2UgbnVtYmVycyBlcnItPmZpcnN0X2FkZG9uX21lc3NhZ2UgYW5kCi1lcnItPmxhc3RfYWRkb25fbWVzc2FnZS4gIElmIHlvdSBudW1iZXIgdGhlIGFkZG9uIG1lc3NhZ2VzIGJlZ2lubmluZyBhdCAxMDAwCi1vciBzbywgeW91IHdvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgY29uZmxpY3RzIHdpdGggdGhlIGxpYnJhcnkncyBidWlsdC1pbgotbWVzc2FnZXMuICBTZWUgdGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMgY2pwZWcvZGpwZWcgZm9yIGFuIGV4YW1wbGUgb2YgdXNpbmcKLWFkZG9uIG1lc3NhZ2VzICh0aGUgYWRkb24gbWVzc2FnZXMgYXJlIGRlZmluZWQgaW4gY2RlcnJvci5oKS4KLQotQWN0dWFsIGludm9jYXRpb24gb2YgdGhlIGVycm9yIGhhbmRsZXIgaXMgZG9uZSB2aWEgbWFjcm9zIGRlZmluZWQgaW4gamVycm9yLmg6Ci0JRVJSRVhJVG4oLi4uKQlmb3IgZmF0YWwgZXJyb3JzCi0JV0FSTk1TbiguLi4pCWZvciBjb3JydXB0LWRhdGEgd2FybmluZ3MKLQlUUkFDRU1TbiguLi4pCWZvciB0cmFjZSBhbmQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KLVRoZXNlIG1hY3JvcyBzdG9yZSB0aGUgbWVzc2FnZSBjb2RlIGFuZCBhbnkgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGludG8gdGhlCi1lcnJvciBoYW5kbGVyIHN0cnVjdCwgdGhlbiBpbnZva2UgdGhlIGVycm9yX2V4aXQoKSBvciBlbWl0X21lc3NhZ2UoKSBtZXRob2QuCi1UaGUgdmFyaWFudHMgb2YgZWFjaCBtYWNybyBhcmUgZm9yIHZhcnlpbmcgbnVtYmVycyBvZiBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuCi1UaGUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBnZW5lcmF0ZWQgbWVzc2FnZSB1c2luZwotc3RhbmRhcmQgcHJpbnRmKCkgZm9ybWF0IGNvZGVzLgotCi1TZWUgamVycm9yLmggYW5kIGplcnJvci5jIGZvciBmdXJ0aGVyIGRldGFpbHMuCi0KLQotQ29tcHJlc3NlZCBkYXRhIGhhbmRsaW5nIChzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1hbmFnZXJzKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgSlBFRyBjb21wcmVzc2lvbiBsaWJyYXJ5IHNlbmRzIGl0cyBjb21wcmVzc2VkIGRhdGEgdG8gYSAiZGVzdGluYXRpb24KLW1hbmFnZXIiIG1vZHVsZS4gIFRoZSBkZWZhdWx0IGRlc3RpbmF0aW9uIG1hbmFnZXIganVzdCB3cml0ZXMgdGhlIGRhdGEgdG8gYQotc3RkaW8gc3RyZWFtLCBidXQgeW91IGNhbiBwcm92aWRlIHlvdXIgb3duIG1hbmFnZXIgdG8gZG8gc29tZXRoaW5nIGVsc2UuCi1TaW1pbGFybHksIHRoZSBkZWNvbXByZXNzaW9uIGxpYnJhcnkgY2FsbHMgYSAic291cmNlIG1hbmFnZXIiIHRvIG9idGFpbiB0aGUKLWNvbXByZXNzZWQgZGF0YTsgeW91IGNhbiBwcm92aWRlIHlvdXIgb3duIHNvdXJjZSBtYW5hZ2VyIGlmIHlvdSB3YW50IHRoZSBkYXRhCi10byBjb21lIGZyb20gc29tZXdoZXJlIG90aGVyIHRoYW4gYSBzdGRpbyBzdHJlYW0uCi0KLUluIGJvdGggY2FzZXMsIGNvbXByZXNzZWQgZGF0YSBpcyBwcm9jZXNzZWQgYSBidWZmZXJsb2FkIGF0IGEgdGltZTogdGhlCi1kZXN0aW5hdGlvbiBvciBzb3VyY2UgbWFuYWdlciBwcm92aWRlcyBhIHdvcmsgYnVmZmVyLCBhbmQgdGhlIGxpYnJhcnkgaW52b2tlcwotdGhlIG1hbmFnZXIgb25seSB3aGVuIHRoZSBidWZmZXIgaXMgZmlsbGVkIG9yIGVtcHRpZWQuICAoWW91IGNvdWxkIGRlZmluZSBhCi1vbmUtY2hhcmFjdGVyIGJ1ZmZlciB0byBmb3JjZSB0aGUgbWFuYWdlciB0byBiZSBpbnZva2VkIGZvciBlYWNoIGJ5dGUsIGJ1dAotdGhhdCB3b3VsZCBiZSByYXRoZXIgaW5lZmZpY2llbnQuKSAgVGhlIGJ1ZmZlcidzIHNpemUgYW5kIGxvY2F0aW9uIGFyZQotY29udHJvbGxlZCBieSB0aGUgbWFuYWdlciwgbm90IGJ5IHRoZSBsaWJyYXJ5LiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkZXNpcmVkIHRvCi1kZWNvbXByZXNzIGEgSlBFRyBkYXRhc3RyZWFtIHRoYXQgd2FzIGFsbCBpbiBtZW1vcnksIHlvdSBjb3VsZCBqdXN0IG1ha2UgdGhlCi1idWZmZXIgcG9pbnRlciBhbmQgbGVuZ3RoIHBvaW50IHRvIHRoZSBvcmlnaW5hbCBkYXRhIGluIG1lbW9yeS4gIFRoZW4gdGhlCi1idWZmZXItcmVsb2FkIHByb2NlZHVyZSB3b3VsZCBiZSBpbnZva2VkIG9ubHkgaWYgdGhlIGRlY29tcHJlc3NvciByYW4gb2ZmIHRoZQotZW5kIG9mIHRoZSBkYXRhc3RyZWFtLCB3aGljaCB3b3VsZCBpbmRpY2F0ZSBhbiBlcnJvbmVvdXMgZGF0YXN0cmVhbS4KLQotVGhlIHdvcmsgYnVmZmVyIGlzIGRlZmluZWQgYXMgYW4gYXJyYXkgb2YgZGF0YXR5cGUgSk9DVEVULCB3aGljaCBpcyBnZW5lcmFsbHkKLSJjaGFyIiBvciAidW5zaWduZWQgY2hhciIuICBPbiBhIG1hY2hpbmUgd2hlcmUgY2hhciBpcyBub3QgZXhhY3RseSA4IGJpdHMKLXdpZGUsIHlvdSBtdXN0IGRlZmluZSBKT0NURVQgYXMgYSB3aWRlciBkYXRhIHR5cGUgYW5kIHRoZW4gbW9kaWZ5IHRoZSBkYXRhCi1zb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1vZHVsZXMgdG8gdHJhbnNjcmliZSB0aGUgd29yayBhcnJheXMgaW50byA4LWJpdCB1bml0cwotb24gZXh0ZXJuYWwgc3RvcmFnZS4KLQotQSBkYXRhIGRlc3RpbmF0aW9uIG1hbmFnZXIgc3RydWN0IGNvbnRhaW5zIGEgcG9pbnRlciBhbmQgY291bnQgZGVmaW5pbmcgdGhlCi1uZXh0IGJ5dGUgdG8gd3JpdGUgaW4gdGhlIHdvcmsgYnVmZmVyIGFuZCB0aGUgcmVtYWluaW5nIGZyZWUgc3BhY2U6Ci0KLQlKT0NURVQgKiBuZXh0X291dHB1dF9ieXRlOyAgLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLwotCXNpemVfdCBmcmVlX2luX2J1ZmZlcjsgICAgICAvKiAjIG9mIGJ5dGUgc3BhY2VzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KLQotVGhlIGxpYnJhcnkgaW5jcmVtZW50cyB0aGUgcG9pbnRlciBhbmQgZGVjcmVtZW50cyB0aGUgY291bnQgdW50aWwgdGhlIGJ1ZmZlcgotaXMgZmlsbGVkLiAgVGhlIG1hbmFnZXIncyBlbXB0eV9vdXRwdXRfYnVmZmVyIG1ldGhvZCBtdXN0IHJlc2V0IHRoZSBwb2ludGVyCi1hbmQgY291bnQuICBUaGUgbWFuYWdlciBpcyBleHBlY3RlZCB0byByZW1lbWJlciB0aGUgYnVmZmVyJ3Mgc3RhcnRpbmcgYWRkcmVzcwotYW5kIHRvdGFsIHNpemUgaW4gcHJpdmF0ZSBmaWVsZHMgbm90IHZpc2libGUgdG8gdGhlIGxpYnJhcnkuCi0KLUEgZGF0YSBkZXN0aW5hdGlvbiBtYW5hZ2VyIHByb3ZpZGVzIHRocmVlIG1ldGhvZHM6Ci0KLWluaXRfZGVzdGluYXRpb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotCUluaXRpYWxpemUgZGVzdGluYXRpb24uICBUaGlzIGlzIGNhbGxlZCBieSBqcGVnX3N0YXJ0X2NvbXByZXNzKCkKLQliZWZvcmUgYW55IGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbi4gIEl0IG11c3QgaW5pdGlhbGl6ZQotCW5leHRfb3V0cHV0X2J5dGUgYW5kIGZyZWVfaW5fYnVmZmVyLiAgZnJlZV9pbl9idWZmZXIgbXVzdCBiZQotCWluaXRpYWxpemVkIHRvIGEgcG9zaXRpdmUgdmFsdWUuCi0KLWVtcHR5X291dHB1dF9idWZmZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotCVRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBidWZmZXIgaGFzIGZpbGxlZCAoZnJlZV9pbl9idWZmZXIKLQlyZWFjaGVzIHplcm8pLiAgSW4gdHlwaWNhbCBhcHBsaWNhdGlvbnMsIGl0IHNob3VsZCB3cml0ZSBvdXQgdGhlCi0JKmVudGlyZSogYnVmZmVyICh1c2UgdGhlIHNhdmVkIHN0YXJ0IGFkZHJlc3MgYW5kIGJ1ZmZlciBsZW5ndGg7Ci0JaWdub3JlIHRoZSBjdXJyZW50IHN0YXRlIG9mIG5leHRfb3V0cHV0X2J5dGUgYW5kIGZyZWVfaW5fYnVmZmVyKS4KLQlUaGVuIHJlc2V0IHRoZSBwb2ludGVyICYgY291bnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIsIGFuZAotCXJldHVybiBUUlVFIGluZGljYXRpbmcgdGhhdCB0aGUgYnVmZmVyIGhhcyBiZWVuIGR1bXBlZC4KLQlmcmVlX2luX2J1ZmZlciBtdXN0IGJlIHNldCB0byBhIHBvc2l0aXZlIHZhbHVlIHdoZW4gVFJVRSBpcwotCXJldHVybmVkLiAgQSBGQUxTRSByZXR1cm4gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIEkvTyBzdXNwZW5zaW9uIGlzCi0JZGVzaXJlZCAodGhpcyBvcGVyYXRpbmcgbW9kZSBpcyBkaXNjdXNzZWQgaW4gdGhlIG5leHQgc2VjdGlvbikuCi0KLXRlcm1fZGVzdGluYXRpb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotCVRlcm1pbmF0ZSBkZXN0aW5hdGlvbiAtLS0gY2FsbGVkIGJ5IGpwZWdfZmluaXNoX2NvbXByZXNzKCkgYWZ0ZXIgYWxsCi0JZGF0YSBoYXMgYmVlbiB3cml0dGVuLiAgSW4gbW9zdCBhcHBsaWNhdGlvbnMsIHRoaXMgbXVzdCBmbHVzaCBhbnkKLQlkYXRhIHJlbWFpbmluZyBpbiB0aGUgYnVmZmVyLiAgVXNlIGVpdGhlciBuZXh0X291dHB1dF9ieXRlIG9yCi0JZnJlZV9pbl9idWZmZXIgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIGRhdGEgaXMgaW4gdGhlIGJ1ZmZlci4KLQotdGVybV9kZXN0aW5hdGlvbigpIGlzIE5PVCBjYWxsZWQgYnkganBlZ19hYm9ydCgpIG9yIGpwZWdfZGVzdHJveSgpLiAgSWYgeW91Ci13YW50IHRoZSBkZXN0aW5hdGlvbiBtYW5hZ2VyIHRvIGJlIGNsZWFuZWQgdXAgZHVyaW5nIGFuIGFib3J0LCB5b3UgbXVzdCBkbyBpdAoteW91cnNlbGYuCi0KLVlvdSB3aWxsIGFsc28gbmVlZCBjb2RlIHRvIGNyZWF0ZSBhIGpwZWdfZGVzdGluYXRpb25fbWdyIHN0cnVjdCwgZmlsbCBpbiBpdHMKLW1ldGhvZCBwb2ludGVycywgYW5kIGluc2VydCBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBpbnRvIHRoZSAiZGVzdCIgZmllbGQgb2YKLXRoZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdC4gIFRoaXMgY2FuIGJlIGRvbmUgaW4tbGluZSBpbiB5b3VyIHNldHVwIGNvZGUgaWYKLXlvdSBsaWtlLCBidXQgaXQncyBwcm9iYWJseSBjbGVhbmVyIHRvIHByb3ZpZGUgYSBzZXBhcmF0ZSByb3V0aW5lIHNpbWlsYXIgdG8KLXRoZSBqcGVnX3N0ZGlvX2Rlc3QoKSByb3V0aW5lIG9mIHRoZSBzdXBwbGllZCBkZXN0aW5hdGlvbiBtYW5hZ2VyLgotCi1EZWNvbXByZXNzaW9uIHNvdXJjZSBtYW5hZ2VycyBmb2xsb3cgYSBwYXJhbGxlbCBkZXNpZ24sIGJ1dCB3aXRoIHNvbWUKLWFkZGl0aW9uYWwgZnJhbW1pc2hlcy4gIFRoZSBzb3VyY2UgbWFuYWdlciBzdHJ1Y3QgY29udGFpbnMgYSBwb2ludGVyIGFuZCBjb3VudAotZGVmaW5pbmcgdGhlIG5leHQgYnl0ZSB0byByZWFkIGZyb20gdGhlIHdvcmsgYnVmZmVyIGFuZCB0aGUgbnVtYmVyIG9mIGJ5dGVzCi1yZW1haW5pbmc6Ci0KLQljb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGU7IC8qID0+IG5leHQgYnl0ZSB0byByZWFkIGZyb20gYnVmZmVyICovCi0Jc2l6ZV90IGJ5dGVzX2luX2J1ZmZlcjsgICAgICAgICAvKiAjIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KLQotVGhlIGxpYnJhcnkgaW5jcmVtZW50cyB0aGUgcG9pbnRlciBhbmQgZGVjcmVtZW50cyB0aGUgY291bnQgdW50aWwgdGhlIGJ1ZmZlcgotaXMgZW1wdGllZC4gIFRoZSBtYW5hZ2VyJ3MgZmlsbF9pbnB1dF9idWZmZXIgbWV0aG9kIG11c3QgcmVzZXQgdGhlIHBvaW50ZXIgYW5kCi1jb3VudC4gIEluIG1vc3QgYXBwbGljYXRpb25zLCB0aGUgbWFuYWdlciBtdXN0IHJlbWVtYmVyIHRoZSBidWZmZXIncyBzdGFydGluZwotYWRkcmVzcyBhbmQgdG90YWwgc2l6ZSBpbiBwcml2YXRlIGZpZWxkcyBub3QgdmlzaWJsZSB0byB0aGUgbGlicmFyeS4KLQotQSBkYXRhIHNvdXJjZSBtYW5hZ2VyIHByb3ZpZGVzIGZpdmUgbWV0aG9kczoKLQotaW5pdF9zb3VyY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0JSW5pdGlhbGl6ZSBzb3VyY2UuICBUaGlzIGlzIGNhbGxlZCBieSBqcGVnX3JlYWRfaGVhZGVyKCkgYmVmb3JlIGFueQotCWRhdGEgaXMgYWN0dWFsbHkgcmVhZC4gIFVubGlrZSBpbml0X2Rlc3RpbmF0aW9uKCksIGl0IG1heSBsZWF2ZQotCWJ5dGVzX2luX2J1ZmZlciBzZXQgdG8gMCAoaW4gd2hpY2ggY2FzZSBhIGZpbGxfaW5wdXRfYnVmZmVyKCkgY2FsbAotCXdpbGwgb2NjdXIgaW1tZWRpYXRlbHkpLgotCi1maWxsX2lucHV0X2J1ZmZlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLQlUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciBieXRlc19pbl9idWZmZXIgaGFzIHJlYWNoZWQgemVybyBhbmQgbW9yZQotCWRhdGEgaXMgd2FudGVkLiAgSW4gdHlwaWNhbCBhcHBsaWNhdGlvbnMsIGl0IHNob3VsZCByZWFkIGZyZXNoIGRhdGEKLQlpbnRvIHRoZSBidWZmZXIgKGlnbm9yaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIG5leHRfaW5wdXRfYnl0ZSBhbmQKLQlieXRlc19pbl9idWZmZXIpLCByZXNldCB0aGUgcG9pbnRlciAmIGNvdW50IHRvIHRoZSBzdGFydCBvZiB0aGUKLQlidWZmZXIsIGFuZCByZXR1cm4gVFJVRSBpbmRpY2F0aW5nIHRoYXQgdGhlIGJ1ZmZlciBoYXMgYmVlbiByZWxvYWRlZC4KLQlJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGZpbGwgdGhlIGJ1ZmZlciBlbnRpcmVseSwgb25seSB0byBvYnRhaW4gYXQKLQlsZWFzdCBvbmUgbW9yZSBieXRlLiAgYnl0ZXNfaW5fYnVmZmVyIE1VU1QgYmUgc2V0IHRvIGEgcG9zaXRpdmUgdmFsdWUKLQlpZiBUUlVFIGlzIHJldHVybmVkLiAgQSBGQUxTRSByZXR1cm4gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIEkvTwotCXN1c3BlbnNpb24gaXMgZGVzaXJlZCAodGhpcyBtb2RlIGlzIGRpc2N1c3NlZCBpbiB0aGUgbmV4dCBzZWN0aW9uKS4KLQotc2tpcF9pbnB1dF9kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBsb25nIG51bV9ieXRlcykKLQlTa2lwIG51bV9ieXRlcyB3b3J0aCBvZiBkYXRhLiAgVGhlIGJ1ZmZlciBwb2ludGVyIGFuZCBjb3VudCBzaG91bGQKLQliZSBhZHZhbmNlZCBvdmVyIG51bV9ieXRlcyBpbnB1dCBieXRlcywgcmVmaWxsaW5nIHRoZSBidWZmZXIgYXMKLQluZWVkZWQuICBUaGlzIGlzIHVzZWQgdG8gc2tpcCBvdmVyIGEgcG90ZW50aWFsbHkgbGFyZ2UgYW1vdW50IG9mCi0JdW5pbnRlcmVzdGluZyBkYXRhIChzdWNoIGFzIGFuIEFQUG4gbWFya2VyKS4gIEluIHNvbWUgYXBwbGljYXRpb25zCi0JaXQgbWF5IGJlIHBvc3NpYmxlIHRvIG9wdGltaXplIGF3YXkgdGhlIHJlYWRpbmcgb2YgdGhlIHNraXBwZWQgZGF0YSwKLQlidXQgaXQncyBub3QgY2xlYXIgdGhhdCBiZWluZyBzbWFydCBpcyB3b3J0aCBtdWNoIHRyb3VibGU7IGxhcmdlCi0Jc2tpcHMgYXJlIHVuY29tbW9uLiAgYnl0ZXNfaW5fYnVmZmVyIG1heSBiZSB6ZXJvIG9uIHJldHVybi4KLQlBIHplcm8gb3IgbmVnYXRpdmUgc2tpcCBjb3VudCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIG5vLW9wLgotCi1yZXN5bmNfdG9fcmVzdGFydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGRlc2lyZWQpCi0JVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIGRlY29tcHJlc3NvciBoYXMgZmFpbGVkIHRvIGZpbmQKLQlhIHJlc3RhcnQgKFJTVG4pIG1hcmtlciB3aGVyZSBvbmUgaXMgZXhwZWN0ZWQuICBJdHMgbWlzc2lvbiBpcyB0bwotCWZpbmQgYSBzdWl0YWJsZSBwb2ludCBmb3IgcmVzdW1pbmcgZGVjb21wcmVzc2lvbi4gIEZvciBtb3N0Ci0JYXBwbGljYXRpb25zLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UganVzdCB1c2UgdGhlIGRlZmF1bHQgcmVzeW5jCi0JcHJvY2VkdXJlLCBqcGVnX3Jlc3luY190b19yZXN0YXJ0KCkuICBIb3dldmVyLCBpZiB5b3UgYXJlIGFibGUgdG8gYmFjawotCXVwIGluIHRoZSBpbnB1dCBkYXRhIHN0cmVhbSwgb3IgaWYgeW91IGhhdmUgYS1wcmlvcmkga25vd2xlZGdlIGFib3V0Ci0JdGhlIGxpa2VseSBsb2NhdGlvbiBvZiByZXN0YXJ0IG1hcmtlcnMsIHlvdSBtYXkgYmUgYWJsZSB0byBkbyBiZXR0ZXIuCi0JUmVhZCB0aGUgcmVhZF9yZXN0YXJ0X21hcmtlcigpIGFuZCBqcGVnX3Jlc3luY190b19yZXN0YXJ0KCkgcm91dGluZXMKLQlpbiBqZG1hcmtlci5jIGlmIHlvdSB0aGluayB5b3UnZCBsaWtlIHRvIGltcGxlbWVudCB5b3VyIG93biByZXN5bmMKLQlwcm9jZWR1cmUuCi0KLXRlcm1fc291cmNlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotCVRlcm1pbmF0ZSBzb3VyY2UgLS0tIGNhbGxlZCBieSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgYWZ0ZXIgYWxsCi0JZGF0YSBoYXMgYmVlbiByZWFkLiAgT2Z0ZW4gYSBuby1vcC4KLQotRm9yIGJvdGggZmlsbF9pbnB1dF9idWZmZXIoKSBhbmQgc2tpcF9pbnB1dF9kYXRhKCksIHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcKLWFzIGFuIEVPRiByZXR1cm4uICBJZiB0aGUgZW5kIG9mIHRoZSBmaWxlIGhhcyBiZWVuIHJlYWNoZWQsIHRoZSByb3V0aW5lIGhhcwotYSBjaG9pY2Ugb2YgZXhpdGluZyB2aWEgRVJSRVhJVCgpIG9yIGluc2VydGluZyBmYWtlIGRhdGEgaW50byB0aGUgYnVmZmVyLgotSW4gbW9zdCBjYXNlcywgZ2VuZXJhdGluZyBhIHdhcm5pbmcgbWVzc2FnZSBhbmQgaW5zZXJ0aW5nIGEgZmFrZSBFT0kgbWFya2VyCi1pcyB0aGUgYmVzdCBjb3Vyc2Ugb2YgYWN0aW9uIC0tLSB0aGlzIHdpbGwgYWxsb3cgdGhlIGRlY29tcHJlc3NvciB0byBvdXRwdXQKLWhvd2V2ZXIgbXVjaCBvZiB0aGUgaW1hZ2UgaXMgdGhlcmUuICBJbiBwYXRob2xvZ2ljYWwgY2FzZXMsIHRoZSBkZWNvbXByZXNzb3IKLW1heSBzd2FsbG93IHRoZSBFT0kgYW5kIGFnYWluIGRlbWFuZCBkYXRhIC4uLiBqdXN0IGtlZXAgZmVlZGluZyBpdCBmYWtlIEVPSXMuCi1qZGF0YXNyYy5jIGlsbHVzdHJhdGVzIHRoZSByZWNvbW1lbmRlZCBlcnJvciByZWNvdmVyeSBiZWhhdmlvci4KLQotdGVybV9zb3VyY2UoKSBpcyBOT1QgY2FsbGVkIGJ5IGpwZWdfYWJvcnQoKSBvciBqcGVnX2Rlc3Ryb3koKS4gIElmIHlvdSB3YW50Ci10aGUgc291cmNlIG1hbmFnZXIgdG8gYmUgY2xlYW5lZCB1cCBkdXJpbmcgYW4gYWJvcnQsIHlvdSBtdXN0IGRvIGl0IHlvdXJzZWxmLgotCi1Zb3Ugd2lsbCBhbHNvIG5lZWQgY29kZSB0byBjcmVhdGUgYSBqcGVnX3NvdXJjZV9tZ3Igc3RydWN0LCBmaWxsIGluIGl0cyBtZXRob2QKLXBvaW50ZXJzLCBhbmQgaW5zZXJ0IGEgcG9pbnRlciB0byB0aGUgc3RydWN0IGludG8gdGhlICJzcmMiIGZpZWxkIG9mIHRoZSBKUEVHCi1kZWNvbXByZXNzaW9uIG9iamVjdC4gIFRoaXMgY2FuIGJlIGRvbmUgaW4tbGluZSBpbiB5b3VyIHNldHVwIGNvZGUgaWYgeW91Ci1saWtlLCBidXQgaXQncyBwcm9iYWJseSBjbGVhbmVyIHRvIHByb3ZpZGUgYSBzZXBhcmF0ZSByb3V0aW5lIHNpbWlsYXIgdG8gdGhlCi1qcGVnX3N0ZGlvX3NyYygpIHJvdXRpbmUgb2YgdGhlIHN1cHBsaWVkIHNvdXJjZSBtYW5hZ2VyLgotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgY29uc3VsdCB0aGUgc3RkaW8gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBtYW5hZ2VycwotaW4gamRhdGFzcmMuYyBhbmQgamRhdGFkc3QuYy4KLQotCi1JL08gc3VzcGVuc2lvbgotLS0tLS0tLS0tLS0tLS0KLQotU29tZSBhcHBsaWNhdGlvbnMgbmVlZCB0byB1c2UgdGhlIEpQRUcgbGlicmFyeSBhcyBhbiBpbmNyZW1lbnRhbCBtZW1vcnktdG8tCi1tZW1vcnkgZmlsdGVyOiB3aGVuIHRoZSBjb21wcmVzc2VkIGRhdGEgYnVmZmVyIGlzIGZpbGxlZCBvciBlbXB0aWVkLCB0aGV5IHdhbnQKLWNvbnRyb2wgdG8gcmV0dXJuIHRvIHRoZSBvdXRlciBsb29wLCByYXRoZXIgdGhhbiBleHBlY3RpbmcgdGhhdCB0aGUgYnVmZmVyIGNhbgotYmUgZW1wdGllZCBvciByZWxvYWRlZCB3aXRoaW4gdGhlIGRhdGEgc291cmNlL2Rlc3RpbmF0aW9uIG1hbmFnZXIgc3Vicm91dGluZS4KLVRoZSBsaWJyYXJ5IHN1cHBvcnRzIHRoaXMgbmVlZCBieSBwcm92aWRpbmcgYW4gIkkvTyBzdXNwZW5zaW9uIiBtb2RlLCB3aGljaCB3ZQotZGVzY3JpYmUgaW4gdGhpcyBzZWN0aW9uLgotCi1UaGUgSS9PIHN1c3BlbnNpb24gbW9kZSBpcyBub3QgYSBwYW5hY2VhOiBub3RoaW5nIGlzIGd1YXJhbnRlZWQgYWJvdXQgdGhlCi1tYXhpbXVtIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIGFueSBvbmUgY2FsbCB0byB0aGUgbGlicmFyeSwgc28gaXQgd2lsbCBub3QKLWVsaW1pbmF0ZSByZXNwb25zZS10aW1lIHByb2JsZW1zIGluIHNpbmdsZS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICBJZiB5b3UKLW5lZWQgZ3VhcmFudGVlZCByZXNwb25zZSB0aW1lLCB3ZSBzdWdnZXN0IHlvdSAiYml0ZSB0aGUgYnVsbGV0IiBhbmQgaW1wbGVtZW50Ci1hIHJlYWwgbXVsdGktdGFza2luZyBjYXBhYmlsaXR5LgotCi1UbyB1c2UgSS9PIHN1c3BlbnNpb24sIGNvb3BlcmF0aW9uIGlzIG5lZWRlZCBiZXR3ZWVuIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uCi1hbmQgdGhlIGRhdGEgc291cmNlIG9yIGRlc3RpbmF0aW9uIG1hbmFnZXI7IHlvdSB3aWxsIGFsd2F5cyBuZWVkIGEgY3VzdG9tCi1zb3VyY2UvZGVzdGluYXRpb24gbWFuYWdlci4gIChQbGVhc2UgcmVhZCB0aGUgcHJldmlvdXMgc2VjdGlvbiBpZiB5b3UgaGF2ZW4ndAotYWxyZWFkeS4pICBUaGUgYmFzaWMgaWRlYSBpcyB0aGF0IHRoZSBlbXB0eV9vdXRwdXRfYnVmZmVyKCkgb3IKLWZpbGxfaW5wdXRfYnVmZmVyKCkgcm91dGluZSBpcyBhIG5vLW9wLCBtZXJlbHkgcmV0dXJuaW5nIEZBTFNFIHRvIGluZGljYXRlCi10aGF0IGl0IGhhcyBkb25lIG5vdGhpbmcuICBVcG9uIHNlZWluZyB0aGlzLCB0aGUgSlBFRyBsaWJyYXJ5IHN1c3BlbmRzCi1vcGVyYXRpb24gYW5kIHJldHVybnMgdG8gaXRzIGNhbGxlci4gIFRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBpcwotcmVzcG9uc2libGUgZm9yIGVtcHR5aW5nIG9yIHJlZmlsbGluZyB0aGUgd29yayBidWZmZXIgYmVmb3JlIGNhbGxpbmcgdGhlCi1KUEVHIGxpYnJhcnkgYWdhaW4uCi0KLUNvbXByZXNzaW9uIHN1c3BlbnNpb246Ci0KLUZvciBjb21wcmVzc2lvbiBzdXNwZW5zaW9uLCB1c2UgYW4gZW1wdHlfb3V0cHV0X2J1ZmZlcigpIHJvdXRpbmUgdGhhdCByZXR1cm5zCi1GQUxTRTsgdHlwaWNhbGx5IGl0IHdpbGwgbm90IGRvIGFueXRoaW5nIGVsc2UuICBUaGlzIHdpbGwgY2F1c2UgdGhlCi1jb21wcmVzc29yIHRvIHJldHVybiB0byB0aGUgY2FsbGVyIG9mIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCksIHdpdGggdGhlIHJldHVybgotdmFsdWUgaW5kaWNhdGluZyB0aGF0IG5vdCBhbGwgdGhlIHN1cHBsaWVkIHNjYW5saW5lcyBoYXZlIGJlZW4gYWNjZXB0ZWQuCi1UaGUgYXBwbGljYXRpb24gbXVzdCBtYWtlIG1vcmUgcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwgYWRqdXN0IHRoZSBvdXRwdXQKLWJ1ZmZlciBwb2ludGVyL2NvdW50IGFwcHJvcHJpYXRlbHksIGFuZCB0aGVuIGNhbGwganBlZ193cml0ZV9zY2FubGluZXMoKQotYWdhaW4sIHBvaW50aW5nIHRvIHRoZSBmaXJzdCB1bmNvbnN1bWVkIHNjYW5saW5lLgotCi1XaGVuIGZvcmNlZCB0byBzdXNwZW5kLCB0aGUgY29tcHJlc3NvciB3aWxsIGJhY2t0cmFjayB0byBhIGNvbnZlbmllbnQgc3RvcHBpbmcKLXBvaW50ICh1c3VhbGx5IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UpOyBpdCB3aWxsIHJlZ2VuZXJhdGUgc29tZSBvdXRwdXQKLWRhdGEgd2hlbiByZXN0YXJ0ZWQuICBUaGVyZWZvcmUsIGFsdGhvdWdoIGVtcHR5X291dHB1dF9idWZmZXIoKSBpcyBvbmx5Ci1jYWxsZWQgd2hlbiB0aGUgYnVmZmVyIGlzIGZpbGxlZCwgeW91IHNob3VsZCBOT1Qgd3JpdGUgb3V0IHRoZSBlbnRpcmUgYnVmZmVyCi1hZnRlciBhIHN1c3BlbnNpb24uICBXcml0ZSBvbmx5IHRoZSBkYXRhIHVwIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mCi1uZXh0X291dHB1dF9ieXRlL2ZyZWVfaW5fYnVmZmVyLiAgVGhlIGRhdGEgYmV5b25kIHRoYXQgcG9pbnQgd2lsbCBiZQotcmVnZW5lcmF0ZWQgYWZ0ZXIgcmVzdW1wdGlvbi4KLQotQmVjYXVzZSBvZiB0aGUgYmFja3RyYWNraW5nIGJlaGF2aW9yLCBhIGdvb2Qtc2l6ZSBvdXRwdXQgYnVmZmVyIGlzIGVzc2VudGlhbAotZm9yIGVmZmljaWVuY3k7IHlvdSBkb24ndCB3YW50IHRoZSBjb21wcmVzc29yIHRvIHN1c3BlbmQgb2Z0ZW4uICAoSW4gZmFjdCwgYW4KLW92ZXJseSBzbWFsbCBidWZmZXIgY291bGQgbGVhZCB0byBpbmZpbml0ZSBsb29waW5nLCBpZiBhIHNpbmdsZSBNQ1UgcmVxdWlyZWQKLW1vcmUgZGF0YSB0aGFuIHdvdWxkIGZpdCBpbiB0aGUgYnVmZmVyLikgIFdlIHJlY29tbWVuZCBhIGJ1ZmZlciBvZiBhdCBsZWFzdAotc2V2ZXJhbCBLYnl0ZXMuICBZb3UgbWF5IHdhbnQgdG8gaW5zZXJ0IGV4cGxpY2l0IGNvZGUgdG8gZW5zdXJlIHRoYXQgeW91IGRvbid0Ci1jYWxsIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkgdW5sZXNzIHRoZXJlIGlzIGEgcmVhc29uYWJsZSBhbW91bnQgb2Ygc3BhY2UgaW4KLXRoZSBvdXRwdXQgYnVmZmVyOyBpbiBvdGhlciB3b3JkcywgZmx1c2ggdGhlIGJ1ZmZlciBiZWZvcmUgdHJ5aW5nIHRvIGNvbXByZXNzCi1tb3JlIGRhdGEuCi0KLVRoZSBjb21wcmVzc29yIGRvZXMgbm90IGFsbG93IHN1c3BlbnNpb24gd2hpbGUgaXQgaXMgdHJ5aW5nIHRvIHdyaXRlIEpQRUcKLW1hcmtlcnMgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBmaWxlLiAgVGhpcyBtZWFucyB0aGF0OgotICAqIEF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjb21wcmVzc2lvbiBvcGVyYXRpb24sIHRoZXJlIG11c3QgYmUgZW5vdWdoIGZyZWUKLSAgICBzcGFjZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciB0byBob2xkIHRoZSBoZWFkZXIgbWFya2VycyAodHlwaWNhbGx5IDYwMCBvcgotICAgIHNvIGJ5dGVzKS4gIFRoZSByZWNvbW1lbmRlZCBidWZmZXIgc2l6ZSBpcyBiaWdnZXIgdGhhbiB0aGlzIGFueXdheSwgc28KLSAgICB0aGlzIGlzIG5vdCBhIHByb2JsZW0gYXMgbG9uZyBhcyB5b3Ugc3RhcnQgd2l0aCBhbiBlbXB0eSBidWZmZXIuICBIb3dldmVyLAotICAgIHRoaXMgcmVzdHJpY3Rpb24gbWlnaHQgY2F0Y2ggeW91IGlmIHlvdSBpbnNlcnQgbGFyZ2Ugc3BlY2lhbCBtYXJrZXJzLCBzdWNoCi0gICAgYXMgYSBKRklGIHRodW1ibmFpbCBpbWFnZSwgd2l0aG91dCBmbHVzaGluZyB0aGUgYnVmZmVyIGFmdGVyd2FyZHMuCi0gICogV2hlbiB5b3UgY2FsbCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpLCB0aGVyZSBtdXN0IGJlIGVub3VnaCBzcGFjZSBpbiB0aGUKLSAgICBvdXRwdXQgYnVmZmVyIHRvIGVtaXQgYW55IGJ1ZmZlcmVkIGRhdGEgYW5kIHRoZSBmaW5hbCBFT0kgbWFya2VyLiAgSW4gdGhlCi0gICAgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgaGFsZiBhIGRvemVuIGJ5dGVzIHNob3VsZCBzdWZmaWNlIGZvciB0aGlzLCBidXQKLSAgICBmb3Igc2FmZXR5J3Mgc2FrZSB3ZSByZWNvbW1lbmQgZW5zdXJpbmcgdGhhdCBhdCBsZWFzdCAxMDAgYnl0ZXMgYXJlIGZyZWUKLSAgICBiZWZvcmUgY2FsbGluZyBqcGVnX2ZpbmlzaF9jb21wcmVzcygpLgotCi1BIG1vcmUgc2lnbmlmaWNhbnQgcmVzdHJpY3Rpb24gaXMgdGhhdCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIGNhbm5vdCBzdXNwZW5kLgotVGhpcyBtZWFucyB5b3UgY2Fubm90IHVzZSBzdXNwZW5zaW9uIHdpdGggbXVsdGktcGFzcyBvcGVyYXRpbmcgbW9kZXMsIG5hbWVseQotSHVmZm1hbiBjb2RlIG9wdGltaXphdGlvbiBhbmQgbXVsdGlwbGUtc2NhbiBvdXRwdXQuICBUaG9zZSBtb2RlcyB3cml0ZSB0aGUKLXdob2xlIGZpbGUgZHVyaW5nIGpwZWdfZmluaXNoX2NvbXByZXNzKCksIHdoaWNoIHdpbGwgY2VydGFpbmx5IHJlc3VsdCBpbgotYnVmZmVyIG92ZXJydW4uICAoTm90ZSB0aGF0IHRoaXMgcmVzdHJpY3Rpb24gYXBwbGllcyBvbmx5IHRvIGNvbXByZXNzaW9uLAotbm90IGRlY29tcHJlc3Npb24uICBUaGUgZGVjb21wcmVzc29yIHN1cHBvcnRzIGlucHV0IHN1c3BlbnNpb24gaW4gYWxsIG9mIGl0cwotb3BlcmF0aW5nIG1vZGVzLikKLQotRGVjb21wcmVzc2lvbiBzdXNwZW5zaW9uOgotCi1Gb3IgZGVjb21wcmVzc2lvbiBzdXNwZW5zaW9uLCB1c2UgYSBmaWxsX2lucHV0X2J1ZmZlcigpIHJvdXRpbmUgdGhhdCBzaW1wbHkKLXJldHVybnMgRkFMU0UgKGV4Y2VwdCBwZXJoYXBzIGR1cmluZyBlcnJvciByZWNvdmVyeSwgYXMgZGlzY3Vzc2VkIGJlbG93KS4KLVRoaXMgd2lsbCBjYXVzZSB0aGUgZGVjb21wcmVzc29yIHRvIHJldHVybiB0byBpdHMgY2FsbGVyIHdpdGggYW4gaW5kaWNhdGlvbgotdGhhdCBzdXNwZW5zaW9uIGhhcyBvY2N1cnJlZC4gIFRoaXMgY2FuIGhhcHBlbiBhdCBmb3VyIHBsYWNlczoKLSAgKiBqcGVnX3JlYWRfaGVhZGVyKCk6IHdpbGwgcmV0dXJuIEpQRUdfU1VTUEVOREVELgotICAqIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpOiB3aWxsIHJldHVybiBGQUxTRSwgcmF0aGVyIHRoYW4gaXRzIHVzdWFsIFRSVUUuCi0gICoganBlZ19yZWFkX3NjYW5saW5lcygpOiB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIHNjYW5saW5lcyBhbHJlYWR5Ci0JY29tcGxldGVkIChwb3NzaWJseSAwKS4KLSAgKiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCk6IHdpbGwgcmV0dXJuIEZBTFNFLCByYXRoZXIgdGhhbiBpdHMgdXN1YWwgVFJVRS4KLVRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBtdXN0IHJlY29nbml6ZSB0aGVzZSBjYXNlcywgbG9hZCBtb3JlIGRhdGEgaW50bwotdGhlIGlucHV0IGJ1ZmZlciwgYW5kIHJlcGVhdCB0aGUgY2FsbC4gIEluIHRoZSBjYXNlIG9mIGpwZWdfcmVhZF9zY2FubGluZXMoKSwKLWluY3JlbWVudCB0aGUgcGFzc2VkIHBvaW50ZXJzIHBhc3QgYW55IHNjYW5saW5lcyBzdWNjZXNzZnVsbHkgcmVhZC4KLQotSnVzdCBhcyB3aXRoIGNvbXByZXNzaW9uLCB0aGUgZGVjb21wcmVzc29yIHdpbGwgdHlwaWNhbGx5IGJhY2t0cmFjayB0byBhCi1jb252ZW5pZW50IHJlc3RhcnQgcG9pbnQgYmVmb3JlIHN1c3BlbmRpbmcuICBXaGVuIGZpbGxfaW5wdXRfYnVmZmVyKCkgaXMKLWNhbGxlZCwgbmV4dF9pbnB1dF9ieXRlL2J5dGVzX2luX2J1ZmZlciBwb2ludCB0byB0aGUgY3VycmVudCByZXN0YXJ0IHBvaW50LAotd2hpY2ggaXMgd2hlcmUgdGhlIGRlY29tcHJlc3NvciB3aWxsIGJhY2t0cmFjayB0byBpZiBGQUxTRSBpcyByZXR1cm5lZC4KLVRoZSBkYXRhIGJleW9uZCB0aGF0IHBvc2l0aW9uIG11c3QgTk9UIGJlIGRpc2NhcmRlZCBpZiB5b3Ugc3VzcGVuZDsgaXQgbmVlZHMKLXRvIGJlIHJlLXJlYWQgdXBvbiByZXN1bXB0aW9uLiAgSW4gbW9zdCBpbXBsZW1lbnRhdGlvbnMsIHlvdSdsbCBuZWVkIHRvIHNoaWZ0Ci10aGlzIGRhdGEgZG93biB0byB0aGUgc3RhcnQgb2YgeW91ciB3b3JrIGJ1ZmZlciBhbmQgdGhlbiBsb2FkIG1vcmUgZGF0YSBhZnRlcgotaXQuICBBZ2FpbiwgdGhpcyBiZWhhdmlvciBtZWFucyB0aGF0IGEgc2V2ZXJhbC1LYnl0ZSB3b3JrIGJ1ZmZlciBpcyBlc3NlbnRpYWwKLWZvciBkZWNlbnQgcGVyZm9ybWFuY2U7IGZ1cnRoZXJtb3JlLCB5b3Ugc2hvdWxkIGxvYWQgYSByZWFzb25hYmxlIGFtb3VudCBvZgotbmV3IGRhdGEgYmVmb3JlIHJlc3VtaW5nIGRlY29tcHJlc3Npb24uICAoSWYgeW91IGxvYWRlZCwgc2F5LCBvbmx5IG9uZSBuZXcKLWJ5dGUgZWFjaCB0aW1lIGFyb3VuZCwgeW91IGNvdWxkIHdhc3RlIGEgTE9UIG9mIGN5Y2xlcy4pCi0KLVRoZSBza2lwX2lucHV0X2RhdGEoKSBzb3VyY2UgbWFuYWdlciByb3V0aW5lIHJlcXVpcmVzIHNwZWNpYWwgY2FyZSBpbiBhCi1zdXNwZW5zaW9uIHNjZW5hcmlvLiAgVGhpcyByb3V0aW5lIGlzIE5PVCBncmFudGVkIHRoZSBhYmlsaXR5IHRvIHN1c3BlbmQgdGhlCi1kZWNvbXByZXNzb3I7IGl0IGNhbiBkZWNyZW1lbnQgYnl0ZXNfaW5fYnVmZmVyIHRvIHplcm8sIGJ1dCBubyBtb3JlLiAgSWYgdGhlCi1yZXF1ZXN0ZWQgc2tpcCBkaXN0YW5jZSBleGNlZWRzIHRoZSBhbW91bnQgb2YgZGF0YSBjdXJyZW50bHkgaW4gdGhlIGlucHV0Ci1idWZmZXIsIHRoZW4gc2tpcF9pbnB1dF9kYXRhKCkgbXVzdCBzZXQgYnl0ZXNfaW5fYnVmZmVyIHRvIHplcm8gYW5kIHJlY29yZCB0aGUKLWFkZGl0aW9uYWwgc2tpcCBkaXN0YW5jZSBzb21ld2hlcmUgZWxzZS4gIFRoZSBkZWNvbXByZXNzb3Igd2lsbCBpbW1lZGlhdGVseQotY2FsbCBmaWxsX2lucHV0X2J1ZmZlcigpLCB3aGljaCBzaG91bGQgcmV0dXJuIEZBTFNFLCB3aGljaCB3aWxsIGNhdXNlIGEKLXN1c3BlbnNpb24gcmV0dXJuLiAgVGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIG11c3QgdGhlbiBhcnJhbmdlIHRvIGRpc2NhcmQKLXRoZSByZWNvcmRlZCBudW1iZXIgb2YgYnl0ZXMgYmVmb3JlIGl0IHJlc3VtZXMgbG9hZGluZyB0aGUgaW5wdXQgYnVmZmVyLgotKFllcywgdGhpcyBkZXNpZ24gaXMgcmF0aGVyIGJhcm9xdWUsIGJ1dCBpdCBhdm9pZHMgY29tcGxleGl0eSBpbiB0aGUgZmFyIG1vcmUKLWNvbW1vbiBjYXNlIHdoZXJlIGEgbm9uLXN1c3BlbmRpbmcgc291cmNlIG1hbmFnZXIgaXMgdXNlZC4pCi0KLUlmIHRoZSBpbnB1dCBkYXRhIGhhcyBiZWVuIGV4aGF1c3RlZCwgd2UgcmVjb21tZW5kIHRoYXQgeW91IGVtaXQgYSB3YXJuaW5nCi1hbmQgaW5zZXJ0IGR1bW15IEVPSSBtYXJrZXJzIGp1c3QgYXMgYSBub24tc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBtYW5hZ2VyCi13b3VsZCBkby4gIFRoaXMgY2FuIGJlIGhhbmRsZWQgZWl0aGVyIGluIHRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBsb2dpYyBvcgotd2l0aGluIGZpbGxfaW5wdXRfYnVmZmVyKCk7IHRoZSBsYXR0ZXIgaXMgcHJvYmFibHkgbW9yZSBlZmZpY2llbnQuICBJZgotZmlsbF9pbnB1dF9idWZmZXIoKSBrbm93cyB0aGF0IG5vIG1vcmUgZGF0YSBpcyBhdmFpbGFibGUsIGl0IGNhbiBzZXQgdGhlCi1wb2ludGVyL2NvdW50IHRvIHBvaW50IHRvIGEgZHVtbXkgRU9JIG1hcmtlciBhbmQgdGhlbiByZXR1cm4gVFJVRSBqdXN0IGFzCi10aG91Z2ggaXQgaGFkIHJlYWQgbW9yZSBkYXRhIGluIGEgbm9uLXN1c3BlbmRpbmcgc2l0dWF0aW9uLgotCi1UaGUgZGVjb21wcmVzc29yIGRvZXMgbm90IGF0dGVtcHQgdG8gc3VzcGVuZCB3aXRoaW4gc3RhbmRhcmQgSlBFRyBtYXJrZXJzOwotaW5zdGVhZCBpdCB3aWxsIGJhY2t0cmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIG1hcmtlciBhbmQgcmVwcm9jZXNzIHRoZSB3aG9sZQotbWFya2VyIG5leHQgdGltZS4gIEhlbmNlIHRoZSBpbnB1dCBidWZmZXIgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUKLWxvbmdlc3Qgc3RhbmRhcmQgbWFya2VyIGluIHRoZSBmaWxlLiAgU3RhbmRhcmQgSlBFRyBtYXJrZXJzIHNob3VsZCBub3JtYWxseQotbm90IGV4Y2VlZCBhIGZldyBodW5kcmVkIGJ5dGVzIGVhY2ggKERIVCB0YWJsZXMgYXJlIHR5cGljYWxseSB0aGUgbG9uZ2VzdCkuCi1XZSByZWNvbW1lbmQgYXQgbGVhc3QgYSAySyBidWZmZXIgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHdoaWNoIGlzIG11Y2gKLWxhcmdlciB0aGFuIGFueSBjb3JyZWN0IG1hcmtlciBpcyBsaWtlbHkgdG8gYmUuICBGb3Igcm9idXN0bmVzcyBhZ2FpbnN0Ci1kYW1hZ2VkIG1hcmtlciBsZW5ndGggY291bnRzLCB5b3UgbWF5IHdpc2ggdG8gaW5zZXJ0IGEgdGVzdCBpbiB5b3VyCi1hcHBsaWNhdGlvbiBmb3IgdGhlIGNhc2UgdGhhdCB0aGUgaW5wdXQgYnVmZmVyIGlzIGNvbXBsZXRlbHkgZnVsbCBhbmQgeWV0Ci10aGUgZGVjb2RlciBoYXMgc3VzcGVuZGVkIHdpdGhvdXQgY29uc3VtaW5nIGFueSBkYXRhIC0tLSBvdGhlcndpc2UsIGlmIHRoaXMKLXNpdHVhdGlvbiBkaWQgb2NjdXIsIGl0IHdvdWxkIGxlYWQgdG8gYW4gZW5kbGVzcyBsb29wLiAgKFRoZSBsaWJyYXJ5IGNhbid0Ci1wcm92aWRlIHRoaXMgdGVzdCBzaW5jZSBpdCBoYXMgbm8gaWRlYSB3aGV0aGVyICJ0aGUgYnVmZmVyIGlzIGZ1bGwiLCBvcgotZXZlbiB3aGV0aGVyIHRoZXJlIGlzIGEgZml4ZWQtc2l6ZSBpbnB1dCBidWZmZXIuKQotCi1UaGUgaW5wdXQgYnVmZmVyIHdvdWxkIG5lZWQgdG8gYmUgNjRLIHRvIGFsbG93IGZvciBhcmJpdHJhcnkgQ09NIG9yIEFQUG4KLW1hcmtlcnMsIGJ1dCB0aGVzZSBhcmUgaGFuZGxlZCBzcGVjaWFsbHk6IHRoZXkgYXJlIGVpdGhlciBzYXZlZCBpbnRvIGFsbG9jYXRlZAotbWVtb3J5LCBvciBza2lwcGVkIG92ZXIgYnkgY2FsbGluZyBza2lwX2lucHV0X2RhdGEoKS4gIEluIHRoZSBmb3JtZXIgY2FzZSwKLXN1c3BlbnNpb24gaXMgaGFuZGxlZCBjb3JyZWN0bHksIGFuZCBpbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBwcm9ibGVtIG9mCi1idWZmZXIgb3ZlcnJ1biBpcyBwbGFjZWQgb24gc2tpcF9pbnB1dF9kYXRhJ3Mgc2hvdWxkZXJzLCBhcyBleHBsYWluZWQgYWJvdmUuCi1Ob3RlIHRoYXQgaWYgeW91IHByb3ZpZGUgeW91ciBvd24gbWFya2VyIGhhbmRsaW5nIHJvdXRpbmUgZm9yIGxhcmdlIG1hcmtlcnMsCi15b3Ugc2hvdWxkIGNvbnNpZGVyIGhvdyB0byBkZWFsIHdpdGggYnVmZmVyIG92ZXJmbG93LgotCi1NdWx0aXBsZS1idWZmZXIgbWFuYWdlbWVudDoKLQotSW4gc29tZSBhcHBsaWNhdGlvbnMgaXQgaXMgZGVzaXJhYmxlIHRvIHN0b3JlIHRoZSBjb21wcmVzc2VkIGRhdGEgaW4gYSBsaW5rZWQKLWxpc3Qgb2YgYnVmZmVyIGFyZWFzLCBzbyBhcyB0byBhdm9pZCBkYXRhIGNvcHlpbmcuICBUaGlzIGNhbiBiZSBoYW5kbGVkIGJ5Ci1oYXZpbmcgZW1wdHlfb3V0cHV0X2J1ZmZlcigpIG9yIGZpbGxfaW5wdXRfYnVmZmVyKCkgc2V0IHRoZSBwb2ludGVyIGFuZCBjb3VudAotdG8gcmVmZXJlbmNlIHRoZSBuZXh0IGF2YWlsYWJsZSBidWZmZXI7IEZBTFNFIGlzIHJldHVybmVkIG9ubHkgaWYgbm8gbW9yZQotYnVmZmVycyBhcmUgYXZhaWxhYmxlLiAgQWx0aG91Z2ggc2VlbWluZ2x5IHN0cmFpZ2h0Zm9yd2FyZCwgdGhlcmUgaXMgYQotcGl0ZmFsbCBpbiB0aGlzIGFwcHJvYWNoOiB0aGUgYmFja3RyYWNrIHRoYXQgb2NjdXJzIHdoZW4gRkFMU0UgaXMgcmV0dXJuZWQKLWNvdWxkIGJhY2sgdXAgaW50byBhbiBlYXJsaWVyIGJ1ZmZlci4gIEZvciBleGFtcGxlLCB3aGVuIGZpbGxfaW5wdXRfYnVmZmVyKCkKLWlzIGNhbGxlZCwgdGhlIGN1cnJlbnQgcG9pbnRlciAmIGNvdW50IGluZGljYXRlIHRoZSBiYWNrdHJhY2sgcmVzdGFydCBwb2ludC4KLVNpbmNlIGZpbGxfaW5wdXRfYnVmZmVyKCkgd2lsbCBzZXQgdGhlIHBvaW50ZXIgYW5kIGNvdW50IHRvIHJlZmVyIHRvIGEgbmV3Ci1idWZmZXIsIHRoZSByZXN0YXJ0IHBvc2l0aW9uIG11c3QgYmUgc2F2ZWQgc29tZXdoZXJlIGVsc2UuICBTdXBwb3NlIGEgc2Vjb25kCi1jYWxsIHRvIGZpbGxfaW5wdXRfYnVmZmVyKCkgb2NjdXJzIGluIHRoZSBzYW1lIGxpYnJhcnkgY2FsbCwgYW5kIG5vCi1hZGRpdGlvbmFsIGlucHV0IGRhdGEgaXMgYXZhaWxhYmxlLCBzbyBmaWxsX2lucHV0X2J1ZmZlciBtdXN0IHJldHVybiBGQUxTRS4KLUlmIHRoZSBKUEVHIGxpYnJhcnkgaGFzIG5vdCBtb3ZlZCB0aGUgcG9pbnRlci9jb3VudCBmb3J3YXJkIGluIHRoZSBjdXJyZW50Ci1idWZmZXIsIHRoZW4gKnRoZSBjb3JyZWN0IHJlc3RhcnQgcG9pbnQgaXMgdGhlIHNhdmVkIHBvc2l0aW9uIGluIHRoZSBwcmlvcgotYnVmZmVyKi4gIFByaW9yIGJ1ZmZlcnMgbWF5IGJlIGRpc2NhcmRlZCBvbmx5IGFmdGVyIHRoZSBsaWJyYXJ5IGVzdGFibGlzaGVzCi1hIHJlc3RhcnQgcG9pbnQgd2l0aGluIGEgbGF0ZXIgYnVmZmVyLiAgU2ltaWxhciByZW1hcmtzIGFwcGx5IGZvciBvdXRwdXQgaW50bwotYSBjaGFpbiBvZiBidWZmZXJzLgotCi1UaGUgbGlicmFyeSB3aWxsIG5ldmVyIGF0dGVtcHQgdG8gYmFja3RyYWNrIG92ZXIgYSBza2lwX2lucHV0X2RhdGEoKSBjYWxsLAotc28gYW55IHNraXBwZWQgZGF0YSBjYW4gYmUgcGVybWFuZW50bHkgZGlzY2FyZGVkLiAgWW91IHN0aWxsIGhhdmUgdG8gZGVhbAotd2l0aCB0aGUgY2FzZSBvZiBza2lwcGluZyBub3QteWV0LXJlY2VpdmVkIGRhdGEsIGhvd2V2ZXIuCi0KLUl0J3MgbXVjaCBzaW1wbGVyIHRvIHVzZSBvbmx5IGEgc2luZ2xlIGJ1ZmZlcjsgd2hlbiBmaWxsX2lucHV0X2J1ZmZlcigpIGlzCi1jYWxsZWQsIG1vdmUgYW55IHVuY29uc3VtZWQgZGF0YSAoYmV5b25kIHRoZSBjdXJyZW50IHBvaW50ZXIvY291bnQpIGRvd24gdG8KLXRoZSBiZWdpbm5pbmcgb2YgdGhpcyBidWZmZXIgYW5kIHRoZW4gbG9hZCBuZXcgZGF0YSBpbnRvIHRoZSByZW1haW5pbmcgYnVmZmVyCi1zcGFjZS4gIFRoaXMgYXBwcm9hY2ggcmVxdWlyZXMgYSBsaXR0bGUgbW9yZSBkYXRhIGNvcHlpbmcgYnV0IGlzIGZhciBlYXNpZXIKLXRvIGdldCByaWdodC4KLQotCi1Qcm9ncmVzc2l2ZSBKUEVHIHN1cHBvcnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Qcm9ncmVzc2l2ZSBKUEVHIHJlYXJyYW5nZXMgdGhlIHN0b3JlZCBkYXRhIGludG8gYSBzZXJpZXMgb2Ygc2NhbnMgb2YKLWluY3JlYXNpbmcgcXVhbGl0eS4gIEluIHNpdHVhdGlvbnMgd2hlcmUgYSBKUEVHIGZpbGUgaXMgdHJhbnNtaXR0ZWQgYWNyb3NzIGEKLXNsb3cgY29tbXVuaWNhdGlvbnMgbGluaywgYSBkZWNvZGVyIGNhbiBnZW5lcmF0ZSBhIGxvdy1xdWFsaXR5IGltYWdlIHZlcnkKLXF1aWNrbHkgZnJvbSB0aGUgZmlyc3Qgc2NhbiwgdGhlbiBncmFkdWFsbHkgaW1wcm92ZSB0aGUgZGlzcGxheWVkIHF1YWxpdHkgYXMKLW1vcmUgc2NhbnMgYXJlIHJlY2VpdmVkLiAgVGhlIGZpbmFsIGltYWdlIGFmdGVyIGFsbCBzY2FucyBhcmUgY29tcGxldGUgaXMKLWlkZW50aWNhbCB0byB0aGF0IG9mIGEgcmVndWxhciAoc2VxdWVudGlhbCkgSlBFRyBmaWxlIG9mIHRoZSBzYW1lIHF1YWxpdHkKLXNldHRpbmcuICBQcm9ncmVzc2l2ZSBKUEVHIGZpbGVzIGFyZSBvZnRlbiBzbGlnaHRseSBzbWFsbGVyIHRoYW4gZXF1aXZhbGVudAotc2VxdWVudGlhbCBKUEVHIGZpbGVzLCBidXQgdGhlIHBvc3NpYmlsaXR5IG9mIGluY3JlbWVudGFsIGRpc3BsYXkgaXMgdGhlIG1haW4KLXJlYXNvbiBmb3IgdXNpbmcgcHJvZ3Jlc3NpdmUgSlBFRy4KLQotVGhlIElKRyBlbmNvZGVyIGxpYnJhcnkgZ2VuZXJhdGVzIHByb2dyZXNzaXZlIEpQRUcgZmlsZXMgd2hlbiBnaXZlbiBhCi1zdWl0YWJsZSAic2NhbiBzY3JpcHQiIGRlZmluaW5nIGhvdyB0byBkaXZpZGUgdGhlIGRhdGEgaW50byBzY2Fucy4KLUNyZWF0aW9uIG9mIHByb2dyZXNzaXZlIEpQRUcgZmlsZXMgaXMgb3RoZXJ3aXNlIHRyYW5zcGFyZW50IHRvIHRoZSBlbmNvZGVyLgotUHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcyBjYW4gYWxzbyBiZSByZWFkIHRyYW5zcGFyZW50bHkgYnkgdGhlIGRlY29kZXIgbGlicmFyeS4KLUlmIHRoZSBkZWNvZGluZyBhcHBsaWNhdGlvbiBzaW1wbHkgdXNlcyB0aGUgbGlicmFyeSBhcyBkZWZpbmVkIGFib3ZlLCBpdAotd2lsbCByZWNlaXZlIGEgZmluYWwgZGVjb2RlZCBpbWFnZSB3aXRob3V0IGFueSBpbmRpY2F0aW9uIHRoYXQgdGhlIGZpbGUgd2FzCi1wcm9ncmVzc2l2ZS4gIE9mIGNvdXJzZSwgdGhpcyBhcHByb2FjaCBkb2VzIG5vdCBhbGxvdyBpbmNyZW1lbnRhbCBkaXNwbGF5LgotVG8gcGVyZm9ybSBpbmNyZW1lbnRhbCBkaXNwbGF5LCBhbiBhcHBsaWNhdGlvbiBuZWVkcyB0byB1c2UgdGhlIGRlY29kZXIKLWxpYnJhcnkncyAiYnVmZmVyZWQtaW1hZ2UiIG1vZGUsIGluIHdoaWNoIGl0IHJlY2VpdmVzIGEgZGVjb2RlZCBpbWFnZQotbXVsdGlwbGUgdGltZXMuCi0KLUVhY2ggZGlzcGxheWVkIHNjYW4gcmVxdWlyZXMgYWJvdXQgYXMgbXVjaCB3b3JrIHRvIGRlY29kZSBhcyBhIGZ1bGwgSlBFRwotaW1hZ2Ugb2YgdGhlIHNhbWUgc2l6ZSwgc28gdGhlIGRlY29kZXIgbXVzdCBiZSBmYWlybHkgZmFzdCBpbiByZWxhdGlvbiB0byB0aGUKLWRhdGEgdHJhbnNtaXNzaW9uIHJhdGUgaW4gb3JkZXIgdG8gbWFrZSBpbmNyZW1lbnRhbCBkaXNwbGF5IHVzZWZ1bC4gIEhvd2V2ZXIsCi1pdCBpcyBwb3NzaWJsZSB0byBza2lwIGRpc3BsYXlpbmcgdGhlIGltYWdlIGFuZCBzaW1wbHkgYWRkIHRoZSBpbmNvbWluZyBiaXRzCi10byB0aGUgZGVjb2RlcidzIGNvZWZmaWNpZW50IGJ1ZmZlci4gIFRoaXMgaXMgZmFzdCBiZWNhdXNlIG9ubHkgSHVmZm1hbgotZGVjb2RpbmcgbmVlZCBiZSBkb25lLCBub3QgSURDVCwgdXBzYW1wbGluZywgY29sb3JzcGFjZSBjb252ZXJzaW9uLCBldGMuCi1UaGUgSUpHIGRlY29kZXIgbGlicmFyeSBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHN3aXRjaCBkeW5hbWljYWxseSBiZXR3ZWVuCi1kaXNwbGF5aW5nIHRoZSBpbWFnZSBhbmQgc2ltcGx5IGFic29yYmluZyB0aGUgaW5jb21pbmcgYml0cy4gIEEgcHJvcGVybHkKLWNvZGVkIGFwcGxpY2F0aW9uIGNhbiBhdXRvbWF0aWNhbGx5IGFkYXB0IHRoZSBudW1iZXIgb2YgZGlzcGxheSBwYXNzZXMgdG8KLXN1aXQgdGhlIHRpbWUgYXZhaWxhYmxlIGFzIHRoZSBpbWFnZSBpcyByZWNlaXZlZC4gIEFsc28sIGEgZmluYWwKLWhpZ2hlci1xdWFsaXR5IGRpc3BsYXkgY3ljbGUgY2FuIGJlIHBlcmZvcm1lZCBmcm9tIHRoZSBidWZmZXJlZCBkYXRhIGFmdGVyCi10aGUgZW5kIG9mIHRoZSBmaWxlIGlzIHJlYWNoZWQuCi0KLVByb2dyZXNzaXZlIGNvbXByZXNzaW9uOgotCi1UbyBjcmVhdGUgYSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUgKG9yIGEgbXVsdGlwbGUtc2NhbiBzZXF1ZW50aWFsIEpQRUcgZmlsZSksCi1zZXQgdGhlIHNjYW5faW5mbyBjaW5mbyBmaWVsZCB0byBwb2ludCB0byBhbiBhcnJheSBvZiBzY2FuIGRlc2NyaXB0b3JzLCBhbmQKLXBlcmZvcm0gY29tcHJlc3Npb24gYXMgdXN1YWwuICBJbnN0ZWFkIG9mIGNvbnN0cnVjdGluZyB5b3VyIG93biBzY2FuIGxpc3QsCi15b3UgY2FuIGNhbGwgdGhlIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uKCkgaGVscGVyIHJvdXRpbmUgdG8gY3JlYXRlIGEKLXJlY29tbWVuZGVkIHByb2dyZXNzaW9uIHNlcXVlbmNlOyB0aGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBieSBhbGwKLWFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IHdhbnQgdG8gZ2V0IGludm9sdmVkIGluIHRoZSBuaXR0eS1ncml0dHkgb2YKLXByb2dyZXNzaXZlIHNjYW4gc2VxdWVuY2UgZGVzaWduLiAgKElmIHlvdSB3YW50IHRvIHByb3ZpZGUgdXNlciBjb250cm9sIG9mCi1zY2FuIHNlcXVlbmNlcywgeW91IG1heSB3aXNoIHRvIGJvcnJvdyB0aGUgc2NhbiBzY3JpcHQgcmVhZGluZyBjb2RlIGZvdW5kCi1pbiByZHN3aXRjaC5jLCBzbyB0aGF0IHlvdSBjYW4gcmVhZCBzY2FuIHNjcmlwdCBmaWxlcyBqdXN0IGxpa2UgY2pwZWcncy4pCi1XaGVuIHNjYW5faW5mbyBpcyBub3QgTlVMTCwgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgd2lsbCBzdG9yZSBEQ1QnZCBkYXRhCi1pbnRvIGEgYnVmZmVyIGFycmF5IGFzIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkgaXMgY2FsbGVkLCBhbmQgd2lsbCBlbWl0IGFsbAotdGhlIHJlcXVlc3RlZCBzY2FucyBkdXJpbmcganBlZ19maW5pc2hfY29tcHJlc3MoKS4gIFRoaXMgaW1wbGllcyB0aGF0Ci1tdWx0aXBsZS1zY2FuIG91dHB1dCBjYW5ub3QgYmUgY3JlYXRlZCB3aXRoIGEgc3VzcGVuZGluZyBkYXRhIGRlc3RpbmF0aW9uCi1tYW5hZ2VyLCBzaW5jZSBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIGRvZXMgbm90IHN1cHBvcnQgc3VzcGVuc2lvbi4gIFdlCi1zaG91bGQgYWxzbyBub3RlIHRoYXQgdGhlIGNvbXByZXNzb3IgY3VycmVudGx5IGZvcmNlcyBIdWZmbWFuIG9wdGltaXphdGlvbgotbW9kZSB3aGVuIGNyZWF0aW5nIGEgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlLCBiZWNhdXNlIHRoZSBkZWZhdWx0IEh1ZmZtYW4KLXRhYmxlcyBhcmUgdW5zdWl0YWJsZSBmb3IgcHJvZ3Jlc3NpdmUgZmlsZXMuCi0KLVByb2dyZXNzaXZlIGRlY29tcHJlc3Npb246Ci0KLVdoZW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSBpcyBub3QgdXNlZCwgdGhlIGRlY29kZXIgbGlicmFyeSB3aWxsIHJlYWQgYWxsIG9mCi1hIG11bHRpLXNjYW4gZmlsZSBkdXJpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKCksIHNvIHRoYXQgaXQgY2FuIHByb3ZpZGUgYQotZmluYWwgZGVjb2RlZCBpbWFnZS4gIChIZXJlICJtdWx0aS1zY2FuIiBtZWFucyBlaXRoZXIgcHJvZ3Jlc3NpdmUgb3IKLW11bHRpLXNjYW4gc2VxdWVudGlhbC4pICBUaGlzIG1ha2VzIG11bHRpLXNjYW4gZmlsZXMgdHJhbnNwYXJlbnQgdG8gdGhlCi1kZWNvZGluZyBhcHBsaWNhdGlvbi4gIEhvd2V2ZXIsIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHVzZWQgc3VzcGVuZGluZwotaW5wdXQgd2l0aCB2ZXJzaW9uIDUgb2YgdGhlIElKRyBsaWJyYXJ5IHdpbGwgbmVlZCB0byBiZSBtb2RpZmllZCB0byBjaGVjawotZm9yIGEgc3VzcGVuc2lvbiByZXR1cm4gZnJvbSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4KLQotVG8gcGVyZm9ybSBpbmNyZW1lbnRhbCBkaXNwbGF5LCBhbiBhcHBsaWNhdGlvbiBtdXN0IHVzZSB0aGUgbGlicmFyeSdzCi1idWZmZXJlZC1pbWFnZSBtb2RlLiAgVGhpcyBpcyBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4KLQotCi1CdWZmZXJlZC1pbWFnZSBtb2RlCi0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUluIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHRoZSBsaWJyYXJ5IHN0b3JlcyB0aGUgcGFydGlhbGx5IGRlY29kZWQgaW1hZ2UgaW4gYQotY29lZmZpY2llbnQgYnVmZmVyLCBmcm9tIHdoaWNoIGl0IGNhbiBiZSByZWFkIG91dCBhcyBtYW55IHRpbWVzIGFzIGRlc2lyZWQuCi1UaGlzIG1vZGUgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGluY3JlbWVudGFsIGRpc3BsYXkgb2YgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcywKLWJ1dCBpdCBjYW4gYmUgdXNlZCB3aXRoIGFueSBKUEVHIGZpbGUuICBFYWNoIHNjYW4gb2YgYSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUKLWFkZHMgbW9yZSBkYXRhIChtb3JlIGRldGFpbCkgdG8gdGhlIGJ1ZmZlcmVkIGltYWdlLiAgVGhlIGFwcGxpY2F0aW9uIGNhbgotZGlzcGxheSBpbiBsb2Nrc3RlcCB3aXRoIHRoZSBzb3VyY2UgZmlsZSAob25lIGRpc3BsYXkgcGFzcyBwZXIgaW5wdXQgc2NhbiksCi1vciBpdCBjYW4gYWxsb3cgaW5wdXQgcHJvY2Vzc2luZyB0byBvdXRydW4gZGlzcGxheSBwcm9jZXNzaW5nLiAgQnkgbWFraW5nCi1pbnB1dCBhbmQgZGlzcGxheSBwcm9jZXNzaW5nIHJ1biBpbmRlcGVuZGVudGx5LCBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlCi1hcHBsaWNhdGlvbiB0byBhZGFwdCBwcm9ncmVzc2l2ZSBkaXNwbGF5IHRvIGEgd2lkZSByYW5nZSBvZiBkYXRhIHRyYW5zbWlzc2lvbgotcmF0ZXMuCi0KLVRoZSBiYXNpYyBjb250cm9sIGZsb3cgZm9yIGJ1ZmZlcmVkLWltYWdlIGRlY29kaW5nIGlzCi0KLQlqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCkKLQlzZXQgZGF0YSBzb3VyY2UKLQlqcGVnX3JlYWRfaGVhZGVyKCkKLQlzZXQgb3ZlcmFsbCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMKLQljaW5mby5idWZmZXJlZF9pbWFnZSA9IFRSVUU7CS8qIHNlbGVjdCBidWZmZXJlZC1pbWFnZSBtb2RlICovCi0JanBlZ19zdGFydF9kZWNvbXByZXNzKCkKLQlmb3IgKGVhY2ggb3V0cHV0IHBhc3MpIHsKLQkgICAgYWRqdXN0IG91dHB1dCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgaWYgcmVxdWlyZWQKLQkgICAganBlZ19zdGFydF9vdXRwdXQoKQkJLyogc3RhcnQgYSBuZXcgb3V0cHV0IHBhc3MgKi8KLQkgICAgZm9yIChhbGwgc2NhbmxpbmVzIGluIGltYWdlKSB7Ci0JICAgICAgICBqcGVnX3JlYWRfc2NhbmxpbmVzKCkKLQkgICAgICAgIGRpc3BsYXkgc2NhbmxpbmVzCi0JICAgIH0KLQkgICAganBlZ19maW5pc2hfb3V0cHV0KCkJLyogdGVybWluYXRlIG91dHB1dCBwYXNzICovCi0JfQotCWpwZWdfZmluaXNoX2RlY29tcHJlc3MoKQotCWpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCkKLQotVGhpcyBkaWZmZXJzIGZyb20gb3JkaW5hcnkgdW5idWZmZXJlZCBkZWNvZGluZyBpbiB0aGF0IHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwKLWxldmVsIG9mIGxvb3BpbmcuICBUaGUgYXBwbGljYXRpb24gY2FuIGNob29zZSBob3cgbWFueSBvdXRwdXQgcGFzc2VzIHRvIG1ha2UKLWFuZCBob3cgdG8gZGlzcGxheSBlYWNoIHBhc3MuCi0KLVRoZSBzaW1wbGVzdCBhcHByb2FjaCB0byBkaXNwbGF5aW5nIHByb2dyZXNzaXZlIGltYWdlcyBpcyB0byBkbyBvbmUgZGlzcGxheQotcGFzcyBmb3IgZWFjaCBzY2FuIGFwcGVhcmluZyBpbiB0aGUgaW5wdXQgZmlsZS4gIEluIHRoaXMgY2FzZSB0aGUgb3V0ZXIgbG9vcAotY29uZGl0aW9uIGlzIHR5cGljYWxseQotCXdoaWxlICghIGpwZWdfaW5wdXRfY29tcGxldGUoJmNpbmZvKSkKLWFuZCB0aGUgc3RhcnQtb3V0cHV0IGNhbGwgc2hvdWxkIHJlYWQKLQlqcGVnX3N0YXJ0X291dHB1dCgmY2luZm8sIGNpbmZvLmlucHV0X3NjYW5fbnVtYmVyKTsKLVRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIGpwZWdfc3RhcnRfb3V0cHV0KCkgaW5kaWNhdGVzIHdoaWNoIHNjYW4gb2YgdGhlIGlucHV0Ci1maWxlIGlzIHRvIGJlIGRpc3BsYXllZDsgdGhlIHNjYW5zIGFyZSBudW1iZXJlZCBzdGFydGluZyBhdCAxIGZvciB0aGlzCi1wdXJwb3NlLiAgKFlvdSBjYW4gdXNlIGEgbG9vcCBjb3VudGVyIHN0YXJ0aW5nIGF0IDEgaWYgeW91IGxpa2UsIGJ1dCB1c2luZwotdGhlIGxpYnJhcnkncyBpbnB1dCBzY2FuIGNvdW50ZXIgaXMgZWFzaWVyLikgIFRoZSBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgcmVhZHMKLWRhdGEgYXMgbmVjZXNzYXJ5IHRvIGNvbXBsZXRlIGVhY2ggcmVxdWVzdGVkIHNjYW4sIGFuZCBqcGVnX2ZpbmlzaF9vdXRwdXQoKQotYWR2YW5jZXMgdG8gdGhlIG5leHQgc2NhbiBvciBlbmQtb2YtaW1hZ2UgbWFya2VyIChoZW5jZSBpbnB1dF9zY2FuX251bWJlcgotd2lsbCBiZSBpbmNyZW1lbnRlZCBieSB0aGUgdGltZSBjb250cm9sIGFycml2ZXMgYmFjayBhdCBqcGVnX3N0YXJ0X291dHB1dCgpKS4KLVdpdGggdGhpcyB0ZWNobmlxdWUsIGRhdGEgaXMgcmVhZCBmcm9tIHRoZSBpbnB1dCBmaWxlIG9ubHkgYXMgbmVlZGVkLCBhbmQKLWlucHV0IGFuZCBvdXRwdXQgcHJvY2Vzc2luZyBydW4gaW4gbG9ja3N0ZXAuCi0KLUFmdGVyIHJlYWRpbmcgdGhlIGZpbmFsIHNjYW4gYW5kIHJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUsIHRoZQotYnVmZmVyZWQgaW1hZ2UgcmVtYWlucyBhdmFpbGFibGU7IGl0IGNhbiBiZSByZWFkIGFkZGl0aW9uYWwgdGltZXMgYnkKLXJlcGVhdGluZyB0aGUganBlZ19zdGFydF9vdXRwdXQoKS9qcGVnX3JlYWRfc2NhbmxpbmVzKCkvanBlZ19maW5pc2hfb3V0cHV0KCkKLXNlcXVlbmNlLiAgRm9yIGV4YW1wbGUsIGEgdXNlZnVsIHRlY2huaXF1ZSBpcyB0byB1c2UgZmFzdCBvbmUtcGFzcyBjb2xvcgotcXVhbnRpemF0aW9uIGZvciBkaXNwbGF5IHBhc3NlcyBtYWRlIHdoaWxlIHRoZSBpbWFnZSBpcyBhcnJpdmluZywgZm9sbG93ZWQgYnkKLWEgZmluYWwgZGlzcGxheSBwYXNzIHVzaW5nIHR3by1wYXNzIHF1YW50aXphdGlvbiBmb3IgaGlnaGVzdCBxdWFsaXR5LiAgVGhpcwotaXMgZG9uZSBieSBjaGFuZ2luZyB0aGUgbGlicmFyeSBwYXJhbWV0ZXJzIGJlZm9yZSB0aGUgZmluYWwgb3V0cHV0IHBhc3MuCi1DaGFuZ2luZyBwYXJhbWV0ZXJzIGJldHdlZW4gcGFzc2VzIGlzIGRpc2N1c3NlZCBpbiBkZXRhaWwgYmVsb3cuCi0KLUluIGdlbmVyYWwgdGhlIGxhc3Qgc2NhbiBvZiBhIHByb2dyZXNzaXZlIGZpbGUgY2Fubm90IGJlIHJlY29nbml6ZWQgYXMgc3VjaAotdW50aWwgYWZ0ZXIgaXQgaXMgcmVhZCwgc28gYSBwb3N0LWlucHV0IGRpc3BsYXkgcGFzcyBpcyB0aGUgYmVzdCBhcHByb2FjaCBpZgoteW91IHdhbnQgc3BlY2lhbCBwcm9jZXNzaW5nIGluIHRoZSBmaW5hbCBwYXNzLgotCi1XaGVuIGRvbmUgd2l0aCB0aGUgaW1hZ2UsIGJlIHN1cmUgdG8gY2FsbCBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgdG8gcmVsZWFzZQotdGhlIGJ1ZmZlcmVkIGltYWdlIChvciBqdXN0IHVzZSBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygpKS4KLQotSWYgaW5wdXQgZGF0YSBhcnJpdmVzIGZhc3RlciB0aGFuIGl0IGNhbiBiZSBkaXNwbGF5ZWQsIHRoZSBhcHBsaWNhdGlvbiBjYW4KLWNhdXNlIHRoZSBsaWJyYXJ5IHRvIGRlY29kZSBpbnB1dCBkYXRhIGluIGFkdmFuY2Ugb2Ygd2hhdCdzIG5lZWRlZCB0byBwcm9kdWNlCi1vdXRwdXQuICBUaGlzIGlzIGRvbmUgYnkgY2FsbGluZyB0aGUgcm91dGluZSBqcGVnX2NvbnN1bWVfaW5wdXQoKS4KLVRoZSByZXR1cm4gdmFsdWUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JSlBFR19SRUFDSEVEX1NPUzogICAgcmVhY2hlZCBhbiBTT1MgbWFya2VyICh0aGUgc3RhcnQgb2YgYSBuZXcgc2NhbikKLQlKUEVHX1JFQUNIRURfRU9JOiAgICByZWFjaGVkIHRoZSBFT0kgbWFya2VyIChlbmQgb2YgaW1hZ2UpCi0JSlBFR19ST1dfQ09NUExFVEVEOiAgY29tcGxldGVkIHJlYWRpbmcgb25lIE1DVSByb3cgb2YgY29tcHJlc3NlZCBkYXRhCi0JSlBFR19TQ0FOX0NPTVBMRVRFRDogY29tcGxldGVkIHJlYWRpbmcgbGFzdCBNQ1Ugcm93IG9mIGN1cnJlbnQgc2NhbgotCUpQRUdfU1VTUEVOREVEOiAgICAgIHN1c3BlbmRlZCBiZWZvcmUgY29tcGxldGluZyBhbnkgb2YgdGhlIGFib3ZlCi0oSlBFR19TVVNQRU5ERUQgY2FuIG9jY3VyIG9ubHkgaWYgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQuKSAgVGhpcwotcm91dGluZSBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIGluaXRpYWxpemluZyB0aGUgSlBFRyBvYmplY3QuICBJdAotcmVhZHMgc29tZSBhZGRpdGlvbmFsIGRhdGEgYW5kIHJldHVybnMgd2hlbiBvbmUgb2YgdGhlIGluZGljYXRlZCBzaWduaWZpY2FudAotZXZlbnRzIG9jY3Vycy4gIChJZiBjYWxsZWQgYWZ0ZXIgdGhlIEVPSSBtYXJrZXIgaXMgcmVhY2hlZCwgaXQgd2lsbAotaW1tZWRpYXRlbHkgcmV0dXJuIEpQRUdfUkVBQ0hFRF9FT0kgd2l0aG91dCBhdHRlbXB0aW5nIHRvIHJlYWQgbW9yZSBkYXRhLikKLQotVGhlIGxpYnJhcnkncyBvdXRwdXQgcHJvY2Vzc2luZyB3aWxsIGF1dG9tYXRpY2FsbHkgY2FsbCBqcGVnX2NvbnN1bWVfaW5wdXQoKQotd2hlbmV2ZXIgdGhlIG91dHB1dCBwcm9jZXNzaW5nIG92ZXJ0YWtlcyB0aGUgaW5wdXQ7IHRodXMsIHNpbXBsZSBsb2Nrc3RlcAotZGlzcGxheSByZXF1aXJlcyBubyBkaXJlY3QgY2FsbHMgdG8ganBlZ19jb25zdW1lX2lucHV0KCkuICBCdXQgYnkgYWRkaW5nCi1jYWxscyB0byBqcGVnX2NvbnN1bWVfaW5wdXQoKSwgeW91IGNhbiBhYnNvcmIgZGF0YSBpbiBhZHZhbmNlIG9mIHdoYXQgaXMKLWJlaW5nIGRpc3BsYXllZC4gIFRoaXMgaGFzIHR3byBiZW5lZml0czoKLSAgKiBZb3UgY2FuIGxpbWl0IGJ1aWxkdXAgb2YgdW5wcm9jZXNzZWQgZGF0YSBpbiB5b3VyIGlucHV0IGJ1ZmZlci4KLSAgKiBZb3UgY2FuIGVsaW1pbmF0ZSBleHRyYSBkaXNwbGF5IHBhc3NlcyBieSBwYXlpbmcgYXR0ZW50aW9uIHRvIHRoZQotICAgIHN0YXRlIG9mIHRoZSBsaWJyYXJ5J3MgaW5wdXQgcHJvY2Vzc2luZy4KLQotVGhlIGZpcnN0IG9mIHRoZXNlIGJlbmVmaXRzIG9ubHkgcmVxdWlyZXMgaW50ZXJzcGVyc2luZyBjYWxscyB0bwotanBlZ19jb25zdW1lX2lucHV0KCkgd2l0aCB5b3VyIGRpc3BsYXkgb3BlcmF0aW9ucyBhbmQgYW55IG90aGVyIHByb2Nlc3NpbmcKLXlvdSBtYXkgYmUgZG9pbmcuICBUbyBhdm9pZCB3YXN0aW5nIGN5Y2xlcyBkdWUgdG8gYmFja3RyYWNraW5nLCBpdCdzIGJlc3QgdG8KLWNhbGwganBlZ19jb25zdW1lX2lucHV0KCkgb25seSBhZnRlciBhIGh1bmRyZWQgb3Igc28gbmV3IGJ5dGVzIGhhdmUgYXJyaXZlZC4KLVRoaXMgaXMgZGlzY3Vzc2VkIGZ1cnRoZXIgdW5kZXIgIkkvTyBzdXNwZW5zaW9uIiwgYWJvdmUuICAoTm90ZTogdGhlIEpQRUcKLWxpYnJhcnkgY3VycmVudGx5IGlzIG5vdCB0aHJlYWQtc2FmZS4gIFlvdSBtdXN0IG5vdCBjYWxsIGpwZWdfY29uc3VtZV9pbnB1dCgpCi1mcm9tIG9uZSB0aHJlYWQgb2YgY29udHJvbCBpZiBhIGRpZmZlcmVudCBsaWJyYXJ5IHJvdXRpbmUgaXMgd29ya2luZyBvbiB0aGUKLXNhbWUgSlBFRyBvYmplY3QgaW4gYW5vdGhlciB0aHJlYWQuKQotCi1XaGVuIGlucHV0IGFycml2ZXMgZmFzdCBlbm91Z2ggdGhhdCBtb3JlIHRoYW4gb25lIG5ldyBzY2FuIGlzIGF2YWlsYWJsZQotYmVmb3JlIHlvdSBzdGFydCBhIG5ldyBvdXRwdXQgcGFzcywgeW91IG1heSBhcyB3ZWxsIHNraXAgdGhlIG91dHB1dCBwYXNzCi1jb3JyZXNwb25kaW5nIHRvIHRoZSBjb21wbGV0ZWQgc2Nhbi4gIFRoaXMgb2NjdXJzIGZvciBmcmVlIGlmIHlvdSBwYXNzCi1jaW5mby5pbnB1dF9zY2FuX251bWJlciBhcyB0aGUgdGFyZ2V0IHNjYW4gbnVtYmVyIHRvIGpwZWdfc3RhcnRfb3V0cHV0KCkuCi1UaGUgaW5wdXRfc2Nhbl9udW1iZXIgZmllbGQgaXMgc2ltcGx5IHRoZSBpbmRleCBvZiB0aGUgc2NhbiBjdXJyZW50bHkgYmVpbmcKLWNvbnN1bWVkIGJ5IHRoZSBpbnB1dCBwcm9jZXNzb3IuICBZb3UgY2FuIGVuc3VyZSB0aGF0IHRoaXMgaXMgdXAtdG8tZGF0ZSBieQotZW1wdHlpbmcgdGhlIGlucHV0IGJ1ZmZlciBqdXN0IGJlZm9yZSBjYWxsaW5nIGpwZWdfc3RhcnRfb3V0cHV0KCk6IGNhbGwKLWpwZWdfY29uc3VtZV9pbnB1dCgpIHJlcGVhdGVkbHkgdW50aWwgaXQgcmV0dXJucyBKUEVHX1NVU1BFTkRFRCBvcgotSlBFR19SRUFDSEVEX0VPSS4KLQotVGhlIHRhcmdldCBzY2FuIG51bWJlciBwYXNzZWQgdG8ganBlZ19zdGFydF9vdXRwdXQoKSBpcyBzYXZlZCBpbiB0aGUKLWNpbmZvLm91dHB1dF9zY2FuX251bWJlciBmaWVsZC4gIFRoZSBsaWJyYXJ5J3Mgb3V0cHV0IHByb2Nlc3NpbmcgY2FsbHMKLWpwZWdfY29uc3VtZV9pbnB1dCgpIHdoZW5ldmVyIHRoZSBjdXJyZW50IGlucHV0IHNjYW4gbnVtYmVyIGFuZCByb3cgd2l0aGluCi10aGF0IHNjYW4gaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IG91dHB1dCBzY2FuIG51bWJlciBhbmQgcm93LgotVGh1cywgaW5wdXQgcHJvY2Vzc2luZyBjYW4gImdldCBhaGVhZCIgb2YgdGhlIG91dHB1dCBwcm9jZXNzaW5nIGJ1dCBpcyBub3QKLWFsbG93ZWQgdG8gImZhbGwgYmVoaW5kIi4gIFlvdSBjYW4gYWNoaWV2ZSBzZXZlcmFsIGRpZmZlcmVudCBlZmZlY3RzIGJ5Ci1tYW5pcHVsYXRpbmcgdGhpcyBpbnRlcmxvY2sgcnVsZS4gIEZvciBleGFtcGxlLCBpZiB5b3UgcGFzcyBhIHRhcmdldCBzY2FuCi1udW1iZXIgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGlucHV0IHNjYW4gbnVtYmVyLCB0aGUgb3V0cHV0IHByb2Nlc3NvciB3aWxsCi13YWl0IHVudGlsIHRoYXQgc2NhbiBzdGFydHMgdG8gYXJyaXZlIGJlZm9yZSBwcm9kdWNpbmcgYW55IG91dHB1dC4gIChUbyBhdm9pZAotYW4gaW5maW5pdGUgbG9vcCwgdGhlIHRhcmdldCBzY2FuIG51bWJlciBpcyBhdXRvbWF0aWNhbGx5IHJlc2V0IHRvIHRoZSBsYXN0Ci1zY2FuIG51bWJlciB3aGVuIHRoZSBlbmQgb2YgaW1hZ2UgaXMgcmVhY2hlZC4gIFRodXMsIGlmIHlvdSBzcGVjaWZ5IGEgbGFyZ2UKLXRhcmdldCBzY2FuIG51bWJlciwgdGhlIGxpYnJhcnkgd2lsbCBqdXN0IGFic29yYiB0aGUgZW50aXJlIGlucHV0IGZpbGUgYW5kCi10aGVuIHBlcmZvcm0gYW4gb3V0cHV0IHBhc3MuICBUaGlzIGlzIGVmZmVjdGl2ZWx5IHRoZSBzYW1lIGFzIHdoYXQKLWpwZWdfc3RhcnRfZGVjb21wcmVzcygpIGRvZXMgd2hlbiB5b3UgZG9uJ3Qgc2VsZWN0IGJ1ZmZlcmVkLWltYWdlIG1vZGUuKQotV2hlbiB5b3UgcGFzcyBhIHRhcmdldCBzY2FuIG51bWJlciBlcXVhbCB0byB0aGUgY3VycmVudCBpbnB1dCBzY2FuIG51bWJlciwKLXRoZSBpbWFnZSBpcyBkaXNwbGF5ZWQgbm8gZmFzdGVyIHRoYW4gdGhlIGN1cnJlbnQgaW5wdXQgc2NhbiBhcnJpdmVzLiAgVGhlCi1maW5hbCBwb3NzaWJpbGl0eSBpcyB0byBwYXNzIGEgdGFyZ2V0IHNjYW4gbnVtYmVyIGxlc3MgdGhhbiB0aGUgY3VycmVudCBpbnB1dAotc2NhbiBudW1iZXI7IHRoaXMgZGlzYWJsZXMgdGhlIGlucHV0L291dHB1dCBpbnRlcmxvY2sgYW5kIGNhdXNlcyB0aGUgb3V0cHV0Ci1wcm9jZXNzb3IgdG8gc2ltcGx5IGRpc3BsYXkgd2hhdGV2ZXIgaXQgZmluZHMgaW4gdGhlIGltYWdlIGJ1ZmZlciwgd2l0aG91dAotd2FpdGluZyBmb3IgaW5wdXQuICAoSG93ZXZlciwgdGhlIGxpYnJhcnkgd2lsbCBub3QgYWNjZXB0IGEgdGFyZ2V0IHNjYW4KLW51bWJlciBsZXNzIHRoYW4gb25lLCBzbyB5b3UgY2FuJ3QgYXZvaWQgd2FpdGluZyBmb3IgdGhlIGZpcnN0IHNjYW4uKQotCi1XaGVuIGRhdGEgaXMgYXJyaXZpbmcgZmFzdGVyIHRoYW4gdGhlIG91dHB1dCBkaXNwbGF5IHByb2Nlc3NpbmcgY2FuIGFkdmFuY2UKLXRocm91Z2ggdGhlIGltYWdlLCBqcGVnX2NvbnN1bWVfaW5wdXQoKSB3aWxsIHN0b3JlIGRhdGEgaW50byB0aGUgYnVmZmVyZWQKLWltYWdlIGJleW9uZCB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIG91dHB1dCBwcm9jZXNzaW5nIGlzIHJlYWRpbmcgZGF0YSBvdXQKLWFnYWluLiAgSWYgdGhlIGlucHV0IGFycml2ZXMgZmFzdCBlbm91Z2gsIGl0IG1heSAid3JhcCBhcm91bmQiIHRoZSBidWZmZXIgdG8KLXRoZSBwb2ludCB3aGVyZSB0aGUgaW5wdXQgaXMgbW9yZSB0aGFuIG9uZSB3aG9sZSBzY2FuIGFoZWFkIG9mIHRoZSBvdXRwdXQuCi1JZiB0aGUgb3V0cHV0IHByb2Nlc3Npbmcgc2ltcGx5IHByb2NlZWRzIHRocm91Z2ggaXRzIGRpc3BsYXkgcGFzcyB3aXRob3V0Ci1wYXlpbmcgYXR0ZW50aW9uIHRvIHRoZSBpbnB1dCwgdGhlIGVmZmVjdCBzZWVuIG9uLXNjcmVlbiBpcyB0aGF0IHRoZSBsb3dlcgotcGFydCBvZiB0aGUgaW1hZ2UgaXMgb25lIG9yIG1vcmUgc2NhbnMgYmV0dGVyIGluIHF1YWxpdHkgdGhhbiB0aGUgdXBwZXIgcGFydC4KLVRoZW4sIHdoZW4gdGhlIG5leHQgb3V0cHV0IHNjYW4gaXMgc3RhcnRlZCwgeW91IGhhdmUgYSBjaG9pY2Ugb2Ygd2hhdCB0YXJnZXQKLXNjYW4gbnVtYmVyIHRvIHVzZS4gIFRoZSByZWNvbW1lbmRlZCBjaG9pY2UgaXMgdG8gdXNlIHRoZSBjdXJyZW50IGlucHV0IHNjYW4KLW51bWJlciBhdCB0aGF0IHRpbWUsIHdoaWNoIGltcGxpZXMgdGhhdCB5b3UndmUgc2tpcHBlZCB0aGUgb3V0cHV0IHNjYW5zCi1jb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBzY2FucyB0aGF0IHdlcmUgY29tcGxldGVkIHdoaWxlIHlvdSBwcm9jZXNzZWQgdGhlCi1wcmV2aW91cyBvdXRwdXQgc2Nhbi4gIEluIHRoaXMgd2F5LCB0aGUgZGVjb2RlciBhdXRvbWF0aWNhbGx5IGFkYXB0cyBpdHMKLXNwZWVkIHRvIHRoZSBhcnJpdmluZyBkYXRhLCBieSBza2lwcGluZyBvdXRwdXQgc2NhbnMgYXMgbmVjZXNzYXJ5IHRvIGtlZXAgdXAKLXdpdGggdGhlIGFycml2aW5nIGRhdGEuCi0KLVdoZW4gdXNpbmcgdGhpcyBzdHJhdGVneSwgeW91J2xsIHdhbnQgdG8gYmUgc3VyZSB0aGF0IHlvdSBwZXJmb3JtIGEgZmluYWwKLW91dHB1dCBwYXNzIGFmdGVyIHJlY2VpdmluZyBhbGwgdGhlIGRhdGE7IG90aGVyd2lzZSB5b3VyIGxhc3QgZGlzcGxheSBtYXkgbm90Ci1iZSBmdWxsIHF1YWxpdHkgYWNyb3NzIHRoZSB3aG9sZSBzY3JlZW4uICBTbyB0aGUgcmlnaHQgb3V0ZXIgbG9vcCBsb2dpYyBpcwotc29tZXRoaW5nIGxpa2UgdGhpczoKLQlkbyB7Ci0JICAgIGFic29yYiBhbnkgd2FpdGluZyBpbnB1dCBieSBjYWxsaW5nIGpwZWdfY29uc3VtZV9pbnB1dCgpCi0JICAgIGZpbmFsX3Bhc3MgPSBqcGVnX2lucHV0X2NvbXBsZXRlKCZjaW5mbyk7Ci0JICAgIGFkanVzdCBvdXRwdXQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGlmIHJlcXVpcmVkCi0JICAgIGpwZWdfc3RhcnRfb3V0cHV0KCZjaW5mbywgY2luZm8uaW5wdXRfc2Nhbl9udW1iZXIpOwotCSAgICAuLi4KLQkgICAganBlZ19maW5pc2hfb3V0cHV0KCkKLQl9IHdoaWxlICghIGZpbmFsX3Bhc3MpOwotcmF0aGVyIHRoYW4gcXVpdHRpbmcgYXMgc29vbiBhcyBqcGVnX2lucHV0X2NvbXBsZXRlKCkgcmV0dXJucyBUUlVFLiAgVGhpcwotYXJyYW5nZW1lbnQgbWFrZXMgaXQgc2ltcGxlIHRvIHVzZSBoaWdoZXItcXVhbGl0eSBkZWNvZGluZyBwYXJhbWV0ZXJzCi1mb3IgdGhlIGZpbmFsIHBhc3MuICBCdXQgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHNwZWNpYWwgcGFyYW1ldGVycyBmb3IKLXRoZSBmaW5hbCBwYXNzLCB0aGUgcmlnaHQgbG9vcCBsb2dpYyBpcyBsaWtlIHRoaXM6Ci0JZm9yICg7OykgewotCSAgICBhYnNvcmIgYW55IHdhaXRpbmcgaW5wdXQgYnkgY2FsbGluZyBqcGVnX2NvbnN1bWVfaW5wdXQoKQotCSAgICBqcGVnX3N0YXJ0X291dHB1dCgmY2luZm8sIGNpbmZvLmlucHV0X3NjYW5fbnVtYmVyKTsKLQkgICAgLi4uCi0JICAgIGpwZWdfZmluaXNoX291dHB1dCgpCi0JICAgIGlmIChqcGVnX2lucHV0X2NvbXBsZXRlKCZjaW5mbykgJiYKLQkgICAgICAgIGNpbmZvLmlucHV0X3NjYW5fbnVtYmVyID09IGNpbmZvLm91dHB1dF9zY2FuX251bWJlcikKLQkgICAgICBicmVhazsKLQl9Ci1JbiB0aGlzIGNhc2UgeW91IGRvbid0IG5lZWQgdG8ga25vdyBpbiBhZHZhbmNlIHdoZXRoZXIgYW4gb3V0cHV0IHBhc3MgaXMgdG8KLWJlIHRoZSBsYXN0IG9uZSwgc28gaXQncyBub3QgbmVjZXNzYXJ5IHRvIGhhdmUgcmVhY2hlZCBFT0YgYmVmb3JlIHN0YXJ0aW5nCi10aGUgZmluYWwgb3V0cHV0IHBhc3M7IHJhdGhlciwgd2hhdCB5b3Ugd2FudCB0byB0ZXN0IGlzIHdoZXRoZXIgdGhlIG91dHB1dAotcGFzcyB3YXMgcGVyZm9ybWVkIGluIHN5bmMgd2l0aCB0aGUgZmluYWwgaW5wdXQgc2Nhbi4gIFRoaXMgZm9ybSBvZiB0aGUgbG9vcAotd2lsbCBhdm9pZCBhbiBleHRyYSBvdXRwdXQgcGFzcyB3aGVuZXZlciB0aGUgZGVjb2RlciBpcyBhYmxlIChvciBuZWFybHkgYWJsZSkKLXRvIGtlZXAgdXAgd2l0aCB0aGUgaW5jb21pbmcgZGF0YS4KLQotV2hlbiB0aGUgZGF0YSB0cmFuc21pc3Npb24gc3BlZWQgaXMgaGlnaCwgeW91IG1pZ2h0IGJlZ2luIGEgZGlzcGxheSBwYXNzLAotdGhlbiBmaW5kIHRoYXQgbXVjaCBvciBhbGwgb2YgdGhlIGZpbGUgaGFzIGFycml2ZWQgYmVmb3JlIHlvdSBjYW4gY29tcGxldGUKLXRoZSBwYXNzLiAgKFlvdSBjYW4gZGV0ZWN0IHRoaXMgYnkgbm90aW5nIHRoZSBKUEVHX1JFQUNIRURfRU9JIHJldHVybiBjb2RlCi1mcm9tIGpwZWdfY29uc3VtZV9pbnB1dCgpLCBvciBlcXVpdmFsZW50bHkgYnkgdGVzdGluZyBqcGVnX2lucHV0X2NvbXBsZXRlKCkuKQotSW4gdGhpcyBzaXR1YXRpb24geW91IG1heSB3aXNoIHRvIGFib3J0IHRoZSBjdXJyZW50IGRpc3BsYXkgcGFzcyBhbmQgc3RhcnQgYQotbmV3IG9uZSB1c2luZyB0aGUgbmV3bHkgYXJyaXZlZCBpbmZvcm1hdGlvbi4gIFRvIGRvIHNvLCBqdXN0IGNhbGwKLWpwZWdfZmluaXNoX291dHB1dCgpIGFuZCB0aGVuIHN0YXJ0IGEgbmV3IHBhc3Mgd2l0aCBqcGVnX3N0YXJ0X291dHB1dCgpLgotCi1BIHZhcmlhbnQgc3RyYXRlZ3kgaXMgdG8gYWJvcnQgYW5kIHJlc3RhcnQgZGlzcGxheSBpZiBtb3JlIHRoYW4gb25lIGNvbXBsZXRlCi1zY2FuIGFycml2ZXMgZHVyaW5nIGFuIG91dHB1dCBwYXNzOyB0aGlzIGNhbiBiZSBkZXRlY3RlZCBieSBub3RpbmcKLUpQRUdfUkVBQ0hFRF9TT1MgcmV0dXJucyBhbmQvb3IgZXhhbWluaW5nIGNpbmZvLmlucHV0X3NjYW5fbnVtYmVyLiAgVGhpcwotaWRlYSBzaG91bGQgYmUgZW1wbG95ZWQgd2l0aCBjYXV0aW9uLCBob3dldmVyLCBzaW5jZSB0aGUgZGlzcGxheSBwcm9jZXNzCi1taWdodCBuZXZlciBnZXQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UgYmVmb3JlIGJlaW5nIGFib3J0ZWQsIHJlc3VsdGluZwotaW4gdGhlIGxvd2VyIHBhcnQgb2YgdGhlIHNjcmVlbiBiZWluZyBzZXZlcmFsIHBhc3NlcyB3b3JzZSB0aGFuIHRoZSB1cHBlci4KLUluIG1vc3QgY2FzZXMgaXQncyBwcm9iYWJseSBiZXN0IHRvIGFib3J0IGFuIG91dHB1dCBwYXNzIG9ubHkgaWYgdGhlIHdob2xlCi1maWxlIGhhcyBhcnJpdmVkIGFuZCB5b3Ugd2FudCB0byBiZWdpbiB0aGUgZmluYWwgb3V0cHV0IHBhc3MgaW1tZWRpYXRlbHkuCi0KLVdoZW4gcmVjZWl2aW5nIGRhdGEgYWNyb3NzIGEgY29tbXVuaWNhdGlvbiBsaW5rLCB3ZSByZWNvbW1lbmQgYWx3YXlzIHVzaW5nCi10aGUgY3VycmVudCBpbnB1dCBzY2FuIG51bWJlciBmb3IgdGhlIG91dHB1dCB0YXJnZXQgc2NhbiBudW1iZXI7IGlmIGEKLWhpZ2hlci1xdWFsaXR5IGZpbmFsIHBhc3MgaXMgdG8gYmUgZG9uZSwgaXQgc2hvdWxkIGJlIHN0YXJ0ZWQgKGFib3J0aW5nIGFueQotaW5jb21wbGV0ZSBvdXRwdXQgcGFzcykgYXMgc29vbiBhcyB0aGUgZW5kIG9mIGZpbGUgaXMgcmVjZWl2ZWQuICBIb3dldmVyLAotbWFueSBvdGhlciBzdHJhdGVnaWVzIGFyZSBwb3NzaWJsZS4gIEZvciBleGFtcGxlLCB0aGUgYXBwbGljYXRpb24gY2FuIGV4YW1pbmUKLXRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBjdXJyZW50IGlucHV0IHNjYW4gYW5kIGRlY2lkZSB3aGV0aGVyIHRvIGRpc3BsYXkgaXQgb3IKLW5vdC4gIElmIHRoZSBzY2FuIGNvbnRhaW5zIG9ubHkgY2hyb21hIGRhdGEsIG9uZSBtaWdodCBjaG9vc2Ugbm90IHRvIHVzZSBpdAotYXMgdGhlIHRhcmdldCBzY2FuLCBleHBlY3RpbmcgdGhhdCB0aGUgc2NhbiB3aWxsIGJlIHNtYWxsIGFuZCB3aWxsIGFycml2ZQotcXVpY2tseS4gIFRvIHNraXAgdG8gdGhlIG5leHQgc2NhbiwgY2FsbCBqcGVnX2NvbnN1bWVfaW5wdXQoKSB1bnRpbCBpdAotcmV0dXJucyBKUEVHX1JFQUNIRURfU09TIG9yIEpQRUdfUkVBQ0hFRF9FT0kuICBPciBqdXN0IHVzZSB0aGUgbmV4dCBoaWdoZXIKLW51bWJlciBhcyB0aGUgdGFyZ2V0IHNjYW4gZm9yIGpwZWdfc3RhcnRfb3V0cHV0KCk7IGJ1dCB0aGF0IG1ldGhvZCBkb2Vzbid0Ci1sZXQgeW91IGluc3BlY3QgdGhlIG5leHQgc2NhbidzIHBhcmFtZXRlcnMgYmVmb3JlIGRlY2lkaW5nIHRvIGRpc3BsYXkgaXQuCi0KLQotSW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSwganBlZ19zdGFydF9kZWNvbXByZXNzKCkgbmV2ZXIgcGVyZm9ybXMgaW5wdXQgYW5kCi10aHVzIG5ldmVyIHN1c3BlbmRzLiAgQW4gYXBwbGljYXRpb24gdGhhdCB1c2VzIGlucHV0IHN1c3BlbnNpb24gd2l0aAotYnVmZmVyZWQtaW1hZ2UgbW9kZSBtdXN0IGJlIHByZXBhcmVkIGZvciBzdXNwZW5zaW9uIHJldHVybnMgZnJvbSB0aGVzZQotcm91dGluZXM6Ci0qIGpwZWdfc3RhcnRfb3V0cHV0KCkgcGVyZm9ybXMgaW5wdXQgb25seSBpZiB5b3UgcmVxdWVzdCAyLXBhc3MgcXVhbnRpemF0aW9uCi0gIGFuZCB0aGUgdGFyZ2V0IHNjYW4gaXNuJ3QgZnVsbHkgcmVhZCB5ZXQuICAoVGhpcyBpcyBkaXNjdXNzZWQgYmVsb3cuKQotKiBqcGVnX3JlYWRfc2NhbmxpbmVzKCksIGFzIGFsd2F5cywgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNjYW5saW5lcyB0aGF0IGl0Ci0gIHdhcyBhYmxlIHRvIHByb2R1Y2UgYmVmb3JlIHN1c3BlbmRpbmcuCi0qIGpwZWdfZmluaXNoX291dHB1dCgpIHdpbGwgcmVhZCBhbnkgbWFya2VycyBmb2xsb3dpbmcgdGhlIHRhcmdldCBzY2FuLAotICB1cCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIG9yIHRoZSBTT1MgbWFya2VyIHRoYXQgYmVnaW5zIGFub3RoZXIgc2Nhbi4KLSAgKEJ1dCBpdCByZWFkcyBubyBpbnB1dCBpZiBqcGVnX2NvbnN1bWVfaW5wdXQoKSBoYXMgYWxyZWFkeSByZWFjaGVkIHRoZQotICBlbmQgb2YgdGhlIGZpbGUgb3IgYSBTT1MgbWFya2VyIGJleW9uZCB0aGUgdGFyZ2V0IG91dHB1dCBzY2FuLikKLSoganBlZ19maW5pc2hfZGVjb21wcmVzcygpIHdpbGwgcmVhZCB1bnRpbCB0aGUgZW5kIG9mIGZpbGUsIGFuZCB0aHVzIGNhbgotICBzdXNwZW5kIGlmIHRoZSBlbmQgaGFzbid0IGFscmVhZHkgYmVlbiByZWFjaGVkIChhcyBjYW4gYmUgdGVzdGVkIGJ5Ci0gIGNhbGxpbmcganBlZ19pbnB1dF9jb21wbGV0ZSgpKS4KLWpwZWdfc3RhcnRfb3V0cHV0KCksIGpwZWdfZmluaXNoX291dHB1dCgpLCBhbmQganBlZ19maW5pc2hfZGVjb21wcmVzcygpCi1hbGwgcmV0dXJuIFRSVUUgaWYgdGhleSBjb21wbGV0ZWQgdGhlaXIgdGFza3MsIEZBTFNFIGlmIHRoZXkgaGFkIHRvIHN1c3BlbmQuCi1JbiB0aGUgZXZlbnQgb2YgYSBGQUxTRSByZXR1cm4sIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGxvYWQgbW9yZSBpbnB1dCBkYXRhCi1hbmQgcmVwZWF0IHRoZSBjYWxsLiAgQXBwbGljYXRpb25zIHRoYXQgdXNlIG5vbi1zdXNwZW5kaW5nIGRhdGEgc291cmNlcyBuZWVkCi1ub3QgY2hlY2sgdGhlIHJldHVybiB2YWx1ZXMgb2YgdGhlc2UgdGhyZWUgcm91dGluZXMuCi0KLQotSXQgaXMgcG9zc2libGUgdG8gY2hhbmdlIGRlY29kaW5nIHBhcmFtZXRlcnMgYmV0d2VlbiBvdXRwdXQgcGFzc2VzIGluIHRoZQotYnVmZmVyZWQtaW1hZ2UgbW9kZS4gIFRoZSBkZWNvZGVyIGxpYnJhcnkgY3VycmVudGx5IHN1cHBvcnRzIG9ubHkgdmVyeQotbGltaXRlZCBjaGFuZ2VzIG9mIHBhcmFtZXRlcnMuICBPTkxZIFRIRSBGT0xMT1dJTkcgcGFyYW1ldGVyIGNoYW5nZXMgYXJlCi1hbGxvd2VkIGFmdGVyIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIGlzIGNhbGxlZDoKLSogZGN0X21ldGhvZCBjYW4gYmUgY2hhbmdlZCBiZWZvcmUgZWFjaCBjYWxsIHRvIGpwZWdfc3RhcnRfb3V0cHV0KCkuCi0gIEZvciBleGFtcGxlLCBvbmUgY291bGQgdXNlIGEgZmFzdCBEQ1QgbWV0aG9kIGZvciBlYXJseSBzY2FucywgY2hhbmdpbmcKLSAgdG8gYSBoaWdoZXIgcXVhbGl0eSBtZXRob2QgZm9yIHRoZSBmaW5hbCBzY2FuLgotKiBkaXRoZXJfbW9kZSBjYW4gYmUgY2hhbmdlZCBiZWZvcmUgZWFjaCBjYWxsIHRvIGpwZWdfc3RhcnRfb3V0cHV0KCk7Ci0gIG9mIGNvdXJzZSB0aGlzIGhhcyBubyBpbXBhY3QgaWYgbm90IHVzaW5nIGNvbG9yIHF1YW50aXphdGlvbi4gIFR5cGljYWxseQotICBvbmUgd291bGQgdXNlIG9yZGVyZWQgZGl0aGVyIGZvciBpbml0aWFsIHBhc3NlcywgdGhlbiBzd2l0Y2ggdG8KLSAgRmxveWQtU3RlaW5iZXJnIGRpdGhlciBmb3IgdGhlIGZpbmFsIHBhc3MuICBDYXV0aW9uOiBjaGFuZ2luZyBkaXRoZXIgbW9kZQotICBjYW4gY2F1c2UgbW9yZSBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkIGJ5IHRoZSBsaWJyYXJ5LiAgQWx0aG91Z2ggdGhlIGFtb3VudAotICBvZiBtZW1vcnkgaW52b2x2ZWQgaXMgbm90IGxhcmdlIChhIHNjYW5saW5lIG9yIHNvKSwgaXQgbWF5IGNhdXNlIHRoZQotICBpbml0aWFsIG1heF9tZW1vcnlfdG9fdXNlIHNwZWNpZmljYXRpb24gdG8gYmUgZXhjZWVkZWQsIHdoaWNoIGluIHRoZSB3b3JzdAotICBjYXNlIHdvdWxkIHJlc3VsdCBpbiBhbiBvdXQtb2YtbWVtb3J5IGZhaWx1cmUuCi0qIGRvX2Jsb2NrX3Ntb290aGluZyBjYW4gYmUgY2hhbmdlZCBiZWZvcmUgZWFjaCBjYWxsIHRvIGpwZWdfc3RhcnRfb3V0cHV0KCkuCi0gIFRoaXMgc2V0dGluZyBpcyByZWxldmFudCBvbmx5IHdoZW4gZGVjb2RpbmcgYSBwcm9ncmVzc2l2ZSBKUEVHIGltYWdlLgotICBEdXJpbmcgdGhlIGZpcnN0IERDLW9ubHkgc2NhbiwgYmxvY2sgc21vb3RoaW5nIHByb3ZpZGVzIGEgdmVyeSAiZnV6enkiIGxvb2sKLSAgaW5zdGVhZCBvZiB0aGUgdmVyeSAiYmxvY2t5IiBsb29rIHNlZW4gd2l0aG91dCBpdDsgd2hpY2ggaXMgYmV0dGVyIHNlZW1zIGEKLSAgbWF0dGVyIG9mIHBlcnNvbmFsIHRhc3RlLiAgQnV0IGJsb2NrIHNtb290aGluZyBpcyBuZWFybHkgYWx3YXlzIGEgd2luCi0gIGR1cmluZyBsYXRlciBzdGFnZXMsIGVzcGVjaWFsbHkgd2hlbiBkZWNvZGluZyBhIHN1Y2Nlc3NpdmUtYXBwcm94aW1hdGlvbgotICBpbWFnZTogc21vb3RoaW5nIGhlbHBzIHRvIGhpZGUgdGhlIHNsaWdodCBibG9ja2luZXNzIHRoYXQgb3RoZXJ3aXNlIHNob3dzCi0gIHVwIG9uIHNtb290aCBncmFkaWVudHMgdW50aWwgdGhlIGxvd2VzdCBjb2VmZmljaWVudCBiaXRzIGFyZSBzZW50LgotKiBDb2xvciBxdWFudGl6YXRpb24gbW9kZSBjYW4gYmUgY2hhbmdlZCB1bmRlciB0aGUgcnVsZXMgZGVzY3JpYmVkIGJlbG93LgotICBZb3UgKmNhbm5vdCogY2hhbmdlIGJldHdlZW4gZnVsbC1jb2xvciBhbmQgcXVhbnRpemVkIG91dHB1dCAoYmVjYXVzZSB0aGF0Ci0gIHdvdWxkIGFsdGVyIHRoZSByZXF1aXJlZCBJL08gYnVmZmVyIHNpemVzKSwgYnV0IHlvdSBjYW4gY2hhbmdlIHdoaWNoCi0gIHF1YW50aXphdGlvbiBtZXRob2QgaXMgdXNlZC4KLQotV2hlbiBnZW5lcmF0aW5nIGNvbG9yLXF1YW50aXplZCBvdXRwdXQsIGNoYW5naW5nIHF1YW50aXphdGlvbiBtZXRob2QgaXMgYQotdmVyeSB1c2VmdWwgd2F5IG9mIHN3aXRjaGluZyBiZXR3ZWVuIGhpZ2gtc3BlZWQgYW5kIGhpZ2gtcXVhbGl0eSBkaXNwbGF5LgotVGhlIGxpYnJhcnkgYWxsb3dzIHlvdSB0byBjaGFuZ2UgYW1vbmcgaXRzIHRocmVlIHF1YW50aXphdGlvbiBtZXRob2RzOgotMS4gU2luZ2xlLXBhc3MgcXVhbnRpemF0aW9uIHRvIGEgZml4ZWQgY29sb3IgY3ViZS4KLSAgIFNlbGVjdGVkIGJ5IGNpbmZvLnR3b19wYXNzX3F1YW50aXplID0gRkFMU0UgYW5kIGNpbmZvLmNvbG9ybWFwID0gTlVMTC4KLTIuIFNpbmdsZS1wYXNzIHF1YW50aXphdGlvbiB0byBhbiBhcHBsaWNhdGlvbi1zdXBwbGllZCBjb2xvcm1hcC4KLSAgIFNlbGVjdGVkIGJ5IHNldHRpbmcgY2luZm8uY29sb3JtYXAgdG8gcG9pbnQgdG8gdGhlIGNvbG9ybWFwICh0aGUgdmFsdWUgb2YKLSAgIHR3b19wYXNzX3F1YW50aXplIGlzIGlnbm9yZWQpOyBhbHNvIHNldCBjaW5mby5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycy4KLTMuIFR3by1wYXNzIHF1YW50aXphdGlvbiB0byBhIGNvbG9ybWFwIGNob3NlbiBzcGVjaWZpY2FsbHkgZm9yIHRoZSBpbWFnZS4KLSAgIFNlbGVjdGVkIGJ5IGNpbmZvLnR3b19wYXNzX3F1YW50aXplID0gVFJVRSBhbmQgY2luZm8uY29sb3JtYXAgPSBOVUxMLgotICAgKFRoaXMgaXMgdGhlIGRlZmF1bHQgc2V0dGluZyBzZWxlY3RlZCBieSBqcGVnX3JlYWRfaGVhZGVyLCBidXQgaXQgaXMKLSAgIHByb2JhYmx5IE5PVCB3aGF0IHlvdSB3YW50IGZvciB0aGUgZmlyc3QgcGFzcyBvZiBwcm9ncmVzc2l2ZSBkaXNwbGF5ISkKLVRoZXNlIG1ldGhvZHMgb2ZmZXIgc3VjY2Vzc2l2ZWx5IGJldHRlciBxdWFsaXR5IGFuZCBsZXNzZXIgc3BlZWQuICBIb3dldmVyLAotb25seSB0aGUgZmlyc3QgbWV0aG9kIGlzIGF2YWlsYWJsZSBmb3IgcXVhbnRpemluZyBpbiBub24tUkdCIGNvbG9yIHNwYWNlcy4KLQotSU1QT1JUQU5UOiBiZWNhdXNlIHRoZSBkaWZmZXJlbnQgcXVhbnRpemVyIG1ldGhvZHMgaGF2ZSB2ZXJ5IGRpZmZlcmVudAotd29ya2luZy1zdG9yYWdlIHJlcXVpcmVtZW50cywgdGhlIGxpYnJhcnkgcmVxdWlyZXMgeW91IHRvIGluZGljYXRlIHdoaWNoCi1vbmUocykgeW91IGludGVuZCB0byB1c2UgYmVmb3JlIHlvdSBjYWxsIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLiAgKElmIHdlIGRpZAotbm90IHJlcXVpcmUgdGhpcywgdGhlIG1heF9tZW1vcnlfdG9fdXNlIHNldHRpbmcgd291bGQgYmUgYSBjb21wbGV0ZSBmaWN0aW9uLikKLVlvdSBkbyB0aGlzIGJ5IHNldHRpbmcgb25lIG9yIG1vcmUgb2YgdGhlc2UgdGhyZWUgY2luZm8gZmllbGRzIHRvIFRSVUU6Ci0JZW5hYmxlXzFwYXNzX3F1YW50CQlGaXhlZCBjb2xvciBjdWJlIGNvbG9ybWFwCi0JZW5hYmxlX2V4dGVybmFsX3F1YW50CQlFeHRlcm5hbGx5LXN1cHBsaWVkIGNvbG9ybWFwCi0JZW5hYmxlXzJwYXNzX3F1YW50CQlUd28tcGFzcyBjdXN0b20gY29sb3JtYXAKLUFsbCB0aHJlZSBhcmUgaW5pdGlhbGl6ZWQgRkFMU0UgYnkganBlZ19yZWFkX2hlYWRlcigpLiAgQnV0Ci1qcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSBhdXRvbWF0aWNhbGx5IHNldHMgVFJVRSB0aGUgb25lIHNlbGVjdGVkIGJ5IHRoZQotY3VycmVudCB0d29fcGFzc19xdWFudGl6ZSBhbmQgY29sb3JtYXAgc2V0dGluZ3MsIHNvIHlvdSBvbmx5IG5lZWQgdG8gc2V0IHRoZQotZW5hYmxlIGZsYWdzIGZvciBhbnkgb3RoZXIgcXVhbnRpemF0aW9uIG1ldGhvZHMgeW91IHBsYW4gdG8gY2hhbmdlIHRvIGxhdGVyLgotCi1BZnRlciBzZXR0aW5nIHRoZSBlbmFibGUgZmxhZ3MgY29ycmVjdGx5IGF0IGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIHRpbWUsIHlvdQotY2FuIGNoYW5nZSB0byBhbnkgZW5hYmxlZCBxdWFudGl6YXRpb24gbWV0aG9kIGJ5IHNldHRpbmcgdHdvX3Bhc3NfcXVhbnRpemUKLWFuZCBjb2xvcm1hcCBwcm9wZXJseSBqdXN0IGJlZm9yZSBjYWxsaW5nIGpwZWdfc3RhcnRfb3V0cHV0KCkuICBUaGUgZm9sbG93aW5nCi1zcGVjaWFsIHJ1bGVzIGFwcGx5OgotMS4gWW91IG11c3QgZXhwbGljaXRseSBzZXQgY2luZm8uY29sb3JtYXAgdG8gTlVMTCB3aGVuIHN3aXRjaGluZyB0byAxLXBhc3MKLSAgIG9yIDItcGFzcyBtb2RlIGZyb20gYSBkaWZmZXJlbnQgbW9kZSwgb3Igd2hlbiB5b3Ugd2FudCB0aGUgMi1wYXNzCi0gICBxdWFudGl6ZXIgdG8gYmUgcmUtcnVuIHRvIGdlbmVyYXRlIGEgbmV3IGNvbG9ybWFwLgotMi4gVG8gc3dpdGNoIHRvIGFuIGV4dGVybmFsIGNvbG9ybWFwLCBvciB0byBjaGFuZ2UgdG8gYSBkaWZmZXJlbnQgZXh0ZXJuYWwKLSAgIGNvbG9ybWFwIHRoYW4gd2FzIHVzZWQgb24gdGhlIHByaW9yIHBhc3MsIHlvdSBtdXN0IGNhbGwKLSAgIGpwZWdfbmV3X2NvbG9ybWFwKCkgYWZ0ZXIgc2V0dGluZyBjaW5mby5jb2xvcm1hcC4KLU5PVEU6IGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgc2FtZSBjb2xvcm1hcCBhcyB3YXMgdXNlZCBpbiB0aGUgcHJpb3IgcGFzcywKLXlvdSBzaG91bGQgbm90IGRvIGVpdGhlciBvZiB0aGVzZSB0aGluZ3MuICBUaGlzIHdpbGwgc2F2ZSBzb21lIG5vbnRyaXZpYWwKLXN3aXRjaG92ZXIgY29zdHMuCi0oVGhlc2UgcmVxdWlyZW1lbnRzIGV4aXN0IGJlY2F1c2UgY2luZm8uY29sb3JtYXAgd2lsbCBhbHdheXMgYmUgbm9uLU5VTEwKLWFmdGVyIGNvbXBsZXRpbmcgYSBwcmlvciBvdXRwdXQgcGFzcywgc2luY2UgYm90aCB0aGUgMS1wYXNzIGFuZCAyLXBhc3MKLXF1YW50aXplcnMgc2V0IGl0IHRvIHBvaW50IHRvIHRoZWlyIG91dHB1dCBjb2xvcm1hcHMuICBUaHVzIHlvdSBoYXZlIHRvCi1kbyBvbmUgb2YgdGhlc2UgdHdvIHRoaW5ncyB0byBub3RpZnkgdGhlIGxpYnJhcnkgdGhhdCBzb21ldGhpbmcgaGFzIGNoYW5nZWQuCi1ZdXAsIGl0J3MgYSBiaXQga2x1Z3ksIGJ1dCBpdCdzIG5lY2Vzc2FyeSB0byBkbyBpdCB0aGlzIHdheSBmb3IgYmFja3dhcmRzCi1jb21wYXRpYmlsaXR5LikKLQotTm90ZSB0aGF0IGluIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHRoZSBsaWJyYXJ5IGdlbmVyYXRlcyBhbnkgcmVxdWVzdGVkIGNvbG9ybWFwCi1kdXJpbmcganBlZ19zdGFydF9vdXRwdXQoKSwgbm90IGR1cmluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4KLQotV2hlbiB1c2luZyB0d28tcGFzcyBxdWFudGl6YXRpb24sIGpwZWdfc3RhcnRfb3V0cHV0KCkgbWFrZXMgYSBwYXNzIG92ZXIgdGhlCi1idWZmZXJlZCBpbWFnZSB0byBkZXRlcm1pbmUgdGhlIG9wdGltdW0gY29sb3IgbWFwOyBpdCB0aGVyZWZvcmUgbWF5IHRha2UgYQotc2lnbmlmaWNhbnQgYW1vdW50IG9mIHRpbWUsIHdoZXJlYXMgb3JkaW5hcmlseSBpdCBkb2VzIGxpdHRsZSB3b3JrLiAgVGhlCi1wcm9ncmVzcyBtb25pdG9yIGhvb2sgaXMgY2FsbGVkIGR1cmluZyB0aGlzIHBhc3MsIGlmIGRlZmluZWQuICBJdCBpcyBhbHNvCi1pbXBvcnRhbnQgdG8gcmVhbGl6ZSB0aGF0IGlmIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IHNjYW4gbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbgotb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQgaW5wdXQgc2NhbiBudW1iZXIsIGpwZWdfc3RhcnRfb3V0cHV0KCkgd2lsbCBhdHRlbXB0Ci10byBjb25zdW1lIGlucHV0IGFzIGl0IG1ha2VzIHRoaXMgcGFzcy4gIElmIHlvdSB1c2UgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlLAoteW91IG5lZWQgdG8gY2hlY2sgZm9yIGEgRkFMU0UgcmV0dXJuIGZyb20ganBlZ19zdGFydF9vdXRwdXQoKSB1bmRlciB0aGVzZQotY29uZGl0aW9ucy4gIFRoZSBjb21iaW5hdGlvbiBvZiAyLXBhc3MgcXVhbnRpemF0aW9uIGFuZCBhIG5vdC15ZXQtZnVsbHktcmVhZAotdGFyZ2V0IHNjYW4gaXMgdGhlIG9ubHkgY2FzZSBpbiB3aGljaCBqcGVnX3N0YXJ0X291dHB1dCgpIHdpbGwgY29uc3VtZSBpbnB1dC4KLQotCi1BcHBsaWNhdGlvbiBhdXRob3JzIHdobyBzdXBwb3J0IGJ1ZmZlcmVkLWltYWdlIG1vZGUgbWF5IGJlIHRlbXB0ZWQgdG8gdXNlIGl0Ci1mb3IgYWxsIEpQRUcgaW1hZ2VzLCBldmVuIHNpbmdsZS1zY2FuIG9uZXMuICBUaGlzIHdpbGwgd29yaywgYnV0IGl0IGlzCi1pbmVmZmljaWVudDogdGhlcmUgaXMgbm8gbmVlZCB0byBjcmVhdGUgYW4gaW1hZ2Utc2l6ZWQgY29lZmZpY2llbnQgYnVmZmVyIGZvcgotc2luZ2xlLXNjYW4gaW1hZ2VzLiAgUmVxdWVzdGluZyBidWZmZXJlZC1pbWFnZSBtb2RlIGZvciBzdWNoIGFuIGltYWdlIHdhc3RlcwotbWVtb3J5LiAgV29yc2UsIGl0IGNhbiBjb3N0IHRpbWUgb24gbGFyZ2UgaW1hZ2VzLCBzaW5jZSB0aGUgYnVmZmVyZWQgZGF0YSBoYXMKLXRvIGJlIHN3YXBwZWQgb3V0IG9yIHdyaXR0ZW4gdG8gYSB0ZW1wb3JhcnkgZmlsZS4gIElmIHlvdSBhcmUgY29uY2VybmVkIGFib3V0Ci1tYXhpbXVtIHBlcmZvcm1hbmNlIG9uIGJhc2VsaW5lIEpQRUcgZmlsZXMsIHlvdSBzaG91bGQgdXNlIGJ1ZmZlcmVkLWltYWdlCi1tb2RlIG9ubHkgd2hlbiB0aGUgaW5jb21pbmcgZmlsZSBhY3R1YWxseSBoYXMgbXVsdGlwbGUgc2NhbnMuICBUaGlzIGNhbiBiZQotdGVzdGVkIGJ5IGNhbGxpbmcganBlZ19oYXNfbXVsdGlwbGVfc2NhbnMoKSwgd2hpY2ggd2lsbCByZXR1cm4gYSBjb3JyZWN0Ci1yZXN1bHQgYXQgYW55IHRpbWUgYWZ0ZXIganBlZ19yZWFkX2hlYWRlcigpIGNvbXBsZXRlcy4KLQotSXQgaXMgYWxzbyB3b3J0aCBub3RpbmcgdGhhdCB3aGVuIHlvdSB1c2UganBlZ19jb25zdW1lX2lucHV0KCkgdG8gbGV0IGlucHV0Ci1wcm9jZXNzaW5nIGdldCBhaGVhZCBvZiBvdXRwdXQgcHJvY2Vzc2luZywgdGhlIHJlc3VsdGluZyBwYXR0ZXJuIG9mIGFjY2VzcyB0bwotdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBpcyBxdWl0ZSBub25zZXF1ZW50aWFsLiAgSXQncyBiZXN0IHRvIHVzZSB0aGUgbWVtb3J5Ci1tYW5hZ2VyIGptZW1ub2JzLmMgaWYgeW91IGNhbiAoaWUsIGlmIHlvdSBoYXZlIGVub3VnaCByZWFsIG9yIHZpcnR1YWwgbWFpbgotbWVtb3J5KS4gIElmIG5vdCwgYXQgbGVhc3QgbWFrZSBzdXJlIHRoYXQgbWF4X21lbW9yeV90b191c2UgaXMgc2V0IGFzIGhpZ2ggYXMKLXBvc3NpYmxlLiAgSWYgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIgaGFzIHRvIHVzZSBhIHRlbXBvcmFyeSBmaWxlLCB5b3Ugd2lsbAotcHJvYmFibHkgc2VlIGEgbG90IG9mIGRpc2sgdHJhZmZpYyBhbmQgcG9vciBwZXJmb3JtYW5jZS4gIChUaGlzIGNvdWxkIGJlCi1pbXByb3ZlZCB3aXRoIGFkZGl0aW9uYWwgd29yayBvbiB0aGUgbWVtb3J5IG1hbmFnZXIsIGJ1dCB3ZSBoYXZlbid0IGdvdHRlbgotYXJvdW5kIHRvIGl0IHlldC4pCi0KLUluIHNvbWUgYXBwbGljYXRpb25zIGl0IG1heSBiZSBjb252ZW5pZW50IHRvIHVzZSBqcGVnX2NvbnN1bWVfaW5wdXQoKSBmb3IgYWxsCi1pbnB1dCBwcm9jZXNzaW5nLCBpbmNsdWRpbmcgcmVhZGluZyB0aGUgaW5pdGlhbCBtYXJrZXJzOyB0aGF0IGlzLCB5b3UgbWF5Ci13aXNoIHRvIGNhbGwganBlZ19jb25zdW1lX2lucHV0KCkgaW5zdGVhZCBvZiBqcGVnX3JlYWRfaGVhZGVyKCkgZHVyaW5nCi1zdGFydHVwLiAgVGhpcyB3b3JrcywgYnV0IG5vdGUgdGhhdCB5b3UgbXVzdCBjaGVjayBmb3IgSlBFR19SRUFDSEVEX1NPUyBhbmQKLUpQRUdfUkVBQ0hFRF9FT0kgcmV0dXJuIGNvZGVzIGFzIHRoZSBlcXVpdmFsZW50IG9mIGpwZWdfcmVhZF9oZWFkZXIncyBjb2Rlcy4KLU9uY2UgdGhlIGZpcnN0IFNPUyBtYXJrZXIgaGFzIGJlZW4gcmVhY2hlZCwgeW91IG11c3QgY2FsbAotanBlZ19zdGFydF9kZWNvbXByZXNzKCkgYmVmb3JlIGpwZWdfY29uc3VtZV9pbnB1dCgpIHdpbGwgY29uc3VtZSBtb3JlIGlucHV0OwotaXQnbGwganVzdCBrZWVwIHJldHVybmluZyBKUEVHX1JFQUNIRURfU09TIHVudGlsIHlvdSBkby4gIElmIHlvdSByZWFkIGEKLXRhYmxlcy1vbmx5IGZpbGUgdGhpcyB3YXksIGpwZWdfY29uc3VtZV9pbnB1dCgpIHdpbGwgcmV0dXJuIEpQRUdfUkVBQ0hFRF9FT0kKLXdpdGhvdXQgZXZlciByZXR1cm5pbmcgSlBFR19SRUFDSEVEX1NPUzsgYmUgc3VyZSB0byBjaGVjayBmb3IgdGhpcyBjYXNlLgotSWYgdGhpcyBoYXBwZW5zLCB0aGUgZGVjb21wcmVzc29yIHdpbGwgbm90IHJlYWQgYW55IG1vcmUgaW5wdXQgdW50aWwgeW91IGNhbGwKLWpwZWdfYWJvcnQoKSB0byByZXNldCBpdC4gIEl0IGlzIE9LIHRvIGNhbGwganBlZ19jb25zdW1lX2lucHV0KCkgZXZlbiB3aGVuIG5vdAotdXNpbmcgYnVmZmVyZWQtaW1hZ2UgbW9kZSwgYnV0IGluIHRoYXQgY2FzZSBpdCdzIGJhc2ljYWxseSBhIG5vLW9wIGFmdGVyIHRoZQotaW5pdGlhbCBtYXJrZXJzIGhhdmUgYmVlbiByZWFkOiBpdCB3aWxsIGp1c3QgcmV0dXJuIEpQRUdfU1VTUEVOREVELgotCi0KLUFiYnJldmlhdGVkIGRhdGFzdHJlYW1zIGFuZCBtdWx0aXBsZSBpbWFnZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQSBKUEVHIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gb2JqZWN0IGNhbiBiZSByZXVzZWQgdG8gcHJvY2VzcyBtdWx0aXBsZQotaW1hZ2VzLiAgVGhpcyBzYXZlcyBhIHNtYWxsIGFtb3VudCBvZiB0aW1lIHBlciBpbWFnZSBieSBlbGltaW5hdGluZyB0aGUKLSJjcmVhdGUiIGFuZCAiZGVzdHJveSIgb3BlcmF0aW9ucywgYnV0IHRoYXQgaXNuJ3QgdGhlIHJlYWwgcHVycG9zZSBvZiB0aGUKLWZlYXR1cmUuICBSYXRoZXIsIHJldXNlIG9mIGFuIG9iamVjdCBwcm92aWRlcyBzdXBwb3J0IGZvciBhYmJyZXZpYXRlZCBKUEVHCi1kYXRhc3RyZWFtcy4gIE9iamVjdCByZXVzZSBjYW4gYWxzbyBzaW1wbGlmeSBwcm9jZXNzaW5nIGEgc2VyaWVzIG9mIGltYWdlcyBpbgotYSBzaW5nbGUgaW5wdXQgb3Igb3V0cHV0IGZpbGUuICBUaGlzIHNlY3Rpb24gZXhwbGFpbnMgdGhlc2UgZmVhdHVyZXMuCi0KLUEgSlBFRyBmaWxlIG5vcm1hbGx5IGNvbnRhaW5zIHNldmVyYWwgaHVuZHJlZCBieXRlcyB3b3J0aCBvZiBxdWFudGl6YXRpb24KLWFuZCBIdWZmbWFuIHRhYmxlcy4gIEluIGEgc2l0dWF0aW9uIHdoZXJlIG1hbnkgaW1hZ2VzIHdpbGwgYmUgc3RvcmVkIG9yCi10cmFuc21pdHRlZCB3aXRoIGlkZW50aWNhbCB0YWJsZXMsIHRoaXMgbWF5IHJlcHJlc2VudCBhbiBhbm5veWluZyBvdmVyaGVhZC4KLVRoZSBKUEVHIHN0YW5kYXJkIHRoZXJlZm9yZSBwZXJtaXRzIHRhYmxlcyB0byBiZSBvbWl0dGVkLiAgVGhlIHN0YW5kYXJkCi1kZWZpbmVzIHRocmVlIGNsYXNzZXMgb2YgSlBFRyBkYXRhc3RyZWFtczoKLSAgKiAiSW50ZXJjaGFuZ2UiIGRhdGFzdHJlYW1zIGNvbnRhaW4gYW4gaW1hZ2UgYW5kIGFsbCB0YWJsZXMgbmVlZGVkIHRvIGRlY29kZQotICAgICB0aGUgaW1hZ2UuICBUaGVzZSBhcmUgdGhlIHVzdWFsIGtpbmQgb2YgSlBFRyBmaWxlLgotICAqICJBYmJyZXZpYXRlZCBpbWFnZSIgZGF0YXN0cmVhbXMgY29udGFpbiBhbiBpbWFnZSwgYnV0IGFyZSBtaXNzaW5nIHNvbWUgb3IKLSAgICBhbGwgb2YgdGhlIHRhYmxlcyBuZWVkZWQgdG8gZGVjb2RlIHRoYXQgaW1hZ2UuCi0gICogIkFiYnJldmlhdGVkIHRhYmxlIHNwZWNpZmljYXRpb24iIChoZW5jZWZvcnRoICJ0YWJsZXMtb25seSIpIGRhdGFzdHJlYW1zCi0gICAgY29udGFpbiBvbmx5IHRhYmxlIHNwZWNpZmljYXRpb25zLgotVG8gZGVjb2RlIGFuIGFiYnJldmlhdGVkIGltYWdlLCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9hZCB0aGUgbWlzc2luZyB0YWJsZShzKQotaW50byB0aGUgZGVjb2RlciBiZWZvcmVoYW5kLiAgVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHJlYWRpbmcgYSBzZXBhcmF0ZQotdGFibGVzLW9ubHkgZmlsZS4gIEEgdmFyaWFudCBzY2hlbWUgdXNlcyBhIHNlcmllcyBvZiBpbWFnZXMgaW4gd2hpY2ggdGhlIGZpcnN0Ci1pbWFnZSBpcyBhbiBpbnRlcmNoYW5nZSAoY29tcGxldGUpIGRhdGFzdHJlYW0sIHdoaWxlIHN1YnNlcXVlbnQgb25lcyBhcmUKLWFiYnJldmlhdGVkIGFuZCByZWx5IG9uIHRoZSB0YWJsZXMgbG9hZGVkIGJ5IHRoZSBmaXJzdCBpbWFnZS4gIEl0IGlzIGFzc3VtZWQKLXRoYXQgb25jZSB0aGUgZGVjb2RlciBoYXMgcmVhZCBhIHRhYmxlLCBpdCB3aWxsIHJlbWVtYmVyIHRoYXQgdGFibGUgdW50aWwgYQotbmV3IGRlZmluaXRpb24gZm9yIHRoZSBzYW1lIHRhYmxlIG51bWJlciBpcyBlbmNvdW50ZXJlZC4KLQotSXQgaXMgdGhlIGFwcGxpY2F0aW9uIGRlc2lnbmVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZmlndXJlIG91dCBob3cgdG8gYXNzb2NpYXRlCi10aGUgY29ycmVjdCB0YWJsZXMgd2l0aCBhbiBhYmJyZXZpYXRlZCBpbWFnZS4gIFdoaWxlIGFiYnJldmlhdGVkIGRhdGFzdHJlYW1zCi1jYW4gYmUgdXNlZnVsIGluIGEgY2xvc2VkIGVudmlyb25tZW50LCB0aGVpciB1c2UgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQgaW4KLWFueSBzaXR1YXRpb24gd2hlcmUgZGF0YSBleGNoYW5nZSB3aXRoIG90aGVyIGFwcGxpY2F0aW9ucyBtaWdodCBiZSBuZWVkZWQuCi1DYXZlYXQgZGVzaWduZXIuCi0KLVRoZSBKUEVHIGxpYnJhcnkgcHJvdmlkZXMgc3VwcG9ydCBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBhbnkgY29tYmluYXRpb24gb2YKLXRhYmxlcy1vbmx5IGRhdGFzdHJlYW1zIGFuZCBhYmJyZXZpYXRlZCBpbWFnZXMuICBJbiBib3RoIGNvbXByZXNzaW9uIGFuZAotZGVjb21wcmVzc2lvbiBvYmplY3RzLCBhIHF1YW50aXphdGlvbiBvciBIdWZmbWFuIHRhYmxlIHdpbGwgYmUgcmV0YWluZWQgZm9yCi10aGUgbGlmZXRpbWUgb2YgdGhlIG9iamVjdCwgdW5sZXNzIGl0IGlzIG92ZXJ3cml0dGVuIGJ5IGEgbmV3IHRhYmxlIGRlZmluaXRpb24uCi0KLQotVG8gY3JlYXRlIGFiYnJldmlhdGVkIGltYWdlIGRhdGFzdHJlYW1zLCBpdCBpcyBvbmx5IG5lY2Vzc2FyeSB0byB0ZWxsIHRoZQotY29tcHJlc3NvciBub3QgdG8gZW1pdCBzb21lIG9yIGFsbCBvZiB0aGUgdGFibGVzIGl0IGlzIHVzaW5nLiAgRWFjaAotcXVhbnRpemF0aW9uIGFuZCBIdWZmbWFuIHRhYmxlIHN0cnVjdCBjb250YWlucyBhIGJvb2xlYW4gZmllbGQgInNlbnRfdGFibGUiLAotd2hpY2ggbm9ybWFsbHkgaXMgaW5pdGlhbGl6ZWQgdG8gRkFMU0UuICBGb3IgZWFjaCB0YWJsZSB1c2VkIGJ5IHRoZSBpbWFnZSwgdGhlCi1oZWFkZXItd3JpdGluZyBwcm9jZXNzIGVtaXRzIHRoZSB0YWJsZSBhbmQgc2V0cyBzZW50X3RhYmxlID0gVFJVRSB1bmxlc3MgaXQgaXMKLWFscmVhZHkgVFJVRS4gIChJbiBub3JtYWwgdXNhZ2UsIHRoaXMgcHJldmVudHMgb3V0cHV0dGluZyB0aGUgc2FtZSB0YWJsZQotZGVmaW5pdGlvbiBtdWx0aXBsZSB0aW1lcywgYXMgd291bGQgb3RoZXJ3aXNlIG9jY3VyIGJlY2F1c2UgdGhlIGNocm9tYQotY29tcG9uZW50cyB0eXBpY2FsbHkgc2hhcmUgdGFibGVzLikgIFRodXMsIHNldHRpbmcgdGhpcyBmaWVsZCB0byBUUlVFIGJlZm9yZQotY2FsbGluZyBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgd2lsbCBwcmV2ZW50IHRoZSB0YWJsZSBmcm9tIGJlaW5nIHdyaXR0ZW4gYXQKLWFsbC4KLQotSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgInB1cmUiIGFiYnJldmlhdGVkIGltYWdlIGZpbGUgY29udGFpbmluZyBubyB0YWJsZXMsCi1qdXN0IGNhbGwgImpwZWdfc3VwcHJlc3NfdGFibGVzKCZjaW5mbywgVFJVRSkiIGFmdGVyIGNvbnN0cnVjdGluZyBhbGwgdGhlCi10YWJsZXMuICBJZiB5b3Ugd2FudCB0byBlbWl0IHNvbWUgYnV0IG5vdCBhbGwgdGFibGVzLCB5b3UnbGwgbmVlZCB0byBzZXQgdGhlCi1pbmRpdmlkdWFsIHNlbnRfdGFibGUgZmllbGRzIGRpcmVjdGx5LgotCi1UbyBjcmVhdGUgYW4gYWJicmV2aWF0ZWQgaW1hZ2UsIHlvdSBtdXN0IGFsc28gY2FsbCBqcGVnX3N0YXJ0X2NvbXByZXNzKCkKLXdpdGggYSBzZWNvbmQgcGFyYW1ldGVyIG9mIEZBTFNFLCBub3QgVFJVRS4gIE90aGVyd2lzZSBqcGVnX3N0YXJ0X2NvbXByZXNzKCkKLXdpbGwgZm9yY2UgYWxsIHRoZSBzZW50X3RhYmxlIGZpZWxkcyB0byBGQUxTRS4gIChUaGlzIGlzIGEgc2FmZXR5IGZlYXR1cmUgdG8KLXByZXZlbnQgYWJicmV2aWF0ZWQgaW1hZ2VzIGZyb20gYmVpbmcgY3JlYXRlZCBhY2NpZGVudGFsbHkuKQotCi1UbyBjcmVhdGUgYSB0YWJsZXMtb25seSBmaWxlLCBwZXJmb3JtIHRoZSBzYW1lIHBhcmFtZXRlciBzZXR1cCB0aGF0IHlvdQotbm9ybWFsbHkgd291bGQsIGJ1dCBpbnN0ZWFkIG9mIGNhbGxpbmcganBlZ19zdGFydF9jb21wcmVzcygpIGFuZCBzbyBvbiwgY2FsbAotanBlZ193cml0ZV90YWJsZXMoJmNpbmZvKS4gIFRoaXMgd2lsbCB3cml0ZSBhbiBhYmJyZXZpYXRlZCBkYXRhc3RyZWFtCi1jb250YWluaW5nIG9ubHkgU09JLCBEUVQgYW5kL29yIERIVCBtYXJrZXJzLCBhbmQgRU9JLiAgQWxsIHRoZSBxdWFudGl6YXRpb24KLWFuZCBIdWZmbWFuIHRhYmxlcyB0aGF0IGFyZSBjdXJyZW50bHkgZGVmaW5lZCBpbiB0aGUgY29tcHJlc3Npb24gb2JqZWN0IHdpbGwKLWJlIGVtaXR0ZWQgdW5sZXNzIHRoZWlyIHNlbnRfdGFibGVzIGZsYWcgaXMgYWxyZWFkeSBUUlVFLCBhbmQgdGhlbiBhbGwgdGhlCi1zZW50X3RhYmxlcyBmbGFncyB3aWxsIGJlIHNldCBUUlVFLgotCi1BIHN1cmUtZmlyZSB3YXkgdG8gY3JlYXRlIG1hdGNoaW5nIHRhYmxlcy1vbmx5IGFuZCBhYmJyZXZpYXRlZCBpbWFnZSBmaWxlcwotaXMgdG8gcHJvY2VlZCBhcyBmb2xsb3dzOgotCi0JY3JlYXRlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0Ci0Jc2V0IEpQRUcgcGFyYW1ldGVycwotCXNldCBkZXN0aW5hdGlvbiB0byB0YWJsZXMtb25seSBmaWxlCi0JanBlZ193cml0ZV90YWJsZXMoJmNpbmZvKTsKLQlzZXQgZGVzdGluYXRpb24gdG8gaW1hZ2UgZmlsZQotCWpwZWdfc3RhcnRfY29tcHJlc3MoJmNpbmZvLCBGQUxTRSk7Ci0Jd3JpdGUgZGF0YS4uLgotCWpwZWdfZmluaXNoX2NvbXByZXNzKCZjaW5mbyk7Ci0KLVNpbmNlIHRoZSBKUEVHIHBhcmFtZXRlcnMgYXJlIG5vdCBhbHRlcmVkIGJldHdlZW4gd3JpdGluZyB0aGUgdGFibGUgZmlsZSBhbmQKLXRoZSBhYmJyZXZpYXRlZCBpbWFnZSBmaWxlLCB0aGUgc2FtZSB0YWJsZXMgYXJlIHN1cmUgdG8gYmUgdXNlZC4gIE9mIGNvdXJzZSwKLXlvdSBjYW4gcmVwZWF0IHRoZSBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgLi4uIGpwZWdfZmluaXNoX2NvbXByZXNzKCkgc2VxdWVuY2UKLW1hbnkgdGltZXMgdG8gcHJvZHVjZSBtYW55IGFiYnJldmlhdGVkIGltYWdlIGZpbGVzIG1hdGNoaW5nIHRoZSB0YWJsZSBmaWxlLgotCi1Zb3UgY2Fubm90IHN1cHByZXNzIG91dHB1dCBvZiB0aGUgY29tcHV0ZWQgSHVmZm1hbiB0YWJsZXMgd2hlbiBIdWZmbWFuCi1vcHRpbWl6YXRpb24gaXMgc2VsZWN0ZWQuICAoSWYgeW91IGNvdWxkLCB0aGVyZSdkIGJlIG5vIHdheSB0byBkZWNvZGUgdGhlCi1pbWFnZS4uLikgIEdlbmVyYWxseSwgeW91IGRvbid0IHdhbnQgdG8gc2V0IG9wdGltaXplX2NvZGluZyA9IFRSVUUgd2hlbgoteW91IGFyZSB0cnlpbmcgdG8gcHJvZHVjZSBhYmJyZXZpYXRlZCBmaWxlcy4KLQotSW4gc29tZSBjYXNlcyB5b3UgbWlnaHQgd2FudCB0byBjb21wcmVzcyBhbiBpbWFnZSB1c2luZyB0YWJsZXMgd2hpY2ggYXJlCi1ub3Qgc3RvcmVkIGluIHRoZSBhcHBsaWNhdGlvbiwgYnV0IGFyZSBkZWZpbmVkIGluIGFuIGludGVyY2hhbmdlIG9yCi10YWJsZXMtb25seSBmaWxlIHJlYWRhYmxlIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIFRoaXMgY2FuIGJlIGRvbmUgYnkgc2V0dGluZyB1cAotYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0IHRvIHJlYWQgdGhlIHNwZWNpZmljYXRpb24gZmlsZSwgdGhlbiBjb3B5aW5nIHRoZQotdGFibGVzIGludG8geW91ciBjb21wcmVzc2lvbiBvYmplY3QuICBTZWUganBlZ19jb3B5X2NyaXRpY2FsX3BhcmFtZXRlcnMoKQotZm9yIGFuIGV4YW1wbGUgb2YgY29weWluZyBxdWFudGl6YXRpb24gdGFibGVzLgotCi0KLVRvIHJlYWQgYWJicmV2aWF0ZWQgaW1hZ2UgZmlsZXMsIHlvdSBzaW1wbHkgbmVlZCB0byBsb2FkIHRoZSBwcm9wZXIgdGFibGVzCi1pbnRvIHRoZSBkZWNvbXByZXNzaW9uIG9iamVjdCBiZWZvcmUgdHJ5aW5nIHRvIHJlYWQgdGhlIGFiYnJldmlhdGVkIGltYWdlLgotSWYgdGhlIHByb3BlciB0YWJsZXMgYXJlIHN0b3JlZCBpbiB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSwgeW91IGNhbiBqdXN0Ci1hbGxvY2F0ZSB0aGUgdGFibGUgc3RydWN0cyBhbmQgZmlsbCBpbiB0aGVpciBjb250ZW50cyBkaXJlY3RseS4gIEZvciBleGFtcGxlLAotdG8gbG9hZCBhIGZpeGVkIHF1YW50aXphdGlvbiB0YWJsZSBpbnRvIHRhYmxlIHNsb3QgIm4iOgotCi0gICAgaWYgKGNpbmZvLnF1YW50X3RibF9wdHJzW25dID09IE5VTEwpCi0gICAgICBjaW5mby5xdWFudF90YmxfcHRyc1tuXSA9IGpwZWdfYWxsb2NfcXVhbnRfdGFibGUoKGpfY29tbW9uX3B0cikgJmNpbmZvKTsKLSAgICBxdWFudF9wdHIgPSBjaW5mby5xdWFudF90YmxfcHRyc1tuXTsJLyogcXVhbnRfcHRyIGlzIEpRVUFOVF9UQkwqICovCi0gICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKLSAgICAgIC8qIFF0YWJsZVtdIGlzIGRlc2lyZWQgcXVhbnRpemF0aW9uIHRhYmxlLCBpbiBuYXR1cmFsIGFycmF5IG9yZGVyICovCi0gICAgICBxdWFudF9wdHItPnF1YW50dmFsW2ldID0gUXRhYmxlW2ldOwotICAgIH0KLQotQ29kZSB0byBsb2FkIGEgZml4ZWQgSHVmZm1hbiB0YWJsZSBpcyB0eXBpY2FsbHkgKGZvciBBQyB0YWJsZSAibiIpOgotCi0gICAgaWYgKGNpbmZvLmFjX2h1ZmZfdGJsX3B0cnNbbl0gPT0gTlVMTCkKLSAgICAgIGNpbmZvLmFjX2h1ZmZfdGJsX3B0cnNbbl0gPSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUoKGpfY29tbW9uX3B0cikgJmNpbmZvKTsKLSAgICBodWZmX3B0ciA9IGNpbmZvLmFjX2h1ZmZfdGJsX3B0cnNbbl07CS8qIGh1ZmZfcHRyIGlzIEpIVUZGX1RCTCogKi8KLSAgICBmb3IgKGkgPSAxOyBpIDw9IDE2OyBpKyspIHsKLSAgICAgIC8qIGNvdW50c1tpXSBpcyBudW1iZXIgb2YgSHVmZm1hbiBjb2RlcyBvZiBsZW5ndGggaSBiaXRzLCBpPTEuLjE2ICovCi0gICAgICBodWZmX3B0ci0+Yml0c1tpXSA9IGNvdW50c1tpXTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0gICAgICAvKiBzeW1ib2xzW10gaXMgdGhlIGxpc3Qgb2YgSHVmZm1hbiBzeW1ib2xzLCBpbiBjb2RlLWxlbmd0aCBvcmRlciAqLwotICAgICAgaHVmZl9wdHItPmh1ZmZ2YWxbaV0gPSBzeW1ib2xzW2ldOwotICAgIH0KLQotKE5vdGUgdGhhdCB0cnlpbmcgdG8gc2V0IGNpbmZvLnF1YW50X3RibF9wdHJzW25dIHRvIHBvaW50IGRpcmVjdGx5IGF0IGEKLWNvbnN0YW50IEpRVUFOVF9UQkwgb2JqZWN0IGlzIG5vdCBzYWZlLiAgSWYgdGhlIGluY29taW5nIGZpbGUgaGFwcGVuZWQgdG8KLWNvbnRhaW4gYSBxdWFudGl6YXRpb24gdGFibGUgZGVmaW5pdGlvbiwgeW91ciBtYXN0ZXIgdGFibGUgd291bGQgZ2V0Ci1vdmVyd3JpdHRlbiEgIEluc3RlYWQgYWxsb2NhdGUgYSB3b3JraW5nIHRhYmxlIGNvcHkgYW5kIGNvcHkgdGhlIG1hc3RlciB0YWJsZQotaW50byBpdCwgYXMgaWxsdXN0cmF0ZWQgYWJvdmUuICBEaXR0byBmb3IgSHVmZm1hbiB0YWJsZXMsIG9mIGNvdXJzZS4pCi0KLVlvdSBtaWdodCB3YW50IHRvIHJlYWQgdGhlIHRhYmxlcyBmcm9tIGEgdGFibGVzLW9ubHkgZmlsZSwgcmF0aGVyIHRoYW4KLWhhcmQtd2lyaW5nIHRoZW0gaW50byB5b3VyIGFwcGxpY2F0aW9uLiAgVGhlIGpwZWdfcmVhZF9oZWFkZXIoKSBjYWxsIGlzCi1zdWZmaWNpZW50IHRvIHJlYWQgYSB0YWJsZXMtb25seSBmaWxlLiAgWW91IG11c3QgcGFzcyBhIHNlY29uZCBwYXJhbWV0ZXIgb2YKLUZBTFNFIHRvIGluZGljYXRlIHRoYXQgeW91IGRvIG5vdCByZXF1aXJlIGFuIGltYWdlIHRvIGJlIHByZXNlbnQuICBUaHVzLCB0aGUKLXR5cGljYWwgc2NlbmFyaW8gaXMKLQotCWNyZWF0ZSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0Ci0Jc2V0IHNvdXJjZSB0byB0YWJsZXMtb25seSBmaWxlCi0JanBlZ19yZWFkX2hlYWRlcigmY2luZm8sIEZBTFNFKTsKLQlzZXQgc291cmNlIHRvIGFiYnJldmlhdGVkIGltYWdlIGZpbGUKLQlqcGVnX3JlYWRfaGVhZGVyKCZjaW5mbywgVFJVRSk7Ci0Jc2V0IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycwotCWpwZWdfc3RhcnRfZGVjb21wcmVzcygmY2luZm8pOwotCXJlYWQgZGF0YS4uLgotCWpwZWdfZmluaXNoX2RlY29tcHJlc3MoJmNpbmZvKTsKLQotSW4gc29tZSBjYXNlcywgeW91IG1heSB3YW50IHRvIHJlYWQgYSBmaWxlIHdpdGhvdXQga25vd2luZyB3aGV0aGVyIGl0IGNvbnRhaW5zCi1hbiBpbWFnZSBvciBqdXN0IHRhYmxlcy4gIEluIHRoYXQgY2FzZSwgcGFzcyBGQUxTRSBhbmQgY2hlY2sgdGhlIHJldHVybiB2YWx1ZQotZnJvbSBqcGVnX3JlYWRfaGVhZGVyKCk6IGl0IHdpbGwgYmUgSlBFR19IRUFERVJfT0sgaWYgYW4gaW1hZ2Ugd2FzIGZvdW5kLAotSlBFR19IRUFERVJfVEFCTEVTX09OTFkgaWYgb25seSB0YWJsZXMgd2VyZSBmb3VuZC4gIChBIHRoaXJkIHJldHVybiB2YWx1ZSwKLUpQRUdfU1VTUEVOREVELCBpcyBwb3NzaWJsZSB3aGVuIHVzaW5nIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBtYW5hZ2VyLikKLU5vdGUgdGhhdCBqcGVnX3JlYWRfaGVhZGVyKCkgd2lsbCBub3QgY29tcGxhaW4gaWYgeW91IHJlYWQgYW4gYWJicmV2aWF0ZWQKLWltYWdlIGZvciB3aGljaCB5b3UgaGF2ZW4ndCBsb2FkZWQgdGhlIG1pc3NpbmcgdGFibGVzOyB0aGUgbWlzc2luZy10YWJsZSBjaGVjawotb2NjdXJzIGxhdGVyLCBpbiBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4KLQotCi1JdCBpcyBwb3NzaWJsZSB0byByZWFkIGEgc2VyaWVzIG9mIGltYWdlcyBmcm9tIGEgc2luZ2xlIHNvdXJjZSBmaWxlIGJ5Ci1yZXBlYXRpbmcgdGhlIGpwZWdfcmVhZF9oZWFkZXIoKSAuLi4ganBlZ19maW5pc2hfZGVjb21wcmVzcygpIHNlcXVlbmNlLAotd2l0aG91dCByZWxlYXNpbmcvcmVjcmVhdGluZyB0aGUgSlBFRyBvYmplY3Qgb3IgdGhlIGRhdGEgc291cmNlIG1vZHVsZS4KLShJZiB5b3UgZGlkIHJlaW5pdGlhbGl6ZSwgYW55IHBhcnRpYWwgYnVmZmVybG9hZCBsZWZ0IGluIHRoZSBkYXRhIHNvdXJjZQotYnVmZmVyIGF0IHRoZSBlbmQgb2Ygb25lIGltYWdlIHdvdWxkIGJlIGRpc2NhcmRlZCwgY2F1c2luZyB5b3UgdG8gbG9zZSB0aGUKLXN0YXJ0IG9mIHRoZSBuZXh0IGltYWdlLikgIFdoZW4geW91IHVzZSB0aGlzIG1ldGhvZCwgc3RvcmVkIHRhYmxlcyBhcmUKLWF1dG9tYXRpY2FsbHkgY2FycmllZCBmb3J3YXJkLCBzbyBzb21lIG9mIHRoZSBpbWFnZXMgY2FuIGJlIGFiYnJldmlhdGVkIGltYWdlcwotdGhhdCBkZXBlbmQgb24gdGFibGVzIGZyb20gZWFybGllciBpbWFnZXMuCi0KLUlmIHlvdSBpbnRlbmQgdG8gd3JpdGUgYSBzZXJpZXMgb2YgaW1hZ2VzIGludG8gYSBzaW5nbGUgZGVzdGluYXRpb24gZmlsZSwKLXlvdSBtaWdodCB3YW50IHRvIG1ha2UgYSBzcGVjaWFsaXplZCBkYXRhIGRlc3RpbmF0aW9uIG1vZHVsZSB0aGF0IGRvZXNuJ3QKLWZsdXNoIHRoZSBvdXRwdXQgYnVmZmVyIGF0IHRlcm1fZGVzdGluYXRpb24oKSB0aW1lLiAgVGhpcyB3b3VsZCBzcGVlZCB0aGluZ3MKLXVwIGJ5IHNvbWUgdHJpZmxpbmcgYW1vdW50LiAgT2YgY291cnNlLCB5b3UnZCBuZWVkIHRvIHJlbWVtYmVyIHRvIGZsdXNoIHRoZQotYnVmZmVyIGFmdGVyIHRoZSBsYXN0IGltYWdlLiAgWW91IGNhbiBtYWtlIHRoZSBsYXRlciBpbWFnZXMgYmUgYWJicmV2aWF0ZWQKLW9uZXMgYnkgcGFzc2luZyBGQUxTRSB0byBqcGVnX3N0YXJ0X2NvbXByZXNzKCkuCi0KLQotU3BlY2lhbCBtYXJrZXJzCi0tLS0tLS0tLS0tLS0tLS0KLQotU29tZSBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8gaW5zZXJ0IG9yIGV4dHJhY3Qgc3BlY2lhbCBkYXRhIGluIHRoZSBKUEVHCi1kYXRhc3RyZWFtLiAgVGhlIEpQRUcgc3RhbmRhcmQgcHJvdmlkZXMgbWFya2VyIHR5cGVzICJDT00iIChjb21tZW50KSBhbmQKLSJBUFAwIiB0aHJvdWdoICJBUFAxNSIgKGFwcGxpY2F0aW9uKSB0byBob2xkIGFwcGxpY2F0aW9uLXNwZWNpZmljIGRhdGEuCi1VbmZvcnR1bmF0ZWx5LCB0aGUgdXNlIG9mIHRoZXNlIG1hcmtlcnMgaXMgbm90IHNwZWNpZmllZCBieSB0aGUgc3RhbmRhcmQuCi1DT00gbWFya2VycyBhcmUgZmFpcmx5IHdpZGVseSB1c2VkIHRvIGhvbGQgdXNlci1zdXBwbGllZCB0ZXh0LiAgVGhlIEpGSUYgZmlsZQotZm9ybWF0IHNwZWMgdXNlcyBBUFAwIG1hcmtlcnMgd2l0aCBzcGVjaWZpZWQgaW5pdGlhbCBzdHJpbmdzIHRvIGhvbGQgY2VydGFpbgotZGF0YS4gIEFkb2JlIGFwcGxpY2F0aW9ucyB1c2UgQVBQMTQgbWFya2VycyBiZWdpbm5pbmcgd2l0aCB0aGUgc3RyaW5nICJBZG9iZSIKLWZvciBtaXNjZWxsYW5lb3VzIGRhdGEuICBPdGhlciBBUFBuIG1hcmtlcnMgYXJlIHJhcmVseSBzZWVuLCBidXQgbWlnaHQKLWNvbnRhaW4gYWxtb3N0IGFueXRoaW5nLgotCi1JZiB5b3Ugd2lzaCB0byBzdG9yZSB1c2VyLXN1cHBsaWVkIHRleHQsIHdlIHJlY29tbWVuZCB5b3UgdXNlIENPTSBtYXJrZXJzCi1hbmQgcGxhY2UgcmVhZGFibGUgNy1iaXQgQVNDSUkgdGV4dCBpbiB0aGVtLiAgTmV3bGluZSBjb252ZW50aW9ucyBhcmUgbm90Ci1zdGFuZGFyZGl6ZWQgLS0tIGV4cGVjdCB0byBmaW5kIExGIChVbml4IHN0eWxlKSwgQ1IvTEYgKERPUyBzdHlsZSksIG9yIENSCi0oTWFjIHN0eWxlKS4gIEEgcm9idXN0IENPTSByZWFkZXIgc2hvdWxkIGJlIGFibGUgdG8gY29wZSB3aXRoIHJhbmRvbSBiaW5hcnkKLWdhcmJhZ2UsIGluY2x1ZGluZyBudWxscywgc2luY2Ugc29tZSBhcHBsaWNhdGlvbnMgZ2VuZXJhdGUgQ09NIG1hcmtlcnMKLWNvbnRhaW5pbmcgbm9uLUFTQ0lJIGp1bmsuICAoQnV0IHlvdXJzIHNob3VsZCBub3QgYmUgb25lIG9mIHRoZW0uKQotCi1Gb3IgcHJvZ3JhbS1zdXBwbGllZCBkYXRhLCB1c2UgYW4gQVBQbiBtYXJrZXIsIGFuZCBiZSBzdXJlIHRvIGJlZ2luIGl0IHdpdGggYW4KLWlkZW50aWZ5aW5nIHN0cmluZyBzbyB0aGF0IHlvdSBjYW4gdGVsbCB3aGV0aGVyIHRoZSBtYXJrZXIgaXMgYWN0dWFsbHkgeW91cnMuCi1JdCdzIHByb2JhYmx5IGJlc3QgdG8gYXZvaWQgdXNpbmcgQVBQMCBvciBBUFAxNCBmb3IgYW55IHByaXZhdGUgbWFya2Vycy4KLShOT1RFOiB0aGUgdXBjb21pbmcgU1BJRkYgc3RhbmRhcmQgd2lsbCB1c2UgQVBQOCBtYXJrZXJzOyB3ZSByZWNvbW1lbmQgeW91Ci1ub3QgdXNlIEFQUDggbWFya2VycyBmb3IgYW55IHByaXZhdGUgcHVycG9zZXMsIGVpdGhlci4pCi0KLUtlZXAgaW4gbWluZCB0aGF0IGF0IG1vc3QgNjU1MzMgYnl0ZXMgY2FuIGJlIHB1dCBpbnRvIG9uZSBtYXJrZXIsIGJ1dCB5b3UKLWNhbiBoYXZlIGFzIG1hbnkgbWFya2VycyBhcyB5b3UgbGlrZS4KLQotQnkgZGVmYXVsdCwgdGhlIElKRyBjb21wcmVzc2lvbiBsaWJyYXJ5IHdpbGwgd3JpdGUgYSBKRklGIEFQUDAgbWFya2VyIGlmIHRoZQotc2VsZWN0ZWQgSlBFRyBjb2xvcnNwYWNlIGlzIGdyYXlzY2FsZSBvciBZQ2JDciwgb3IgYW4gQWRvYmUgQVBQMTQgbWFya2VyIGlmCi10aGUgc2VsZWN0ZWQgY29sb3JzcGFjZSBpcyBSR0IsIENNWUssIG9yIFlDQ0suICBZb3UgY2FuIGRpc2FibGUgdGhpcywgYnV0Ci13ZSBkb24ndCByZWNvbW1lbmQgaXQuICBUaGUgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IHdpbGwgcmVjb2duaXplIEpGSUYgYW5kCi1BZG9iZSBtYXJrZXJzIGFuZCB3aWxsIHNldCB0aGUgSlBFRyBjb2xvcnNwYWNlIHByb3Blcmx5IHdoZW4gb25lIGlzIGZvdW5kLgotCi0KLVlvdSBjYW4gd3JpdGUgc3BlY2lhbCBtYXJrZXJzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgZGF0YXN0cmVhbSBoZWFkZXIgYnkKLWNhbGxpbmcganBlZ193cml0ZV9tYXJrZXIoKSBhZnRlciBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgYW5kIGJlZm9yZSB0aGUgZmlyc3QKLWNhbGwgdG8ganBlZ193cml0ZV9zY2FubGluZXMoKS4gIFdoZW4geW91IGRvIHRoaXMsIHRoZSBtYXJrZXJzIGFwcGVhciBhZnRlcgotdGhlIFNPSSBhbmQgdGhlIEpGSUYgQVBQMCBhbmQgQWRvYmUgQVBQMTQgbWFya2VycyAoaWYgd3JpdHRlbiksIGJ1dCBiZWZvcmUKLWFsbCBlbHNlLiAgU3BlY2lmeSB0aGUgbWFya2VyIHR5cGUgcGFyYW1ldGVyIGFzICJKUEVHX0NPTSIgZm9yIENPTSBvcgotIkpQRUdfQVBQMCArIG4iIGZvciBBUFBuLiAgKEFjdHVhbGx5LCBqcGVnX3dyaXRlX21hcmtlciB3aWxsIGxldCB5b3Ugd3JpdGUKLWFueSBtYXJrZXIgdHlwZSwgYnV0IHdlIGRvbid0IHJlY29tbWVuZCB3cml0aW5nIGFueSBvdGhlciBraW5kcyBvZiBtYXJrZXIuKQotRm9yIGV4YW1wbGUsIHRvIHdyaXRlIGEgdXNlciBjb21tZW50IHN0cmluZyBwb2ludGVkIHRvIGJ5IGNvbW1lbnRfdGV4dDoKLQlqcGVnX3dyaXRlX21hcmtlcihjaW5mbywgSlBFR19DT00sIGNvbW1lbnRfdGV4dCwgc3RybGVuKGNvbW1lbnRfdGV4dCkpOwotCi1JZiBpdCdzIG5vdCBjb252ZW5pZW50IHRvIHN0b3JlIGFsbCB0aGUgbWFya2VyIGRhdGEgaW4gbWVtb3J5IGF0IG9uY2UsCi15b3UgY2FuIGluc3RlYWQgY2FsbCBqcGVnX3dyaXRlX21faGVhZGVyKCkgZm9sbG93ZWQgYnkgbXVsdGlwbGUgY2FsbHMgdG8KLWpwZWdfd3JpdGVfbV9ieXRlKCkuICBJZiB5b3UgZG8gaXQgdGhpcyB3YXksIGl0J3MgeW91ciByZXNwb25zaWJpbGl0eSB0bwotY2FsbCBqcGVnX3dyaXRlX21fYnl0ZSgpIGV4YWN0bHkgdGhlIG51bWJlciBvZiB0aW1lcyBnaXZlbiBpbiB0aGUgbGVuZ3RoCi1wYXJhbWV0ZXIgdG8ganBlZ193cml0ZV9tX2hlYWRlcigpLiAgKFRoaXMgbWV0aG9kIGxldHMgeW91IGVtcHR5IHRoZQotb3V0cHV0IGJ1ZmZlciBwYXJ0d2F5IHRocm91Z2ggYSBtYXJrZXIsIHdoaWNoIG1pZ2h0IGJlIGltcG9ydGFudCB3aGVuCi11c2luZyBhIHN1c3BlbmRpbmcgZGF0YSBkZXN0aW5hdGlvbiBtb2R1bGUuICBJbiBhbnkgY2FzZSwgaWYgeW91IGFyZSB1c2luZwotYSBzdXNwZW5kaW5nIGRlc3RpbmF0aW9uLCB5b3Ugc2hvdWxkIGZsdXNoIGl0cyBidWZmZXIgYWZ0ZXIgaW5zZXJ0aW5nCi1hbnkgc3BlY2lhbCBtYXJrZXJzLiAgU2VlICJJL08gc3VzcGVuc2lvbiIuKQotCi1PciwgaWYgeW91IHByZWZlciB0byBzeW50aGVzaXplIHRoZSBtYXJrZXIgYnl0ZSBzZXF1ZW5jZSB5b3Vyc2VsZiwKLXlvdSBjYW4ganVzdCBjcmFtIGl0IHN0cmFpZ2h0IGludG8gdGhlIGRhdGEgZGVzdGluYXRpb24gbW9kdWxlLgotCi1JZiB5b3UgYXJlIHdyaXRpbmcgSkZJRiAxLjAyIGV4dGVuc2lvbiBtYXJrZXJzICh0aHVtYm5haWwgaW1hZ2VzKSwgZG9uJ3QKLWZvcmdldCB0byBzZXQgY2luZm8uSkZJRl9taW5vcl92ZXJzaW9uID0gMiBzbyB0aGF0IHRoZSBlbmNvZGVyIHdpbGwgd3JpdGUgdGhlCi1jb3JyZWN0IEpGSUYgdmVyc2lvbiBudW1iZXIgaW4gdGhlIEpGSUYgaGVhZGVyIG1hcmtlci4gIFRoZSBsaWJyYXJ5J3MgZGVmYXVsdAotaXMgdG8gd3JpdGUgdmVyc2lvbiAxLjAxLCBidXQgdGhhdCdzIHdyb25nIGlmIHlvdSBpbnNlcnQgYW55IDEuMDIgZXh0ZW5zaW9uCi1tYXJrZXJzLiAgKFdlIGNvdWxkIHByb2JhYmx5IGdldCBhd2F5IHdpdGgganVzdCBkZWZhdWx0aW5nIHRvIDEuMDIsIGJ1dCB0aGVyZQotdXNlZCB0byBiZSBicm9rZW4gZGVjb2RlcnMgdGhhdCB3b3VsZCBjb21wbGFpbiBhYm91dCB1bmtub3duIG1pbm9yIHZlcnNpb24KLW51bWJlcnMuICBUbyByZWR1Y2UgY29tcGF0aWJpbGl0eSByaXNrcyBpdCdzIHNhZmVzdCBub3QgdG8gd3JpdGUgMS4wMiB1bmxlc3MKLXlvdSBhcmUgYWN0dWFsbHkgdXNpbmcgMS4wMiBleHRlbnNpb25zLikKLQotCi1XaGVuIHJlYWRpbmcsIHR3byBtZXRob2RzIG9mIGhhbmRsaW5nIHNwZWNpYWwgbWFya2VycyBhcmUgYXZhaWxhYmxlOgotMS4gWW91IGNhbiBhc2sgdGhlIGxpYnJhcnkgdG8gc2F2ZSB0aGUgY29udGVudHMgb2YgQ09NIGFuZC9vciBBUFBuIG1hcmtlcnMKLWludG8gbWVtb3J5LCBhbmQgdGhlbiBleGFtaW5lIHRoZW0gYXQgeW91ciBsZWlzdXJlIGFmdGVyd2FyZHMuCi0yLiBZb3UgY2FuIHN1cHBseSB5b3VyIG93biByb3V0aW5lIHRvIHByb2Nlc3MgQ09NIGFuZC9vciBBUFBuIG1hcmtlcnMKLW9uLXRoZS1mbHkgYXMgdGhleSBhcmUgcmVhZC4KLVRoZSBmaXJzdCBtZXRob2QgaXMgc2ltcGxlciB0byB1c2UsIGVzcGVjaWFsbHkgaWYgeW91IGFyZSB1c2luZyBhIHN1c3BlbmRpbmcKLWRhdGEgc291cmNlOyB3cml0aW5nIGEgbWFya2VyIHByb2Nlc3NvciB0aGF0IGNvcGVzIHdpdGggaW5wdXQgc3VzcGVuc2lvbiBpcwotbm90IGVhc3kgKGNvbnNpZGVyIHdoYXQgaGFwcGVucyBpZiB0aGUgbWFya2VyIGlzIGxvbmdlciB0aGFuIHlvdXIgYXZhaWxhYmxlCi1pbnB1dCBidWZmZXIpLiAgSG93ZXZlciwgdGhlIHNlY29uZCBtZXRob2QgY29uc2VydmVzIG1lbW9yeSBzaW5jZSB0aGUgbWFya2VyCi1kYXRhIG5lZWQgbm90IGJlIGtlcHQgYXJvdW5kIGFmdGVyIGl0J3MgYmVlbiBwcm9jZXNzZWQuCi0KLUZvciBlaXRoZXIgbWV0aG9kLCB5b3UnZCBub3JtYWxseSBzZXQgdXAgbWFya2VyIGhhbmRsaW5nIGFmdGVyIGNyZWF0aW5nIGEKLWRlY29tcHJlc3Npb24gb2JqZWN0IGFuZCBiZWZvcmUgY2FsbGluZyBqcGVnX3JlYWRfaGVhZGVyKCksIGJlY2F1c2UgdGhlCi1tYXJrZXJzIG9mIGludGVyZXN0IHdpbGwgdHlwaWNhbGx5IGJlIG5lYXIgdGhlIGhlYWQgb2YgdGhlIGZpbGUgYW5kIHNvIHdpbGwKLWJlIHNjYW5uZWQgYnkganBlZ19yZWFkX2hlYWRlci4gIE9uY2UgeW91J3ZlIGVzdGFibGlzaGVkIGEgbWFya2VyIGhhbmRsaW5nCi1tZXRob2QsIGl0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIGxpZmUgb2YgdGhhdCBkZWNvbXByZXNzaW9uIG9iamVjdAotKHBvdGVudGlhbGx5IG1hbnkgZGF0YXN0cmVhbXMpLCB1bmxlc3MgeW91IGNoYW5nZSBpdC4gIE1hcmtlciBoYW5kbGluZyBpcwotZGV0ZXJtaW5lZCBzZXBhcmF0ZWx5IGZvciBDT00gbWFya2VycyBhbmQgZm9yIGVhY2ggQVBQbiBtYXJrZXIgY29kZS4KLQotCi1UbyBzYXZlIHRoZSBjb250ZW50cyBvZiBzcGVjaWFsIG1hcmtlcnMgaW4gbWVtb3J5LCBjYWxsCi0JanBlZ19zYXZlX21hcmtlcnMoY2luZm8sIG1hcmtlcl9jb2RlLCBsZW5ndGhfbGltaXQpCi13aGVyZSBtYXJrZXJfY29kZSBpcyB0aGUgbWFya2VyIHR5cGUgdG8gc2F2ZSwgSlBFR19DT00gb3IgSlBFR19BUFAwK24uCi0oVG8gYXJyYW5nZSB0byBzYXZlIGFsbCB0aGUgc3BlY2lhbCBtYXJrZXIgdHlwZXMsIHlvdSBuZWVkIHRvIGNhbGwgdGhpcwotcm91dGluZSAxNyB0aW1lcywgZm9yIENPTSBhbmQgQVBQMC1BUFAxNS4pICBJZiB0aGUgaW5jb21pbmcgbWFya2VyIGlzIGxvbmdlcgotdGhhbiBsZW5ndGhfbGltaXQgZGF0YSBieXRlcywgb25seSBsZW5ndGhfbGltaXQgYnl0ZXMgd2lsbCBiZSBzYXZlZDsgdGhpcwotcGFyYW1ldGVyIGFsbG93cyB5b3UgdG8gYXZvaWQgY2hld2luZyB1cCBtZW1vcnkgd2hlbiB5b3Ugb25seSBuZWVkIHRvIHNlZSB0aGUKLWZpcnN0IGZldyBieXRlcyBvZiBhIHBvdGVudGlhbGx5IGxhcmdlIG1hcmtlci4gIElmIHlvdSB3YW50IHRvIHNhdmUgYWxsIHRoZQotZGF0YSwgc2V0IGxlbmd0aF9saW1pdCB0byAweEZGRkY7IHRoYXQgaXMgZW5vdWdoIHNpbmNlIG1hcmtlciBsZW5ndGhzIGFyZSBvbmx5Ci0xNiBiaXRzLiAgQXMgYSBzcGVjaWFsIGNhc2UsIHNldHRpbmcgbGVuZ3RoX2xpbWl0IHRvIDAgcHJldmVudHMgdGhhdCBtYXJrZXIKLXR5cGUgZnJvbSBiZWluZyBzYXZlZCBhdCBhbGwuICAoVGhhdCBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvciwgaW4gZmFjdC4pCi0KLUFmdGVyIGpwZWdfcmVhZF9oZWFkZXIoKSBjb21wbGV0ZXMsIHlvdSBjYW4gZXhhbWluZSB0aGUgc3BlY2lhbCBtYXJrZXJzIGJ5Ci1mb2xsb3dpbmcgdGhlIGNpbmZvLT5tYXJrZXJfbGlzdCBwb2ludGVyIGNoYWluLiAgQWxsIHRoZSBzcGVjaWFsIG1hcmtlcnMgaW4KLXRoZSBmaWxlIGFwcGVhciBpbiB0aGlzIGxpc3QsIGluIG9yZGVyIG9mIHRoZWlyIG9jY3VycmVuY2UgaW4gdGhlIGZpbGUgKGJ1dAotb21pdHRpbmcgYW55IG1hcmtlcnMgb2YgdHlwZXMgeW91IGRpZG4ndCBhc2sgZm9yKS4gIEJvdGggdGhlIG9yaWdpbmFsIGRhdGEKLWxlbmd0aCBhbmQgdGhlIHNhdmVkIGRhdGEgbGVuZ3RoIGFyZSByZWNvcmRlZCBmb3IgZWFjaCBsaXN0IGVudHJ5OyB0aGUgbGF0dGVyCi13aWxsIG5vdCBleGNlZWQgbGVuZ3RoX2xpbWl0IGZvciB0aGUgcGFydGljdWxhciBtYXJrZXIgdHlwZS4gIE5vdGUgdGhhdCB0aGVzZQotbGVuZ3RocyBleGNsdWRlIHRoZSBtYXJrZXIgbGVuZ3RoIHdvcmQsIHdoZXJlYXMgdGhlIHN0b3JlZCByZXByZXNlbnRhdGlvbgotd2l0aGluIHRoZSBKUEVHIGZpbGUgaW5jbHVkZXMgaXQuICAoSGVuY2UgdGhlIG1heGltdW0gZGF0YSBsZW5ndGggaXMgcmVhbGx5Ci1vbmx5IDY1NTMzLikKLQotSXQgaXMgcG9zc2libGUgdGhhdCBhZGRpdGlvbmFsIHNwZWNpYWwgbWFya2VycyBhcHBlYXIgaW4gdGhlIGZpbGUgYmV5b25kIHRoZQotU09TIG1hcmtlciBhdCB3aGljaCBqcGVnX3JlYWRfaGVhZGVyIHN0b3BzOyBpZiBzbywgdGhlIG1hcmtlciBsaXN0IHdpbGwgYmUKLWV4dGVuZGVkIGR1cmluZyByZWFkaW5nIG9mIHRoZSByZXN0IG9mIHRoZSBmaWxlLiAgVGhpcyBpcyBub3QgZXhwZWN0ZWQgdG8gYmUKLWNvbW1vbiwgaG93ZXZlci4gIElmIHlvdSBhcmUgc2hvcnQgb24gbWVtb3J5IHlvdSBtYXkgd2FudCB0byByZXNldCB0aGUgbGVuZ3RoCi1saW1pdCB0byB6ZXJvIGZvciBhbGwgbWFya2VyIHR5cGVzIGFmdGVyIGZpbmlzaGluZyBqcGVnX3JlYWRfaGVhZGVyLCB0bwotZW5zdXJlIHRoYXQgdGhlIG1heF9tZW1vcnlfdG9fdXNlIHNldHRpbmcgY2Fubm90IGJlIGV4Y2VlZGVkIGR1ZSB0byBhZGRpdGlvbgotb2YgbGF0ZXIgbWFya2Vycy4KLQotVGhlIG1hcmtlciBsaXN0IHJlbWFpbnMgc3RvcmVkIHVudGlsIHlvdSBjYWxsIGpwZWdfZmluaXNoX2RlY29tcHJlc3Mgb3IKLWpwZWdfYWJvcnQsIGF0IHdoaWNoIHBvaW50IHRoZSBtZW1vcnkgaXMgZnJlZWQgYW5kIHRoZSBsaXN0IGlzIHNldCB0byBlbXB0eS4KLShqcGVnX2Rlc3Ryb3kgYWxzbyByZWxlYXNlcyB0aGUgc3RvcmFnZSwgb2YgY291cnNlLikKLQotTm90ZSB0aGF0IHRoZSBsaWJyYXJ5IGlzIGludGVybmFsbHkgaW50ZXJlc3RlZCBpbiBBUFAwIGFuZCBBUFAxNCBtYXJrZXJzOwotaWYgeW91IHRyeSB0byBzZXQgYSBzbWFsbCBub256ZXJvIGxlbmd0aCBsaW1pdCBvbiB0aGVzZSB0eXBlcywgdGhlIGxpYnJhcnkKLXdpbGwgc2lsZW50bHkgZm9yY2UgdGhlIGxlbmd0aCB1cCB0byB0aGUgbWluaW11bSBpdCB3YW50cy4gIChCdXQgeW91IGNhbiBzZXQKLWEgemVybyBsZW5ndGggbGltaXQgdG8gcHJldmVudCB0aGVtIGZyb20gYmVpbmcgc2F2ZWQgYXQgYWxsLikgIEFsc28sIGluIGEKLTE2LWJpdCBlbnZpcm9ubWVudCwgdGhlIG1heGltdW0gbGVuZ3RoIGxpbWl0IG1heSBiZSBjb25zdHJhaW5lZCB0byBsZXNzIHRoYW4KLTY1NTMzIGJ5IG1hbGxvYygpIGxpbWl0YXRpb25zLiAgSXQgaXMgdGhlcmVmb3JlIGJlc3Qgbm90IHRvIGFzc3VtZSB0aGF0IHRoZQotZWZmZWN0aXZlIGxlbmd0aCBsaW1pdCBpcyBleGFjdGx5IHdoYXQgeW91IHNldCBpdCB0byBiZS4KLQotCi1JZiB5b3Ugd2FudCB0byBzdXBwbHkgeW91ciBvd24gbWFya2VyLXJlYWRpbmcgcm91dGluZSwgeW91IGRvIGl0IGJ5IGNhbGxpbmcKLWpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IoKS4gIEEgbWFya2VyIHByb2Nlc3NvciByb3V0aW5lIG11c3QgaGF2ZSB0aGUKLXNpZ25hdHVyZQotCWJvb2xlYW4ganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLUFsdGhvdWdoIHRoZSBtYXJrZXIgY29kZSBpcyBub3QgZXhwbGljaXRseSBwYXNzZWQsIHRoZSByb3V0aW5lIGNhbiBmaW5kIGl0Ci1pbiBjaW5mby0+dW5yZWFkX21hcmtlci4gIEF0IHRoZSB0aW1lIG9mIGNhbGwsIHRoZSBtYXJrZXIgcHJvcGVyIGhhcyBiZWVuCi1yZWFkIGZyb20gdGhlIGRhdGEgc291cmNlIG1vZHVsZS4gIFRoZSBwcm9jZXNzb3Igcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3IKLXJlYWRpbmcgdGhlIG1hcmtlciBsZW5ndGggd29yZCBhbmQgdGhlIHJlbWFpbmluZyBwYXJhbWV0ZXIgYnl0ZXMsIGlmIGFueS4KLVJldHVybiBUUlVFIHRvIGluZGljYXRlIHN1Y2Nlc3MuICAoRkFMU0Ugc2hvdWxkIGJlIHJldHVybmVkIG9ubHkgaWYgeW91IGFyZQotdXNpbmcgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGFuZCBpdCB0ZWxscyB5b3UgdG8gc3VzcGVuZC4gIFNlZSB0aGUgc3RhbmRhcmQKLW1hcmtlciBwcm9jZXNzb3JzIGluIGpkbWFya2VyLmMgZm9yIGFwcHJvcHJpYXRlIGNvZGluZyBtZXRob2RzIGlmIHlvdSBuZWVkIHRvCi11c2UgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlLikKLQotSWYgeW91IG92ZXJyaWRlIHRoZSBkZWZhdWx0IEFQUDAgb3IgQVBQMTQgcHJvY2Vzc29ycywgaXQgaXMgdXAgdG8geW91IHRvCi1yZWNvZ25pemUgSkZJRiBhbmQgQWRvYmUgbWFya2VycyBpZiB5b3Ugd2FudCBjb2xvcnNwYWNlIHJlY29nbml0aW9uIHRvIG9jY3VyCi1wcm9wZXJseS4gIFdlIHJlY29tbWVuZCBjb3B5aW5nIGFuZCBleHRlbmRpbmcgdGhlIGRlZmF1bHQgcHJvY2Vzc29ycyBpZiB5b3UKLXdhbnQgdG8gZG8gdGhhdC4gIChBIGJldHRlciBpZGVhIGlzIHRvIHNhdmUgdGhlc2UgbWFya2VyIHR5cGVzIGZvciBsYXRlcgotZXhhbWluYXRpb24gYnkgY2FsbGluZyBqcGVnX3NhdmVfbWFya2VycygpOyB0aGF0IG1ldGhvZCBkb2Vzbid0IGludGVyZmVyZQotd2l0aCB0aGUgbGlicmFyeSdzIG93biBwcm9jZXNzaW5nIG9mIHRoZXNlIG1hcmtlcnMuKQotCi1qcGVnX3NldF9tYXJrZXJfcHJvY2Vzc29yKCkgYW5kIGpwZWdfc2F2ZV9tYXJrZXJzKCkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZQotLS0tIGlmIHlvdSBjYWxsIG9uZSBpdCBvdmVycmlkZXMgYW55IHByZXZpb3VzIGNhbGwgdG8gdGhlIG90aGVyLCBmb3IgdGhlCi1wYXJ0aWN1bGFyIG1hcmtlciB0eXBlIHNwZWNpZmllZC4KLQotQSBzaW1wbGUgZXhhbXBsZSBvZiBhbiBleHRlcm5hbCBDT00gcHJvY2Vzc29yIGNhbiBiZSBmb3VuZCBpbiBkanBlZy5jLgotQWxzbywgc2VlIGpwZWd0cmFuLmMgZm9yIGFuIGV4YW1wbGUgb2YgdXNpbmcganBlZ19zYXZlX21hcmtlcnMuCi0KLQotUmF3IChkb3duc2FtcGxlZCkgaW1hZ2UgZGF0YQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Tb21lIGFwcGxpY2F0aW9ucyBuZWVkIHRvIHN1cHBseSBhbHJlYWR5LWRvd25zYW1wbGVkIGltYWdlIGRhdGEgdG8gdGhlIEpQRUcKLWNvbXByZXNzb3IsIG9yIHRvIHJlY2VpdmUgcmF3IGRvd25zYW1wbGVkIGRhdGEgZnJvbSB0aGUgZGVjb21wcmVzc29yLiAgVGhlCi1saWJyYXJ5IHN1cHBvcnRzIHRoaXMgcmVxdWlyZW1lbnQgYnkgYWxsb3dpbmcgdGhlIGFwcGxpY2F0aW9uIHRvIHdyaXRlIG9yCi1yZWFkIHJhdyBkYXRhLCBieXBhc3NpbmcgdGhlIG5vcm1hbCBwcmVwcm9jZXNzaW5nIG9yIHBvc3Rwcm9jZXNzaW5nIHN0ZXBzLgotVGhlIGludGVyZmFjZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgc3RhbmRhcmQgb25lIGFuZCBpcyBzb21ld2hhdCBoYXJkZXIgdG8KLXVzZS4gIElmIHlvdXIgaW50ZXJlc3QgaXMgbWVyZWx5IGluIGJ5cGFzc2luZyBjb2xvciBjb252ZXJzaW9uLCB3ZSByZWNvbW1lbmQKLXRoYXQgeW91IHVzZSB0aGUgc3RhbmRhcmQgaW50ZXJmYWNlIGFuZCBzaW1wbHkgc2V0IGpwZWdfY29sb3Jfc3BhY2UgPQotaW5fY29sb3Jfc3BhY2UgKG9yIGpwZWdfY29sb3Jfc3BhY2UgPSBvdXRfY29sb3Jfc3BhY2UgZm9yIGRlY29tcHJlc3Npb24pLgotVGhlIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gdGhpcyBzZWN0aW9uIGlzIG5lY2Vzc2FyeSBvbmx5IHRvIHN1cHBseSBvcgotcmVjZWl2ZSBkb3duc2FtcGxlZCBpbWFnZSBkYXRhLCBpbiB3aGljaCBub3QgYWxsIGNvbXBvbmVudHMgaGF2ZSB0aGUgc2FtZQotZGltZW5zaW9ucy4KLQotCi1UbyBjb21wcmVzcyByYXcgZGF0YSwgeW91IG11c3Qgc3VwcGx5IHRoZSBkYXRhIGluIHRoZSBjb2xvcnNwYWNlIHRvIGJlIHVzZWQKLWluIHRoZSBKUEVHIGZpbGUgKHBsZWFzZSByZWFkIHRoZSBlYXJsaWVyIHNlY3Rpb24gb24gU3BlY2lhbCBjb2xvciBzcGFjZXMpCi1hbmQgZG93bnNhbXBsZWQgdG8gdGhlIHNhbXBsaW5nIGZhY3RvcnMgc3BlY2lmaWVkIGluIHRoZSBKUEVHIHBhcmFtZXRlcnMuCi1Zb3UgbXVzdCBzdXBwbHkgdGhlIGRhdGEgaW4gdGhlIGZvcm1hdCB1c2VkIGludGVybmFsbHkgYnkgdGhlIEpQRUcgbGlicmFyeSwKLW5hbWVseSBhIEpTQU1QSU1BR0UgYXJyYXkuICBUaGlzIGlzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHR3by1kaW1lbnNpb25hbAotYXJyYXlzLCBlYWNoIG9mIHR5cGUgSlNBTVBBUlJBWS4gIEVhY2ggMi1EIGFycmF5IGhvbGRzIHRoZSB2YWx1ZXMgZm9yIG9uZQotY29sb3IgY29tcG9uZW50LiAgVGhpcyBzdHJ1Y3R1cmUgaXMgbmVjZXNzYXJ5IHNpbmNlIHRoZSBjb21wb25lbnRzIGFyZSBvZgotZGlmZmVyZW50IHNpemVzLiAgSWYgdGhlIGltYWdlIGRpbWVuc2lvbnMgYXJlIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBNQ1Ugc2l6ZSwKLXlvdSBtdXN0IGFsc28gcGFkIHRoZSBkYXRhIGNvcnJlY3RseSAodXN1YWxseSwgdGhpcyBpcyBkb25lIGJ5IHJlcGxpY2F0aW5nCi10aGUgbGFzdCBjb2x1bW4gYW5kL29yIHJvdykuICBUaGUgZGF0YSBtdXN0IGJlIHBhZGRlZCB0byBhIG11bHRpcGxlIG9mIGEgRENUCi1ibG9jayBpbiBlYWNoIGNvbXBvbmVudDogdGhhdCBpcywgZWFjaCBkb3duc2FtcGxlZCByb3cgbXVzdCBjb250YWluIGEKLW11bHRpcGxlIG9mIDggdmFsaWQgc2FtcGxlcywgYW5kIHRoZXJlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IHNhbXBsZSByb3dzCi1mb3IgZWFjaCBjb21wb25lbnQuICAoRm9yIGFwcGxpY2F0aW9ucyBzdWNoIGFzIGNvbnZlcnNpb24gb2YgZGlnaXRhbCBUVgotaW1hZ2VzLCB0aGUgc3RhbmRhcmQgaW1hZ2Ugc2l6ZSBpcyB1c3VhbGx5IGEgbXVsdGlwbGUgb2YgdGhlIERDVCBibG9jayBzaXplLAotc28gdGhhdCBubyBwYWRkaW5nIG5lZWQgYWN0dWFsbHkgYmUgZG9uZS4pCi0KLVRoZSBwcm9jZWR1cmUgZm9yIGNvbXByZXNzaW9uIG9mIHJhdyBkYXRhIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyBub3JtYWwKLWNvbXByZXNzaW9uLCBleGNlcHQgdGhhdCB5b3UgY2FsbCBqcGVnX3dyaXRlX3Jhd19kYXRhKCkgaW4gcGxhY2Ugb2YKLWpwZWdfd3JpdGVfc2NhbmxpbmVzKCkuICBCZWZvcmUgY2FsbGluZyBqcGVnX3N0YXJ0X2NvbXByZXNzKCksIHlvdSBtdXN0IGRvCi10aGUgZm9sbG93aW5nOgotICAqIFNldCBjaW5mby0+cmF3X2RhdGFfaW4gdG8gVFJVRS4gIChJdCBpcyBzZXQgRkFMU0UgYnkganBlZ19zZXRfZGVmYXVsdHMoKS4pCi0gICAgVGhpcyBub3RpZmllcyB0aGUgbGlicmFyeSB0aGF0IHlvdSB3aWxsIGJlIHN1cHBseWluZyByYXcgZGF0YS4KLSAgKiBFbnN1cmUganBlZ19jb2xvcl9zcGFjZSBpcyBjb3JyZWN0IC0tLSBhbiBleHBsaWNpdCBqcGVnX3NldF9jb2xvcnNwYWNlKCkKLSAgICBjYWxsIGlzIGEgZ29vZCBpZGVhLiAgTm90ZSB0aGF0IHNpbmNlIGNvbG9yIGNvbnZlcnNpb24gaXMgYnlwYXNzZWQsCi0gICAgaW5fY29sb3Jfc3BhY2UgaXMgaWdub3JlZCwgZXhjZXB0IHRoYXQganBlZ19zZXRfZGVmYXVsdHMoKSB1c2VzIGl0IHRvCi0gICAgY2hvb3NlIHRoZSBkZWZhdWx0IGpwZWdfY29sb3Jfc3BhY2Ugc2V0dGluZy4KLSAgKiBFbnN1cmUgdGhlIHNhbXBsaW5nIGZhY3RvcnMsIGNpbmZvLT5jb21wX2luZm9baV0uaF9zYW1wX2ZhY3RvciBhbmQKLSAgICBjaW5mby0+Y29tcF9pbmZvW2ldLnZfc2FtcF9mYWN0b3IsIGFyZSBjb3JyZWN0LiAgU2luY2UgdGhlc2UgaW5kaWNhdGUgdGhlCi0gICAgZGltZW5zaW9ucyBvZiB0aGUgZGF0YSB5b3UgYXJlIHN1cHBseWluZywgaXQncyB3aXNlIHRvIHNldCB0aGVtCi0gICAgZXhwbGljaXRseSwgcmF0aGVyIHRoYW4gYXNzdW1pbmcgdGhlIGxpYnJhcnkncyBkZWZhdWx0cyBhcmUgd2hhdCB5b3Ugd2FudC4KLQotVG8gcGFzcyByYXcgZGF0YSB0byB0aGUgbGlicmFyeSwgY2FsbCBqcGVnX3dyaXRlX3Jhd19kYXRhKCkgaW4gcGxhY2Ugb2YKLWpwZWdfd3JpdGVfc2NhbmxpbmVzKCkuICBUaGUgdHdvIHJvdXRpbmVzIHdvcmsgc2ltaWxhcmx5IGV4Y2VwdCB0aGF0Ci1qcGVnX3dyaXRlX3Jhd19kYXRhIHRha2VzIGEgSlNBTVBJTUFHRSBkYXRhIGFycmF5IHJhdGhlciB0aGFuIEpTQU1QQVJSQVkuCi1UaGUgc2NhbmxpbmVzIGNvdW50IHBhc3NlZCB0byBhbmQgcmV0dXJuZWQgZnJvbSBqcGVnX3dyaXRlX3Jhd19kYXRhIGlzCi1tZWFzdXJlZCBpbiB0ZXJtcyBvZiB0aGUgY29tcG9uZW50IHdpdGggdGhlIGxhcmdlc3Qgdl9zYW1wX2ZhY3Rvci4KLQotanBlZ193cml0ZV9yYXdfZGF0YSgpIHByb2Nlc3NlcyBvbmUgTUNVIHJvdyBwZXIgY2FsbCwgd2hpY2ggaXMgdG8gc2F5Ci12X3NhbXBfZmFjdG9yKkRDVFNJWkUgc2FtcGxlIHJvd3Mgb2YgZWFjaCBjb21wb25lbnQuICBUaGUgcGFzc2VkIG51bV9saW5lcwotdmFsdWUgbXVzdCBiZSBhdCBsZWFzdCBtYXhfdl9zYW1wX2ZhY3RvcipEQ1RTSVpFLCBhbmQgdGhlIHJldHVybiB2YWx1ZSB3aWxsCi1iZSBleGFjdGx5IHRoYXQgYW1vdW50IChvciBwb3NzaWJseSBzb21lIG11bHRpcGxlIG9mIHRoYXQgYW1vdW50LCBpbiBmdXR1cmUKLWxpYnJhcnkgdmVyc2lvbnMpLiAgVGhpcyBpcyB0cnVlIGV2ZW4gb24gdGhlIGxhc3QgY2FsbCBhdCB0aGUgYm90dG9tIG9mIHRoZQotaW1hZ2U7IGRvbid0IGZvcmdldCB0byBwYWQgeW91ciBkYXRhIGFzIG5lY2Vzc2FyeS4KLQotVGhlIHJlcXVpcmVkIGRpbWVuc2lvbnMgb2YgdGhlIHN1cHBsaWVkIGRhdGEgY2FuIGJlIGNvbXB1dGVkIGZvciBlYWNoCi1jb21wb25lbnQgYXMKLQljaW5mby0+Y29tcF9pbmZvW2ldLndpZHRoX2luX2Jsb2NrcypEQ1RTSVpFICBzYW1wbGVzIHBlciByb3cKLQljaW5mby0+Y29tcF9pbmZvW2ldLmhlaWdodF9pbl9ibG9ja3MqRENUU0laRSByb3dzIGluIGltYWdlCi1hZnRlciBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgaGFzIGluaXRpYWxpemVkIHRob3NlIGZpZWxkcy4gIElmIHRoZSB2YWxpZCBkYXRhCi1pcyBzbWFsbGVyIHRoYW4gdGhpcywgaXQgbXVzdCBiZSBwYWRkZWQgYXBwcm9wcmlhdGVseS4gIEZvciBzb21lIHNhbXBsaW5nCi1mYWN0b3JzIGFuZCBpbWFnZSBzaXplcywgYWRkaXRpb25hbCBkdW1teSBEQ1QgYmxvY2tzIGFyZSBpbnNlcnRlZCB0byBtYWtlCi10aGUgaW1hZ2UgYSBtdWx0aXBsZSBvZiB0aGUgTUNVIGRpbWVuc2lvbnMuICBUaGUgbGlicmFyeSBjcmVhdGVzIHN1Y2ggZHVtbXkKLWJsb2NrcyBpdHNlbGY7IGl0IGRvZXMgbm90IHJlYWQgdGhlbSBmcm9tIHlvdXIgc3VwcGxpZWQgZGF0YS4gIFRoZXJlZm9yZSB5b3UKLW5lZWQgbmV2ZXIgcGFkIGJ5IG1vcmUgdGhhbiBEQ1RTSVpFIHNhbXBsZXMuICBBbiBleGFtcGxlIG1heSBoZWxwIGhlcmUuCi1Bc3N1bWUgMmgydiBkb3duc2FtcGxpbmcgb2YgWUNiQ3IgZGF0YSwgdGhhdCBpcwotCWNpbmZvLT5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvciA9IDIJCWZvciBZCi0JY2luZm8tPmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID0gMgotCWNpbmZvLT5jb21wX2luZm9bMV0uaF9zYW1wX2ZhY3RvciA9IDEJCWZvciBDYgotCWNpbmZvLT5jb21wX2luZm9bMV0udl9zYW1wX2ZhY3RvciA9IDEKLQljaW5mby0+Y29tcF9pbmZvWzJdLmhfc2FtcF9mYWN0b3IgPSAxCQlmb3IgQ3IKLQljaW5mby0+Y29tcF9pbmZvWzJdLnZfc2FtcF9mYWN0b3IgPSAxCi1hbmQgc3VwcG9zZSB0aGF0IHRoZSBub21pbmFsIGltYWdlIGRpbWVuc2lvbnMgKGNpbmZvLT5pbWFnZV93aWR0aCBhbmQKLWNpbmZvLT5pbWFnZV9oZWlnaHQpIGFyZSAxMDF4MTAxIHBpeGVscy4gIFRoZW4ganBlZ19zdGFydF9jb21wcmVzcygpIHdpbGwKLWNvbXB1dGUgZG93bnNhbXBsZWRfd2lkdGggPSAxMDEgYW5kIHdpZHRoX2luX2Jsb2NrcyA9IDEzIGZvciBZLAotZG93bnNhbXBsZWRfd2lkdGggPSA1MSBhbmQgd2lkdGhfaW5fYmxvY2tzID0gNyBmb3IgQ2IgYW5kIENyIChhbmQgdGhlIHNhbWUKLWZvciB0aGUgaGVpZ2h0IGZpZWxkcykuICBZb3UgbXVzdCBwYWQgdGhlIFkgZGF0YSB0byBhdCBsZWFzdCAxMyo4ID0gMTA0Ci1jb2x1bW5zIGFuZCByb3dzLCB0aGUgQ2IvQ3IgZGF0YSB0byBhdCBsZWFzdCA3KjggPSA1NiBjb2x1bW5zIGFuZCByb3dzLiAgVGhlCi1NQ1UgaGVpZ2h0IGlzIG1heF92X3NhbXBfZmFjdG9yID0gMiBEQ1Qgcm93cyBzbyB5b3UgbXVzdCBwYXNzIGF0IGxlYXN0IDE2Ci1zY2FubGluZXMgb24gZWFjaCBjYWxsIHRvIGpwZWdfd3JpdGVfcmF3X2RhdGEoKSwgd2hpY2ggaXMgdG8gc2F5IDE2IGFjdHVhbAotc2FtcGxlIHJvd3Mgb2YgWSBhbmQgOCBlYWNoIG9mIENiIGFuZCBDci4gIEEgdG90YWwgb2YgNyBNQ1Ugcm93cyBhcmUgbmVlZGVkLAotc28geW91IG11c3QgcGFzcyBhIHRvdGFsIG9mIDcqMTYgPSAxMTIgInNjYW5saW5lcyIuICBUaGUgbGFzdCBEQ1QgYmxvY2sgcm93Ci1vZiBZIGRhdGEgaXMgZHVtbXksIHNvIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgeW91IHBhc3MgZm9yIGl0IGluIHRoZSBkYXRhCi1hcnJheXMsIGJ1dCB0aGUgc2NhbmxpbmVzIGNvdW50IG11c3QgdG90YWwgdXAgdG8gMTEyIHNvIHRoYXQgYWxsIG9mIHRoZSBDYgotYW5kIENyIGRhdGEgZ2V0cyBwYXNzZWQuCi0KLU91dHB1dCBzdXNwZW5zaW9uIGlzIHN1cHBvcnRlZCB3aXRoIHJhdy1kYXRhIGNvbXByZXNzaW9uOiBpZiB0aGUgZGF0YQotZGVzdGluYXRpb24gbW9kdWxlIHN1c3BlbmRzLCBqcGVnX3dyaXRlX3Jhd19kYXRhKCkgd2lsbCByZXR1cm4gMC4KLUluIHRoaXMgY2FzZSB0aGUgc2FtZSBkYXRhIHJvd3MgbXVzdCBiZSBwYXNzZWQgYWdhaW4gb24gdGhlIG5leHQgY2FsbC4KLQotCi1EZWNvbXByZXNzaW9uIHdpdGggcmF3IGRhdGEgb3V0cHV0IGltcGxpZXMgYnlwYXNzaW5nIGFsbCBwb3N0cHJvY2Vzc2luZzoKLXlvdSBjYW5ub3QgYXNrIGZvciByZXNjYWxpbmcgb3IgY29sb3IgcXVhbnRpemF0aW9uLCBmb3IgaW5zdGFuY2UuICBNb3JlCi1zZXJpb3VzbHksIHlvdSBtdXN0IGRlYWwgd2l0aCB0aGUgY29sb3Igc3BhY2UgYW5kIHNhbXBsaW5nIGZhY3RvcnMgcHJlc2VudCBpbgotdGhlIGluY29taW5nIGZpbGUuICBJZiB5b3VyIGFwcGxpY2F0aW9uIG9ubHkgaGFuZGxlcywgc2F5LCAyaDF2IFlDYkNyIGRhdGEsCi15b3UgbXVzdCBjaGVjayBmb3IgYW5kIGZhaWwgb24gb3RoZXIgY29sb3Igc3BhY2VzIG9yIG90aGVyIHNhbXBsaW5nIGZhY3RvcnMuCi1UaGUgbGlicmFyeSB3aWxsIG5vdCBjb252ZXJ0IHRvIGEgZGlmZmVyZW50IGNvbG9yIHNwYWNlIGZvciB5b3UuCi0KLVRvIG9idGFpbiByYXcgZGF0YSBvdXRwdXQsIHNldCBjaW5mby0+cmF3X2RhdGFfb3V0ID0gVFJVRSBiZWZvcmUKLWpwZWdfc3RhcnRfZGVjb21wcmVzcygpIChpdCBpcyBzZXQgRkFMU0UgYnkganBlZ19yZWFkX2hlYWRlcigpKS4gIEJlIHN1cmUgdG8KLXZlcmlmeSB0aGF0IHRoZSBjb2xvciBzcGFjZSBhbmQgc2FtcGxpbmcgZmFjdG9ycyBhcmUgb25lcyB5b3UgY2FuIGhhbmRsZS4KLVRoZW4gY2FsbCBqcGVnX3JlYWRfcmF3X2RhdGEoKSBpbiBwbGFjZSBvZiBqcGVnX3JlYWRfc2NhbmxpbmVzKCkuICBUaGUKLWRlY29tcHJlc3Npb24gcHJvY2VzcyBpcyBvdGhlcndpc2UgdGhlIHNhbWUgYXMgdXN1YWwuCi0KLWpwZWdfcmVhZF9yYXdfZGF0YSgpIHJldHVybnMgb25lIE1DVSByb3cgcGVyIGNhbGwsIGFuZCB0aHVzIHlvdSBtdXN0IHBhc3MgYQotYnVmZmVyIG9mIGF0IGxlYXN0IG1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUgc2NhbmxpbmVzIChzY2FubGluZSBjb3VudGluZyBpcwotdGhlIHNhbWUgYXMgZm9yIHJhdy1kYXRhIGNvbXByZXNzaW9uKS4gIFRoZSBidWZmZXIgeW91IHBhc3MgbXVzdCBiZSBsYXJnZQotZW5vdWdoIHRvIGhvbGQgdGhlIGFjdHVhbCBkYXRhIHBsdXMgcGFkZGluZyB0byBEQ1QtYmxvY2sgYm91bmRhcmllcy4gIEFzIHdpdGgKLWNvbXByZXNzaW9uLCBhbnkgZW50aXJlbHkgZHVtbXkgRENUIGJsb2NrcyBhcmUgbm90IHByb2Nlc3NlZCBzbyB5b3UgbmVlZCBub3QKLWFsbG9jYXRlIHNwYWNlIGZvciB0aGVtLCBidXQgdGhlIHRvdGFsIHNjYW5saW5lIGNvdW50IGluY2x1ZGVzIHRoZW0uICBUaGUKLWFib3ZlIGV4YW1wbGUgb2YgY29tcHV0aW5nIGJ1ZmZlciBkaW1lbnNpb25zIGZvciByYXctZGF0YSBjb21wcmVzc2lvbiBpcwotZXF1YWxseSB2YWxpZCBmb3IgZGVjb21wcmVzc2lvbi4KLQotSW5wdXQgc3VzcGVuc2lvbiBpcyBzdXBwb3J0ZWQgd2l0aCByYXctZGF0YSBkZWNvbXByZXNzaW9uOiBpZiB0aGUgZGF0YSBzb3VyY2UKLW1vZHVsZSBzdXNwZW5kcywganBlZ19yZWFkX3Jhd19kYXRhKCkgd2lsbCByZXR1cm4gMC4gIFlvdSBjYW4gYWxzbyB1c2UKLWJ1ZmZlcmVkLWltYWdlIG1vZGUgdG8gcmVhZCByYXcgZGF0YSBpbiBtdWx0aXBsZSBwYXNzZXMuCi0KLQotUmVhbGx5IHJhdyBkYXRhOiBEQ1QgY29lZmZpY2llbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSXQgaXMgcG9zc2libGUgdG8gcmVhZCBvciB3cml0ZSB0aGUgY29udGVudHMgb2YgYSBKUEVHIGZpbGUgYXMgcmF3IERDVAotY29lZmZpY2llbnRzLiAgVGhpcyBmYWNpbGl0eSBpcyBtYWlubHkgaW50ZW5kZWQgZm9yIHVzZSBpbiBsb3NzbGVzcwotdHJhbnNjb2RpbmcgYmV0d2VlbiBkaWZmZXJlbnQgSlBFRyBmaWxlIGZvcm1hdHMuICBPdGhlciBwb3NzaWJsZSBhcHBsaWNhdGlvbnMKLWluY2x1ZGUgbG9zc2xlc3MgY3JvcHBpbmcgb2YgYSBKUEVHIGltYWdlLCBsb3NzbGVzcyByZWFzc2VtYmx5IG9mIGEKLW11bHRpLXN0cmlwIG9yIG11bHRpLXRpbGUgVElGRi9KUEVHIGZpbGUgaW50byBhIHNpbmdsZSBKUEVHIGRhdGFzdHJlYW0sIGV0Yy4KLQotVG8gcmVhZCB0aGUgY29udGVudHMgb2YgYSBKUEVHIGZpbGUgYXMgRENUIGNvZWZmaWNpZW50cywgb3BlbiB0aGUgZmlsZSBhbmQgZG8KLWpwZWdfcmVhZF9oZWFkZXIoKSBhcyB1c3VhbC4gIEJ1dCBpbnN0ZWFkIG9mIGNhbGxpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKCkKLWFuZCBqcGVnX3JlYWRfc2NhbmxpbmVzKCksIGNhbGwganBlZ19yZWFkX2NvZWZmaWNpZW50cygpLiAgVGhpcyB3aWxsIHJlYWQgdGhlCi1lbnRpcmUgaW1hZ2UgaW50byBhIHNldCBvZiB2aXJ0dWFsIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5cywgb25lIGFycmF5IHBlcgotY29tcG9uZW50LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdmlydHVhbC1hcnJheQotZGVzY3JpcHRvcnMuICBFYWNoIHZpcnR1YWwgYXJyYXkgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IHVzaW5nIHRoZSBKUEVHCi1tZW1vcnkgbWFuYWdlcidzIGFjY2Vzc192aXJ0X2JhcnJheSBtZXRob2QgKHNlZSBNZW1vcnkgbWFuYWdlbWVudCwgYmVsb3csCi1hbmQgYWxzbyByZWFkIHN0cnVjdHVyZS5kb2MncyBkaXNjdXNzaW9uIG9mIHZpcnR1YWwgYXJyYXkgaGFuZGxpbmcpLiAgT3IsCi1mb3Igc2ltcGxlIHRyYW5zY29kaW5nIHRvIGEgZGlmZmVyZW50IEpQRUcgZmlsZSBmb3JtYXQsIHRoZSBhcnJheSBsaXN0IGNhbgotanVzdCBiZSBoYW5kZWQgZGlyZWN0bHkgdG8ganBlZ193cml0ZV9jb2VmZmljaWVudHMoKS4KLQotRWFjaCBibG9jayBpbiB0aGUgYmxvY2sgYXJyYXlzIGNvbnRhaW5zIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZXMgaW4KLW5vcm1hbCBhcnJheSBvcmRlciAobm90IEpQRUcgemlnemFnIG9yZGVyKS4gIFRoZSBibG9jayBhcnJheXMgY29udGFpbiBvbmx5Ci1EQ1QgYmxvY2tzIGNvbnRhaW5pbmcgcmVhbCBkYXRhOyBhbnkgZW50aXJlbHktZHVtbXkgYmxvY2tzIGFkZGVkIHRvIGZpbGwgb3V0Ci1pbnRlcmxlYXZlZCBNQ1VzIGF0IHRoZSByaWdodCBvciBib3R0b20gZWRnZXMgb2YgdGhlIGltYWdlIGFyZSBkaXNjYXJkZWQKLWR1cmluZyByZWFkaW5nIGFuZCBhcmUgbm90IHN0b3JlZCBpbiB0aGUgYmxvY2sgYXJyYXlzLiAgKFRoZSBzaXplIG9mIGVhY2gKLWJsb2NrIGFycmF5IGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIHdpZHRoX2luX2Jsb2NrcyBhbmQgaGVpZ2h0X2luX2Jsb2NrcwotZmllbGRzIG9mIHRoZSBjb21wb25lbnQncyBjb21wX2luZm8gZW50cnkuKSAgVGhpcyBpcyBhbHNvIHRoZSBkYXRhIGZvcm1hdAotZXhwZWN0ZWQgYnkganBlZ193cml0ZV9jb2VmZmljaWVudHMoKS4KLQotV2hlbiB5b3UgYXJlIGRvbmUgdXNpbmcgdGhlIHZpcnR1YWwgYXJyYXlzLCBjYWxsIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKQotdG8gcmVsZWFzZSB0aGUgYXJyYXkgc3RvcmFnZSBhbmQgcmV0dXJuIHRoZSBkZWNvbXByZXNzaW9uIG9iamVjdCB0byBhbiBpZGxlCi1zdGF0ZTsgb3IganVzdCBjYWxsIGpwZWdfZGVzdHJveSgpIGlmIHlvdSBkb24ndCBuZWVkIHRvIHJldXNlIHRoZSBvYmplY3QuCi0KLUlmIHlvdSB1c2UgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlLCBqcGVnX3JlYWRfY29lZmZpY2llbnRzKCkgd2lsbCByZXR1cm4KLU5VTEwgaWYgaXQgaXMgZm9yY2VkIHRvIHN1c3BlbmQ7IGEgbm9uLU5VTEwgcmV0dXJuIHZhbHVlIGluZGljYXRlcyBzdWNjZXNzZnVsCi1jb21wbGV0aW9uLiAgWW91IG5lZWQgbm90IHRlc3QgZm9yIGEgTlVMTCByZXR1cm4gdmFsdWUgd2hlbiB1c2luZyBhCi1ub24tc3VzcGVuZGluZyBkYXRhIHNvdXJjZS4KLQotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjYWxsIGpwZWdfcmVhZF9jb2VmZmljaWVudHMoKSB0byBvYnRhaW4gYWNjZXNzIHRvIHRoZQotZGVjb2RlcidzIGNvZWZmaWNpZW50IGFycmF5cyBkdXJpbmcgYSBub3JtYWwgZGVjb2RlIGN5Y2xlIGluIGJ1ZmZlcmVkLWltYWdlCi1tb2RlLiAgVGhpcyBmcmFtbWlzaCBtaWdodCBiZSB1c2VmdWwgZm9yIHByb2dyZXNzaXZlbHkgZGlzcGxheWluZyBhbiBpbmNvbWluZwotaW1hZ2UgYW5kIHRoZW4gcmUtZW5jb2RpbmcgaXQgd2l0aG91dCBsb3NzLiAgVG8gZG8gdGhpcywgZGVjb2RlIGluIGJ1ZmZlcmVkLQotaW1hZ2UgbW9kZSBhcyBkaXNjdXNzZWQgcHJldmlvdXNseSwgdGhlbiBjYWxsIGpwZWdfcmVhZF9jb2VmZmljaWVudHMoKSBhZnRlcgotdGhlIGxhc3QganBlZ19maW5pc2hfb3V0cHV0KCkgY2FsbC4gIFRoZSBhcnJheXMgd2lsbCBiZSBhdmFpbGFibGUgZm9yIHlvdXIgdXNlCi11bnRpbCB5b3UgY2FsbCBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkuCi0KLQotVG8gd3JpdGUgdGhlIGNvbnRlbnRzIG9mIGEgSlBFRyBmaWxlIGFzIERDVCBjb2VmZmljaWVudHMsIHlvdSBtdXN0IHByb3ZpZGUKLXRoZSBEQ1QgY29lZmZpY2llbnRzIHN0b3JlZCBpbiB2aXJ0dWFsIGJsb2NrIGFycmF5cy4gIFlvdSBjYW4gZWl0aGVyIHBhc3MKLWJsb2NrIGFycmF5cyByZWFkIGZyb20gYW4gaW5wdXQgSlBFRyBmaWxlIGJ5IGpwZWdfcmVhZF9jb2VmZmljaWVudHMoKSwgb3IKLWFsbG9jYXRlIHZpcnR1YWwgYXJyYXlzIGZyb20gdGhlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0IGFuZCBmaWxsIHRoZW0KLXlvdXJzZWxmLiAgSW4gZWl0aGVyIGNhc2UsIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkgaXMgc3Vic3RpdHV0ZWQgZm9yCi1qcGVnX3N0YXJ0X2NvbXByZXNzKCkgYW5kIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkuICBUaHVzIHRoZSBzZXF1ZW5jZSBpcwotICAqIENyZWF0ZSBjb21wcmVzc2lvbiBvYmplY3QKLSAgKiBTZXQgYWxsIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYXMgbmVjZXNzYXJ5Ci0gICogUmVxdWVzdCB2aXJ0dWFsIGFycmF5cyBpZiBuZWVkZWQKLSAgKiBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpCi0gICoganBlZ19maW5pc2hfY29tcHJlc3MoKQotICAqIERlc3Ryb3kgb3IgcmUtdXNlIGNvbXByZXNzaW9uIG9iamVjdAotanBlZ193cml0ZV9jb2VmZmljaWVudHMoKSBpcyBwYXNzZWQgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHZpcnR1YWwgYmxvY2sKLWFycmF5IGRlc2NyaXB0b3JzOyB0aGUgbnVtYmVyIG9mIGFycmF5cyBpcyBlcXVhbCB0byBjaW5mby5udW1fY29tcG9uZW50cy4KLQotVGhlIHZpcnR1YWwgYXJyYXlzIG5lZWQgb25seSBoYXZlIGJlZW4gcmVxdWVzdGVkLCBub3QgcmVhbGl6ZWQsIGJlZm9yZQotanBlZ193cml0ZV9jb2VmZmljaWVudHMoKSBpcyBjYWxsZWQuICBBIHNpZGUtZWZmZWN0IG9mCi1qcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpIGlzIHRvIHJlYWxpemUgYW55IHZpcnR1YWwgYXJyYXlzIHRoYXQgaGF2ZSBiZWVuCi1yZXF1ZXN0ZWQgZnJvbSB0aGUgY29tcHJlc3Npb24gb2JqZWN0J3MgbWVtb3J5IG1hbmFnZXIuICBUaHVzLCB3aGVuIG9idGFpbmluZwotdGhlIHZpcnR1YWwgYXJyYXlzIGZyb20gdGhlIGNvbXByZXNzaW9uIG9iamVjdCwgeW91IHNob3VsZCBmaWxsIHRoZSBhcnJheXMKLWFmdGVyIGNhbGxpbmcganBlZ193cml0ZV9jb2VmZmljaWVudHMoKS4gIFRoZSBkYXRhIGlzIGFjdHVhbGx5IHdyaXR0ZW4gb3V0Ci13aGVuIHlvdSBjYWxsIGpwZWdfZmluaXNoX2NvbXByZXNzKCk7IGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkgb25seSB3cml0ZXMKLXRoZSBmaWxlIGhlYWRlci4KLQotV2hlbiB3cml0aW5nIHJhdyBEQ1QgY29lZmZpY2llbnRzLCBpdCBpcyBjcnVjaWFsIHRoYXQgdGhlIEpQRUcgcXVhbnRpemF0aW9uCi10YWJsZXMgYW5kIHNhbXBsaW5nIGZhY3RvcnMgbWF0Y2ggdGhlIHdheSB0aGUgZGF0YSB3YXMgZW5jb2RlZCwgb3IgdGhlCi1yZXN1bHRpbmcgZmlsZSB3aWxsIGJlIGludmFsaWQuICBGb3IgdHJhbnNjb2RpbmcgZnJvbSBhbiBleGlzdGluZyBKUEVHIGZpbGUsCi13ZSByZWNvbW1lbmQgdXNpbmcganBlZ19jb3B5X2NyaXRpY2FsX3BhcmFtZXRlcnMoKS4gIFRoaXMgcm91dGluZSBpbml0aWFsaXplcwotYWxsIHRoZSBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIHRvIGRlZmF1bHQgdmFsdWVzIChsaWtlIGpwZWdfc2V0X2RlZmF1bHRzKCkpLAotdGhlbiBjb3BpZXMgdGhlIGNyaXRpY2FsIGluZm9ybWF0aW9uIGZyb20gYSBzb3VyY2UgZGVjb21wcmVzc2lvbiBvYmplY3QuCi1UaGUgZGVjb21wcmVzc2lvbiBvYmplY3Qgc2hvdWxkIGhhdmUganVzdCBiZWVuIHVzZWQgdG8gcmVhZCB0aGUgZW50aXJlCi1KUEVHIGlucHV0IGZpbGUgLS0tIHRoYXQgaXMsIGl0IHNob3VsZCBiZSBhd2FpdGluZyBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkuCi0KLWpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkgbWFya3MgYWxsIHRhYmxlcyBzdG9yZWQgaW4gdGhlIGNvbXByZXNzaW9uIG9iamVjdAotYXMgbmVlZGluZyB0byBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZmlsZSAodGh1cywgaXQgYWN0cyBsaWtlCi1qcGVnX3N0YXJ0X2NvbXByZXNzKGNpbmZvLCBUUlVFKSkuICBUaGlzIGlzIGZvciBzYWZldHkncyBzYWtlLCB0byBhdm9pZAotZW1pdHRpbmcgYWJicmV2aWF0ZWQgSlBFRyBmaWxlcyBieSBhY2NpZGVudC4gIElmIHlvdSByZWFsbHkgd2FudCB0byBlbWl0IGFuCi1hYmJyZXZpYXRlZCBKUEVHIGZpbGUsIGNhbGwganBlZ19zdXBwcmVzc190YWJsZXMoKSwgb3Igc2V0IHRoZSB0YWJsZXMnCi1pbmRpdmlkdWFsIHNlbnRfdGFibGUgZmxhZ3MsIGJldHdlZW4gY2FsbGluZyBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpIGFuZAotanBlZ19maW5pc2hfY29tcHJlc3MoKS4KLQotCi1Qcm9ncmVzcyBtb25pdG9yaW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVNvbWUgYXBwbGljYXRpb25zIG1heSBuZWVkIHRvIHJlZ2FpbiBjb250cm9sIGZyb20gdGhlIEpQRUcgbGlicmFyeSBldmVyeSBzbwotb2Z0ZW4uICBUaGUgdHlwaWNhbCB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHRvIHByb2R1Y2UgYSBwZXJjZW50LWRvbmUgYmFyIG9yCi1vdGhlciBwcm9ncmVzcyBkaXNwbGF5LiAgKEZvciBhIHNpbXBsZSBleGFtcGxlLCBzZWUgY2pwZWcuYyBvciBkanBlZy5jLikKLUFsdGhvdWdoIHlvdSBkbyBnZXQgY29udHJvbCBiYWNrIGZyZXF1ZW50bHkgZHVyaW5nIHRoZSBkYXRhLXRyYW5zZmVycmluZyBwYXNzCi0odGhlIGpwZWdfcmVhZF9zY2FubGluZXMgb3IganBlZ193cml0ZV9zY2FubGluZXMgbG9vcCksIGFueSBhZGRpdGlvbmFsIHBhc3Nlcwotd2lsbCBvY2N1ciBpbnNpZGUganBlZ19maW5pc2hfY29tcHJlc3Mgb3IganBlZ19zdGFydF9kZWNvbXByZXNzOyB0aG9zZQotcm91dGluZXMgbWF5IHRha2UgYSBsb25nIHRpbWUgdG8gZXhlY3V0ZSwgYW5kIHlvdSBkb24ndCBnZXQgY29udHJvbCBiYWNrCi11bnRpbCB0aGV5IGFyZSBkb25lLgotCi1Zb3UgY2FuIGRlZmluZSBhIHByb2dyZXNzLW1vbml0b3Igcm91dGluZSB3aGljaCB3aWxsIGJlIGNhbGxlZCBwZXJpb2RpY2FsbHkKLWJ5IHRoZSBsaWJyYXJ5LiAgTm8gZ3VhcmFudGVlcyBhcmUgbWFkZSBhYm91dCBob3cgb2Z0ZW4gdGhpcyBjYWxsIHdpbGwgb2NjdXIsCi1zbyB3ZSBkb24ndCByZWNvbW1lbmQgeW91IHVzZSBpdCBmb3IgbW91c2UgdHJhY2tpbmcgb3IgYW55dGhpbmcgbGlrZSB0aGF0LgotQXQgcHJlc2VudCwgYSBjYWxsIHdpbGwgb2NjdXIgb25jZSBwZXIgTUNVIHJvdywgc2NhbmxpbmUsIG9yIHNhbXBsZSByb3cKLWdyb3VwLCB3aGljaGV2ZXIgdW5pdCBpcyBjb252ZW5pZW50IGZvciB0aGUgY3VycmVudCBwcm9jZXNzaW5nIG1vZGU7IHNvIHRoZQotd2lkZXIgdGhlIGltYWdlLCB0aGUgbG9uZ2VyIHRoZSB0aW1lIGJldHdlZW4gY2FsbHMuICBEdXJpbmcgdGhlIGRhdGEKLXRyYW5zZmVycmluZyBwYXNzLCBvbmx5IG9uZSBjYWxsIG9jY3VycyBwZXIgY2FsbCBvZiBqcGVnX3JlYWRfc2NhbmxpbmVzIG9yCi1qcGVnX3dyaXRlX3NjYW5saW5lcywgc28gZG9uJ3QgcGFzcyBhIGxhcmdlIG51bWJlciBvZiBzY2FubGluZXMgYXQgb25jZSBpZgoteW91IHdhbnQgZmluZSByZXNvbHV0aW9uIGluIHRoZSBwcm9ncmVzcyBjb3VudC4gIChJZiB5b3UgcmVhbGx5IG5lZWQgdG8gdXNlCi10aGUgY2FsbGJhY2sgbWVjaGFuaXNtIGZvciB0aW1lLWNyaXRpY2FsIHRhc2tzIGxpa2UgbW91c2UgdHJhY2tpbmcsIHlvdSBjb3VsZAotaW5zZXJ0IGFkZGl0aW9uYWwgY2FsbHMgaW5zaWRlIHNvbWUgb2YgdGhlIGxpYnJhcnkncyBpbm5lciBsb29wcy4pCi0KLVRvIGVzdGFibGlzaCBhIHByb2dyZXNzLW1vbml0b3IgY2FsbGJhY2ssIGNyZWF0ZSBhIHN0cnVjdCBqcGVnX3Byb2dyZXNzX21nciwKLWZpbGwgaW4gaXRzIHByb2dyZXNzX21vbml0b3IgZmllbGQgd2l0aCBhIHBvaW50ZXIgdG8geW91ciBjYWxsYmFjayByb3V0aW5lLAotYW5kIHNldCBjaW5mby0+cHJvZ3Jlc3MgdG8gcG9pbnQgdG8gdGhlIHN0cnVjdC4gIFRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZAotd2hlbmV2ZXIgY2luZm8tPnByb2dyZXNzIGlzIG5vbi1OVUxMLiAgKFRoaXMgcG9pbnRlciBpcyBzZXQgdG8gTlVMTCBieQotanBlZ19jcmVhdGVfY29tcHJlc3Mgb3IganBlZ19jcmVhdGVfZGVjb21wcmVzczsgdGhlIGxpYnJhcnkgd2lsbCBub3QgY2hhbmdlCi1pdCB0aGVyZWFmdGVyLiAgU28gaWYgeW91IGFsbG9jYXRlIGR5bmFtaWMgc3RvcmFnZSBmb3IgdGhlIHByb2dyZXNzIHN0cnVjdCwKLW1ha2Ugc3VyZSBpdCB3aWxsIGxpdmUgYXMgbG9uZyBhcyB0aGUgSlBFRyBvYmplY3QgZG9lcy4gIEFsbG9jYXRpbmcgZnJvbSB0aGUKLUpQRUcgbWVtb3J5IG1hbmFnZXIgd2l0aCBsaWZldGltZSBKUE9PTF9QRVJNQU5FTlQgd2lsbCB3b3JrIG5pY2VseS4pICBZb3UKLWNhbiB1c2UgdGhlIHNhbWUgY2FsbGJhY2sgcm91dGluZSBmb3IgYm90aCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbi4KLQotVGhlIGpwZWdfcHJvZ3Jlc3NfbWdyIHN0cnVjdCBjb250YWlucyBmb3VyIGZpZWxkcyB3aGljaCBhcmUgc2V0IGJ5IHRoZSBsaWJyYXJ5OgotCWxvbmcgcGFzc19jb3VudGVyOwkvKiB3b3JrIHVuaXRzIGNvbXBsZXRlZCBpbiB0aGlzIHBhc3MgKi8KLQlsb25nIHBhc3NfbGltaXQ7CS8qIHRvdGFsIG51bWJlciBvZiB3b3JrIHVuaXRzIGluIHRoaXMgcGFzcyAqLwotCWludCBjb21wbGV0ZWRfcGFzc2VzOwkvKiBwYXNzZXMgY29tcGxldGVkIHNvIGZhciAqLwotCWludCB0b3RhbF9wYXNzZXM7CS8qIHRvdGFsIG51bWJlciBvZiBwYXNzZXMgZXhwZWN0ZWQgKi8KLUR1cmluZyBhbnkgb25lIHBhc3MsIHBhc3NfY291bnRlciBpbmNyZWFzZXMgZnJvbSAwIHVwIHRvIChub3QgaW5jbHVkaW5nKQotcGFzc19saW1pdDsgdGhlIHN0ZXAgc2l6ZSBpcyB1c3VhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHkgMS4gIFRoZSBwYXNzX2xpbWl0Ci12YWx1ZSBtYXkgY2hhbmdlIGZyb20gb25lIHBhc3MgdG8gYW5vdGhlci4gIFRoZSBleHBlY3RlZCB0b3RhbCBudW1iZXIgb2YKLXBhc3NlcyBpcyBpbiB0b3RhbF9wYXNzZXMsIGFuZCB0aGUgbnVtYmVyIG9mIHBhc3NlcyBhbHJlYWR5IGNvbXBsZXRlZCBpcyBpbgotY29tcGxldGVkX3Bhc3Nlcy4gIFRodXMgdGhlIGZyYWN0aW9uIG9mIHdvcmsgY29tcGxldGVkIG1heSBiZSBlc3RpbWF0ZWQgYXMKLQkJY29tcGxldGVkX3Bhc3NlcyArIChwYXNzX2NvdW50ZXIvcGFzc19saW1pdCkKLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCQl0b3RhbF9wYXNzZXMKLWlnbm9yaW5nIHRoZSBmYWN0IHRoYXQgdGhlIHBhc3NlcyBtYXkgbm90IGJlIGVxdWFsIGFtb3VudHMgb2Ygd29yay4KLQotV2hlbiBkZWNvbXByZXNzaW5nLCBwYXNzX2xpbWl0IGNhbiBldmVuIGNoYW5nZSB3aXRoaW4gYSBwYXNzLCBiZWNhdXNlIGl0Ci1kZXBlbmRzIG9uIHRoZSBudW1iZXIgb2Ygc2NhbnMgaW4gdGhlIEpQRUcgZmlsZSwgd2hpY2ggaXNuJ3QgYWx3YXlzIGtub3duIGluCi1hZHZhbmNlLiAgVGhlIGNvbXB1dGVkIGZyYWN0aW9uLW9mLXdvcmstZG9uZSBtYXkganVtcCBzdWRkZW5seSAoaWYgdGhlIGxpYnJhcnkKLWRpc2NvdmVycyBpdCBoYXMgb3ZlcmVzdGltYXRlZCB0aGUgbnVtYmVyIG9mIHNjYW5zKSBvciBldmVuIGRlY3JlYXNlIChpbiB0aGUKLW9wcG9zaXRlIGNhc2UpLiAgSXQgaXMgbm90IHdpc2UgdG8gcHV0IGdyZWF0IGZhaXRoIGluIHRoZSB3b3JrIGVzdGltYXRlLgotCi1XaGVuIHVzaW5nIHRoZSBkZWNvbXByZXNzb3IncyBidWZmZXJlZC1pbWFnZSBtb2RlLCB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB3b3JrCi1lc3RpbWF0ZSBpcyBsaWtlbHkgdG8gYmUgY29tcGxldGVseSB1bmhlbHBmdWwsIGJlY2F1c2UgdGhlIGxpYnJhcnkgaGFzIG5vIHdheQotdG8ga25vdyBob3cgbWFueSBvdXRwdXQgcGFzc2VzIHdpbGwgYmUgZGVtYW5kZWQgb2YgaXQuICBDdXJyZW50bHksIHRoZSBsaWJyYXJ5Ci1zZXRzIHRvdGFsX3Bhc3NlcyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZXJlIHdpbGwgYmUgb25lIG1vcmUgb3V0cHV0Ci1wYXNzIGlmIHRoZSBpbnB1dCBmaWxlIGVuZCBoYXNuJ3QgeWV0IGJlZW4gcmVhZCAoanBlZ19pbnB1dF9jb21wbGV0ZSgpIGlzbid0Ci1UUlVFKSwgYnV0IG5vIG1vcmUgb3V0cHV0IHBhc3NlcyBpZiB0aGUgZmlsZSBlbmQgaGFzIGJlZW4gcmVhY2hlZCB3aGVuIHRoZQotb3V0cHV0IHBhc3MgaXMgc3RhcnRlZC4gIFRoaXMgbWVhbnMgdGhhdCB0b3RhbF9wYXNzZXMgd2lsbCByaXNlIGFzIGFkZGl0aW9uYWwKLW91dHB1dCBwYXNzZXMgYXJlIHJlcXVlc3RlZC4gIElmIHlvdSBoYXZlIGEgd2F5IG9mIGRldGVybWluaW5nIHRoZSBpbnB1dCBmaWxlCi1zaXplLCBlc3RpbWF0aW5nIHByb2dyZXNzIGJhc2VkIG9uIHRoZSBmcmFjdGlvbiBvZiB0aGUgZmlsZSB0aGF0J3MgYmVlbiByZWFkCi13aWxsIHByb2JhYmx5IGJlIG1vcmUgdXNlZnVsIHRoYW4gdXNpbmcgdGhlIGxpYnJhcnkncyB2YWx1ZS4KLQotCi1NZW1vcnkgbWFuYWdlbWVudAotLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBzZWN0aW9uIGNvdmVycyBzb21lIGtleSBmYWN0cyBhYm91dCB0aGUgSlBFRyBsaWJyYXJ5J3MgYnVpbHQtaW4gbWVtb3J5Ci1tYW5hZ2VyLiAgRm9yIG1vcmUgaW5mbywgcGxlYXNlIHJlYWQgc3RydWN0dXJlLmRvYydzIHNlY3Rpb24gYWJvdXQgdGhlIG1lbW9yeQotbWFuYWdlciwgYW5kIGNvbnN1bHQgdGhlIHNvdXJjZSBjb2RlIGlmIG5lY2Vzc2FyeS4KLQotQWxsIG1lbW9yeSBhbmQgdGVtcG9yYXJ5IGZpbGUgYWxsb2NhdGlvbiB3aXRoaW4gdGhlIGxpYnJhcnkgaXMgZG9uZSB2aWEgdGhlCi1tZW1vcnkgbWFuYWdlci4gIElmIG5lY2Vzc2FyeSwgeW91IGNhbiByZXBsYWNlIHRoZSAiYmFjayBlbmQiIG9mIHRoZSBtZW1vcnkKLW1hbmFnZXIgdG8gY29udHJvbCBhbGxvY2F0aW9uIHlvdXJzZWxmIChmb3IgZXhhbXBsZSwgaWYgeW91IGRvbid0IHdhbnQgdGhlCi1saWJyYXJ5IHRvIHVzZSBtYWxsb2MoKSBhbmQgZnJlZSgpIGZvciBzb21lIHJlYXNvbikuCi0KLVNvbWUgZGF0YSBpcyBhbGxvY2F0ZWQgInBlcm1hbmVudGx5IiBhbmQgd2lsbCBub3QgYmUgZnJlZWQgdW50aWwgdGhlIEpQRUcKLW9iamVjdCBpcyBkZXN0cm95ZWQuICBNb3N0IGRhdGEgaXMgYWxsb2NhdGVkICJwZXIgaW1hZ2UiIGFuZCBpcyBmcmVlZCBieQotanBlZ19maW5pc2hfY29tcHJlc3MsIGpwZWdfZmluaXNoX2RlY29tcHJlc3MsIG9yIGpwZWdfYWJvcnQuICBZb3UgY2FuIGNhbGwgdGhlCi1tZW1vcnkgbWFuYWdlciB5b3Vyc2VsZiB0byBhbGxvY2F0ZSBzdHJ1Y3R1cmVzIHRoYXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlCi1mcmVlZCBhdCB0aGVzZSB0aW1lcy4gIFR5cGljYWwgY29kZSBmb3IgdGhpcyBpcwotICBwdHIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBzaXplKTsKLVVzZSBKUE9PTF9QRVJNQU5FTlQgdG8gZ2V0IHN0b3JhZ2UgdGhhdCBsYXN0cyBhcyBsb25nIGFzIHRoZSBKUEVHIG9iamVjdC4KLVVzZSBhbGxvY19sYXJnZSBpbnN0ZWFkIG9mIGFsbG9jX3NtYWxsIGZvciBhbnl0aGluZyBiaWdnZXIgdGhhbiBhIGZldyBLYnl0ZXMuCi1UaGVyZSBhcmUgYWxzbyBhbGxvY19zYXJyYXkgYW5kIGFsbG9jX2JhcnJheSByb3V0aW5lcyB0aGF0IGF1dG9tYXRpY2FsbHkKLWJ1aWxkIDItRCBzYW1wbGUgb3IgYmxvY2sgYXJyYXlzLgotCi1UaGUgbGlicmFyeSdzIG1pbmltdW0gc3BhY2UgcmVxdWlyZW1lbnRzIHRvIHByb2Nlc3MgYW4gaW1hZ2UgZGVwZW5kIG9uIHRoZQotaW1hZ2UncyB3aWR0aCwgYnV0IG5vdCBvbiBpdHMgaGVpZ2h0LCBiZWNhdXNlIHRoZSBsaWJyYXJ5IG9yZGluYXJpbHkgd29ya3MKLXdpdGggInN0cmlwIiBidWZmZXJzIHRoYXQgYXJlIGFzIHdpZGUgYXMgdGhlIGltYWdlIGJ1dCBqdXN0IGEgZmV3IHJvd3MgaGlnaC4KLVNvbWUgb3BlcmF0aW5nIG1vZGVzIChlZywgdHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uKSByZXF1aXJlIGZ1bGwtaW1hZ2UKLWJ1ZmZlcnMuICBTdWNoIGJ1ZmZlcnMgYXJlIHRyZWF0ZWQgYXMgInZpcnR1YWwgYXJyYXlzIjogb25seSB0aGUgY3VycmVudCBzdHJpcAotbmVlZCBiZSBpbiBtZW1vcnksIGFuZCB0aGUgcmVzdCBjYW4gYmUgc3dhcHBlZCBvdXQgdG8gYSB0ZW1wb3JhcnkgZmlsZS4KLQotSWYgeW91IHVzZSB0aGUgc2ltcGxlc3QgbWVtb3J5IG1hbmFnZXIgYmFjayBlbmQgKGptZW1ub2JzLmMpLCB0aGVuIG5vCi10ZW1wb3JhcnkgZmlsZXMgYXJlIHVzZWQ7IHZpcnR1YWwgYXJyYXlzIGFyZSBzaW1wbHkgbWFsbG9jKCknZC4gIEltYWdlcyBiaWdnZXIKLXRoYW4gbWVtb3J5IGNhbiBiZSBwcm9jZXNzZWQgb25seSBpZiB5b3VyIHN5c3RlbSBzdXBwb3J0cyB2aXJ0dWFsIG1lbW9yeS4KLVRoZSBvdGhlciBtZW1vcnkgbWFuYWdlciBiYWNrIGVuZHMgc3VwcG9ydCB0ZW1wb3JhcnkgZmlsZXMgb2YgdmFyaW91cyBmbGF2b3JzCi1hbmQgdGh1cyB3b3JrIGluIG1hY2hpbmVzIHdpdGhvdXQgdmlydHVhbCBtZW1vcnkuICBUaGV5IG1heSBhbHNvIGJlIHVzZWZ1bCBvbgotVW5peCBtYWNoaW5lcyBpZiB5b3UgbmVlZCB0byBwcm9jZXNzIGltYWdlcyB0aGF0IGV4Y2VlZCBhdmFpbGFibGUgc3dhcCBzcGFjZS4KLQotV2hlbiB1c2luZyB0ZW1wb3JhcnkgZmlsZXMsIHRoZSBsaWJyYXJ5IHdpbGwgbWFrZSB0aGUgaW4tbWVtb3J5IGJ1ZmZlcnMgZm9yCi1pdHMgdmlydHVhbCBhcnJheXMganVzdCBiaWcgZW5vdWdoIHRvIHN0YXkgd2l0aGluIGEgIm1heGltdW0gbWVtb3J5IiBzZXR0aW5nLgotWW91ciBhcHBsaWNhdGlvbiBjYW4gc2V0IHRoaXMgbGltaXQgYnkgc2V0dGluZyBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZQotYWZ0ZXIgY3JlYXRpbmcgdGhlIEpQRUcgb2JqZWN0LiAgKE9mIGNvdXJzZSwgdGhlcmUgaXMgc3RpbGwgYSBtaW5pbXVtIHNpemUgZm9yCi10aGUgYnVmZmVycywgc28gdGhlIG1heC1tZW1vcnkgc2V0dGluZyBpcyBlZmZlY3RpdmUgb25seSBpZiBpdCBpcyBiaWdnZXIgdGhhbgotdGhlIG1pbmltdW0gc3BhY2UgbmVlZGVkLikgIElmIHlvdSBhbGxvY2F0ZSBhbnkgbGFyZ2Ugc3RydWN0dXJlcyB5b3Vyc2VsZiwgeW91Ci1tdXN0IGFsbG9jYXRlIHRoZW0gYmVmb3JlIGpwZWdfc3RhcnRfY29tcHJlc3MoKSBvciBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSBpbgotb3JkZXIgdG8gaGF2ZSB0aGVtIGNvdW50ZWQgYWdhaW5zdCB0aGUgbWF4IG1lbW9yeSBsaW1pdC4gIEFsc28ga2VlcCBpbiBtaW5kCi10aGF0IHNwYWNlIGFsbG9jYXRlZCB3aXRoIGFsbG9jX3NtYWxsKCkgaXMgaWdub3JlZCwgb24gdGhlIGFzc3VtcHRpb24gdGhhdAotaXQncyB0b28gc21hbGwgdG8gYmUgd29ydGggd29ycnlpbmcgYWJvdXQ7IHNvIGEgcmVhc29uYWJsZSBzYWZldHkgbWFyZ2luCi1zaG91bGQgYmUgbGVmdCB3aGVuIHNldHRpbmcgbWF4X21lbW9yeV90b191c2UuCi0KLUlmIHlvdSB1c2UgdGhlIGptZW1uYW1lLmMgb3Igam1lbWRvcy5jIG1lbW9yeSBtYW5hZ2VyIGJhY2sgZW5kLCBpdCBpcwotaW1wb3J0YW50IHRvIGNsZWFuIHVwIHRoZSBKUEVHIG9iamVjdCBwcm9wZXJseSB0byBlbnN1cmUgdGhhdCB0aGUgdGVtcG9yYXJ5Ci1maWxlcyBnZXQgZGVsZXRlZC4gIChUaGlzIGlzIGVzcGVjaWFsbHkgY3J1Y2lhbCB3aXRoIGptZW1kb3MuYywgd2hlcmUgdGhlCi0idGVtcG9yYXJ5IGZpbGVzIiBtYXkgYmUgZXh0ZW5kZWQtbWVtb3J5IHNlZ21lbnRzOyBpZiB0aGV5IGFyZSBub3QgZnJlZWQsCi1ET1Mgd2lsbCByZXF1aXJlIGEgcmVib290IHRvIHJlY292ZXIgdGhlIG1lbW9yeS4pICBUaHVzLCB3aXRoIHRoZXNlIG1lbW9yeQotbWFuYWdlcnMsIGl0J3MgYSBnb29kIGlkZWEgdG8gcHJvdmlkZSBhIHNpZ25hbCBoYW5kbGVyIHRoYXQgd2lsbCB0cmFwIGFueQotZWFybHkgZXhpdCBmcm9tIHlvdXIgcHJvZ3JhbS4gIFRoZSBoYW5kbGVyIHNob3VsZCBjYWxsIGVpdGhlciBqcGVnX2Fib3J0KCkKLW9yIGpwZWdfZGVzdHJveSgpIGZvciBhbnkgYWN0aXZlIEpQRUcgb2JqZWN0cy4gIEEgaGFuZGxlciBpcyBub3QgbmVlZGVkIHdpdGgKLWptZW1ub2JzLmMsIGFuZCBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IHdpdGggam1lbWFuc2kuYyBvciBqbWVtbWFjLmMgZWl0aGVyLAotc2luY2UgdGhlIEMgbGlicmFyeSBpcyBzdXBwb3NlZCB0byB0YWtlIGNhcmUgb2YgZGVsZXRpbmcgZmlsZXMgbWFkZSB3aXRoCi10bXBmaWxlKCkuCi0KLQotTWVtb3J5IHVzYWdlCi0tLS0tLS0tLS0tLS0KLQotV29ya2luZyBtZW1vcnkgcmVxdWlyZW1lbnRzIHdoaWxlIHBlcmZvcm1pbmcgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbgotZGVwZW5kIG9uIGltYWdlIGRpbWVuc2lvbnMsIGltYWdlIGNoYXJhY3RlcmlzdGljcyAoc3VjaCBhcyBjb2xvcnNwYWNlIGFuZAotSlBFRyBwcm9jZXNzKSwgYW5kIG9wZXJhdGluZyBtb2RlIChhcHBsaWNhdGlvbi1zZWxlY3RlZCBvcHRpb25zKS4KLQotQXMgb2YgdjZiLCB0aGUgZGVjb21wcmVzc29yIHJlcXVpcmVzOgotIDEuIEFib3V0IDI0SyBpbiBtb3JlLW9yLWxlc3MtZml4ZWQtc2l6ZSBkYXRhLiAgVGhpcyB2YXJpZXMgYSBiaXQgZGVwZW5kaW5nCi0gICAgb24gb3BlcmF0aW5nIG1vZGUgYW5kIGltYWdlIGNoYXJhY3RlcmlzdGljcyAocGFydGljdWxhcmx5IGNvbG9yIHZzLgotICAgIGdyYXlzY2FsZSksIGJ1dCBpdCBkb2Vzbid0IGRlcGVuZCBvbiBpbWFnZSBkaW1lbnNpb25zLgotIDIuIFN0cmlwIGJ1ZmZlcnMgKG9mIHNpemUgcHJvcG9ydGlvbmFsIHRvIHRoZSBpbWFnZSB3aWR0aCkgZm9yIElEQ1QgYW5kCi0gICAgdXBzYW1wbGluZyByZXN1bHRzLiAgVGhlIHdvcnN0IGNhc2UgZm9yIGNvbW1vbmx5IHVzZWQgc2FtcGxpbmcgZmFjdG9ycwotICAgIGlzIGFib3V0IDM0IGJ5dGVzICogd2lkdGggaW4gcGl4ZWxzIGZvciBhIGNvbG9yIGltYWdlLiAgQSBncmF5c2NhbGUgaW1hZ2UKLSAgICBvbmx5IG5lZWRzIGFib3V0IDggYnl0ZXMgcGVyIHBpeGVsIGNvbHVtbi4KLSAzLiBBIGZ1bGwtaW1hZ2UgRENUIGNvZWZmaWNpZW50IGJ1ZmZlciBpcyBuZWVkZWQgdG8gZGVjb2RlIGEgbXVsdGktc2NhbiBKUEVHCi0gICAgZmlsZSAoaW5jbHVkaW5nIHByb2dyZXNzaXZlIEpQRUdzKSwgb3Igd2hlbmV2ZXIgeW91IHNlbGVjdCBidWZmZXJlZC1pbWFnZQotICAgIG1vZGUuICBUaGlzIHRha2VzIDIgYnl0ZXMvY29lZmZpY2llbnQuICBBdCB0eXBpY2FsIDJ4MiBzYW1wbGluZywgdGhhdCdzCi0gICAgMyBieXRlcyBwZXIgcGl4ZWwgZm9yIGEgY29sb3IgaW1hZ2UuICBXb3JzdCBjYXNlICgxeDEgc2FtcGxpbmcpIHJlcXVpcmVzCi0gICAgNiBieXRlcy9waXhlbC4gIEZvciBncmF5c2NhbGUsIGZpZ3VyZSAyIGJ5dGVzL3BpeGVsLgotIDQuIFRvIHBlcmZvcm0gMi1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiwgdGhlIGRlY29tcHJlc3NvciBhbHNvIG5lZWRzIGEKLSAgICAxMjhLIGNvbG9yIGxvb2t1cCB0YWJsZSBhbmQgYSBmdWxsLWltYWdlIHBpeGVsIGJ1ZmZlciAoMyBieXRlcy9waXhlbCkuCi1UaGlzIGRvZXMgbm90IGNvdW50IGFueSBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgc3VjaCBhcyBhCi1idWZmZXIgdG8gaG9sZCB0aGUgZmluYWwgb3V0cHV0IGltYWdlLgotCi1UaGUgYWJvdmUgZmlndXJlcyBhcmUgdmFsaWQgZm9yIDgtYml0IEpQRUcgZGF0YSBwcmVjaXNpb24gYW5kIGEgbWFjaGluZSB3aXRoCi0zMi1iaXQgaW50cy4gIEZvciAxMi1iaXQgSlBFRyBkYXRhLCBkb3VibGUgdGhlIHNpemUgb2YgdGhlIHN0cmlwIGJ1ZmZlcnMgYW5kCi1xdWFudGl6YXRpb24gcGl4ZWwgYnVmZmVyLiAgVGhlICJmaXhlZC1zaXplIiBkYXRhIHdpbGwgYmUgc29tZXdoYXQgc21hbGxlcgotd2l0aCAxNi1iaXQgaW50cywgbGFyZ2VyIHdpdGggNjQtYml0IGludHMuICBBbHNvLCBDTVlLIG9yIG90aGVyIHVudXN1YWwKLWNvbG9yIHNwYWNlcyB3aWxsIHJlcXVpcmUgZGlmZmVyZW50IGFtb3VudHMgb2Ygc3BhY2UuCi0KLVRoZSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGFuZCBwaXhlbCBidWZmZXJzLCBpZiBuZWVkZWQgYXQgYWxsLCBkbyBub3QKLWhhdmUgdG8gYmUgZnVsbHkgUkFNIHJlc2lkZW50OyB5b3UgY2FuIGhhdmUgdGhlIGxpYnJhcnkgdXNlIHRlbXBvcmFyeQotZmlsZXMgaW5zdGVhZCB3aGVuIHRoZSB0b3RhbCBtZW1vcnkgdXNhZ2Ugd291bGQgZXhjZWVkIGEgbGltaXQgeW91IHNldC4KLShCdXQgaWYgeW91ciBPUyBzdXBwb3J0cyB2aXJ0dWFsIG1lbW9yeSwgaXQncyBwcm9iYWJseSBiZXR0ZXIgdG8ganVzdCB1c2UKLWptZW1ub2JzIGFuZCBsZXQgdGhlIE9TIGRvIHRoZSBzd2FwcGluZy4pCi0KLVRoZSBjb21wcmVzc29yJ3MgbWVtb3J5IHJlcXVpcmVtZW50cyBhcmUgc2ltaWxhciwgZXhjZXB0IHRoYXQgaXQgaGFzIG5vIG5lZWQKLWZvciBjb2xvciBxdWFudGl6YXRpb24uICBBbHNvLCBpdCBuZWVkcyBhIGZ1bGwtaW1hZ2UgRENUIGNvZWZmaWNpZW50IGJ1ZmZlcgotaWYgSHVmZm1hbi10YWJsZSBvcHRpbWl6YXRpb24gaXMgYXNrZWQgZm9yLCBldmVuIGlmIHByb2dyZXNzaXZlIG1vZGUgaXMgbm90Ci1yZXF1ZXN0ZWQuCi0KLUlmIHlvdSBuZWVkIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgbWVtb3J5IHVzYWdlIGluIGEgcGFydGljdWxhcgotc2l0dWF0aW9uLCB5b3UgY2FuIGVuYWJsZSB0aGUgTUVNX1NUQVRTIGNvZGUgaW4gam1lbW1nci5jLgotCi0KLUxpYnJhcnkgY29tcGlsZS10aW1lIG9wdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQSBudW1iZXIgb2YgY29tcGlsZS10aW1lIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSBieSBtb2RpZnlpbmcgam1vcmVjZmcuaC4KLQotVGhlIEpQRUcgc3RhbmRhcmQgcHJvdmlkZXMgZm9yIGJvdGggdGhlIGJhc2VsaW5lIDgtYml0IERDVCBwcm9jZXNzIGFuZAotYSAxMi1iaXQgRENUIHByb2Nlc3MuICBUaGUgSUpHIGNvZGUgc3VwcG9ydHMgMTItYml0IGxvc3N5IEpQRUcgaWYgeW91IGRlZmluZQotQklUU19JTl9KU0FNUExFIGFzIDEyIHJhdGhlciB0aGFuIDguICBOb3RlIHRoYXQgdGhpcyBjYXVzZXMgSlNBTVBMRSB0byBiZQotbGFyZ2VyIHRoYW4gYSBjaGFyLCBzbyBpdCBhZmZlY3RzIHRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbidzIGltYWdlIGRhdGEuCi1UaGUgc2FtcGxlIGFwcGxpY2F0aW9ucyBjanBlZyBhbmQgZGpwZWcgY2FuIHN1cHBvcnQgMTItYml0IG1vZGUgb25seSBmb3IgUFBNCi1hbmQgR0lGIGZpbGUgZm9ybWF0czsgeW91IG11c3QgZGlzYWJsZSB0aGUgb3RoZXIgZmlsZSBmb3JtYXRzIHRvIGNvbXBpbGUgYQotMTItYml0IGNqcGVnIG9yIGRqcGVnLiAgKGluc3RhbGwuZG9jIGhhcyBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoYXQuKQotQXQgcHJlc2VudCwgYSAxMi1iaXQgbGlicmFyeSBjYW4gaGFuZGxlICpvbmx5KiAxMi1iaXQgaW1hZ2VzLCBub3QgYm90aAotcHJlY2lzaW9ucy4gIChJZiB5b3UgbmVlZCB0byBpbmNsdWRlIGJvdGggOC0gYW5kIDEyLWJpdCBsaWJyYXJpZXMgaW4gYSBzaW5nbGUKLWFwcGxpY2F0aW9uLCB5b3UgY291bGQgcHJvYmFibHkgZG8gaXQgYnkgZGVmaW5pbmcgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotZm9yIGp1c3Qgb25lIG9mIHRoZSBjb3BpZXMuICBZb3UnZCBoYXZlIHRvIGFjY2VzcyB0aGUgOC1iaXQgYW5kIDEyLWJpdCBjb3BpZXMKLWZyb20gc2VwYXJhdGUgYXBwbGljYXRpb24gc291cmNlIGZpbGVzLiAgVGhpcyBpcyB1bnRlc3RlZCAuLi4gaWYgeW91IHRyeSBpdCwKLXdlJ2QgbGlrZSB0byBoZWFyIHdoZXRoZXIgaXQgd29ya3MhKQotCi1Ob3RlIHRoYXQgYSAxMi1iaXQgbGlicmFyeSBhbHdheXMgY29tcHJlc3NlcyBpbiBIdWZmbWFuIG9wdGltaXphdGlvbiBtb2RlLAotaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdmFsaWQgSHVmZm1hbiB0YWJsZXMuICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG91cgotZGVmYXVsdCBIdWZmbWFuIHRhYmxlcyBvbmx5IGNvdmVyIDgtYml0IGRhdGEuICBJZiB5b3UgbmVlZCB0byBvdXRwdXQgMTItYml0Ci1maWxlcyBpbiBvbmUgcGFzcywgeW91J2xsIGhhdmUgdG8gc3VwcGx5IHN1aXRhYmxlIGRlZmF1bHQgSHVmZm1hbiB0YWJsZXMuCi1Zb3UgbWF5IGFsc28gd2FudCB0byBzdXBwbHkgeW91ciBvd24gRENUIHF1YW50aXphdGlvbiB0YWJsZXM7IHRoZSBleGlzdGluZwotcXVhbGl0eS1zY2FsaW5nIGNvZGUgaGFzIGJlZW4gZGV2ZWxvcGVkIGZvciA4LWJpdCB1c2UsIGFuZCBwcm9iYWJseSBkb2Vzbid0Ci1nZW5lcmF0ZSBlc3BlY2lhbGx5IGdvb2QgdGFibGVzIGZvciAxMi1iaXQuCi0KLVRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21wb25lbnRzIChjb2xvciBjaGFubmVscykgaW4gdGhlIGltYWdlIGlzIGRldGVybWluZWQKLWJ5IE1BWF9DT01QT05FTlRTLiAgVGhlIEpQRUcgc3RhbmRhcmQgYWxsb3dzIHVwIHRvIDI1NSBjb21wb25lbnRzLCBidXQgd2UKLWV4cGVjdCB0aGF0IGZldyBhcHBsaWNhdGlvbnMgd2lsbCBuZWVkIG1vcmUgdGhhbiBmb3VyIG9yIHNvLgotCi1PbiBtYWNoaW5lcyB3aXRoIHVudXN1YWwgZGF0YSB0eXBlIHNpemVzLCB5b3UgbWF5IGJlIGFibGUgdG8gaW1wcm92ZQotcGVyZm9ybWFuY2Ugb3IgcmVkdWNlIG1lbW9yeSBzcGFjZSBieSB0d2Vha2luZyB0aGUgdmFyaW91cyB0eXBlZGVmcyBpbgotam1vcmVjZmcuaC4gIEluIHBhcnRpY3VsYXIsIG9uIHNvbWUgUklTQyBDUFVzLCBhY2Nlc3MgdG8gYXJyYXlzIG9mICJzaG9ydCJzCi1pcyBxdWl0ZSBzbG93OyBjb25zaWRlciB0cmFkaW5nIG1lbW9yeSBmb3Igc3BlZWQgYnkgbWFraW5nIEpDT0VGLCBJTlQxNiwgYW5kCi1VSU5UMTYgYmUgImludCIgb3IgInVuc2lnbmVkIGludCIuICBVSU5UOCBpcyBhbHNvIGEgY2FuZGlkYXRlIHRvIGJlY29tZSBpbnQuCi1Zb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBtYWtlIEpTQU1QTEUgYmUgaW50IHVubGVzcyB5b3UgaGF2ZSBsb3RzIG9mIG1lbW9yeQotdG8gYnVybi4KLQotWW91IGNhbiByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGxpYnJhcnkgYnkgY29tcGlsaW5nIG91dCB2YXJpb3VzIG9wdGlvbmFsCi1mdW5jdGlvbnMuICBUbyBkbyB0aGlzLCB1bmRlZmluZSB4eHhfU1VQUE9SVEVEIHN5bWJvbHMgYXMgbmVjZXNzYXJ5LgotCi1Zb3UgY2FuIGFsc28gc2F2ZSBhIGZldyBLIGJ5IG5vdCBoYXZpbmcgdGV4dCBlcnJvciBtZXNzYWdlcyBpbiB0aGUgbGlicmFyeTsKLXRoZSBzdGFuZGFyZCBlcnJvciBtZXNzYWdlIHRhYmxlIG9jY3VwaWVzIGFib3V0IDVLYi4gIFRoaXMgaXMgcGFydGljdWxhcmx5Ci1yZWFzb25hYmxlIGZvciBlbWJlZGRlZCBhcHBsaWNhdGlvbnMgd2hlcmUgdGhlcmUncyBubyBnb29kIHdheSB0byBkaXNwbGF5IAotYSBtZXNzYWdlIGFueXdheS4gIFRvIGRvIHRoaXMsIHJlbW92ZSB0aGUgY3JlYXRpb24gb2YgdGhlIG1lc3NhZ2UgdGFibGUKLShqcGVnX3N0ZF9tZXNzYWdlX3RhYmxlW10pIGZyb20gamVycm9yLmMsIGFuZCBhbHRlciBmb3JtYXRfbWVzc2FnZSB0byBkbwotc29tZXRoaW5nIHJlYXNvbmFibGUgd2l0aG91dCBpdC4gIFlvdSBjb3VsZCBvdXRwdXQgdGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlCi1tZXNzYWdlIGNvZGUgbnVtYmVyLCBmb3IgZXhhbXBsZS4gIElmIHlvdSBkbyB0aGlzLCB5b3UgY2FuIGFsc28gc2F2ZSBhIGNvdXBsZQotbW9yZSBLIGJ5IG1vZGlmeWluZyB0aGUgVFJBQ0VNU24oKSBtYWNyb3MgaW4gamVycm9yLmggdG8gZXhwYW5kIHRvIG5vdGhpbmc7Ci15b3UgZG9uJ3QgbmVlZCB0cmFjZSBjYXBhYmlsaXR5IGFueXdheSwgcmlnaHQ/Ci0KLQotUG9ydGFiaWxpdHkgY29uc2lkZXJhdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBKUEVHIGxpYnJhcnkgaGFzIGJlZW4gd3JpdHRlbiB0byBiZSBleHRyZW1lbHkgcG9ydGFibGU7IHRoZSBzYW1wbGUKLWFwcGxpY2F0aW9ucyBjanBlZyBhbmQgZGpwZWcgYXJlIHNsaWdodGx5IGxlc3Mgc28uICBUaGlzIHNlY3Rpb24gc3VtbWFyaXplcwotdGhlIGRlc2lnbiBnb2FscyBpbiB0aGlzIGFyZWEuICAoSWYgeW91IGVuY291bnRlciBhbnkgYnVncyB0aGF0IGNhdXNlIHRoZQotbGlicmFyeSB0byBiZSBsZXNzIHBvcnRhYmxlIHRoYW4gaXMgY2xhaW1lZCBoZXJlLCB3ZSdkIGFwcHJlY2lhdGUgaGVhcmluZwotYWJvdXQgdGhlbS4pCi0KLVRoZSBjb2RlIHdvcmtzIGZpbmUgb24gQU5TSSBDLCBDKyssIGFuZCBwcmUtQU5TSSBDIGNvbXBpbGVycywgdXNpbmcgYW55IG9mCi10aGUgcG9wdWxhciBzeXN0ZW0gaW5jbHVkZSBmaWxlIHNldHVwcywgYW5kIHNvbWUgbm90LXNvLXBvcHVsYXIgb25lcyB0b28uCi1TZWUgaW5zdGFsbC5kb2MgZm9yIGNvbmZpZ3VyYXRpb24gcHJvY2VkdXJlcy4KLQotVGhlIGNvZGUgaXMgbm90IGRlcGVuZGVudCBvbiB0aGUgZXhhY3Qgc2l6ZXMgb2YgdGhlIEMgZGF0YSB0eXBlcy4gIEFzCi1kaXN0cmlidXRlZCwgd2UgbWFrZSB0aGUgYXNzdW1wdGlvbnMgdGhhdAotCWNoYXIJaXMgYXQgbGVhc3QgOCBiaXRzIHdpZGUKLQlzaG9ydAlpcyBhdCBsZWFzdCAxNiBiaXRzIHdpZGUKLQlpbnQJaXMgYXQgbGVhc3QgMTYgYml0cyB3aWRlCi0JbG9uZwlpcyBhdCBsZWFzdCAzMiBiaXRzIHdpZGUKLShUaGVzZSBhcmUgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnRzIG9mIHRoZSBBTlNJIEMgc3RhbmRhcmQuKSAgV2lkZXIgdHlwZXMgd2lsbAotd29yayBmaW5lLCBhbHRob3VnaCBtZW1vcnkgbWF5IGJlIHVzZWQgaW5lZmZpY2llbnRseSBpZiBjaGFyIGlzIG11Y2ggbGFyZ2VyCi10aGFuIDggYml0cyBvciBzaG9ydCBpcyBtdWNoIGJpZ2dlciB0aGFuIDE2IGJpdHMuICBUaGUgY29kZSBzaG91bGQgd29yawotZXF1YWxseSB3ZWxsIHdpdGggMTYtIG9yIDMyLWJpdCBpbnRzLgotCi1JbiBhIHN5c3RlbSB3aGVyZSB0aGVzZSBhc3N1bXB0aW9ucyBhcmUgbm90IG1ldCwgeW91IG1heSBiZSBhYmxlIHRvIG1ha2UgdGhlCi1jb2RlIHdvcmsgYnkgbW9kaWZ5aW5nIHRoZSB0eXBlZGVmcyBpbiBqbW9yZWNmZy5oLiAgSG93ZXZlciwgeW91IHdpbGwgcHJvYmFibHkKLWhhdmUgZGlmZmljdWx0eSBpZiBpbnQgaXMgbGVzcyB0aGFuIDE2IGJpdHMgd2lkZSwgc2luY2UgcmVmZXJlbmNlcyB0byBwbGFpbgotaW50IGFib3VuZCBpbiB0aGUgY29kZS4KLQotY2hhciBjYW4gYmUgZWl0aGVyIHNpZ25lZCBvciB1bnNpZ25lZCwgYWx0aG91Z2ggdGhlIGNvZGUgcnVucyBmYXN0ZXIgaWYgYW4KLXVuc2lnbmVkIGNoYXIgdHlwZSBpcyBhdmFpbGFibGUuICBJZiBjaGFyIGlzIHdpZGVyIHRoYW4gOCBiaXRzLCB5b3Ugd2lsbCBuZWVkCi10byByZWRlZmluZSBKT0NURVQgYW5kL29yIHByb3ZpZGUgY3VzdG9tIGRhdGEgc291cmNlL2Rlc3RpbmF0aW9uIG1hbmFnZXJzIHNvCi10aGF0IEpPQ1RFVCByZXByZXNlbnRzIGV4YWN0bHkgOCBiaXRzIG9mIGRhdGEgb24gZXh0ZXJuYWwgc3RvcmFnZS4KLQotVGhlIEpQRUcgbGlicmFyeSBwcm9wZXIgZG9lcyBub3QgYXNzdW1lIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIGNoYXJhY3RlcnMuCi1CdXQgc29tZSBvZiB0aGUgaW1hZ2UgZmlsZSBJL08gbW9kdWxlcyBpbiBjanBlZy9kanBlZyBkbyBoYXZlIEFTQ0lJCi1kZXBlbmRlbmNpZXMgaW4gZmlsZS1oZWFkZXIgbWFuaXB1bGF0aW9uOyBzbyBkb2VzIGNqcGVnJ3Mgc2VsZWN0X2ZpbGVfdHlwZSgpCi1yb3V0aW5lLgotCi1UaGUgSlBFRyBsaWJyYXJ5IGRvZXMgbm90IHJlbHkgaGVhdmlseSBvbiB0aGUgQyBsaWJyYXJ5LiAgSW4gcGFydGljdWxhciwgQwotc3RkaW8gaXMgdXNlZCBvbmx5IGJ5IHRoZSBkYXRhIHNvdXJjZS9kZXN0aW5hdGlvbiBtb2R1bGVzIGFuZCB0aGUgZXJyb3IKLWhhbmRsZXIsIGFsbCBvZiB3aGljaCBhcmUgYXBwbGljYXRpb24tcmVwbGFjZWFibGUuICAoY2pwZWcvZGpwZWcgYXJlIG1vcmUKLWhlYXZpbHkgZGVwZW5kZW50IG9uIHN0ZGlvLikgIG1hbGxvYyBhbmQgZnJlZSBhcmUgY2FsbGVkIG9ubHkgZnJvbSB0aGUgbWVtb3J5Ci1tYW5hZ2VyICJiYWNrIGVuZCIgbW9kdWxlLCBzbyB5b3UgY2FuIHVzZSBhIGRpZmZlcmVudCBtZW1vcnkgYWxsb2NhdG9yIGJ5Ci1yZXBsYWNpbmcgdGhhdCBvbmUgZmlsZS4KLQotVGhlIGNvZGUgZ2VuZXJhbGx5IGFzc3VtZXMgdGhhdCBDIG5hbWVzIG11c3QgYmUgdW5pcXVlIGluIHRoZSBmaXJzdCAxNQotY2hhcmFjdGVycy4gIEhvd2V2ZXIsIGdsb2JhbCBmdW5jdGlvbiBuYW1lcyBjYW4gYmUgbWFkZSB1bmlxdWUgaW4gdGhlCi1maXJzdCA2IGNoYXJhY3RlcnMgYnkgZGVmaW5pbmcgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUy4KLQotTW9yZSBpbmZvIGFib3V0IHBvcnRpbmcgdGhlIGNvZGUgbWF5IGJlIGdsZWFuZWQgYnkgcmVhZGluZyBqY29uZmlnLmRvYywKLWptb3JlY2ZnLmgsIGFuZCBqaW5jbHVkZS5oLgotCi0KLU5vdGVzIGZvciBNUy1ET1MgaW1wbGVtZW50b3JzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgSUpHIGNvZGUgaXMgZGVzaWduZWQgdG8gd29yayBlZmZpY2llbnRseSBpbiA4MHg4NiAic21hbGwiIG9yICJtZWRpdW0iCi1tZW1vcnkgbW9kZWxzIChpLmUuLCBkYXRhIHBvaW50ZXJzIGFyZSAxNiBiaXRzIHVubGVzcyBleHBsaWNpdGx5IGRlY2xhcmVkCi0iZmFyIjsgY29kZSBwb2ludGVycyBjYW4gYmUgZWl0aGVyIHNpemUpLiAgWW91IG1heSBiZSBhYmxlIHRvIHVzZSBzbWFsbAotbW9kZWwgdG8gY29tcGlsZSBjanBlZyBvciBkanBlZyBieSBpdHNlbGYsIGJ1dCB5b3Ugd2lsbCBwcm9iYWJseSBoYXZlIHRvIHVzZQotbWVkaXVtIG1vZGVsIGZvciBhbnkgbGFyZ2VyIGFwcGxpY2F0aW9uLiAgVGhpcyB3b24ndCBtYWtlIG11Y2ggZGlmZmVyZW5jZSBpbgotcGVyZm9ybWFuY2UuICBZb3UgKndpbGwqIHRha2UgYSBub3RpY2VhYmxlIHBlcmZvcm1hbmNlIGhpdCBpZiB5b3UgdXNlIGEKLWxhcmdlLWRhdGEgbWVtb3J5IG1vZGVsIChwZXJoYXBzIDEwJS0yNSUpLCBhbmQgeW91IHNob3VsZCBhdm9pZCAiaHVnZSIgbW9kZWwKLWlmIGF0IGFsbCBwb3NzaWJsZS4KLQotVGhlIEpQRUcgbGlicmFyeSB0eXBpY2FsbHkgbmVlZHMgMktiLTNLYiBvZiBzdGFjayBzcGFjZS4gIEl0IHdpbGwgYWxzbwotbWFsbG9jIGFib3V0IDIwSy0zMEsgb2YgbmVhciBoZWFwIHNwYWNlIHdoaWxlIGV4ZWN1dGluZyAoYW5kIGxvdHMgb2YgZmFyCi1oZWFwLCBidXQgdGhhdCBkb2Vzbid0IGNvdW50IGluIHRoaXMgY2FsY3VsYXRpb24pLiAgVGhpcyBmaWd1cmUgd2lsbCB2YXJ5Ci1kZXBlbmRpbmcgb24gc2VsZWN0ZWQgb3BlcmF0aW5nIG1vZGUsIGFuZCB0byBhIGxlc3NlciBleHRlbnQgb24gaW1hZ2Ugc2l6ZS4KLVRoZXJlIGlzIGFsc28gYWJvdXQgNUtiLTZLYiBvZiBjb25zdGFudCBkYXRhIHdoaWNoIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoZQotbmVhciBkYXRhIHNlZ21lbnQgKGFib3V0IDRLYiBvZiB0aGlzIGlzIHRoZSBlcnJvciBtZXNzYWdlIHRhYmxlKS4KLVRodXMgeW91IGhhdmUgcGVyaGFwcyAyMEsgYXZhaWxhYmxlIGZvciBvdGhlciBtb2R1bGVzJyBzdGF0aWMgZGF0YSBhbmQgbmVhcgotaGVhcCBzcGFjZSBiZWZvcmUgeW91IG5lZWQgdG8gZ28gdG8gYSBsYXJnZXIgbWVtb3J5IG1vZGVsLiAgVGhlIEMgbGlicmFyeSdzCi1zdGF0aWMgZGF0YSB3aWxsIGFjY291bnQgZm9yIHNldmVyYWwgSyBvZiB0aGlzLCBidXQgdGhhdCBzdGlsbCBsZWF2ZXMgYSBnb29kCi1kZWFsIGZvciB5b3VyIG5lZWRzLiAgKElmIHlvdSBhcmUgdGlnaHQgb24gc3BhY2UsIHlvdSBjb3VsZCByZWR1Y2UgdGhlIHNpemVzCi1vZiB0aGUgSS9PIGJ1ZmZlcnMgYWxsb2NhdGVkIGJ5IGpkYXRhc3JjLmMgYW5kIGpkYXRhZHN0LmMsIHNheSBmcm9tIDRLIHRvCi0xSy4gIEFub3RoZXIgcG9zc2liaWxpdHkgaXMgdG8gbW92ZSB0aGUgZXJyb3IgbWVzc2FnZSB0YWJsZSB0byBmYXIgbWVtb3J5OwotdGhpcyBzaG91bGQgYmUgZG9hYmxlIHdpdGggb25seSBsb2NhbGl6ZWQgaGFja2luZyBvbiBqZXJyb3IuYy4pCi0KLUFib3V0IDJLIG9mIHRoZSBuZWFyIGhlYXAgc3BhY2UgaXMgInBlcm1hbmVudCIgbWVtb3J5IHRoYXQgd2lsbCBub3QgYmUKLXJlbGVhc2VkIHVudGlsIHlvdSBkZXN0cm95IHRoZSBKUEVHIG9iamVjdC4gIFRoaXMgaXMgb25seSBhbiBpc3N1ZSBpZiB5b3UKLXNhdmUgYSBKUEVHIG9iamVjdCBiZXR3ZWVuIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gb3BlcmF0aW9ucy4KLQotRmFyIGRhdGEgc3BhY2UgbWF5IGFsc28gYmUgYSB0aWdodCByZXNvdXJjZSB3aGVuIHlvdSBhcmUgZGVhbGluZyB3aXRoIGxhcmdlCi1pbWFnZXMuICBUaGUgbW9zdCBtZW1vcnktaW50ZW5zaXZlIGNhc2UgaXMgZGVjb21wcmVzc2lvbiB3aXRoIHR3by1wYXNzIGNvbG9yCi1xdWFudGl6YXRpb24sIG9yIHNpbmdsZS1wYXNzIHF1YW50aXphdGlvbiB0byBhbiBleHRlcm5hbGx5IHN1cHBsaWVkIGNvbG9yCi1tYXAuICBUaGlzIHJlcXVpcmVzIGEgMTI4S2IgY29sb3IgbG9va3VwIHRhYmxlIHBsdXMgc3RyaXAgYnVmZmVycyBhbW91bnRpbmcKLXRvIGFib3V0IDQwIGJ5dGVzIHBlciBjb2x1bW4gZm9yIHR5cGljYWwgc2FtcGxpbmcgcmF0aW9zIChlZywgYWJvdXQgMjU2MDAKLWJ5dGVzIGZvciBhIDY0MC1waXhlbC13aWRlIGltYWdlKS4gIFlvdSBtYXkgbm90IGJlIGFibGUgdG8gcHJvY2VzcyB3aWRlCi1pbWFnZXMgaWYgeW91IGhhdmUgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzIG9mIHlvdXIgb3duLgotCi1PZiBjb3Vyc2UsIGFsbCBvZiB0aGVzZSBjb25jZXJucyB2YW5pc2ggaWYgeW91IHVzZSBhIDMyLWJpdCBmbGF0LW1lbW9yeS1tb2RlbAotY29tcGlsZXIsIHN1Y2ggYXMgREpHUFAgb3IgV2F0Y29tIEMuICBXZSBoaWdobHkgcmVjb21tZW5kIGZsYXQgbW9kZWwgaWYgeW91Ci1jYW4gdXNlIGl0OyB0aGUgSlBFRyBsaWJyYXJ5IGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIGluIGZsYXQgbW9kZWwuCmRpZmYgLS1naXQgYS9saWJqcGVnLnNwZWMgYi9saWJqcGVnLnNwZWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOWMyMjQuLjAwMDAwMDAKLS0tIGEvbGlianBlZy5zcGVjCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLSVkZWZpbmUgTElCVkVSIDYyLjEuMAotU3VtbWFyeTogQSBsaWJyYXJ5IGZvciBtYW5pcHVsYXRpbmcgSlBFRyBpbWFnZSBmb3JtYXQgZmlsZXMgKHdpdGggU0lNRCBzdXBwb3J0KQotU3VtbWFyeShqYSk6IEpQRUcgt8G8sLLowfyl1aWhpaSl66TysLekprDZpM6l6aWkpdal6aXqICh4ODYgU0lNRCDC0LH+yMcpCi1OYW1lOiBsaWJqcGVnCi1WZXJzaW9uOiA2YngxLjAyCi1SZWxlYXNlOiAxCi1MaWNlbnNlOiBkaXN0cmlidXRhYmxlCi1Hcm91cDogU3lzdGVtIEVudmlyb25tZW50L0xpYnJhcmllcwotU291cmNlMDogaHR0cDovL2NldHVzLnNha3VyYS5uZS5qcC9zb2Z0bGFiL2pwZWcteDg2c2ltZC9zb3VyY2VzL2pwZWdzcmMtNmIteDg2c2ltZC0xLjAyLnRhci5iejIKLUJ1aWxkcm9vdDogJXtfdG1wcGF0aH0vJXtuYW1lfS0le3ZlcnNpb259LXJvb3QKLUV4Y2x1c2l2ZUFyY2g6ICV7aXg4Nn0KLUJ1aWxkUHJlcmVxOiBuYXNtID49IDAuOTguMjUKLQotJXBhY2thZ2UgZGV2ZWwKLVN1bW1hcnk6IERldmVsb3BtZW50IHRvb2xzIGZvciBwcm9ncmFtcyB3aGljaCB3aWxsIHVzZSB0aGUgbGlianBlZyBsaWJyYXJ5LgotU3VtbWFyeShqYSk6IGxpYmpwZWcgpemlpKXWpeml6qTyu8ikpqXXpe2lsKXppeC4/qSxs6vIr6XEobyl6wotR3JvdXA6IERldmVsb3BtZW50L0xpYnJhcmllcwotUmVxdWlyZXM6IGxpYmpwZWcgPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KLQotJWRlc2NyaXB0aW9uCi1UaGUgbGlianBlZyBwYWNrYWdlIGNvbnRhaW5zIGEgbGlicmFyeSBvZiBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZwotSlBFRyBpbWFnZXMsIGFzIHdlbGwgYXMgc2ltcGxlIGNsaWVudCBwcm9ncmFtcyBmb3IgYWNjZXNzaW5nIHRoZQotbGlianBlZyBmdW5jdGlvbnMuICBMaWJqcGVnIGNsaWVudCBwcm9ncmFtcyBpbmNsdWRlIGNqcGVnLCBkanBlZywKLWpwZWd0cmFuLCByZGpwZ2NvbSBhbmQgd3JqcGdjb20uICBDanBlZyBjb21wcmVzc2VzIGFuIGltYWdlIGZpbGUgaW50bwotSlBFRyBmb3JtYXQuICBEanBlZyBkZWNvbXByZXNzZXMgYSBKUEVHIGZpbGUgaW50byBhIHJlZ3VsYXIgaW1hZ2UKLWZpbGUuICBKcGVndHJhbiBjYW4gcGVyZm9ybSB2YXJpb3VzIHVzZWZ1bCB0cmFuc2Zvcm1hdGlvbnMgb24gSlBFRwotZmlsZXMuICBSZGpwZ2NvbSBkaXNwbGF5cyBhbnkgdGV4dCBjb21tZW50cyBpbmNsdWRlZCBpbiBhIEpQRUcgZmlsZS4KLVdyanBnY29tIGluc2VydHMgdGV4dCBjb21tZW50cyBpbnRvIGEgSlBFRyBmaWxlLgotCi1UaGUgbGlianBlZyBsaWJyYXJ5IGluIHRoaXMgcGFja2FnZSB1c2VzIFNJTUQgaW5zdHJ1Y3Rpb25zIGlmIGF2YWlsYWJsZS4KLU9uIGEgcHJvY2Vzc29yIHRoYXQgc3VwcG9ydHMgU0lNRCBpbnN0cnVjdGlvbnMgKE1NWCwgU1NFLCBldGMpLAotaXQgcnVucyAyLTMgdGltZXMgZmFzdGVyIHRoYW4gdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgbGlianBlZy4KLQotJWRlc2NyaXB0aW9uIC1sIGphCi1saWJqcGVnIKXRpcOlsaG8pbiky6TPIEpQRUcgsujB/KTysLekprDZpMvJrM3XpMql6aWkpdal6aXqpMihpAotbGlianBlZyC02L/0pMuloqWvpbuluaS5pOuw2aTOtMrDsaTKpa+l6aWkpaKl86XIpdel7aWwpeml4KSsCi28/aThpOmk7KTGpKSk3qS5oaVsaWJqcGVnIKWvpemlpKWipfOlyKXXpe2lsKXppeCky6TPIGNqcGVnLCBkanBlZywKLWpwZWd0cmFuLCByZGpwZ2NvbSwgd3JqcGdjb20gpKykoqTqpN6kuaGlY2pwZWcgpM+y6MH8pdWloaWkpeuk8gotSlBFRyC3wbywpMuwtb3MpLek3qS5oaVkanBlZyCkzyBKUEVHIKXVpaGlpKXrpPLEzL7vpM6y6MH8pdWloaWkpeukywotxbizq6S3pN6kuaGlanBlZ3RyYW4gpM8gSlBFRyCl1aWhpaSl66TLzc2huaTKytG0uaTyu9ykuaSzpMikrL3Qzeik3qS5oaUKLXJkanBnY29tIKTPIEpQRUcgpdWloaWkpeuky7TepN6k7KTGpKSk66XGpa2luaXIt8G8sKTOpbOl4aXzpcik8sm9vKikt6GkCi13cmpwZ2NvbSCkzyBKUEVHIKXVpaGlpKXrpMulxqWtpbmlyLfBvLCkzqWzpeGl86XIpPLEybLDpLek3qS5oaUKLQotpLOkzqXRpcOlsaG8pbiky7z9pOGk6aTspMakpKTrIGxpYmpwZWcgpemlpKXWpeml6qTPoaJ4ODYgU0lNRCDC0LH+yMekx6S5oaMKLU1NWCCk5CBTU0UgpMqkyaTOIFNJTUQgsem7u7Whx72k8sH1yPekt6TGpKSk66XXpe2lu6XDpbW+5aTHxrC67qS1pLuk66TIoaIKLaWqpeqluKXKpevIx6TOIGxpYmpwZWcgpemlpKXWpeml6qTIyOaz06S3pMYgMqHBM8fcxPjF2aTOwq7F2aTHxrC67qS3pN6kuaGjCi0KLSVkZXNjcmlwdGlvbiBkZXZlbAotVGhlIGxpYmpwZWctZGV2ZWwgcGFja2FnZSBpbmNsdWRlcyB0aGUgaGVhZGVyIGZpbGVzIGFuZCBzdGF0aWMgbGlicmFyaWVzCi1uZWNlc3NhcnkgZm9yIGRldmVsb3BpbmcgcHJvZ3JhbXMgd2hpY2ggd2lsbCBtYW5pcHVsYXRlIEpQRUcgZmlsZXMgdXNpbmcKLXRoZSBsaWJqcGVnIGxpYnJhcnkuCi0KLUlmIHlvdSBhcmUgZ29pbmcgdG8gZGV2ZWxvcCBwcm9ncmFtcyB3aGljaCB3aWxsIG1hbmlwdWxhdGUgSlBFRyBpbWFnZXMsCi15b3Ugc2hvdWxkIGluc3RhbGwgbGlianBlZy1kZXZlbC4gIFlvdSdsbCBhbHNvIG5lZWQgdG8gaGF2ZSB0aGUgbGlianBlZwotcGFja2FnZSBpbnN0YWxsZWQuCi0KLSVkZXNjcmlwdGlvbiBkZXZlbCAtbCBqYQotbGlianBlZy1kZXZlbCCl0aXDpbGhvKW4pMukz6GkbGlianBlZyCl6aWkpdal6aXqpPK7yKTDpMYgSlBFRyCl1aWhpaSl66TyCi2wt6Smpdel7aWwpeml4KTys6vIr6S5pOukzqTLyazN16TKpdilw6XApdWloaWkpeukyKW5pb+lxqWjpcOlr6XppaSl1qXppeqkrAotvP2k4aTppOykxqSkpN6kuaGlCi0KLUpQRUcgsujB/KTysLekpqXXpe2lsKXppeCk8rOryK+kuaTrut2ky6TPoaRsaWJqcGVnLWRldmVsIKTyCi2lpKXzpbmlyKG8peukt6TGsryktaSkoaXGsbv+pMsgbGlianBlZyCl0aXDpbGhvKW4pOKlpKXzpbmlyKG8peukuaTrCi3JrM3XpKykoqTqpN6kuaGlCi0KLSVwcmVwCi0lc2V0dXAgLXEgLW4ganBlZy02YngKLSMgc3VwcHJlc3MgImxpYnRvb2xpemUgLS1jb3B5IC0tZm9yY2UiCi1tdiBjb25maWd1cmUuaW4gY29uZmlndXJlLmluXwotCi0lYnVpbGQKLSVjb25maWd1cmUgLS1lbmFibGUtc2hhcmVkIC0tZW5hYmxlLXN0YXRpYwotCi1tYWtlIGxpYmRpcj0le19saWJkaXJ9ICV7P19zbXBfbWZsYWdzfQotTERfTElCUkFSWV9QQVRIPSRMRF9MSUJSQVJZX1BBVEg6JFBXRCBtYWtlIHRlc3QKLQotJWluc3RhbGwKLXJtIC1yZiAkUlBNX0JVSUxEX1JPT1QKLQotJW1ha2VpbnN0YWxsCi0jc3RyaXAgLVIgLmNvbW1lbnQgJFJQTV9CVUlMRF9ST09UL3Vzci9iaW4vKiB8fCA6Ci0jL3NiaW4vbGRjb25maWcgLW4gJFJQTV9CVUlMRF9ST09ULyV7X2xpYmRpcn0KLQotJXBvc3QgLXAgL3NiaW4vbGRjb25maWcKLQotJXBvc3R1biAtcCAvc2Jpbi9sZGNvbmZpZwotCi0lY2xlYW4KLXJtIC1yZiAkUlBNX0JVSUxEX1JPT1QKLQotJWZpbGVzCi0lZGVmYXR0cigtLHJvb3Qscm9vdCkKLSVkb2MgdXNhZ2UuZG9jIHdpemFyZC5kb2MgUkVBRE1FCi0le19saWJkaXJ9L2xpYmpwZWcuc28uKgotJXtfYmluZGlyfS8qCi0le19tYW5kaXJ9LyovKgotCi0lZmlsZXMgZGV2ZWwKLSVkZWZhdHRyKC0scm9vdCxyb290KQotJWRvYyBsaWJqcGVnLmRvYyBjb2RlcnVsZXMuZG9jIHN0cnVjdHVyZS5kb2MgZXhhbXBsZS5jCi0lZG9jIHNpbWRfKi50eHQKLSV7X2xpYmRpcn0vKi5hCi0le19saWJkaXJ9LyoubGEKLSV7X2xpYmRpcn0vKi5zbwotL3Vzci9pbmNsdWRlLyouaAotCi0lY2hhbmdlbG9nCi0qIFNhdCBGZWIgMDQgMjAwNiBNSVlBU0FLQSBNYXNhcnUgPGFsa2FpZEBjb3JhbC5vY24ubmUuanA+IC0gNmJ4MS4wMi0xCi0tIHVwZ3JhZGVkIHRvIDZieDEuMDIKLQotKiBUaHUgSmFuIDI2IDIwMDYgTUlZQVNBS0EgTWFzYXJ1IDxhbGthaWRAY29yYWwub2NuLm5lLmpwPiAtIDZieDEuMDEtMQotLSB1cGdyYWRlZCB0byA2YngxLjAxCi0KLSogVGh1IE1hciAyNCAyMDA1IE1JWUFTQUtBIE1hc2FydSA8YWxrYWlkQGNvcmFsLm9jbi5uZS5qcD4gLSA2YngxLjAtMQotLSBiYXNlZCBvbiA2Yi0zMyBmcm9tIEZlZG9yYSBDb3JlIDMgYW5kIG1vZGlmaWVkIGZvciBTSU1ELWV4dGVuZGVkIGxpYmpwZWcKLS0gYWRkZWQgSmFwYW5lc2Ugc3VtbWFyeSBhbmQgZGVzY3JpcHRpb24sIHdoaWNoIGlzIGRlbGl2ZXJlZCBmcm9tIFZpbmUgTGludXgKLS0gbW92ZWQgd2l6YXJkLmRvYyB0byBtYWluIHBhY2thZ2UKLQotKiBUaHUgT2N0ICA3IDIwMDQgTWF0dGhpYXMgQ2xhc2VuIDxtY2xhc2VuQHJlZGhhdC5jb20+IC0gNmItMzMKLS0gQWRkIFVSTC4gICgjMTM0NzkxKQotCi0qIFR1ZSBKdW4gMTUgMjAwNCBFbGxpb3QgTGVlIDxzb3B3aXRoQHJlZGhhdC5jb20+Ci0tIHJlYnVpbHQKLQotKiBUdWUgTWFyIDAyIDIwMDQgRWxsaW90IExlZSA8c29wd2l0aEByZWRoYXQuY29tPgotLSByZWJ1aWx0Ci0KLSogRnJpIEZlYiAxMyAyMDA0IEVsbGlvdCBMZWUgPHNvcHdpdGhAcmVkaGF0LmNvbT4KLS0gcmVidWlsdAotCi0qIFRodSBTZXAgMjUgMjAwMyBKZXJlbXkgS2F0eiA8a2F0empAcmVkaGF0LmNvbT4gNmItMzAKLS0gcmVidWlsZCB0byBmaXggZ3ppcHBlZCBmaWxlIG1kNXN1bXMgKCM5MTIxMSkKLQotKiBUdWUgU2VwIDIzIDIwMDMgRmxvcmlhbiBMYSBSb2NoZSA8Rmxvcmlhbi5MYVJvY2hlQHJlZGhhdC5kZT4KLS0gZG8gbm90IHNldCBycGF0aAotCi0qIFdlZCBKdW4gMDQgMjAwMyBFbGxpb3QgTGVlIDxzb3B3aXRoQHJlZGhhdC5jb20+Ci0tIHJlYnVpbHQKLQotKiBUaHUgRmViIDEzIDIwMDMgRWxsaW90IExlZSA8c29wd2l0aEByZWRoYXQuY29tPiA2Yi0yNwotLSBBZGQgbGlianBlZy1zaGFyZWQucGF0Y2ggdG8gZml4IHNobGlicyBvbiBwb3dlcnBjCi0KLSogVHVlIEZlYiAwNCAyMDAzIEZsb3JpYW4gTGEgUm9jaGUgPEZsb3JpYW4uTGFSb2NoZUByZWRoYXQuZGU+Ci0tIGFkZCBzeW1saW5rIHRvIHNoYXJlZCBsaWIKLQotKiBXZWQgSmFuIDIyIDIwMDMgVGltIFBvd2VycyA8dGltcEByZWRoYXQuY29tPgotLSByZWJ1aWx0Ci0KLSogTW9uIEphbiAgNiAyMDAzIEpvbmF0aGFuIEJsYW5kZm9yZCA8anJiQHJlZGhhdC5jb20+Ci0tIGFkZCBkb2NzLCAjNzY1MDgKLQotKiBGcmkgRGVjIDEzIDIwMDIgRWxsaW90IExlZSA8c29wd2l0aEByZWRoYXQuY29tPiA2Yi0yMwotLSBNZXJnZSBpbiBtdWx0aWxpYiBjaGFuZ2VzCi0tIF9zbXBfbWZsYWdzCi0KLSogVHVlIFNlcCAxMCAyMDAyIFRoYW4gTmdvIDx0aGFuQHJlZGhhdC5jb20+IDZiLTIyCi0tIHVzZSAlJV9saWJkaXIKLQotKiBGcmkgSnVuIDIxIDIwMDIgVGltIFBvd2VycyA8dGltcEByZWRoYXQuY29tPgotLSBhdXRvbWF0ZWQgcmVidWlsZAotCi0qIFRodSBNYXkgMjMgMjAwMiBUaW0gUG93ZXJzIDx0aW1wQHJlZGhhdC5jb20+Ci0tIGF1dG9tYXRlZCByZWJ1aWxkCi0KLSogVGh1IEphbiAzMSAyMDAyIEJlcm5oYXJkIFJvc2Vua3JhZW56ZXIgPGJlcm9AcmVkaGF0LmNvbT4gNmItMTkKLS0gRml4IGJ1ZyAjNTkwMTEKLQotKiBNb24gSmFuIDI4IDIwMDIgQmVybmhhcmQgUm9zZW5rcmFlbnplciA8YmVyb0ByZWRoYXQuY29tPiA2Yi0xOAotLSBGaXggYnVnICM1ODk4MgotCi0qIFdlZCBKYW4gMDkgMjAwMiBUaW0gUG93ZXJzIDx0aW1wQHJlZGhhdC5jb20+Ci0tIGF1dG9tYXRlZCByZWJ1aWxkCi0KLSogVHVlIEp1bCAyNCAyMDAxIEJpbGwgTm90dGluZ2hhbSA8bm90dGluZ0ByZWRoYXQuY29tPgotLSByZXF1aXJlIGxpYmpwZWcgPSAlJXt2ZXJzaW9ufQotCi0qIFN1biBKdW4gMjQgMjAwMSBFbGxpb3QgTGVlIDxzb3B3aXRoQHJlZGhhdC5jb20+Ci0tIEJ1bXAgcmVsZWFzZSArIHJlYnVpbGQuCi0KLSogTW9uIERlYyAxMSAyMDAwIFRoYW4gTmdvIDx0aGFuQHJlZGhhdC5jb20+Ci0tIHJlYnVpbHQgd2l0aCB0aGUgZml4ZWQgZmlsZXV0aWxzCi0tIHVzZSAlJXtfdG1wcGF0aH0KLQotKiBXZWQgTm92ICA4IDIwMDAgQmVybmhhcmQgUm9zZW5rcmFlbnplciA8YmVyb0ByZWRoYXQuY29tPgotLSBmaXggYSB0eXBvIChzdHJpcCAtUiAuY29tbWVudCwgbm90IC5jb21tZW50cykKLQotKiBUaHUgSnVsIDEzIDIwMDAgUHJvc3BlY3RvciA8YnVnemlsbGFAcmVkaGF0LmNvbT4KLS0gYXV0b21hdGljIHJlYnVpbGQKLQotKiBTYXQgSnVuIDE3IDIwMDAgQmVybmhhcmQgUm9zZW5rcmFlbnplciA8YmVyb0ByZWRoYXQuY29tPgotLSBGSFNpZnkKLS0gYWRkIHNvbWUgQysrIHR3ZWFrcyB0byB0aGUgaGVhZGVycyBhcyBzdWdnZXN0ZWQgYnkgYnVnICM5ODIyKQotCi0qIFdlZCBNYXkgIDUgMjAwMCBCaWxsIE5vdHRpbmdoYW0gPG5vdHRpbmdAcmVkaGF0LmNvbT4KLS0gY29uZmlndXJlIHR3ZWFrcyBmb3IgaWE2NDsgcmVtb3ZlIGFscGhhIHBhdGNoIChpdCdzIHBvaW50bGVzcykKLQotKiBTYXQgRmViICA1IDIwMDAgQmVybmhhcmQgUm9zZW5rcuTuemVyIDxiZXJvQHJlZGhhdC5jb20+Ci0tIHJlYnVpbGQgdG8gZ2V0IGNvbXByZXNzZWQgbWFuIHBhZ2VzCi0tIGZpeCBkZXNjcmlwdGlvbgotLSBzb21lIG1pbm9yIHR3ZWFrcyB0byB0aGUgc3BlYyBmaWxlCi0tIGFkZCBkb2NzCi0tIGZpeCBidWlsZCBvbiBhbHBoYSAoYWxwaGFldjYgc3R1ZmYpCi0KLSogU3VuIE1hciAyMSAxOTk5IENyaXN0aWFuIEdhZnRvbiA8Z2FmdG9uQHJlZGhhdC5jb20+IAotLSBhdXRvIHJlYnVpbGQgaW4gdGhlIG5ldyBidWlsZCBlbnZpcm9ubWVudCAocmVsZWFzZSA5KQotCi0qIFdlZCBKYW4gMTMgMTk5OSBDcmlzdGlhbiBHYWZ0b24gPGdhZnRvbkByZWRoYXQuY29tPgotLSBwYXRjaCB0byBidWlsZCBvbiBhcm0KLS0gYnVpbGQgZm9yIGdsaWJjIDIuMQotCi0qIE1vbiBPY3QgMTIgMTk5OCBDcmlzdGlhbiBHYWZ0b24gPGdhZnRvbkByZWRoYXQuY29tPgotLSBzdHJpcCBiaW5hcmllcwotCi0qIE1vbiBBdWcgIDMgMTk5OCBKZWZmIEpvaG5zb24gPGpiakByZWRoYXQuY29tPgotLSBmaXggYnVpbGRyb290IHByb2JsZW0uCi0KLSogVHVlIEp1biAwOSAxOTk4IFByb3NwZWN0b3IgU3lzdGVtIDxidWdzQHJlZGhhdC5jb20+Ci0tIHRyYW5zbGF0aW9ucyBtb2RpZmllZCBmb3IgZGUKLQotKiBUaHUgSnVuIDA0IDE5OTggTWFyYyBFd2luZyA8bWFyY0ByZWRoYXQuY29tPgotLSB1cCB0byByZWxlYXNlIDQKLS0gcmVtb3ZlIHBhdGNoIHRoYXQgc2V0IChpbXByb3Blcikgc29uYW1lIC0gbGlianBlZyBub3cgZG9lcyBpdCBpdHNlbGYKLQotKiBUaHUgTWF5IDA3IDE5OTggUHJvc3BlY3RvciBTeXN0ZW0gPGJ1Z3NAcmVkaGF0LmNvbT4KLS0gdHJhbnNsYXRpb25zIG1vZGlmaWVkIGZvciBkZSwgZnIsIHRyCi0KLSogRnJpIE1heSAwMSAxOTk4IENyaXN0aWFuIEdhZnRvbiA8Z2FmdG9uQHJlZGhhdC5jb20+Ci0tIGZpeGVkIGJ1aWxkIG9uIG1hbmhhdHRhbgotCi0qIFdlZCBBcHIgMDggMTk5OCBDcmlzdGlhbiBHYWZ0b24gPGdhZnRvbkByZWRoYXQuY29tPgotLSB1cGdyYWRlZCB0byB2ZXJzaW9uIDZiCi0KLSogV2VkIE9jdCAwOCAxOTk3IERvbm5pZSBCYXJuZXMgPGRqYkByZWRoYXQuY29tPgotLSBuZXcgcGFja2FnZSB0byByZW1vdmUganBlZyBzdHVmZiBmcm9tIGxpYmdyIGFuZCBwdXQgaW4gaXQncyBvd24gcGFja2FnZQpkaWZmIC0tZ2l0IGEvbHRtYWluLnNoIGIvbHRtYWluLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGJjYTFlLi4wMDAwMDAwCi0tLSBhL2x0bWFpbi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUwNjUgKzAsMCBAQAotIyBsdG1haW4uc2ggLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLSMgTk9URTogQ2hhbmdpbmcgdGhpcyBmaWxlIHdpbGwgbm90IGFmZmVjdCBhbnl0aGluZyB1bnRpbCB5b3UgcmVydW4gY29uZmlndXJlLgotIwotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBDaGVjayB0aGF0IHdlIGhhdmUgYSB3b3JraW5nICRlY2hvLgotaWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgc2hpZnQKLWVsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgotICA6Ci1lbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgotICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCi0gIDoKLWVsc2UKLSAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSAkZWNobyB3aWxsIHdvcmsuCi0gIGV4ZWMgJFNIRUxMICIkMCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9Ci1maQotCi1pZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobwotICBzaGlmdAotICBjYXQgPDxFT0YKLSQqCi1FT0YKLSAgZXhpdCAwCi1maQotCi0jIGRlZmluZSBTRUQgZm9yIGhpc3RvcmljIGx0Y29uZmlnJ3MgZ2VuZXJhdGVkIGJ5IExpYnRvb2wgMS4zCi10ZXN0IC16ICIkU0VEIiAmJiBTRUQ9c2VkCi0KLSMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtLgotcHJvZ25hbWU9YCRlY2hvICIkMCIgfCAke1NFRH0gJ3MlXi4qLyUlJ2AKLW1vZGVuYW1lPSIkcHJvZ25hbWUiCi0KLSMgQ29uc3RhbnRzLgotUFJPR1JBTT1sdG1haW4uc2gKLVBBQ0tBR0U9bGlidG9vbAotVkVSU0lPTj0xLjQuMwotVElNRVNUQU1QPSIgKDEuOTIyLjIuMTEwIDIwMDIvMTAvMjMgMDE6Mzk6NTQpIgotCi1kZWZhdWx0X21vZGU9Ci1oZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi1tYWdpYz0iJSUlTUFHSUMgdmFyaWFibGUlJSUiCi1ta2Rpcj0ibWtkaXIiCi1tdj0ibXYgLWYiCi1ybT0icm0gLWYiCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPSIke1NFRH0iJyAtZSAxcy9eWC8vJwotc2VkX3F1b3RlX3N1YnN0PSdzL1woW1xcYFxcIiRcXFxcXVwpL1xcXDEvZycKLSMgdGVzdCBFQkNESUMgb3IgQVNDSUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWNhc2UgYGVjaG8gQXxvZCAteGAgaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqW0NjXTEqKSAjIEVCQ0RJQyBiYXNlZCBzeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgU1AyTkw9InRyICdcMTAwJyAnXG4nIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgTkwyU1A9InRyICdcclxuJyAnXDEwMFwxMDAnIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqKSAjIEFzc3VtZSBBU0NJSSBiYXNlZCBzeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgU1AyTkw9InRyICdcMDQwJyAnXDAxMiciICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgTkwyU1A9InRyICdcMDE1XDAxMicgJ1wwNDBcMDQwJyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWVzYWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCBMQU5HIGFuZCBMQ19BTEwgdG8gQyBpZiBhbHJlYWR5IHNldC4KLSMgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kCi0jIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIFdlIHNhdmUgdGhlIG9sZCB2YWx1ZXMgdG8gcmVzdG9yZSBkdXJpbmcgZXhlY3V0ZSBtb2RlLgotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgc2F2ZV9MQ19BTEw9IiRMQ19BTEwiOyBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTAotZmkKLWlmIHRlc3QgIiR7TEFORytzZXR9IiA9IHNldDsgdGhlbgotICBzYXZlX0xBTkc9IiRMQU5HIjsgTEFORz1DOyBleHBvcnQgTEFORwotZmkKLQotIyBNYWtlIHN1cmUgSUZTIGhhcyBhIHNlbnNpYmxlIGRlZmF1bHQKLTogJHtJRlM9IiAJIn0KLQotaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgIT0geWVzOyB0aGVuCi0gIGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gYnVpbGQgYW55IGtpbmQgb2YgbGlicmFyeSIgMT4mMgotICBlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgotICBleGl0IDEKLWZpCi0KLSMgR2xvYmFsIHZhcmlhYmxlcy4KLW1vZGU9JGRlZmF1bHRfbW9kZQotbm9ub3B0PQotcHJldj0KLXByZXZvcHQ9Ci1ydW49Ci1zaG93PSIkZWNobyIKLXNob3dfaGVscD0KLWV4ZWN1dGVfZGxmaWxlcz0KLWxvMm89InMvXFwubG9cJC8uJHtvYmpleHR9LyIKLW8ybG89InMvXFwuJHtvYmpleHR9XCQvLmxvLyIKLQotIyBQYXJzZSBvdXIgY29tbWFuZCBsaW5lIG9wdGlvbnMgb25jZSwgdGhvcm91Z2hseS4KLXdoaWxlIHRlc3QgJCMgLWd0IDAKLWRvCi0gIGFyZz0iJDEiCi0gIHNoaWZ0Ci0KLSAgY2FzZSAkYXJnIGluCi0gIC0qPSopIG9wdGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgIGNhc2UgJHByZXYgaW4KLSAgICBleGVjdXRlX2RsZmlsZXMpCi0gICAgICBleGVjdXRlX2RsZmlsZXM9IiRleGVjdXRlX2RsZmlsZXMgJGFyZyIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgIiRwcmV2PVwkYXJnIgotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBwcmV2PQotICAgIHByZXZvcHQ9Ci0gICAgY29udGludWUKLSAgZmkKLQotICAjIEhhdmUgd2Ugc2VlbiBhIG5vbi1vcHRpb25hbCBhcmd1bWVudCB5ZXQ/Ci0gIGNhc2UgJGFyZyBpbgotICAtLWhlbHApCi0gICAgc2hvd19oZWxwPXllcwotICAgIDs7Ci0KLSAgLS12ZXJzaW9uKQotICAgIGVjaG8gIiRQUk9HUkFNIChHTlUgJFBBQ0tBR0UpICRWRVJTSU9OJFRJTUVTVEFNUCIKLSAgICBleGl0IDAKLSAgICA7OwotCi0gIC0tY29uZmlnKQotICAgICR7U0VEfSAtZSAnMSwvXiMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHL2QnIC1lICcvXiMgIyMjIEVORCBMSUJUT09MIENPTkZJRy8sJGQnICQwCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAtLWRlYnVnKQotICAgIGVjaG8gIiRwcm9nbmFtZTogZW5hYmxpbmcgc2hlbGwgdHJhY2UgbW9kZSIKLSAgICBzZXQgLXgKLSAgICA7OwotCi0gIC0tZHJ5LXJ1biB8IC1uKQotICAgIHJ1bj06Ci0gICAgOzsKLQotICAtLWZlYXR1cmVzKQotICAgIGVjaG8gImhvc3Q6ICRob3N0IgotICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICBlY2hvICJlbmFibGUgc2hhcmVkIGxpYnJhcmllcyIKLSAgICBlbHNlCi0gICAgICBlY2hvICJkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMiCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICBlY2hvICJlbmFibGUgc3RhdGljIGxpYnJhcmllcyIKLSAgICBlbHNlCi0gICAgICBlY2hvICJkaXNhYmxlIHN0YXRpYyBsaWJyYXJpZXMiCi0gICAgZmkKLSAgICBleGl0IDAKLSAgICA7OwotCi0gIC0tZmluaXNoKSBtb2RlPSJmaW5pc2giIDs7Ci0KLSAgLS1tb2RlKSBwcmV2b3B0PSItLW1vZGUiIHByZXY9bW9kZSA7OwotICAtLW1vZGU9KikgbW9kZT0iJG9wdGFyZyIgOzsKLQotICAtLXByZXNlcnZlLWR1cC1kZXBzKSBkdXBsaWNhdGVfZGVwcz0ieWVzIiA7OwotCi0gIC0tcXVpZXQgfCAtLXNpbGVudCkKLSAgICBzaG93PToKLSAgICA7OwotCi0gIC1kbG9wZW4pCi0gICAgcHJldm9wdD0iLWRsb3BlbiIKLSAgICBwcmV2PWV4ZWN1dGVfZGxmaWxlcwotICAgIDs7Ci0KLSAgLSopCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYCRhcmcnIiAxPiYyCi0gICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gICAgOzsKLQotICAqKQotICAgIG5vbm9wdD0iJGFyZyIKLSAgICBicmVhawotICAgIDs7Ci0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJHByZXZvcHQiOyB0aGVuCi0gICRlY2hvICIkbW9kZW5hbWU6IG9wdGlvbiBcYCRwcmV2b3B0JyByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgotICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAxCi1maQotCi0jIElmIHRoaXMgdmFyaWFibGUgaXMgc2V0IGluIGFueSBvZiB0aGUgYWN0aW9ucywgdGhlIGNvbW1hbmQgaW4gaXQKLSMgd2lsbCBiZSBleGVjZWQgYXQgdGhlIGVuZC4gIFRoaXMgcHJldmVudHMgaGVyZS1kb2N1bWVudHMgZnJvbSBiZWluZwotIyBsZWZ0IG92ZXIgYnkgc2hlbGxzLgotZXhlY19jbWQ9Ci0KLWlmIHRlc3QgLXogIiRzaG93X2hlbHAiOyB0aGVuCi0KLSAgIyBJbmZlciB0aGUgb3BlcmF0aW9uIG1vZGUuCi0gIGlmIHRlc3QgLXogIiRtb2RlIjsgdGhlbgotICAgIGNhc2UgJG5vbm9wdCBpbgotICAgICpjYyB8ICorKyB8IGdjYyogfCAqLWdjYyogfCB4bGMqKQotICAgICAgbW9kZT1saW5rCi0gICAgICBmb3IgYXJnCi0gICAgICBkbwotCWNhc2UgJGFyZyBpbgotCS1jKQotCSAgIG1vZGU9Y29tcGlsZQotCSAgIGJyZWFrCi0JICAgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICA7OwotICAgICpkYiB8ICpkYnggfCAqc3RyYWNlIHwgKnRydXNzKQotICAgICAgbW9kZT1leGVjdXRlCi0gICAgICA7OwotICAgICppbnN0YWxsKnxjcHxtdikKLSAgICAgIG1vZGU9aW5zdGFsbAotICAgICAgOzsKLSAgICAqcm0pCi0gICAgICBtb2RlPXVuaW5zdGFsbAotICAgICAgOzsKLSAgICAqKQotICAgICAgIyBJZiB3ZSBoYXZlIG5vIG1vZGUsIGJ1dCBkbGZpbGVzIHdlcmUgc3BlY2lmaWVkLCB0aGVuIGRvIGV4ZWN1dGUgbW9kZS4KLSAgICAgIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIG1vZGU9ZXhlY3V0ZQotCi0gICAgICAjIEp1c3QgdXNlIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBtb2RlLgotICAgICAgaWYgdGVzdCAteiAiJG1vZGUiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJG5vbm9wdCI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBpbmZlciBvcGVyYXRpb24gbW9kZSBmcm9tIFxgJG5vbm9wdCciIDE+JjIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgd2l0aG91dCBNT0RFLUFSR1MiIDE+JjIKLQlmaQotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotCi0gICMgT25seSBleGVjdXRlIG1vZGUgaXMgYWxsb3dlZCB0byBoYXZlIC1kbG9wZW4gZmxhZ3MuCi0gIGlmIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIHRlc3QgIiRtb2RlIiAhPSBleGVjdXRlOyB0aGVuCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYC1kbG9wZW4nIiAxPiYyCi0gICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi0KLSAgIyBDaGFuZ2UgdGhlIGhlbHAgbWVzc2FnZSB0byBhIG1vZGUtc3BlY2lmaWMgb25lLgotICBnZW5lcmljX2hlbHA9IiRoZWxwIgotICBoZWxwPSJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT0kbW9kZScgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotCi0gICMgVGhlc2UgbW9kZXMgYXJlIGluIG9yZGVyIG9mIGV4ZWN1dGlvbiBmcmVxdWVuY3kgc28gdGhhdCB0aGV5IHJ1biBxdWlja2x5LgotICBjYXNlICRtb2RlIGluCi0gICMgbGlidG9vbCBjb21waWxlIG1vZGUKLSAgY29tcGlsZSkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBjb21waWxlIgotICAgICMgR2V0IHRoZSBjb21waWxhdGlvbiBjb21tYW5kIGFuZCB0aGUgc291cmNlIGZpbGUuCi0gICAgYmFzZV9jb21waWxlPQotICAgIHByZXY9Ci0gICAgbGFzdGFyZz0KLSAgICBzcmNmaWxlPSIkbm9ub3B0IgotICAgIHN1cHByZXNzX291dHB1dD0KLQotICAgIHVzZXJfdGFyZ2V0PW5vCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBjYXNlICRwcmV2IGluCi0gICAgICAiIikgOzsKLSAgICAgIHhjb21waWxlcikKLQkjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIHByZXZpb3VzIGFyZ3VtZW50LgotCXByZXY9Ci0JbGFzdGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQotCWNhc2UgJGFyZyBpbgotCSMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLQkjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseQotCSMgaW4gc2NhbiBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCi0JKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JICBhcmc9IlwiJGFyZ1wiIgotCSAgOzsKLQllc2FjCi0KLQkjIEFkZCB0aGUgcHJldmlvdXMgYXJndW1lbnQgdG8gYmFzZV9jb21waWxlLgotCWlmIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiOyB0aGVuCi0JICBiYXNlX2NvbXBpbGU9IiRsYXN0YXJnIgotCWVsc2UKLQkgIGJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKLQlmaQotCWNvbnRpbnVlCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBBY2NlcHQgYW55IGNvbW1hbmQtbGluZSBvcHRpb25zLgotICAgICAgY2FzZSAkYXJnIGluCi0gICAgICAtbykKLQlpZiB0ZXN0ICIkdXNlcl90YXJnZXQiICE9ICJubyI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBjYW5ub3Qgc3BlY2lmeSBcYC1vJyBtb3JlIHRoYW4gb25jZSIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQl1c2VyX3RhcmdldD1uZXh0Ci0JOzsKLQotICAgICAgLXN0YXRpYykKLQlidWlsZF9vbGRfbGlicz15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1wcmVmZXItcGljKQotCXBpY19tb2RlPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXByZWZlci1ub24tcGljKQotCXBpY19tb2RlPW5vCi0JY29udGludWUKLQk7OwotCi0gICAgICAtWGNvbXBpbGVyKQotCXByZXY9eGNvbXBpbGVyCi0JY29udGludWUKLQk7OwotCi0gICAgICAtV2MsKikKLQlhcmdzPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgInMvXi1XYywvLyJgCi0JbGFzdGFyZz0KLQlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKLQlmb3IgYXJnIGluICRhcmdzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0KLQkgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLQkgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5Ci0JICAjIGluIHNjYW4gc2V0cywgc28gd2Ugc3BlY2lmeSBpdCBzZXBhcmF0ZWx5LgotCSAgY2FzZSAkYXJnIGluCi0JICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCSAgICBhcmc9IlwiJGFyZ1wiIgotCSAgICA7OwotCSAgZXNhYwotCSAgbGFzdGFyZz0iJGxhc3RhcmcgJGFyZyIKLQlkb25lCi0JSUZTPSIkc2F2ZV9pZnMiCi0JbGFzdGFyZz1gJGVjaG8gIlgkbGFzdGFyZyIgfCAkWHNlZCAtZSAicy9eIC8vImAKLQotCSMgQWRkIHRoZSBhcmd1bWVudHMgdG8gYmFzZV9jb21waWxlLgotCWlmIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiOyB0aGVuCi0JICBiYXNlX2NvbXBpbGU9IiRsYXN0YXJnIgotCWVsc2UKLQkgIGJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKLQlmaQotCWNvbnRpbnVlCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgY2FzZSAkdXNlcl90YXJnZXQgaW4KLSAgICAgIG5leHQpCi0JIyBUaGUgbmV4dCBvbmUgaXMgdGhlIC1vIHRhcmdldCBuYW1lCi0JdXNlcl90YXJnZXQ9eWVzCi0JY29udGludWUKLQk7OwotICAgICAgeWVzKQotCSMgV2UgZ290IHRoZSBvdXRwdXQgZmlsZQotCXVzZXJfdGFyZ2V0PXNldAotCWxpYm9iaj0iJGFyZyIKLQljb250aW51ZQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgQWNjZXB0IHRoZSBjdXJyZW50IGFyZ3VtZW50IGFzIHRoZSBzb3VyY2UgZmlsZS4KLSAgICAgIGxhc3Rhcmc9IiRzcmNmaWxlIgotICAgICAgc3JjZmlsZT0iJGFyZyIKLQotICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBwcmV2aW91cyBhcmd1bWVudC4KLQotICAgICAgIyBCYWNrc2xhc2hpZnkgYW55IGJhY2tzbGFzaGVzLCBkb3VibGUgcXVvdGVzLCBhbmQgZG9sbGFyIHNpZ25zLgotICAgICAgIyBUaGVzZSBhcmUgdGhlIG9ubHkgY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBzcGVjaWFsbHkKLSAgICAgICMgaW50ZXJwcmV0ZWQgaW5zaWRlIG9mIGRvdWJsZS1xdW90ZWQgc2NyaW5ncy4KLSAgICAgIGxhc3Rhcmc9YCRlY2hvICJYJGxhc3RhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCi0gICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi0gICAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseQotICAgICAgIyBpbiBzY2FuIHNldHMsIHNvIHdlIHNwZWNpZnkgaXQgc2VwYXJhdGVseS4KLSAgICAgIGNhc2UgJGxhc3RhcmcgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCWxhc3Rhcmc9IlwiJGxhc3RhcmdcIiIKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEFkZCB0aGUgcHJldmlvdXMgYXJndW1lbnQgdG8gYmFzZV9jb21waWxlLgotICAgICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KLQliYXNlX2NvbXBpbGU9IiRsYXN0YXJnIgotICAgICAgZWxzZQotCWJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgY2FzZSAkdXNlcl90YXJnZXQgaW4KLSAgICBzZXQpCi0gICAgICA7OwotICAgIG5vKQotICAgICAgIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0LgotICAgICAgbGlib2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0gICAgICA7OwotICAgICopCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgdGFyZ2V0IHdpdGggXGAtbyciIDE+JjIKLSAgICAgIGV4aXQgMQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFJlY29nbml6ZSBzZXZlcmFsIGRpZmZlcmVudCBmaWxlIHN1ZmZpeGVzLgotICAgICMgSWYgdGhlIHVzZXIgc3BlY2lmaWVzIC1vIGZpbGUubywgaXQgaXMgcmVwbGFjZWQgd2l0aCBmaWxlLmxvCi0gICAgeGZvcm09J1tjQ0ZTZm1zb10nCi0gICAgY2FzZSAkbGlib2JqIGluCi0gICAgKi5hZGEpIHhmb3JtPWFkYSA7OwotICAgICouYWRiKSB4Zm9ybT1hZGIgOzsKLSAgICAqLmFkcykgeGZvcm09YWRzIDs7Ci0gICAgKi5hc20pIHhmb3JtPWFzbSA7OwotICAgICouYysrKSB4Zm9ybT1jKysgOzsKLSAgICAqLmNjKSB4Zm9ybT1jYyA7OwotICAgICouY3BwKSB4Zm9ybT1jcHAgOzsKLSAgICAqLmN4eCkgeGZvcm09Y3h4IDs7Ci0gICAgKi5mOTApIHhmb3JtPWY5MCA7OwotICAgICouZm9yKSB4Zm9ybT1mb3IgOzsKLSAgICBlc2FjCi0KLSAgICBsaWJvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAicy9cLiR4Zm9ybSQvLmxvLyJgCi0KLSAgICBjYXNlICRsaWJvYmogaW4KLSAgICAqLmxvKSBvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAiJGxvMm8iYCA7OwotICAgICopCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZGV0ZXJtaW5lIG5hbWUgb2YgbGlicmFyeSBvYmplY3QgZnJvbSBcYCRsaWJvYmonIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBjb21waWxhdGlvbiBjb21tYW5kIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICAjIERlbGV0ZSBhbnkgbGVmdG92ZXIgbGlicmFyeSBvYmplY3RzLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIHJlbW92ZWxpc3Q9IiRvYmogJGxpYm9iaiIKLSAgICBlbHNlCi0gICAgICByZW1vdmVsaXN0PSIkbGlib2JqIgotICAgIGZpCi0KLSAgICAkcnVuICRybSAkcmVtb3ZlbGlzdAotICAgIHRyYXAgIiRydW4gJHJtICRyZW1vdmVsaXN0OyBleGl0IDEiIDEgMiAxNQotCi0gICAgIyBPbiBDeWd3aW4gdGhlcmUncyBubyAicmVhbCIgUElDIGZsYWcgc28gd2UgbXVzdCBidWlsZCBib3RoIG9iamVjdCB0eXBlcwotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBvczIqKQotICAgICAgcGljX21vZGU9ZGVmYXVsdAotICAgICAgOzsKLSAgICBlc2FjCi0gICAgaWYgdGVzdCAiJHBpY19tb2RlIiA9IG5vICYmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KLSAgICAgICMgbm9uLVBJQyBjb2RlIGluIHNoYXJlZCBsaWJyYXJpZXMgaXMgbm90IHN1cHBvcnRlZAotICAgICAgcGljX21vZGU9ZGVmYXVsdAotICAgIGZpCi0KLSAgICAjIENhbGN1bGF0ZSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBvYmplY3QgaWYgY29tcGlsZXIgZG9lcwotICAgICMgbm90IHN1cHBvcnQgLW8gd2l0aCAtYwotICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0gbm87IHRoZW4KLSAgICAgIG91dHB1dF9vYmo9YCRlY2hvICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJyAtZSAncyVcLlteLl0qJCUlJ2AuJHtvYmpleHR9Ci0gICAgICBsb2NrZmlsZT0iJG91dHB1dF9vYmoubG9jayIKLSAgICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRvdXRwdXRfb2JqICRsb2NrZmlsZSIKLSAgICAgIHRyYXAgIiRydW4gJHJtICRyZW1vdmVsaXN0OyBleGl0IDEiIDEgMiAxNQotICAgIGVsc2UKLSAgICAgIG5lZWRfbG9ja3M9bm8KLSAgICAgIGxvY2tmaWxlPQotICAgIGZpCi0KLSAgICAjIExvY2sgdGhpcyBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IGlzIG5lZWRlZAotICAgICMgV2UgdXNlIHRoaXMgc2NyaXB0IGZpbGUgdG8gbWFrZSB0aGUgbGluaywgaXQgYXZvaWRzIGNyZWF0aW5nIGEgbmV3IGZpbGUKLSAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB5ZXM7IHRoZW4KLSAgICAgIHVudGlsICRydW4gbG4gIiQwIiAiJGxvY2tmaWxlIiAyPi9kZXYvbnVsbDsgZG8KLQkkc2hvdyAiV2FpdGluZyBmb3IgJGxvY2tmaWxlIHRvIGJlIHJlbW92ZWQiCi0Jc2xlZXAgMgotICAgICAgZG9uZQotICAgIGVsaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybjsgdGhlbgotICAgICAgaWYgdGVzdCAtZiAiJGxvY2tmaWxlIjsgdGhlbgotCWVjaG8gIlwKLSoqKiBFUlJPUiwgJGxvY2tmaWxlIGV4aXN0cyBhbmQgY29udGFpbnM6Ci1gY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKLQotVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQotdGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoteW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQotcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgotYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKLWNvbXBpbGVyLiIKLQotCSRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAxCi0gICAgICBmaQotICAgICAgZWNobyAkc3JjZmlsZSA+ICIkbG9ja2ZpbGUiCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRmaXhfc3JjZmlsZV9wYXRoIjsgdGhlbgotICAgICAgZXZhbCBzcmNmaWxlPVwiJGZpeF9zcmNmaWxlX3BhdGhcIgotICAgIGZpCi0KLSAgICAjIE9ubHkgYnVpbGQgYSBQSUMgb2JqZWN0IGlmIHdlIGFyZSBidWlsZGluZyBsaWJ0b29sIGxpYnJhcmllcy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgIyBXaXRob3V0IHRoaXMgYXNzaWdubWVudCwgYmFzZV9jb21waWxlIGdldHMgZW1wdGllZC4KLSAgICAgIGZic2RfaGlkZW91c19zaF9idWc9JGJhc2VfY29tcGlsZQotCi0gICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IG5vOyB0aGVuCi0JIyBBbGwgcGxhdGZvcm1zIHVzZSAtRFBJQywgdG8gbm90aWZ5IHByZXByb2Nlc3NlZCBhc3NlbWJsZXIgY29kZS4KLQljb21tYW5kPSIkYmFzZV9jb21waWxlICRzcmNmaWxlICRwaWNfZmxhZyAtRFBJQyIKLSAgICAgIGVsc2UKLQkjIERvbid0IGJ1aWxkIFBJQyBjb2RlCi0JY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkc3JjZmlsZSIKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JbG9fbGlib2JqPSIkbGlib2JqIgotCWRpcj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JaWYgdGVzdCAiWCRkaXIiID0gIlgkbGlib2JqIjsgdGhlbgotCSAgZGlyPSIkb2JqZGlyIgotCWVsc2UKLQkgIGRpcj0iJGRpci8kb2JqZGlyIgotCWZpCi0JbGlib2JqPSIkZGlyLyJgJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLQlpZiB0ZXN0IC1kICIkZGlyIjsgdGhlbgotCSAgJHNob3cgIiRybSAkbGlib2JqIgotCSAgJHJ1biAkcm0gJGxpYm9iagotCWVsc2UKLQkgICRzaG93ICIkbWtkaXIgJGRpciIKLQkgICRydW4gJG1rZGlyICRkaXIKLQkgIHN0YXR1cz0kPwotCSAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAkZGlyOyB0aGVuCi0JICAgIGV4aXQgJHN0YXR1cwotCSAgZmkKLQlmaQotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiRjb21waWxlcl9vX2xvIiA9IHllczsgdGhlbgotCW91dHB1dF9vYmo9IiRsaWJvYmoiCi0JY29tbWFuZD0iJGNvbW1hbmQgLW8gJG91dHB1dF9vYmoiCi0gICAgICBlbGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0geWVzOyB0aGVuCi0Jb3V0cHV0X29iaj0iJG9iaiIKLQljb21tYW5kPSIkY29tbWFuZCAtbyAkb3V0cHV0X29iaiIKLSAgICAgIGZpCi0KLSAgICAgICRydW4gJHJtICIkb3V0cHV0X29iaiIKLSAgICAgICRzaG93ICIkY29tbWFuZCIKLSAgICAgIGlmICRydW4gZXZhbCAiJGNvbW1hbmQiOyB0aGVuIDoKLSAgICAgIGVsc2UKLQl0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKLQkgdGVzdCB4ImBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0geCIkc3JjZmlsZSI7IHRoZW4KLQllY2hvICJcCi0qKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKLWBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAotCi1idXQgaXQgc2hvdWxkIGNvbnRhaW46Ci0kc3JjZmlsZQotCi1UaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCi15b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91Ci1yZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCi1hdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgotY29tcGlsZXIuIgotCi0JJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkLCB0aGVuIGdvIG9uIHRvIGNvbXBpbGUgdGhlIG5leHQgb25lCi0gICAgICBpZiB0ZXN0IHgiJG91dHB1dF9vYmoiICE9IHgiJGxpYm9iaiI7IHRoZW4KLQkkc2hvdyAiJG12ICRvdXRwdXRfb2JqICRsaWJvYmoiCi0JaWYgJHJ1biAkbXYgJG91dHB1dF9vYmogJGxpYm9iajsgdGhlbiA6Ci0JZWxzZQotCSAgZXJyb3I9JD8KLQkgICRydW4gJHJtICRyZW1vdmVsaXN0Ci0JICBleGl0ICRlcnJvcgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIElmIHdlIGhhdmUgbm8gcGljX2ZsYWcsIHRoZW4gY29weSB0aGUgb2JqZWN0IGludG8gcGxhY2UgYW5kIGZpbmlzaC4KLSAgICAgIGlmICh0ZXN0IC16ICIkcGljX2ZsYWciIHx8IHRlc3QgIiRwaWNfbW9kZSIgIT0gZGVmYXVsdCkgJiYKLQkgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCSMgUmVuYW1lIHRoZSAubG8gZnJvbSB3aXRoaW4gb2JqZGlyIHRvIG9iagotCWlmIHRlc3QgLWYgJG9iajsgdGhlbgotCSAgJHNob3cgJHJtICRvYmoKLQkgICRydW4gJHJtICRvYmoKLQlmaQotCi0JJHNob3cgIiRtdiAkbGlib2JqICRvYmoiCi0JaWYgJHJ1biAkbXYgJGxpYm9iaiAkb2JqOyB0aGVuIDoKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLQotCXhkaXI9YCRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCWlmIHRlc3QgIlgkeGRpciIgPSAiWCRvYmoiOyB0aGVuCi0JICB4ZGlyPSIuIgotCWVsc2UKLQkgIHhkaXI9IiR4ZGlyIgotCWZpCi0JYmFzZW9iaj1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICJzJS4qLyUlImAKLQlsaWJvYmo9YCRlY2hvICJYJGJhc2VvYmoiIHwgJFhzZWQgLWUgIiRvMmxvImAKLQkjIE5vdyBhcnJhbmdlIHRoYXQgb2JqIGFuZCBsb19saWJvYmogYmVjb21lIHRoZSBzYW1lIGZpbGUKLQkkc2hvdyAiKGNkICR4ZGlyICYmICRMTl9TICRiYXNlb2JqICRsaWJvYmopIgotCWlmICRydW4gZXZhbCAnKGNkICR4ZGlyICYmICRMTl9TICRiYXNlb2JqICRsaWJvYmopJzsgdGhlbgotCSAgIyBVbmxvY2sgdGhlIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgd2FzIGxvY2tlZAotCSAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCi0JICAgICRydW4gJHJtICIkbG9ja2ZpbGUiCi0JICBmaQotCSAgZXhpdCAwCi0JZWxzZQotCSAgZXJyb3I9JD8KLQkgICRydW4gJHJtICRyZW1vdmVsaXN0Ci0JICBleGl0ICRlcnJvcgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIEFsbG93IGVycm9yIG1lc3NhZ2VzIG9ubHkgZnJvbSB0aGUgZmlyc3QgY29tcGlsYXRpb24uCi0gICAgICBzdXBwcmVzc19vdXRwdXQ9JyA+L2Rldi9udWxsIDI+JjEnCi0gICAgZmkKLQotICAgICMgT25seSBidWlsZCBhIHBvc2l0aW9uLWRlcGVuZGVudCBvYmplY3QgaWYgd2UgYnVpbGQgb2xkIGxpYnJhcmllcy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IHllczsgdGhlbgotCSMgRG9uJ3QgYnVpbGQgUElDIGNvZGUKLQljb21tYW5kPSIkYmFzZV9jb21waWxlICRzcmNmaWxlIgotICAgICAgZWxzZQotCSMgQWxsIHBsYXRmb3JtcyB1c2UgLURQSUMsIHRvIG5vdGlmeSBwcmVwcm9jZXNzZWQgYXNzZW1ibGVyIGNvZGUuCi0JY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkc3JjZmlsZSAkcGljX2ZsYWcgLURQSUMiCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSB5ZXM7IHRoZW4KLQljb21tYW5kPSIkY29tbWFuZCAtbyAkb2JqIgotCW91dHB1dF9vYmo9IiRvYmoiCi0gICAgICBmaQotCi0gICAgICAjIFN1cHByZXNzIGNvbXBpbGVyIG91dHB1dCBpZiB3ZSBhbHJlYWR5IGRpZCBhIFBJQyBjb21waWxhdGlvbi4KLSAgICAgIGNvbW1hbmQ9IiRjb21tYW5kJHN1cHByZXNzX291dHB1dCIKLSAgICAgICRydW4gJHJtICIkb3V0cHV0X29iaiIKLSAgICAgICRzaG93ICIkY29tbWFuZCIKLSAgICAgIGlmICRydW4gZXZhbCAiJGNvbW1hbmQiOyB0aGVuIDoKLSAgICAgIGVsc2UKLQkkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgotCSB0ZXN0IHgiYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSB4IiRzcmNmaWxlIjsgdGhlbgotCWVjaG8gIlwKLSoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgotYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCi0KLWJ1dCBpdCBzaG91bGQgY29udGFpbjoKLSRzcmNmaWxlCi0KLVRoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKLXRlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKLXlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKLXJlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKLWF2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCi1jb21waWxlci4iCi0KLQkkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQKLSAgICAgIGlmIHRlc3QgeCIkb3V0cHV0X29iaiIgIT0geCIkb2JqIjsgdGhlbgotCSRzaG93ICIkbXYgJG91dHB1dF9vYmogJG9iaiIKLQlpZiAkcnVuICRtdiAkb3V0cHV0X29iaiAkb2JqOyB0aGVuIDoKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvIG5vdAotICAgICAgIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgotCSRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCi0JJHJ1biBldmFsICJlY2hvIHRpbWVzdGFtcCA+IFwkbGlib2JqIiB8fCBleGl0ICQ/Ci0gICAgICBlbHNlCi0JIyBNb3ZlIHRoZSAubG8gZnJvbSB3aXRoaW4gb2JqZGlyCi0JJHNob3cgIiRtdiAkbGlib2JqICRsb19saWJvYmoiCi0JaWYgJHJ1biAkbXYgJGxpYm9iaiAkbG9fbGlib2JqOyB0aGVuIDoKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLSAgICAgIGZpCi0gICAgZmkKLQotICAgICMgVW5sb2NrIHRoZSBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IHdhcyBsb2NrZWQKLSAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KLSAgICAgICRydW4gJHJtICIkbG9ja2ZpbGUiCi0gICAgZmkKLQotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGxpbmsgbW9kZQotICBsaW5rIHwgcmVsaW5rKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGxpbmsiCi0gICAgY2FzZSAkaG9zdCBpbgotICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQotICAgICAgIyBJdCBpcyBpbXBvc3NpYmxlIHRvIGxpbmsgYSBkbGwgd2l0aG91dCB0aGlzIHNldHRpbmcsIGFuZAotICAgICAgIyB3ZSBzaG91bGRuJ3QgZm9yY2UgdGhlIG1ha2VmaWxlIG1haW50YWluZXIgdG8gZmlndXJlIG91dAotICAgICAgIyB3aGljaCBzeXN0ZW0gd2UgYXJlIGNvbXBpbGluZyBmb3IgaW4gb3JkZXIgdG8gcGFzcyBhbiBleHRyYQotICAgICAgIyBmbGFnIGZvciBldmVyeSBsaWJ0b29sIGludm9rYXRpb24uCi0gICAgICAjIGFsbG93X3VuZGVmaW5lZD1ubwotCi0gICAgICAjIEZJWE1FOiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgYWJvdmUgd2hlbiB0cnlpbmcKLSAgICAgICMgdG8gbWFrZSBhIGRsbCB3aGljaCBoYXMgdW5kZWZpbmVkIHN5bWJvbHMsIGluIHdoaWNoIGNhc2Ugbm90Ci0gICAgICAjIGV2ZW4gYSBzdGF0aWMgbGlicmFyeSBpcyBidWlsdC4gIEZvciBub3csIHdlIG5lZWQgdG8gc3BlY2lmeQotICAgICAgIyAtbm8tdW5kZWZpbmVkIG9uIHRoZSBsaWJ0b29sIGxpbmsgbGluZSB3aGVuIHdlIGNhbiBiZSBjZXJ0YWluCi0gICAgICAjIHRoYXQgYWxsIHN5bWJvbHMgYXJlIHNhdGlzZmllZCwgb3RoZXJ3aXNlIHdlIGdldCBhIHN0YXRpYyBsaWJyYXJ5LgotICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcwotICAgICAgOzsKLSAgICAqKQotICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgbGlidG9vbF9hcmdzPSIkbm9ub3B0IgotICAgIGNvbXBpbGVfY29tbWFuZD0iJG5vbm9wdCIKLSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkbm9ub3B0IgotCi0gICAgY29tcGlsZV9ycGF0aD0KLSAgICBmaW5hbGl6ZV9ycGF0aD0KLSAgICBjb21waWxlX3NobGlicGF0aD0KLSAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9Ci0gICAgY29udmVuaWVuY2U9Ci0gICAgb2xkX2NvbnZlbmllbmNlPQotICAgIGRlcGxpYnM9Ci0gICAgb2xkX2RlcGxpYnM9Ci0gICAgY29tcGlsZXJfZmxhZ3M9Ci0gICAgbGlua2VyX2ZsYWdzPQotICAgIGRsbHNlYXJjaHBhdGg9Ci0gICAgbGliX3NlYXJjaF9wYXRoPWBwd2RgCi0KLSAgICBhdm9pZF92ZXJzaW9uPW5vCi0gICAgZGxmaWxlcz0KLSAgICBkbHByZWZpbGVzPQotICAgIGRsc2VsZj1ubwotICAgIGV4cG9ydF9keW5hbWljPW5vCi0gICAgZXhwb3J0X3N5bWJvbHM9Ci0gICAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9Ci0gICAgZ2VuZXJhdGVkPQotICAgIGxpYm9ianM9Ci0gICAgbHRsaWJzPQotICAgIG1vZHVsZT1ubwotICAgIG5vX2luc3RhbGw9bm8KLSAgICBvYmpzPQotICAgIHByZWZlcl9zdGF0aWNfbGlicz1ubwotICAgIHByZWxvYWQ9bm8KLSAgICBwcmV2PQotICAgIHByZXZhcmc9Ci0gICAgcmVsZWFzZT0KLSAgICBycGF0aD0KLSAgICB4cnBhdGg9Ci0gICAgcGVybV9ycGF0aD0KLSAgICB0ZW1wX3JwYXRoPQotICAgIHRocmVhZF9zYWZlPW5vCi0gICAgdmluZm89Ci0KLSAgICAjIFdlIG5lZWQgdG8ga25vdyAtc3RhdGljLCB0byBnZXQgdGhlIHJpZ2h0IG91dHB1dCBmaWxlbmFtZXMuCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgIC1hbGwtc3RhdGljIHwgLXN0YXRpYykKLQlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1hbGwtc3RhdGljIjsgdGhlbgotCSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNvbXBsZXRlIHN0YXRpYyBsaW5raW5nIGlzIGltcG9zc2libGUgaW4gdGhpcyBjb25maWd1cmF0aW9uIiAxPiYyCi0JICBmaQotCSAgaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKLQkgIGZpCi0JZWxzZQotCSAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLQkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYwotCSAgZmkKLQlmaQotCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCWJ1aWxkX29sZF9saWJzPXllcwotCXByZWZlcl9zdGF0aWNfbGlicz15ZXMKLQlicmVhawotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBTZWUgaWYgb3VyIHNoYXJlZCBhcmNoaXZlcyBkZXBlbmQgb24gc3RhdGljIGFyY2hpdmVzLgotICAgIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiBidWlsZF9vbGRfbGlicz15ZXMKLQotICAgICMgR28gdGhyb3VnaCB0aGUgYXJndW1lbnRzLCB0cmFuc2Zvcm1pbmcgdGhlbSBvbiB0aGUgd2F5LgotICAgIHdoaWxlIHRlc3QgJCMgLWd0IDA7IGRvCi0gICAgICBhcmc9IiQxIgotICAgICAgc2hpZnQKLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JcWFyZz1cImAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYFwiICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAotCTs7Ci0gICAgICAqKSBxYXJnPSRhcmcgOzsKLSAgICAgIGVzYWMKLSAgICAgIGxpYnRvb2xfYXJncz0iJGxpYnRvb2xfYXJncyAkcWFyZyIKLQotICAgICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gICAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLQljYXNlICRwcmV2IGluCi0Jb3V0cHV0KQotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIEBPVVRQVVRAIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgQE9VVFBVVEAiCi0JICA7OwotCWVzYWMKLQotCWNhc2UgJHByZXYgaW4KLQlkbGZpbGVzfGRscHJlZmlsZXMpCi0JICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSBubzsgdGhlbgotCSAgICAjIEFkZCB0aGUgc3ltYm9sIG9iamVjdCBpbnRvIHRoZSBsaW5raW5nIGNvbW1hbmRzLgotCSAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQFNZTUZJTEVAIgotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAU1lNRklMRUAiCi0JICAgIHByZWxvYWQ9eWVzCi0JICBmaQotCSAgY2FzZSAkYXJnIGluCi0JICAqLmxhIHwgKi5sbykgOzsgICMgV2UgaGFuZGxlIHRoZXNlIGNhc2VzIGJlbG93LgotCSAgZm9yY2UpCi0JICAgIGlmIHRlc3QgIiRkbHNlbGYiID0gbm87IHRoZW4KLQkgICAgICBkbHNlbGY9bmVlZGxlc3MKLQkgICAgICBleHBvcnRfZHluYW1pYz15ZXMKLQkgICAgZmkKLQkgICAgcHJldj0KLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgIHNlbGYpCi0JICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KLQkgICAgICBkbHNlbGY9eWVzCi0JICAgIGVsaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlcyAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiICE9IHllczsgdGhlbgotCSAgICAgIGRsc2VsZj15ZXMKLQkgICAgZWxzZQotCSAgICAgIGRsc2VsZj1uZWVkbGVzcwotCSAgICAgIGV4cG9ydF9keW5hbWljPXllcwotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgKikKLQkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0JICAgIGVsc2UKLQkgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkYXJnIgotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQlleHBzeW1zKQotCSAgZXhwb3J0X3N5bWJvbHM9IiRhcmciCi0JICBpZiB0ZXN0ICEgLWYgIiRhcmciOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHN5bWJvbCBmaWxlIFxgJGFyZycgZG9lcyBub3QgZXhpc3QiCi0JICAgIGV4aXQgMQotCSAgZmkKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlleHBzeW1zX3JlZ2V4KQotCSAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9IiRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JcmVsZWFzZSkKLQkgIHJlbGVhc2U9Ii0kYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXJwYXRoIHwgeHJwYXRoKQotCSAgIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JICBjYXNlICRhcmcgaW4KLQkgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKLQkgICopCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IG9ubHkgYWJzb2x1dGUgcnVuLXBhdGhzIGFyZSBhbGxvd2VkIiAxPiYyCi0JICAgIGV4aXQgMQotCSAgICA7OwotCSAgZXNhYwotCSAgaWYgdGVzdCAiJHByZXYiID0gcnBhdGg7IHRoZW4KLQkgICAgY2FzZSAiJHJwYXRoICIgaW4KLQkgICAgKiIgJGFyZyAiKikgOzsKLQkgICAgKikgcnBhdGg9IiRycGF0aCAkYXJnIiA7OwotCSAgICBlc2FjCi0JICBlbHNlCi0JICAgIGNhc2UgIiR4cnBhdGggIiBpbgotCSAgICAqIiAkYXJnICIqKSA7OwotCSAgICAqKSB4cnBhdGg9IiR4cnBhdGggJGFyZyIgOzsKLQkgICAgZXNhYwotCSAgZmkKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQl4Y29tcGlsZXIpCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRxYXJnIgotCSAgcHJldj0KLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkcWFyZyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRxYXJnIgotCSAgY29udGludWUKLQkgIDs7Ci0JeGxpbmtlcikKLQkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkcWFyZyIKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHdsJHFhcmciCi0JICBwcmV2PQotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICR3bCRxYXJnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJHdsJHFhcmciCi0JICBjb250aW51ZQotCSAgOzsKLQkqKQotCSAgZXZhbCAiJHByZXY9XCJcJGFyZ1wiIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCWVzYWMKLSAgICAgIGZpICMgdGVzdCAtbiAkcHJldgotCi0gICAgICBwcmV2YXJnPSIkYXJnIgotCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgIC1hbGwtc3RhdGljKQotCWlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1hbGxvdy11bmRlZmluZWQpCi0JIyBGSVhNRTogcmVtb3ZlIHRoaXMgZmxhZyBzb21ldGltZSBpbiB0aGUgZnV0dXJlLgotCSRlY2hvICIkbW9kZW5hbWU6IFxgLWFsbG93LXVuZGVmaW5lZCcgaXMgZGVwcmVjYXRlZCBiZWNhdXNlIGl0IGlzIHRoZSBkZWZhdWx0IiAxPiYyCi0JY29udGludWUKLQk7OwotCi0gICAgICAtYXZvaWQtdmVyc2lvbikKLQlhdm9pZF92ZXJzaW9uPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWRsb3BlbikKLQlwcmV2PWRsZmlsZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1kbHByZW9wZW4pCi0JcHJldj1kbHByZWZpbGVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZXhwb3J0LWR5bmFtaWMpCi0JZXhwb3J0X2R5bmFtaWM9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZXhwb3J0LXN5bWJvbHMgfCAtZXhwb3J0LXN5bWJvbHMtcmVnZXgpCi0JaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBtb3JlIHRoYW4gb25lIC1leHBvcnRlZC1zeW1ib2xzIGFyZ3VtZW50IGlzIG5vdCBhbGxvd2VkIgotCSAgZXhpdCAxCi0JZmkKLQlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1leHBvcnQtc3ltYm9scyI7IHRoZW4KLQkgIHByZXY9ZXhwc3ltcwotCWVsc2UKLQkgIHByZXY9ZXhwc3ltc19yZWdleAotCWZpCi0JY29udGludWUKLQk7OwotCi0gICAgICAjIFRoZSBuYXRpdmUgSVJJWCBsaW5rZXIgdW5kZXJzdGFuZHMgLUxBTkc6KiwgLUxJU1Q6KiBhbmQgLUxOTzoqCi0gICAgICAjIHNvLCBpZiB3ZSBzZWUgdGhlc2UgZmxhZ3MgYmUgY2FyZWZ1bCBub3QgdG8gdHJlYXQgdGhlbSBsaWtlIC1MCi0gICAgICAtTFtBLVpdW0EtWl0qOiopCi0JY2FzZSAkd2l0aF9nY2MvJGhvc3QgaW4KLQluby8qLSotaXJpeCogfCBuby8qLSotbm9uc3RvcHV4KikKLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLQkgIDs7Ci0JZXNhYwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLUwqKQotCWRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL14tTC8vJ2AKLQkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLQljYXNlICRkaXIgaW4KLQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7Ci0JKikKLQkgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKLQkgIGlmIHRlc3QgLXogIiRhYnNkaXIiOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIgMT4mMgotCSAgICBleGl0IDEKLQkgIGZpCi0JICBkaXI9IiRhYnNkaXIiCi0JICA7OwotCWVzYWMKLQljYXNlICIkZGVwbGlicyAiIGluCi0JKiIgLUwkZGlyICIqKSA7OwotCSopCi0JICBkZXBsaWJzPSIkZGVwbGlicyAtTCRkaXIiCi0JICBsaWJfc2VhcmNoX3BhdGg9IiRsaWJfc2VhcmNoX3BhdGggJGRpciIKLQkgIDs7Ci0JZXNhYwotCWNhc2UgJGhvc3QgaW4KLQkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKikKLQkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgotCSAgKiI6JGRpcjoiKikgOzsKLQkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRkaXIiOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXNhYwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWwqKQotCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiB8fCB0ZXN0ICJYJGFyZyIgPSAiWC1sbSI7IHRoZW4KLQkgIGNhc2UgJGhvc3QgaW4KLQkgICotKi1jeWd3aW4qIHwgKi0qLXB3MzIqIHwgKi0qLWJlb3MqKQotCSAgICAjIFRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIEMgb3IgbWF0aCBsaWJyYXJ5IChhcyBzdWNoKQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgKi0qLW1pbmd3KiB8ICotKi1vczIqKQotCSAgICAjIFRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIEMgbGlicmFyeSAoYXMgc3VjaCkKLQkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCi0JICAgIDs7Ci0JICAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCopCi0JICAgICMgRG8gbm90IGluY2x1ZGUgbGliYyBkdWUgdG8gdXMgaGF2aW5nIGxpYmMvbGliY19yLgotCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKLQkgICAgOzsKLQkgIGVzYWMKLQkgZWxpZiB0ZXN0ICJYJGFyZyIgPSAiWC1sY19yIjsgdGhlbgotCSAgY2FzZSAkaG9zdCBpbgotCSAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCopCi0JICAgICMgRG8gbm90IGluY2x1ZGUgbGliY19yIGRpcmVjdGx5LCB1c2UgLXB0aHJlYWQgZmxhZy4KLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgIGVzYWMKLQlmaQotCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbW9kdWxlKQotCW1vZHVsZT15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1uby1mYXN0LWluc3RhbGwpCi0JZmFzdF9pbnN0YWxsPW5vCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbm8taW5zdGFsbCkKLQljYXNlICRob3N0IGluCi0JKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiopCi0JICAjIFRoZSBQQVRIIGhhY2tlcnkgaW4gd3JhcHBlciBzY3JpcHRzIGlzIHJlcXVpcmVkIG9uIFdpbmRvd3MKLQkgICMgaW4gb3JkZXIgZm9yIHRoZSBsb2FkZXIgdG8gZmluZCBhbnkgZGxscyBpdCBuZWVkcy4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLW5vLWluc3RhbGwnIGlzIGlnbm9yZWQgZm9yICRob3N0IiAxPiYyCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBhc3N1bWluZyBcYC1uby1mYXN0LWluc3RhbGwnIGluc3RlYWQiIDE+JjIKLQkgIGZhc3RfaW5zdGFsbD1ubwotCSAgOzsKLQkqKSBub19pbnN0YWxsPXllcyA7OwotCWVzYWMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1uby11bmRlZmluZWQpCi0JYWxsb3dfdW5kZWZpbmVkPW5vCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbykgcHJldj1vdXRwdXQgOzsKLQotICAgICAgLXJlbGVhc2UpCi0JcHJldj1yZWxlYXNlCi0JY29udGludWUKLQk7OwotCi0gICAgICAtcnBhdGgpCi0JcHJldj1ycGF0aAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVIpCi0JcHJldj14cnBhdGgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1SKikKLQlkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9eLVIvLydgCi0JIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JY2FzZSAkZGlyIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLQljYXNlICIkeHJwYXRoICIgaW4KLQkqIiAkZGlyICIqKSA7OwotCSopIHhycGF0aD0iJHhycGF0aCAkZGlyIiA7OwotCWVzYWMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1zdGF0aWMpCi0JIyBUaGUgZWZmZWN0cyBvZiAtc3RhdGljIGFyZSBkZWZpbmVkIGluIGEgcHJldmlvdXMgbG9vcC4KLQkjIFdlIHVzZWQgdG8gZG8gdGhlIHNhbWUgYXMgLWFsbC1zdGF0aWMgb24gcGxhdGZvcm1zIHRoYXQKLQkjIGRpZG4ndCBoYXZlIGEgUElDIGZsYWcsIGJ1dCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBlZmZlY3RzCi0JIyB3b3VsZCBiZSBlcXVpdmFsZW50IHdhcyB3cm9uZy4gIEl0IHdvdWxkIGJyZWFrIG9uIGF0IGxlYXN0Ci0JIyBEaWdpdGFsIFVuaXggYW5kIEFJWC4KLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC10aHJlYWQtc2FmZSkKLQl0aHJlYWRfc2FmZT15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC12ZXJzaW9uLWluZm8pCi0JcHJldj12aW5mbwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVdjLCopCi0JYXJncz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0IiAtZSAncy9eLVdjLC8vJ2AKLQlhcmc9Ci0Jc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCi0JZm9yIGZsYWcgaW4gJGFyZ3M7IGRvCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgIGNhc2UgJGZsYWcgaW4KLQkgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JICAgIGZsYWc9IlwiJGZsYWdcIiIKLQkgICAgOzsKLQkgIGVzYWMKLQkgIGFyZz0iJGFyZyAkd2wkZmxhZyIKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGZsYWciCi0JZG9uZQotCUlGUz0iJHNhdmVfaWZzIgotCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICJzL14gLy8iYAotCTs7Ci0KLSAgICAgIC1XbCwqKQotCWFyZ3M9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCIgLWUgJ3MvXi1XbCwvLydgCi0JYXJnPQotCXNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJwotCWZvciBmbGFnIGluICRhcmdzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JICBjYXNlICRmbGFnIGluCi0JICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCSAgICBmbGFnPSJcIiRmbGFnXCIiCi0JICAgIDs7Ci0JICBlc2FjCi0JICBhcmc9IiRhcmcgJHdsJGZsYWciCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICR3bCRmbGFnIgotCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRmbGFnIgotCWRvbmUKLQlJRlM9IiRzYXZlX2lmcyIKLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAicy9eIC8vImAKLQk7OwotCi0gICAgICAtWGNvbXBpbGVyKQotCXByZXY9eGNvbXBpbGVyCi0JY29udGludWUKLQk7OwotCi0gICAgICAtWGxpbmtlcikKLQlwcmV2PXhsaW5rZXIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBmbGFnLgotICAgICAgLSogfCArKikKLQkjIFVua25vd24gYXJndW1lbnRzIGluIGJvdGggZmluYWxpemVfY29tbWFuZCBhbmQgY29tcGlsZV9jb21tYW5kIG5lZWQKLQkjIHRvIGJlIGFlc3RoZXRpY2FsbHkgcXVvdGVkIGJlY2F1c2UgdGhleSBhcmUgZXZhbGVkIGxhdGVyLgotCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQljYXNlICRhcmcgaW4KLQkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQkgIGFyZz0iXCIkYXJnXCIiCi0JICA7OwotCWVzYWMKLQk7OwotCi0gICAgICAqLmxvIHwgKi4kb2JqZXh0KQotCSMgQSBsaWJyYXJ5IG9yIHN0YW5kYXJkIG9iamVjdC4KLQlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0JICAjIFRoaXMgZmlsZSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KLQkgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgPSB5ZXM7IHRoZW4KLQkgICAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKLQkgICAgcHJldj0KLQkgICAgY29udGludWUKLQkgIGVsc2UKLQkgICAgIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KLQkgICAgcHJldj1kbHByZWZpbGVzCi0JICBmaQotCWZpCi0KLQlpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JICAjIFByZWxvYWQgdGhlIG9sZC1zdHlsZSBvYmplY3QuCi0JICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAiYCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCSAgcHJldj0KLQllbHNlCi0JICBjYXNlICRhcmcgaW4KLQkgICoubG8pIGxpYm9ianM9IiRsaWJvYmpzICRhcmciIDs7Ci0JICAqKSBvYmpzPSIkb2JqcyAkYXJnIiA7OwotCSAgZXNhYwotCWZpCi0JOzsKLQotICAgICAgKi4kbGliZXh0KQotCSMgQW4gYXJjaGl2ZS4KLQlkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgotCW9sZF9kZXBsaWJzPSIkb2xkX2RlcGxpYnMgJGFyZyIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICoubGEpCi0JIyBBIGxpYnRvb2wtY29udHJvbGxlZCBsaWJyYXJ5LgotCi0JaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCi0JICBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgotCSAgcHJldj0KLQllbGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KLQkgICMgVGhlIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCi0JICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkYXJnIgotCSAgcHJldj0KLQllbHNlCi0JICBkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgotCWZpCi0JY29udGludWUKLQk7OwotCi0gICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgYXJndW1lbnQuCi0gICAgICAqKQotCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAotCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCi0JYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCWNhc2UgJGFyZyBpbgotCSpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCSAgYXJnPSJcIiRhcmdcIiIKLQkgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBlc2FjICMgYXJnCi0KLSAgICAgICMgTm93IGFjdHVhbGx5IHN1YnN0aXR1dGUgdGhlIGFyZ3VtZW50IGludG8gdGhlIGNvbW1hbmRzLgotICAgICAgaWYgdGVzdCAtbiAiJGFyZyI7IHRoZW4KLQljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKLQlmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgotICAgICAgZmkKLSAgICBkb25lICMgYXJndW1lbnQgcGFyc2luZyBsb29wCi0KLSAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRoZSBcYCRwcmV2YXJnJyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGlmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXMgJiYgdGVzdCAtbiAiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyI7IHRoZW4KLSAgICAgIGV2YWwgYXJnPVwiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCi0gICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKLSAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCi0gICAgZmkKLQotICAgICMgY2FsY3VsYXRlIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCB3aXRob3V0IGl0cyBkaXJlY3RvcnkKLSAgICBvdXRwdXRuYW1lPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICBsaWJvYmpzX3NhdmU9IiRsaWJvYmpzIgotCi0gICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICAjIGdldCB0aGUgZGlyZWN0b3JpZXMgbGlzdGVkIGluICRzaGxpYnBhdGhfdmFyCi0gICAgICBldmFsIHNobGliX3NlYXJjaF9wYXRoPVxgXCRlY2hvIFwiWFwkeyRzaGxpYnBhdGhfdmFyfVwiIFx8IFwkWHNlZCAtZSBcJ3MvOi8gL2dcJ1xgCi0gICAgZWxzZQotICAgICAgc2hsaWJfc2VhcmNoX3BhdGg9Ci0gICAgZmkKLSAgICBldmFsIHN5c19saWJfc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjXCIKLSAgICBldmFsIHN5c19saWJfZGxzZWFyY2hfcGF0aD1cIiRzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlY1wiCi0KLSAgICBvdXRwdXRfb2JqZGlyPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICBpZiB0ZXN0ICJYJG91dHB1dF9vYmpkaXIiID0gIlgkb3V0cHV0IjsgdGhlbgotICAgICAgb3V0cHV0X29iamRpcj0iJG9iamRpciIKLSAgICBlbHNlCi0gICAgICBvdXRwdXRfb2JqZGlyPSIkb3V0cHV0X29iamRpci8kb2JqZGlyIgotICAgIGZpCi0gICAgIyBDcmVhdGUgdGhlIG9iamVjdCBkaXJlY3RvcnkuCi0gICAgaWYgdGVzdCAhIC1kICRvdXRwdXRfb2JqZGlyOyB0aGVuCi0gICAgICAkc2hvdyAiJG1rZGlyICRvdXRwdXRfb2JqZGlyIgotICAgICAgJHJ1biAkbWtkaXIgJG91dHB1dF9vYmpkaXIKLSAgICAgIHN0YXR1cz0kPwotICAgICAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAkb3V0cHV0X29iamRpcjsgdGhlbgotCWV4aXQgJHN0YXR1cwotICAgICAgZmkKLSAgICBmaQotCi0gICAgIyBEZXRlcm1pbmUgdGhlIHR5cGUgb2Ygb3V0cHV0Ci0gICAgY2FzZSAkb3V0cHV0IGluCi0gICAgIiIpCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dCBmaWxlIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgICAgOzsKLSAgICAqLiRsaWJleHQpIGxpbmttb2RlPW9sZGxpYiA7OwotICAgICoubG8gfCAqLiRvYmpleHQpIGxpbmttb2RlPW9iaiA7OwotICAgICoubGEpIGxpbmttb2RlPWxpYiA7OwotICAgICopIGxpbmttb2RlPXByb2cgOzsgIyBBbnl0aGluZyBlbHNlIHNob3VsZCBiZSBhIHByb2dyYW0uCi0gICAgZXNhYwotCi0gICAgc3BlY2lhbGRlcGxpYnM9Ci0gICAgbGlicz0KLSAgICAjIEZpbmQgYWxsIGludGVyZGVwZW5kZW50IGRlcGxpYnMgYnkgc2VhcmNoaW5nIGZvciBsaWJyYXJpZXMKLSAgICAjIHRoYXQgYXJlIGxpbmtlZCBtb3JlIHRoYW4gb25jZSAoZS5nLiAtbGEgLWxiIC1sYSkKLSAgICBmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbwotICAgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfZGVwcyIgPSAiWHllcyIgOyB0aGVuCi0JY2FzZSAiJGxpYnMgIiBpbgotCSoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgbGlicz0iJGxpYnMgJGRlcGxpYiIKLSAgICBkb25lCi0gICAgZGVwbGlicz0KLSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9Ci0gICAgbmV3bGliX3NlYXJjaF9wYXRoPQotICAgIG5lZWRfcmVsaW5rPW5vICMgd2hldGhlciB3ZSdyZSBsaW5raW5nIGFueSB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcwotICAgIG5vdGluc3RfZGVwbGlicz0gIyBub3QtaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCi0gICAgbm90aW5zdF9wYXRoPSAjIHBhdGhzIHRoYXQgY29udGFpbiBub3QtaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCi0gICAgY2FzZSAkbGlua21vZGUgaW4KLSAgICBsaWIpCi0JcGFzc2VzPSJjb252IGxpbmsiCi0JZm9yIGZpbGUgaW4gJGRsZmlsZXMgJGRscHJlZmlsZXM7IGRvCi0JICBjYXNlICRmaWxlIGluCi0JICAqLmxhKSA7OwotCSAgKikKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogbGlicmFyaWVzIGNhbiBcYC1kbG9wZW4nIG9ubHkgbGlidG9vbCBsaWJyYXJpZXM6ICRmaWxlIiAxPiYyCi0JICAgIGV4aXQgMQotCSAgICA7OwotCSAgZXNhYwotCWRvbmUKLQk7OwotICAgIHByb2cpCi0JY29tcGlsZV9kZXBsaWJzPQotCWZpbmFsaXplX2RlcGxpYnM9Ci0JYWxsZGVwbGlicz1ubwotCW5ld2RsZmlsZXM9Ci0JbmV3ZGxwcmVmaWxlcz0KLQlwYXNzZXM9ImNvbnYgc2NhbiBkbG9wZW4gZGxwcmVvcGVuIGxpbmsiCi0JOzsKLSAgICAqKSAgcGFzc2VzPSJjb252IgotCTs7Ci0gICAgZXNhYwotICAgIGZvciBwYXNzIGluICRwYXNzZXM7IGRvCi0gICAgICBpZiB0ZXN0ICRsaW5rbW9kZSA9IHByb2c7IHRoZW4KLQkjIERldGVybWluZSB3aGljaCBmaWxlcyB0byBwcm9jZXNzCi0JY2FzZSAkcGFzcyBpbgotCWRsb3BlbikKLQkgIGxpYnM9IiRkbGZpbGVzIgotCSAgc2F2ZV9kZXBsaWJzPSIkZGVwbGlicyIgIyBDb2xsZWN0IGRscHJlb3BlbmVkIGxpYnJhcmllcwotCSAgZGVwbGlicz0KLQkgIDs7Ci0JZGxwcmVvcGVuKSBsaWJzPSIkZGxwcmVmaWxlcyIgOzsKLQlsaW5rKSBsaWJzPSIkZGVwbGlicyAlREVQTElCUyUgJGRlcGVuZGVuY3lfbGlicyIgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgZm9yIGRlcGxpYiBpbiAkbGliczsgZG8KLQlsaWI9Ci0JZm91bmQ9bm8KLQljYXNlICRkZXBsaWIgaW4KLQktbCopCi0JICBpZiB0ZXN0ICRsaW5rbW9kZSA9IG9sZGxpYiAmJiB0ZXN0ICRsaW5rbW9kZSA9IG9iajsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1sJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzOiAkZGVwbGliIiAxPiYyCi0JICAgIGNvbnRpbnVlCi0JICBmaQotCSAgaWYgdGVzdCAkcGFzcyA9IGNvbnY7IHRoZW4KLQkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgY29udGludWUKLQkgIGZpCi0JICBuYW1lPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1sLy8nYAotCSAgZm9yIHNlYXJjaGRpciBpbiAkbmV3bGliX3NlYXJjaF9wYXRoICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbwotCSAgICAjIFNlYXJjaCB0aGUgbGlidG9vbCBsaWJyYXJ5Ci0JICAgIGxpYj0iJHNlYXJjaGRpci9saWIke25hbWV9LmxhIgotCSAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgotCSAgICAgIGZvdW5kPXllcwotCSAgICAgIGJyZWFrCi0JICAgIGZpCi0JICBkb25lCi0JICBpZiB0ZXN0ICIkZm91bmQiICE9IHllczsgdGhlbgotCSAgICAjIGRlcGxpYiBkb2Vzbid0IHNlZW0gdG8gYmUgYSBsaWJ0b29sIGxpYnJhcnkKLQkgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCi0JICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCi0JICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgICAgdGVzdCAkbGlua21vZGUgPSBsaWIgJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JICAgIGZpCi0JICAgIGNvbnRpbnVlCi0JICBmaQotCSAgOzsgIyAtbAotCS1MKikKLQkgIGNhc2UgJGxpbmttb2RlIGluCi0JICBsaWIpCi0JICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIHRlc3QgJHBhc3MgPSBjb252ICYmIGNvbnRpbnVlCi0JICAgIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgotCSAgICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggImAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYAotCSAgICA7OwotCSAgcHJvZykKLQkgICAgaWYgdGVzdCAkcGFzcyA9IGNvbnY7IHRoZW4KLQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICAgIGNvbnRpbnVlCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgJHBhc3MgPSBzY2FuOyB0aGVuCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggImAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYAotCSAgICBlbHNlCi0JICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCi0JICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgICAgZmkKLQkgICAgOzsKLQkgICopCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLUwnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzL29iamVjdHM6ICRkZXBsaWIiIDE+JjIKLQkgICAgOzsKLQkgIGVzYWMgIyBsaW5rbW9kZQotCSAgY29udGludWUKLQkgIDs7ICMgLUwKLQktUiopCi0JICBpZiB0ZXN0ICRwYXNzID0gbGluazsgdGhlbgotCSAgICBkaXI9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLVIvLydgCi0JICAgICMgTWFrZSBzdXJlIHRoZSB4cnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCi0JICAgIGNhc2UgIiR4cnBhdGggIiBpbgotCSAgICAqIiAkZGlyICIqKSA7OwotCSAgICAqKSB4cnBhdGg9IiR4cnBhdGggJGRpciIgOzsKLQkgICAgZXNhYwotCSAgZmkKLQkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICBjb250aW51ZQotCSAgOzsKLQkqLmxhKSBsaWI9IiRkZXBsaWIiIDs7Ci0JKi4kbGliZXh0KQotCSAgaWYgdGVzdCAkcGFzcyA9IGNvbnY7IHRoZW4KLQkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgY29udGludWUKLQkgIGZpCi0JICBjYXNlICRsaW5rbW9kZSBpbgotCSAgbGliKQotCSAgICBpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCi0JICAgICAgZWNobwotCSAgICAgIGVjaG8gIioqKiBXYXJuaW5nOiBUcnlpbmcgdG8gbGluayB3aXRoIHN0YXRpYyBsaWIgYXJjaGl2ZSAkZGVwbGliLiIKLQkgICAgICBlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCSAgICAgIGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JICAgICAgZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgotCSAgICAgIGVjaG8gIioqKiBiZWNhdXNlIHRoZSBmaWxlIGV4dGVuc2lvbnMgLiRsaWJleHQgb2YgdGhpcyBhcmd1bWVudCBtYWtlcyBtZSBiZWxpZXZlIgotCSAgICAgIGVjaG8gIioqKiB0aGF0IGl0IGlzIGp1c3QgYSBzdGF0aWMgYXJjaGl2ZSB0aGF0IEkgc2hvdWxkIG5vdCB1c2VkIGhlcmUuIgotCSAgICBlbHNlCi0JICAgICAgZWNobwotCSAgICAgIGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIgotCSAgICAgIGVjaG8gIioqKiBzdGF0aWMgbGlicmFyeSAkZGVwbGliIGlzIG5vdCBwb3J0YWJsZSEiCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgZmkKLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgIHByb2cpCi0JICAgIGlmIHRlc3QgJHBhc3MgIT0gbGluazsgdGhlbgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICBmaQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgZXNhYyAjIGxpbmttb2RlCi0JICA7OyAjICouJGxpYmV4dAotCSoubG8gfCAqLiRvYmpleHQpCi0JICBpZiB0ZXN0ICRwYXNzID0gZGxwcmVvcGVuIHx8IHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgIT0geWVzIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KLQkgICAgIyBJZiB0aGVyZSBpcyBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nIHN0YXRpY2FsbHksCi0JICAgICMgd2UgbmVlZCB0byBwcmVsb2FkLgotCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGVwbGliIgotCSAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgIGVsc2UKLQkgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGRlcGxpYiIKLQkgIGZpCi0JICBjb250aW51ZQotCSAgOzsKLQklREVQTElCUyUpCi0JICBhbGxkZXBsaWJzPXllcwotCSAgY29udGludWUKLQkgIDs7Ci0JZXNhYyAjIGNhc2UgJGRlcGxpYgotCWlmIHRlc3QgJGZvdW5kID0geWVzIHx8IHRlc3QgLWYgIiRsaWIiOyB0aGVuIDoKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCB0aGUgbGlicmFyeSBcYCRsaWInIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlpZiAoJHtTRUR9IC1lICcycScgJGxpYiB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0KLQlsYWRpcj1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JdGVzdCAiWCRsYWRpciIgPSAiWCRsaWIiICYmIGxhZGlyPSIuIgotCi0JZGxuYW1lPQotCWRsb3Blbj0KLQlkbHByZW9wZW49Ci0JbGliZGlyPQotCWxpYnJhcnlfbmFtZXM9Ci0Jb2xkX2xpYnJhcnk9Ci0JIyBJZiB0aGUgbGlicmFyeSB3YXMgaW5zdGFsbGVkIHdpdGggYW4gb2xkIHJlbGVhc2Ugb2YgbGlidG9vbCwKLQkjIGl0IHdpbGwgbm90IHJlZGVmaW5lIHZhcmlhYmxlIGluc3RhbGxlZC4KLQlpbnN0YWxsZWQ9eWVzCi0KLQkjIFJlYWQgdGhlIC5sYSBmaWxlCi0JY2FzZSAkbGliIGluCi0JKi8qIHwgKlxcKikgLiAkbGliIDs7Ci0JKikgLiAuLyRsaWIgOzsKLQllc2FjCi0KLQlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIiB8fAotCSAgIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxzY2FuIiB8fAotCSAgIHsgdGVzdCAkbGlua21vZGUgPSBvbGRsaWIgJiYgdGVzdCAkbGlua21vZGUgPSBvYmo7IH07IHRoZW4KLQkgICAjIEFkZCBkbFtwcmVdb3BlbmVkIGZpbGVzIG9mIGRlcGxpYgotCSAgdGVzdCAtbiAiJGRsb3BlbiIgJiYgZGxmaWxlcz0iJGRsZmlsZXMgJGRsb3BlbiIKLQkgIHRlc3QgLW4gIiRkbHByZW9wZW4iICYmIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRkbHByZW9wZW4iCi0JZmkKLQotCWlmIHRlc3QgJHBhc3MgPSBjb252OyB0aGVuCi0JICAjIE9ubHkgY2hlY2sgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcwotCSAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIKLQkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IHRoZW4KLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBuYW1lIG9mIGxpbmsgbGlicmFyeSBmb3IgXGAkbGliJyIgMT4mMgotCSAgICAgIGV4aXQgMQotCSAgICBmaQotCSAgICAjIEl0IGlzIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBzbyBhZGQgaW4gaXRzIG9iamVjdHMuCi0JICAgIGNvbnZlbmllbmNlPSIkY29udmVuaWVuY2UgJGxhZGlyLyRvYmpkaXIvJG9sZF9saWJyYXJ5IgotCSAgICBvbGRfY29udmVuaWVuY2U9IiRvbGRfY29udmVuaWVuY2UgJGxhZGlyLyRvYmpkaXIvJG9sZF9saWJyYXJ5IgotCSAgICB0bXBfbGlicz0KLQkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0gICAgICAgICAgICAgIGlmIHRlc3QgIlgkZHVwbGljYXRlX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgotCSAgICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KLQkgICAgICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKLQkgICAgICAgIGVzYWMKLSAgICAgICAgICAgICAgZmkKLQkgICAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCi0JICAgIGRvbmUKLQkgIGVsaWYgdGVzdCAkbGlua21vZGUgIT0gcHJvZyAmJiB0ZXN0ICRsaW5rbW9kZSAhPSBsaWI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSBjb252ZW5pZW5jZSBsaWJyYXJ5IiAxPiYyCi0JICAgIGV4aXQgMQotCSAgZmkKLQkgIGNvbnRpbnVlCi0JZmkgIyAkcGFzcyA9IGNvbnYKLQotCSMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHdlIGxpbmsgYWdhaW5zdC4KLQlsaW5rbGliPQotCWZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KLQkgIGxpbmtsaWI9IiRsIgotCWRvbmUKLQlpZiB0ZXN0IC16ICIkbGlua2xpYiI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCi0JIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCi0JaWYgdGVzdCAkcGFzcyA9IGRsb3BlbjsgdGhlbgotCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IC1kbG9wZW4gYSBjb252ZW5pZW5jZSBsaWJyYXJ5OiBcYCRsaWInIiAxPiYyCi0JICAgIGV4aXQgMQotCSAgZmkKLQkgIGlmIHRlc3QgLXogIiRkbG5hbWUiIHx8IHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgIT0geWVzIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KLQkgICAgIyBJZiB0aGVyZSBpcyBubyBkbG5hbWUsIG5vIGRsb3BlbiBzdXBwb3J0IG9yIHdlJ3JlIGxpbmtpbmcKLQkgICAgIyBzdGF0aWNhbGx5LCB3ZSBuZWVkIHRvIHByZWxvYWQuCi0JICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRsaWIiCi0JICBlbHNlCi0JICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWIiCi0JICBmaQotCSAgY29udGludWUKLQlmaSAjICRwYXNzID0gZGxvcGVuCi0KLQkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLQljYXNlICRsYWRpciBpbgotCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzX2xhZGlyPSIkbGFkaXIiIDs7Ci0JKikKLQkgIGFic19sYWRpcj1gY2QgIiRsYWRpciIgJiYgcHdkYAotCSAgaWYgdGVzdCAteiAiJGFic19sYWRpciI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRsYWRpciciIDE+JjIKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogcGFzc2luZyBpdCBsaXRlcmFsbHkgdG8gdGhlIGxpbmtlciwgYWx0aG91Z2ggaXQgbWlnaHQgZmFpbCIgMT4mMgotCSAgICBhYnNfbGFkaXI9IiRsYWRpciIKLQkgIGZpCi0JICA7OwotCWVzYWMKLQlsYW5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0JIyBGaW5kIHRoZSByZWxldmFudCBvYmplY3QgZGlyZWN0b3J5IGFuZCBsaWJyYXJ5IG5hbWUuCi0JaWYgdGVzdCAiWCRpbnN0YWxsZWQiID0gWHllczsgdGhlbgotCSAgaWYgdGVzdCAhIC1mICIkbGliZGlyLyRsaW5rbGliIiAmJiB0ZXN0IC1mICIkYWJzX2xhZGlyLyRsaW5rbGliIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBsaWJyYXJ5IFxgJGxpYicgd2FzIG1vdmVkLiIgMT4mMgotCSAgICBkaXI9IiRsYWRpciIKLQkgICAgYWJzZGlyPSIkYWJzX2xhZGlyIgotCSAgICBsaWJkaXI9IiRhYnNfbGFkaXIiCi0JICBlbHNlCi0JICAgIGRpcj0iJGxpYmRpciIKLQkgICAgYWJzZGlyPSIkbGliZGlyIgotCSAgZmkKLQllbHNlCi0JICBkaXI9IiRsYWRpci8kb2JqZGlyIgotCSAgYWJzZGlyPSIkYWJzX2xhZGlyLyRvYmpkaXIiCi0JICAjIFJlbW92ZSB0aGlzIHNlYXJjaCBwYXRoIGxhdGVyCi0JICBub3RpbnN0X3BhdGg9IiRub3RpbnN0X3BhdGggJGFic19sYWRpciIKLQlmaSAjICRpbnN0YWxsZWQgPSB5ZXMKLQluYW1lPWAkZWNobyAiWCRsYW5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLycgLWUgJ3MvXmxpYi8vJ2AKLQotCSMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxwcmVvcGVuLgotCWlmIHRlc3QgJHBhc3MgPSBkbHByZW9wZW47IHRoZW4KLQkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCAtZGxwcmVvcGVuIGEgY29udmVuaWVuY2UgbGlicmFyeTogXGAkbGliJyIgMT4mMgotCSAgICBleGl0IDEKLQkgIGZpCi0JICAjIFByZWZlciB1c2luZyBhIHN0YXRpYyBsaWJyYXJ5IChzbyB0aGF0IG5vIHNpbGx5IF9EWU5BTUlDIHN5bWJvbHMKLQkgICMgYXJlIHJlcXVpcmVkIHRvIGxpbmspLgotCSAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGlyLyRvbGRfbGlicmFyeSIKLQkgICMgT3RoZXJ3aXNlLCB1c2UgdGhlIGRsbmFtZSwgc28gdGhhdCBsdF9kbG9wZW4gZmluZHMgaXQuCi0JICBlbGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCi0JICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkaXIvJGRsbmFtZSIKLQkgIGVsc2UKLQkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kbGlua2xpYiIKLQkgIGZpCi0JZmkgIyAkcGFzcyA9IGRscHJlb3BlbgotCi0JaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkgICMgTGluayB0aGUgY29udmVuaWVuY2UgbGlicmFyeQotCSAgaWYgdGVzdCAkbGlua21vZGUgPSBsaWI7IHRoZW4KLQkgICAgZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGRlcGxpYnMiCi0JICBlbGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgotCSAgICBjb21waWxlX2RlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRjb21waWxlX2RlcGxpYnMiCi0JICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgZWxzZQotCSAgICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgotCSAgZmkKLQkgIGNvbnRpbnVlCi0JZmkKLQotCWlmIHRlc3QgJGxpbmttb2RlID0gcHJvZyAmJiB0ZXN0ICRwYXNzICE9IGxpbms7IHRoZW4KLQkgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkbGFkaXIiCi0JICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgotCi0JICBsaW5rYWxsZGVwbGlicz1ubwotCSAgaWYgdGVzdCAiJGxpbmtfYWxsX2RlcGxpYnMiICE9IG5vIHx8IHRlc3QgLXogIiRsaWJyYXJ5X25hbWVzIiB8fAotCSAgICAgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgotCSAgICBsaW5rYWxsZGVwbGlicz15ZXMKLQkgIGZpCi0KLQkgIHRtcF9saWJzPQotCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICBjYXNlICRkZXBsaWIgaW4KLQkgICAgLUwqKSBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggImAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYDs7ICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAotCSAgICBlc2FjCi0JICAgICMgTmVlZCB0byBsaW5rIGFnYWluc3QgYWxsIGRlcGVuZGVuY3lfbGlicz8KLQkgICAgaWYgdGVzdCAkbGlua2FsbGRlcGxpYnMgPSB5ZXM7IHRoZW4KLQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgIyBOZWVkIHRvIGhhcmRjb2RlIHNoYXJlZCBsaWJyYXJ5IHBhdGhzCi0JICAgICAgIyBvci9hbmQgbGluayBhZ2FpbnN0IHN0YXRpYyBsaWJyYXJpZXMKLQkgICAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICAgZmkKLQkgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfZGVwcyIgPSAiWHllcyIgOyB0aGVuCi0JICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCi0JICBkb25lICMgZm9yIGRlcGxpYgotCSAgY29udGludWUKLQlmaSAjICRsaW5rbW9kZSA9IHByb2cuLi4KLQotCWxpbmtfc3RhdGljPW5vICMgV2hldGhlciB0aGUgZGVwbGliIHdpbGwgYmUgbGlua2VkIHN0YXRpY2FsbHkKLQlpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYKLQkgICB7IHRlc3QgIiRwcmVmZXJfc3RhdGljX2xpYnMiID0gbm8gfHwgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgfTsgdGhlbgotCSAgIyBMaW5rIGFnYWluc3QgdGhpcyBzaGFyZWQgbGlicmFyeQotCi0JICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayIgfHwKLQkgICB7IHRlc3QgJGxpbmttb2RlID0gbGliICYmIHRlc3QgJGhhcmRjb2RlX2ludG9fbGlicyA9IHllczsgfTsgdGhlbgotCSAgICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGguCi0JICAgICMgU2tpcCBkaXJlY3RvcmllcyB0aGF0IGFyZSBpbiB0aGUgc3lzdGVtIGRlZmF1bHQgcnVuLXRpbWUKLQkgICAgIyBzZWFyY2ggcGF0aC4KLQkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgotCSAgICAqIiAkYWJzZGlyICIqKSA7OwotCSAgICAqKQotCSAgICAgIGNhc2UgIiRjb21waWxlX3JwYXRoICIgaW4KLQkgICAgICAqIiAkYWJzZGlyICIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfcnBhdGg9IiRjb21waWxlX3JwYXRoICRhYnNkaXIiCi0JICAgICAgZXNhYwotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgotCSAgICAqIiAkbGliZGlyICIqKSA7OwotCSAgICAqKQotCSAgICAgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCi0JICAgICAgKiIgJGxpYmRpciAiKikgOzsKLQkgICAgICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiCi0JICAgICAgZXNhYwotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgICAgaWYgdGVzdCAkbGlua21vZGUgPSBwcm9nOyB0aGVuCi0JICAgICAgIyBXZSBuZWVkIHRvIGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGgKLQkgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLQkJIyBNYWtlIHN1cmUgdGhlIHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgotCQljYXNlICIkdGVtcF9ycGF0aCAiIGluCi0JCSoiICRkaXIgIiopIDs7Ci0JCSoiICRhYnNkaXIgIiopIDs7Ci0JCSopIHRlbXBfcnBhdGg9IiR0ZW1wX3JwYXRoICRkaXIiIDs7Ci0JCWVzYWMKLQkgICAgICBmaQotCSAgICBmaQotCSAgZmkgIyAkbGlua21vZGUsJHBhc3MgPSBwcm9nLGxpbmsuLi4KLQotCSAgaWYgdGVzdCAiJGFsbGRlcGxpYnMiID0geWVzICYmCi0JICAgICB7IHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSBwYXNzX2FsbCB8fAotCSAgICAgICB7IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmCi0JCSB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IH07IH07IHRoZW4KLQkgICAgIyBXZSBvbmx5IG5lZWQgdG8gc2VhcmNoIGZvciBzdGF0aWMgbGlicmFyaWVzCi0JICAgIGNvbnRpbnVlCi0JICBmaQotCi0JICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vOyB0aGVuCi0JICAgIG5vdGluc3RfZGVwbGlicz0iJG5vdGluc3RfZGVwbGlicyAkbGliIgotCSAgICBuZWVkX3JlbGluaz15ZXMKLQkgIGZpCi0KLQkgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyI7IHRoZW4KLQkgICAgIyBmaWd1cmUgb3V0IHRoZSBzb25hbWUKLQkgICAgc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCi0JICAgIHJlYWxuYW1lPSIkMiIKLQkgICAgc2hpZnQ7IHNoaWZ0Ci0JICAgIGxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKLQkgICAgIyB1c2UgZGxuYW1lIGlmIHdlIGdvdCBpdC4gaXQncyBwZXJmZWN0bHkgZ29vZCwgbm8/Ci0JICAgIGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCi0JICAgICAgc29uYW1lPSIkZGxuYW1lIgotCSAgICBlbGlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KLQkgICAgICAjIGJsZWggd2luZG93cwotCSAgICAgIGNhc2UgJGhvc3QgaW4KLQkgICAgICAqY3lnd2luKikKLQkJbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlYAotCQl2ZXJzdWZmaXg9Ii0kbWFqb3IiCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICAgIGV2YWwgc29uYW1lPVwiJHNvbmFtZV9zcGVjXCIKLQkgICAgZWxzZQotCSAgICAgIHNvbmFtZT0iJHJlYWxuYW1lIgotCSAgICBmaQotCi0JICAgICMgTWFrZSBhIG5ldyBuYW1lIGZvciB0aGUgZXh0cmFjdF9leHBzeW1zX2NtZHMgdG8gdXNlCi0JICAgIHNvcm9vdD0iJHNvbmFtZSIKLQkgICAgc29uYW1lPWBlY2hvICRzb3Jvb3QgfCAke1NFRH0gLWUgJ3MvXi4qXC8vLydgCi0JICAgIG5ld2xpYj0ibGliaW1wLWBlY2hvICRzb25hbWUgfCAke1NFRH0gJ3MvXmxpYi8vO3MvXC5kbGwkLy8nYC5hIgotCi0JICAgICMgSWYgdGhlIGxpYnJhcnkgaGFzIG5vIGV4cG9ydCBsaXN0LCB0aGVuIGNyZWF0ZSBvbmUgbm93Ci0JICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmIjsgdGhlbiA6Ci0JICAgIGVsc2UKLQkgICAgICAkc2hvdyAiZXh0cmFjdGluZyBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIFxgJHNvbmFtZSciCi0JICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgICAgZXZhbCBjbWRzPVwiJGV4dHJhY3RfZXhwc3ltc19jbWRzXCIKLQkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCQlJRlM9IiRzYXZlX2lmcyIKLQkJJHNob3cgIiRjbWQiCi0JCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCSAgICAgIGRvbmUKLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgZmkKLQotCSAgICAjIENyZWF0ZSAkbmV3bGliCi0JICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRuZXdsaWIiOyB0aGVuIDo7IGVsc2UKLQkgICAgICAkc2hvdyAiZ2VuZXJhdGluZyBpbXBvcnQgbGlicmFyeSBmb3IgXGAkc29uYW1lJyIKLQkgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgICBldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNcIgotCSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JCUlGUz0iJHNhdmVfaWZzIgotCQkkc2hvdyAiJGNtZCIKLQkJJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0JICAgICAgZG9uZQotCSAgICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICBmaQotCSAgICAjIG1ha2Ugc3VyZSB0aGUgbGlicmFyeSB2YXJpYWJsZXMgYXJlIHBvaW50aW5nIHRvIHRoZSBuZXcgbGlicmFyeQotCSAgICBkaXI9JG91dHB1dF9vYmpkaXIKLQkgICAgbGlua2xpYj0kbmV3bGliCi0JICBmaSAjIHRlc3QgLW4gJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzCi0KLQkgIGlmIHRlc3QgJGxpbmttb2RlID0gcHJvZyB8fCB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rOyB0aGVuCi0JICAgIGFkZF9zaGxpYnBhdGg9Ci0JICAgIGFkZF9kaXI9Ci0JICAgIGFkZD0KLQkgICAgbGliX2xpbmtlZD15ZXMKLQkgICAgY2FzZSAkaGFyZGNvZGVfYWN0aW9uIGluCi0JICAgIGltbWVkaWF0ZSB8IHVuc3VwcG9ydGVkKQotCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0gbm87IHRoZW4KLQkJYWRkPSIkZGlyLyRsaW5rbGliIgotCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0gbm87IHRoZW4KLQkJY2FzZSAkaG9zdCBpbgotCQkqLSotc3Vub3MqKSBhZGRfc2hsaWJwYXRoPSIkZGlyIiA7OwotCQllc2FjCi0JCWFkZF9kaXI9Ii1MJGRpciIKLQkJYWRkPSItbCRuYW1lIgotCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0gbm87IHRoZW4KLQkJYWRkX3NobGlicGF0aD0iJGRpciIKLQkJYWRkPSItbCRuYW1lIgotCSAgICAgIGVsc2UKLQkJbGliX2xpbmtlZD1ubwotCSAgICAgIGZpCi0JICAgICAgOzsKLQkgICAgcmVsaW5rKQotCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCi0JCWFkZD0iJGRpci8kbGlua2xpYiIKLQkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgotCQlhZGRfZGlyPSItTCRkaXIiCi0JCWFkZD0iLWwkbmFtZSIKLQkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgotCQlhZGRfc2hsaWJwYXRoPSIkZGlyIgotCQlhZGQ9Ii1sJG5hbWUiCi0JICAgICAgZWxzZQotCQlsaWJfbGlua2VkPW5vCi0JICAgICAgZmkKLQkgICAgICA7OwotCSAgICAqKSBsaWJfbGlua2VkPW5vIDs7Ci0JICAgIGVzYWMKLQotCSAgICBpZiB0ZXN0ICIkbGliX2xpbmtlZCIgIT0geWVzOyB0aGVuCi0JICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY29uZmlndXJhdGlvbiBlcnJvcjogdW5zdXBwb3J0ZWQgaGFyZGNvZGUgcHJvcGVydGllcyIKLQkgICAgICBleGl0IDEKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0IC1uICIkYWRkX3NobGlicGF0aCI7IHRoZW4KLQkgICAgICBjYXNlIDokY29tcGlsZV9zaGxpYnBhdGg6IGluCi0JICAgICAgKiI6JGFkZF9zaGxpYnBhdGg6IiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9zaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRhZGRfc2hsaWJwYXRoOiIgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgJGxpbmttb2RlID0gcHJvZzsgdGhlbgotCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBjb21waWxlX2RlcGxpYnM9IiRhZGRfZGlyICRjb21waWxlX2RlcGxpYnMiCi0JICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkICRjb21waWxlX2RlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZGVwbGlicz0iJGFkZF9kaXIgJGRlcGxpYnMiCi0JICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZGVwbGlicz0iJGFkZCAkZGVwbGlicyIKLQkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB5ZXMgJiYgXAotCQkgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IHllcyAmJiBcCi0JCSB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KLQkJY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KLQkJKiI6JGxpYmRpcjoiKikgOzsKLQkJKikgZmluYWxpemVfc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoJGxpYmRpcjoiIDs7Ci0JCWVzYWMKLQkgICAgICBmaQotCSAgICBmaQotCSAgZmkKLQotCSAgaWYgdGVzdCAkbGlua21vZGUgPSBwcm9nIHx8IHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgotCSAgICBhZGRfc2hsaWJwYXRoPQotCSAgICBhZGRfZGlyPQotCSAgICBhZGQ9Ci0JICAgICMgRmluYWxpemUgY29tbWFuZCBmb3IgYm90aCBpcyBzaW1wbGU6IGp1c3QgaGFyZGNvZGUgaXQuCi0JICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCi0JICAgICAgYWRkPSIkbGliZGlyLyRsaW5rbGliIgotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgotCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKLQkgICAgICBhZGQ9Ii1sJG5hbWUiCi0JICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCi0JICAgICAgY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KLQkgICAgICAqIjokbGliZGlyOiIqKSA7OwotCSAgICAgICopIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6IiA7OwotCSAgICAgIGVzYWMKLQkgICAgICBhZGQ9Ii1sJG5hbWUiCi0JICAgIGVsc2UKLQkgICAgICAjIFdlIGNhbm5vdCBzZWVtIHRvIGhhcmRjb2RlIGl0LCBndWVzcyB3ZSdsbCBmYWtlIGl0LgotCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKLQkgICAgICBhZGQ9Ii1sJG5hbWUiCi0JICAgIGZpCi0KLQkgICAgaWYgdGVzdCAkbGlua21vZGUgPSBwcm9nOyB0aGVuCi0JICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGZpbmFsaXplX2RlcGxpYnM9IiRhZGRfZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGZpbmFsaXplX2RlcGxpYnM9IiRhZGQgJGZpbmFsaXplX2RlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZGVwbGlicz0iJGFkZF9kaXIgJGRlcGxpYnMiCi0JICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZGVwbGlicz0iJGFkZCAkZGVwbGlicyIKLQkgICAgZmkKLQkgIGZpCi0JZWxpZiB0ZXN0ICRsaW5rbW9kZSA9IHByb2c7IHRoZW4KLQkgIGlmIHRlc3QgIiRhbGxkZXBsaWJzIiA9IHllcyAmJgotCSAgICAgeyB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiID0gcGFzc19hbGwgfHwKLQkgICAgICAgeyB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJgotCQkgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB9OyB9OyB0aGVuCi0JICAgICMgV2Ugb25seSBuZWVkIHRvIHNlYXJjaCBmb3Igc3RhdGljIGxpYnJhcmllcwotCSAgICBjb250aW51ZQotCSAgZmkKLQotCSAgIyBUcnkgdG8gbGluayB0aGUgc3RhdGljIGxpYnJhcnkKLQkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKLQkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAotCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgotCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KLQkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCi0JICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kbGlua2xpYiAkY29tcGlsZV9kZXBsaWJzIgotCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgZWxzZQotCSAgICBjb21waWxlX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRjb21waWxlX2RlcGxpYnMiCi0JICAgIGZpbmFsaXplX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgZmkKLQllbGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JICAjIE5vdCBhIHNoYXJlZCBsaWJyYXJ5Ci0JICBpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCi0JICAgICMgV2UncmUgdHJ5aW5nIGxpbmsgYSBzaGFyZWQgbGlicmFyeSBhZ2FpbnN0IGEgc3RhdGljIG9uZQotCSAgICAjIGJ1dCB0aGUgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBpdC4KLQotCSAgICAjIEp1c3QgcHJpbnQgYSB3YXJuaW5nIGFuZCBhZGQgdGhlIGxpYnJhcnkgdG8gZGVwZW5kZW5jeV9saWJzIHNvCi0JICAgICMgdGhhdCB0aGUgcHJvZ3JhbSBjYW4gYmUgbGlua2VkIGFnYWluc3QgdGhlIHN0YXRpYyBsaWJyYXJ5LgotCSAgICBlY2hvCi0JICAgIGVjaG8gIioqKiBXYXJuaW5nOiBUaGlzIHN5c3RlbSBjYW4gbm90IGxpbmsgdG8gc3RhdGljIGxpYiBhcmNoaXZlICRsaWIuIgotCSAgICBlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCSAgICBlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCSAgICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgotCSAgICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgotCSAgICAgIGVjaG8gIioqKiBCdXQgYXMgeW91IHRyeSB0byBidWlsZCBhIG1vZHVsZSBsaWJyYXJ5LCBsaWJ0b29sIHdpbGwgc3RpbGwgY3JlYXRlICIKLQkgICAgICBlY2hvICIqKiogYSBzdGF0aWMgbW9kdWxlLCB0aGF0IHNob3VsZCB3b3JrIGFzIGxvbmcgYXMgdGhlIGRsb3BlbmluZyBhcHBsaWNhdGlvbiIKLQkgICAgICBlY2hvICIqKiogaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZyB0byByZXNvbHZlIHN5bWJvbHMgYXQgcnVudGltZS4iCi0JICAgICAgaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQkJZWNobwotCQllY2hvICIqKiogSG93ZXZlciwgdGhpcyB3b3VsZCBvbmx5IHdvcmsgaWYgbGlidG9vbCB3YXMgYWJsZSB0byBleHRyYWN0IHN5bWJvbCIKLQkJZWNobyAiKioqIGxpc3RzIGZyb20gYSBwcm9ncmFtLCB1c2luZyBcYG5tJyBvciBlcXVpdmFsZW50LCBidXQgbGlidG9vbCBjb3VsZCIKLQkJZWNobyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgotCQllY2hvICIqKiogXGBubScgZnJvbSBHTlUgYmludXRpbHMgYW5kIGEgZnVsbCByZWJ1aWxkIG1heSBoZWxwLiIKLQkgICAgICBmaQotCSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgotCQlidWlsZF9saWJ0b29sX2xpYnM9bW9kdWxlCi0JCWJ1aWxkX29sZF9saWJzPXllcwotCSAgICAgIGVsc2UKLQkJYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgICAgZmkKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgY29udmVuaWVuY2U9IiRjb252ZW5pZW5jZSAkZGlyLyRvbGRfbGlicmFyeSIKLQkgICAgb2xkX2NvbnZlbmllbmNlPSIkb2xkX2NvbnZlbmllbmNlICRkaXIvJG9sZF9saWJyYXJ5IgotCSAgICBkZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZGVwbGlicyIKLQkgICAgbGlua19zdGF0aWM9eWVzCi0JICBmaQotCWZpICMgbGluayBzaGFyZWQvc3RhdGljIGxpYnJhcnk/Ci0KLQlpZiB0ZXN0ICRsaW5rbW9kZSA9IGxpYjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGRlcGVuZGVuY3lfbGlicyIgJiYKLQkgICAgIHsgdGVzdCAkaGFyZGNvZGVfaW50b19saWJzICE9IHllcyB8fCB0ZXN0ICRidWlsZF9vbGRfbGlicyA9IHllcyB8fAotCSAgICAgICB0ZXN0ICRsaW5rX3N0YXRpYyA9IHllczsgfTsgdGhlbgotCSAgICAjIEV4dHJhY3QgLVIgZnJvbSBkZXBlbmRlbmN5X2xpYnMKLQkgICAgdGVtcF9kZXBsaWJzPQotCSAgICBmb3IgbGliZGlyIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgICAgY2FzZSAkbGliZGlyIGluCi0JICAgICAgLVIqKSB0ZW1wX3hycGF0aD1gJGVjaG8gIlgkbGliZGlyIiB8ICRYc2VkIC1lICdzL14tUi8vJ2AKLQkJICAgY2FzZSAiICR4cnBhdGggIiBpbgotCQkgICAqIiAkdGVtcF94cnBhdGggIiopIDs7Ci0JCSAgICopIHhycGF0aD0iJHhycGF0aCAkdGVtcF94cnBhdGgiOzsKLQkJICAgZXNhYzs7Ci0JICAgICAgKikgdGVtcF9kZXBsaWJzPSIkdGVtcF9kZXBsaWJzICRsaWJkaXIiOzsKLQkgICAgICBlc2FjCi0JICAgIGRvbmUKLQkgICAgZGVwZW5kZW5jeV9saWJzPSIkdGVtcF9kZXBsaWJzIgotCSAgZmkKLQotCSAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRhYnNkaXIiCi0JICAjIExpbmsgYWdhaW5zdCB0aGlzIGxpYnJhcnkKLQkgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSBubyAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRhYnNfbGFkaXIvJGxhbmFtZSAkbmV3ZGVwZW5kZW5jeV9saWJzIgotCSAgIyAuLi4gYW5kIGl0cyBkZXBlbmRlbmN5X2xpYnMKLQkgIHRtcF9saWJzPQotCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfZGVwcyIgPSAiWHllcyIgOyB0aGVuCi0JICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCi0JICBkb25lCi0KLQkgIGlmIHRlc3QgJGxpbmtfYWxsX2RlcGxpYnMgIT0gbm87IHRoZW4KLQkgICAgIyBBZGQgdGhlIHNlYXJjaCBwYXRocyBvZiBhbGwgZGVwZW5kZW5jeSBsaWJyYXJpZXMKLQkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICAgIGNhc2UgJGRlcGxpYiBpbgotCSAgICAgIC1MKikgcGF0aD0iJGRlcGxpYiIgOzsKLQkgICAgICAqLmxhKQotCQlkaXI9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCQl0ZXN0ICJYJGRpciIgPSAiWCRkZXBsaWIiICYmIGRpcj0iLiIKLQkJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JCWNhc2UgJGRpciBpbgotCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic2Rpcj0iJGRpciIgOzsKLQkJKikKLQkJICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0JCSAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KLQkJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIgMT4mMgotCQkgICAgYWJzZGlyPSIkZGlyIgotCQkgIGZpCi0JCSAgOzsKLQkJZXNhYwotCQlpZiBncmVwICJeaW5zdGFsbGVkPW5vIiAkZGVwbGliID4gL2Rldi9udWxsOyB0aGVuCi0JCSAgcGF0aD0iLUwkYWJzZGlyLyRvYmpkaXIiCi0JCWVsc2UKLQkJICBldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkZGVwbGliYAotCQkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JCSAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCQkgICAgZXhpdCAxCi0JCSAgZmkKLQkJICBpZiB0ZXN0ICIkYWJzZGlyIiAhPSAiJGxpYmRpciI7IHRoZW4KLQkJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGRlcGxpYicgc2VlbXMgdG8gYmUgbW92ZWQiIDE+JjIKLQkJICBmaQotCQkgIHBhdGg9Ii1MJGFic2RpciIKLQkJZmkKLQkJOzsKLQkgICAgICAqKSBjb250aW51ZSA7OwotCSAgICAgIGVzYWMKLQkgICAgICBjYXNlICIgJGRlcGxpYnMgIiBpbgotCSAgICAgICoiICRwYXRoICIqKSA7OwotCSAgICAgICopIGRlcGxpYnM9IiRkZXBsaWJzICRwYXRoIiA7OwotCSAgICAgIGVzYWMKLQkgICAgZG9uZQotCSAgZmkgIyBsaW5rX2FsbF9kZXBsaWJzICE9IG5vCi0JZmkgIyBsaW5rbW9kZSA9IGxpYgotICAgICAgZG9uZSAjIGZvciBkZXBsaWIgaW4gJGxpYnMKLSAgICAgIGlmIHRlc3QgJHBhc3MgPSBkbHByZW9wZW47IHRoZW4KLQkjIExpbmsgdGhlIGRscHJlb3BlbmVkIGxpYnJhcmllcyBiZWZvcmUgb3RoZXIgbGlicmFyaWVzCi0JZm9yIGRlcGxpYiBpbiAkc2F2ZV9kZXBsaWJzOyBkbwotCSAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQlkb25lCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAkcGFzcyAhPSBkbG9wZW47IHRoZW4KLQl0ZXN0ICRwYXNzICE9IHNjYW4gJiYgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgotCWlmIHRlc3QgJHBhc3MgIT0gY29udjsgdGhlbgotCSAgIyBNYWtlIHN1cmUgbGliX3NlYXJjaF9wYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgotCSAgbGliX3NlYXJjaF9wYXRoPQotCSAgZm9yIGRpciBpbiAkbmV3bGliX3NlYXJjaF9wYXRoOyBkbwotCSAgICBjYXNlICIkbGliX3NlYXJjaF9wYXRoICIgaW4KLQkgICAgKiIgJGRpciAiKikgOzsKLQkgICAgKikgbGliX3NlYXJjaF9wYXRoPSIkbGliX3NlYXJjaF9wYXRoICRkaXIiIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQkgIG5ld2xpYl9zZWFyY2hfcGF0aD0KLQlmaQotCi0JaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiAhPSAicHJvZyxsaW5rIjsgdGhlbgotCSAgdmFycz0iZGVwbGlicyIKLQllbHNlCi0JICB2YXJzPSJjb21waWxlX2RlcGxpYnMgZmluYWxpemVfZGVwbGlicyIKLQlmaQotCWZvciB2YXIgaW4gJHZhcnMgZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgIyBBZGQgbGlicmFyaWVzIHRvICR2YXIgaW4gcmV2ZXJzZSBvcmRlcgotCSAgZXZhbCB0bXBfbGlicz1cIlwkJHZhclwiCi0JICBuZXdfbGlicz0KLQkgIGZvciBkZXBsaWIgaW4gJHRtcF9saWJzOyBkbwotCSAgICBjYXNlICRkZXBsaWIgaW4KLQkgICAgLUwqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7Ci0JICAgICopCi0JICAgICAgY2FzZSAiICRzcGVjaWFsZGVwbGlicyAiIGluCi0JICAgICAgKiIgJGRlcGxpYiAiKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OwotCSAgICAgICopCi0JCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgotCQkqIiAkZGVwbGliICIqKSA7OwotCQkqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7Ci0JCWVzYWMKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCSAgdG1wX2xpYnM9Ci0JICBmb3IgZGVwbGliIGluICRuZXdfbGliczsgZG8KLQkgICAgY2FzZSAkZGVwbGliIGluCi0JICAgIC1MKikKLQkgICAgICBjYXNlICIgJHRtcF9saWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSA7OwotCSAgICAgICopIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgKikgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JICBldmFsICR2YXI9XCIkdG1wX2xpYnNcIgotCWRvbmUgIyBmb3IgdmFyCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJHBhc3MiID0gImNvbnYiICYmCi0gICAgICAgeyB0ZXN0ICIkbGlua21vZGUiID0gImxpYiIgfHwgdGVzdCAiJGxpbmttb2RlIiA9ICJwcm9nIjsgfTsgdGhlbgotCWxpYnM9IiRkZXBsaWJzIiAjIHJlc2V0IGxpYnMKLQlkZXBsaWJzPQotICAgICAgZmkKLSAgICBkb25lICMgZm9yIHBhc3MKLSAgICBpZiB0ZXN0ICRsaW5rbW9kZSA9IHByb2c7IHRoZW4KLSAgICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgotICAgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCi0gICAgZmkKLQotICAgIGNhc2UgJGxpbmttb2RlIGluCi0gICAgb2xkbGliKQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLVInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWV4cG9ydC1zeW1ib2xzJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCi0gICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLSAgICAgIG9sZGxpYnM9IiRvdXRwdXQiCi0gICAgICBvYmpzPSIkb2JqcyRvbGRfZGVwbGlicyIKLSAgICAgIDs7Ci0KLSAgICBsaWIpCi0gICAgICAjIE1ha2Ugc3VyZSB3ZSBvbmx5IGdlbmVyYXRlIGxpYnJhcmllcyBvZiB0aGUgZm9ybSBgbGliTkFNRS5sYScuCi0gICAgICBjYXNlICRvdXRwdXRuYW1lIGluCi0gICAgICBsaWIqKQotCW5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLycgLWUgJ3MvXmxpYi8vJ2AKLQlldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKLQk7OwotICAgICAgKikKLQlpZiB0ZXN0ICIkbW9kdWxlIiA9IG5vOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBtdXN0IGJlZ2luIHdpdGggXGBsaWInIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0JaWYgdGVzdCAiJG5lZWRfbGliX3ByZWZpeCIgIT0gbm87IHRoZW4KLQkgICMgQWRkIHRoZSAibGliIiBwcmVmaXggZm9yIG1vZHVsZXMgaWYgcmVxdWlyZWQKLQkgIG5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLydgCi0JICBldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKLQllbHNlCi0JICBsaWJuYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nYAotCWZpCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgaWYgdGVzdCAtbiAiJG9ianMiOyB0aGVuCi0JaWYgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAhPSBwYXNzX2FsbDsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGJ1aWxkIGxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyBvbiB0aGlzIGhvc3Q6JG9ianMiIDI+JjEKLQkgIGV4aXQgMQotCWVsc2UKLQkgIGVjaG8KLQkgIGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIG5vbi1saWJ0b29sIgotCSAgZWNobyAiKioqIG9iamVjdHMgJG9ianMgaXMgbm90IHBvcnRhYmxlISIKLQkgIGxpYm9ianM9IiRsaWJvYmpzICRvYmpzIgotCWZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbiBzZWxmJyBpcyBpZ25vcmVkIGZvciBsaWJ0b29sIGxpYnJhcmllcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgc2V0IGR1bW15ICRycGF0aAotICAgICAgaWYgdGVzdCAkIyAtZ3QgMjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGlnbm9yaW5nIG11bHRpcGxlIFxgLXJwYXRoJ3MgZm9yIGEgbGlidG9vbCBsaWJyYXJ5IiAxPiYyCi0gICAgICBmaQotICAgICAgaW5zdGFsbF9saWJkaXI9IiQyIgotCi0gICAgICBvbGRsaWJzPQotICAgICAgaWYgdGVzdCAteiAiJHJwYXRoIjsgdGhlbgotCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JICAjIEJ1aWxkaW5nIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LgotCSAgbGliZXh0PWFsCi0JICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0ICRvbGRsaWJzIgotCSAgYnVpbGRfbGlidG9vbF9saWJzPWNvbnZlbmllbmNlCi0JICBidWlsZF9vbGRfbGlicz15ZXMKLQlmaQotCi0JaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKLQlmaQotCi0JaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKLQlmaQotICAgICAgZWxzZQotCi0JIyBQYXJzZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcmd1bWVudC4KLQlzYXZlX2lmcz0iJElGUyI7IElGUz0nOicKLQlzZXQgZHVtbXkgJHZpbmZvIDAgMCAwCi0JSUZTPSIkc2F2ZV9pZnMiCi0KLQlpZiB0ZXN0IC1uICIkOCI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHRvbyBtYW55IHBhcmFtZXRlcnMgdG8gXGAtdmVyc2lvbi1pbmZvJyIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCi0JY3VycmVudD0iJDIiCi0JcmV2aXNpb249IiQzIgotCWFnZT0iJDQiCi0KLQkjIENoZWNrIHRoYXQgZWFjaCBvZiB0aGUgdGhpbmdzIGFyZSB2YWxpZCBudW1iZXJzLgotCWNhc2UgJGN1cnJlbnQgaW4KLQkwIHwgWzEtOV0gfCBbMS05XVswLTldIHwgWzEtOV1bMC05XVswLTldKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBDVVJSRU5UIFxgJGN1cnJlbnQnIGlzIG5vdCBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLQotCWNhc2UgJHJldmlzaW9uIGluCi0JMCB8IFsxLTldIHwgWzEtOV1bMC05XSB8IFsxLTldWzAtOV1bMC05XSkgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogUkVWSVNJT04gXGAkcmV2aXNpb24nIGlzIG5vdCBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLQotCWNhc2UgJGFnZSBpbgotCTAgfCBbMS05XSB8IFsxLTldWzAtOV0gfCBbMS05XVswLTldWzAtOV0pIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IEFHRSBcYCRhZ2UnIGlzIG5vdCBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLQotCWlmIHRlc3QgJGFnZSAtZ3QgJGN1cnJlbnQ7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IEFHRSBcYCRhZ2UnIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBpbnRlcmZhY2UgbnVtYmVyIFxgJGN1cnJlbnQnIiAxPiYyCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0KLQkjIENhbGN1bGF0ZSB0aGUgdmVyc2lvbiB2YXJpYWJsZXMuCi0JbWFqb3I9Ci0JdmVyc3VmZml4PQotCXZlcnN0cmluZz0KLQljYXNlICR2ZXJzaW9uX3R5cGUgaW4KLQlub25lKSA7OwotCi0JZGFyd2luKQotCSAgIyBMaWtlIExpbnV4LCBidXQgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIGF2YWlsYWJsZSBpbgotCSAgIyB2ZXJzdHJpbmcgZm9yIGNvZGluZyBpdCBpbnRvIHRoZSBsaWJyYXJ5IGhlYWRlcgotCSAgbWFqb3I9LmBleHByICRjdXJyZW50IC0gJGFnZWAKLQkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgotCSAgIyBEYXJ3aW4gbGQgZG9lc24ndCBsaWtlIDAgZm9yIHRoZXNlIG9wdGlvbnMuLi4KLQkgIG1pbm9yX2N1cnJlbnQ9YGV4cHIgJGN1cnJlbnQgKyAxYAotCSAgdmVyc3RyaW5nPSItY29tcGF0aWJpbGl0eV92ZXJzaW9uICRtaW5vcl9jdXJyZW50IC1jdXJyZW50X3ZlcnNpb24gJG1pbm9yX2N1cnJlbnQuJHJldmlzaW9uIgotCSAgOzsKLQotCWZyZWVic2QtYW91dCkKLQkgIG1ham9yPSIuJGN1cnJlbnQiCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iOwotCSAgOzsKLQotCWZyZWVic2QtZWxmKQotCSAgbWFqb3I9Ii4kY3VycmVudCIKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50IjsKLQkgIDs7Ci0KLQlpcml4IHwgbm9uc3RvcHV4KQotCSAgbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlICsgMWAKLQotCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0JICAgIG5vbnN0b3B1eCkgdmVyc3RyaW5nX3ByZWZpeD1ub25zdG9wdXggOzsKLQkgICAgKikgICAgICAgICB2ZXJzdHJpbmdfcHJlZml4PXNnaSA7OwotCSAgZXNhYwotCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kcmV2aXNpb24iCi0KLQkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCi0JICBsb29wPSRyZXZpc2lvbgotCSAgd2hpbGUgdGVzdCAkbG9vcCAhPSAwOyBkbwotCSAgICBpZmFjZT1gZXhwciAkcmV2aXNpb24gLSAkbG9vcGAKLQkgICAgbG9vcD1gZXhwciAkbG9vcCAtIDFgCi0JICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZ19wcmVmaXgkbWFqb3IuJGlmYWNlOiR2ZXJzdHJpbmciCi0JICBkb25lCi0KLQkgICMgQmVmb3JlIHRoaXMgcG9pbnQsICRtYWpvciBtdXN0IG5vdCBjb250YWluIGAuJy4KLQkgIG1ham9yPS4kbWFqb3IKLQkgIHZlcnN1ZmZpeD0iJG1ham9yLiRyZXZpc2lvbiIKLQkgIDs7Ci0KLQlsaW51eCkKLQkgIG1ham9yPS5gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKLQkgIDs7Ci0KLQlvc2YpCi0JICBtYWpvcj0uYGV4cHIgJGN1cnJlbnQgLSAkYWdlYAotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCi0JICB2ZXJzdHJpbmc9IiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgotCi0JICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgotCSAgbG9vcD0kYWdlCi0JICB3aGlsZSB0ZXN0ICRsb29wICE9IDA7IGRvCi0JICAgIGlmYWNlPWBleHByICRjdXJyZW50IC0gJGxvb3BgCi0JICAgIGxvb3A9YGV4cHIgJGxvb3AgLSAxYAotCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtpZmFjZX0uMCIKLQkgIGRvbmUKLQotCSAgIyBNYWtlIGV4ZWN1dGFibGVzIGRlcGVuZCBvbiBvdXIgY3VycmVudCB2ZXJzaW9uLgotCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7Y3VycmVudH0uMCIKLQkgIDs7Ci0KLQlzdW5vcykKLQkgIG1ham9yPSIuJGN1cnJlbnQiCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iCi0JICA7OwotCi0Jd2luZG93cykKLQkgICMgVXNlICctJyByYXRoZXIgdGhhbiAnLicsIHNpbmNlIHdlIG9ubHkgd2FudCBvbmUKLQkgICMgZXh0ZW5zaW9uIG9uIERPUyA4LjMgZmlsZXN5c3RlbXMuCi0JICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9Ii0kbWFqb3IiCi0JICA7OwotCi0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IHVua25vd24gbGlicmFyeSB2ZXJzaW9uIHR5cGUgXGAkdmVyc2lvbl90eXBlJyIgMT4mMgotCSAgZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0KLQkjIENsZWFyIHRoZSB2ZXJzaW9uIGluZm8gaWYgd2UgZGVmYXVsdGVkLCBhbmQgdGhleSBzcGVjaWZpZWQgYSByZWxlYXNlLgotCWlmIHRlc3QgLXogIiR2aW5mbyIgJiYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JICBtYWpvcj0KLQkgIHZlcnN0cmluZz0iMC4wIgotCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0JICBkYXJ3aW4pCi0JICAgICMgd2UgY2FuJ3QgY2hlY2sgZm9yICIwLjAiIGluIGFyY2hpdmVfY21kcyBkdWUgdG8gcXVvdGluZwotCSAgICAjIHByb2JsZW1zLCBzbyB3ZSByZXNldCBpdCBjb21wbGV0ZWx5Ci0JICAgIHZlcnN0cmluZz0iIgotCSAgICA7OwotCSAgKikKLQkgICAgdmVyc3RyaW5nPSIwLjAiCi0JICAgIDs7Ci0JICBlc2FjCi0JICBpZiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCi0JICAgIHZlcnN1ZmZpeD0KLQkgIGVsc2UKLQkgICAgdmVyc3VmZml4PSIuMC4wIgotCSAgZmkKLQlmaQotCi0JIyBSZW1vdmUgdmVyc2lvbiBpbmZvIGZyb20gbmFtZSBpZiB2ZXJzaW9uaW5nIHNob3VsZCBiZSBhdm9pZGVkCi0JaWYgdGVzdCAiJGF2b2lkX3ZlcnNpb24iID0geWVzICYmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KLQkgIG1ham9yPQotCSAgdmVyc3VmZml4PQotCSAgdmVyc3RyaW5nPSIiCi0JZmkKLQotCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBhcmNoaXZlIHdpbGwgaGF2ZSB1bmRlZmluZWQgc3ltYm9scy4KLQlpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IHllczsgdGhlbgotCSAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZF9mbGFnIiA9IHVuc3VwcG9ydGVkOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHVuZGVmaW5lZCBzeW1ib2xzIG5vdCBhbGxvd2VkIGluICRob3N0IHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKLQkgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgIGJ1aWxkX29sZF9saWJzPXllcwotCSAgZmkKLQllbHNlCi0JICAjIERvbid0IGFsbG93IHVuZGVmaW5lZCBzeW1ib2xzLgotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9IiRub191bmRlZmluZWRfZmxhZyIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG1vZGUiICE9IHJlbGluazsgdGhlbgotCSMgUmVtb3ZlIG91ciBvdXRwdXRzLgotCSRzaG93ICIke3JtfXIgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuKiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9JHtyZWxlYXNlfS4qIgotCSRydW4gJHtybX1yICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiogJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfSR7cmVsZWFzZX0uKgotICAgICAgZmkKLQotICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IGNvbnZlbmllbmNlIDsgdGhlbgotCW9sZGxpYnM9IiRvbGRsaWJzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCi0KLQkjIFRyYW5zZm9ybSAubG8gZmlsZXMgdG8gLm8gZmlsZXMuCi0Jb2xkb2Jqcz0iJG9ianMgImAkZWNobyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICcvXC4nJHtsaWJleHR9JyQvZCcgLWUgIiRsbzJvIiB8ICROTDJTUGAKLSAgICAgIGZpCi0KLSAgICAgICMgRWxpbWluYXRlIGFsbCB0ZW1wb3JhcnkgZGlyZWN0b3JpZXMuCi0gICAgICBmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbwotCWxpYl9zZWFyY2hfcGF0aD1gZWNobyAiJGxpYl9zZWFyY2hfcGF0aCAiIHwgJHtTRUR9IC1lICdzJSAkcGF0aCAlICVnJ2AKLQlkZXBsaWJzPWBlY2hvICIkZGVwbGlicyAiIHwgJHtTRUR9IC1lICdzJSAtTCRwYXRoICUgJWcnYAotCWRlcGVuZGVuY3lfbGlicz1gZWNobyAiJGRlcGVuZGVuY3lfbGlicyAiIHwgJHtTRUR9IC1lICdzJSAtTCRwYXRoICUgJWcnYAotICAgICAgZG9uZQotCi0gICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgotCSMgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFueSBycGF0aCBmbGFncywgdGhlbiBhZGQgdGhlbS4KLQl0ZW1wX3hycGF0aD0KLQlmb3IgbGliZGlyIGluICR4cnBhdGg7IGRvCi0JICB0ZW1wX3hycGF0aD0iJHRlbXBfeHJwYXRoIC1SJGxpYmRpciIKLQkgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCWRvbmUKLQlpZiB0ZXN0ICRoYXJkY29kZV9pbnRvX2xpYnMgIT0geWVzIHx8IHRlc3QgJGJ1aWxkX29sZF9saWJzID0geWVzOyB0aGVuCi0JICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX3hycGF0aCAkZGVwZW5kZW5jeV9saWJzIgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSBkbGZpbGVzIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGZpbGVzIHRoYXQgd29uJ3QgYmUgZGxwcmVvcGVuZWQKLSAgICAgIG9sZF9kbGZpbGVzPSIkZGxmaWxlcyIKLSAgICAgIGRsZmlsZXM9Ci0gICAgICBmb3IgbGliIGluICRvbGRfZGxmaWxlczsgZG8KLQljYXNlICIgJGRscHJlZmlsZXMgJGRsZmlsZXMgIiBpbgotCSoiICRsaWIgIiopIDs7Ci0JKikgZGxmaWxlcz0iJGRsZmlsZXMgJGxpYiIgOzsKLQllc2FjCi0gICAgICBkb25lCi0KLSAgICAgICMgTWFrZSBzdXJlIGRscHJlZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMKLSAgICAgIG9sZF9kbHByZWZpbGVzPSIkZGxwcmVmaWxlcyIKLSAgICAgIGRscHJlZmlsZXM9Ci0gICAgICBmb3IgbGliIGluICRvbGRfZGxwcmVmaWxlczsgZG8KLQljYXNlICIkZGxwcmVmaWxlcyAiIGluCi0JKiIgJGxpYiAiKikgOzsKLQkqKSBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliIiA7OwotCWVzYWMKLSAgICAgIGRvbmUKLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCi0JICBjYXNlICRob3N0IGluCi0JICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotKi1iZW9zKikKLQkgICAgIyB0aGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBjIGxpYnJhcnkgKGFzIHN1Y2gpIQotCSAgICA7OwotCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQotCSAgICAjIFJoYXBzb2R5IEMgbGlicmFyeSBpcyBpbiB0aGUgU3lzdGVtIGZyYW1ld29yawotCSAgICBkZXBsaWJzPSIkZGVwbGlicyAtZnJhbWV3b3JrIFN5c3RlbSIKLQkgICAgOzsKLQkgICotKi1uZXRic2QqKQotCSAgICAjIERvbid0IGxpbmsgd2l0aCBsaWJjIHVudGlsIHRoZSBhLm91dCBsZC5zbyBpcyBmaXhlZC4KLQkgICAgOzsKLQkgICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKikKLQkgICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjIGR1ZSB0byB1cyBoYXZpbmcgbGliYy9saWJjX3IuCi0JICAgIDs7Ci0JICAqKQotCSAgICAjIEFkZCBsaWJjIHRvIGRlcGxpYnMgb24gYWxsIG90aGVyIHN5c3RlbXMgaWYgbmVjZXNzYXJ5LgotCSAgICBpZiB0ZXN0ICRidWlsZF9saWJ0b29sX25lZWRfbGMgPSAieWVzIjsgdGhlbgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1sYyIKLQkgICAgZmkKLQkgICAgOzsKLQkgIGVzYWMKLQlmaQotCi0JIyBUcmFuc2Zvcm0gZGVwbGlicyBpbnRvIG9ubHkgZGVwbGlicyB0aGF0IGNhbiBiZSBsaW5rZWQgaW4gc2hhcmVkLgotCW5hbWVfc2F2ZT0kbmFtZQotCWxpYm5hbWVfc2F2ZT0kbGlibmFtZQotCXJlbGVhc2Vfc2F2ZT0kcmVsZWFzZQotCXZlcnN1ZmZpeF9zYXZlPSR2ZXJzdWZmaXgKLQltYWpvcl9zYXZlPSRtYWpvcgotCSMgSSdtIG5vdCBzdXJlIGlmIEknbSB0cmVhdGluZyB0aGUgcmVsZWFzZSBjb3JyZWN0bHkuICBJIHRoaW5rCi0JIyByZWxlYXNlIHNob3VsZCBzaG93IHVwIGluIHRoZSAtbCAoaWUgLWxnbXA1KSBzbyB3ZSBkb24ndCB3YW50IHRvCi0JIyBhZGQgaXQgaW4gdHdpY2UuICBJcyB0aGF0IGNvcnJlY3Q/Ci0JcmVsZWFzZT0iIgotCXZlcnN1ZmZpeD0iIgotCW1ham9yPSIiCi0JbmV3ZGVwbGlicz0KLQlkcm9wcGVkZGVwcz1ubwotCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCi0JcGFzc19hbGwpCi0JICAjIERvbid0IGNoZWNrIGZvciBzaGFyZWQvc3RhdGljLiAgRXZlcnl0aGluZyB3b3Jrcy4KLQkgICMgVGhpcyBtaWdodCBiZSBhIGxpdHRsZSBuYWl2ZS4gIFdlIG1pZ2h0IHdhbnQgdG8gY2hlY2sKLQkgICMgd2hldGhlciB0aGUgbGlicmFyeSBleGlzdHMgb3Igbm90LiAgQnV0IHRoaXMgaXMgb24KLQkgICMgb3NmMyAmIG9zZjQgYW5kIEknbSBub3QgcmVhbGx5IHN1cmUuLi4gSnVzdAotCSAgIyBpbXBsZW1lbnRpbmcgd2hhdCB3YXMgYWxyZWFkeSB0aGUgYmVoYXZpb3VyLgotCSAgbmV3ZGVwbGlicz0kZGVwbGlicwotCSAgOzsKLQl0ZXN0X2NvbXBpbGUpCi0JICAjIFRoaXMgY29kZSBzdHJlc3NlcyB0aGUgImxpYnJhcmllcyBhcmUgcHJvZ3JhbXMiIHBhcmFkaWdtIHRvIGl0cwotCSAgIyBsaW1pdHMuIE1heWJlIGV2ZW4gYnJlYWtzIGl0LiAgV2UgY29tcGlsZSBhIHByb2dyYW0sIGxpbmtpbmcgaXQKLQkgICMgYWdhaW5zdCB0aGUgZGVwbGlicyBhcyBhIHByb3h5IGZvciB0aGUgbGlicmFyeS4gIFRoZW4gd2UgY2FuIGNoZWNrCi0JICAjIHdoZXRoZXIgdGhleSBsaW5rZWQgaW4gc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIGxkZC4KLQkgICRybSBjb25mdGVzdC5jCi0JICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0JICBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KLUVPRgotCSAgJHJtIGNvbmZ0ZXN0Ci0JICAkQ0MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkZGVwbGlicwotCSAgaWYgdGVzdCAkPyAtZXEgMCA7IHRoZW4KLQkgICAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAotCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KLQkgICAgICBuYW1lPSJgZXhwciAkaSA6ICctbFwoLipcKSdgIgotCSAgICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgotCSAgICAgIGlmIHRlc3QgLW4gIiRuYW1lIiAmJiB0ZXN0ICIkbmFtZSIgIT0gIjAiOyB0aGVuCi0JCWxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKLQkJZGVwbGliX21hdGNoZXM9YGV2YWwgXFwkZWNobyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcImAKLQkJc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlcwotCQlkZXBsaWJfbWF0Y2g9JDIKLQkJaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgotCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCQllbHNlCi0JCSAgZHJvcHBlZGRlcHM9eWVzCi0JCSAgZWNobwotCQkgIGVjaG8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgotCQkgIGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCSAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIEkgYmVsaWV2ZSB5b3UgZG8gbm90IGhhdmUiCi0JCSAgZWNobyAiKioqIGJlY2F1c2UgYSB0ZXN0X2NvbXBpbGUgZGlkIHJldmVhbCB0aGF0IHRoZSBsaW5rZXIgZGlkIG5vdCB1c2UgaXQgZm9yIgotCQkgIGVjaG8gIioqKiBpdHMgZHluYW1pYyBkZXBlbmRlbmN5IGxpc3QgdGhhdCBwcm9ncmFtcyBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKLQkJZmkKLQkgICAgICBlbHNlCi0JCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGVsc2UKLQkgICAgIyBFcnJvciBvY2N1cmVkIGluIHRoZSBmaXJzdCBjb21waWxlLiAgTGV0J3MgdHJ5IHRvIHNhbHZhZ2UKLQkgICAgIyB0aGUgc2l0dWF0aW9uOiBDb21waWxlIGEgc2VwYXJhdGUgcHJvZ3JhbSBmb3IgZWFjaCBsaWJyYXJ5LgotCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KLQkgICAgICBuYW1lPSJgZXhwciAkaSA6ICctbFwoLipcKSdgIgotCSAgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCi0JICAgICAgaWYgdGVzdCAtbiAiJG5hbWUiICYmIHRlc3QgIiRuYW1lIiAhPSAiMCI7IHRoZW4KLQkJJHJtIGNvbmZ0ZXN0Ci0JCSRDQyAtbyBjb25mdGVzdCBjb25mdGVzdC5jICRpCi0JCSMgRGlkIGl0IHdvcms/Ci0JCWlmIHRlc3QgJD8gLWVxIDAgOyB0aGVuCi0JCSAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAotCQkgIGxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKLQkJICBkZXBsaWJfbWF0Y2hlcz1gZXZhbCBcXCRlY2hvIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiYAotCQkgIHNldCBkdW1teSAkZGVwbGliX21hdGNoZXMKLQkJICBkZXBsaWJfbWF0Y2g9JDIKLQkJICBpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCi0JCSAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkJICBlbHNlCi0JCSAgICBkcm9wcGVkZGVwcz15ZXMKLQkJICAgIGVjaG8KLQkJICAgIGVjaG8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgotCQkgICAgZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJICAgIGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCSAgICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCi0JCSAgICBlY2hvICIqKiogYmVjYXVzZSBhIHRlc3RfY29tcGlsZSBkaWQgcmV2ZWFsIHRoYXQgdGhlIGxpbmtlciBkaWQgbm90IHVzZSB0aGlzIG9uZSIKLQkJICAgIGVjaG8gIioqKiBhcyBhIGR5bmFtaWMgZGVwZW5kZW5jeSB0aGF0IHByb2dyYW1zIGNhbiBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKLQkJICBmaQotCQllbHNlCi0JCSAgZHJvcHBlZGRlcHM9eWVzCi0JCSAgZWNobwotCQkgIGVjaG8gIioqKiBXYXJuaW5nISAgTGlicmFyeSAkaSBpcyBuZWVkZWQgYnkgdGhpcyBsaWJyYXJ5IGJ1dCBJIHdhcyBub3QgYWJsZSB0byIKLQkJICBlY2hvICIqKiogIG1ha2UgaXQgbGluayBpbiEgIFlvdSB3aWxsIHByb2JhYmx5IG5lZWQgdG8gaW5zdGFsbCBpdCBvciBzb21lIgotCQkgIGVjaG8gIioqKiBsaWJyYXJ5IHRoYXQgaXQgZGVwZW5kcyBvbiBiZWZvcmUgdGhpcyBsaWJyYXJ5IHdpbGwgYmUgZnVsbHkiCi0JCSAgZWNobyAiKioqIGZ1bmN0aW9uYWwuICBJbnN0YWxsaW5nIGl0IGJlZm9yZSBjb250aW51aW5nIHdvdWxkIGJlIGV2ZW4gYmV0dGVyLiIKLQkJZmkKLQkgICAgICBlbHNlCi0JCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGZpCi0JICA7OwotCWZpbGVfbWFnaWMqKQotCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZAotCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMiBcKC4qXCkiYAotCSAgZm9yIGFfZGVwbGliIGluICRkZXBsaWJzOyBkbwotCSAgICBuYW1lPSJgZXhwciAkYV9kZXBsaWIgOiAnLWxcKC4qXCknYCIKLQkgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCi0JICAgIGlmIHRlc3QgLW4gIiRuYW1lIiAmJiB0ZXN0ICIkbmFtZSIgIT0gIjAiOyB0aGVuCi0JICAgICAgbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCSAgICAgIGZvciBpIGluICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbwotCQkgICAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCi0JCSAgICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCi0JCSAgICAgICMgRm9sbG93IHNvZnQgbGlua3MuCi0JCSAgICAgIGlmIGxzIC1sTGQgIiRwb3RlbnRfbGliIiAyPi9kZXYvbnVsbCBcCi0JCQkgfCBncmVwICIgLT4gIiA+L2Rldi9udWxsOyB0aGVuCi0JCQljb250aW51ZQotCQkgICAgICBmaQotCQkgICAgICAjIFRoZSBzdGF0ZW1lbnQgYWJvdmUgdHJpZXMgdG8gYXZvaWQgZW50ZXJpbmcgYW4KLQkJICAgICAgIyBlbmRsZXNzIGxvb3AgYmVsb3csIGluIGNhc2Ugb2YgY3ljbGljIGxpbmtzLgotCQkgICAgICAjIFdlIG1pZ2h0IHN0aWxsIGVudGVyIGFuIGVuZGxlc3MgbG9vcCwgc2luY2UgYSBsaW5rCi0JCSAgICAgICMgbG9vcCBjYW4gYmUgY2xvc2VkIHdoaWxlIHdlIGZvbGxvdyBsaW5rcywKLQkJICAgICAgIyBidXQgc28gd2hhdD8KLQkJICAgICAgcG90bGliPSIkcG90ZW50X2xpYiIKLQkJICAgICAgd2hpbGUgdGVzdCAtaCAiJHBvdGxpYiIgMj4vZGV2L251bGw7IGRvCi0JCQlwb3RsaWJsaW5rPWBscyAtbGQgJHBvdGxpYiB8ICR7U0VEfSAncy8uKiAtPiAvLydgCi0JCQljYXNlICRwb3RsaWJsaW5rIGluCi0JCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHBvdGxpYj0iJHBvdGxpYmxpbmsiOzsKLQkJCSopIHBvdGxpYj1gJGVjaG8gIlgkcG90bGliIiB8ICRYc2VkIC1lICdzLFteL10qJCwsJ2AiJHBvdGxpYmxpbmsiOzsKLQkJCWVzYWMKLQkJICAgICAgZG9uZQotCQkgICAgICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcIlwkcG90bGliXCIgMj4vZGV2L251bGwgXAotCQkJIHwgJHtTRUR9IDEwcSBcCi0JCQkgfCBlZ3JlcCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JCQluZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCi0JCQlhX2RlcGxpYj0iIgotCQkJYnJlYWsgMgotCQkgICAgICBmaQotCQkgICAgZG9uZQotCSAgICAgIGRvbmUKLQkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgotCQlkcm9wcGVkZGVwcz15ZXMKLQkJZWNobwotCQllY2hvICIqKiogV2FybmluZzogbGlua2VyIHBhdGggZG9lcyBub3QgaGF2ZSByZWFsIGZpbGUgZm9yIGxpYnJhcnkgJGFfZGVwbGliLiIKLQkJZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgotCQllY2hvICIqKiogYmVjYXVzZSBJIGRpZCBjaGVjayB0aGUgbGlua2VyIHBhdGggbG9va2luZyBmb3IgYSBmaWxlIHN0YXJ0aW5nIgotCQlpZiB0ZXN0IC16ICIkcG90bGliIiA7IHRoZW4KLQkJICBlY2hvICIqKiogd2l0aCAkbGlibmFtZSBidXQgbm8gY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLiAoLi4uZm9yIGZpbGUgbWFnaWMgdGVzdCkiCi0JCWVsc2UKLQkJICBlY2hvICIqKiogd2l0aCAkbGlibmFtZSBhbmQgbm9uZSBvZiB0aGUgY2FuZGlkYXRlcyBwYXNzZWQgYSBmaWxlIGZvcm1hdCB0ZXN0IgotCQkgIGVjaG8gIioqKiB1c2luZyBhIGZpbGUgbWFnaWMuIExhc3QgZmlsZSBjaGVja2VkOiAkcG90bGliIgotCQlmaQotCSAgICAgIGZpCi0JICAgIGVsc2UKLQkgICAgICAjIEFkZCBhIC1MIGFyZ3VtZW50LgotCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkgICAgZmkKLQkgIGRvbmUgIyBHb25lIHRocm91Z2ggYWxsIGRlcGxpYnMuCi0JICA7OwotCW1hdGNoX3BhdHRlcm4qKQotCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZAotCSAgbWF0Y2hfcGF0dGVybl9yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMiBcKC4qXCkiYAotCSAgZm9yIGFfZGVwbGliIGluICRkZXBsaWJzOyBkbwotCSAgICBuYW1lPSJgZXhwciAkYV9kZXBsaWIgOiAnLWxcKC4qXCknYCIKLQkgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCi0JICAgIGlmIHRlc3QgLW4gIiRuYW1lIiAmJiB0ZXN0ICIkbmFtZSIgIT0gIjAiOyB0aGVuCi0JICAgICAgbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCSAgICAgIGZvciBpIGluICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbwotCQlwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKLQkJZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbwotCQkgIHBvdGxpYj0iJHBvdGVudF9saWIiICMgc2VlIHN5bWxpbmstY2hlY2sgYmVsb3cgaW4gZmlsZV9tYWdpYyB0ZXN0Ci0JCSAgaWYgZXZhbCBlY2hvIFwiJHBvdGVudF9saWJcIiAyPi9kZXYvbnVsbCBcCi0JCSAgICAgIHwgJHtTRUR9IDEwcSBcCi0JCSAgICAgIHwgZWdyZXAgIiRtYXRjaF9wYXR0ZXJuX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgotCQkgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCQkgICAgYV9kZXBsaWI9IiIKLQkJICAgIGJyZWFrIDIKLQkJICBmaQotCQlkb25lCi0JICAgICAgZG9uZQotCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCi0JCWRyb3BwZWRkZXBzPXllcwotCQllY2hvCi0JCWVjaG8gIioqKiBXYXJuaW5nOiBsaW5rZXIgcGF0aCBkb2VzIG5vdCBoYXZlIHJlYWwgZmlsZSBmb3IgbGlicmFyeSAkYV9kZXBsaWIuIgotCQllY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQllY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQllY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCi0JCWVjaG8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCi0JCWlmIHRlc3QgLXogIiRwb3RsaWIiIDsgdGhlbgotCQkgIGVjaG8gIioqKiB3aXRoICRsaWJuYW1lIGJ1dCBubyBjYW5kaWRhdGVzIHdlcmUgZm91bmQuICguLi5mb3IgcmVnZXggcGF0dGVybiB0ZXN0KSIKLQkJZWxzZQotCQkgIGVjaG8gIioqKiB3aXRoICRsaWJuYW1lIGFuZCBub25lIG9mIHRoZSBjYW5kaWRhdGVzIHBhc3NlZCBhIGZpbGUgZm9ybWF0IHRlc3QiCi0JCSAgZWNobyAiKioqIHVzaW5nIGEgcmVnZXggcGF0dGVybi4gTGFzdCBmaWxlIGNoZWNrZWQ6ICRwb3RsaWIiCi0JCWZpCi0JICAgICAgZmkKLQkgICAgZWxzZQotCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCi0JICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCSAgICBmaQotCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KLQkgIDs7Ci0Jbm9uZSB8IHVua25vd24gfCAqKQotCSAgbmV3ZGVwbGlicz0iIgotCSAgaWYgJGVjaG8gIlggJGRlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyQvLycgXAotCSAgICAgICAtZSAncy8gLVtMUl1bXiBdKi8vZycgLWUgJ3MvWyAJXS8vZycgfAotCSAgICAgZ3JlcCAuID4vZGV2L251bGw7IHRoZW4KLQkgICAgZWNobwotCSAgICBpZiB0ZXN0ICJYJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9ICJYbm9uZSI7IHRoZW4KLQkgICAgICBlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbGF0Zm9ybS4iCi0JICAgIGVsc2UKLQkgICAgICBlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB0byBiZSBzdXBwb3J0ZWQuIgotCSAgICBmaQotCSAgICBlY2hvICIqKiogQWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBiZWluZyBkcm9wcGVkLiIKLQkgICAgZHJvcHBlZGRlcHM9eWVzCi0JICBmaQotCSAgOzsKLQllc2FjCi0JdmVyc3VmZml4PSR2ZXJzdWZmaXhfc2F2ZQotCW1ham9yPSRtYWpvcl9zYXZlCi0JcmVsZWFzZT0kcmVsZWFzZV9zYXZlCi0JbGlibmFtZT0kbGlibmFtZV9zYXZlCi0JbmFtZT0kbmFtZV9zYXZlCi0KLQljYXNlICRob3N0IGluCi0JKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQotCSAgIyBPbiBSaGFwc29keSByZXBsYWNlIHRoZSBDIGxpYnJhcnkgaXMgdGhlIFN5c3RlbSBmcmFtZXdvcmsKLQkgIG5ld2RlcGxpYnM9YCRlY2hvICJYICRuZXdkZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyAtZnJhbWV3b3JrIFN5c3RlbSAvJ2AKLQkgIDs7Ci0JZXNhYwotCi0JaWYgdGVzdCAiJGRyb3BwZWRkZXBzIiA9IHllczsgdGhlbgotCSAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXM7IHRoZW4KLQkgICAgZWNobwotCSAgICBlY2hvICIqKiogV2FybmluZzogbGlidG9vbCBjb3VsZCBub3Qgc2F0aXNmeSBhbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSIKLQkgICAgZWNobyAiKioqIGRlcGVuZGVuY2llcyBvZiBtb2R1bGUgJGxpYm5hbWUuICBUaGVyZWZvcmUsIGxpYnRvb2wgd2lsbCBjcmVhdGUiCi0JICAgIGVjaG8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIgotCSAgICBlY2hvICIqKiogYXBwbGljYXRpb24gaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZy4iCi0JICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0JICAgICAgZWNobwotCSAgICAgIGVjaG8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgotCSAgICAgIGVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCi0JICAgICAgZWNobyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgotCSAgICAgIGVjaG8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgotCSAgICBmaQotCSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KLQkgICAgICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgotCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKLQkgICAgICBidWlsZF9vbGRfbGlicz15ZXMKLQkgICAgZWxzZQotCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCSAgICBmaQotCSAgZWxzZQotCSAgICBlY2hvICIqKiogVGhlIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIHRoYXQgaGF2ZSBiZWVuIGRyb3BwZWQgaGVyZSB3aWxsIGJlIgotCSAgICBlY2hvICIqKiogYXV0b21hdGljYWxseSBhZGRlZCB3aGVuZXZlciBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggdGhpcyBsaWJyYXJ5IgotCSAgICBlY2hvICIqKiogb3IgaXMgZGVjbGFyZWQgdG8gLWRsb3BlbiBpdC4iCi0KLQkgICAgaWYgdGVzdCAkYWxsb3dfdW5kZWZpbmVkID0gbm87IHRoZW4KLQkgICAgICBlY2hvCi0JICAgICAgZWNobyAiKioqIFNpbmNlIHRoaXMgbGlicmFyeSBtdXN0IG5vdCBjb250YWluIHVuZGVmaW5lZCBzeW1ib2xzLCIKLQkgICAgICBlY2hvICIqKiogYmVjYXVzZSBlaXRoZXIgdGhlIHBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgdGhlbSBvciIKLQkgICAgICBlY2hvICIqKiogaXQgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHdpdGggLW5vLXVuZGVmaW5lZCwiCi0JICAgICAgZWNobyAiKioqIGxpYnRvb2wgd2lsbCBvbmx5IGNyZWF0ZSBhIHN0YXRpYyB2ZXJzaW9uIG9mIGl0LiIKLQkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KLQkJb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKLQkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQotCQlidWlsZF9vbGRfbGlicz15ZXMKLQkgICAgICBlbHNlCi0JCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCSAgICAgIGZpCi0JICAgIGZpCi0JICBmaQotCWZpCi0JIyBEb25lIGNoZWNraW5nIGRlcGxpYnMhCi0JZGVwbGlicz0kbmV3ZGVwbGlicwotICAgICAgZmkKLQotICAgICAgIyBBbGwgdGhlIGxpYnJhcnktc3BlY2lmaWMgdmFyaWFibGVzIChpbnN0YWxsX2xpYmRpciBpcyBzZXQgYWJvdmUpLgotICAgICAgbGlicmFyeV9uYW1lcz0KLSAgICAgIG9sZF9saWJyYXJ5PQotICAgICAgZGxuYW1lPQotCi0gICAgICAjIFRlc3QgYWdhaW4sIHdlIG1heSBoYXZlIGRlY2lkZWQgbm90IHRvIGJ1aWxkIGl0IGFueSBtb3JlCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCWlmIHRlc3QgJGhhcmRjb2RlX2ludG9fbGlicyA9IHllczsgdGhlbgotCSAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocwotCSAgaGFyZGNvZGVfbGliZGlycz0KLQkgIGRlcF9ycGF0aD0KLQkgIHJwYXRoPSIkZmluYWxpemVfcnBhdGgiCi0JICB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rICYmIHJwYXRoPSIkY29tcGlsZV9ycGF0aCRycGF0aCIKLQkgIGZvciBsaWJkaXIgaW4gJHJwYXRoOyBkbwotCSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQkJaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JCSAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLQkJZWxzZQotCQkgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkJICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgotCQkgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKLQkJICAgIDs7Ci0JCSAgKikKLQkJICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgotCQkgICAgOzsKLQkJICBlc2FjCi0JCWZpCi0JICAgICAgZWxzZQotCQlldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0JCWRlcF9ycGF0aD0iJGRlcF9ycGF0aCAkZmxhZyIKLQkgICAgICBmaQotCSAgICBlbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQkgICAgICBjYXNlICIkcGVybV9ycGF0aCAiIGluCi0JICAgICAgKiIgJGxpYmRpciAiKikgOzsKLQkgICAgICAqKSBwZXJtX3JwYXRoPSIkcGVybV9ycGF0aCAkbGliZGlyIiA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGRvbmUKLQkgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCi0JICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKLQkgICAgIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCSAgICBsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgotCSAgICBldmFsIGRlcF9ycGF0aD1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQkgIGZpCi0JICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiICYmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgotCSAgICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgotCSAgICBycGF0aD0KLQkgICAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KLQkgICAgICBycGF0aD0iJHJwYXRoJGRpcjoiCi0JICAgIGRvbmUKLQkgICAgZXZhbCAiJHJ1bnBhdGhfdmFyPSckcnBhdGhcJCRydW5wYXRoX3Zhcic7IGV4cG9ydCAkcnVucGF0aF92YXIiCi0JICBmaQotCSAgdGVzdCAtbiAiJGRlcF9ycGF0aCIgJiYgZGVwbGlicz0iJGRlcF9ycGF0aCAkZGVwbGlicyIKLQlmaQotCi0Jc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoIgotCXRlc3QgIiRtb2RlIiAhPSByZWxpbmsgJiYgc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkc2hsaWJwYXRoIgotCWlmIHRlc3QgLW4gIiRzaGxpYnBhdGgiOyB0aGVuCi0JICBldmFsICIkc2hsaWJwYXRoX3Zhcj0nJHNobGlicGF0aFwkJHNobGlicGF0aF92YXInOyBleHBvcnQgJHNobGlicGF0aF92YXIiCi0JZmkKLQotCSMgR2V0IHRoZSByZWFsIGFuZCBsaW5rIG5hbWVzIG9mIHRoZSBsaWJyYXJ5LgotCWV2YWwgbGlicmFyeV9uYW1lcz1cIiRsaWJyYXJ5X25hbWVzX3NwZWNcIgotCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcwotCXJlYWxuYW1lPSIkMiIKLQlzaGlmdDsgc2hpZnQKLQotCWlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KLQkgIGV2YWwgc29uYW1lPVwiJHNvbmFtZV9zcGVjXCIKLQllbHNlCi0JICBzb25hbWU9IiRyZWFsbmFtZSIKLQlmaQotCXRlc3QgLXogIiRkbG5hbWUiICYmIGRsbmFtZT0kc29uYW1lCi0KLQlsaWI9IiRvdXRwdXRfb2JqZGlyLyRyZWFsbmFtZSIKLQlmb3IgbGluawotCWRvCi0JICBsaW5rbmFtZXM9IiRsaW5rbmFtZXMgJGxpbmsiCi0JZG9uZQotCi0JIyBFbnN1cmUgdGhhdCB3ZSBoYXZlIC5vIG9iamVjdHMgZm9yIGxpbmtlcnMgd2hpY2ggZGlzbGlrZSAubG8KLQkjIChlLmcuIGFpeCkgaW4gY2FzZSB3ZSBhcmUgcnVubmluZyAtLWRpc2FibGUtc3RhdGljCi0JZm9yIG9iaiBpbiAkbGlib2JqczsgZG8KLQkgIHhkaXI9YCRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCSAgaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJG9iaiI7IHRoZW4KLQkgICAgeGRpcj0iLiIKLQkgIGVsc2UKLQkgICAgeGRpcj0iJHhkaXIiCi0JICBmaQotCSAgYmFzZW9iaj1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICBvbGRvYmo9YCRlY2hvICJYJGJhc2VvYmoiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkgIGlmIHRlc3QgISAtZiAkeGRpci8kb2xkb2JqOyB0aGVuCi0JICAgICRzaG93ICIoY2QgJHhkaXIgJiYgJHtMTl9TfSAkYmFzZW9iaiAkb2xkb2JqKSIKLQkgICAgJHJ1biBldmFsICcoY2QgJHhkaXIgJiYgJHtMTl9TfSAkYmFzZW9iaiAkb2xkb2JqKScgfHwgZXhpdCAkPwotCSAgZmkKLQlkb25lCi0KLQkjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIHBpYwotCXRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotCi0JIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKLQlpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JICBpZiB0ZXN0ICIkYWx3YXlzX2V4cG9ydF9zeW1ib2xzIiA9IHllcyB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAgICRzaG93ICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKLQkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKLQkgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCi0JICAgIGV2YWwgY21kcz1cIiRleHBvcnRfc3ltYm9sc19jbWRzXCIKLQkgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICAgJHNob3cgIiRjbWQiCi0JICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0JICAgIGRvbmUKLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICAgICAkc2hvdyAiZWdyZXAgLWUgXCIkZXhwb3J0X3N5bWJvbHNfcmVnZXhcIiBcIiRleHBvcnRfc3ltYm9sc1wiID4gXCIke2V4cG9ydF9zeW1ib2xzfVRcIiIKLQkgICAgICAkcnVuIGV2YWwgJ2VncmVwIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkZXhwb3J0X3N5bWJvbHMiID4gIiR7ZXhwb3J0X3N5bWJvbHN9VCInCi0JICAgICAgJHNob3cgIiRtdiBcIiR7ZXhwb3J0X3N5bWJvbHN9VFwiIFwiJGV4cG9ydF9zeW1ib2xzXCIiCi0JICAgICAgJHJ1biBldmFsICckbXYgIiR7ZXhwb3J0X3N5bWJvbHN9VCIgIiRleHBvcnRfc3ltYm9scyInCi0JICAgIGZpCi0JICBmaQotCWZpCi0KLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCi0JICAkcnVuIGV2YWwgJyRlY2hvICJYJGluY2x1ZGVfZXhwc3ltcyIgfCAkU1AyTkwgPj4gIiRleHBvcnRfc3ltYm9scyInCi0JZmkKLQotCWlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgZXZhbCBsaWJvYmpzPVwiXCRsaWJvYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCi0JICBlbHNlCi0JICAgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCi0JICAgICRzaG93ICIke3JtfXIgJGdlbnRvcCIKLQkgICAgJHJ1biAke3JtfXIgIiRnZW50b3AiCi0JICAgICRzaG93ICJta2RpciAkZ2VudG9wIgotCSAgICAkcnVuIG1rZGlyICIkZ2VudG9wIgotCSAgICBzdGF0dXM9JD8KLQkgICAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAiJGdlbnRvcCI7IHRoZW4KLQkgICAgICBleGl0ICRzdGF0dXMKLQkgICAgZmkKLQkgICAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCi0KLQkgICAgZm9yIHhsaWIgaW4gJGNvbnZlbmllbmNlOyBkbwotCSAgICAgICMgRXh0cmFjdCB0aGUgb2JqZWN0cy4KLQkgICAgICBjYXNlICR4bGliIGluCi0JICAgICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSB4YWJzPSIkeGxpYiIgOzsKLQkgICAgICAqKSB4YWJzPWBwd2RgIi8keGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgICAgeGxpYj1gJGVjaG8gIlgkeGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgICAgIHhkaXI9IiRnZW50b3AvJHhsaWIiCi0KLQkgICAgICAkc2hvdyAiJHtybX1yICR4ZGlyIgotCSAgICAgICRydW4gJHtybX1yICIkeGRpciIKLQkgICAgICAkc2hvdyAibWtkaXIgJHhkaXIiCi0JICAgICAgJHJ1biBta2RpciAiJHhkaXIiCi0JICAgICAgc3RhdHVzPSQ/Ci0JICAgICAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAiJHhkaXIiOyB0aGVuCi0JCWV4aXQgJHN0YXR1cwotCSAgICAgIGZpCi0JICAgICAgJHNob3cgIihjZCAkeGRpciAmJiAkQVIgeCAkeGFicykiCi0JICAgICAgJHJ1biBldmFsICIoY2QgXCR4ZGlyICYmICRBUiB4IFwkeGFicykiIHx8IGV4aXQgJD8KLQotCSAgICAgIGxpYm9ianM9IiRsaWJvYmpzICJgZmluZCAkeGRpciAtbmFtZSBcKi5vIC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkTkwyU1BgCi0JICAgIGRvbmUKLQkgIGZpCi0JZmkKLQotCWlmIHRlc3QgIiR0aHJlYWRfc2FmZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJHRocmVhZF9zYWZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgIGV2YWwgZmxhZz1cIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWNcIgotCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRmbGFnIgotCWZpCi0KLQkjIE1ha2UgYSBiYWNrdXAgb2YgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgd2hlbiByZWxpbmtpbmcKLQlpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KLQkgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAke3JlYWxuYW1lfVUgJiYgJG12ICRyZWFsbmFtZSAke3JlYWxuYW1lfVUpJyB8fCBleGl0ICQ/Ci0JZmkKLQotCSMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgotCSAgZXZhbCBjbWRzPVwiJGFyY2hpdmVfZXhwc3ltX2NtZHNcIgotCWVsc2UKLQkgIHNhdmVfZGVwbGlicz0iJGRlcGxpYnMiCi0JICBmb3IgY29udiBpbiAkY29udmVuaWVuY2U7IGRvCi0JICAgIHRtcF9kZXBsaWJzPQotCSAgICBmb3IgdGVzdF9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCi0JICAgICAgaWYgdGVzdCAiJHRlc3RfZGVwbGliIiAhPSAiJGNvbnYiOyB0aGVuCi0JCXRtcF9kZXBsaWJzPSIkdG1wX2RlcGxpYnMgJHRlc3RfZGVwbGliIgotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgICAgZGVwbGlicz0iJHRtcF9kZXBsaWJzIgotCSAgZG9uZQotCSAgZXZhbCBjbWRzPVwiJGFyY2hpdmVfY21kc1wiCi0JICBkZXBsaWJzPSIkc2F2ZV9kZXBsaWJzIgotCWZpCi0Jc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgIElGUz0iJHNhdmVfaWZzIgotCSAgJHNob3cgIiRjbWQiCi0JICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQlkb25lCi0JSUZTPSIkc2F2ZV9pZnMiCi0KLQkjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKLQlpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KLQkgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAke3JlYWxuYW1lfVQgJiYgJG12ICRyZWFsbmFtZSAke3JlYWxuYW1lfVQgJiYgJG12ICIkcmVhbG5hbWUiVSAkcmVhbG5hbWUpJyB8fCBleGl0ICQ/Ci0JICBleGl0IDAKLQlmaQotCi0JIyBDcmVhdGUgbGlua3MgdG8gdGhlIHJlYWwgbGlicmFyeS4KLQlmb3IgbGlua25hbWUgaW4gJGxpbmtuYW1lczsgZG8KLQkgIGlmIHRlc3QgIiRyZWFsbmFtZSIgIT0gIiRsaW5rbmFtZSI7IHRoZW4KLQkgICAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgotCSAgICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpJyB8fCBleGl0ICQ/Ci0JICBmaQotCWRvbmUKLQotCSMgSWYgLW1vZHVsZSBvciAtZXhwb3J0LWR5bmFtaWMgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBkbG5hbWUuCi0JaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgfHwgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllczsgdGhlbgotCSAgIyBPbiBhbGwga25vd24gb3BlcmF0aW5nIHN5c3RlbXMsIHRoZXNlIGFyZSBpZGVudGljYWwuCi0JICBkbG5hbWU9IiRzb25hbWUiCi0JZmkKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgb2JqKQotICAgICAgaWYgdGVzdCAtbiAiJGRlcGxpYnMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJwYXRoJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLVInIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgJG91dHB1dCBpbgotICAgICAgKi5sbykKLQlpZiB0ZXN0IC1uICIkb2JqcyRvbGRfZGVwbGlicyI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJyYXJ5IG9iamVjdCBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQlsaWJvYmo9IiRvdXRwdXQiCi0Jb2JqPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQk7OwotICAgICAgKikKLQlsaWJvYmo9Ci0Jb2JqPSIkb3V0cHV0IgotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgRGVsZXRlIHRoZSBvbGQgb2JqZWN0cy4KLSAgICAgICRydW4gJHJtICRvYmogJGxpYm9iagotCi0gICAgICAjIE9iamVjdHMgZnJvbSBjb252ZW5pZW5jZSBsaWJyYXJpZXMuICBUaGlzIGFzc3VtZXMKLSAgICAgICMgc2luZ2xlLXZlcnNpb24gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgV2hlbmV2ZXIgd2UgY3JlYXRlCi0gICAgICAjIGRpZmZlcmVudCBvbmVzIGZvciBQSUMvbm9uLVBJQywgdGhpcyB3ZSdsbCBoYXZlIHRvIGR1cGxpY2F0ZQotICAgICAgIyB0aGUgZXh0cmFjdGlvbi4KLSAgICAgIHJlbG9hZF9jb252X29ianM9Ci0gICAgICBnZW50b3A9Ci0gICAgICAjIHJlbG9hZF9jbWRzIHJ1bnMgJExEIGRpcmVjdGx5LCBzbyBsZXQgdXMgZ2V0IHJpZCBvZgotICAgICAgIyAtV2wgZnJvbSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYwotICAgICAgd2w9Ci0KLSAgICAgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCi0JICBldmFsIHJlbG9hZF9jb252X29ianM9XCJcJHJlbG9hZF9vYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCi0JZWxzZQotCSAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke29ian14IgotCSAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgotCSAgJHJ1biAke3JtfXIgIiRnZW50b3AiCi0JICAkc2hvdyAibWtkaXIgJGdlbnRvcCIKLQkgICRydW4gbWtkaXIgIiRnZW50b3AiCi0JICBzdGF0dXM9JD8KLQkgIGlmIHRlc3QgJHN0YXR1cyAtbmUgMCAmJiB0ZXN0ICEgLWQgIiRnZW50b3AiOyB0aGVuCi0JICAgIGV4aXQgJHN0YXR1cwotCSAgZmkKLQkgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgotCi0JICBmb3IgeGxpYiBpbiAkY29udmVuaWVuY2U7IGRvCi0JICAgICMgRXh0cmFjdCB0aGUgb2JqZWN0cy4KLQkgICAgY2FzZSAkeGxpYiBpbgotCSAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHhhYnM9IiR4bGliIiA7OwotCSAgICAqKSB4YWJzPWBwd2RgIi8keGxpYiIgOzsKLQkgICAgZXNhYwotCSAgICB4bGliPWAkZWNobyAiWCR4bGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICAgIHhkaXI9IiRnZW50b3AvJHhsaWIiCi0KLQkgICAgJHNob3cgIiR7cm19ciAkeGRpciIKLQkgICAgJHJ1biAke3JtfXIgIiR4ZGlyIgotCSAgICAkc2hvdyAibWtkaXIgJHhkaXIiCi0JICAgICRydW4gbWtkaXIgIiR4ZGlyIgotCSAgICBzdGF0dXM9JD8KLQkgICAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAiJHhkaXIiOyB0aGVuCi0JICAgICAgZXhpdCAkc3RhdHVzCi0JICAgIGZpCi0JICAgICRzaG93ICIoY2QgJHhkaXIgJiYgJEFSIHggJHhhYnMpIgotCSAgICAkcnVuIGV2YWwgIihjZCBcJHhkaXIgJiYgJEFSIHggXCR4YWJzKSIgfHwgZXhpdCAkPwotCi0JICAgIHJlbG9hZF9jb252X29ianM9IiRyZWxvYWRfb2JqcyAiYGZpbmQgJHhkaXIgLW5hbWUgXCoubyAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJE5MMlNQYAotCSAgZG9uZQotCWZpCi0gICAgICBmaQotCi0gICAgICAjIENyZWF0ZSB0aGUgb2xkLXN0eWxlIG9iamVjdC4KLSAgICAgIHJlbG9hZF9vYmpzPSIkb2JqcyRvbGRfZGVwbGlicyAiYCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0kJy9kJyAtZSAnL1wubGliJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYCIgJHJlbG9hZF9jb252X29ianMiICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAotCi0gICAgICBvdXRwdXQ9IiRvYmoiCi0gICAgICBldmFsIGNtZHM9XCIkcmVsb2FkX2NtZHNcIgotICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0gICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCUlGUz0iJHNhdmVfaWZzIgotCSRzaG93ICIkY21kIgotCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotICAgICAgZG9uZQotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgICAgICMgRXhpdCBpZiB3ZSBhcmVuJ3QgZG9pbmcgYSBsaWJyYXJ5IG9iamVjdCBmaWxlLgotICAgICAgaWYgdGVzdCAteiAiJGxpYm9iaiI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgotCSAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgotCSAgJHJ1biAke3JtfXIgJGdlbnRvcAotCWZpCi0KLQlleGl0IDAKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgotCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCi0JICAkc2hvdyAiJHtybX1yICRnZW50b3AiCi0JICAkcnVuICR7cm19ciAkZ2VudG9wCi0JZmkKLQotCSMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvbid0Ci0JIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KLQkkc2hvdyAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIgotCSRydW4gZXZhbCAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIiB8fCBleGl0ICQ/Ci0JZXhpdCAwCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcGljX2ZsYWciIHx8IHRlc3QgIiRwaWNfbW9kZSIgIT0gZGVmYXVsdDsgdGhlbgotCSMgT25seSBkbyBjb21tYW5kcyBpZiB3ZSByZWFsbHkgaGF2ZSBkaWZmZXJlbnQgUElDIG9iamVjdHMuCi0JcmVsb2FkX29ianM9IiRsaWJvYmpzICRyZWxvYWRfY29udl9vYmpzIgotCW91dHB1dD0iJGxpYm9iaiIKLQlldmFsIGNtZHM9XCIkcmVsb2FkX2NtZHNcIgotCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCWZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgICRzaG93ICIkY21kIgotCSAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0JZG9uZQotCUlGUz0iJHNhdmVfaWZzIgotICAgICAgZWxzZQotCSMgSnVzdCBjcmVhdGUgYSBzeW1saW5rLgotCSRzaG93ICRybSAkbGlib2JqCi0JJHJ1biAkcm0gJGxpYm9iagotCXhkaXI9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCWlmIHRlc3QgIlgkeGRpciIgPSAiWCRsaWJvYmoiOyB0aGVuCi0JICB4ZGlyPSIuIgotCWVsc2UKLQkgIHhkaXI9IiR4ZGlyIgotCWZpCi0JYmFzZW9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0Jb2xkb2JqPWAkZWNobyAiWCRiYXNlb2JqIiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JJHNob3cgIihjZCAkeGRpciAmJiAkTE5fUyAkb2xkb2JqICRiYXNlb2JqKSIKLQkkcnVuIGV2YWwgJyhjZCAkeGRpciAmJiAkTE5fUyAkb2xkb2JqICRiYXNlb2JqKScgfHwgZXhpdCAkPwotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KLQkkc2hvdyAiJHtybX1yICRnZW50b3AiCi0JJHJ1biAke3JtfXIgJGdlbnRvcAotICAgICAgZmkKLQotICAgICAgZXhpdCAwCi0gICAgICA7OwotCi0gICAgcHJvZykKLSAgICAgIGNhc2UgJGhvc3QgaW4KLQkqY3lnd2luKikgb3V0cHV0PWBlY2hvICRvdXRwdXQgfCAke1NFRH0gLWUgJ3MsLmV4ZSQsLDtzLCQsLmV4ZSwnYCA7OwotICAgICAgZXNhYwotICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0gdW5rbm93biAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiID0gdW5rbm93biAmJgotCSAgIHRlc3QgIiRkbG9wZW5fc2VsZl9zdGF0aWMiID0gdW5rbm93bjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGBBQ19MSUJUT09MX0RMT1BFTicgbm90IHVzZWQuIEFzc3VtaW5nIG5vIGRsb3BlbiBzdXBwb3J0LiIKLQlmaQotICAgICAgZmkKLQotICAgICAgY2FzZSAkaG9zdCBpbgotICAgICAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQotCSMgT24gUmhhcHNvZHkgcmVwbGFjZSB0aGUgQyBsaWJyYXJ5IGlzIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCi0JY29tcGlsZV9kZXBsaWJzPWAkZWNobyAiWCAkY29tcGlsZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyAtZnJhbWV3b3JrIFN5c3RlbSAvJ2AKLQlmaW5hbGl6ZV9kZXBsaWJzPWAkZWNobyAiWCAkZmluYWxpemVfZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gLWZyYW1ld29yayBTeXN0ZW0gLydgCi0JY2FzZSAkaG9zdCBpbgotCSpkYXJ3aW4qKQotCSAgIyBEb24ndCBhbGxvdyBsYXp5IGxpbmtpbmcsIGl0IGJyZWFrcyBDKysgZ2xvYmFsIGNvbnN0cnVjdG9ycwotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICR7d2x9LWJpbmRfYXRfbG9hZCIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICR7d2x9LWJpbmRfYXRfbG9hZCIKLQkgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkY29tcGlsZV9kZXBsaWJzIgotICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGZpbmFsaXplX2RlcGxpYnMiCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCR4cnBhdGgiOyB0aGVuCi0JIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgotCWZvciBsaWJkaXIgaW4gJHJwYXRoICR4cnBhdGg7IGRvCi0JICAjIFRoaXMgaXMgdGhlIG1hZ2ljIHRvIHVzZSAtcnBhdGguCi0JICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlkb25lCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocwotICAgICAgcnBhdGg9Ci0gICAgICBoYXJkY29kZV9saWJkaXJzPQotICAgICAgZm9yIGxpYmRpciBpbiAkY29tcGlsZV9ycGF0aCAkZmluYWxpemVfcnBhdGg7IGRvCi0JaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLQkgICAgZWxzZQotCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgotCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKLQkJOzsKLQkgICAgICAqKQotCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKLQkgIGZpCi0JZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JICBjYXNlICIkcGVybV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotCWNhc2UgJGhvc3QgaW4KLQkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKikKLQkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgotCSAgKiI6JGxpYmRpcjoiKikgOzsKLQkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRsaWJkaXIiOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KLSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgotCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgotCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotICAgICAgZmkKLSAgICAgIGNvbXBpbGVfcnBhdGg9IiRycGF0aCIKLQotICAgICAgcnBhdGg9Ci0gICAgICBoYXJkY29kZV9saWJkaXJzPQotICAgICAgZm9yIGxpYmRpciBpbiAkZmluYWxpemVfcnBhdGg7IGRvCi0JaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLQkgICAgZWxzZQotCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgotCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKLQkJOzsKLQkgICAgICAqKQotCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKLQkgIGZpCi0JZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JICBjYXNlICIkZmluYWxpemVfcGVybV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgZmluYWxpemVfcGVybV9ycGF0aD0iJGZpbmFsaXplX3Blcm1fcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotICAgICAgZG9uZQotICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KLSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgotCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgotCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotICAgICAgZmkKLSAgICAgIGZpbmFsaXplX3JwYXRoPSIkcnBhdGgiCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRsaWJvYmpzIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JIyBUcmFuc2Zvcm0gYWxsIHRoZSBsaWJyYXJ5IG9iamVjdHMgaW50byBzdGFuZGFyZCBvYmplY3RzLgotCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0JZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotICAgICAgZmkKLQotICAgICAgZGxzeW1zPQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KLQlpZiB0ZXN0IC1uICIkTk0iICYmIHRlc3QgLW4gIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0JICBkbHN5bXM9IiR7b3V0cHV0bmFtZX1TLmMiCi0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gZXh0cmFjdCBnbG9iYWwgc3ltYm9scyBmcm9tIGRscHJlb3BlbmVkIGZpbGVzIiAxPiYyCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkbHN5bXMiOyB0aGVuCi0JY2FzZSAkZGxzeW1zIGluCi0JIiIpIDs7Ci0JKi5jKQotCSAgIyBEaXNjb3ZlciB0aGUgbmxpc3Qgb2YgZWFjaCBvZiB0aGUgZGxmaWxlcy4KLQkgIG5saXN0PSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Lm5tIgotCi0JICAkc2hvdyAiJHJtICRubGlzdCAke25saXN0fVMgJHtubGlzdH1UIgotCSAgJHJ1biAkcm0gIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCIKLQotCSAgIyBQYXJzZSB0aGUgbmFtZSBsaXN0IGludG8gYSBzb3VyY2UgZmlsZS4KLQkgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0X29iamRpci8kZGxzeW1zIgotCi0JICB0ZXN0IC16ICIkcnVuIiAmJiAkZWNobyA+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAotLyogJGRsc3ltcyAtIHN5bWJvbCByZXNvbHV0aW9uIHRhYmxlIGZvciBcYCRvdXRwdXRuYW1lJyBkbHN5bSBlbXVsYXRpb24uICovCi0vKiBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuIFwiQ1wiIHsKLSNlbmRpZgotCi0vKiBQcmV2ZW50IHRoZSBvbmx5IGtpbmQgb2YgZGVjbGFyYXRpb24gY29uZmxpY3RzIHdlIGNhbiBtYWtlLiAqLwotI2RlZmluZSBsdF9wcmVsb2FkZWRfc3ltYm9scyBzb21lX290aGVyX3N5bWJvbAotCi0vKiBFeHRlcm5hbCBzeW1ib2wgZGVjbGFyYXRpb25zIGZvciB0aGUgY29tcGlsZXIuICovXAotIgotCi0JICBpZiB0ZXN0ICIkZGxzZWxmIiA9IHllczsgdGhlbgotCSAgICAkc2hvdyAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkb3V0cHV0JyIKLQotCSAgICB0ZXN0IC16ICIkcnVuIiAmJiAkZWNobyAnOiBAUFJPR1JBTUAgJyA+ICIkbmxpc3QiCi0KLQkgICAgIyBBZGQgb3VyIG93biBwcm9ncmFtIG9iamVjdHMgdG8gdGhlIHN5bWJvbCBsaXN0LgotCSAgICBwcm9nZmlsZXM9YCRlY2hvICJYJG9ianMkb2xkX2RlcGxpYnMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLQkgICAgZm9yIGFyZyBpbiAkcHJvZ2ZpbGVzOyBkbwotCSAgICAgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgotCSAgICAgICRydW4gZXZhbCAiJE5NICRhcmcgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgotCSAgICBkb25lCi0KLQkgICAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KLQkgICAgICAkcnVuIGV2YWwgJ2VncmVwIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCi0JICAgICAgJHJ1biBldmFsICckbXYgIiRubGlzdCJUICIkbmxpc3QiJwotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICAgICAkcnVuIGV2YWwgJ2VncmVwIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgICRydW4gZXZhbCAnJG12ICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgZmkKLQotCSAgICAjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scwotCSAgICBpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JICAgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRvdXRwdXQuZXhwIgotCSAgICAgICRydW4gJHJtICRleHBvcnRfc3ltYm9scwotCSAgICAgICRydW4gZXZhbCAiJHtTRUR9IC1uIC1lICcvXjogQFBST0dSQU1AJC9kJyAtZSAncy9eLiogXCguKlwpJC9cMS9wJyAiJzwgIiRubGlzdCIgPiAiJGV4cG9ydF9zeW1ib2xzIicKLQkgICAgZWxzZQotCSAgICAgICRydW4gZXZhbCAiJHtTRUR9IC1lICdzL1woW11bLipeJF1cKS9cXFwxL2cnIC1lICdzL14vIC8nIC1lICdzLyQvJC8nIicgPCAiJGV4cG9ydF9zeW1ib2xzIiA+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0LmV4cCInCi0JICAgICAgJHJ1biBldmFsICdncmVwIC1mICIkb3V0cHV0X29iamRpci8kb3V0cHV0LmV4cCIgPCAiJG5saXN0IiA+ICIkbmxpc3QiVCcKLQkgICAgICAkcnVuIGV2YWwgJ212ICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgZmkKLQkgIGZpCi0KLQkgIGZvciBhcmcgaW4gJGRscHJlZmlsZXM7IGRvCi0JICAgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgotCSAgICBuYW1lPWBlY2hvICIkYXJnIiB8ICR7U0VEfSAtZSAncyVeLiovJSUnYAotCSAgICAkcnVuIGV2YWwgJ2VjaG8gIjogJG5hbWUgIiA+PiAiJG5saXN0IicKLQkgICAgJHJ1biBldmFsICIkTk0gJGFyZyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCi0JICBkb25lCi0KLQkgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3QgYW4gZW1wdHkgZmlsZS4KLQkgICAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKLQotCSAgICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgICAgIGVncmVwIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQKLQkgICAgICAkbXYgIiRubGlzdCJUICIkbmxpc3QiCi0JICAgIGZpCi0KLQkgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLQkgICAgaWYgZ3JlcCAtdiAiXjogIiA8ICIkbmxpc3QiIHwKLQkJaWYgc29ydCAtayAzIDwvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCSAgc29ydCAtayAzCi0JCWVsc2UKLQkJICBzb3J0ICsyCi0JCWZpIHwKLQkJdW5pcSA+ICIkbmxpc3QiUzsgdGhlbgotCSAgICAgIDoKLQkgICAgZWxzZQotCSAgICAgIGdyZXAgLXYgIl46ICIgPCAiJG5saXN0IiA+ICIkbmxpc3QiUwotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgLWYgIiRubGlzdCJTOyB0aGVuCi0JICAgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiUyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyInCi0JICAgIGVsc2UKLQkgICAgICBlY2hvICcvKiBOT05FICovJyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIKLQkgICAgZmkKLQotCSAgICAkZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKLQotI3VuZGVmIGx0X3ByZWxvYWRlZF9zeW1ib2xzCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0ciB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHIgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyIGFkZHJlc3M7Ci19Ci1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXtcCi0iCi0KLQkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MiIDwgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCi0KLQkgICAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0gIHswLCAobHRfcHRyKSAwfQotfTsKLQotLyogVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIGluIEZyZWVCU0QgbGlua2VyICovCi0jaWZkZWYgRlJFRUJTRF9XT1JLQVJPVU5ECi1zdGF0aWMgY29uc3Qgdm9pZCAqbHRfcHJlbG9hZGVkX3NldHVwKCkgewotICByZXR1cm4gbHRfcHJlbG9hZGVkX3N5bWJvbHM7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWZcCi0iCi0JICBmaQotCi0JICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9Ci0JICBjYXNlICRob3N0IGluCi0JICAjIGNvbXBpbGluZyB0aGUgc3ltYm9sIHRhYmxlIGZpbGUgd2l0aCBwaWNfZmxhZyB3b3JrcyBhcm91bmQKLQkgICMgYSBGcmVlQlNEIGJ1ZyB0aGF0IGNhdXNlcyBwcm9ncmFtcyB0byBjcmFzaCB3aGVuIC1sbSBpcwotCSAgIyBsaW5rZWQgYmVmb3JlIGFueSBvdGhlciBQSUMgb2JqZWN0LiAgQnV0IHdlIG11c3Qgbm90IHVzZQotCSAgIyBwaWNfZmxhZyB3aGVuIGxpbmtpbmcgd2l0aCAtc3RhdGljLiAgVGhlIHByb2JsZW0gZXhpc3RzIGluCi0JICAjIEZyZWVCU0QgMi4yLjYgYW5kIGlzIGZpeGVkIGluIEZyZWVCU0QgMy4xLgotCSAgKi0qLWZyZWVic2QyKnwqLSotZnJlZWJzZDMuMCp8Ki0qLWZyZWVic2RlbGYzLjAqKQotCSAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLXN0YXRpYyAiKikgOzsKLQkgICAgKikgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIC1EUElDIC1ERlJFRUJTRF9XT1JLQVJPVU5EIjs7Ci0JICAgIGVzYWM7OwotCSAgKi0qLWhwdXgqKQotCSAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLXN0YXRpYyAiKikgOzsKLQkgICAgKikgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIC1EUElDIjs7Ci0JICAgIGVzYWMKLQkgIGVzYWMKLQotCSAgIyBOb3cgY29tcGlsZSB0aGUgZHluYW1pYyBzeW1ib2wgZmlsZS4KLQkgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJENDIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgXCIkZGxzeW1zXCIpIgotCSAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJENDIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgIiRkbHN5bXMiKScgfHwgZXhpdCAkPwotCi0JICAjIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCi0JICAkc2hvdyAiJHJtICRvdXRwdXRfb2JqZGlyLyRkbHN5bXMgJG5saXN0ICR7bmxpc3R9UyAke25saXN0fVQiCi0JICAkcnVuICRybSAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCIKLQotCSAgIyBUcmFuc2Zvcm0gdGhlIHN5bWJvbCBmaWxlIGludG8gdGhlIGNvcnJlY3QgbmFtZS4KLQkgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0lImAKLQkgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAotCSAgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBzdWZmaXggZm9yIFxgJGRsc3ltcyciIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0gICAgICBlbHNlCi0JIyBXZSBrZWVwIGdvaW5nIGp1c3QgaW4gY2FzZSB0aGUgdXNlciBkaWRuJ3QgcmVmZXIgdG8KLQkjIGx0X3ByZWxvYWRlZF9zeW1ib2xzLiAgVGhlIGxpbmtlciB3aWxsIGZhaWwgaWYgZ2xvYmFsX3N5bWJvbF9waXBlCi0JIyByZWFsbHkgd2FzIHJlcXVpcmVkLgotCi0JIyBOdWxsaWZ5IHRoZSBzeW1ib2wgZmlsZS4KLQljb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAotCWZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgJG5lZWRfcmVsaW5rID0gbm8gfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0JIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAotCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCi0JIyBXZSBoYXZlIG5vIHVuaW5zdGFsbGVkIGxpYnJhcnkgZGVwZW5kZW5jaWVzLCBzbyBmaW5hbGl6ZSByaWdodCBub3cuCi0JJHNob3cgIiRsaW5rX2NvbW1hbmQiCi0JJHJ1biBldmFsICIkbGlua19jb21tYW5kIgotCXN0YXR1cz0kPwotCi0JIyBEZWxldGUgdGhlIGdlbmVyYXRlZCBmaWxlcy4KLQlpZiB0ZXN0IC1uICIkZGxzeW1zIjsgdGhlbgotCSAgJHNob3cgIiRybSAkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iCi0JICAkcnVuICRybSAiJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9IgotCWZpCi0KLQlleGl0ICRzdGF0dXMKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotCSMgV2Ugc2hvdWxkIHNldCB0aGUgc2hsaWJwYXRoX3ZhcgotCXJwYXRoPQotCWZvciBkaXIgaW4gJHRlbXBfcnBhdGg7IGRvCi0JICBjYXNlICRkaXIgaW4KLQkgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikKLQkgICAgIyBBYnNvbHV0ZSBwYXRoLgotCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCi0JICAgIDs7Ci0JICAqKQotCSAgICAjIFJlbGF0aXZlIHBhdGg6IGFkZCBhIHRoaXNkaXIgZW50cnkuCi0JICAgIHJwYXRoPSIkcnBhdGhcJHRoaXNkaXIvJGRpcjoiCi0JICAgIDs7Ci0JICBlc2FjCi0JZG9uZQotCXRlbXBfcnBhdGg9IiRycGF0aCIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCi0JY29tcGlsZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGNvbXBpbGVfY29tbWFuZCIKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0IC1uICIkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgotCWZpbmFsaXplX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkZmluYWxpemVfY29tbWFuZCIKLSAgICAgIGZpCi0KLSAgICAgIGNvbXBpbGVfdmFyPQotICAgICAgZmluYWxpemVfdmFyPQotICAgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCWlmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgotCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KLQkgIHJwYXRoPQotCSAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgZG9uZQotCSAgY29tcGlsZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgotCWZpCi0JaWYgdGVzdCAtbiAiJGZpbmFsaXplX3Blcm1fcnBhdGgiOyB0aGVuCi0JICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgotCSAgcnBhdGg9Ci0JICBmb3IgZGlyIGluICRmaW5hbGl6ZV9wZXJtX3JwYXRoOyBkbwotCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCi0JICBkb25lCi0JICBmaW5hbGl6ZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgotCWZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbm9faW5zdGFsbCIgPSB5ZXM7IHRoZW4KLQkjIFdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIGEgd3JhcHBlciBzY3JpcHQuCi0JbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCi0JIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotCWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAotCSMgRGVsZXRlIHRoZSBvbGQgb3V0cHV0IGZpbGUuCi0JJHJ1biAkcm0gJG91dHB1dAotCSMgTGluayB0aGUgZXhlY3V0YWJsZSBhbmQgZXhpdAotCSRzaG93ICIkbGlua19jb21tYW5kIgotCSRydW4gZXZhbCAiJGxpbmtfY29tbWFuZCIgfHwgZXhpdCAkPwotCWV4aXQgMAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KLQkjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLQlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQlyZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgotCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogdGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBsaWtlIHVuaW5zdGFsbGVkIHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKLQkkZWNobyAiJG1vZGVuYW1lOiBcYCRvdXRwdXQnIHdpbGwgYmUgcmVsaW5rZWQgZHVyaW5nIGluc3RhbGxhdGlvbiIgMT4mMgotICAgICAgZWxzZQotCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiICE9IG5vOyB0aGVuCi0JICBsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkY29tcGlsZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgotCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJVwkcHJvZ2Rpci9cJGZpbGUlZydgCi0JICBlbHNlCi0JICAgICMgZmFzdF9pbnN0YWxsIGlzIHNldCB0byBuZWVkbGVzcwotCSAgICByZWxpbmtfY29tbWFuZD0KLQkgIGZpCi0JZWxzZQotCSAgbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCi0JICByZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0gICAgICBsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJGxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIiclZydgCi0KLSAgICAgICMgRGVsZXRlIHRoZSBvbGQgb3V0cHV0IGZpbGVzLgotICAgICAgJHJ1biAkcm0gJG91dHB1dCAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSAkb3V0cHV0X29iamRpci9sdC0kb3V0cHV0bmFtZQotCi0gICAgICAkc2hvdyAiJGxpbmtfY29tbWFuZCIKLSAgICAgICRydW4gZXZhbCAiJGxpbmtfY29tbWFuZCIgfHwgZXhpdCAkPwotCi0gICAgICAjIE5vdyBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0LgotICAgICAgJHNob3cgImNyZWF0aW5nICRvdXRwdXQiCi0KLSAgICAgICMgUXVvdGUgdGhlIHJlbGluayBjb21tYW5kIGZvciBzaGlwcGluZy4KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KLQkjIFByZXNlcnZlIGFueSB2YXJpYWJsZXMgdGhhdCBtYXkgYWZmZWN0IGNvbXBpbGVyIGJlaGF2aW9yCi0JZm9yIHZhciBpbiAkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms7IGRvCi0JICBpZiBldmFsIHRlc3QgLXogXCJcJHskdmFyK3NldH1cIjsgdGhlbgotCSAgICByZWxpbmtfY29tbWFuZD0ieyB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCIgfHwgdW5zZXQgJHZhciB8fCB7ICR2YXI9OyBleHBvcnQgJHZhcjsgfTsgfTsgJHJlbGlua19jb21tYW5kIgotCSAgZWxpZiBldmFsIHZhcl92YWx1ZT1cJCR2YXI7IHRlc3QgLXogIiR2YXJfdmFsdWUiOyB0aGVuCi0JICAgIHJlbGlua19jb21tYW5kPSIkdmFyPTsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKLQkgIGVsc2UKLQkgICAgdmFyX3ZhbHVlPWAkZWNobyAiWCR2YXJfdmFsdWUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCSAgICByZWxpbmtfY29tbWFuZD0iJHZhcj1cIiR2YXJfdmFsdWVcIjsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKLQkgIGZpCi0JZG9uZQotCXJlbGlua19jb21tYW5kPSIoY2QgYHB3ZGA7ICRyZWxpbmtfY29tbWFuZCkiCi0JcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGZpCi0KLSAgICAgICMgUXVvdGUgJGVjaG8gZm9yIHNoaXBwaW5nLgotICAgICAgaWYgdGVzdCAiWCRlY2hvIiA9ICJYJFNIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KLQljYXNlICQwIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBxZWNobz0iJFNIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7OwotCSopIHFlY2hvPSIkU0hFTEwgYHB3ZGAvJDAgLS1mYWxsYmFjay1lY2hvIjs7Ci0JZXNhYwotCXFlY2hvPWAkZWNobyAiWCRxZWNobyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBlbHNlCi0JcWVjaG89YCRlY2hvICJYJGVjaG8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgZmkKLQotICAgICAgIyBPbmx5IGFjdHVhbGx5IGRvIHRoaW5ncyBpZiBvdXIgcnVuIGNvbW1hbmQgaXMgbm9uLW51bGwuCi0gICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCSMgd2luMzIgd2lsbCB0aGluayB0aGUgc2NyaXB0IGlzIGEgYmluYXJ5IGlmIGl0IGhhcwotCSMgYSAuZXhlIHN1ZmZpeCwgc28gd2Ugc3RyaXAgaXQgb2ZmIGhlcmUuCi0JY2FzZSAkb3V0cHV0IGluCi0JICAqLmV4ZSkgb3V0cHV0PWBlY2hvICRvdXRwdXR8JHtTRUR9ICdzLC5leGUkLCwnYCA7OwotCWVzYWMKLQkjIHRlc3QgZm9yIGN5Z3dpbiBiZWNhdXNlIG12IGZhaWxzIHcvbyAuZXhlIGV4dGVuc2lvbnMKLQljYXNlICRob3N0IGluCi0JICAqY3lnd2luKikgZXhlZXh0PS5leGUgOzsKLQkgICopIGV4ZWV4dD0gOzsKLQllc2FjCi0JJHJtICRvdXRwdXQKLQl0cmFwICIkcm0gJG91dHB1dDsgZXhpdCAxIiAxIDIgMTUKLQotCSRlY2hvID4gJG91dHB1dCAiXAotIyEgJFNIRUxMCi0KLSMgJG91dHB1dCAtIHRlbXBvcmFyeSB3cmFwcGVyIHNjcmlwdCBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQotIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCi0jCi0jIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAotIyBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCi0jCi0jIFRoaXMgd3JhcHBlciBzY3JpcHQgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgotIyBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPSIke1NFRH0iJyAtZSAxcy9eWC8vJwotc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JwotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotaWYgdGVzdCBcIlwke0NEUEFUSCtzZXR9XCIgPSBzZXQ7IHRoZW4gQ0RQQVRIPTo7IGV4cG9ydCBDRFBBVEg7IGZpCi0KLXJlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIKLQotIyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGRldGVybWluZXMgb3VyIG9wZXJhdGlvbiBtb2RlLgotaWYgdGVzdCBcIlwkbGlidG9vbF9pbnN0YWxsX21hZ2ljXCIgPSBcIiRtYWdpY1wiOyB0aGVuCi0gICMgaW5zdGFsbCBtb2RlIG5lZWRzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGU6Ci0gIG5vdGluc3RfZGVwbGlicz0nJG5vdGluc3RfZGVwbGlicycKLWVsc2UKLSAgIyBXaGVuIHdlIGFyZSBzb3VyY2VkIGluIGV4ZWN1dGUgbW9kZSwgXCRmaWxlIGFuZCBcJGVjaG8gYXJlIGFscmVhZHkgc2V0LgotICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiAhPSBcIiRtYWdpY1wiOyB0aGVuCi0gICAgZWNobz1cIiRxZWNob1wiCi0gICAgZmlsZT1cIlwkMFwiCi0gICAgIyBNYWtlIHN1cmUgZWNobyB3b3Jrcy4KLSAgICBpZiB0ZXN0IFwiWFwkMVwiID0gWC0tbm8tcmVleGVjOyB0aGVuCi0gICAgICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgICAgIHNoaWZ0Ci0gICAgZWxpZiB0ZXN0IFwiWFxgKFwkZWNobyAnXHQnKSAyPi9kZXYvbnVsbFxgXCIgPSAnWFx0JzsgdGhlbgotICAgICAgIyBZaXBwZWUsIFwkZWNobyB3b3JrcyEKLSAgICAgIDoKLSAgICBlbHNlCi0gICAgICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwsIGFuZCB0aGVuIG1heWJlIFwkZWNobyB3aWxsIHdvcmsuCi0gICAgICBleGVjICRTSEVMTCBcIlwkMFwiIC0tbm8tcmVleGVjIFwkezErXCJcJEBcIn0KLSAgICBmaQotICBmaVwKLSIKLQkkZWNobyA+PiAkb3V0cHV0ICJcCi0KLSAgIyBGaW5kIHRoZSBkaXJlY3RvcnkgdGhhdCB0aGlzIHNjcmlwdCBsaXZlcyBpbi4KLSAgdGhpc2Rpcj1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSokJSUnXGAKLSAgdGVzdCBcInhcJHRoaXNkaXJcIiA9IFwieFwkZmlsZVwiICYmIHRoaXNkaXI9LgotCi0gICMgRm9sbG93IHN5bWJvbGljIGxpbmtzIHVudGlsIHdlIGdldCB0byB0aGUgcmVhbCB0aGlzZGlyLgotICBmaWxlPVxgbHMgLWxkIFwiXCRmaWxlXCIgfCAke1NFRH0gLW4gJ3MvLiotPiAvL3AnXGAKLSAgd2hpbGUgdGVzdCAtbiBcIlwkZmlsZVwiOyBkbwotICAgIGRlc3RkaXI9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qXCQlJSdcYAotCi0gICAgIyBJZiB0aGVyZSB3YXMgYSBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGNoYW5nZSB0aGlzZGlyLgotICAgIGlmIHRlc3QgXCJ4XCRkZXN0ZGlyXCIgIT0gXCJ4XCRmaWxlXCI7IHRoZW4KLSAgICAgIGNhc2UgXCJcJGRlc3RkaXJcIiBpbgotICAgICAgW1xcXFwvXSogfCBbQS1aYS16XTpbXFxcXC9dKikgdGhpc2Rpcj1cIlwkZGVzdGRpclwiIDs7Ci0gICAgICAqKSB0aGlzZGlyPVwiXCR0aGlzZGlyL1wkZGVzdGRpclwiIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLQotICAgIGZpbGU9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlXi4qLyUlJ1xgCi0gICAgZmlsZT1cYGxzIC1sZCBcIlwkdGhpc2Rpci9cJGZpbGVcIiB8ICR7U0VEfSAtbiAncy8uKi0+IC8vcCdcYAotICBkb25lCi0KLSAgIyBUcnkgdG8gZ2V0IHRoZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZS4KLSAgYWJzZGlyPVxgY2QgXCJcJHRoaXNkaXJcIiAmJiBwd2RcYAotICB0ZXN0IC1uIFwiXCRhYnNkaXJcIiAmJiB0aGlzZGlyPVwiXCRhYnNkaXJcIgotIgotCi0JaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KLQkgIGVjaG8gPj4gJG91dHB1dCAiXAotICBwcm9ncmFtPWx0LSckb3V0cHV0bmFtZSckZXhlZXh0Ci0gIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCi0KLSAgaWYgdGVzdCAhIC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIHx8IFxcCi0gICAgIHsgZmlsZT1cYGxzIC0xZHQgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgXCJcJHByb2dkaXIvLi4vXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfCAke1NFRH0gMXFcYDsgXFwKLSAgICAgICB0ZXN0IFwiWFwkZmlsZVwiICE9IFwiWFwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfTsgdGhlbgotCi0gICAgZmlsZT1cIlwkXCQtXCRwcm9ncmFtXCIKLQotICAgIGlmIHRlc3QgISAtZCBcIlwkcHJvZ2RpclwiOyB0aGVuCi0gICAgICAkbWtkaXIgXCJcJHByb2dkaXJcIgotICAgIGVsc2UKLSAgICAgICRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgotICAgIGZpIgotCi0JICBlY2hvID4+ICRvdXRwdXQgIlwKLQotICAgICMgcmVsaW5rIGV4ZWN1dGFibGUgaWYgbmVjZXNzYXJ5Ci0gICAgaWYgdGVzdCAtbiBcIlwkcmVsaW5rX2NvbW1hbmRcIjsgdGhlbgotICAgICAgaWYgcmVsaW5rX2NvbW1hbmRfb3V0cHV0PVxgZXZhbCBcJHJlbGlua19jb21tYW5kIDI+JjFcYDsgdGhlbiA6Ci0gICAgICBlbHNlCi0JJGVjaG8gXCJcJHJlbGlua19jb21tYW5kX291dHB1dFwiID4mMgotCSRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgotCWV4aXQgMQotICAgICAgZmkKLSAgICBmaQotCi0gICAgJG12IFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHx8Ci0gICAgeyAkcm0gXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7Ci0gICAgICAkbXYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH0KLSAgICAkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKLSAgZmkiCi0JZWxzZQotCSAgZWNobyA+PiAkb3V0cHV0ICJcCi0gIHByb2dyYW09JyRvdXRwdXRuYW1lJwotICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgotIgotCWZpCi0KLQllY2hvID4+ICRvdXRwdXQgIlwKLQotICBpZiB0ZXN0IC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB0aGVuIgotCi0JIyBFeHBvcnQgb3VyIHNobGlicGF0aF92YXIgaWYgd2UgaGF2ZSBvbmUuCi0JaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICMgQWRkIG91ciBvd24gbGlicmFyeSBwYXRoIHRvICRzaGxpYnBhdGhfdmFyCi0gICAgJHNobGlicGF0aF92YXI9XCIkdGVtcF9ycGF0aFwkJHNobGlicGF0aF92YXJcIgotCi0gICAgIyBTb21lIHN5c3RlbXMgY2Fubm90IGNvcGUgd2l0aCBjb2xvbi10ZXJtaW5hdGVkICRzaGxpYnBhdGhfdmFyCi0gICAgIyBUaGUgc2Vjb25kIGNvbG9uIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gQmVPUyBSNCAke1NFRH0KLSAgICAkc2hsaWJwYXRoX3Zhcj1cYFwkZWNobyBcIlhcJCRzaGxpYnBhdGhfdmFyXCIgfCBcJFhzZWQgLWUgJ3MvOjoqXCQvLydcYAotCi0gICAgZXhwb3J0ICRzaGxpYnBhdGhfdmFyCi0iCi0JZmkKLQotCSMgZml4dXAgdGhlIGRsbCBzZWFyY2hwYXRoIGlmIHdlIG5lZWQgdG8uCi0JaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgIyBBZGQgdGhlIGRsbCBzZWFyY2ggcGF0aCBjb21wb25lbnRzIHRvIHRoZSBleGVjdXRhYmxlIFBBVEgKLSAgICBQQVRIPSRkbGxzZWFyY2hwYXRoOlwkUEFUSAotIgotCWZpCi0KLQkkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgotICAgICAgIyBSdW4gdGhlIGFjdHVhbCBwcm9ncmFtIHdpdGggb3VyIGFyZ3VtZW50cy4KLSIKLQljYXNlICRob3N0IGluCi0JIyB3aW4zMiBzeXN0ZW1zIG5lZWQgdG8gdXNlIHRoZSBwcm9nIHBhdGggZm9yIGRsbAotCSMgbG9va3VwIHRvIHdvcmsKLQkqLSotY3lnd2luKiB8ICotKi1wdzMyKikKLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAgIGV4ZWMgXCRwcm9nZGlyL1wkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9Ci0iCi0JICA7OwotCi0JIyBCYWNrc2xhc2hlcyBzZXBhcmF0ZSBkaXJlY3RvcmllcyBvbiBwbGFpbiB3aW5kb3dzCi0JKi0qLW1pbmd3IHwgKi0qLW9zMiopCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgICBleGVjIFwkcHJvZ2RpclxcXFxcJHByb2dyYW0gXCR7MStcIlwkQFwifQotIgotCSAgOzsKLQotCSopCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgICAjIEV4cG9ydCB0aGUgcGF0aCB0byB0aGUgcHJvZ3JhbS4KLSAgICAgIFBBVEg9XCJcJHByb2dkaXI6XCRQQVRIXCIKLSAgICAgIGV4cG9ydCBQQVRICi0KLSAgICAgIGV4ZWMgXCRwcm9ncmFtIFwkezErXCJcJEBcIn0KLSIKLQkgIDs7Ci0JZXNhYwotCSRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAgIFwkZWNobyBcIlwkMDogY2Fubm90IGV4ZWMgXCRwcm9ncmFtIFwkezErXCJcJEBcIn1cIgotICAgICAgZXhpdCAxCi0gICAgZmkKLSAgZWxzZQotICAgICMgVGhlIHByb2dyYW0gZG9lc24ndCBleGlzdC4KLSAgICBcJGVjaG8gXCJcJDA6IGVycm9yOiBcJHByb2dkaXIvXCRwcm9ncmFtIGRvZXMgbm90IGV4aXN0XCIgMT4mMgotICAgIFwkZWNobyBcIlRoaXMgc2NyaXB0IGlzIGp1c3QgYSB3cmFwcGVyIGZvciBcJHByb2dyYW0uXCIgMT4mMgotICAgIGVjaG8gXCJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgMT4mMgotICAgIGV4aXQgMQotICBmaQotZmlcCi0iCi0JY2htb2QgK3ggJG91dHB1dAotICAgICAgZmkKLSAgICAgIGV4aXQgMAotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFNlZSBpZiB3ZSBuZWVkIHRvIGJ1aWxkIGFuIG9sZC1mYXNoaW9uZWQgYXJjaGl2ZS4KLSAgICBmb3Igb2xkbGliIGluICRvbGRsaWJzOyBkbwotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IGNvbnZlbmllbmNlOyB0aGVuCi0Jb2xkb2Jqcz0iJGxpYm9ianNfc2F2ZSIKLQlhZGRsaWJzPSIkY29udmVuaWVuY2UiCi0JYnVpbGRfbGlidG9vbF9saWJzPW5vCi0gICAgICBlbHNlCi0JaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBtb2R1bGU7IHRoZW4KLQkgIG9sZG9ianM9IiRsaWJvYmpzX3NhdmUiCi0JICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLQllbHNlCi0JICBvbGRvYmpzPSIkb2JqcyRvbGRfZGVwbGlicyAiYCRlY2hvICJYJGxpYm9ianNfc2F2ZSIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSckL2QnIC1lICcvXC5saWIkL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0JZmkKLQlhZGRsaWJzPSIkb2xkX2NvbnZlbmllbmNlIgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGFkZGxpYnMiOyB0aGVuCi0JZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKLQkkc2hvdyAiJHtybX1yICRnZW50b3AiCi0JJHJ1biAke3JtfXIgIiRnZW50b3AiCi0JJHNob3cgIm1rZGlyICRnZW50b3AiCi0JJHJ1biBta2RpciAiJGdlbnRvcCIKLQlzdGF0dXM9JD8KLQlpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICIkZ2VudG9wIjsgdGhlbgotCSAgZXhpdCAkc3RhdHVzCi0JZmkKLQlnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKLQotCSMgQWRkIGluIG1lbWJlcnMgZnJvbSBjb252ZW5pZW5jZSBhcmNoaXZlcy4KLQlmb3IgeGxpYiBpbiAkYWRkbGliczsgZG8KLQkgICMgRXh0cmFjdCB0aGUgb2JqZWN0cy4KLQkgIGNhc2UgJHhsaWIgaW4KLQkgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgeGFicz0iJHhsaWIiIDs7Ci0JICAqKSB4YWJzPWBwd2RgIi8keGxpYiIgOzsKLQkgIGVzYWMKLQkgIHhsaWI9YCRlY2hvICJYJHhsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgIHhkaXI9IiRnZW50b3AvJHhsaWIiCi0KLQkgICRzaG93ICIke3JtfXIgJHhkaXIiCi0JICAkcnVuICR7cm19ciAiJHhkaXIiCi0JICAkc2hvdyAibWtkaXIgJHhkaXIiCi0JICAkcnVuIG1rZGlyICIkeGRpciIKLQkgIHN0YXR1cz0kPwotCSAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAiJHhkaXIiOyB0aGVuCi0JICAgIGV4aXQgJHN0YXR1cwotCSAgZmkKLQkgICRzaG93ICIoY2QgJHhkaXIgJiYgJEFSIHggJHhhYnMpIgotCSAgJHJ1biBldmFsICIoY2QgXCR4ZGlyICYmICRBUiB4IFwkeGFicykiIHx8IGV4aXQgJD8KLQotCSAgb2xkb2Jqcz0iJG9sZG9ianMgImBmaW5kICR4ZGlyIC1uYW1lIFwqLiR7b2JqZXh0fSAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJE5MMlNQYAotCWRvbmUKLSAgICAgIGZpCi0KLSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgotICAgICAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNcIgotICAgICAgZWxzZQotCSMgRW5zdXJlIHRoYXQgd2UgaGF2ZSAubyBvYmplY3RzIGluIHBsYWNlIGluIGNhc2Ugd2UgZGVjaWRlZAotCSMgbm90IHRvIGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnksIGFuZCBoYXZlIGZhbGxlbiBiYWNrIHRvIGJ1aWxkaW5nCi0JIyBzdGF0aWMgbGlicyBldmVuIHRob3VnaCAtLWRpc2FibGUtc3RhdGljIHdhcyBwYXNzZWQhCi0JZm9yIG9sZG9iaiBpbiAkb2xkb2JqczsgZG8KLQkgIGlmIHRlc3QgISAtZiAkb2xkb2JqOyB0aGVuCi0JICAgIHhkaXI9YCRlY2hvICJYJG9sZG9iaiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCSAgICBpZiB0ZXN0ICJYJHhkaXIiID0gIlgkb2xkb2JqIjsgdGhlbgotCSAgICAgIHhkaXI9Ii4iCi0JICAgIGVsc2UKLQkgICAgICB4ZGlyPSIkeGRpciIKLQkgICAgZmkKLQkgICAgYmFzZW9iaj1gJGVjaG8gIlgkb2xkb2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICAgIG9iaj1gJGVjaG8gIlgkYmFzZW9iaiIgfCAkWHNlZCAtZSAiJG8ybG8iYAotCSAgICAkc2hvdyAiKGNkICR4ZGlyICYmICR7TE5fU30gJG9iaiAkYmFzZW9iaikiCi0JICAgICRydW4gZXZhbCAnKGNkICR4ZGlyICYmICR7TE5fU30gJG9iaiAkYmFzZW9iaiknIHx8IGV4aXQgJD8KLQkgIGZpCi0JZG9uZQotCi0JZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgotICAgICAgZmkKLSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQlJRlM9IiRzYXZlX2lmcyIKLQkkc2hvdyAiJGNtZCIKLQkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLW4gIiRnZW5lcmF0ZWQiOyB0aGVuCi0gICAgICAkc2hvdyAiJHtybX1yJGdlbmVyYXRlZCIKLSAgICAgICRydW4gJHtybX1yJGdlbmVyYXRlZAotICAgIGZpCi0KLSAgICAjIE5vdyBjcmVhdGUgdGhlIGxpYnRvb2wgYXJjaGl2ZS4KLSAgICBjYXNlICRvdXRwdXQgaW4KLSAgICAqLmxhKQotICAgICAgb2xkX2xpYnJhcnk9Ci0gICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIG9sZF9saWJyYXJ5PSIkbGlibmFtZS4kbGliZXh0IgotICAgICAgJHNob3cgImNyZWF0aW5nICRvdXRwdXQiCi0KLSAgICAgICMgUHJlc2VydmUgYW55IHZhcmlhYmxlcyB0aGF0IG1heSBhZmZlY3QgY29tcGlsZXIgYmVoYXZpb3IKLSAgICAgIGZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbwotCWlmIGV2YWwgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiOyB0aGVuCi0JICByZWxpbmtfY29tbWFuZD0ieyB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCIgfHwgdW5zZXQgJHZhciB8fCB7ICR2YXI9OyBleHBvcnQgJHZhcjsgfTsgfTsgJHJlbGlua19jb21tYW5kIgotCWVsaWYgZXZhbCB2YXJfdmFsdWU9XCQkdmFyOyB0ZXN0IC16ICIkdmFyX3ZhbHVlIjsgdGhlbgotCSAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgotCWVsc2UKLQkgIHZhcl92YWx1ZT1gJGVjaG8gIlgkdmFyX3ZhbHVlIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQkgIHJlbGlua19jb21tYW5kPSIkdmFyPVwiJHZhcl92YWx1ZVwiOyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgotCWZpCi0gICAgICBkb25lCi0gICAgICAjIFF1b3RlIHRoZSBsaW5rIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgotICAgICAgcmVsaW5rX2NvbW1hbmQ9IihjZCBgcHdkYDsgJFNIRUxMICQwIC0tbW9kZT1yZWxpbmsgJGxpYnRvb2xfYXJncykiCi0gICAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCi0gICAgICAjIE9ubHkgY3JlYXRlIHRoZSBvdXRwdXQgaWYgbm90IGEgZHJ5IHJ1bi4KLSAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JZm9yIGluc3RhbGxlZCBpbiBubyB5ZXM7IGRvCi0JICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IHllczsgdGhlbgotCSAgICBpZiB0ZXN0IC16ICIkaW5zdGFsbF9saWJkaXIiOyB0aGVuCi0JICAgICAgYnJlYWsKLQkgICAgZmkKLQkgICAgb3V0cHV0PSIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSJpCi0JICAgICMgUmVwbGFjZSBhbGwgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMgd2l0aCB0aGUgaW5zdGFsbGVkIG9uZXMKLQkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPQotCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgICAgY2FzZSAkZGVwbGliIGluCi0JICAgICAgKi5sYSkKLQkJbmFtZT1gJGVjaG8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JCWV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRkZXBsaWJgCi0JCWlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVwbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkJICBleGl0IDEKLQkJZmkKLQkJbmV3ZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzICRsaWJkaXIvJG5hbWUiCi0JCTs7Ci0JICAgICAgKikgbmV3ZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzICRkZXBsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBkb25lCi0JICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICAgbmV3ZGxmaWxlcz0KLQkgICAgZm9yIGxpYiBpbiAkZGxmaWxlczsgZG8KLQkgICAgICBuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgICAgICBldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkbGliYAotCSAgICAgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JCSRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JCWV4aXQgMQotCSAgICAgIGZpCi0JICAgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGxpYmRpci8kbmFtZSIKLQkgICAgZG9uZQotCSAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKLQkgICAgbmV3ZGxwcmVmaWxlcz0KLQkgICAgZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KLQkgICAgICBuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgICAgICBldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkbGliYAotCSAgICAgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JCSRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JCWV4aXQgMQotCSAgICAgIGZpCi0JICAgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGxpYmRpci8kbmFtZSIKLQkgICAgZG9uZQotCSAgICBkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyIKLQkgIGZpCi0JICAkcm0gJG91dHB1dAotCSAgIyBwbGFjZSBkbG5hbWUgaW4gY29ycmVjdCBwb3NpdGlvbiBmb3IgY3lnd2luCi0JICB0ZGxuYW1lPSRkbG5hbWUKLQkgIGNhc2UgJGhvc3QsJG91dHB1dCwkaW5zdGFsbGVkLCRtb2R1bGUsJGRsbmFtZSBpbgotCSAgICAqY3lnd2luKiwqbGFpLHllcyxubywqLmRsbCkgdGRsbmFtZT0uLi9iaW4vJGRsbmFtZSA7OwotCSAgZXNhYwotCSAgJGVjaG8gPiAkb3V0cHV0ICJcCi0jICRvdXRwdXRuYW1lIC0gYSBsaWJ0b29sIGxpYnJhcnkgZmlsZQotIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCi0jCi0jIFBsZWFzZSBETyBOT1QgZGVsZXRlIHRoaXMgZmlsZSEKLSMgSXQgaXMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHRoZSBsaWJyYXJ5LgotCi0jIFRoZSBuYW1lIHRoYXQgd2UgY2FuIGRsb3BlbigzKS4KLWRsbmFtZT0nJHRkbG5hbWUnCi0KLSMgTmFtZXMgb2YgdGhpcyBsaWJyYXJ5LgotbGlicmFyeV9uYW1lcz0nJGxpYnJhcnlfbmFtZXMnCi0KLSMgVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhcmNoaXZlLgotb2xkX2xpYnJhcnk9JyRvbGRfbGlicmFyeScKLQotIyBMaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCi1kZXBlbmRlbmN5X2xpYnM9JyRkZXBlbmRlbmN5X2xpYnMnCi0KLSMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgJGxpYm5hbWUuCi1jdXJyZW50PSRjdXJyZW50Ci1hZ2U9JGFnZQotcmV2aXNpb249JHJldmlzaW9uCi0KLSMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PwotaW5zdGFsbGVkPSRpbnN0YWxsZWQKLQotIyBGaWxlcyB0byBkbG9wZW4vZGxwcmVvcGVuCi1kbG9wZW49JyRkbGZpbGVzJwotZGxwcmVvcGVuPSckZGxwcmVmaWxlcycKLQotIyBEaXJlY3RvcnkgdGhhdCB0aGlzIGxpYnJhcnkgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGluOgotbGliZGlyPSckaW5zdGFsbF9saWJkaXInIgotCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSBubyAmJiB0ZXN0ICRuZWVkX3JlbGluayA9IHllczsgdGhlbgotCSAgICAkZWNobyA+PiAkb3V0cHV0ICJcCi1yZWxpbmtfY29tbWFuZD1cIiRyZWxpbmtfY29tbWFuZFwiIgotCSAgZmkKLQlkb25lCi0gICAgICBmaQotCi0gICAgICAjIERvIGEgc3ltYm9saWMgbGluayBzbyB0aGF0IHRoZSBsaWJ0b29sIGFyY2hpdmUgY2FuIGJlIGZvdW5kIGluCi0gICAgICAjIExEX0xJQlJBUllfUEFUSCBiZWZvcmUgdGhlIHByb2dyYW0gaXMgaW5zdGFsbGVkLgotICAgICAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJG91dHB1dG5hbWUgJiYgJExOX1MgLi4vJG91dHB1dG5hbWUgJG91dHB1dG5hbWUpIgotICAgICAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRvdXRwdXRuYW1lICYmICRMTl9TIC4uLyRvdXRwdXRuYW1lICRvdXRwdXRuYW1lKScgfHwgZXhpdCAkPwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAjIGxpYnRvb2wgaW5zdGFsbCBtb2RlCi0gIGluc3RhbGwpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogaW5zdGFsbCIKLQotICAgICMgVGhlcmUgbWF5IGJlIGFuIG9wdGlvbmFsIHNoKDEpIGFyZ3VtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgICAjIGluc3RhbGxfcHJvZyAoZXNwZWNpYWxseSBvbiBXaW5kb3dzIE5UKS4KLSAgICBpZiB0ZXN0ICIkbm9ub3B0IiA9ICIkU0hFTEwiIHx8IHRlc3QgIiRub25vcHQiID0gL2Jpbi9zaCB8fAotICAgICAgICMgQWxsb3cgdGhlIHVzZSBvZiBHTlUgc2h0b29sJ3MgaW5zdGFsbCBjb21tYW5kLgotICAgICAgICRlY2hvICJYJG5vbm9wdCIgfCAkWHNlZCB8IGdyZXAgc2h0b29sID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCi0gICAgICBhcmc9YCRlY2hvICJYJG5vbm9wdCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCWFyZz0iXCIkYXJnXCIiCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIGluc3RhbGxfcHJvZz0iJGFyZyAiCi0gICAgICBhcmc9IiQxIgotICAgICAgc2hpZnQKLSAgICBlbHNlCi0gICAgICBpbnN0YWxsX3Byb2c9Ci0gICAgICBhcmc9IiRub25vcHQiCi0gICAgZmkKLQotICAgICMgVGhlIHJlYWwgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBpbnN0YWxsYXRpb24gcHJvZ3JhbS4KLSAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCi0gICAgYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgIGNhc2UgJGFyZyBpbgotICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotICAgICAgYXJnPSJcIiRhcmdcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyRhcmciCi0KLSAgICAjIFdlIG5lZWQgdG8gYWNjZXB0IGF0IGxlYXN0IGFsbCB0aGUgQlNEIGluc3RhbGwgZmxhZ3MuCi0gICAgZGVzdD0KLSAgICBmaWxlcz0KLSAgICBvcHRzPQotICAgIHByZXY9Ci0gICAgaW5zdGFsbF90eXBlPQotICAgIGlzZGlyPW5vCi0gICAgc3RyaXBtZT0KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGlmIHRlc3QgLW4gIiRkZXN0IjsgdGhlbgotCWZpbGVzPSIkZmlsZXMgJGRlc3QiCi0JZGVzdD0iJGFyZyIKLQljb250aW51ZQotICAgICAgZmkKLQotICAgICAgY2FzZSAkYXJnIGluCi0gICAgICAtZCkgaXNkaXI9eWVzIDs7Ci0gICAgICAtZikgcHJldj0iLWYiIDs7Ci0gICAgICAtZykgcHJldj0iLWciIDs7Ci0gICAgICAtbSkgcHJldj0iLW0iIDs7Ci0gICAgICAtbykgcHJldj0iLW8iIDs7Ci0gICAgICAtcykKLQlzdHJpcG1lPSIgLXMiCi0JY29udGludWUKLQk7OwotICAgICAgLSopIDs7Ci0KLSAgICAgICopCi0JIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRlZCBhbiBhcmd1bWVudCwgdGhlbiBza2lwIGl0LgotCWlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotCSAgcHJldj0KLQllbHNlCi0JICBkZXN0PSIkYXJnIgotCSAgY29udGludWUKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgYXJndW1lbnQuCi0gICAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCWFyZz0iXCIkYXJnXCIiCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyAkYXJnIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX3Byb2ciOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIGluc3RhbGwgcHJvZ3JhbSIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldicgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICIkZGVzdCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBubyBmaWxlIG9yIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIgMT4mMgotICAgICAgZWxzZQotCSRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBkZXN0aW5hdGlvbiIgMT4mMgotICAgICAgZmkKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgICMgU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoIGZyb20gdGhlIGRlc3RpbmF0aW9uLgotICAgIGRlc3Q9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlLyQlJSdgCi0KLSAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeS4KLSAgICB0ZXN0IC1kICIkZGVzdCIgJiYgaXNkaXI9eWVzCi0gICAgaWYgdGVzdCAiJGlzZGlyIiA9IHllczsgdGhlbgotICAgICAgZGVzdGRpcj0iJGRlc3QiCi0gICAgICBkZXN0bmFtZT0KLSAgICBlbHNlCi0gICAgICBkZXN0ZGlyPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgICB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkZGVzdCIgJiYgZGVzdGRpcj0uCi0gICAgICBkZXN0bmFtZT1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0gICAgICAjIE5vdCBhIGRpcmVjdG9yeSwgc28gY2hlY2sgdG8gc2VlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgZmlsZSBzcGVjaWZpZWQuCi0gICAgICBzZXQgZHVtbXkgJGZpbGVzCi0gICAgICBpZiB0ZXN0ICQjIC1ndCAyOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVzdCcgaXMgbm90IGEgZGlyZWN0b3J5IiAxPiYyCi0JJGVjaG8gIiRoZWxwIiAxPiYyCi0JZXhpdCAxCi0gICAgICBmaQotICAgIGZpCi0gICAgY2FzZSAkZGVzdGRpciBpbgotICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKLSAgICAqKQotICAgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotCWNhc2UgJGZpbGUgaW4KLQkqLmxvKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0ZGlyJyBtdXN0IGJlIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgotICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgotCi0gICAgc3RhdGljbGlicz0KLSAgICBmdXR1cmVfbGliZGlycz0KLSAgICBjdXJyZW50X2xpYmRpcnM9Ci0gICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotCi0gICAgICAjIERvIGVhY2ggaW5zdGFsbGF0aW9uLgotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi4kbGliZXh0KQotCSMgRG8gdGhlIHN0YXRpYyBsaWJyYXJpZXMgbGF0ZXIuCi0Jc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGZpbGUiCi0JOzsKLQotICAgICAgKi5sYSkKLQkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgotCWlmICgke1NFRH0gLWUgJzJxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0KLQlsaWJyYXJ5X25hbWVzPQotCW9sZF9saWJyYXJ5PQotCXJlbGlua19jb21tYW5kPQotCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCWNhc2UgJGZpbGUgaW4KLQkqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0JKikgLiAuLyRmaWxlIDs7Ci0JZXNhYwotCi0JIyBBZGQgdGhlIGxpYmRpciB0byBjdXJyZW50X2xpYmRpcnMgaWYgaXQgaXMgdGhlIGRlc3RpbmF0aW9uLgotCWlmIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRsaWJkaXIiOyB0aGVuCi0JICBjYXNlICIkY3VycmVudF9saWJkaXJzICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBjdXJyZW50X2xpYmRpcnM9IiRjdXJyZW50X2xpYmRpcnMgJGxpYmRpciIgOzsKLQkgIGVzYWMKLQllbHNlCi0JICAjIE5vdGUgdGhlIGxpYmRpciBhcyBhIGZ1dHVyZSBsaWJkaXIuCi0JICBjYXNlICIkZnV0dXJlX2xpYmRpcnMgIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZ1dHVyZV9saWJkaXJzPSIkZnV0dXJlX2xpYmRpcnMgJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotCi0JZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgLwotCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUvIiAmJiBkaXI9Ci0JZGlyPSIkZGlyJG9iamRpciIKLQotCWlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHJlbGlua2luZyBcYCRmaWxlJyIgMT4mMgotCSAgJHNob3cgIiRyZWxpbmtfY29tbWFuZCIKLQkgIGlmICRydW4gZXZhbCAiJHJlbGlua19jb21tYW5kIjsgdGhlbiA6Ci0JICBlbHNlCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiByZWxpbmsgXGAkZmlsZScgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCIgMT4mMgotCSAgICBjb250aW51ZQotCSAgZmkKLQlmaQotCi0JIyBTZWUgdGhlIG5hbWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4KLQlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKLQlpZiB0ZXN0IC1uICIkMiI7IHRoZW4KLQkgIHJlYWxuYW1lPSIkMiIKLQkgIHNoaWZ0Ci0JICBzaGlmdAotCi0JICBzcmNuYW1lPSIkcmVhbG5hbWUiCi0JICB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiICYmIHNyY25hbWU9IiRyZWFsbmFtZSJUCi0KLQkgICMgSW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcnkgYW5kIGJ1aWxkIHRoZSBzeW1saW5rcy4KLQkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRkaXIvJHNyY25hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIgotCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRkaXIvJHNyY25hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIiB8fCBleGl0ICQ/Ci0JICBpZiB0ZXN0IC1uICIkc3RyaXBtZSIgJiYgdGVzdCAtbiAiJHN0cmlwbGliIjsgdGhlbgotCSAgICAkc2hvdyAiJHN0cmlwbGliICRkZXN0ZGlyLyRyZWFsbmFtZSIKLQkgICAgJHJ1biBldmFsICIkc3RyaXBsaWIgJGRlc3RkaXIvJHJlYWxuYW1lIiB8fCBleGl0ICQ/Ci0JICBmaQotCi0JICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0JICAgICMgRGVsZXRlIHRoZSBvbGQgc3ltbGlua3MsIGFuZCBjcmVhdGUgbmV3IG9uZXMuCi0JICAgIGZvciBsaW5rbmFtZQotCSAgICBkbwotCSAgICAgIGlmIHRlc3QgIiRsaW5rbmFtZSIgIT0gIiRyZWFsbmFtZSI7IHRoZW4KLQkJJHNob3cgIihjZCAkZGVzdGRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgotCQkkcnVuIGV2YWwgIihjZCAkZGVzdGRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGZpCi0KLQkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KLQkgIGxpYj0iJGRlc3RkaXIvJHJlYWxuYW1lIgotCSAgZXZhbCBjbWRzPVwiJHBvc3RpbnN0YWxsX2NtZHNcIgotCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICBmb3IgY21kIGluICRjbWRzOyBkbwotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgJHNob3cgIiRjbWQiCi0JICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCSAgZG9uZQotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JZmkKLQotCSMgSW5zdGFsbCB0aGUgcHNldWRvLWxpYnJhcnkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzLgotCW5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQlpbnN0bmFtZT0iJGRpci8kbmFtZSJpCi0JJHNob3cgIiRpbnN0YWxsX3Byb2cgJGluc3RuYW1lICRkZXN0ZGlyLyRuYW1lIgotCSRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkaW5zdG5hbWUgJGRlc3RkaXIvJG5hbWUiIHx8IGV4aXQgJD8KLQotCSMgTWF5YmUgaW5zdGFsbCB0aGUgc3RhdGljIGxpYnJhcnksIHRvby4KLQl0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRkaXIvJG9sZF9saWJyYXJ5IgotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBJbnN0YWxsIChpLmUuIGNvcHkpIGEgbGlidG9vbCBvYmplY3QuCi0KLQkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCi0JaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKLQllbHNlCi0JICBkZXN0ZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKLQlmaQotCi0JIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KLQljYXNlICRkZXN0ZmlsZSBpbgotCSoubG8pCi0JICBzdGF0aWNkZXN0PWAkZWNobyAiWCRkZXN0ZmlsZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCSAgOzsKLQkqLiRvYmpleHQpCi0JICBzdGF0aWNkZXN0PSIkZGVzdGZpbGUiCi0JICBkZXN0ZmlsZT0KLQkgIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBjb3B5IGEgbGlidG9vbCBvYmplY3QgdG8gXGAkZGVzdGZpbGUnIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0KLQkjIEluc3RhbGwgdGhlIGxpYnRvb2wgb2JqZWN0IGlmIHJlcXVlc3RlZC4KLQlpZiB0ZXN0IC1uICIkZGVzdGZpbGUiOyB0aGVuCi0JICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiCi0JICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RmaWxlIiB8fCBleGl0ICQ/Ci0JZmkKLQotCSMgSW5zdGFsbCB0aGUgb2xkIG9iamVjdCBpZiBlbmFibGVkLgotCWlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQkgICMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCi0JICBzdGF0aWNvYmo9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQotCSAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJHN0YXRpY29iaiAkc3RhdGljZGVzdCIKLQkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyBcJHN0YXRpY29iaiBcJHN0YXRpY2Rlc3QiIHx8IGV4aXQgJD8KLQlmaQotCWV4aXQgMAotCTs7Ci0KLSAgICAgICopCi0JIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgotCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCi0JZWxzZQotCSAgZGVzdGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCi0JZmkKLQotCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KLQljYXNlICRob3N0IGluCi0JKmN5Z3dpbip8Km1pbmd3KikKLQkgICAgd3JhcHBlcj1gZWNobyAkZmlsZSB8ICR7U0VEfSAtZSAncywuZXhlJCwsJ2AKLQkgICAgOzsKLQkqKQotCSAgICB3cmFwcGVyPSRmaWxlCi0JICAgIDs7Ci0JZXNhYwotCWlmICgke1NFRH0gLWUgJzRxJyAkd3JhcHBlciB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICBub3RpbnN0X2RlcGxpYnM9Ci0JICByZWxpbmtfY29tbWFuZD0KLQotCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICBjYXNlICRmaWxlIGluCi0JICAqLyogfCAqXFwqKSAuICR3cmFwcGVyIDs7Ci0JICAqKSAuIC4vJHdyYXBwZXIgOzsKLQkgIGVzYWMKLQotCSAgIyBDaGVjayB0aGUgdmFyaWFibGVzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBzZXQuCi0JICBpZiB0ZXN0IC16ICIkbm90aW5zdF9kZXBsaWJzIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgXGAkd3JhcHBlciciIDE+JjIKLQkgICAgZXhpdCAxCi0JICBmaQotCi0JICBmaW5hbGl6ZT15ZXMKLQkgIGZvciBsaWIgaW4gJG5vdGluc3RfZGVwbGliczsgZG8KLQkgICAgIyBDaGVjayB0byBzZWUgdGhhdCBlYWNoIGxpYnJhcnkgaXMgaW5zdGFsbGVkLgotCSAgICBsaWJkaXI9Ci0JICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCi0JICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICAgICAgY2FzZSAkbGliIGluCi0JICAgICAgKi8qIHwgKlxcKikgLiAkbGliIDs7Ci0JICAgICAgKikgLiAuLyRsaWIgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICAgIGxpYmZpbGU9IiRsaWJkaXIvImAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlZydgICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAotCSAgICBpZiB0ZXN0IC1uICIkbGliZGlyIiAmJiB0ZXN0ICEgLWYgIiRsaWJmaWxlIjsgdGhlbgotCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGxpYicgaGFzIG5vdCBiZWVuIGluc3RhbGxlZCBpbiBcYCRsaWJkaXInIiAxPiYyCi0JICAgICAgZmluYWxpemU9bm8KLQkgICAgZmkKLQkgIGRvbmUKLQotCSAgcmVsaW5rX2NvbW1hbmQ9Ci0JICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgIGNhc2UgJGZpbGUgaW4KLQkgICovKiB8ICpcXCopIC4gJHdyYXBwZXIgOzsKLQkgICopIC4gLi8kd3JhcHBlciA7OwotCSAgZXNhYwotCi0JICBvdXRwdXRuYW1lPQotCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSBubyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JICAgIGlmIHRlc3QgIiRmaW5hbGl6ZSIgPSB5ZXMgJiYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQkgICAgICB0bXBkaXI9Ii90bXAiCi0JICAgICAgdGVzdCAtbiAiJFRNUERJUiIgJiYgdG1wZGlyPSIkVE1QRElSIgotCSAgICAgIHRtcGRpcj0iJHRtcGRpci9saWJ0b29sLSQkIgotCSAgICAgIGlmICRta2RpciAtcCAiJHRtcGRpciIgJiYgY2htb2QgNzAwICIkdG1wZGlyIjsgdGhlbiA6Ci0JICAgICAgZWxzZQotCQkkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IFxgJHRtcGRpciciIDE+JjIKLQkJY29udGludWUKLQkgICAgICBmaQotCSAgICAgIGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgICAgICBvdXRwdXRuYW1lPSIkdG1wZGlyLyRmaWxlIgotCSAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KLQkgICAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0bmFtZSInJWcnYAotCi0JICAgICAgJHNob3cgIiRyZWxpbmtfY29tbWFuZCIKLQkgICAgICBpZiAkcnVuIGV2YWwgIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4gOgotCSAgICAgIGVsc2UKLQkJJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IHJlbGluayBcYCRmaWxlJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IiAxPiYyCi0JCSR7cm19ciAiJHRtcGRpciIKLQkJY29udGludWUKLQkgICAgICBmaQotCSAgICAgIGZpbGU9IiRvdXRwdXRuYW1lIgotCSAgICBlbHNlCi0JICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IHJlbGluayBcYCRmaWxlJyIgMT4mMgotCSAgICBmaQotCSAgZWxzZQotCSAgICAjIEluc3RhbGwgdGhlIGJpbmFyeSB0aGF0IHdlIGNvbXBpbGVkIGVhcmxpZXIuCi0JICAgIGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgInMlXChbXi9dKlwpJCUkb2JqZGlyL1wxJSJgCi0JICBmaQotCWZpCi0KLQkjIHJlbW92ZSAuZXhlIHNpbmNlIGN5Z3dpbiAvdXNyL2Jpbi9pbnN0YWxsIHdpbGwgYXBwZW5kIGFub3RoZXIKLQkjIG9uZSBhbnl3YXlzCi0JY2FzZSAkaW5zdGFsbF9wcm9nLCRob3N0IGluCi0JL3Vzci9iaW4vaW5zdGFsbCosKmN5Z3dpbiopCi0JICBjYXNlICRmaWxlOiRkZXN0ZmlsZSBpbgotCSAgKi5leGU6Ki5leGUpCi0JICAgICMgdGhpcyBpcyBvawotCSAgICA7OwotCSAgKi5leGU6KikKLQkgICAgZGVzdGZpbGU9JGRlc3RmaWxlLmV4ZQotCSAgICA7OwotCSAgKjoqLmV4ZSkKLQkgICAgZGVzdGZpbGU9YGVjaG8gJGRlc3RmaWxlIHwgJHtTRUR9IC1lICdzLC5leGUkLCwnYAotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0JJHNob3cgIiRpbnN0YWxsX3Byb2ckc3RyaXBtZSAkZmlsZSAkZGVzdGZpbGUiCi0JJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nXCRzdHJpcG1lIFwkZmlsZSBcJGRlc3RmaWxlIiB8fCBleGl0ICQ/Ci0JdGVzdCAtbiAiJG91dHB1dG5hbWUiICYmICR7cm19ciAiJHRtcGRpciIKLQk7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgIGZvciBmaWxlIGluICRzdGF0aWNsaWJzOyBkbwotICAgICAgbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0gICAgICAjIFNldCB1cCB0aGUgcmFubGliIHBhcmFtZXRlcnMuCi0gICAgICBvbGRsaWI9IiRkZXN0ZGlyLyRuYW1lIgotCi0gICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZmlsZSAkb2xkbGliIgotICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkZmlsZSBcJG9sZGxpYiIgfHwgZXhpdCAkPwotCi0gICAgICBpZiB0ZXN0IC1uICIkc3RyaXBtZSIgJiYgdGVzdCAtbiAiJHN0cmlwbGliIjsgdGhlbgotCSRzaG93ICIkb2xkX3N0cmlwbGliICRvbGRsaWIiCi0JJHJ1biBldmFsICIkb2xkX3N0cmlwbGliICRvbGRsaWIiIHx8IGV4aXQgJD8KLSAgICAgIGZpCi0KLSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KLSAgICAgIGV2YWwgY21kcz1cIiRvbGRfcG9zdGluc3RhbGxfY21kc1wiCi0gICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JSUZTPSIkc2F2ZV9pZnMiCi0JJHNob3cgIiRjbWQiCi0JJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC1uICIkZnV0dXJlX2xpYmRpcnMiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiByZW1lbWJlciB0byBydW4gXGAkcHJvZ25hbWUgLS1maW5pc2gkZnV0dXJlX2xpYmRpcnMnIiAxPiYyCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRjdXJyZW50X2xpYmRpcnMiOyB0aGVuCi0gICAgICAjIE1heWJlIGp1c3QgZG8gYSBkcnkgcnVuLgotICAgICAgdGVzdCAtbiAiJHJ1biIgJiYgY3VycmVudF9saWJkaXJzPSIgLW4kY3VycmVudF9saWJkaXJzIgotICAgICAgZXhlY19jbWQ9JyRTSEVMTCAkMCAtLWZpbmlzaCRjdXJyZW50X2xpYmRpcnMnCi0gICAgZWxzZQotICAgICAgZXhpdCAwCi0gICAgZmkKLSAgICA7OwotCi0gICMgbGlidG9vbCBmaW5pc2ggbW9kZQotICBmaW5pc2gpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZmluaXNoIgotICAgIGxpYmRpcnM9IiRub25vcHQiCi0gICAgYWRtaW5jbWRzPQotCi0gICAgaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzJGZpbmlzaF9ldmFsIiAmJiB0ZXN0IC1uICIkbGliZGlycyI7IHRoZW4KLSAgICAgIGZvciBkaXIKLSAgICAgIGRvCi0JbGliZGlycz0iJGxpYmRpcnMgJGRpciIKLSAgICAgIGRvbmUKLQotICAgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KLQlpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMiOyB0aGVuCi0JICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgZmluaXNoIGNvbW1hbmRzLgotCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9jbWRzXCIKLQkgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICRzaG93ICIkY21kIgotCSAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGFkbWluY21kcz0iJGFkbWluY21kcwotICAgICAgICRjbWQiCi0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQlmaQotCWlmIHRlc3QgLW4gIiRmaW5pc2hfZXZhbCI7IHRoZW4KLQkgICMgRG8gdGhlIHNpbmdsZSBmaW5pc2hfZXZhbC4KLQkgIGV2YWwgY21kcz1cIiRmaW5pc2hfZXZhbFwiCi0JICAkcnVuIGV2YWwgIiRjbWRzIiB8fCBhZG1pbmNtZHM9IiRhZG1pbmNtZHMKLSAgICAgICAkY21kcyIKLQlmaQotICAgICAgZG9uZQotICAgIGZpCi0KLSAgICAjIEV4aXQgaGVyZSBpZiB0aGV5IHdhbnRlZCBzaWxlbnQgbW9kZS4KLSAgICB0ZXN0ICIkc2hvdyIgPSAiOiIgJiYgZXhpdCAwCi0KLSAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotICAgIGVjaG8gIkxpYnJhcmllcyBoYXZlIGJlZW4gaW5zdGFsbGVkIGluOiIKLSAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbwotICAgICAgZWNobyAiICAgJGxpYmRpciIKLSAgICBkb25lCi0gICAgZWNobwotICAgIGVjaG8gIklmIHlvdSBldmVyIGhhcHBlbiB0byB3YW50IHRvIGxpbmsgYWdhaW5zdCBpbnN0YWxsZWQgbGlicmFyaWVzIgotICAgIGVjaG8gImluIGEgZ2l2ZW4gZGlyZWN0b3J5LCBMSUJESVIsIHlvdSBtdXN0IGVpdGhlciB1c2UgbGlidG9vbCwgYW5kIgotICAgIGVjaG8gInNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGxpYnJhcnksIG9yIHVzZSB0aGUgXGAtTExJQkRJUiciCi0gICAgZWNobyAiZmxhZyBkdXJpbmcgbGlua2luZyBhbmQgZG8gYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmc6IgotICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotICAgICAgZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRzaGxpYnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKLSAgICAgIGVjaG8gIiAgICAgZHVyaW5nIGV4ZWN1dGlvbiIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLSAgICAgIGVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkcnVucGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgotICAgICAgZWNobyAiICAgICBkdXJpbmcgbGlua2luZyIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotICAgICAgbGliZGlyPUxJQkRJUgotICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCi0gICAgICBlY2hvICIgICAtIHVzZSB0aGUgXGAkZmxhZycgbGlua2VyIGZsYWciCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkYWRtaW5jbWRzIjsgdGhlbgotICAgICAgZWNobyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgcnVuIHRoZXNlIGNvbW1hbmRzOiRhZG1pbmNtZHMiCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgotICAgICAgZWNobyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgYWRkIExJQkRJUiB0byBcYC9ldGMvbGQuc28uY29uZiciCi0gICAgZmkKLSAgICBlY2hvCi0gICAgZWNobyAiU2VlIGFueSBvcGVyYXRpbmcgc3lzdGVtIGRvY3VtZW50YXRpb24gYWJvdXQgc2hhcmVkIGxpYnJhcmllcyBmb3IiCi0gICAgZWNobyAibW9yZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgbGQoMSkgYW5kIGxkLnNvKDgpIG1hbnVhbCBwYWdlcy4iCi0gICAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLSAgICBleGl0IDAKLSAgICA7OwotCi0gICMgbGlidG9vbCBleGVjdXRlIG1vZGUKLSAgZXhlY3V0ZSkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBleGVjdXRlIgotCi0gICAgIyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGNvbW1hbmQgbmFtZS4KLSAgICBjbWQ9IiRub25vcHQiCi0gICAgaWYgdGVzdCAteiAiJGNtZCI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBDT01NQU5EIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgIyBIYW5kbGUgLWRsb3BlbiBmbGFncyBpbW1lZGlhdGVseS4KLSAgICBmb3IgZmlsZSBpbiAkZXhlY3V0ZV9kbGZpbGVzOyBkbwotICAgICAgaWYgdGVzdCAhIC1mICIkZmlsZSI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBcYCRmaWxlJyBpcyBub3QgYSBmaWxlIiAxPiYyCi0JJGVjaG8gIiRoZWxwIiAxPiYyCi0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBkaXI9Ci0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmxhKQotCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCi0JaWYgKCR7U0VEfSAtZSAnMnEnICRmaWxlIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCi0JIyBSZWFkIHRoZSBsaWJ0b29sIGxpYnJhcnkuCi0JZGxuYW1lPQotCWxpYnJhcnlfbmFtZXM9Ci0KLQkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQljYXNlICRmaWxlIGluCi0JKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSopIC4gLi8kZmlsZSA7OwotCWVzYWMKLQotCSMgU2tpcCB0aGlzIGxpYnJhcnkgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkLgotCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCi0JICAjIFdhcm4gaWYgaXQgd2FzIGEgc2hhcmVkIGxpYnJhcnkuCi0JICB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkZmlsZScgd2FzIG5vdCBsaW5rZWQgd2l0aCBcYC1leHBvcnQtZHluYW1pYyciCi0JICBjb250aW51ZQotCWZpCi0KLQlkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgotCi0JaWYgdGVzdCAtZiAiJGRpci8kb2JqZGlyLyRkbG5hbWUiOyB0aGVuCi0JICBkaXI9IiRkaXIvJG9iamRpciIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBcYCRkbG5hbWUnIGluIFxgJGRpcicgb3IgXGAkZGlyLyRvYmpkaXInIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBKdXN0IGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIC5sbyBmaWxlLgotCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCi0JOzsKLQotICAgICAgKikKLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nIFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igbm9uLWxpYnRvb2wgbGlicmFyaWVzIGFuZCBvYmplY3RzIiAxPiYyCi0JY29udGludWUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEdldCB0aGUgYWJzb2x1dGUgcGF0aG5hbWUuCi0gICAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0gICAgICB0ZXN0IC1uICIkYWJzZGlyIiAmJiBkaXI9IiRhYnNkaXIiCi0KLSAgICAgICMgTm93IGFkZCB0aGUgZGlyZWN0b3J5IHRvIHNobGlicGF0aF92YXIuCi0gICAgICBpZiBldmFsICJ0ZXN0IC16IFwiXCQkc2hsaWJwYXRoX3ZhclwiIjsgdGhlbgotCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXJcIiIKLSAgICAgIGVsc2UKLQlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyOlwkJHNobGlicGF0aF92YXJcIiIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCBzaGxpYnBhdGhfdmFyCi0gICAgIyByYXRoZXIgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfZXhlY3V0ZV9tYWdpYz0iJG1hZ2ljIgotCi0gICAgIyBDaGVjayBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBhIHdyYXBwZXIgc2NyaXB0LgotICAgIGFyZ3M9Ci0gICAgZm9yIGZpbGUKLSAgICBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgLSopIDs7Ci0gICAgICAqKQotCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KLQlpZiAoJHtTRUR9IC1lICc0cScgJGZpbGUgfCBlZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCSAgY2FzZSAkZmlsZSBpbgotCSAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSAgKikgLiAuLyRmaWxlIDs7Ci0JICBlc2FjCi0KLQkgICMgVHJhbnNmb3JtIGFyZyB0byB3cmFwcGVkIG5hbWUuCi0JICBmaWxlPSIkcHJvZ2Rpci8kcHJvZ3JhbSIKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgICAjIFF1b3RlIGFyZ3VtZW50cyAodG8gcHJlc2VydmUgc2hlbGwgbWV0YWNoYXJhY3RlcnMpLgotICAgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBhcmdzPSIkYXJncyBcIiRmaWxlXCIiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLSAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotCSMgRXhwb3J0IHRoZSBzaGxpYnBhdGhfdmFyLgotCWV2YWwgImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKLSAgICAgIGZpCi0KLSAgICAgICMgUmVzdG9yZSBzYXZlZCBlbnZpcm9tZW50IHZhcmlhYmxlcwotICAgICAgaWYgdGVzdCAiJHtzYXZlX0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbgotCUxDX0FMTD0iJHNhdmVfTENfQUxMIjsgZXhwb3J0IExDX0FMTAotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR7c2F2ZV9MQU5HK3NldH0iID0gc2V0OyB0aGVuCi0JTEFORz0iJHNhdmVfTEFORyI7IGV4cG9ydCBMQU5HCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBwcmVwYXJlIHRvIGFjdHVhbGx5IGV4ZWMgdGhlIGNvbW1hbmQuCi0gICAgICBleGVjX2NtZD0iXCRjbWQkYXJncyIKLSAgICBlbHNlCi0gICAgICAjIERpc3BsYXkgd2hhdCB3b3VsZCBiZSBkb25lLgotICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0JZXZhbCAiXCRlY2hvIFwiXCRzaGxpYnBhdGhfdmFyPVwkJHNobGlicGF0aF92YXJcIiIKLQkkZWNobyAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgotICAgICAgZmkKLSAgICAgICRlY2hvICIkY21kJGFyZ3MiCi0gICAgICBleGl0IDAKLSAgICBmaQotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGNsZWFuIGFuZCB1bmluc3RhbGwgbW9kZQotICBjbGVhbiB8IHVuaW5zdGFsbCkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiAkbW9kZSIKLSAgICBybT0iJG5vbm9wdCIKLSAgICBmaWxlcz0KLSAgICBybWZvcmNlPQotICAgIGV4aXRfc3RhdHVzPTAKLQotICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgotICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgotCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgIC1mKSBybT0iJHJtICRhcmciOyBybWZvcmNlPXllcyA7OwotICAgICAgLSopIHJtPSIkcm0gJGFyZyIgOzsKLSAgICAgICopIGZpbGVzPSIkZmlsZXMgJGFyZyIgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC16ICIkcm0iOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIFJNIHByb2dyYW0iIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIHJtZGlycz0KLQotICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLSAgICAgIGRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiWCRkaXIiID0gIlgkZmlsZSI7IHRoZW4KLQlkaXI9LgotCW9iamRpcj0iJG9iamRpciIKLSAgICAgIGVsc2UKLQlvYmpkaXI9IiRkaXIvJG9iamRpciIKLSAgICAgIGZpCi0gICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0gICAgICB0ZXN0ICRtb2RlID0gdW5pbnN0YWxsICYmIG9iamRpcj0iJGRpciIKLQotICAgICAgIyBSZW1lbWJlciBvYmpkaXIgZm9yIHJlbW92YWwgbGF0ZXIsIGJlaW5nIGNhcmVmdWwgdG8gYXZvaWQgZHVwbGljYXRlcwotICAgICAgaWYgdGVzdCAkbW9kZSA9IGNsZWFuOyB0aGVuCi0JY2FzZSAiICRybWRpcnMgIiBpbgotCSAgKiIgJG9iamRpciAiKikgOzsKLQkgICopIHJtZGlycz0iJHJtZGlycyAkb2JqZGlyIiA7OwotCWVzYWMKLSAgICAgIGZpCi0KLSAgICAgICMgRG9uJ3QgZXJyb3IgaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCBhbmQgcm0gLWYgd2FzIHVzZWQuCi0gICAgICBpZiAodGVzdCAtTCAiJGZpbGUiKSA+L2Rldi9udWxsIDI+JjEgXAotCXx8ICh0ZXN0IC1oICIkZmlsZSIpID4vZGV2L251bGwgMj4mMSBcCi0JfHwgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCi0JOgotICAgICAgZWxpZiB0ZXN0IC1kICIkZmlsZSI7IHRoZW4KLQlleGl0X3N0YXR1cz0xCi0JY29udGludWUKLSAgICAgIGVsaWYgdGVzdCAiJHJtZm9yY2UiID0geWVzOyB0aGVuCi0JY29udGludWUKLSAgICAgIGZpCi0KLSAgICAgIHJtZmlsZXM9IiRmaWxlIgotCi0gICAgICBjYXNlICRuYW1lIGluCi0gICAgICAqLmxhKQotCSMgUG9zc2libHkgYSBsaWJ0b29sIGFyY2hpdmUsIHNvIHZlcmlmeSBpdC4KLQlpZiAoJHtTRUR9IC1lICcycScgJGZpbGUgfCBlZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIC4gJGRpci8kbmFtZQotCi0JICAjIERlbGV0ZSB0aGUgbGlidG9vbCBsaWJyYXJpZXMgYW5kIHN5bWxpbmtzLgotCSAgZm9yIG4gaW4gJGxpYnJhcnlfbmFtZXM7IGRvCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG4iCi0JICBkb25lCi0JICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG9sZF9saWJyYXJ5IgotCSAgdGVzdCAkbW9kZSA9IGNsZWFuICYmIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG5hbWUgJG9iamRpci8ke25hbWV9aSIKLQotCSAgaWYgdGVzdCAkbW9kZSA9IHVuaW5zdGFsbDsgdGhlbgotCSAgICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IHRoZW4KLQkgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KLQkgICAgICBldmFsIGNtZHM9XCIkcG9zdHVuaW5zdGFsbF9jbWRzXCIKLQkgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCQlJRlM9IiRzYXZlX2lmcyIKLQkJJHNob3cgIiRjbWQiCi0JCSRydW4gZXZhbCAiJGNtZCIKLQkJaWYgdGVzdCAkPyAhPSAwICYmIHRlc3QgIiRybWZvcmNlIiAhPSB5ZXM7IHRoZW4KLQkJICBleGl0X3N0YXR1cz0xCi0JCWZpCi0JICAgICAgZG9uZQotCSAgICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KLQkgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgb2xkX3Bvc3R1bmluc3RhbGwgY29tbWFuZHMuCi0JICAgICAgZXZhbCBjbWRzPVwiJG9sZF9wb3N0dW5pbnN0YWxsX2NtZHNcIgotCSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JCUlGUz0iJHNhdmVfaWZzIgotCQkkc2hvdyAiJGNtZCIKLQkJJHJ1biBldmFsICIkY21kIgotCQlpZiB0ZXN0ICQ/ICE9IDAgJiYgdGVzdCAiJHJtZm9yY2UiICE9IHllczsgdGhlbgotCQkgIGV4aXRfc3RhdHVzPTEKLQkJZmkKLQkgICAgICBkb25lCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgIGZpCi0JICAgICMgRklYTUU6IHNob3VsZCByZWluc3RhbGwgdGhlIGJlc3QgcmVtYWluaW5nIHNoYXJlZCBsaWJyYXJ5LgotCSAgZmkKLQlmaQotCTs7Ci0KLSAgICAgICoubG8pCi0JaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCSAgb2xkb2JqPWAkZWNobyAiWCRuYW1lIiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRvbGRvYmoiCi0JZmkKLQk7OwotCi0gICAgICAqKQotCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIGEgbGlidG9vbCBwcm9ncmFtLgotCWlmIHRlc3QgJG1vZGUgPSBjbGVhbiAmJgotCSAgICgke1NFRH0gLWUgJzRxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgcmVsaW5rX2NvbW1hbmQ9Ci0JICAuICRkaXIvJGZpbGUKLQotCSAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kbmFtZSAkb2JqZGlyLyR7bmFtZX1TLiR7b2JqZXh0fSIKLQkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KLQkgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci9sdC0kbmFtZSIKLQkgIGZpCi0JZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgJHNob3cgIiRybSAkcm1maWxlcyIKLSAgICAgICRydW4gJHJtICRybWZpbGVzIHx8IGV4aXRfc3RhdHVzPTEKLSAgICBkb25lCi0KLSAgICAjIFRyeSB0byByZW1vdmUgdGhlICR7b2JqZGlyfXMgaW4gdGhlIGRpcmVjdG9yaWVzIHdoZXJlIHdlIGRlbGV0ZWQgZmlsZXMKLSAgICBmb3IgZGlyIGluICRybWRpcnM7IGRvCi0gICAgICBpZiB0ZXN0IC1kICIkZGlyIjsgdGhlbgotCSRzaG93ICJybWRpciAkZGlyIgotCSRydW4gcm1kaXIgJGRpciA+L2Rldi9udWxsIDI+JjEKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgZXhpdCAkZXhpdF9zdGF0dXMKLSAgICA7OwotCi0gICIiKQotICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFIiAxPiYyCi0gICAgJGVjaG8gIiRnZW5lcmljX2hlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgICA7OwotICBlc2FjCi0KLSAgaWYgdGVzdCAteiAiJGV4ZWNfY21kIjsgdGhlbgotICAgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciIDE+JjIKLSAgICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgotICAgIGV4aXQgMQotICBmaQotZmkgIyB0ZXN0IC16ICIkc2hvd19oZWxwIgotCi1pZiB0ZXN0IC1uICIkZXhlY19jbWQiOyB0aGVuCi0gIGV2YWwgZXhlYyAkZXhlY19jbWQKLSAgZXhpdCAxCi1maQotCi0jIFdlIG5lZWQgdG8gZGlzcGxheSBoZWxwIGZvciBlYWNoIG9mIHRoZSBtb2Rlcy4KLWNhc2UgJG1vZGUgaW4KLSIiKSAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiBbTU9ERS1BUkddLi4uCi0KLVByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgotCi0gICAgLS1jb25maWcgICAgICAgICAgc2hvdyBhbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKLSAgICAtLWRlYnVnICAgICAgICAgICBlbmFibGUgdmVyYm9zZSBzaGVsbCB0cmFjaW5nCi0tbiwgLS1kcnktcnVuICAgICAgICAgZGlzcGxheSBjb21tYW5kcyB3aXRob3V0IG1vZGlmeWluZyBhbnkgZmlsZXMKLSAgICAtLWZlYXR1cmVzICAgICAgICBkaXNwbGF5IGJhc2ljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLSAgICAtLWZpbmlzaCAgICAgICAgICBzYW1lIGFzIFxgLS1tb2RlPWZpbmlzaCcKLSAgICAtLWhlbHAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0Ci0gICAgLS1tb2RlPU1PREUgICAgICAgdXNlIG9wZXJhdGlvbiBtb2RlIE1PREUgW2RlZmF1bHQ9aW5mZXJyZWQgZnJvbSBNT0RFLUFSR1NdCi0gICAgLS1xdWlldCAgICAgICAgICAgc2FtZSBhcyBcYC0tc2lsZW50JwotICAgIC0tc2lsZW50ICAgICAgICAgIGRvbid0IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKLSAgICAtLXZlcnNpb24gICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCi0KLU1PREUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgICAgY2xlYW4gICAgICAgICAgIHJlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkKLSAgICAgIGNvbXBpbGUgICAgICAgICBjb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgb2JqZWN0Ci0gICAgICBleGVjdXRlICAgICAgICAgYXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0KLSAgICAgIGZpbmlzaCAgICAgICAgICBjb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzCi0gICAgICBpbnN0YWxsICAgICAgICAgaW5zdGFsbCBsaWJyYXJpZXMgb3IgZXhlY3V0YWJsZXMKLSAgICAgIGxpbmsgICAgICAgICAgICBjcmVhdGUgYSBsaWJyYXJ5IG9yIGFuIGV4ZWN1dGFibGUKLSAgICAgIHVuaW5zdGFsbCAgICAgICByZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGVkIGRpcmVjdG9yeQotCi1NT0RFLUFSR1MgdmFyeSBkZXBlbmRpbmcgb24gdGhlIE1PREUuICBUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT1NT0RFJyBmb3IKLWEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBNT0RFLiIKLSAgZXhpdCAwCi0gIDs7Ci0KLWNsZWFuKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y2xlYW4gUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgotCi1SZW1vdmUgZmlsZXMgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5LgotCi1STSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKLSh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKLXRvIFJNLgotCi1JZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBvYmplY3Qgb3IgcHJvZ3JhbSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkCi13aXRoIGl0IGFyZSBkZWxldGVkLiBPdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCi0gIDs7Ci0KLWNvbXBpbGUpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jb21waWxlIENPTVBJTEUtQ09NTUFORC4uLiBTT1VSQ0VGSUxFCi0KLUNvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBsaWJyYXJ5IG9iamVjdC4KLQotVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6Ci0KLSAgLW8gT1VUUFVULUZJTEUgICAgc2V0IHRoZSBvdXRwdXQgZmlsZSBuYW1lIHRvIE9VVFBVVC1GSUxFCi0gIC1wcmVmZXItcGljICAgICAgIHRyeSB0byBidWlsZGluZyBQSUMgb2JqZWN0cyBvbmx5Ci0gIC1wcmVmZXItbm9uLXBpYyAgIHRyeSB0byBidWlsZGluZyBub24tUElDIG9iamVjdHMgb25seQotICAtc3RhdGljICAgICAgICAgICBhbHdheXMgYnVpbGQgYSBcYC5vJyBmaWxlIHN1aXRhYmxlIGZvciBzdGF0aWMgbGlua2luZwotCi1DT01QSUxFLUNPTU1BTkQgaXMgYSBjb21tYW5kIHRvIGJlIHVzZWQgaW4gY3JlYXRpbmcgYSBcYHN0YW5kYXJkJyBvYmplY3QgZmlsZQotZnJvbSB0aGUgZ2l2ZW4gU09VUkNFRklMRS4KLQotVGhlIG91dHB1dCBmaWxlIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSByZW1vdmluZyB0aGUgZGlyZWN0b3J5IGNvbXBvbmVudCBmcm9tCi1TT1VSQ0VGSUxFLCB0aGVuIHN1YnN0aXR1dGluZyB0aGUgQyBzb3VyY2UgY29kZSBzdWZmaXggXGAuYycgd2l0aCB0aGUKLWxpYnJhcnkgb2JqZWN0IHN1ZmZpeCwgXGAubG8nLiIKLSAgOzsKLQotZXhlY3V0ZSkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWV4ZWN1dGUgQ09NTUFORCBbQVJHU10uLi4KLQotQXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0uCi0KLVRoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgotCi0gIC1kbG9wZW4gRklMRSAgICAgIGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgRklMRSB0byB0aGUgbGlicmFyeSBwYXRoCi0KLVRoaXMgbW9kZSBzZXRzIHRoZSBsaWJyYXJ5IHBhdGggZW52aXJvbm1lbnQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIFxgLWRsb3BlbicKLWZsYWdzLgotCi1JZiBhbnkgb2YgdGhlIEFSR1MgYXJlIGxpYnRvb2wgZXhlY3V0YWJsZSB3cmFwcGVycywgdGhlbiB0aGV5IGFyZSB0cmFuc2xhdGVkCi1pbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdW5pbnN0YWxsZWQgYmluYXJ5LCBhbmQgYW55IG9mIHRoZWlyIHJlcXVpcmVkIGxpYnJhcnkKLWRpcmVjdG9yaWVzIGFyZSBhZGRlZCB0byB0aGUgbGlicmFyeSBwYXRoLgotCi1UaGVuLCBDT01NQU5EIGlzIGV4ZWN1dGVkLCB3aXRoIEFSR1MgYXMgYXJndW1lbnRzLiIKLSAgOzsKLQotZmluaXNoKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZmluaXNoIFtMSUJESVJdLi4uCi0KLUNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMuCi0KLUVhY2ggTElCRElSIGlzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgbGlidG9vbCBsaWJyYXJpZXMuCi0KLVRoZSBjb21tYW5kcyB0aGF0IHRoaXMgbW9kZSBleGVjdXRlcyBtYXkgcmVxdWlyZSBzdXBlcnVzZXIgcHJpdmlsZWdlcy4gIFVzZQotdGhlIFxgLS1kcnktcnVuJyBvcHRpb24gaWYgeW91IGp1c3Qgd2FudCB0byBzZWUgd2hhdCB3b3VsZCBiZSBleGVjdXRlZC4iCi0gIDs7Ci0KLWluc3RhbGwpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1pbnN0YWxsIElOU1RBTEwtQ09NTUFORC4uLgotCi1JbnN0YWxsIGV4ZWN1dGFibGVzIG9yIGxpYnJhcmllcy4KLQotSU5TVEFMTC1DT01NQU5EIGlzIHRoZSBpbnN0YWxsYXRpb24gY29tbWFuZC4gIFRoZSBmaXJzdCBjb21wb25lbnQgc2hvdWxkIGJlCi1laXRoZXIgdGhlIFxgaW5zdGFsbCcgb3IgXGBjcCcgcHJvZ3JhbS4KLQotVGhlIHJlc3Qgb2YgdGhlIGNvbXBvbmVudHMgYXJlIGludGVycHJldGVkIGFzIGFyZ3VtZW50cyB0byB0aGF0IGNvbW1hbmQgKG9ubHkKLUJTRC1jb21wYXRpYmxlIGluc3RhbGwgb3B0aW9ucyBhcmUgcmVjb2duaXplZCkuIgotICA7OwotCi1saW5rKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9bGluayBMSU5LLUNPTU1BTkQuLi4KLQotTGluayBvYmplY3QgZmlsZXMgb3IgbGlicmFyaWVzIHRvZ2V0aGVyIHRvIGZvcm0gYW5vdGhlciBsaWJyYXJ5LCBvciB0bwotY3JlYXRlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4KLQotTElOSy1DT01NQU5EIGlzIGEgY29tbWFuZCB1c2luZyB0aGUgQyBjb21waWxlciB0aGF0IHlvdSB3b3VsZCB1c2UgdG8gY3JlYXRlCi1hIHByb2dyYW0gZnJvbSBzZXZlcmFsIG9iamVjdCBmaWxlcy4KLQotVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIG9mIExJTkstQ09NTUFORCBhcmUgdHJlYXRlZCBzcGVjaWFsbHk6Ci0KLSAgLWFsbC1zdGF0aWMgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgYXQgYWxsCi0gIC1hdm9pZC12ZXJzaW9uICAgIGRvIG5vdCBhZGQgYSB2ZXJzaW9uIHN1ZmZpeCBpZiBwb3NzaWJsZQotICAtZGxvcGVuIEZJTEUgICAgICBcYC1kbHByZW9wZW4nIEZJTEUgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkIGF0IHJ1bnRpbWUKLSAgLWRscHJlb3BlbiBGSUxFICAgbGluayBpbiBGSUxFIGFuZCBhZGQgaXRzIHN5bWJvbHMgdG8gbHRfcHJlbG9hZGVkX3N5bWJvbHMKLSAgLWV4cG9ydC1keW5hbWljICAgYWxsb3cgc3ltYm9scyBmcm9tIE9VVFBVVC1GSUxFIHRvIGJlIHJlc29sdmVkIHdpdGggZGxzeW0oMykKLSAgLWV4cG9ydC1zeW1ib2xzIFNZTUZJTEUKLQkJICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBsaXN0ZWQgaW4gU1lNRklMRQotICAtZXhwb3J0LXN5bWJvbHMtcmVnZXggUkVHRVgKLQkJICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBtYXRjaGluZyBSRUdFWAotICAtTExJQkRJUiAgICAgICAgICBzZWFyY2ggTElCRElSIGZvciByZXF1aXJlZCBpbnN0YWxsZWQgbGlicmFyaWVzCi0gIC1sTkFNRSAgICAgICAgICAgIE9VVFBVVC1GSUxFIHJlcXVpcmVzIHRoZSBpbnN0YWxsZWQgbGlicmFyeSBsaWJOQU1FCi0gIC1tb2R1bGUgICAgICAgICAgIGJ1aWxkIGEgbGlicmFyeSB0aGF0IGNhbiBkbG9wZW5lZAotICAtbm8tZmFzdC1pbnN0YWxsICBkaXNhYmxlIHRoZSBmYXN0LWluc3RhbGwgbW9kZQotICAtbm8taW5zdGFsbCAgICAgICBsaW5rIGEgbm90LWluc3RhbGxhYmxlIGV4ZWN1dGFibGUKLSAgLW5vLXVuZGVmaW5lZCAgICAgZGVjbGFyZSB0aGF0IGEgbGlicmFyeSBkb2VzIG5vdCByZWZlciB0byBleHRlcm5hbCBzeW1ib2xzCi0gIC1vIE9VVFBVVC1GSUxFICAgIGNyZWF0ZSBPVVRQVVQtRklMRSBmcm9tIHRoZSBzcGVjaWZpZWQgb2JqZWN0cwotICAtcmVsZWFzZSBSRUxFQVNFICBzcGVjaWZ5IHBhY2thZ2UgcmVsZWFzZSBpbmZvcm1hdGlvbgotICAtcnBhdGggTElCRElSICAgICB0aGUgY3JlYXRlZCBsaWJyYXJ5IHdpbGwgZXZlbnR1YWxseSBiZSBpbnN0YWxsZWQgaW4gTElCRElSCi0gIC1SWyBdTElCRElSICAgICAgIGFkZCBMSUJESVIgdG8gdGhlIHJ1bnRpbWUgcGF0aCBvZiBwcm9ncmFtcyBhbmQgbGlicmFyaWVzCi0gIC1zdGF0aWMgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIGxpYnRvb2wgbGlicmFyaWVzCi0gIC12ZXJzaW9uLWluZm8gQ1VSUkVOVFs6UkVWSVNJT05bOkFHRV1dCi0JCSAgICBzcGVjaWZ5IGxpYnJhcnkgdmVyc2lvbiBpbmZvIFtlYWNoIHZhcmlhYmxlIGRlZmF1bHRzIHRvIDBdCi0KLUFsbCBvdGhlciBvcHRpb25zIChhcmd1bWVudHMgYmVnaW5uaW5nIHdpdGggXGAtJykgYXJlIGlnbm9yZWQuCi0KLUV2ZXJ5IG90aGVyIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgYSBmaWxlbmFtZS4gIEZpbGVzIGVuZGluZyBpbiBcYC5sYScgYXJlCi10cmVhdGVkIGFzIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzLCBvdGhlciBmaWxlcyBhcmUgc3RhbmRhcmQgb3IgbGlicmFyeQotb2JqZWN0IGZpbGVzLgotCi1JZiB0aGUgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sYScsIHRoZW4gYSBsaWJ0b29sIGxpYnJhcnkgaXMgY3JlYXRlZCwKLW9ubHkgbGlicmFyeSBvYmplY3RzIChcYC5sbycgZmlsZXMpIG1heSBiZSBzcGVjaWZpZWQsIGFuZCBcYC1ycGF0aCcgaXMKLXJlcXVpcmVkLCBleGNlcHQgd2hlbiBjcmVhdGluZyBhIGNvbnZlbmllbmNlIGxpYnJhcnkuCi0KLUlmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAuYScgb3IgXGAubGliJywgdGhlbiBhIHN0YW5kYXJkIGxpYnJhcnkgaXMgY3JlYXRlZAotdXNpbmcgXGBhcicgYW5kIFxgcmFubGliJywgb3Igb24gV2luZG93cyB1c2luZyBcYGxpYicuCi0KLUlmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubG8nIG9yIFxgLiR7b2JqZXh0fScsIHRoZW4gYSByZWxvYWRhYmxlIG9iamVjdCBmaWxlCi1pcyBjcmVhdGVkLCBvdGhlcndpc2UgYW4gZXhlY3V0YWJsZSBwcm9ncmFtIGlzIGNyZWF0ZWQuIgotICA7OwotCi11bmluc3RhbGwpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT11bmluc3RhbGwgUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgotCi1SZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQotUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCi0odHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCi10byBSTS4KLQotSWYgRklMRSBpcyBhIGxpYnRvb2wgbGlicmFyeSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggaXQgYXJlIGRlbGV0ZWQuCi1PdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCi0gIDs7Ci0KLSopCi0gICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciIDE+JjIKLSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotICA7OwotZXNhYwotCi1lY2hvCi0kZWNobyAiVHJ5IFxgJG1vZGVuYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgbW9kZXMuIgotCi1leGl0IDAKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6c2hlbGwtc2NyaXB0Ci0jIHNoLWluZGVudGF0aW9uOjIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvbWFrZWNmZy5jIGIvbWFrZWNmZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODdlYTM3Li4wMDAwMDAwCi0tLSBhL21ha2VjZmcuYworKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vKgotICogbWFrZWNmZy5jCi0gKgotICogeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGpzaW1kZXh0LmluYwotICogTGFzdCBNb2RpZmllZCA6IE1hcmNoIDIzLCAyMDA1Ci0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0jaWZuZGVmIG9mZnNldG9mCQkvKiBkZWZpbmVkIGluIDxzdGRkZWYuaD4gKi8KLSNkZWZpbmUgb2Zmc2V0b2YodHlwZSwgbWVtKSAoKHNpemVfdCkgXAotCQkoKGNoYXIgKikmKCh0eXBlICopMCktPm1lbSAtIChjaGFyICopKHR5cGUgKikwKSkKLSNlbmRpZgotCi12b2lkCi1wcmludF9zdHJ1Y3R1cmVfb2Zmc2V0ICh2b2lkKQotewotICBwcmludGYoIlxuIik7Ci0gIHByaW50ZigiOyAtLS0tIG1hY3JvcyBmb3Igc3RydWN0dXJlIGFjY2VzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gIHByaW50ZigiXG4iKTsKLQotICBwcmludGYoIjsgc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0XG5cbiIpOwotICBwcmludGYoIiUlZGVmaW5lIGpjc3RydWN0X2ltYWdlX3dpZHRoKGIpICAgICAgICAgKChiKSArICUzdSkgOyBjaW5mby0+aW1hZ2Vfd2lkdGhcbiIsCi0JKHVuc2lnbmVkKW9mZnNldG9mKHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCwgaW1hZ2Vfd2lkdGgpKTsKLSAgcHJpbnRmKCIlJWRlZmluZSBqY3N0cnVjdF9tYXhfdl9zYW1wX2ZhY3RvcihiKSAgICgoYikgKyAlM3UpIDsgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yXG4iLAotCSh1bnNpZ25lZClvZmZzZXRvZihzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QsIG1heF92X3NhbXBfZmFjdG9yKSk7Ci0gIHByaW50ZigiXG4iKTsKLQotICBwcmludGYoIjsgc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3RcblxuIik7Ci0gIHByaW50ZigiJSVkZWZpbmUgamRzdHJ1Y3Rfb3V0cHV0X3dpZHRoKGIpICAgICAgICAoKGIpICsgJTN1KSA7IGNpbmZvLT5vdXRwdXRfd2lkdGhcbiIsCi0JKHVuc2lnbmVkKW9mZnNldG9mKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0LCBvdXRwdXRfd2lkdGgpKTsKLSAgcHJpbnRmKCIlJWRlZmluZSBqZHN0cnVjdF9tYXhfdl9zYW1wX2ZhY3RvcihiKSAgICgoYikgKyAlM3UpIDsgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yXG4iLAotCSh1bnNpZ25lZClvZmZzZXRvZihzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCwgbWF4X3Zfc2FtcF9mYWN0b3IpKTsKLSAgcHJpbnRmKCIlJWRlZmluZSBqZHN0cnVjdF9zYW1wbGVfcmFuZ2VfbGltaXQoYikgICgoYikgKyAlM3UpIDsgY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdFxuIiwKLQkodW5zaWduZWQpb2Zmc2V0b2Yoc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QsIHNhbXBsZV9yYW5nZV9saW1pdCkpOwotICBwcmludGYoIlxuIik7Ci0KLSAgcHJpbnRmKCI7IGpwZWdfY29tcG9uZW50X2luZm9cblxuIik7Ci0gIHByaW50ZigiJSVkZWZpbmUgamNvbXBpbmZvX3Zfc2FtcF9mYWN0b3IoYikgICAgICAoKGIpICsgJTJ1KSA7IGNvbXBwdHItPnZfc2FtcF9mYWN0b3JcbiIsCi0JKHVuc2lnbmVkKW9mZnNldG9mKGpwZWdfY29tcG9uZW50X2luZm8sIHZfc2FtcF9mYWN0b3IpKTsKLSAgcHJpbnRmKCIlJWRlZmluZSBqY29tcGluZm9fd2lkdGhfaW5fYmxvY2tzKGIpICAgICgoYikgKyAlMnUpIDsgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzXG4iLAotCSh1bnNpZ25lZClvZmZzZXRvZihqcGVnX2NvbXBvbmVudF9pbmZvLCB3aWR0aF9pbl9ibG9ja3MpKTsKLSAgcHJpbnRmKCIlJWRlZmluZSBqY29tcGluZm9fZG93bnNhbXBsZWRfd2lkdGgoYikgICgoYikgKyAlMnUpIDsgY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGhcbiIsCi0JKHVuc2lnbmVkKW9mZnNldG9mKGpwZWdfY29tcG9uZW50X2luZm8sIGRvd25zYW1wbGVkX3dpZHRoKSk7Ci0gIHByaW50ZigiJSVkZWZpbmUgamNvbXBpbmZvX2RjdF90YWJsZShiKSAgICAgICAgICAoKGIpICsgJTJ1KSA7IGNvbXBwdHItPmRjdF90YWJsZVxuIiwKLQkodW5zaWduZWQpb2Zmc2V0b2YoanBlZ19jb21wb25lbnRfaW5mbywgZGN0X3RhYmxlKSk7Ci0gIHByaW50ZigiXG4iKTsKLX0KLQotCi12b2lkCi1wcmludF9qY29uZmlnX2hfbWFjcm8gKHZvaWQpCi17Ci0gIHByaW50ZigiXG4iKTsKLSAgcHJpbnRmKCI7IC0tLS0gbWFjcm9zIGZyb20gamNvbmZpZy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLSAgcHJpbnRmKCJcbiIpOwotCi0jaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotICBwcmludGYoIiUlZGVmaW5lIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVNcdDsgVXNlIHNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzXG4iKTsKLSNlbHNlCi0gIHByaW50ZigiJSV1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTXHQ7IFVzZSBzaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lc1xuIik7Ci0jZW5kaWYKLSAgcHJpbnRmKCJcbiIpOwotfQotCi0KLXZvaWQKLXByaW50X2ptb3JlY2ZnX2hfbWFjcm8gKHZvaWQpCi17Ci0gIHByaW50ZigiXG4iKTsKLSAgcHJpbnRmKCI7IC0tLS0gbWFjcm9zIGZyb20gam1vcmVjZmcuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLSAgcHJpbnRmKCJcbiIpOwotCi0gIHByaW50ZigiOyBDYXBhYmlsaXR5IG9wdGlvbnMgY29tbW9uIHRvIGVuY29kZXIgYW5kIGRlY29kZXI6XG4iKTsKLSAgcHJpbnRmKCJcbiIpOwotI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKLSAgcHJpbnRmKCIlJWRlZmluZSBEQ1RfSVNMT1dfU1VQUE9SVEVEXHQ7IHNsb3cgYnV0IGFjY3VyYXRlIGludGVnZXIgYWxnb3JpdGhtXG4iKTsKLSNlbHNlCi0gIHByaW50ZigiJSV1bmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVEXHQ7IHNsb3cgYnV0IGFjY3VyYXRlIGludGVnZXIgYWxnb3JpdGhtXG4iKTsKLSNlbmRpZgotI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKLSAgcHJpbnRmKCIlJWRlZmluZSBEQ1RfSUZBU1RfU1VQUE9SVEVEXHQ7IGZhc3RlciwgbGVzcyBhY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZFxuIik7Ci0jZWxzZQotICBwcmludGYoIiUldW5kZWYgRENUX0lGQVNUX1NVUFBPUlRFRFx0OyBmYXN0ZXIsIGxlc3MgYWNjdXJhdGUgaW50ZWdlciBtZXRob2RcbiIpOwotI2VuZGlmCi0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotICBwcmludGYoIiUlZGVmaW5lIERDVF9GTE9BVF9TVVBQT1JURURcdDsgZmxvYXRpbmctcG9pbnQ6IGFjY3VyYXRlLCBmYXN0IG9uIGZhc3QgSFdcbiIpOwotI2Vsc2UKLSAgcHJpbnRmKCIlJXVuZGVmIERDVF9GTE9BVF9TVVBQT1JURURcdDsgZmxvYXRpbmctcG9pbnQ6IGFjY3VyYXRlLCBmYXN0IG9uIGZhc3QgSFdcbiIpOwotI2VuZGlmCi0gIHByaW50ZigiXG4iKTsKLQotICBwcmludGYoIjsgRGVjb2RlciBjYXBhYmlsaXR5IG9wdGlvbnM6XG4iKTsKLSAgcHJpbnRmKCJcbiIpOwotI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKLSAgcHJpbnRmKCIlJWRlZmluZSBJRENUX1NDQUxJTkdfU1VQUE9SVEVEXHRcdDsgT3V0cHV0IHJlc2NhbGluZyB2aWEgSURDVD9cbiIpOwotI2Vsc2UKLSAgcHJpbnRmKCIlJXVuZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURURcdFx0OyBPdXRwdXQgcmVzY2FsaW5nIHZpYSBJRENUP1xuIik7Ci0jZW5kaWYKLSNpZmRlZiBVUFNBTVBMRV9NRVJHSU5HX1NVUFBPUlRFRAotICBwcmludGYoIiUlZGVmaW5lIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVEXHQ7IEZhc3QgcGF0aCBmb3Igc2xvcHB5IHVwc2FtcGxpbmc/XG4iKTsKLSNlbHNlCi0gIHByaW50ZigiJSV1bmRlZiBVUFNBTVBMRV9NRVJHSU5HX1NVUFBPUlRFRFx0OyBGYXN0IHBhdGggZm9yIHNsb3BweSB1cHNhbXBsaW5nP1xuIik7Ci0jZW5kaWYKLSNpZmRlZiBVUFNBTVBMRV9IMVYyX1NVUFBPUlRFRAotICBwcmludGYoIiUlZGVmaW5lIFVQU0FNUExFX0gxVjJfU1VQUE9SVEVEXHRcdDsgRmFzdC9mYW5jeSBwcm9jZXNzaW5nIGZvciAxaDJ2P1xuIik7Ci0jZWxzZQotICBwcmludGYoIiUldW5kZWYgVVBTQU1QTEVfSDFWMl9TVVBQT1JURURcdFx0OyBGYXN0L2ZhbmN5IHByb2Nlc3NpbmcgZm9yIDFoMnY/XG4iKTsKLSNlbmRpZgotICBwcmludGYoIlxuIik7Ci0KLSNpZiAoUkdCX1BJWEVMU0laRSA9PSAzIHx8IFJHQl9QSVhFTFNJWkUgPT0gNCkgJiYgXAotICAgIChSR0JfUkVEIDwgMCB8fCBSR0JfUkVEID49IFJHQl9QSVhFTFNJWkUgfHwgUkdCX0dSRUVOIDwgMCB8fCBcCi0gICAgIFJHQl9HUkVFTiA+PSBSR0JfUElYRUxTSVpFIHx8IFJHQl9CTFVFIDwgMCB8fCBSR0JfQkxVRSA+PSBSR0JfUElYRUxTSVpFIHx8IFwKLSAgICAgUkdCX1JFRCA9PSBSR0JfR1JFRU4gfHwgUkdCX0dSRUVOID09IFJHQl9CTFVFIHx8IFJHQl9SRUQgPT0gUkdCX0JMVUUpCi0jZXJyb3IgIkluY29ycmVjdCBSR0IgcGl4ZWwgb2Zmc2V0LiIKLSNlbmRpZgotICBwcmludGYoIjsgT3JkZXJpbmcgb2YgUkdCIGRhdGEgaW4gc2NhbmxpbmVzIHBhc3NlZCB0byBvciBmcm9tIHRoZSBhcHBsaWNhdGlvbi5cbiIpOwotICBwcmludGYoIlxuIik7Ci0gIHByaW50ZigiJSVkZWZpbmUgUkdCX1JFRFx0XHQldVx0OyBPZmZzZXQgb2YgUmVkIGluIGFuIFJHQiBzY2FubGluZSBlbGVtZW50XG4iLCBSR0JfUkVEKTsKLSAgcHJpbnRmKCIlJWRlZmluZSBSR0JfR1JFRU5cdCV1XHQ7IE9mZnNldCBvZiBHcmVlblxuIiwgUkdCX0dSRUVOKTsKLSAgcHJpbnRmKCIlJWRlZmluZSBSR0JfQkxVRVx0JXVcdDsgT2Zmc2V0IG9mIEJsdWVcbiIsIFJHQl9CTFVFKTsKLSAgcHJpbnRmKCIlJWRlZmluZSBSR0JfUElYRUxTSVpFXHQldVx0OyBKU0FNUExFcyBwZXIgUkdCIHNjYW5saW5lIGVsZW1lbnRcbiIsIFJHQl9QSVhFTFNJWkUpOwotICBwcmludGYoIlxuIik7Ci0jaWZkZWYgUkdCWF9GSUxMRVJfMFhGRgotICBwcmludGYoIiUlZGVmaW5lIFJHQlhfRklMTEVSXzBYRkZcdDsgZmlsbCBkdW1teSBieXRlcyB3aXRoIDB4RkYgaW4gUkdCWCBmb3JtYXRcbiIpOwotI2Vsc2UKLSAgcHJpbnRmKCIlJXVuZGVmIFJHQlhfRklMTEVSXzBYRkZcdFx0OyBmaWxsIGR1bW15IGJ5dGVzIHdpdGggMHhGRiBpbiBSR0JYIGZvcm1hdFxuIik7Ci0jZW5kaWYKLSAgcHJpbnRmKCJcbiIpOwotCi0gIHByaW50ZigiOyBTSU1EIHN1cHBvcnQgb3B0aW9ucyAoZW5jb2Rlcik6XG4iKTsKLSAgcHJpbnRmKCJcbiIpOwotI2lmZGVmIEpDQ09MT1JfUkdCWUNDX01NWF9TVVBQT1JURUQKLSAgcHJpbnRmKCIlJWRlZmluZSBKQ0NPTE9SX1JHQllDQ19NTVhfU1VQUE9SVEVEXHQ7IFJHQi0+WUNDIGNvbnZlcnNpb24gd2l0aCBNTVhcbiIpOwotI2Vsc2UKLSAgcHJpbnRmKCIlJXVuZGVmIEpDQ09MT1JfUkdCWUNDX01NWF9TVVBQT1JURURcdDsgUkdCLT5ZQ0MgY29udmVyc2lvbiB3aXRoIE1NWFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBKQ0NPTE9SX1JHQllDQ19TU0UyX1NVUFBPUlRFRAotICBwcmludGYoIiUlZGVmaW5lIEpDQ09MT1JfUkdCWUNDX1NTRTJfU1VQUE9SVEVEXHQ7IFJHQi0+WUNDIGNvbnZlcnNpb24gd2l0aCBTU0UyXG4iKTsKLSNlbHNlCi0gIHByaW50ZigiJSV1bmRlZiBKQ0NPTE9SX1JHQllDQ19TU0UyX1NVUFBPUlRFRFx0OyBSR0ItPllDQyBjb252ZXJzaW9uIHdpdGggU1NFMlxuIik7Ci0jZW5kaWYKLSNpZmRlZiBKQ1NBTVBMRV9NTVhfU1VQUE9SVEVECi0gIHByaW50ZigiJSVkZWZpbmUgSkNTQU1QTEVfTU1YX1NVUFBPUlRFRFx0XHQ7IGRvd25zYW1wbGluZyB3aXRoIE1NWFxuIik7Ci0jZWxzZQotICBwcmludGYoIiUldW5kZWYgSkNTQU1QTEVfTU1YX1NVUFBPUlRFRFx0XHQ7IGRvd25zYW1wbGluZyB3aXRoIE1NWFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBKQ1NBTVBMRV9TU0UyX1NVUFBPUlRFRAotICBwcmludGYoIiUlZGVmaW5lIEpDU0FNUExFX1NTRTJfU1VQUE9SVEVEXHRcdDsgZG93bnNhbXBsaW5nIHdpdGggU1NFMlxuIik7Ci0jZWxzZQotICBwcmludGYoIiUldW5kZWYgSkNTQU1QTEVfU1NFMl9TVVBQT1JURURcdFx0OyBkb3duc2FtcGxpbmcgd2l0aCBTU0UyXG4iKTsKLSNlbmRpZgotI2lmZGVmIEpGRENUX0lOVF9NTVhfU1VQUE9SVEVECi0gIHByaW50ZigiJSVkZWZpbmUgSkZEQ1RfSU5UX01NWF9TVVBQT1JURURcdFx0OyBmb3J3YXJkIERDVCB3aXRoIE1NWFxuIik7Ci0jZWxzZQotICBwcmludGYoIiUldW5kZWYgSkZEQ1RfSU5UX01NWF9TVVBQT1JURURcdFx0OyBmb3J3YXJkIERDVCB3aXRoIE1NWFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBKRkRDVF9JTlRfU1NFMl9TVVBQT1JURUQKLSAgcHJpbnRmKCIlJWRlZmluZSBKRkRDVF9JTlRfU1NFMl9TVVBQT1JURURcdDsgZm9yd2FyZCBEQ1Qgd2l0aCBTU0UyXG4iKTsKLSNlbHNlCi0gIHByaW50ZigiJSV1bmRlZiBKRkRDVF9JTlRfU1NFMl9TVVBQT1JURURcdFx0OyBmb3J3YXJkIERDVCB3aXRoIFNTRTJcbiIpOwotI2VuZGlmCi0jaWZkZWYgSkZEQ1RfRkxUXzNETk9XX01NWF9TVVBQT1JURUQKLSAgcHJpbnRmKCIlJWRlZmluZSBKRkRDVF9GTFRfM0ROT1dfTU1YX1NVUFBPUlRFRFx0OyBmb3J3YXJkIERDVCB3aXRoIDNETm93IS9NTVhcbiIpOwotI2Vsc2UKLSAgcHJpbnRmKCIlJXVuZGVmIEpGRENUX0ZMVF8zRE5PV19NTVhfU1VQUE9SVEVEXHQ7IGZvcndhcmQgRENUIHdpdGggM0ROb3chL01NWFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBKRkRDVF9GTFRfU1NFX01NWF9TVVBQT1JURUQKLSAgcHJpbnRmKCIlJWRlZmluZSBKRkRDVF9GTFRfU1NFX01NWF9TVVBQT1JURURcdDsgZm9yd2FyZCBEQ1Qgd2l0aCBTU0UvTU1YXG4iKTsKLSNlbHNlCi0gIHByaW50ZigiJSV1bmRlZiBKRkRDVF9GTFRfU1NFX01NWF9TVVBQT1JURURcdDsgZm9yd2FyZCBEQ1Qgd2l0aCBTU0UvTU1YXG4iKTsKLSNlbmRpZgotI2lmZGVmIEpGRENUX0ZMVF9TU0VfU1NFMl9TVVBQT1JURUQKLSAgcHJpbnRmKCIlJWRlZmluZSBKRkRDVF9GTFRfU1NFX1NTRTJfU1VQUE9SVEVEXHQ7IGZvcndhcmQgRENUIHdpdGggU1NFL1NTRTJcbiIpOwotI2Vsc2UKLSAgcHJpbnRmKCIlJXVuZGVmIEpGRENUX0ZMVF9TU0VfU1NFMl9TVVBQT1JURURcdDsgZm9yd2FyZCBEQ1Qgd2l0aCBTU0UvU1NFMlxuIik7Ci0jZW5kaWYKLSNpZmRlZiBKRkRDVF9JTlRfUVVBTlRJWkVfV0lUSF9ESVZJU0lPTgotICBwcmludGYoIiUlZGVmaW5lIEpGRENUX0lOVF9RVUFOVElaRV9XSVRIX0RJVklTSU9OIDsgVXNlIGdlbmVyYWwgcXVhbnRpemF0aW9uIG1ldGhvZFxuIik7Ci0jZWxzZQotICBwcmludGYoIiUldW5kZWYgSkZEQ1RfSU5UX1FVQU5USVpFX1dJVEhfRElWSVNJT04gOyBVc2UgZ2VuZXJhbCBxdWFudGl6YXRpb24gbWV0aG9kXG4iKTsKLSNlbmRpZgotICBwcmludGYoIlxuIik7Ci0KLSAgcHJpbnRmKCI7IFNJTUQgc3VwcG9ydCBvcHRpb25zIChkZWNvZGVyKTpcbiIpOwotICBwcmludGYoIlxuIik7Ci0jaWZkZWYgSkRDT0xPUl9ZQ0NSR0JfTU1YX1NVUFBPUlRFRAotICBwcmludGYoIiUlZGVmaW5lIEpEQ09MT1JfWUNDUkdCX01NWF9TVVBQT1JURURcdDsgWUNDLT5SR0IgY29udmVyc2lvbiB3aXRoIE1NWFxuIik7Ci0jZWxzZQotICBwcmludGYoIiUldW5kZWYgSkRDT0xPUl9ZQ0NSR0JfTU1YX1NVUFBPUlRFRFx0OyBZQ0MtPlJHQiBjb252ZXJzaW9uIHdpdGggTU1YXG4iKTsKLSNlbmRpZgotI2lmZGVmIEpEQ09MT1JfWUNDUkdCX1NTRTJfU1VQUE9SVEVECi0gIHByaW50ZigiJSVkZWZpbmUgSkRDT0xPUl9ZQ0NSR0JfU1NFMl9TVVBQT1JURURcdDsgWUNDLT5SR0IgY29udmVyc2lvbiB3aXRoIFNTRTJcbiIpOwotI2Vsc2UKLSAgcHJpbnRmKCIlJXVuZGVmIEpEQ09MT1JfWUNDUkdCX1NTRTJfU1VQUE9SVEVEXHQ7IFlDQy0+UkdCIGNvbnZlcnNpb24gd2l0aCBTU0UyXG4iKTsKLSNlbmRpZgotI2lmZGVmIEpETUVSR0VfTU1YX1NVUFBPUlRFRAotICBwcmludGYoIiUlZGVmaW5lIEpETUVSR0VfTU1YX1NVUFBPUlRFRFx0XHQ7IG1lcmdlZCB1cHNhbXBsaW5nIHdpdGggTU1YXG4iKTsKLSNlbHNlCi0gIHByaW50ZigiJSV1bmRlZiBKRE1FUkdFX01NWF9TVVBQT1JURURcdFx0OyBtZXJnZWQgdXBzYW1wbGluZyB3aXRoIE1NWFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBKRE1FUkdFX1NTRTJfU1VQUE9SVEVECi0gIHByaW50ZigiJSVkZWZpbmUgSkRNRVJHRV9TU0UyX1NVUFBPUlRFRFx0XHQ7IG1lcmdlZCB1cHNhbXBsaW5nIHdpdGggU1NFMlxuIik7Ci0jZWxzZQotICBwcmludGYoIiUldW5kZWYgSkRNRVJHRV9TU0UyX1NVUFBPUlRFRFx0XHQ7IG1lcmdlZCB1cHNhbXBsaW5nIHdpdGggU1NFMlxuIik7Ci0jZW5kaWYKLSNpZmRlZiBKRFNBTVBMRV9GQU5DWV9NTVhfU1VQUE9SVEVECi0gIHByaW50ZigiJSVkZWZpbmUgSkRTQU1QTEVfRkFOQ1lfTU1YX1NVUFBPUlRFRFx0OyBmYW5jeSB1cHNhbXBsaW5nIHdpdGggTU1YXG4iKTsKLSNlbHNlCi0gIHByaW50ZigiJSV1bmRlZiBKRFNBTVBMRV9GQU5DWV9NTVhfU1VQUE9SVEVEXHQ7IGZhbmN5IHVwc2FtcGxpbmcgd2l0aCBNTVhcbiIpOwotI2VuZGlmCi0jaWZkZWYgSkRTQU1QTEVfRkFOQ1lfU1NFMl9TVVBQT1JURUQKLSAgcHJpbnRmKCIlJWRlZmluZSBKRFNBTVBMRV9GQU5DWV9TU0UyX1NVUFBPUlRFRFx0OyBmYW5jeSB1cHNhbXBsaW5nIHdpdGggU1NFMlxuIik7Ci0jZWxzZQotICBwcmludGYoIiUldW5kZWYgSkRTQU1QTEVfRkFOQ1lfU1NFMl9TVVBQT1JURURcdDsgZmFuY3kgdXBzYW1wbGluZyB3aXRoIFNTRTJcbiIpOwotI2VuZGlmCi0jaWZkZWYgSkRTQU1QTEVfU0lNUExFX01NWF9TVVBQT1JURUQKLSAgcHJpbnRmKCIlJWRlZmluZSBKRFNBTVBMRV9TSU1QTEVfTU1YX1NVUFBPUlRFRFx0OyBzbG9wcHkgdXBzYW1wbGluZyB3aXRoIE1NWFxuIik7Ci0jZWxzZQotICBwcmludGYoIiUldW5kZWYgSkRTQU1QTEVfU0lNUExFX01NWF9TVVBQT1JURURcdDsgc2xvcHB5IHVwc2FtcGxpbmcgd2l0aCBNTVhcbiIpOwotI2VuZGlmCi0jaWZkZWYgSkRTQU1QTEVfU0lNUExFX1NTRTJfU1VQUE9SVEVECi0gIHByaW50ZigiJSVkZWZpbmUgSkRTQU1QTEVfU0lNUExFX1NTRTJfU1VQUE9SVEVEXHQ7IHNsb3BweSB1cHNhbXBsaW5nIHdpdGggU1NFMlxuIik7Ci0jZWxzZQotICBwcmludGYoIiUldW5kZWYgSkRTQU1QTEVfU0lNUExFX1NTRTJfU1VQUE9SVEVEXHQ7IHNsb3BweSB1cHNhbXBsaW5nIHdpdGggU1NFMlxuIik7Ci0jZW5kaWYKLSNpZmRlZiBKSURDVF9JTlRfTU1YX1NVUFBPUlRFRAotICBwcmludGYoIiUlZGVmaW5lIEpJRENUX0lOVF9NTVhfU1VQUE9SVEVEXHRcdDsgaW52ZXJzZSBEQ1Qgd2l0aCBNTVhcbiIpOwotI2Vsc2UKLSAgcHJpbnRmKCIlJXVuZGVmIEpJRENUX0lOVF9NTVhfU1VQUE9SVEVEXHRcdDsgaW52ZXJzZSBEQ1Qgd2l0aCBNTVhcbiIpOwotI2VuZGlmCi0jaWZkZWYgSklEQ1RfSU5UX1NTRTJfU1VQUE9SVEVECi0gIHByaW50ZigiJSVkZWZpbmUgSklEQ1RfSU5UX1NTRTJfU1VQUE9SVEVEXHQ7IGludmVyc2UgRENUIHdpdGggU1NFMlxuIik7Ci0jZWxzZQotICBwcmludGYoIiUldW5kZWYgSklEQ1RfSU5UX1NTRTJfU1VQUE9SVEVEXHRcdDsgaW52ZXJzZSBEQ1Qgd2l0aCBTU0UyXG4iKTsKLSNlbmRpZgotI2lmZGVmIEpJRENUX0ZMVF8zRE5PV19NTVhfU1VQUE9SVEVECi0gIHByaW50ZigiJSVkZWZpbmUgSklEQ1RfRkxUXzNETk9XX01NWF9TVVBQT1JURURcdDsgaW52ZXJzZSBEQ1Qgd2l0aCAzRE5vdyEvTU1YXG4iKTsKLSNlbHNlCi0gIHByaW50ZigiJSV1bmRlZiBKSURDVF9GTFRfM0ROT1dfTU1YX1NVUFBPUlRFRFx0OyBpbnZlcnNlIERDVCB3aXRoIDNETm93IS9NTVhcbiIpOwotI2VuZGlmCi0jaWZkZWYgSklEQ1RfRkxUX1NTRV9NTVhfU1VQUE9SVEVECi0gIHByaW50ZigiJSVkZWZpbmUgSklEQ1RfRkxUX1NTRV9NTVhfU1VQUE9SVEVEXHQ7IGludmVyc2UgRENUIHdpdGggU1NFL01NWFxuIik7Ci0jZWxzZQotICBwcmludGYoIiUldW5kZWYgSklEQ1RfRkxUX1NTRV9NTVhfU1VQUE9SVEVEXHQ7IGludmVyc2UgRENUIHdpdGggU1NFL01NWFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBKSURDVF9GTFRfU1NFX1NTRTJfU1VQUE9SVEVECi0gIHByaW50ZigiJSVkZWZpbmUgSklEQ1RfRkxUX1NTRV9TU0UyX1NVUFBPUlRFRFx0OyBpbnZlcnNlIERDVCB3aXRoIFNTRS9TU0UyXG4iKTsKLSNlbHNlCi0gIHByaW50ZigiJSV1bmRlZiBKSURDVF9GTFRfU1NFX1NTRTJfU1VQUE9SVEVEXHQ7IGludmVyc2UgRENUIHdpdGggU1NFL1NTRTJcbiIpOwotI2VuZGlmCi0gIHByaW50ZigiXG4iKTsKLX0KLQotCi12b2lkCi1wcmludF9qcGVnbGliX2hfbWFjcm8gKHZvaWQpCi17Ci0gIHByaW50ZigiXG4iKTsKLSAgcHJpbnRmKCI7IC0tLS0gbWFjcm9zIGZyb20ganBlZ2xpYi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotICBwcmludGYoIlxuIik7Ci0KLSAgcHJpbnRmKCI7IFZlcnNpb24gSUQgZm9yIHRoZSBKUEVHIGxpYnJhcnkuXG4iKTsKLSAgcHJpbnRmKCI7IE1pZ2h0IGJlIHVzZWZ1bCBmb3IgdGVzdHMgbGlrZSBcIiNpZiBKUEVHX0xJQl9WRVJTSU9OID49IDYwXCIuXG4iKTsKLSAgcHJpbnRmKCJcbiIpOwotICBwcmludGYoIiUlZGVmaW5lIEpQRUdfTElCX1ZFUlNJT04gICVkXG4iLCBKUEVHX0xJQl9WRVJTSU9OKTsKLSAgcHJpbnRmKCJcbiIpOwotICBwcmludGYoIjsgU0lNRCBFeHQ6IFZlcnNpb24gSUQgZm9yIHRoZSBTSU1EIGV4dGVuc2lvbi5cbiIpOwotICBwcmludGYoIlxuIik7Ci0gIHByaW50ZigiJSVkZWZpbmUgSlBFR19TSU1ERVhUX1ZFUlNJT04gICVkXG4iLCBKUEVHX1NJTURFWFRfVkVSU0lPTik7Ci0gIHByaW50ZigiJSVkZWZpbmUgSlBFR19TSU1ERVhUX1ZFUl9TVFIgIFwiJXNcIlxuIiwgSlBFR19TSU1ERVhUX1ZFUl9TVFIpOwotICBwcmludGYoIlxuIik7Ci19Ci0KLQotaW50Ci1tYWluICh2b2lkKQotewotICBwcmludGYoIjtcbjsganNpbWRjZmcuaW5jIC0tLSBnZW5lcmF0ZWQgYnkgbWFrZWNmZy5jIik7Ci0jaWZkZWYgX19EQVRFX18KLSNpZmRlZiBfX1RJTUVfXwotICBwcmludGYoIiAoJXMsICVzKSIsIF9fREFURV9fLCBfX1RJTUVfXyk7Ci0jZW5kaWYKLSNlbmRpZgotICBwcmludGYoIlxuO1xuXG4iKTsKLSAgcHJpbnRmKCIlJWRlZmluZSBKU0lNRENGR19JTkNMVURFRFx0OyBzbyB0aGF0IGpzaW1kY2ZnLmluYyBkb2Vzbid0IGRvIGl0IGFnYWluXG5cbiIpOwotCi0gIHByaW50X3N0cnVjdHVyZV9vZmZzZXQoKTsKLSAgcHJpbnRfamNvbmZpZ19oX21hY3JvKCk7Ci0gIHByaW50X2ptb3JlY2ZnX2hfbWFjcm8oKTsKLSAgcHJpbnRfanBlZ2xpYl9oX21hY3JvKCk7Ci0KLSAgZXhpdCgwKTsKLSAgcmV0dXJuIDA7CQkJLyogc3VwcHJlc3Mgbm8tcmV0dXJuLXZhbHVlIHdhcm5pbmdzICovCi19CmRpZmYgLS1naXQgYS9tYWtlZmlsZS5hbnNpIGIvbWFrZWZpbGUuYW5zaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI4MzBmYy4uMDAwMDAwMAotLS0gYS9tYWtlZmlsZS5hbnNpCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotIyBNb2RpZmllZCBmb3IgeDg2IFNJTUQgZXh0ZW5zaW9uCi0KLSMgVGhpcyBtYWtlZmlsZSBpcyBzdWl0YWJsZSBmb3IgVW5peC1saWtlIHN5c3RlbXMgd2l0aCBBTlNJLWNhcGFibGUgY29tcGlsZXJzLgotIyBJZiB5b3UgaGF2ZSBhIG5vbi1BTlNJIGNvbXBpbGVyLCBtYWtlZmlsZS51bml4IGlzIGEgYmV0dGVyIHN0YXJ0aW5nIHBvaW50LgotCi0jIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQotCi0jIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKLUNDPSBjYwotCi0jIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY2Mgb3B0aW9uczoKLUNGTEFHUz0gLU8KLSMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCi0jIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KLQotIyBUaGUgZXhlY3V0YWJsZSBuYW1lIG9mIE5BU00gYW5kIGl0cyBvcHRpb25zOgotTkFTTT0gbmFzbQotTkFGTEFHUz0gJChOQVNNX09CSkZNVCkgLUkuLwotIyBvYmplY3QgZmlsZSBmb3JtYXQgc3BlY2lmaWVyIGZvciBOQVNNCi0jIHNlZSBqc2ltZGV4dC5pbmMgZm9yIG1vcmUgZGV0YWlscy4KLU5BU01fT0JKRk1UPSAtZmVsZiAtREVMRgotCi0jIExpbmstdGltZSBjYyBvcHRpb25zOgotTERGTEFHUz0gCi0KLSMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IC1sIGNvbW1hbmRzIGhlcmUuCi1MRExJQlM9IAotCi0jIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQotIyBtYW5hZ2VyIGZpbGUuICBGb3IgVW5peCB0aGlzIGlzIHVzdWFsbHkgam1lbW5vYnMubywgYnV0IHlvdSBtYXkgd2FudAotIyB0byB1c2Ugam1lbWFuc2kubyBvciBqbWVtbmFtZS5vIGlmIHlvdSBoYXZlIGxpbWl0ZWQgc3dhcCBzcGFjZS4KLVNZU0RFUE1FTT0gam1lbW5vYnMubwotCi0jIE9TLWRlcGVuZGVudCBTSU1EIGluc3RydWN0aW9uIHN1cHBvcnQgY2hlY2tlcgotIyBqc2ltZHczMi5vIChXaW4zMikgLyBqc2ltZGRqZy5vIChESkdQUCBWLjIpIC8ganNpbWRnY2MubyAoVW5peC9nY2MpCi1TWVNERVBTSU1EQ0hLPSBqc2ltZGdjYy5vCi0KLSMgbWlzY2VsbGFuZW91cyBPUy1kZXBlbmRlbnQgc3R1ZmYKLSMgbGlua2VyCi1MTj0gJChDQykKLSMgZmlsZSBkZWxldGlvbiBjb21tYW5kCi1STT0gcm0gLWYKLSMgbGlicmFyeSAoLmEpIGZpbGUgY3JlYXRpb24gY29tbWFuZAotQVI9IGFyIHJjCi0jIHNlY29uZCBzdGVwIGluIC5hIGNyZWF0aW9uICh1c2UgInRvdWNoIiBpZiBub3QgbmVlZGVkKQotQVIyPSByYW5saWIKLQotIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCi0KLQotIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAotICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCi0jIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQotU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYwotIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQotQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKLSAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCi0gICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYwotU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKLSMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCi1JTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAotICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKLSMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0Ci1DT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCi0gICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAotICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KLVRFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCi0gICAgICAgIHRlc3RpbWdwLmpwZwotRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCi0gICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCi0jIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotQ09NT0JKRUNUUz0gamNvbWFwaS5vIGp1dGlscy5vIGplcnJvci5vIGptZW1tZ3IubyAkKFNZU0RFUE1FTSkganNpbWRjcHUubyBcCi0gICAgICAgICQoU1lTREVQU0lNRENISykKLSMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLUNMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vIGpjYXBpc3RkLm8gamN0cmFucy5vIGpjcGFyYW0ubyBqZGF0YWRzdC5vIGpjaW5pdC5vIFwKLSAgICAgICAgamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBqY2NvZWZjdC5vIGpjY29sb3IubyBcCi0gICAgICAgIGpjc2FtcGxlLm8gamNodWZmLm8gamNwaHVmZi5vIGpjZGN0bWdyLm8gamNjb2xtbXgubyBqY2NvbHNzMi5vIFwKLSAgICAgICAgamNzYW1tbXgubyBqY3NhbXNzMi5vIGpjcW50aW50Lm8gamNxbnRmbHQubyBqY3FudG1teC5vIGpjcW50M2RuLm8gXAotICAgICAgICBqY3FudHMyaS5vIGpjcW50c3NlLm8gamNxbnRzMmYubyBqZmRjdGludC5vIGpmZGN0ZnN0Lm8gamZkY3RmbHQubyBcCi0gICAgICAgIGpmbW14aW50Lm8gamZtbXhmc3QubyBqZjNkbmZsdC5vIGpmc3MyaW50Lm8gamZzczJmc3QubyBqZnNzZWZsdC5vCi0jIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLURMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vIGpkYXBpc3RkLm8gamR0cmFucy5vIGpkYXRhc3JjLm8gamRtYXN0ZXIubyBcCi0gICAgICAgIGpkaW5wdXQubyBqZG1hcmtlci5vIGpkaHVmZi5vIGpkcGh1ZmYubyBqZG1haW5jdC5vIGpkY29lZmN0Lm8gXAotICAgICAgICBqZHBvc3RjdC5vIGpkZGN0bWdyLm8gamRzYW1wbGUubyBqZGNvbG9yLm8ganF1YW50MS5vIGpxdWFudDIubyBcCi0gICAgICAgIGpkbWVyZ2UubyBqaWRjdGludC5vIGppZGN0ZnN0Lm8gamlkY3RyZWQubyBqaWRjdGZsdC5vIGppbW14aW50Lm8gXAotICAgICAgICBqaW1teGZzdC5vIGppbW14cmVkLm8gamkzZG5mbHQubyBqaXNzMmludC5vIGppc3MyZnN0Lm8gamlzczJyZWQubyBcCi0gICAgICAgIGppc3NlZmx0Lm8gamlzczJmbHQubyBqZHNhbW1teC5vIGpkc2Ftc3MyLm8gamRjb2xtbXgubyBqZGNvbHNzMi5vIFwKLSAgICAgICAgamRtZXJtbXgubyBqZG1lcnNzMi5vCi0jIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmEKLUxJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKLSMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKLUNPQkpFQ1RTPSBjanBlZy5vIHJkcHBtLm8gcmRnaWYubyByZHRhcmdhLm8gcmRybGUubyByZGJtcC5vIHJkc3dpdGNoLm8gXAotICAgICAgICBjZGpwZWcubwotRE9CSkVDVFM9IGRqcGVnLm8gd3JwcG0ubyB3cmdpZi5vIHdydGFyZ2EubyB3cnJsZS5vIHdyYm1wLm8gcmRjb2xtYXAubyBcCi0gICAgICAgIGNkanBlZy5vCi1UUk9CSkVDVFM9IGpwZWd0cmFuLm8gcmRzd2l0Y2gubyBjZGpwZWcubyB0cmFuc3VwcC5vCi0KLQotYWxsOiBsaWJqcGVnLmEgY2pwZWcgZGpwZWcganBlZ3RyYW4gcmRqcGdjb20gd3JqcGdjb20KLQotbGlianBlZy5hOiAkKExJQk9CSkVDVFMpCi0JJChSTSkgbGlianBlZy5hCi0JJChBUikgbGlianBlZy5hICAkKExJQk9CSkVDVFMpCi0JJChBUjIpIGxpYmpwZWcuYQotCi1janBlZzogJChDT0JKRUNUUykgbGlianBlZy5hCi0JJChMTikgJChMREZMQUdTKSAtbyBjanBlZyAkKENPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCi0KLWRqcGVnOiAkKERPQkpFQ1RTKSBsaWJqcGVnLmEKLQkkKExOKSAkKExERkxBR1MpIC1vIGRqcGVnICQoRE9CSkVDVFMpIGxpYmpwZWcuYSAkKExETElCUykKLQotanBlZ3RyYW46ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmEKLQkkKExOKSAkKExERkxBR1MpIC1vIGpwZWd0cmFuICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCi0KLXJkanBnY29tOiByZGpwZ2NvbS5vCi0JJChMTikgJChMREZMQUdTKSAtbyByZGpwZ2NvbSByZGpwZ2NvbS5vICQoTERMSUJTKQotCi13cmpwZ2NvbTogd3JqcGdjb20ubwotCSQoTE4pICQoTERGTEFHUykgLW8gd3JqcGdjb20gd3JqcGdjb20ubyAkKExETElCUykKLQotamNvbmZpZy5oOiBqY29uZmlnLmRvYwotCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCi0JZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCi0JZXhpdCAxCi0KLWNsZWFuOgotCSQoUk0pICoubyBjanBlZyBkanBlZyBqcGVndHJhbiBsaWJqcGVnLmEgcmRqcGdjb20gd3JqcGdjb20KLQkkKFJNKSBqc2ltZGNmZy5pbmMgY29yZSB0ZXN0b3V0KgotCi10ZXN0OiBjanBlZyBkanBlZyBqcGVndHJhbgotCSQoUk0pIHRlc3RvdXQqCi0JLi9kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtICB0ZXN0b3JpZy5qcGcKLQkuL2RqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZwotCS4vY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCi0JLi9kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKLQkuL2NqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQotCS4vanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZwotCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQotCWNtcCB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAotCWNtcCB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZwotCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KLQljbXAgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZwotCWNtcCB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCi0KLQotanNpbWRjZmcuaW5jOiBtYWtlY2ZnLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi0JJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gbWFrZWNmZyAuL21ha2VjZmcuYyAkKExETElCUykKLQkuL21ha2VjZmcgPiBqc2ltZGNmZy5pbmMKLQkkKFJNKSAuL21ha2VjZmcKLQotLmFzbS5vOgotCSQoTkFTTSkgJChOQUZMQUdTKSAtbyAkQCAkKi5hc20KLQotanNpbWRjcHUubzoganNpbWRjcHUuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMKLWpzaW1kdzMyLm86IGpzaW1kdzMyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jCi1qc2ltZGRqZy5vOiBqc2ltZGRqZy5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYwotamNjb2xtbXgubzogamNjb2xtbXguYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qY2NvbHNzMi5vOiBqY2NvbHNzMi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpjc2FtbW14Lm86IGpjc2FtbW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamNzYW1zczIubzogamNzYW1zczIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZGNvbG1teC5vOiBqZGNvbG1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkY29sc3MyLm86IGpkY29sc3MyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRtZXJtbXgubzogamRtZXJtbXguYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZG1lcnNzMi5vOiBqZG1lcnNzMi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkc2FtbW14Lm86IGpkc2FtbW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRzYW1zczIubzogamRzYW1zczIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qY3FudGludC5vOiBqY3FudGludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnRmbHQubzogamNxbnRmbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpjcW50bW14Lm86IGpjcW50bW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudDNkbi5vOiBqY3FudDNkbi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnRzMmkubzogamNxbnRzMmkuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpjcW50c3NlLm86IGpjcW50c3NlLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudHMyZi5vOiBqY3FudHMyZi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZkY3RpbnQubzogamZkY3RpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmZGN0ZnN0Lm86IGpmZGN0ZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZmRjdGZsdC5vOiBqZmRjdGZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZtbXhpbnQubzogamZtbXhpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmbW14ZnN0Lm86IGpmbW14ZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZjNkbmZsdC5vOiBqZjNkbmZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZzczJpbnQubzogamZzczJpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmc3MyZnN0Lm86IGpmc3MyZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZnNzZWZsdC5vOiBqZnNzZWZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlkY3RpbnQubzogamlkY3RpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppZGN0ZnN0Lm86IGppZGN0ZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaWRjdHJlZC5vOiBqaWRjdHJlZC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlkY3RmbHQubzogamlkY3RmbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppbW14aW50Lm86IGppbW14aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaW1teGZzdC5vOiBqaW1teGZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamltbXhyZWQubzogamltbXhyZWQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppM2RuZmx0Lm86IGppM2RuZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzMmludC5vOiBqaXNzMmludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlzczJmc3QubzogamlzczJmc3QuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppc3MycmVkLm86IGppc3MycmVkLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzZWZsdC5vOiBqaXNzZWZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlzczJmbHQubzogamlzczJmbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLQotanNpbWRnY2MubzoganNpbWRnY2MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotCi1qY2FwaW1pbi5vOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNhcGlzdGQubzogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29lZmN0Lm86IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvbG9yLm86IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamNkY3RtZ3IubzogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qY2h1ZmYubzogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY2luaXQubzogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21haW5jdC5vOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXJrZXIubzogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFzdGVyLm86IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY29tYXBpLm86IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGFyYW0ubzogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwaHVmZi5vOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY3ByZXBjdC5vOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNzYW1wbGUubzogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamN0cmFucy5vOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaW1pbi5vOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGlzdGQubzogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXRhZHN0Lm86IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkYXRhc3JjLm86IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkY29lZmN0Lm86IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGNvbG9yLm86IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamRkY3RtZ3IubzogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZGh1ZmYubzogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZGlucHV0Lm86IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFpbmN0Lm86IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hcmtlci5vOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXN0ZXIubzogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWVyZ2UubzogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY29sc2FtcC5oCi1qZHBodWZmLm86IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkcG9zdGN0Lm86IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHNhbXBsZS5vOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY29sc2FtcC5oCi1qZHRyYW5zLm86IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWplcnJvci5vOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCi0jIGpmZGN0Zmx0Lm86IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotIyBqZmRjdGZzdC5vOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamZkY3RpbnQubzogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGppZGN0Zmx0Lm86IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotIyBqaWRjdGZzdC5vOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamlkY3RpbnQubzogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGppZGN0cmVkLm86IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotanF1YW50MS5vOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qcXVhbnQyLm86IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWp1dGlscy5vOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWptZW1tZ3Iubzogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1hbnNpLm86IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5hbWUubzogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbm9icy5vOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1kb3Mubzogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1tYWMubzogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWNqcGVnLm86IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWRqcGVnLm86IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWpwZWd0cmFuLm86IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAotcmRqcGdjb20ubzogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotd3JqcGdjb20ubzogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotY2RqcGVnLm86IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRjb2xtYXAubzogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkc3dpdGNoLm86IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi10cmFuc3VwcC5vOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCi1yZHBwbS5vOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JwcG0ubzogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkZ2lmLm86IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmdpZi5vOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmR0YXJnYS5vOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnRhcmdhLm86IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkYm1wLm86IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmJtcC5vOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRybGUubzogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycmxlLm86IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS9tYWtlZmlsZS5iYzUgYi9tYWtlZmlsZS5iYzUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZjdkZjYuLjAwMDAwMDAKLS0tIGEvbWFrZWZpbGUuYmM1CisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotIyBNb2RpZmllZCBmb3IgeDg2IFNJTUQgZXh0ZW5zaW9uCi0KLSMgVGhpcyBtYWtlZmlsZSBpcyBzdWl0YWJsZSBmb3IgQm9ybGFuZCBDKysgQ29tcGlsZXIgNS41ICh3aW4zMikKLQotIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibWFrZSIgISEKLQotIWlmbmRlZiBzcmNkaXIKLXNyY2RpciA9IC4KLSFlbmRpZgotLnBhdGguYyAgID0gJChzcmNkaXIpCi0ucGF0aC5oICAgPSAkKHNyY2RpcikKLS5wYXRoLmFzbSA9ICQoc3JjZGlyKQotLnBhdGguaW5jID0gJChzcmNkaXIpOy4KLS5wYXRoLmRvYyA9ICQoc3JjZGlyKQotCi0jIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKLUNDPSBiY2MzMgotCi0jIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY2Mgb3B0aW9uczoKLUNGTEFHUz0gLU8yIC1PUyAtT2MgLWQgLWZmIC13LXBhciAtdy1hdXMgLXctY2NjIC13LXJjaCAtcSAtSSQoc3JjZGlyKQotIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKLSMgTk9UIHZpYSAtRCBzd2l0Y2hlcyBoZXJlLgotCi0jIFRoZSBleGVjdXRhYmxlIG5hbWUgb2YgTkFTTSBhbmQgaXRzIG9wdGlvbnM6Ci1OQVNNPSBuYXNtdwotTkFGTEFHUz0gJChOQVNNX09CSkZNVCkgLUkkKHNyY2RpcikvCi0jIG9iamVjdCBmaWxlIGZvcm1hdCBzcGVjaWZpZXIgZm9yIE5BU00KLSMgc2VlIGpzaW1kZXh0LmluYyBmb3IgbW9yZSBkZXRhaWxzLgotTkFTTV9PQkpGTVQ9IC1mb2JqIC1ET0JKMzIKLQotIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKLUxERkxBR1M9IC10V0MgLXEKLQotIyBUbyBsaW5rIGFueSBzcGVjaWFsIGxpYnJhcmllcywgYWRkIHRoZSBuZWNlc3NhcnkgLWwgY29tbWFuZHMgaGVyZS4KLUxETElCUz0gbm9laDMyLmxpYgotCi0jIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQotIyBtYW5hZ2VyIGZpbGUuIEZvciBXaW4zMiwgd2UgcmVjb21tZW5kIGptZW1ub2JzLmMgKGZsYXQgbWVtb3J5ISkKLSMgU1lTREVQTUVNTElCIG11c3QgbGlzdCB0aGUgc2FtZSBmaWxlcyB3aXRoICIrIiBzaWducyBmb3IgdGhlIGxpYnJhcmlhbi4KLVNZU0RFUE1FTT0gam1lbW5vYnMub2JqCi1TWVNERVBNRU1MSUI9ICtqbWVtbm9icy5vYmoKLQotIyBPUy1kZXBlbmRlbnQgU0lNRCBpbnN0cnVjdGlvbiBzdXBwb3J0IGNoZWNrZXIKLSMganNpbWR3MzIub2JqIChXaW4zMikgLyBqc2ltZGRqZy5vYmogKERKR1BQIFYuMikgLyBqc2ltZGdjYy5vYmogKFVuaXgvZ2NjKQotU1lTREVQU0lNRENISz0ganNpbWR3MzIub2JqCi1TWVNERVBTSU1EQ0hLTElCPSAranNpbWR3MzIub2JqCi0KLSMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgotCi0KLSMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCi1MSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCi0gICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAotICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAotICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCi0gICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKLSAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAotICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKLSAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYwotIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKLVNZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKLSMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KLUFQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyBcCi0gICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgXAotICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKLVNPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCi0jIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcwotSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKLSAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCi0jIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCi1ET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAotICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAotICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCi1NS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAotICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAotICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAotICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKLSAgICAgICAgbWFrdm1zLm9wdAotQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAotICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKLSAgICAgICAgamNvbmZpZy52bXMKLUNPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAotT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCi1URVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAotICAgICAgICB0ZXN0aW1ncC5qcGcKLURJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAotICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQotIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLUNPTU9CSkVDVFM9IGpjb21hcGkub2JqIGp1dGlscy5vYmogamVycm9yLm9iaiBqbWVtbWdyLm9iaiAkKFNZU0RFUE1FTSkgXAotICAgICAgICBqc2ltZGNwdS5vYmogJChTWVNERVBTSU1EQ0hLKQotIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm9iaiBqY2FwaXN0ZC5vYmogamN0cmFucy5vYmogamNwYXJhbS5vYmogamRhdGFkc3Qub2JqIFwKLSAgICAgICAgamNpbml0Lm9iaiBqY21hc3Rlci5vYmogamNtYXJrZXIub2JqIGpjbWFpbmN0Lm9iaiBqY3ByZXBjdC5vYmogXAotICAgICAgICBqY2NvZWZjdC5vYmogamNjb2xvci5vYmogamNzYW1wbGUub2JqIGpjaHVmZi5vYmogamNwaHVmZi5vYmogXAotICAgICAgICBqY2RjdG1nci5vYmogamNjb2xtbXgub2JqIGpjY29sc3MyLm9iaiBqY3NhbW1teC5vYmogamNzYW1zczIub2JqIFwKLSAgICAgICAgamNxbnRpbnQub2JqIGpjcW50Zmx0Lm9iaiBqY3FudG1teC5vYmogamNxbnQzZG4ub2JqIGpjcW50czJpLm9iaiBcCi0gICAgICAgIGpjcW50c3NlLm9iaiBqY3FudHMyZi5vYmogamZkY3RpbnQub2JqIGpmZGN0ZnN0Lm9iaiBqZmRjdGZsdC5vYmogXAotICAgICAgICBqZm1teGludC5vYmogamZtbXhmc3Qub2JqIGpmM2RuZmx0Lm9iaiBqZnNzMmludC5vYmogamZzczJmc3Qub2JqIFwKLSAgICAgICAgamZzc2VmbHQub2JqCi0jIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLURMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vYmogamRhcGlzdGQub2JqIGpkdHJhbnMub2JqIGpkYXRhc3JjLm9iaiBcCi0gICAgICAgIGpkbWFzdGVyLm9iaiBqZGlucHV0Lm9iaiBqZG1hcmtlci5vYmogamRodWZmLm9iaiBqZHBodWZmLm9iaiBcCi0gICAgICAgIGpkbWFpbmN0Lm9iaiBqZGNvZWZjdC5vYmogamRwb3N0Y3Qub2JqIGpkZGN0bWdyLm9iaiBqZHNhbXBsZS5vYmogXAotICAgICAgICBqZGNvbG9yLm9iaiBqcXVhbnQxLm9iaiBqcXVhbnQyLm9iaiBqZG1lcmdlLm9iaiBqaWRjdGludC5vYmogXAotICAgICAgICBqaWRjdGZzdC5vYmogamlkY3RyZWQub2JqIGppZGN0Zmx0Lm9iaiBqaW1teGludC5vYmogamltbXhmc3Qub2JqIFwKLSAgICAgICAgamltbXhyZWQub2JqIGppM2RuZmx0Lm9iaiBqaXNzMmludC5vYmogamlzczJmc3Qub2JqIGppc3MycmVkLm9iaiBcCi0gICAgICAgIGppc3NlZmx0Lm9iaiBqaXNzMmZsdC5vYmogamRzYW1tbXgub2JqIGpkc2Ftc3MyLm9iaiBqZGNvbG1teC5vYmogXAotICAgICAgICBqZGNvbHNzMi5vYmogamRtZXJtbXgub2JqIGpkbWVyc3MyLm9iagotIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5saWIKLUxJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKLSMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKLUNPQkpFQ1RTPSBjanBlZy5vYmogcmRwcG0ub2JqIHJkZ2lmLm9iaiByZHRhcmdhLm9iaiByZHJsZS5vYmogcmRibXAub2JqIFwKLSAgICAgICAgcmRzd2l0Y2gub2JqIGNkanBlZy5vYmoKLURPQkpFQ1RTPSBkanBlZy5vYmogd3JwcG0ub2JqIHdyZ2lmLm9iaiB3cnRhcmdhLm9iaiB3cnJsZS5vYmogd3JibXAub2JqIFwKLSAgICAgICAgcmRjb2xtYXAub2JqIGNkanBlZy5vYmoKLVRST0JKRUNUUz0ganBlZ3RyYW4ub2JqIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqIHRyYW5zdXBwLm9iagotCi0KLWFsbDogbGlianBlZy5saWIgY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgcmRqcGdjb20uZXhlIHdyanBnY29tLmV4ZQotCi1saWJqcGVnLmxpYjogJChMSUJPQkpFQ1RTKQotCS0gZGVsIGxpYmpwZWcubGliCi0JdGxpYiBsaWJqcGVnLmxpYiAvRSAvQyBAJiZ8Ci0ramNhcGltaW4ub2JqICtqY2FwaXN0ZC5vYmogK2pjdHJhbnMub2JqICtqY3BhcmFtLm9iaiAramRhdGFkc3Qub2JqICYKLStqY2luaXQub2JqICtqY21hc3Rlci5vYmogK2pjbWFya2VyLm9iaiAramNtYWluY3Qub2JqICtqY3ByZXBjdC5vYmogJgotK2pjY29lZmN0Lm9iaiAramNjb2xvci5vYmogK2pjc2FtcGxlLm9iaiAramNodWZmLm9iaiAramNwaHVmZi5vYmogJgotK2pjZGN0bWdyLm9iaiAramNjb2xtbXgub2JqICtqY2NvbHNzMi5vYmogK2pjc2FtbW14Lm9iaiAramNzYW1zczIub2JqICYKLStqY3FudGludC5vYmogK2pjcW50Zmx0Lm9iaiAramNxbnRtbXgub2JqICtqY3FudDNkbi5vYmogK2pjcW50czJpLm9iaiAmCi0ramNxbnRzc2Uub2JqICtqY3FudHMyZi5vYmogK2pmZGN0aW50Lm9iaiAramZkY3Rmc3Qub2JqICtqZmRjdGZsdC5vYmogJgotK2pmbW14aW50Lm9iaiAramZtbXhmc3Qub2JqICtqZjNkbmZsdC5vYmogK2pmc3MyaW50Lm9iaiAramZzczJmc3Qub2JqICYKLStqZnNzZWZsdC5vYmogK2pkYXBpbWluLm9iaiAramRhcGlzdGQub2JqICtqZHRyYW5zLm9iaiAramRhdGFzcmMub2JqICYKLStqZG1hc3Rlci5vYmogK2pkaW5wdXQub2JqICtqZG1hcmtlci5vYmogK2pkaHVmZi5vYmogK2pkcGh1ZmYub2JqICYKLStqZG1haW5jdC5vYmogK2pkY29lZmN0Lm9iaiAramRwb3N0Y3Qub2JqICtqZGRjdG1nci5vYmogK2pkc2FtcGxlLm9iaiAmCi0ramRjb2xvci5vYmogK2pxdWFudDEub2JqICtqcXVhbnQyLm9iaiAramRtZXJnZS5vYmogK2ppZGN0aW50Lm9iaiAmCi0ramlkY3Rmc3Qub2JqICtqaWRjdHJlZC5vYmogK2ppZGN0Zmx0Lm9iaiAramltbXhpbnQub2JqICtqaW1teGZzdC5vYmogJgotK2ppbW14cmVkLm9iaiAramkzZG5mbHQub2JqICtqaXNzMmludC5vYmogK2ppc3MyZnN0Lm9iaiAramlzczJyZWQub2JqICYKLStqaXNzZWZsdC5vYmogK2ppc3MyZmx0Lm9iaiAramRzYW1tbXgub2JqICtqZHNhbXNzMi5vYmogK2pkY29sbW14Lm9iaiAmCi0ramRjb2xzczIub2JqICtqZG1lcm1teC5vYmogK2pkbWVyc3MyLm9iaiAramNvbWFwaS5vYmogK2p1dGlscy5vYmogJgotK2plcnJvci5vYmogK2ptZW1tZ3Iub2JqICQoU1lTREVQTUVNTElCKSAranNpbWRjcHUub2JqICQoU1lTREVQU0lNRENIS0xJQikKLXwKLQotY2pwZWcuZXhlOiAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCSQoQ0MpICQoTERGTEFHUykgLWVjanBlZy5leGUgJChDT0JKRUNUUykgbGlianBlZy5saWIgJChMRExJQlMpCi0KLWRqcGVnLmV4ZTogJChET0JKRUNUUykgbGlianBlZy5saWIKLQkkKENDKSAkKExERkxBR1MpIC1lZGpwZWcuZXhlICQoRE9CSkVDVFMpIGxpYmpwZWcubGliICQoTERMSUJTKQotCi1qcGVndHJhbi5leGU6ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCSQoQ0MpICQoTERGTEFHUykgLWVqcGVndHJhbi5leGUgJChUUk9CSkVDVFMpIGxpYmpwZWcubGliICQoTERMSUJTKQotCi1yZGpwZ2NvbS5leGU6IHJkanBnY29tLm9iagotCSQoQ0MpICQoTERGTEFHUykgLWVyZGpwZ2NvbS5leGUgcmRqcGdjb20ub2JqICQoTERMSUJTKQotCi13cmpwZ2NvbS5leGU6IHdyanBnY29tLm9iagotCSQoQ0MpICQoTERGTEFHUykgLWV3cmpwZ2NvbS5leGUgd3JqcGdjb20ub2JqICQoTERMSUJTKQotCi0jIFRoaXMgInt9IiBzeW50YXggYWxsb3dzIEJvcmxhbmQgTWFrZSB0byAiYmF0Y2giIHNvdXJjZSBmaWxlcy4KLSMgSW4gdGhpcyB3YXksIGVhY2ggcnVuIG9mIHRoZSBjb21waWxlciBjYW4gYnVpbGQgbWFueSBtb2R1bGVzLgotLmMub2JqOgotCSQoQ0MpICQoQ0ZMQUdTKSAtY3sgJDx9Ci0KLWpjb25maWcuaDogamNvbmZpZy5kb2MKLQllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgotCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgotCWV4aXQgMQotCi1jbGVhbjoKLQktIGRlbCAqLm9iagotCS0gZGVsICoudGRzCi0JLSBkZWwgY2pwZWcuZXhlCi0JLSBkZWwgZGpwZWcuZXhlCi0JLSBkZWwganBlZ3RyYW4uZXhlCi0JLSBkZWwgcmRqcGdjb20uZXhlCi0JLSBkZWwgd3JqcGdjb20uZXhlCi0JLSBkZWwganNpbWRjZmcuaW5jCi0JLSBkZWwgbGlianBlZy5saWIKLQktIGRlbCB0ZXN0b3V0Ki4qCi0KLXRlc3Q6IGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlCi0JLSBkZWwgdGVzdG91dCouKgotCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gJChzcmNkaXIpXHRlc3RvcmlnLmpwZwotCWRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgJChzcmNkaXIpXHRlc3RvcmlnLmpwZwotCWNqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICQoc3JjZGlyKVx0ZXN0aW1nLnBwbQotCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtICQoc3JjZGlyKVx0ZXN0cHJvZy5qcGcKLQljanBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSB0ZXN0b3V0cC5qcGcgJChzcmNkaXIpXHRlc3RpbWcucHBtCi0JanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnICQoc3JjZGlyKVx0ZXN0cHJvZy5qcGcKLQlmYyAvYiAkKHNyY2RpcilcdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KLQlmYyAvYiAkKHNyY2RpcilcdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKLQlmYyAvYiAkKHNyY2RpcilcdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKLQlmYyAvYiAkKHNyY2RpcilcdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCi0JZmMgL2IgJChzcmNkaXIpXHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKLQlmYyAvYiAkKHNyY2RpcilcdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwotCi0KLWpzaW1kY2ZnLmluYzogbWFrZWNmZy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKHNyY2RpcilcbWFrZWNmZy5jCi0JJChDQykgJChMREZMQUdTKSAtZW1ha2VjZmcuZXhlIG1ha2VjZmcub2JqICQoTERMSUJTKQotCS5cbWFrZWNmZy5leGUgPiBqc2ltZGNmZy5pbmMKLQktIGRlbCBtYWtlY2ZnLnRkcwotCS0gZGVsIG1ha2VjZmcub2JqCi0JLSBkZWwgbWFrZWNmZy5leGUKLQotLmFzbS5vYmo6Ci0JJChOQVNNKSAkKE5BRkxBR1MpIC1vICRAICQ8Ci0KLWpzaW1kY3B1Lm9iajoganNpbWRjcHUuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMKLWpzaW1kdzMyLm9iajoganNpbWR3MzIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMKLWpzaW1kZGpnLm9iajoganNpbWRkamcuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMKLWpjY29sbW14Lm9iajogamNjb2xtbXguYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qY2NvbHNzMi5vYmo6IGpjY29sc3MyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamNzYW1tbXgub2JqOiBqY3NhbW1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpjc2Ftc3MyLm9iajogamNzYW1zczIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZGNvbG1teC5vYmo6IGpkY29sbW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRjb2xzczIub2JqOiBqZGNvbHNzMi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkbWVybW14Lm9iajogamRtZXJtbXguYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZG1lcnNzMi5vYmo6IGpkbWVyc3MyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRzYW1tbXgub2JqOiBqZHNhbW1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkc2Ftc3MyLm9iajogamRzYW1zczIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qY3FudGludC5vYmo6IGpjcW50aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudGZsdC5vYmo6IGpjcW50Zmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudG1teC5vYmo6IGpjcW50bW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudDNkbi5vYmo6IGpjcW50M2RuLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudHMyaS5vYmo6IGpjcW50czJpLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudHNzZS5vYmo6IGpjcW50c3NlLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudHMyZi5vYmo6IGpjcW50czJmLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZmRjdGludC5vYmo6IGpmZGN0aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZmRjdGZzdC5vYmo6IGpmZGN0ZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZmRjdGZsdC5vYmo6IGpmZGN0Zmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZm1teGludC5vYmo6IGpmbW14aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZm1teGZzdC5vYmo6IGpmbW14ZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZjNkbmZsdC5vYmo6IGpmM2RuZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZnNzMmludC5vYmo6IGpmc3MyaW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZnNzMmZzdC5vYmo6IGpmc3MyZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZnNzZWZsdC5vYmo6IGpmc3NlZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaWRjdGludC5vYmo6IGppZGN0aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaWRjdGZzdC5vYmo6IGppZGN0ZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaWRjdHJlZC5vYmo6IGppZGN0cmVkLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaWRjdGZsdC5vYmo6IGppZGN0Zmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaW1teGludC5vYmo6IGppbW14aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaW1teGZzdC5vYmo6IGppbW14ZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaW1teHJlZC5vYmo6IGppbW14cmVkLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaTNkbmZsdC5vYmo6IGppM2RuZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzMmludC5vYmo6IGppc3MyaW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzMmZzdC5vYmo6IGppc3MyZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzMnJlZC5vYmo6IGppc3MycmVkLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzZWZsdC5vYmo6IGppc3NlZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzMmZsdC5vYmo6IGppc3MyZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi0KLWpzaW1kZ2NjLm9iajoganNpbWRnY2MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotCi1qY2FwaW1pbi5vYmo6IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2FwaXN0ZC5vYmo6IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvZWZjdC5vYmo6IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvbG9yLm9iajogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY29sc2FtcC5oCi1qY2RjdG1nci5vYmo6IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm9iajogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY2luaXQub2JqOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFpbmN0Lm9iajogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFya2VyLm9iajogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFzdGVyLm9iajogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjb21hcGkub2JqOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BhcmFtLm9iajogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwaHVmZi5vYmo6IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjcHJlcGN0Lm9iajogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjc2FtcGxlLm9iajogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamN0cmFucy5vYmo6IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpbWluLm9iajogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpc3RkLm9iajogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXRhZHN0Lm9iajogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRhdGFzcmMub2JqOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGNvZWZjdC5vYmo6IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGNvbG9yLm9iajogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY29sc2FtcC5oCi1qZGRjdG1nci5vYmo6IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamRodWZmLm9iajogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZGlucHV0Lm9iajogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYWluY3Qub2JqOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXJrZXIub2JqOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXN0ZXIub2JqOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtZXJnZS5vYmo6IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamRwaHVmZi5vYmo6IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkcG9zdGN0Lm9iajogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkc2FtcGxlLm9iajogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamR0cmFucy5vYmo6IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWplcnJvci5vYmo6IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKLSMgamZkY3RmbHQub2JqOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamZkY3Rmc3Qub2JqOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamZkY3RpbnQub2JqOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamlkY3RmbHQub2JqOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamlkY3Rmc3Qub2JqOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamlkY3RpbnQub2JqOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamlkY3RyZWQub2JqOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpxdWFudDEub2JqOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qcXVhbnQyLm9iajoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanV0aWxzLm9iajoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qbWVtbWdyLm9iajogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1hbnNpLm9iajogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbmFtZS5vYmo6IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5vYnMub2JqOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1kb3Mub2JqOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW1hYy5vYmo6IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1janBlZy5vYmo6IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWRqcGVnLm9iajogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotanBlZ3RyYW4ub2JqOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKLXJkanBnY29tLm9iajogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotd3JqcGdjb20ub2JqOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi1jZGpwZWcub2JqOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkY29sbWFwLm9iajogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkc3dpdGNoLm9iajogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXRyYW5zdXBwLm9iajogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAotcmRwcG0ub2JqOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JwcG0ub2JqOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRnaWYub2JqOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JnaWYub2JqOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmR0YXJnYS5vYmo6IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdydGFyZ2Eub2JqOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGJtcC5vYmo6IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmJtcC5vYmo6IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHJsZS5vYmo6IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnJsZS5vYmo6IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS9tYWtlZmlsZS5jZmcgYi9tYWtlZmlsZS5jZmcKaW5kZXggYzE4YjdlNi4uN2JiM2I5ZCAxMDA2NDQKLS0tIGEvbWFrZWZpbGUuY2ZnCisrKyBiL21ha2VmaWxlLmNmZwpAQCAtMSw1ICsxLDQgQEAKICMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotIyBNb2RpZmllZCBmb3IgeDg2IFNJTUQgZXh0ZW5zaW9uCiAKICMgbWFrZWZpbGUuY2ZnIGlzIGVkaXRlZCBieSBjb25maWd1cmUgdG8gcHJvZHVjZSBhIGN1c3RvbSBNYWtlZmlsZS4KIApAQCAtMTcsOSArMTYsOCBAQAogaW5jbHVkZWRpciA9ICQocHJlZml4KS9pbmNsdWRlCiBiaW5wcmVmaXggPQogbWFucHJlZml4ID0KLW1hbmV4dCA9IC4xCi1tYW5kaXIgPSAkKHByZWZpeCkvbWFuCi1tYW4xZGlyID0gJChtYW5kaXIpL21hbjEKK21hbmV4dCA9IDEKK21hbmRpciA9ICQocHJlZml4KS9tYW4vbWFuJChtYW5leHQpCiAKICMgVGhlIG5hbWUgb2YgeW91ciBDIGNvbXBpbGVyOgogQ0M9IEBDQ0AKQEAgLTMxLDEwICsyOSw2IEBACiAjIEhvd2V2ZXIsIGFueSBzcGVjaWFsIGRlZmluZXMgZm9yIGFuc2kya25yLmMgbWF5IGJlIGluY2x1ZGVkIGhlcmU6CiBBTlNJMktOUkZMQUdTPSBAQU5TSTJLTlJGTEFHU0AKIAotIyBUaGUgZXhlY3V0YWJsZSBuYW1lIG9mIE5BU00gYW5kIGl0cyBvcHRpb25zOgotTkFTTT0gQE5BU01ACi1OQUZMQUdTPSBATkFGTEFHU0AgQElOQ0xVREVGTEFHU0AKLQogIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKIExERkxBR1M9IEBMREZMQUdTQAogCkBAIC00Myw3ICszNyw2IEBACiAKICMgSWYgdXNpbmcgR05VIGxpYnRvb2wsIExJQlRPT0wgcmVmZXJlbmNlcyBpdDsgaWYgbm90LCBMSUJUT09MIGlzIGVtcHR5LgogTElCVE9PTCA9IEBMSUJUT09MQAotdG9wX2J1aWxkZGlyID0gLgogIyAkKE8pIGV4cGFuZHMgdG8gImxvIiBpZiB1c2luZyBsaWJ0b29sLCBwbGFpbiAibyIgaWYgbm90LgogIyBTaW1pbGFybHksICQoQSkgZXhwYW5kcyB0byAibGEiIG9yICJhIi4KIE8gPSBAT0AKQEAgLTU4LDEyICs1MSw4IEBACiAjIHRvIHVzZSBqbWVtYW5zaS5vIG9yIGptZW1uYW1lLm8gaWYgeW91IGhhdmUgbGltaXRlZCBzd2FwIHNwYWNlLgogU1lTREVQTUVNPSBATUVNT1JZTUdSQAogCi0jIE9TLWRlcGVuZGVudCBTSU1EIGluc3RydWN0aW9uIHN1cHBvcnQgY2hlY2tlcgotIyBqc2ltZHczMi4kKE8pIChXaW4zMikgLyBqc2ltZGRqZy4kKE8pIChESkdQUCBWLjIpIC8ganNpbWRnY2MuJChPKSAoVW5peC9nY2MpCi1TWVNERVBTSU1EQ0hLPSBAU0lNRENIRUNLRVJACi0KICMgbWlzY2VsbGFuZW91cyBPUy1kZXBlbmRlbnQgc3R1ZmYKLVNIRUxMPSBAU0hFTExACitTSEVMTD0gL2Jpbi9zaAogIyBsaW5rZXIKIExOPSBATE5ACiAjIGZpbGUgZGVsZXRpb24gY29tbWFuZApAQCAtNzksMTEgKzY4LDYgQEAKIElOU1RBTExfUFJPR1JBTT0gQElOU1RBTExfUFJPR1JBTUAKIElOU1RBTExfTElCPSBASU5TVEFMTF9MSUJACiBJTlNUQUxMX0RBVEE9IEBJTlNUQUxMX0RBVEFACi0jIHVuaW5zdGFsbGF0aW9uIHByb2dyYW0KLVVOSU5TVEFMTD0gQFVOSU5TVEFMTEAKLSMgZXhlY3V0YWJsZSBzdWZmaXguIHVuZGVyIGN5Z3dpbiwKLSMgJ3JtJyBkb2Vzbid0IGtub3cgdGhhdCBleGVjdXRhYmxlcyBoYXZlIC5leGUgc3VmZml4LgotRVhFID0gQEVYRUVYVEAKIAogIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCiAKQEAgLTEyNiwyNiArMTEwLDE5IEBACiBESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKICAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKICMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1DT01PQkpFQ1RTPSBqY29tYXBpLiQoTykganV0aWxzLiQoTykgamVycm9yLiQoTykgam1lbW1nci4kKE8pICQoU1lTREVQTUVNKSBcCi0gICAgICAgIGpzaW1kY3B1LiQoTykgJChTWVNERVBTSU1EQ0hLKQorQ09NT0JKRUNUUz0gamNvbWFwaS4kKE8pIGp1dGlscy4kKE8pIGplcnJvci4kKE8pIGptZW1tZ3IuJChPKSAkKFNZU0RFUE1FTSkKICMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKIENMSUJPQkpFQ1RTPSBqY2FwaW1pbi4kKE8pIGpjYXBpc3RkLiQoTykgamN0cmFucy4kKE8pIGpjcGFyYW0uJChPKSBcCiAgICAgICAgIGpkYXRhZHN0LiQoTykgamNpbml0LiQoTykgamNtYXN0ZXIuJChPKSBqY21hcmtlci4kKE8pIGpjbWFpbmN0LiQoTykgXAogICAgICAgICBqY3ByZXBjdC4kKE8pIGpjY29lZmN0LiQoTykgamNjb2xvci4kKE8pIGpjc2FtcGxlLiQoTykgamNodWZmLiQoTykgXAotICAgICAgICBqY3BodWZmLiQoTykgamNkY3RtZ3IuJChPKSBqY2NvbG1teC4kKE8pIGpjY29sc3MyLiQoTykgamNzYW1tbXguJChPKSBcCi0gICAgICAgIGpjc2Ftc3MyLiQoTykgamNxbnRpbnQuJChPKSBqY3FudGZsdC4kKE8pIGpjcW50bW14LiQoTykgamNxbnQzZG4uJChPKSBcCi0gICAgICAgIGpjcW50czJpLiQoTykgamNxbnRzc2UuJChPKSBqY3FudHMyZi4kKE8pIGpmZGN0aW50LiQoTykgamZkY3Rmc3QuJChPKSBcCi0gICAgICAgIGpmZGN0Zmx0LiQoTykgamZtbXhpbnQuJChPKSBqZm1teGZzdC4kKE8pIGpmM2RuZmx0LiQoTykgamZzczJpbnQuJChPKSBcCi0gICAgICAgIGpmc3MyZnN0LiQoTykgamZzc2VmbHQuJChPKQorICAgICAgICBqY3BodWZmLiQoTykgamNkY3RtZ3IuJChPKSBqZmRjdGZzdC4kKE8pIGpmZGN0Zmx0LiQoTykgXAorICAgICAgICBqZmRjdGludC4kKE8pCiAjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKIERMSUJPQkpFQ1RTPSBqZGFwaW1pbi4kKE8pIGpkYXBpc3RkLiQoTykgamR0cmFucy4kKE8pIGpkYXRhc3JjLiQoTykgXAogICAgICAgICBqZG1hc3Rlci4kKE8pIGpkaW5wdXQuJChPKSBqZG1hcmtlci4kKE8pIGpkaHVmZi4kKE8pIGpkcGh1ZmYuJChPKSBcCi0gICAgICAgIGpkbWFpbmN0LiQoTykgamRjb2VmY3QuJChPKSBqZHBvc3RjdC4kKE8pIGpkZGN0bWdyLiQoTykgamRzYW1wbGUuJChPKSBcCi0gICAgICAgIGpkY29sb3IuJChPKSBqcXVhbnQxLiQoTykganF1YW50Mi4kKE8pIGpkbWVyZ2UuJChPKSBqaWRjdGludC4kKE8pIFwKLSAgICAgICAgamlkY3Rmc3QuJChPKSBqaWRjdHJlZC4kKE8pIGppZGN0Zmx0LiQoTykgamltbXhpbnQuJChPKSBqaW1teGZzdC4kKE8pIFwKLSAgICAgICAgamltbXhyZWQuJChPKSBqaTNkbmZsdC4kKE8pIGppc3MyaW50LiQoTykgamlzczJmc3QuJChPKSBqaXNzMnJlZC4kKE8pIFwKLSAgICAgICAgamlzc2VmbHQuJChPKSBqaXNzMmZsdC4kKE8pIGpkc2FtbW14LiQoTykgamRzYW1zczIuJChPKSBqZGNvbG1teC4kKE8pIFwKLSAgICAgICAgamRjb2xzczIuJChPKSBqZG1lcm1teC4kKE8pIGpkbWVyc3MyLiQoTykKKyAgICAgICAgamRtYWluY3QuJChPKSBqZGNvZWZjdC4kKE8pIGpkcG9zdGN0LiQoTykgamRkY3RtZ3IuJChPKSBcCisgICAgICAgIGppZGN0ZnN0LiQoTykgamlkY3RmbHQuJChPKSBqaWRjdGludC4kKE8pIGppZGN0cmVkLiQoTykgXAorICAgICAgICBqZHNhbXBsZS4kKE8pIGpkY29sb3IuJChPKSBqcXVhbnQxLiQoTykganF1YW50Mi4kKE8pIGpkbWVyZ2UuJChPKQogIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5hCiBMSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCiAjIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCkBAIC0xNTYsMjIgKzEzMywxNSBAQAogVFJPQkpFQ1RTPSBqcGVndHJhbi4kKE8pIHJkc3dpdGNoLiQoTykgY2RqcGVnLiQoTykgdHJhbnN1cHAuJChPKQogCiAKLWFsbDogQEEyS19ERVBTQCBsaWJqcGVnLiQoQSkgY2pwZWcgZGpwZWcganBlZ3RyYW4gcmRqcGdjb20gd3JqcGdjb20KK2FsbDogQEEyS19ERVBTQCBsaWJqcGVnLiQoQSkKIAogIyBTcGVjaWFsIGNvbXBpbGF0aW9uIHJ1bGVzIHRvIHN1cHBvcnQgYW5zaTJrbnIgYW5kIGxpYnRvb2wuCi0uU1VGRklYRVM6IC5sbyAubGEgLmFzbQotCi0uYXNtLm86Ci0JJChTSEVMTCkgJChzcmNkaXIpL25hc21fbHQuc2ggJChOQVNNKSAkKE5BRkxBR1MpICQoc3JjZGlyKS8kKi5hc20KKy5TVUZGSVhFUzogLmxvIC5sYQogCiAjIEhvdyB0byBjb21waWxlIHdpdGggbGlidG9vbC4KIEBDT01fTFRALmMubG86CiBAQ09NX0xUQAkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoQ0ZMQUdTKSAtYyAkKHNyY2RpcikvJCouYwogCi1AQ09NX0xUQC5hc20ubG86Ci1AQ09NX0xUQAkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlIEBUQUdDQ0AgJChTSEVMTCkgJChzcmNkaXIpL25hc21fbHQuc2ggXAotQENPTV9MVEAJCSQoTkFTTSkgJChOQUZMQUdTKSAkKHNyY2RpcikvJCouYXNtCi0KICMgSG93IHRvIHVzZSBhbnNpMmtuciwgd2hlbiBub3QgdXNpbmcgbGlidG9vbC4KIEBDT01fQTJLQC5jLm86CiBAQ09NX0EyS0AJLi9hbnNpMmtuciAkKHNyY2RpcikvJCouYyBrbnIvJCouYwpAQCAtMTk5LDcgKzE2OSw3IEBACiAjIHdpdGggbGlidG9vbDoKIGxpYmpwZWcubGE6IEBBMktfREVQU0AgJChMSUJPQkpFQ1RTKQogCSQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQykgLW8gbGlianBlZy5sYSAkKExJQk9CSkVDVFMpIFwKLQkJLW5vLXVuZGVmaW5lZCAtcnBhdGggJChsaWJkaXIpIC12ZXJzaW9uLWluZm8gJChKUEVHX0xJQl9WRVJTSU9OKQorCQktcnBhdGggJChsaWJkaXIpIC12ZXJzaW9uLWluZm8gJChKUEVHX0xJQl9WRVJTSU9OKQogCiAjIHNhbXBsZSBwcm9ncmFtczoKIApAQCAtMjIxLDYyICsxOTEsMzQgQEAKICMgSW5zdGFsbGF0aW9uIHJ1bGVzOgogCiBpbnN0YWxsOiBjanBlZyBkanBlZyBqcGVndHJhbiByZGpwZ2NvbSB3cmpwZ2NvbSBARk9SQ0VfSU5TVEFMTF9MSUJACi0JLUBpZiBbICEgLWQgJChiaW5kaXIpIF07IHRoZW4gbWtkaXIgLXAgJChiaW5kaXIpOyBmaQotCS1AaWYgWyAhIC1kICQobWFuMWRpcikgXTsgdGhlbiBta2RpciAtcCAkKG1hbjFkaXIpOyBmaQogCSQoSU5TVEFMTF9QUk9HUkFNKSBjanBlZyAkKGJpbmRpcikvJChiaW5wcmVmaXgpY2pwZWcKIAkkKElOU1RBTExfUFJPR1JBTSkgZGpwZWcgJChiaW5kaXIpLyQoYmlucHJlZml4KWRqcGVnCiAJJChJTlNUQUxMX1BST0dSQU0pIGpwZWd0cmFuICQoYmluZGlyKS8kKGJpbnByZWZpeClqcGVndHJhbgogCSQoSU5TVEFMTF9QUk9HUkFNKSByZGpwZ2NvbSAkKGJpbmRpcikvJChiaW5wcmVmaXgpcmRqcGdjb20KIAkkKElOU1RBTExfUFJPR1JBTSkgd3JqcGdjb20gJChiaW5kaXIpLyQoYmlucHJlZml4KXdyanBnY29tCi0JJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9janBlZy4xICQobWFuMWRpcikvJChtYW5wcmVmaXgpY2pwZWckKG1hbmV4dCkKLQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2RqcGVnLjEgJChtYW4xZGlyKS8kKG1hbnByZWZpeClkanBlZyQobWFuZXh0KQotCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvanBlZ3RyYW4uMSAkKG1hbjFkaXIpLyQobWFucHJlZml4KWpwZWd0cmFuJChtYW5leHQpCi0JJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9yZGpwZ2NvbS4xICQobWFuMWRpcikvJChtYW5wcmVmaXgpcmRqcGdjb20kKG1hbmV4dCkKLQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL3dyanBnY29tLjEgJChtYW4xZGlyKS8kKG1hbnByZWZpeCl3cmpwZ2NvbSQobWFuZXh0KQorCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvY2pwZWcuMSAkKG1hbmRpcikvJChtYW5wcmVmaXgpY2pwZWcuJChtYW5leHQpCisJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9kanBlZy4xICQobWFuZGlyKS8kKG1hbnByZWZpeClkanBlZy4kKG1hbmV4dCkKKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2pwZWd0cmFuLjEgJChtYW5kaXIpLyQobWFucHJlZml4KWpwZWd0cmFuLiQobWFuZXh0KQorCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvcmRqcGdjb20uMSAkKG1hbmRpcikvJChtYW5wcmVmaXgpcmRqcGdjb20uJChtYW5leHQpCisJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS93cmpwZ2NvbS4xICQobWFuZGlyKS8kKG1hbnByZWZpeCl3cmpwZ2NvbS4kKG1hbmV4dCkKIAogaW5zdGFsbC1saWI6IGxpYmpwZWcuJChBKSBpbnN0YWxsLWhlYWRlcnMKLQktQGlmIFsgISAtZCAkKGxpYmRpcikgXTsgdGhlbiBta2RpciAtcCAkKGxpYmRpcik7IGZpCiAJJChJTlNUQUxMX0xJQikgbGlianBlZy4kKEEpICQobGliZGlyKS8kKGJpbnByZWZpeClsaWJqcGVnLiQoQSkKIAogaW5zdGFsbC1oZWFkZXJzOiBqY29uZmlnLmgKLQktQGlmIFsgISAtZCAkKGluY2x1ZGVkaXIpIF07IHRoZW4gbWtkaXIgLXAgJChpbmNsdWRlZGlyKTsgZmkKIAkkKElOU1RBTExfREFUQSkgamNvbmZpZy5oICQoaW5jbHVkZWRpcikvamNvbmZpZy5oCiAJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9qcGVnbGliLmggJChpbmNsdWRlZGlyKS9qcGVnbGliLmgKIAkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2ptb3JlY2ZnLmggJChpbmNsdWRlZGlyKS9qbW9yZWNmZy5oCiAJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9qZXJyb3IuaCAkKGluY2x1ZGVkaXIpL2plcnJvci5oCiAKLSMgVW5pbnN0YWxsYXRpb24gcnVsZXM6Ci0KLXVuaW5zdGFsbDogQFVOSU5TVEFMTF9MSUJACi0JJChVTklOU1RBTEwpICQoYmluZGlyKS8kKGJpbnByZWZpeCljanBlZyQoRVhFKQotCSQoVU5JTlNUQUxMKSAkKGJpbmRpcikvJChiaW5wcmVmaXgpZGpwZWckKEVYRSkKLQkkKFVOSU5TVEFMTCkgJChiaW5kaXIpLyQoYmlucHJlZml4KWpwZWd0cmFuJChFWEUpCi0JJChVTklOU1RBTEwpICQoYmluZGlyKS8kKGJpbnByZWZpeClyZGpwZ2NvbSQoRVhFKQotCSQoVU5JTlNUQUxMKSAkKGJpbmRpcikvJChiaW5wcmVmaXgpd3JqcGdjb20kKEVYRSkKLQkkKFVOSU5TVEFMTCkgJChtYW4xZGlyKS8kKG1hbnByZWZpeCljanBlZyQobWFuZXh0KQotCSQoVU5JTlNUQUxMKSAkKG1hbjFkaXIpLyQobWFucHJlZml4KWRqcGVnJChtYW5leHQpCi0JJChVTklOU1RBTEwpICQobWFuMWRpcikvJChtYW5wcmVmaXgpanBlZ3RyYW4kKG1hbmV4dCkKLQkkKFVOSU5TVEFMTCkgJChtYW4xZGlyKS8kKG1hbnByZWZpeClyZGpwZ2NvbSQobWFuZXh0KQotCSQoVU5JTlNUQUxMKSAkKG1hbjFkaXIpLyQobWFucHJlZml4KXdyanBnY29tJChtYW5leHQpCi0KLXVuaW5zdGFsbC1saWI6IHVuaW5zdGFsbC1oZWFkZXJzCi0JJChVTklOU1RBTEwpICQobGliZGlyKS8kKGJpbnByZWZpeClsaWJqcGVnLiQoQSkKLQotdW5pbnN0YWxsLWhlYWRlcnM6Ci0JJChVTklOU1RBTEwpICQoaW5jbHVkZWRpcikvamNvbmZpZy5oCi0JJChVTklOU1RBTEwpICQoaW5jbHVkZWRpcikvanBlZ2xpYi5oCi0JJChVTklOU1RBTEwpICQoaW5jbHVkZWRpcikvam1vcmVjZmcuaAotCSQoVU5JTlNUQUxMKSAkKGluY2x1ZGVkaXIpL2plcnJvci5oCi0KIGNsZWFuOgotCSQoUk0pIGpzaW1kY2ZnLmluYyAqLm8gKi5sbyBsaWJqcGVnLmEgbGlianBlZy5sYQotIwkgdW5kZXIgY3lnd2luLCBsaWJ0b29sIHdpbGwgY3JlYXRlIHdyYXBwZXIgc2NyaXB0cyB3aXRob3V0IHN1ZmZpeC4KLQkkKFJNKSBjanBlZyBkanBlZyBqcGVndHJhbiBjanBlZyQoRVhFKSBkanBlZyQoRVhFKSBqcGVndHJhbiQoRVhFKQotCSQoUk0pIHJkanBnY29tJChFWEUpIHdyanBnY29tJChFWEUpIGFuc2kya25yJChFWEUpIGNvcmUgdGVzdG91dCoKKwkkKFJNKSAqLm8gKi5sbyBsaWJqcGVnLmEgbGlianBlZy5sYQorCSQoUk0pIGNqcGVnIGRqcGVnIGpwZWd0cmFuIHJkanBnY29tIHdyanBnY29tCisJJChSTSkgYW5zaTJrbnIgY29yZSB0ZXN0b3V0KiBjb25maWcubG9nIGNvbmZpZy5zdGF0dXMKIAkkKFJNKSAtciBrbnIgLmxpYnMgX2xpYnMKIAogZGlzdGNsZWFuOiBjbGVhbgotCSQoUk0pIE1ha2VmaWxlIGpjb25maWcuaCBsaWJ0b29sIGNvbmZpZy5jYWNoZSBjb25maWcuc3RhdHVzIGNvbmZpZy5sb2cKKwkkKFJNKSBNYWtlZmlsZSBqY29uZmlnLmggbGlidG9vbCBjb25maWcuY2FjaGUKIAogdGVzdDogY2pwZWcgZGpwZWcganBlZ3RyYW4KIAkkKFJNKSB0ZXN0b3V0KgpAQCAtMzA2LDYwICsyNDgsMTAgQEAKIC5QSE9OWTogYWxsIGluc3RhbGwgaW5zdGFsbC1saWIgaW5zdGFsbC1oZWFkZXJzIGNsZWFuIGRpc3RjbGVhbiB0ZXN0IGNoZWNrCiAKIAotanNpbWRjZmcuaW5jOiBtYWtlY2ZnLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi0JJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gbWFrZWNmZyAkKHNyY2RpcikvbWFrZWNmZy5jICQoTERMSUJTKQotCS4vbWFrZWNmZyA+IGpzaW1kY2ZnLmluYwotCSQoUk0pIG1ha2VjZmckKEVYRSkKLQotanNpbWRjcHUuJChPKToganNpbWRjcHUuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMKLWpzaW1kdzMyLiQoTyk6IGpzaW1kdzMyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jCi1qc2ltZGRqZy4kKE8pOiBqc2ltZGRqZy5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYwotamNjb2xtbXguJChPKTogamNjb2xtbXguYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qY2NvbHNzMi4kKE8pOiBqY2NvbHNzMi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpjc2FtbW14LiQoTyk6IGpjc2FtbW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamNzYW1zczIuJChPKTogamNzYW1zczIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZGNvbG1teC4kKE8pOiBqZGNvbG1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkY29sc3MyLiQoTyk6IGpkY29sc3MyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRtZXJtbXguJChPKTogamRtZXJtbXguYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZG1lcnNzMi4kKE8pOiBqZG1lcnNzMi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkc2FtbW14LiQoTyk6IGpkc2FtbW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRzYW1zczIuJChPKTogamRzYW1zczIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qY3FudGludC4kKE8pOiBqY3FudGludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnRmbHQuJChPKTogamNxbnRmbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpjcW50bW14LiQoTyk6IGpjcW50bW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudDNkbi4kKE8pOiBqY3FudDNkbi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnRzMmkuJChPKTogamNxbnRzMmkuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpjcW50c3NlLiQoTyk6IGpjcW50c3NlLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudHMyZi4kKE8pOiBqY3FudHMyZi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZkY3RpbnQuJChPKTogamZkY3RpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmZGN0ZnN0LiQoTyk6IGpmZGN0ZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZmRjdGZsdC4kKE8pOiBqZmRjdGZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZtbXhpbnQuJChPKTogamZtbXhpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmbW14ZnN0LiQoTyk6IGpmbW14ZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZjNkbmZsdC4kKE8pOiBqZjNkbmZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZzczJpbnQuJChPKTogamZzczJpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmc3MyZnN0LiQoTyk6IGpmc3MyZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZnNzZWZsdC4kKE8pOiBqZnNzZWZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlkY3RpbnQuJChPKTogamlkY3RpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppZGN0ZnN0LiQoTyk6IGppZGN0ZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaWRjdHJlZC4kKE8pOiBqaWRjdHJlZC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlkY3RmbHQuJChPKTogamlkY3RmbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppbW14aW50LiQoTyk6IGppbW14aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaW1teGZzdC4kKE8pOiBqaW1teGZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamltbXhyZWQuJChPKTogamltbXhyZWQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppM2RuZmx0LiQoTyk6IGppM2RuZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzMmludC4kKE8pOiBqaXNzMmludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlzczJmc3QuJChPKTogamlzczJmc3QuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppc3MycmVkLiQoTyk6IGppc3MycmVkLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzZWZsdC4kKE8pOiBqaXNzZWZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlzczJmbHQuJChPKTogamlzczJmbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLQotanNpbWRnY2MuJChPKToganNpbWRnY2MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotCiBqY2FwaW1pbi4kKE8pOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNhcGlzdGQuJChPKTogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjY29lZmN0LiQoTyk6IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvbG9yLiQoTyk6IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAoramNjb2xvci4kKE8pOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2RjdG1nci4kKE8pOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKIGpjaHVmZi4kKE8pOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKIGpjaW5pdC4kKE8pOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKQEAgLTM3MCwzMyArMjYyLDMzIEBACiBqY3BhcmFtLiQoTyk6IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjcGh1ZmYuJChPKTogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAogamNwcmVwY3QuJChPKTogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjc2FtcGxlLiQoTyk6IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjb2xzYW1wLmgKK2pjc2FtcGxlLiQoTyk6IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY3RyYW5zLiQoTyk6IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkYXBpbWluLiQoTyk6IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGFwaXN0ZC4kKE8pOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRhdGFkc3QuJChPKTogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAogamRhdGFzcmMuJChPKTogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAogamRjb2VmY3QuJChPKTogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkY29sb3IuJChPKTogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY29sc2FtcC5oCitqZGNvbG9yLiQoTyk6IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkZGN0bWdyLiQoTyk6IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAogamRodWZmLiQoTyk6IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAogamRpbnB1dC4kKE8pOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZG1haW5jdC4kKE8pOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRtYXJrZXIuJChPKTogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkbWFzdGVyLiQoTyk6IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1lcmdlLiQoTyk6IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAoramRtZXJnZS4kKE8pOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZHBodWZmLiQoTyk6IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKIGpkcG9zdGN0LiQoTyk6IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHNhbXBsZS4kKE8pOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY29sc2FtcC5oCitqZHNhbXBsZS4kKE8pOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamR0cmFucy4kKE8pOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZXJyb3IuJChPKTogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAotIyBqZmRjdGZsdC4kKE8pOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamZkY3Rmc3QuJChPKTogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGpmZGN0aW50LiQoTyk6IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotIyBqaWRjdGZsdC4kKE8pOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamlkY3Rmc3QuJChPKTogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGppZGN0aW50LiQoTyk6IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotIyBqaWRjdHJlZC4kKE8pOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0Zmx0LiQoTyk6IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3Rmc3QuJChPKTogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGludC4kKE8pOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0Zmx0LiQoTyk6IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3Rmc3QuJChPKTogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGludC4kKE8pOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0cmVkLiQoTyk6IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoganF1YW50MS4kKE8pOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqcXVhbnQyLiQoTyk6IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGp1dGlscy4kKE8pOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKZGlmZiAtLWdpdCBhL21ha2VmaWxlLmRqIGIvbWFrZWZpbGUuZGoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxODY0NjguLjAwMDAwMDAKLS0tIGEvbWFrZWZpbGUuZGoKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCi0jIE1vZGlmaWVkIGZvciB4ODYgU0lNRCBleHRlbnNpb24KLQotIyBUaGlzIG1ha2VmaWxlIGlzIGZvciBESkdQUCAoRGVsb3JpZSdzIEdOVSBDIHBvcnQgb24gTVMtRE9TKSwgdjIuMCBvciBsYXRlci4KLSMgVGhhbmtzIHRvIEZyYW5rIEouIERvbmFob2UgZm9yIHRoaXMgdmVyc2lvbi4KLQotIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibWFrZSIgISEKLQotc3JjZGlyID0gLgotVlBBVEggID0gJChzcmNkaXIpCi0KLSMgVGhlIG5hbWUgb2YgeW91ciBDIGNvbXBpbGVyOgotQ0M9IGdjYwotCi0jIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY2Mgb3B0aW9uczoKLSMgRm9yIGdjYyAzLjQueAotQ0ZMQUdTPSAtTzIgLW10dW5lPXBlbnRpdW0yIC1tYXJjaD1pMzg2IC1mb21pdC1mcmFtZS1wb2ludGVyIC1md2ViIFwKLSAgICAgICAgLW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnk9MiAtbW5vLWFsaWduLXN0cmluZ29wcyAtSSQoc3JjZGlyKQotIyBGb3IgZ2NjIDMuMy54Ci0jQ0ZMQUdTPSAtTzIgLW1jcHU9cGVudGl1bTIgLW1hcmNoPWkzODYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgXAotIyAgICAgICAgLW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnk9MiAtbW5vLWFsaWduLXN0cmluZ29wcyAtSSQoc3JjZGlyKQotIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKLSMgTk9UIHZpYSAtRCBzd2l0Y2hlcyBoZXJlLgotCi0jIFRoZSBleGVjdXRhYmxlIG5hbWUgb2YgTkFTTSBhbmQgaXRzIG9wdGlvbnM6Ci1OQVNNPSBuYXNtCi1OQUZMQUdTPSAkKE5BU01fT0JKRk1UKSAtSSQoc3JjZGlyKS8KLSMgb2JqZWN0IGZpbGUgZm9ybWF0IHNwZWNpZmllciBmb3IgTkFTTQotIyBzZWUganNpbWRleHQuaW5jIGZvciBtb3JlIGRldGFpbHMuCi1OQVNNX09CSkZNVD0gLWZjb2ZmIC1EREpHUFAKLQotIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKLUxERkxBR1M9IC1zCi0KLSMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IC1sIGNvbW1hbmRzIGhlcmUuCi1MRExJQlM9IAotCi0jIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQotIyBtYW5hZ2VyIGZpbGUuICBGb3IgREpHUFAgdGhpcyBpcyB1c3VhbGx5IGptZW1ub2JzLm8sIGJ1dCB5b3UgY291bGQKLSMgdXNlIGptZW1uYW1lLm8gaWYgeW91IHdhbnQgdG8gdXNlIG5hbWVkIHRlbXAgZmlsZXMgaW5zdGVhZCBvZiBzd2FwIHNwYWNlLgotU1lTREVQTUVNPSBqbWVtbm9icy5vCi0KLSMgT1MtZGVwZW5kZW50IFNJTUQgaW5zdHJ1Y3Rpb24gc3VwcG9ydCBjaGVja2VyCi0jIGpzaW1kdzMyLm8gKFdpbjMyKSAvIGpzaW1kZGpnLm8gKERKR1BQIFYuMikgLyBqc2ltZGdjYy5vIChVbml4L2djYykKLVNZU0RFUFNJTURDSEs9IGpzaW1kZGpnLm8KLQotIyBtaXNjZWxsYW5lb3VzIE9TLWRlcGVuZGVudCBzdHVmZgotIyBsaW5rZXIKLUxOPSAkKENDKQotIyBmaWxlIGRlbGV0aW9uIGNvbW1hbmQKLVJNPSBkZWwKLSMgbGlicmFyeSAoLmEpIGZpbGUgY3JlYXRpb24gY29tbWFuZAotQVI9IGFyIHJjCi0jIHNlY29uZCBzdGVwIGluIC5hIGNyZWF0aW9uICh1c2UgInRvdWNoIiBpZiBub3QgbmVlZGVkKQotQVIyPSByYW5saWIKLQotIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCi0KLQotIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAotICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCi0jIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQotU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYwotIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQotQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKLSAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCi0gICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYwotU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKLSMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCi1JTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAotICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKLSMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0Ci1DT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCi0gICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAotICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KLVRFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCi0gICAgICAgIHRlc3RpbWdwLmpwZwotRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCi0gICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCi0jIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotQ09NT0JKRUNUUz0gamNvbWFwaS5vIGp1dGlscy5vIGplcnJvci5vIGptZW1tZ3IubyAkKFNZU0RFUE1FTSkganNpbWRjcHUubyBcCi0gICAgICAgICQoU1lTREVQU0lNRENISykKLSMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLUNMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vIGpjYXBpc3RkLm8gamN0cmFucy5vIGpjcGFyYW0ubyBqZGF0YWRzdC5vIGpjaW5pdC5vIFwKLSAgICAgICAgamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBqY2NvZWZjdC5vIGpjY29sb3IubyBcCi0gICAgICAgIGpjc2FtcGxlLm8gamNodWZmLm8gamNwaHVmZi5vIGpjZGN0bWdyLm8gamNjb2xtbXgubyBqY2NvbHNzMi5vIFwKLSAgICAgICAgamNzYW1tbXgubyBqY3NhbXNzMi5vIGpjcW50aW50Lm8gamNxbnRmbHQubyBqY3FudG1teC5vIGpjcW50M2RuLm8gXAotICAgICAgICBqY3FudHMyaS5vIGpjcW50c3NlLm8gamNxbnRzMmYubyBqZmRjdGludC5vIGpmZGN0ZnN0Lm8gamZkY3RmbHQubyBcCi0gICAgICAgIGpmbW14aW50Lm8gamZtbXhmc3QubyBqZjNkbmZsdC5vIGpmc3MyaW50Lm8gamZzczJmc3QubyBqZnNzZWZsdC5vCi0jIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLURMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vIGpkYXBpc3RkLm8gamR0cmFucy5vIGpkYXRhc3JjLm8gamRtYXN0ZXIubyBcCi0gICAgICAgIGpkaW5wdXQubyBqZG1hcmtlci5vIGpkaHVmZi5vIGpkcGh1ZmYubyBqZG1haW5jdC5vIGpkY29lZmN0Lm8gXAotICAgICAgICBqZHBvc3RjdC5vIGpkZGN0bWdyLm8gamRzYW1wbGUubyBqZGNvbG9yLm8ganF1YW50MS5vIGpxdWFudDIubyBcCi0gICAgICAgIGpkbWVyZ2UubyBqaWRjdGludC5vIGppZGN0ZnN0Lm8gamlkY3RyZWQubyBqaWRjdGZsdC5vIGppbW14aW50Lm8gXAotICAgICAgICBqaW1teGZzdC5vIGppbW14cmVkLm8gamkzZG5mbHQubyBqaXNzMmludC5vIGppc3MyZnN0Lm8gamlzczJyZWQubyBcCi0gICAgICAgIGppc3NlZmx0Lm8gamlzczJmbHQubyBqZHNhbW1teC5vIGpkc2Ftc3MyLm8gamRjb2xtbXgubyBqZGNvbHNzMi5vIFwKLSAgICAgICAgamRtZXJtbXgubyBqZG1lcnNzMi5vCi0jIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmEKLUxJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKLSMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKLUNPQkpFQ1RTPSBjanBlZy5vIHJkcHBtLm8gcmRnaWYubyByZHRhcmdhLm8gcmRybGUubyByZGJtcC5vIHJkc3dpdGNoLm8gXAotICAgICAgICBjZGpwZWcubwotRE9CSkVDVFM9IGRqcGVnLm8gd3JwcG0ubyB3cmdpZi5vIHdydGFyZ2EubyB3cnJsZS5vIHdyYm1wLm8gcmRjb2xtYXAubyBcCi0gICAgICAgIGNkanBlZy5vCi1UUk9CSkVDVFM9IGpwZWd0cmFuLm8gcmRzd2l0Y2gubyBjZGpwZWcubyB0cmFuc3VwcC5vCi0KLQotYWxsOiBsaWJqcGVnLmEgY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgcmRqcGdjb20uZXhlIHdyanBnY29tLmV4ZQotCi1saWJqcGVnLmE6ICQoTElCT0JKRUNUUykKLQkkKFJNKSBsaWJqcGVnLmEKLQkkKEFSKSBsaWJqcGVnLmEgICQoTElCT0JKRUNUUykKLQkkKEFSMikgbGlianBlZy5hCi0KLWNqcGVnLmV4ZTogJChDT0JKRUNUUykgbGlianBlZy5hCi0JJChMTikgJChMREZMQUdTKSAtbyBjanBlZy5leGUgJChDT0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQotCi1kanBlZy5leGU6ICQoRE9CSkVDVFMpIGxpYmpwZWcuYQotCSQoTE4pICQoTERGTEFHUykgLW8gZGpwZWcuZXhlICQoRE9CSkVDVFMpIGxpYmpwZWcuYSAkKExETElCUykKLQotanBlZ3RyYW4uZXhlOiAkKFRST0JKRUNUUykgbGlianBlZy5hCi0JJChMTikgJChMREZMQUdTKSAtbyBqcGVndHJhbi5leGUgJChUUk9CSkVDVFMpIGxpYmpwZWcuYSAkKExETElCUykKLQotcmRqcGdjb20uZXhlOiByZGpwZ2NvbS5vCi0JJChMTikgJChMREZMQUdTKSAtbyByZGpwZ2NvbS5leGUgcmRqcGdjb20ubyAkKExETElCUykKLQotd3JqcGdjb20uZXhlOiB3cmpwZ2NvbS5vCi0JJChMTikgJChMREZMQUdTKSAtbyB3cmpwZ2NvbS5leGUgd3JqcGdjb20ubyAkKExETElCUykKLQotamNvbmZpZy5oOiBqY29uZmlnLmRvYwotCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCi0JZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCi0JZXhpdCAxCi0KLWNsZWFuOgotCSQoUk0pICoubwotCSQoUk0pIGNqcGVnLmV4ZQotCSQoUk0pIGRqcGVnLmV4ZQotCSQoUk0pIGpwZWd0cmFuLmV4ZQotCSQoUk0pIHJkanBnY29tLmV4ZQotCSQoUk0pIHdyanBnY29tLmV4ZQotCSQoUk0pIGpzaW1kY2ZnLmluYwotCSQoUk0pIGxpYmpwZWcuYQotCSQoUk0pIHRlc3RvdXQqLioKLQotdGVzdDogY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUKLQkkKFJNKSB0ZXN0b3V0Ki4qCi0JLi9kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtICQoc3JjZGlyKVx0ZXN0b3JpZy5qcGcKLQkuL2RqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgJChzcmNkaXIpXHRlc3RvcmlnLmpwZwotCS4vY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgJChzcmNkaXIpXHRlc3RpbWcucHBtCi0JLi9kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSAkKHNyY2RpcilcdGVzdHByb2cuanBnCi0JLi9janBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSB0ZXN0b3V0cC5qcGcgJChzcmNkaXIpXHRlc3RpbWcucHBtCi0JLi9qcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgJChzcmNkaXIpXHRlc3Rwcm9nLmpwZwotCWZjIC9iICQoc3JjZGlyKVx0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQotCWZjIC9iICQoc3JjZGlyKVx0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAotCWZjIC9iICQoc3JjZGlyKVx0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZwotCWZjIC9iICQoc3JjZGlyKVx0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KLQlmYyAvYiAkKHNyY2RpcilcdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZwotCWZjIC9iICQoc3JjZGlyKVx0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCi0KLQotanNpbWRjZmcuaW5jOiBtYWtlY2ZnLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi0JJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gbWFrZWNmZy5leGUgJChzcmNkaXIpL21ha2VjZmcuYyAkKExETElCUykKLQkuXG1ha2VjZmcuZXhlID4ganNpbWRjZmcuaW5jCi0JJChSTSkgbWFrZWNmZy5leGUKLQotJS5vIDogJS5hc20KLQkkKE5BU00pICQoTkFGTEFHUykgLW8gJEAgJDwKLQotanNpbWRjcHUubzoganNpbWRjcHUuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMKLWpzaW1kdzMyLm86IGpzaW1kdzMyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jCi1qc2ltZGRqZy5vOiBqc2ltZGRqZy5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYwotamNjb2xtbXgubzogamNjb2xtbXguYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qY2NvbHNzMi5vOiBqY2NvbHNzMi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpjc2FtbW14Lm86IGpjc2FtbW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamNzYW1zczIubzogamNzYW1zczIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZGNvbG1teC5vOiBqZGNvbG1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkY29sc3MyLm86IGpkY29sc3MyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRtZXJtbXgubzogamRtZXJtbXguYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZG1lcnNzMi5vOiBqZG1lcnNzMi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkc2FtbW14Lm86IGpkc2FtbW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRzYW1zczIubzogamRzYW1zczIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qY3FudGludC5vOiBqY3FudGludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnRmbHQubzogamNxbnRmbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpjcW50bW14Lm86IGpjcW50bW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudDNkbi5vOiBqY3FudDNkbi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnRzMmkubzogamNxbnRzMmkuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpjcW50c3NlLm86IGpjcW50c3NlLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudHMyZi5vOiBqY3FudHMyZi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZkY3RpbnQubzogamZkY3RpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmZGN0ZnN0Lm86IGpmZGN0ZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZmRjdGZsdC5vOiBqZmRjdGZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZtbXhpbnQubzogamZtbXhpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmbW14ZnN0Lm86IGpmbW14ZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZjNkbmZsdC5vOiBqZjNkbmZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZzczJpbnQubzogamZzczJpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmc3MyZnN0Lm86IGpmc3MyZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZnNzZWZsdC5vOiBqZnNzZWZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlkY3RpbnQubzogamlkY3RpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppZGN0ZnN0Lm86IGppZGN0ZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaWRjdHJlZC5vOiBqaWRjdHJlZC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlkY3RmbHQubzogamlkY3RmbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppbW14aW50Lm86IGppbW14aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaW1teGZzdC5vOiBqaW1teGZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamltbXhyZWQubzogamltbXhyZWQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppM2RuZmx0Lm86IGppM2RuZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzMmludC5vOiBqaXNzMmludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlzczJmc3QubzogamlzczJmc3QuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppc3MycmVkLm86IGppc3MycmVkLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzZWZsdC5vOiBqaXNzZWZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlzczJmbHQubzogamlzczJmbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLQotanNpbWRnY2MubzoganNpbWRnY2MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotCi1qY2FwaW1pbi5vOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNhcGlzdGQubzogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29lZmN0Lm86IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvbG9yLm86IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamNkY3RtZ3IubzogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qY2h1ZmYubzogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY2luaXQubzogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21haW5jdC5vOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXJrZXIubzogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFzdGVyLm86IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY29tYXBpLm86IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGFyYW0ubzogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwaHVmZi5vOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY3ByZXBjdC5vOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNzYW1wbGUubzogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamN0cmFucy5vOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaW1pbi5vOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGlzdGQubzogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXRhZHN0Lm86IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkYXRhc3JjLm86IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkY29lZmN0Lm86IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGNvbG9yLm86IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamRkY3RtZ3IubzogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZGh1ZmYubzogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZGlucHV0Lm86IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFpbmN0Lm86IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hcmtlci5vOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXN0ZXIubzogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWVyZ2UubzogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY29sc2FtcC5oCi1qZHBodWZmLm86IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkcG9zdGN0Lm86IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHNhbXBsZS5vOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY29sc2FtcC5oCi1qZHRyYW5zLm86IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWplcnJvci5vOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCi0jIGpmZGN0Zmx0Lm86IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotIyBqZmRjdGZzdC5vOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamZkY3RpbnQubzogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGppZGN0Zmx0Lm86IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotIyBqaWRjdGZzdC5vOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamlkY3RpbnQubzogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGppZGN0cmVkLm86IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotanF1YW50MS5vOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qcXVhbnQyLm86IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWp1dGlscy5vOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWptZW1tZ3Iubzogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1hbnNpLm86IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5hbWUubzogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbm9icy5vOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1kb3Mubzogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1tYWMubzogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWNqcGVnLm86IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWRqcGVnLm86IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWpwZWd0cmFuLm86IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAotcmRqcGdjb20ubzogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotd3JqcGdjb20ubzogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotY2RqcGVnLm86IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRjb2xtYXAubzogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkc3dpdGNoLm86IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi10cmFuc3VwcC5vOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCi1yZHBwbS5vOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JwcG0ubzogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkZ2lmLm86IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmdpZi5vOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmR0YXJnYS5vOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnRhcmdhLm86IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkYm1wLm86IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmJtcC5vOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRybGUubzogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycmxlLm86IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS9tYWtlZmlsZS5saW51eCBiL21ha2VmaWxlLmxpbnV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGUxZDY1Li4wMDAwMDAwCi0tLSBhL21ha2VmaWxlLmxpbnV4CisrKyAvZGV2L251bGwKQEAgLTEsNDQ5ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotIyBNb2RpZmllZCBmb3IgeDg2IFNJTUQgZXh0ZW5zaW9uCi0KLSMgVGhpcyBtYWtlZmlsZSBpcyBmb3IgTGludXggRUxGIHdpdGggZ2NjCi0KLSMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIm1ha2UiICEhCi0KLSMgRm9yIGNvbXBpbGluZyB3aXRoIHNvdXJjZSBhbmQgb2JqZWN0IGZpbGVzIGluIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4KLXNyY2RpciA9IC4KLVZQQVRIICA9ICQoc3JjZGlyKQotCi0jIFdoZXJlIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIGFuZCBtYW4gcGFnZXMuCi1wcmVmaXggPSAvdXNyL2xvY2FsCi1leGVjX3ByZWZpeCA9ICR7cHJlZml4fQotYmluZGlyID0gJChleGVjX3ByZWZpeCkvYmluCi1saWJkaXIgPSAkKGV4ZWNfcHJlZml4KS9saWIKLWluY2x1ZGVkaXIgPSAkKHByZWZpeCkvaW5jbHVkZQotYmlucHJlZml4ID0KLW1hbnByZWZpeCA9Ci1tYW5leHQgPSAxCi1tYW5kaXIgPSAkKHByZWZpeCkvbWFuL21hbiQobWFuZXh0KQotCi1MTk5BTUUJPSBsaWJqcGVnLnNvCi1TT05BTUUJPSBsaWJqcGVnLnNvLjYyCi1MSUJOQU1FCT0gbGlianBlZy5zby42Mi4xLjAKLQotIyBUaGUgbmFtZSBvZiB5b3VyIEMgY29tcGlsZXI6Ci1DQz0gZ2NjCi0KLSMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgotQ0ZMQUdTPSAtTzIgLW1jcHU9aTY4NiAtbWFyY2g9aTM4NiAtSSQoc3JjZGlyKQotIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKLSMgTk9UIHZpYSAtRCBzd2l0Y2hlcyBoZXJlLgotCi0jIFRoZSBleGVjdXRhYmxlIG5hbWUgb2YgTkFTTSBhbmQgaXRzIG9wdGlvbnM6Ci1OQVNNPSBuYXNtCi1OQUZMQUdTPSAkKE5BU01fT0JKRk1UKSAtSSQoc3JjZGlyKS8KLSMgb2JqZWN0IGZpbGUgZm9ybWF0IHNwZWNpZmllciBmb3IgTkFTTQotIyBzZWUganNpbWRleHQuaW5jIGZvciBtb3JlIGRldGFpbHMuCi1OQVNNX09CSkZNVD0gLWZlbGYgLURFTEYKLQotIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKLUxERkxBR1M9IAotCi0jIFRvIGxpbmsgYW55IHNwZWNpYWwgbGlicmFyaWVzLCBhZGQgdGhlIG5lY2Vzc2FyeSAtbCBjb21tYW5kcyBoZXJlLgotTERMSUJTPSAKLQotIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKLSMgbWFuYWdlciBmaWxlLiAgRm9yIFVuaXggdGhpcyBpcyB1c3VhbGx5IGptZW1ub2JzLm8sIGJ1dCB5b3UgbWF5IHdhbnQKLSMgdG8gdXNlIGptZW1hbnNpLm8gb3Igam1lbW5hbWUubyBpZiB5b3UgaGF2ZSBsaW1pdGVkIHN3YXAgc3BhY2UuCi1TWVNERVBNRU09IGptZW1ub2JzLm8KLQotIyBPUy1kZXBlbmRlbnQgU0lNRCBpbnN0cnVjdGlvbiBzdXBwb3J0IGNoZWNrZXIKLSMganNpbWR3MzIubyAoV2luMzIpIC8ganNpbWRkamcubyAoREpHUFAgVi4yKSAvIGpzaW1kZ2NjLm8gKFVuaXgvZ2NjKQotU1lTREVQU0lNRENISz0ganNpbWRnY2MubwotCi0jIG1pc2NlbGxhbmVvdXMgT1MtZGVwZW5kZW50IHN0dWZmCi0jIGxpbmtlcgotTE49ICQoQ0MpCi0jIGZpbGUgZGVsZXRpb24gY29tbWFuZAotUk09IHJtIC1mCi0jIGxpYnJhcnkgKC5hKSBmaWxlIGNyZWF0aW9uIGNvbW1hbmQKLUFSPSBhciByYwotIyBzZWNvbmQgc3RlcCBpbiAuYSBjcmVhdGlvbiAodXNlICJ0b3VjaCIgaWYgbm90IG5lZWRlZCkKLUFSMj0gcmFubGliCi0jIGluc3RhbGxhdGlvbiBwcm9ncmFtCi1JTlNUQUxMPSBpbnN0YWxsIC1jCi1JTlNUQUxMX1BST0dSQU09ICR7SU5TVEFMTH0gLXMKLUlOU1RBTExfU0hBUkVEID0gJHtJTlNUQUxMfQotSU5TVEFMTF9MSUI9ICAke0lOU1RBTEx9IC1tIDY0NAotSU5TVEFMTF9EQVRBPSAke0lOU1RBTEx9IC1tIDY0NAotCi0jIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KLQotCi0jIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgotTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAotICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKLSAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKLSAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAotICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCi0gICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKLSAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCi0gICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKLSMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5Ci1TWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCi0jIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCi1BUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAotICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKLSAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCi1TT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQotIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKLUlOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCi0gICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAotIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcwotRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKLSAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKLSAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZwotTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKLSAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKLSAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKLSAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCi0gICAgICAgIG1ha3Ztcy5vcHQKLUNPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKLSAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCi0gICAgICAgIGpjb25maWcudm1zCi1DT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKLU9USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQotVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKLSAgICAgICAgdGVzdGltZ3AuanBnCi1ESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKLSAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKLSMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1DT01PQkpFQ1RTPSBqY29tYXBpLm8ganV0aWxzLm8gamVycm9yLm8gam1lbW1nci5vICQoU1lTREVQTUVNKSBqc2ltZGNwdS5vIFwKLSAgICAgICAgJChTWVNERVBTSU1EQ0hLKQotIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm8gamNhcGlzdGQubyBqY3RyYW5zLm8gamNwYXJhbS5vIGpkYXRhZHN0Lm8gamNpbml0Lm8gXAotICAgICAgICBqY21hc3Rlci5vIGpjbWFya2VyLm8gamNtYWluY3QubyBqY3ByZXBjdC5vIGpjY29lZmN0Lm8gamNjb2xvci5vIFwKLSAgICAgICAgamNzYW1wbGUubyBqY2h1ZmYubyBqY3BodWZmLm8gamNkY3RtZ3IubyBqY2NvbG1teC5vIGpjY29sc3MyLm8gXAotICAgICAgICBqY3NhbW1teC5vIGpjc2Ftc3MyLm8gamNxbnRpbnQubyBqY3FudGZsdC5vIGpjcW50bW14Lm8gamNxbnQzZG4ubyBcCi0gICAgICAgIGpjcW50czJpLm8gamNxbnRzc2UubyBqY3FudHMyZi5vIGpmZGN0aW50Lm8gamZkY3Rmc3QubyBqZmRjdGZsdC5vIFwKLSAgICAgICAgamZtbXhpbnQubyBqZm1teGZzdC5vIGpmM2RuZmx0Lm8gamZzczJpbnQubyBqZnNzMmZzdC5vIGpmc3NlZmx0Lm8KLSMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotRExJQk9CSkVDVFM9IGpkYXBpbWluLm8gamRhcGlzdGQubyBqZHRyYW5zLm8gamRhdGFzcmMubyBqZG1hc3Rlci5vIFwKLSAgICAgICAgamRpbnB1dC5vIGpkbWFya2VyLm8gamRodWZmLm8gamRwaHVmZi5vIGpkbWFpbmN0Lm8gamRjb2VmY3QubyBcCi0gICAgICAgIGpkcG9zdGN0Lm8gamRkY3RtZ3IubyBqZHNhbXBsZS5vIGpkY29sb3IubyBqcXVhbnQxLm8ganF1YW50Mi5vIFwKLSAgICAgICAgamRtZXJnZS5vIGppZGN0aW50Lm8gamlkY3Rmc3QubyBqaWRjdHJlZC5vIGppZGN0Zmx0Lm8gamltbXhpbnQubyBcCi0gICAgICAgIGppbW14ZnN0Lm8gamltbXhyZWQubyBqaTNkbmZsdC5vIGppc3MyaW50Lm8gamlzczJmc3QubyBqaXNzMnJlZC5vIFwKLSAgICAgICAgamlzc2VmbHQubyBqaXNzMmZsdC5vIGpkc2FtbW14Lm8gamRzYW1zczIubyBqZGNvbG1teC5vIGpkY29sc3MyLm8gXAotICAgICAgICBqZG1lcm1teC5vIGpkbWVyc3MyLm8KLSMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcuYQotTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQotIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5zbwotRExMT0JKRUNUUz0gJChMSUJPQkpFQ1RTOi5vPS5waWMubykKLSMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKLUNPQkpFQ1RTPSBjanBlZy5vIHJkcHBtLm8gcmRnaWYubyByZHRhcmdhLm8gcmRybGUubyByZGJtcC5vIHJkc3dpdGNoLm8gXAotICAgICAgICBjZGpwZWcubwotRE9CSkVDVFM9IGRqcGVnLm8gd3JwcG0ubyB3cmdpZi5vIHdydGFyZ2EubyB3cnJsZS5vIHdyYm1wLm8gcmRjb2xtYXAubyBcCi0gICAgICAgIGNkanBlZy5vCi1UUk9CSkVDVFM9IGpwZWd0cmFuLm8gcmRzd2l0Y2gubyBjZGpwZWcubyB0cmFuc3VwcC5vCi0KLQotYWxsOiBzdGF0aWMgc2hhcmVkIGFwcAotYXBwOiBjanBlZyBkanBlZyBqcGVndHJhbiByZGpwZ2NvbSB3cmpwZ2NvbQotYXBwLXN0YXRpYzogY2pwZWctc3RhdGljIGRqcGVnLXN0YXRpYyBqcGVndHJhbi1zdGF0aWMKLXNoYXJlZDogJChMSUJOQU1FKQotc3RhdGljOiBsaWJqcGVnLmEKLQotbGlianBlZy5hOiAkKExJQk9CSkVDVFMpCi0JJChSTSkgbGlianBlZy5hCi0JJChBUikgbGlianBlZy5hICAkKExJQk9CSkVDVFMpCi0JJChBUjIpIGxpYmpwZWcuYQotCi0kKExJQk5BTUUpOiAkKERMTE9CSkVDVFMpCi0JJChDQykgLXNoYXJlZCAtV2wsLXNvbmFtZSwkKFNPTkFNRSkgLW8gJChMSUJOQU1FKSAkKERMTE9CSkVDVFMpCi0KLSQoU09OQU1FKTogJChMSUJOQU1FKQotCWxuIC1zZiAkKExJQk5BTUUpICQoU09OQU1FKQotCi0kKExOTkFNRSk6ICQoU09OQU1FKQotCWxuIC1zZiAkKExJQk5BTUUpICQoTE5OQU1FKQotCi1janBlZy1zdGF0aWM6ICQoQ09CSkVDVFMpIGxpYmpwZWcuYQotCSQoTE4pICQoTERGTEFHUykgLW8gY2pwZWctc3RhdGljICQoQ09CSkVDVFMpIGxpYmpwZWcuYSAkKExETElCUykKLQotZGpwZWctc3RhdGljOiAkKERPQkpFQ1RTKSBsaWJqcGVnLmEKLQkkKExOKSAkKExERkxBR1MpIC1vIGRqcGVnLXN0YXRpYyAkKERPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCi0KLWpwZWd0cmFuLXN0YXRpYzogJChUUk9CSkVDVFMpIGxpYmpwZWcuYQotCSQoTE4pICQoTERGTEFHUykgLW8ganBlZ3RyYW4tc3RhdGljICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCi0KLWNqcGVnLXNoYXJlZDogJChDT0JKRUNUUykgJChMTk5BTUUpCi0JJChMTikgJChMREZMQUdTKSAtbyBjanBlZy1zaGFyZWQgJChDT0JKRUNUUykgJChMTk5BTUUpICQoTERMSUJTKQotCi1kanBlZy1zaGFyZWQ6ICQoRE9CSkVDVFMpICQoTE5OQU1FKQotCSQoTE4pICQoTERGTEFHUykgLW8gZGpwZWctc2hhcmVkICQoRE9CSkVDVFMpICQoTE5OQU1FKSAkKExETElCUykKLQotanBlZ3RyYW4tc2hhcmVkOiAkKFRST0JKRUNUUykgJChMTk5BTUUpCi0JJChMTikgJChMREZMQUdTKSAtbyBqcGVndHJhbi1zaGFyZWQgJChUUk9CSkVDVFMpICQoTE5OQU1FKSAkKExETElCUykKLQotcmRqcGdjb206IHJkanBnY29tLm8KLQkkKExOKSAkKExERkxBR1MpIC1vIHJkanBnY29tIHJkanBnY29tLm8gJChMRExJQlMpCi0KLXdyanBnY29tOiB3cmpwZ2NvbS5vCi0JJChMTikgJChMREZMQUdTKSAtbyB3cmpwZ2NvbSB3cmpwZ2NvbS5vICQoTERMSUJTKQotCi1janBlZzogY2pwZWctc2hhcmVkCi0JZWNobyAnIyEvYmluL3NoJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gY2pwZWcKLQllY2hvIGV4cG9ydCBMRF9MSUJSQVJZX1BBVEg9YHB3ZGA6JyQkTERfTElCUkFSWV9QQVRIJyA+PiBjanBlZwotCWVjaG8gZXhlYyBgcHdkYC9janBlZy1zaGFyZWQgJyIkJEAiJyAgICAgICAgICAgICAgICAgID4+IGNqcGVnCi0JY2htb2QgK3ggY2pwZWcKLQotZGpwZWc6IGRqcGVnLXNoYXJlZAotCWVjaG8gJyMhL2Jpbi9zaCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IGRqcGVnCi0JZWNobyBleHBvcnQgTERfTElCUkFSWV9QQVRIPWBwd2RgOickJExEX0xJQlJBUllfUEFUSCcgPj4gZGpwZWcKLQllY2hvIGV4ZWMgYHB3ZGAvZGpwZWctc2hhcmVkICciJCRAIicgICAgICAgICAgICAgICAgICA+PiBkanBlZwotCWNobW9kICt4IGRqcGVnCi0KLWpwZWd0cmFuOiBqcGVndHJhbi1zaGFyZWQKLQllY2hvICcjIS9iaW4vc2gnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBqcGVndHJhbgotCWVjaG8gZXhwb3J0IExEX0xJQlJBUllfUEFUSD1gcHdkYDonJCRMRF9MSUJSQVJZX1BBVEgnID4+IGpwZWd0cmFuCi0JZWNobyBleGVjIGBwd2RgL2pwZWd0cmFuLXNoYXJlZCAnIiQkQCInICAgICAgICAgICAgICAgPj4ganBlZ3RyYW4KLQljaG1vZCAreCBqcGVndHJhbgotCi1qY29uZmlnLmg6IGpjb25maWcuZG9jCi0JZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KLQllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KLQlleGl0IDEKLQotY2xlYW46Ci0JJChSTSkgKi5vIGxpYmpwZWcuYSAkKExJQk5BTUUpICQoU09OQU1FKSAkKExOTkFNRSkKLQkkKFJNKSBjanBlZyBkanBlZyBqcGVndHJhbiByZGpwZ2NvbSB3cmpwZ2NvbQotCSQoUk0pIGNqcGVnLXNoYXJlZCBkanBlZy1zaGFyZWQganBlZ3RyYW4tc2hhcmVkCi0JJChSTSkgY2pwZWctc3RhdGljIGRqcGVnLXN0YXRpYyBqcGVndHJhbi1zdGF0aWMKLQkkKFJNKSBjb3JlIHRlc3RvdXQqCi0JJChSTSkganNpbWRjZmcuaW5jCi0KLXRlc3Q6IGNqcGVnIGRqcGVnIGpwZWd0cmFuCi0JJChSTSkgdGVzdG91dCoKLQkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gJChzcmNkaXIpL3Rlc3RvcmlnLmpwZwotCS4vZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAkKHNyY2RpcikvdGVzdG9yaWcuanBnCi0JLi9janBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAkKHNyY2RpcikvdGVzdGltZy5wcG0KLQkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtICQoc3JjZGlyKS90ZXN0cHJvZy5qcGcKLQkuL2NqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyAkKHNyY2RpcikvdGVzdGltZy5wcG0KLQkuL2pwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyAkKHNyY2RpcikvdGVzdHByb2cuanBnCi0JY21wICQoc3JjZGlyKS90ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQotCWNtcCAkKHNyY2RpcikvdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKLQljbXAgJChzcmNkaXIpL3Rlc3RpbWcuanBnIHRlc3RvdXQuanBnCi0JY21wICQoc3JjZGlyKS90ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KLQljbXAgJChzcmNkaXIpL3Rlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKLQljbXAgJChzcmNkaXIpL3Rlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKLQotdGVzdC1zdGF0aWM6IGNqcGVnLXN0YXRpYyBkanBlZy1zdGF0aWMganBlZ3RyYW4tc3RhdGljCi0JJChSTSkgdGVzdG91dCoKLQkuL2RqcGVnLXN0YXRpYyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtICQoc3JjZGlyKS90ZXN0b3JpZy5qcGcKLQkuL2RqcGVnLXN0YXRpYyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlIHRlc3RvdXQuYm1wICQoc3JjZGlyKS90ZXN0b3JpZy5qcGcKLQkuL2NqcGVnLXN0YXRpYyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAkKHNyY2RpcikvdGVzdGltZy5wcG0KLQkuL2RqcGVnLXN0YXRpYyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSAkKHNyY2RpcikvdGVzdHByb2cuanBnCi0JLi9janBlZy1zdGF0aWMgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnICQoc3JjZGlyKS90ZXN0aW1nLnBwbQotCS4vanBlZ3RyYW4tc3RhdGljIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyAkKHNyY2RpcikvdGVzdHByb2cuanBnCi0JY21wICQoc3JjZGlyKS90ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQotCWNtcCAkKHNyY2RpcikvdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKLQljbXAgJChzcmNkaXIpL3Rlc3RpbWcuanBnIHRlc3RvdXQuanBnCi0JY21wICQoc3JjZGlyKS90ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KLQljbXAgJChzcmNkaXIpL3Rlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKLQljbXAgJChzcmNkaXIpL3Rlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKLQotCi1pbnN0YWxsOiBpbnN0YWxsLWxpYiBpbnN0YWxsLWFwcCBpbnN0YWxsLW1hbgotCi1pbnN0YWxsLWFwcC1zdGF0aWM6IGNqcGVnLXN0YXRpYyBkanBlZy1zdGF0aWMganBlZ3RyYW4tc3RhdGljCi0JLUBpZiBbICEgLWQgJChiaW5kaXIpIF07IHRoZW4gbWtkaXIgLXAgJChiaW5kaXIpOyBmaQotCSQoSU5TVEFMTF9QUk9HUkFNKSBjanBlZy1zdGF0aWMgICAgJChiaW5kaXIpLyQoYmlucHJlZml4KWNqcGVnLXN0YXRpYwotCSQoSU5TVEFMTF9QUk9HUkFNKSBkanBlZy1zdGF0aWMgICAgJChiaW5kaXIpLyQoYmlucHJlZml4KWRqcGVnLXN0YXRpYwotCSQoSU5TVEFMTF9QUk9HUkFNKSBqcGVndHJhbi1zdGF0aWMgJChiaW5kaXIpLyQoYmlucHJlZml4KWpwZWd0cmFuLXN0YXRpYwotCi1pbnN0YWxsLWFwcDogaW5zdGFsbC1saWIgY2pwZWctc2hhcmVkIGRqcGVnLXNoYXJlZCBqcGVndHJhbi1zaGFyZWQgcmRqcGdjb20gd3JqcGdjb20KLQktQGlmIFsgISAtZCAkKGJpbmRpcikgXTsgdGhlbiBta2RpciAtcCAkKGJpbmRpcik7IGZpCi0JJChJTlNUQUxMX1BST0dSQU0pIGNqcGVnLXNoYXJlZCAgICAkKGJpbmRpcikvJChiaW5wcmVmaXgpY2pwZWcKLQkkKElOU1RBTExfUFJPR1JBTSkgZGpwZWctc2hhcmVkICAgICQoYmluZGlyKS8kKGJpbnByZWZpeClkanBlZwotCSQoSU5TVEFMTF9QUk9HUkFNKSBqcGVndHJhbi1zaGFyZWQgJChiaW5kaXIpLyQoYmlucHJlZml4KWpwZWd0cmFuCi0JJChJTlNUQUxMX1BST0dSQU0pIHJkanBnY29tICAgICAgICAkKGJpbmRpcikvJChiaW5wcmVmaXgpcmRqcGdjb20KLQkkKElOU1RBTExfUFJPR1JBTSkgd3JqcGdjb20gICAgICAgICQoYmluZGlyKS8kKGJpbnByZWZpeCl3cmpwZ2NvbQotCi1pbnN0YWxsLW1hbjogY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSB3cmpwZ2NvbS4xCi0JLUBpZiBbICEgLWQgJChtYW5kaXIpIF07IHRoZW4gbWtkaXIgLXAgJChtYW5kaXIpOyBmaQotCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvY2pwZWcuMSAgICAkKG1hbmRpcikvJChtYW5wcmVmaXgpY2pwZWcuJChtYW5leHQpCi0JJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9kanBlZy4xICAgICQobWFuZGlyKS8kKG1hbnByZWZpeClkanBlZy4kKG1hbmV4dCkKLQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2pwZWd0cmFuLjEgJChtYW5kaXIpLyQobWFucHJlZml4KWpwZWd0cmFuLiQobWFuZXh0KQotCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvcmRqcGdjb20uMSAkKG1hbmRpcikvJChtYW5wcmVmaXgpcmRqcGdjb20uJChtYW5leHQpCi0JJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS93cmpwZ2NvbS4xICQobWFuZGlyKS8kKG1hbnByZWZpeCl3cmpwZ2NvbS4kKG1hbmV4dCkKLQotaW5zdGFsbC1saWI6IGluc3RhbGwtaGVhZGVycyBsaWJqcGVnLmEgJChMSUJOQU1FKQotCS1AaWYgWyAhIC1kICQobGliZGlyKSBdOyB0aGVuIG1rZGlyIC1wICQobGliZGlyKTsgZmkKLQkkKElOU1RBTExfTElCKSAgICBsaWJqcGVnLmEgICQobGliZGlyKS9saWJqcGVnLmEKLQkkKElOU1RBTExfU0hBUkVEKSAkKExJQk5BTUUpICQobGliZGlyKS8kKExJQk5BTUUpCi0JKGNkICQobGliZGlyKTsgbG4gLXNmICQoTElCTkFNRSkgJChTT05BTUUpOyBsbiAtc2YgJChMSUJOQU1FKSAkKExOTkFNRSkpCi0KLWluc3RhbGwtaGVhZGVyczogamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi0JLUBpZiBbICEgLWQgJChpbmNsdWRlZGlyKSBdOyB0aGVuIG1rZGlyIC1wICQoaW5jbHVkZWRpcik7IGZpCi0JJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9qY29uZmlnLmggICQoaW5jbHVkZWRpcikvamNvbmZpZy5oCi0JJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9qcGVnbGliLmggICQoaW5jbHVkZWRpcikvanBlZ2xpYi5oCi0JJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9qbW9yZWNmZy5oICQoaW5jbHVkZWRpcikvam1vcmVjZmcuaAotCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvamVycm9yLmggICAkKGluY2x1ZGVkaXIpL2plcnJvci5oCi0KLXVuaW5zdGFsbDogdW5pbnN0YWxsLWxpYiB1bmluc3RhbGwtYXBwIHVuaW5zdGFsbC1tYW4KLQotdW5pbnN0YWxsLWFwcC1zdGF0aWM6Ci0JJChSTSkgJChiaW5kaXIpLyQoYmlucHJlZml4KWNqcGVnLXN0YXRpYwotCSQoUk0pICQoYmluZGlyKS8kKGJpbnByZWZpeClkanBlZy1zdGF0aWMKLQkkKFJNKSAkKGJpbmRpcikvJChiaW5wcmVmaXgpanBlZ3RyYW4tc3RhdGljCi0KLXVuaW5zdGFsbC1hcHA6IHVuaW5zdGFsbC1saWIKLQkkKFJNKSAkKGJpbmRpcikvJChiaW5wcmVmaXgpY2pwZWcKLQkkKFJNKSAkKGJpbmRpcikvJChiaW5wcmVmaXgpZGpwZWcKLQkkKFJNKSAkKGJpbmRpcikvJChiaW5wcmVmaXgpanBlZ3RyYW4KLQkkKFJNKSAkKGJpbmRpcikvJChiaW5wcmVmaXgpcmRqcGdjb20KLQkkKFJNKSAkKGJpbmRpcikvJChiaW5wcmVmaXgpd3JqcGdjb20KLQotdW5pbnN0YWxsLW1hbjoKLQkkKFJNKSAkKG1hbmRpcikvJChtYW5wcmVmaXgpY2pwZWcuJChtYW5leHQpCi0JJChSTSkgJChtYW5kaXIpLyQobWFucHJlZml4KWRqcGVnLiQobWFuZXh0KQotCSQoUk0pICQobWFuZGlyKS8kKG1hbnByZWZpeClqcGVndHJhbi4kKG1hbmV4dCkKLQkkKFJNKSAkKG1hbmRpcikvJChtYW5wcmVmaXgpcmRqcGdjb20uJChtYW5leHQpCi0JJChSTSkgJChtYW5kaXIpLyQobWFucHJlZml4KXdyanBnY29tLiQobWFuZXh0KQotCi11bmluc3RhbGwtbGliOiB1bmluc3RhbGwtaGVhZGVycwotCSQoUk0pICQobGliZGlyKS9saWJqcGVnLmEKLQkkKFJNKSAkKGxpYmRpcikvJChMSUJOQU1FKQotCSQoUk0pICQobGliZGlyKS8kKFNPTkFNRSkKLQkkKFJNKSAkKGxpYmRpcikvJChMTk5BTUUpCi0KLXVuaW5zdGFsbC1oZWFkZXJzOgotCSQoUk0pICQoaW5jbHVkZWRpcikvamNvbmZpZy5oCi0JJChSTSkgJChpbmNsdWRlZGlyKS9qcGVnbGliLmgKLQkkKFJNKSAkKGluY2x1ZGVkaXIpL2ptb3JlY2ZnLmgKLQkkKFJNKSAkKGluY2x1ZGVkaXIpL2plcnJvci5oCi0KLQotanNpbWRjZmcuaW5jOiBtYWtlY2ZnLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi0JJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gbWFrZWNmZyAkKHNyY2RpcikvbWFrZWNmZy5jICQoTERMSUJTKQotCS4vbWFrZWNmZyA+IGpzaW1kY2ZnLmluYwotCSQoUk0pIC4vbWFrZWNmZwotCi0uU1VGRklYRVM6IC5jIC5hc20gLm8gLnBpYy5vCi0KLSUucGljLm8gOiAlLmMKLQkkKENDKSAkKENGTEFHUykgLWZQSUMgLWMgLW8gJEAgJDwKLQotJS5waWMubyA6ICUuYXNtCi0JJChOQVNNKSAkKE5BRkxBR1MpIC1EUElDIC1vICRAICQ8Ci0KLSUubyA6ICUuYXNtCi0JJChOQVNNKSAkKE5BRkxBR1MpIC1vICRAICQ8Ci0KLWpzaW1kY3B1Lm8ganNpbWRjcHUucGljLm86IGpzaW1kY3B1LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jCi1qc2ltZHczMi5vIGpzaW1kdzMyLnBpYy5vOiBqc2ltZHczMi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYwotanNpbWRkamcubyBqc2ltZGRqZy5waWMubzoganNpbWRkamcuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMKLWpjY29sbW14Lm8gamNjb2xtbXgucGljLm86IGpjY29sbW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamNjb2xzczIubyBqY2NvbHNzMi5waWMubzogamNjb2xzczIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qY3NhbW1teC5vIGpjc2FtbW14LnBpYy5vOiBqY3NhbW1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpjc2Ftc3MyLm8gamNzYW1zczIucGljLm86IGpjc2Ftc3MyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRjb2xtbXgubyBqZGNvbG1teC5waWMubzogamRjb2xtbXguYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZGNvbHNzMi5vIGpkY29sc3MyLnBpYy5vOiBqZGNvbHNzMi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkbWVybW14Lm8gamRtZXJtbXgucGljLm86IGpkbWVybW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRtZXJzczIubyBqZG1lcnNzMi5waWMubzogamRtZXJzczIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZHNhbW1teC5vIGpkc2FtbW14LnBpYy5vOiBqZHNhbW1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkc2Ftc3MyLm8gamRzYW1zczIucGljLm86IGpkc2Ftc3MyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamNxbnRpbnQubyBqY3FudGludC5waWMubzogamNxbnRpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpjcW50Zmx0Lm8gamNxbnRmbHQucGljLm86IGpjcW50Zmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudG1teC5vIGpjcW50bW14LnBpYy5vOiBqY3FudG1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnQzZG4ubyBqY3FudDNkbi5waWMubzogamNxbnQzZG4uYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpjcW50czJpLm8gamNxbnRzMmkucGljLm86IGpjcW50czJpLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudHNzZS5vIGpjcW50c3NlLnBpYy5vOiBqY3FudHNzZS5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnRzMmYubyBqY3FudHMyZi5waWMubzogamNxbnRzMmYuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmZGN0aW50Lm8gamZkY3RpbnQucGljLm86IGpmZGN0aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZmRjdGZzdC5vIGpmZGN0ZnN0LnBpYy5vOiBqZmRjdGZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZkY3RmbHQubyBqZmRjdGZsdC5waWMubzogamZkY3RmbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmbW14aW50Lm8gamZtbXhpbnQucGljLm86IGpmbW14aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZm1teGZzdC5vIGpmbW14ZnN0LnBpYy5vOiBqZm1teGZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamYzZG5mbHQubyBqZjNkbmZsdC5waWMubzogamYzZG5mbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmc3MyaW50Lm8gamZzczJpbnQucGljLm86IGpmc3MyaW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZnNzMmZzdC5vIGpmc3MyZnN0LnBpYy5vOiBqZnNzMmZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZzc2VmbHQubyBqZnNzZWZsdC5waWMubzogamZzc2VmbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppZGN0aW50Lm8gamlkY3RpbnQucGljLm86IGppZGN0aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaWRjdGZzdC5vIGppZGN0ZnN0LnBpYy5vOiBqaWRjdGZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlkY3RyZWQubyBqaWRjdHJlZC5waWMubzogamlkY3RyZWQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppZGN0Zmx0Lm8gamlkY3RmbHQucGljLm86IGppZGN0Zmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaW1teGludC5vIGppbW14aW50LnBpYy5vOiBqaW1teGludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamltbXhmc3QubyBqaW1teGZzdC5waWMubzogamltbXhmc3QuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppbW14cmVkLm8gamltbXhyZWQucGljLm86IGppbW14cmVkLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaTNkbmZsdC5vIGppM2RuZmx0LnBpYy5vOiBqaTNkbmZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlzczJpbnQubyBqaXNzMmludC5waWMubzogamlzczJpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppc3MyZnN0Lm8gamlzczJmc3QucGljLm86IGppc3MyZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzMnJlZC5vIGppc3MycmVkLnBpYy5vOiBqaXNzMnJlZC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlzc2VmbHQubyBqaXNzZWZsdC5waWMubzogamlzc2VmbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppc3MyZmx0Lm8gamlzczJmbHQucGljLm86IGppc3MyZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi0KLWpzaW1kZ2NjLm8ganNpbWRnY2MucGljLm86IGpzaW1kZ2NjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLQotamNhcGltaW4ubyBqY2FwaW1pbi5waWMubzogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjYXBpc3RkLm8gamNhcGlzdGQucGljLm86IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvZWZjdC5vIGpjY29lZmN0LnBpYy5vOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2xvci5vIGpjY29sb3IucGljLm86IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamNkY3RtZ3IubyBqY2RjdG1nci5waWMubzogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qY2h1ZmYubyBqY2h1ZmYucGljLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNpbml0Lm8gamNpbml0LnBpYy5vOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFpbmN0Lm8gamNtYWluY3QucGljLm86IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hcmtlci5vIGpjbWFya2VyLnBpYy5vOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXN0ZXIubyBqY21hc3Rlci5waWMubzogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjb21hcGkubyBqY29tYXBpLnBpYy5vOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BhcmFtLm8gamNwYXJhbS5waWMubzogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwaHVmZi5vIGpjcGh1ZmYucGljLm86IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjcHJlcGN0Lm8gamNwcmVwY3QucGljLm86IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3NhbXBsZS5vIGpjc2FtcGxlLnBpYy5vOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY29sc2FtcC5oCi1qY3RyYW5zLm8gamN0cmFucy5waWMubzogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGltaW4ubyBqZGFwaW1pbi5waWMubzogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpc3RkLm8gamRhcGlzdGQucGljLm86IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGF0YWRzdC5vIGpkYXRhZHN0LnBpYy5vOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGF0YXNyYy5vIGpkYXRhc3JjLnBpYy5vOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGNvZWZjdC5vIGpkY29lZmN0LnBpYy5vOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRjb2xvci5vIGpkY29sb3IucGljLm86IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamRkY3RtZ3IubyBqZGRjdG1nci5waWMubzogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZGh1ZmYubyBqZGh1ZmYucGljLm86IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRpbnB1dC5vIGpkaW5wdXQucGljLm86IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFpbmN0Lm8gamRtYWluY3QucGljLm86IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hcmtlci5vIGpkbWFya2VyLnBpYy5vOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXN0ZXIubyBqZG1hc3Rlci5waWMubzogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWVyZ2UubyBqZG1lcmdlLnBpYy5vOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjb2xzYW1wLmgKLWpkcGh1ZmYubyBqZHBodWZmLnBpYy5vOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZHBvc3RjdC5vIGpkcG9zdGN0LnBpYy5vOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRzYW1wbGUubyBqZHNhbXBsZS5waWMubzogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamR0cmFucy5vIGpkdHJhbnMucGljLm86IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWplcnJvci5vIGplcnJvci5waWMubzogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAotIyBqZmRjdGZsdC5vIGpmZGN0Zmx0LnBpYy5vOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamZkY3Rmc3QubyBqZmRjdGZzdC5waWMubzogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGpmZGN0aW50Lm8gamZkY3RpbnQucGljLm86IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotIyBqaWRjdGZsdC5vIGppZGN0Zmx0LnBpYy5vOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamlkY3Rmc3QubyBqaWRjdGZzdC5waWMubzogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGppZGN0aW50Lm8gamlkY3RpbnQucGljLm86IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotIyBqaWRjdHJlZC5vIGppZGN0cmVkLnBpYy5vOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpxdWFudDEubyBqcXVhbnQxLnBpYy5vOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qcXVhbnQyLm8ganF1YW50Mi5waWMubzoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanV0aWxzLm8ganV0aWxzLnBpYy5vOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWptZW1tZ3IubyBqbWVtbWdyLnBpYy5vOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWFuc2kubyBqbWVtYW5zaS5waWMubzogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbmFtZS5vIGptZW1uYW1lLnBpYy5vOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1ub2JzLm8gam1lbW5vYnMucGljLm86IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWRvcy5vIGptZW1kb3MucGljLm86IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbWFjLm8gam1lbW1hYy5waWMubzogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWNqcGVnLm86IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWRqcGVnLm86IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWpwZWd0cmFuLm86IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAotcmRqcGdjb20ubzogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotd3JqcGdjb20ubzogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotY2RqcGVnLm86IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRjb2xtYXAubzogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkc3dpdGNoLm86IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi10cmFuc3VwcC5vOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCi1yZHBwbS5vOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JwcG0ubzogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkZ2lmLm86IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmdpZi5vOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmR0YXJnYS5vOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnRhcmdhLm86IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkYm1wLm86IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmJtcC5vOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRybGUubzogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycmxlLm86IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS9tYWtlZmlsZS5tZ3cgYi9tYWtlZmlsZS5tZ3cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZjA5ZTAuLjAwMDAwMDAKLS0tIGEvbWFrZWZpbGUubWd3CisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotIyBNb2RpZmllZCBmb3IgeDg2IFNJTUQgZXh0ZW5zaW9uCi0KLSMgVGhpcyBtYWtlZmlsZSBpcyBmb3IgTWluR1cuCi0KLSMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIm1ha2UiICEhCi0KLXNyY2RpciA9IC4KLVZQQVRIICA9ICQoc3JjZGlyKQotCi0jIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKLUNDPSBnY2MKLQotIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6Ci0jIEZvciBnY2MgMy40LngKLUNGTEFHUz0gLU8yIC1tdHVuZT1wZW50aXVtMiAtbWFyY2g9aTM4NiAtZm9taXQtZnJhbWUtcG9pbnRlciAtZndlYiBcCi0gICAgICAgIC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIgLW1uby1hbGlnbi1zdHJpbmdvcHMgLUkkKHNyY2RpcikKLSMgRm9yIGdjYyAzLjMueAotI0NGTEFHUz0gLU8yIC1tY3B1PXBlbnRpdW0yIC1tYXJjaD1pMzg2IC1mb21pdC1mcmFtZS1wb2ludGVyIFwKLSMgICAgICAgIC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIgLW1uby1hbGlnbi1zdHJpbmdvcHMgLUkkKHNyY2RpcikKLSMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCi0jIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KLQotIyBUaGUgZXhlY3V0YWJsZSBuYW1lIG9mIE5BU00gYW5kIGl0cyBvcHRpb25zOgotTkFTTT0gbmFzbXcKLU5BRkxBR1M9ICQoTkFTTV9PQkpGTVQpIC1JJChzcmNkaXIpLwotIyBvYmplY3QgZmlsZSBmb3JtYXQgc3BlY2lmaWVyIGZvciBOQVNNCi0jIHNlZSBqc2ltZGV4dC5pbmMgZm9yIG1vcmUgZGV0YWlscy4KLU5BU01fT0JKRk1UPSAtZndpbjMyIC1EV0lOMzIKLQotIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKLUxERkxBR1M9IC1zCi0KLSMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IC1sIGNvbW1hbmRzIGhlcmUuCi1MRExJQlM9IAotCi0jIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQotIyBtYW5hZ2VyIGZpbGUuCi1TWVNERVBNRU09IGptZW1ub2JzLm8KLQotIyBPUy1kZXBlbmRlbnQgU0lNRCBpbnN0cnVjdGlvbiBzdXBwb3J0IGNoZWNrZXIKLSMganNpbWR3MzIubyAoV2luMzIpIC8ganNpbWRkamcubyAoREpHUFAgVi4yKSAvIGpzaW1kZ2NjLm8gKFVuaXgvZ2NjKQotU1lTREVQU0lNRENISz0ganNpbWR3MzIubwotCi0jIG1pc2NlbGxhbmVvdXMgT1MtZGVwZW5kZW50IHN0dWZmCi0jIGxpbmtlcgotTE49ICQoQ0MpCi0jIGZpbGUgZGVsZXRpb24gY29tbWFuZAotUk09IGRlbAotIyBsaWJyYXJ5ICguYSkgZmlsZSBjcmVhdGlvbiBjb21tYW5kCi1BUj0gYXIgcmMKLSMgc2Vjb25kIHN0ZXAgaW4gLmEgY3JlYXRpb24gKHVzZSAidG91Y2giIGlmIG5vdCBuZWVkZWQpCi1BUjI9IHJhbmxpYgotCi0jIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KLQotCi0jIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgotTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAotICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKLSAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKLSAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAotICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCi0gICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKLSAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCi0gICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKLSMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5Ci1TWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCi0jIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCi1BUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAotICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKLSAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCi1TT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQotIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKLUlOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCi0gICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAotIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcwotRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKLSAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKLSAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZwotTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKLSAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKLSAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKLSAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCi0gICAgICAgIG1ha3Ztcy5vcHQKLUNPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKLSAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCi0gICAgICAgIGpjb25maWcudm1zCi1DT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKLU9USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQotVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKLSAgICAgICAgdGVzdGltZ3AuanBnCi1ESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKLSAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKLSMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1DT01PQkpFQ1RTPSBqY29tYXBpLm8ganV0aWxzLm8gamVycm9yLm8gam1lbW1nci5vICQoU1lTREVQTUVNKSBqc2ltZGNwdS5vIFwKLSAgICAgICAgJChTWVNERVBTSU1EQ0hLKQotIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm8gamNhcGlzdGQubyBqY3RyYW5zLm8gamNwYXJhbS5vIGpkYXRhZHN0Lm8gamNpbml0Lm8gXAotICAgICAgICBqY21hc3Rlci5vIGpjbWFya2VyLm8gamNtYWluY3QubyBqY3ByZXBjdC5vIGpjY29lZmN0Lm8gamNjb2xvci5vIFwKLSAgICAgICAgamNzYW1wbGUubyBqY2h1ZmYubyBqY3BodWZmLm8gamNkY3RtZ3IubyBqY2NvbG1teC5vIGpjY29sc3MyLm8gXAotICAgICAgICBqY3NhbW1teC5vIGpjc2Ftc3MyLm8gamNxbnRpbnQubyBqY3FudGZsdC5vIGpjcW50bW14Lm8gamNxbnQzZG4ubyBcCi0gICAgICAgIGpjcW50czJpLm8gamNxbnRzc2UubyBqY3FudHMyZi5vIGpmZGN0aW50Lm8gamZkY3Rmc3QubyBqZmRjdGZsdC5vIFwKLSAgICAgICAgamZtbXhpbnQubyBqZm1teGZzdC5vIGpmM2RuZmx0Lm8gamZzczJpbnQubyBqZnNzMmZzdC5vIGpmc3NlZmx0Lm8KLSMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotRExJQk9CSkVDVFM9IGpkYXBpbWluLm8gamRhcGlzdGQubyBqZHRyYW5zLm8gamRhdGFzcmMubyBqZG1hc3Rlci5vIFwKLSAgICAgICAgamRpbnB1dC5vIGpkbWFya2VyLm8gamRodWZmLm8gamRwaHVmZi5vIGpkbWFpbmN0Lm8gamRjb2VmY3QubyBcCi0gICAgICAgIGpkcG9zdGN0Lm8gamRkY3RtZ3IubyBqZHNhbXBsZS5vIGpkY29sb3IubyBqcXVhbnQxLm8ganF1YW50Mi5vIFwKLSAgICAgICAgamRtZXJnZS5vIGppZGN0aW50Lm8gamlkY3Rmc3QubyBqaWRjdHJlZC5vIGppZGN0Zmx0Lm8gamltbXhpbnQubyBcCi0gICAgICAgIGppbW14ZnN0Lm8gamltbXhyZWQubyBqaTNkbmZsdC5vIGppc3MyaW50Lm8gamlzczJmc3QubyBqaXNzMnJlZC5vIFwKLSAgICAgICAgamlzc2VmbHQubyBqaXNzMmZsdC5vIGpkc2FtbW14Lm8gamRzYW1zczIubyBqZGNvbG1teC5vIGpkY29sc3MyLm8gXAotICAgICAgICBqZG1lcm1teC5vIGpkbWVyc3MyLm8KLSMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcuYQotTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQotIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQotQ09CSkVDVFM9IGNqcGVnLm8gcmRwcG0ubyByZGdpZi5vIHJkdGFyZ2EubyByZHJsZS5vIHJkYm1wLm8gcmRzd2l0Y2gubyBcCi0gICAgICAgIGNkanBlZy5vCi1ET0JKRUNUUz0gZGpwZWcubyB3cnBwbS5vIHdyZ2lmLm8gd3J0YXJnYS5vIHdycmxlLm8gd3JibXAubyByZGNvbG1hcC5vIFwKLSAgICAgICAgY2RqcGVnLm8KLVRST0JKRUNUUz0ganBlZ3RyYW4ubyByZHN3aXRjaC5vIGNkanBlZy5vIHRyYW5zdXBwLm8KLQotCi1hbGw6IGxpYmpwZWcuYSBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZSByZGpwZ2NvbS5leGUgd3JqcGdjb20uZXhlCi0KLWxpYmpwZWcuYTogJChMSUJPQkpFQ1RTKQotCS0kKFJNKSBsaWJqcGVnLmEKLQkkKEFSKSAgbGlianBlZy5hICAkKExJQk9CSkVDVFMpCi0JJChBUjIpIGxpYmpwZWcuYQotCi1janBlZy5leGU6ICQoQ09CSkVDVFMpIGxpYmpwZWcuYQotCSQoTE4pICQoTERGTEFHUykgLW8gY2pwZWcuZXhlICQoQ09CSkVDVFMpIGxpYmpwZWcuYSAkKExETElCUykKLQotZGpwZWcuZXhlOiAkKERPQkpFQ1RTKSBsaWJqcGVnLmEKLQkkKExOKSAkKExERkxBR1MpIC1vIGRqcGVnLmV4ZSAkKERPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCi0KLWpwZWd0cmFuLmV4ZTogJChUUk9CSkVDVFMpIGxpYmpwZWcuYQotCSQoTE4pICQoTERGTEFHUykgLW8ganBlZ3RyYW4uZXhlICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCi0KLXJkanBnY29tLmV4ZTogcmRqcGdjb20ubwotCSQoTE4pICQoTERGTEFHUykgLW8gcmRqcGdjb20uZXhlIHJkanBnY29tLm8gJChMRExJQlMpCi0KLXdyanBnY29tLmV4ZTogd3JqcGdjb20ubwotCSQoTE4pICQoTERGTEFHUykgLW8gd3JqcGdjb20uZXhlIHdyanBnY29tLm8gJChMRExJQlMpCi0KLWpjb25maWcuaDogamNvbmZpZy5kb2MKLQllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgotCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgotCWV4aXQgMQotCi1jbGVhbjoKLQktJChSTSkgKi5vCi0JLSQoUk0pIGNqcGVnLmV4ZQotCS0kKFJNKSBkanBlZy5leGUKLQktJChSTSkganBlZ3RyYW4uZXhlCi0JLSQoUk0pIHJkanBnY29tLmV4ZQotCS0kKFJNKSB3cmpwZ2NvbS5leGUKLQktJChSTSkganNpbWRjZmcuaW5jCi0JLSQoUk0pIGxpYmpwZWcuYQotCS0kKFJNKSB0ZXN0b3V0Ki4qCi0KLXRlc3Q6IGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlCi0JLSQoUk0pIHRlc3RvdXQqLioKLQkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gJChzcmNkaXIpXHRlc3RvcmlnLmpwZwotCS4vZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAkKHNyY2RpcilcdGVzdG9yaWcuanBnCi0JLi9janBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAkKHNyY2RpcilcdGVzdGltZy5wcG0KLQkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtICQoc3JjZGlyKVx0ZXN0cHJvZy5qcGcKLQkuL2NqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyAkKHNyY2RpcilcdGVzdGltZy5wcG0KLQkuL2pwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyAkKHNyY2RpcilcdGVzdHByb2cuanBnCi0JZmMgL2IgJChzcmNkaXIpXHRlc3RpbWcucHBtIHRlc3RvdXQucHBtCi0JZmMgL2IgJChzcmNkaXIpXHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCi0JZmMgL2IgJChzcmNkaXIpXHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCi0JZmMgL2IgJChzcmNkaXIpXHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQotCWZjIC9iICQoc3JjZGlyKVx0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCi0JZmMgL2IgJChzcmNkaXIpXHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKLQotCi1qc2ltZGNmZy5pbmM6IG1ha2VjZmcuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLQkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyBtYWtlY2ZnLmV4ZSAkKHNyY2RpcikvbWFrZWNmZy5jICQoTERMSUJTKQotCS5cbWFrZWNmZy5leGUgPiBqc2ltZGNmZy5pbmMKLQkkKFJNKSBtYWtlY2ZnLmV4ZQotCi0lLm8gOiAlLmFzbQotCSQoTkFTTSkgJChOQUZMQUdTKSAtbyAkQCAkPAotCi1qc2ltZGNwdS5vOiBqc2ltZGNwdS5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYwotanNpbWR3MzIubzoganNpbWR3MzIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMKLWpzaW1kZGpnLm86IGpzaW1kZGpnLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jCi1qY2NvbG1teC5vOiBqY2NvbG1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpjY29sc3MyLm86IGpjY29sc3MyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamNzYW1tbXgubzogamNzYW1tbXguYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qY3NhbXNzMi5vOiBqY3NhbXNzMi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkY29sbW14Lm86IGpkY29sbW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRjb2xzczIubzogamRjb2xzczIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZG1lcm1teC5vOiBqZG1lcm1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkbWVyc3MyLm86IGpkbWVyc3MyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRzYW1tbXgubzogamRzYW1tbXguYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZHNhbXNzMi5vOiBqZHNhbXNzMi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpjcW50aW50Lm86IGpjcW50aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudGZsdC5vOiBqY3FudGZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnRtbXgubzogamNxbnRtbXguYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpjcW50M2RuLm86IGpjcW50M2RuLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudHMyaS5vOiBqY3FudHMyaS5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnRzc2UubzogamNxbnRzc2UuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpjcW50czJmLm86IGpjcW50czJmLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZmRjdGludC5vOiBqZmRjdGludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZkY3Rmc3QubzogamZkY3Rmc3QuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmZGN0Zmx0Lm86IGpmZGN0Zmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZm1teGludC5vOiBqZm1teGludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZtbXhmc3QubzogamZtbXhmc3QuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmM2RuZmx0Lm86IGpmM2RuZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZnNzMmludC5vOiBqZnNzMmludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZzczJmc3QubzogamZzczJmc3QuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmc3NlZmx0Lm86IGpmc3NlZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaWRjdGludC5vOiBqaWRjdGludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlkY3Rmc3QubzogamlkY3Rmc3QuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppZGN0cmVkLm86IGppZGN0cmVkLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaWRjdGZsdC5vOiBqaWRjdGZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamltbXhpbnQubzogamltbXhpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppbW14ZnN0Lm86IGppbW14ZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaW1teHJlZC5vOiBqaW1teHJlZC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamkzZG5mbHQubzogamkzZG5mbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppc3MyaW50Lm86IGppc3MyaW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzMmZzdC5vOiBqaXNzMmZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlzczJyZWQubzogamlzczJyZWQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppc3NlZmx0Lm86IGppc3NlZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzMmZsdC5vOiBqaXNzMmZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotCi1qc2ltZGdjYy5vOiBqc2ltZGdjYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi0KLWpjYXBpbWluLm86IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2FwaXN0ZC5vOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2VmY3QubzogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29sb3IubzogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY29sc2FtcC5oCi1qY2RjdG1nci5vOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpjaHVmZi5vOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjaW5pdC5vOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFpbmN0Lm86IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hcmtlci5vOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXN0ZXIubzogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjb21hcGkubzogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwYXJhbS5vOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BodWZmLm86IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjcHJlcGN0Lm86IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3NhbXBsZS5vOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY29sc2FtcC5oCi1qY3RyYW5zLm86IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpbWluLm86IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaXN0ZC5vOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhdGFkc3QubzogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRhdGFzcmMubzogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRjb2VmY3QubzogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkY29sb3IubzogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY29sc2FtcC5oCi1qZGRjdG1nci5vOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpkaHVmZi5vOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkaW5wdXQubzogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYWluY3QubzogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFya2VyLm86IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hc3Rlci5vOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtZXJnZS5vOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjb2xzYW1wLmgKLWpkcGh1ZmYubzogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRwb3N0Y3QubzogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkc2FtcGxlLm86IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjb2xzYW1wLmgKLWpkdHJhbnMubzogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamVycm9yLm86IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKLSMgamZkY3RmbHQubzogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGpmZGN0ZnN0Lm86IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotIyBqZmRjdGludC5vOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamlkY3RmbHQubzogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGppZGN0ZnN0Lm86IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotIyBqaWRjdGludC5vOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamlkY3RyZWQubzogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qcXVhbnQxLm86IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpxdWFudDIubzoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanV0aWxzLm86IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotam1lbW1nci5vOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWFuc2kubzogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbmFtZS5vOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1ub2JzLm86IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWRvcy5vOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW1hYy5vOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotY2pwZWcubzogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotZGpwZWcubzogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotanBlZ3RyYW4ubzoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCi1yZGpwZ2NvbS5vOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi13cmpwZ2NvbS5vOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi1jZGpwZWcubzogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGNvbG1hcC5vOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRzd2l0Y2gubzogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXRyYW5zdXBwLm86IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKLXJkcHBtLm86IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnBwbS5vOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRnaWYubzogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyZ2lmLm86IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHRhcmdhLm86IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdydGFyZ2Eubzogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRibXAubzogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyYm1wLm86IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHJsZS5vOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JybGUubzogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKZGlmZiAtLWdpdCBhL21ha2VmaWxlLm1nd2RsbCBiL21ha2VmaWxlLm1nd2RsbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhM2U2OS4uMDAwMDAwMAotLS0gYS9tYWtlZmlsZS5tZ3dkbGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCi0jIE1vZGlmaWVkIGZvciB4ODYgU0lNRCBleHRlbnNpb24KLQotIyBUaGlzIG1ha2VmaWxlIGlzIGZvciBNaW5HVy4KLSMgSXQgYnVpbGRzIHRoZSBJSkcgbGlicmFyeSBhcyBhIGR5bmFtaWNhbGx5IGxpbmthYmxlIGxpYnJhcnkgKC5ETEwpLAotIyBhbmQgYnVpbGRzIHRoZSBzYW1wbGUgYXBwbGljYXRpb25zIHdoaWNoIGFyZSBsaW5rZWQgYWdhaW5zdCB0aGUgRExMLgotCi0jIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQotCi1zcmNkaXIgPSAuCi1WUEFUSCAgPSAkKHNyY2RpcikKLQotIyBUaGUgbmFtZSBvZiB5b3VyIEMgY29tcGlsZXI6Ci1DQz0gZ2NjCi0KLSMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgotIyBGb3IgZ2NjIDMuNC54Ci1DRkxBR1M9IC1PMiAtbXR1bmU9cGVudGl1bTIgLW1hcmNoPWkzODYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZ3ZWIgXAotICAgICAgICAtbXByZWZlcnJlZC1zdGFjay1ib3VuZGFyeT0yIC1tbm8tYWxpZ24tc3RyaW5nb3BzIC1JJChzcmNkaXIpCi0jIEZvciBnY2MgMy4zLngKLSNDRkxBR1M9IC1PMiAtbWNwdT1wZW50aXVtMiAtbWFyY2g9aTM4NiAtZm9taXQtZnJhbWUtcG9pbnRlciBcCi0jICAgICAgICAtbXByZWZlcnJlZC1zdGFjay1ib3VuZGFyeT0yIC1tbm8tYWxpZ24tc3RyaW5nb3BzIC1JJChzcmNkaXIpCi0jIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAotIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCi0KLSMgVGhlIGV4ZWN1dGFibGUgbmFtZSBvZiBOQVNNIGFuZCBpdHMgb3B0aW9uczoKLU5BU009IG5hc213Ci1OQUZMQUdTPSAkKE5BU01fT0JKRk1UKSAtSSQoc3JjZGlyKS8KLSMgb2JqZWN0IGZpbGUgZm9ybWF0IHNwZWNpZmllciBmb3IgTkFTTQotIyBzZWUganNpbWRleHQuaW5jIGZvciBtb3JlIGRldGFpbHMuCi1OQVNNX09CSkZNVD0gLWZ3aW4zMiAtRFdJTjMyCi0KLSMgTGluay10aW1lIGNjIG9wdGlvbnM6Ci1MREZMQUdTPSAtcwotTERGTEFHU19ETEw9ICQoTERGTEFHUykgLXNoYXJlZAotCi0jIFRvIGxpbmsgYW55IHNwZWNpYWwgbGlicmFyaWVzLCBhZGQgdGhlIG5lY2Vzc2FyeSAtbCBjb21tYW5kcyBoZXJlLgotTERMSUJTPSAKLQotIyBETEwgdG8gYnVpbGQKLURMTE5BTUUgPSBqcGVnNjIuZGxsCi0jIGltcG9ydCBsaWJyYXJ5Ci1MSUJOQU1FID0gbGlianBlZy5kbGwuYQotCi0jIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQotIyBtYW5hZ2VyIGZpbGUuCi1TWVNERVBNRU09IGptZW1ub2JzLm8KLQotIyBPUy1kZXBlbmRlbnQgU0lNRCBpbnN0cnVjdGlvbiBzdXBwb3J0IGNoZWNrZXIKLSMganNpbWR3MzIubyAoV2luMzIpIC8ganNpbWRkamcubyAoREpHUFAgVi4yKSAvIGpzaW1kZ2NjLm8gKFVuaXgvZ2NjKQotU1lTREVQU0lNRENISz0ganNpbWR3MzIubwotCi0jIG1pc2NlbGxhbmVvdXMgT1MtZGVwZW5kZW50IHN0dWZmCi0jIGxpbmtlcgotTE49ICQoQ0MpCi0jIGZpbGUgZGVsZXRpb24gY29tbWFuZAotUk09IGRlbAotIyBsaWJyYXJ5ICguYSkgZmlsZSBjcmVhdGlvbiBjb21tYW5kCi1BUj0gYXIgcmMKLSMgc2Vjb25kIHN0ZXAgaW4gLmEgY3JlYXRpb24gKHVzZSAidG91Y2giIGlmIG5vdCBuZWVkZWQpCi1BUjI9IHJhbmxpYgotCi0jIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KLQotCi0jIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgotTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAotICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKLSAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKLSAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAotICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCi0gICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKLSAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCi0gICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKLSMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5Ci1TWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCi0jIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCi1BUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAotICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKLSAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCi1TT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQotIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKLUlOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCi0gICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAotIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcwotRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKLSAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKLSAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZwotTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKLSAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKLSAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKLSAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCi0gICAgICAgIG1ha3Ztcy5vcHQKLUNPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKLSAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCi0gICAgICAgIGpjb25maWcudm1zCi1DT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKLU9USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQotVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKLSAgICAgICAgdGVzdGltZ3AuanBnCi1ESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKLSAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKLSMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1DT01PQkpFQ1RTPSBqY29tYXBpLm8ganV0aWxzLm8gamVycm9yLm8gam1lbW1nci5vICQoU1lTREVQTUVNKSBqc2ltZGNwdS5vIFwKLSAgICAgICAgJChTWVNERVBTSU1EQ0hLKQotIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm8gamNhcGlzdGQubyBqY3RyYW5zLm8gamNwYXJhbS5vIGpkYXRhZHN0Lm8gamNpbml0Lm8gXAotICAgICAgICBqY21hc3Rlci5vIGpjbWFya2VyLm8gamNtYWluY3QubyBqY3ByZXBjdC5vIGpjY29lZmN0Lm8gamNjb2xvci5vIFwKLSAgICAgICAgamNzYW1wbGUubyBqY2h1ZmYubyBqY3BodWZmLm8gamNkY3RtZ3IubyBqY2NvbG1teC5vIGpjY29sc3MyLm8gXAotICAgICAgICBqY3NhbW1teC5vIGpjc2Ftc3MyLm8gamNxbnRpbnQubyBqY3FudGZsdC5vIGpjcW50bW14Lm8gamNxbnQzZG4ubyBcCi0gICAgICAgIGpjcW50czJpLm8gamNxbnRzc2UubyBqY3FudHMyZi5vIGpmZGN0aW50Lm8gamZkY3Rmc3QubyBqZmRjdGZsdC5vIFwKLSAgICAgICAgamZtbXhpbnQubyBqZm1teGZzdC5vIGpmM2RuZmx0Lm8gamZzczJpbnQubyBqZnNzMmZzdC5vIGpmc3NlZmx0Lm8KLSMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotRExJQk9CSkVDVFM9IGpkYXBpbWluLm8gamRhcGlzdGQubyBqZHRyYW5zLm8gamRhdGFzcmMubyBqZG1hc3Rlci5vIFwKLSAgICAgICAgamRpbnB1dC5vIGpkbWFya2VyLm8gamRodWZmLm8gamRwaHVmZi5vIGpkbWFpbmN0Lm8gamRjb2VmY3QubyBcCi0gICAgICAgIGpkcG9zdGN0Lm8gamRkY3RtZ3IubyBqZHNhbXBsZS5vIGpkY29sb3IubyBqcXVhbnQxLm8ganF1YW50Mi5vIFwKLSAgICAgICAgamRtZXJnZS5vIGppZGN0aW50Lm8gamlkY3Rmc3QubyBqaWRjdHJlZC5vIGppZGN0Zmx0Lm8gamltbXhpbnQubyBcCi0gICAgICAgIGppbW14ZnN0Lm8gamltbXhyZWQubyBqaTNkbmZsdC5vIGppc3MyaW50Lm8gamlzczJmc3QubyBqaXNzMnJlZC5vIFwKLSAgICAgICAgamlzc2VmbHQubyBqaXNzMmZsdC5vIGpkc2FtbW14Lm8gamRzYW1zczIubyBqZGNvbG1teC5vIGpkY29sc3MyLm8gXAotICAgICAgICBqZG1lcm1teC5vIGpkbWVyc3MyLm8KLSMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcuYQotTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQotIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQotQ09CSkVDVFM9IGNqcGVnLm8gcmRwcG0ubyByZGdpZi5vIHJkdGFyZ2EubyByZHJsZS5vIHJkYm1wLm8gcmRzd2l0Y2gubyBcCi0gICAgICAgIGNkanBlZy5vCi1ET0JKRUNUUz0gZGpwZWcubyB3cnBwbS5vIHdyZ2lmLm8gd3J0YXJnYS5vIHdycmxlLm8gd3JibXAubyByZGNvbG1hcC5vIFwKLSAgICAgICAgY2RqcGVnLm8KLVRST0JKRUNUUz0ganBlZ3RyYW4ubyByZHN3aXRjaC5vIGNkanBlZy5vIHRyYW5zdXBwLm8KLQotCi1hbGw6ICQoRExMTkFNRSkgY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgcmRqcGdjb20uZXhlIHdyanBnY29tLmV4ZQotCi0kKExJQk5BTUUpOiAkKERMTE5BTUUpCi0kKERMTE5BTUUpOiAkKExJQk9CSkVDVFMpIGpwZWdkbGwubyBqcGVnZGxsLmRlZgotCSQoTE4pICQoTERGTEFHU19ETEwpIC1vICQoRExMTkFNRSkgLVdsLC0tb3V0LWltcGxpYiwkKExJQk5BTUUpIFwKLQkJJChMSUJPQkpFQ1RTKSBqcGVnZGxsLm8ganBlZ2RsbC5kZWYKLQotanBlZ2RsbC5vOiBqcGVnZGxsLnJjCi0Jd2luZHJlcyAtTyBjb2ZmIC1vICRAICQqLnJjCi0KLWNqcGVnLmV4ZTogJChDT0JKRUNUUykgJChMSUJOQU1FKQotCSQoTE4pICQoTERGTEFHUykgLW8gY2pwZWcuZXhlICQoQ09CSkVDVFMpICQoTElCTkFNRSkgJChMRExJQlMpCi0KLWRqcGVnLmV4ZTogJChET0JKRUNUUykgJChMSUJOQU1FKQotCSQoTE4pICQoTERGTEFHUykgLW8gZGpwZWcuZXhlICQoRE9CSkVDVFMpICQoTElCTkFNRSkgJChMRExJQlMpCi0KLWpwZWd0cmFuLmV4ZTogJChUUk9CSkVDVFMpICQoTElCTkFNRSkKLQkkKExOKSAkKExERkxBR1MpIC1vIGpwZWd0cmFuLmV4ZSAkKFRST0JKRUNUUykgJChMSUJOQU1FKSAkKExETElCUykKLQotcmRqcGdjb20uZXhlOiByZGpwZ2NvbS5vCi0JJChMTikgJChMREZMQUdTKSAtbyByZGpwZ2NvbS5leGUgcmRqcGdjb20ubyAkKExETElCUykKLQotd3JqcGdjb20uZXhlOiB3cmpwZ2NvbS5vCi0JJChMTikgJChMREZMQUdTKSAtbyB3cmpwZ2NvbS5leGUgd3JqcGdjb20ubyAkKExETElCUykKLQotamNvbmZpZy5oOiBqY29uZmlnLmRvYwotCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCi0JZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCi0JZXhpdCAxCi0KLWNsZWFuOgotCS0kKFJNKSAqLm8KLQktJChSTSkgY2pwZWcuZXhlCi0JLSQoUk0pIGRqcGVnLmV4ZQotCS0kKFJNKSBqcGVndHJhbi5leGUKLQktJChSTSkgcmRqcGdjb20uZXhlCi0JLSQoUk0pIHdyanBnY29tLmV4ZQotCS0kKFJNKSBqc2ltZGNmZy5pbmMKLQktJChSTSkgJChETExOQU1FKQotCS0kKFJNKSAkKExJQk5BTUUpCi0JLSQoUk0pIHRlc3RvdXQqLioKLQotdGVzdDogY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUKLQktJChSTSkgdGVzdG91dCouKgotCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAkKHNyY2RpcilcdGVzdG9yaWcuanBnCi0JLi9kanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlIHRlc3RvdXQuYm1wICQoc3JjZGlyKVx0ZXN0b3JpZy5qcGcKLQkuL2NqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICQoc3JjZGlyKVx0ZXN0aW1nLnBwbQotCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gJChzcmNkaXIpXHRlc3Rwcm9nLmpwZwotCS4vY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnICQoc3JjZGlyKVx0ZXN0aW1nLnBwbQotCS4vanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnICQoc3JjZGlyKVx0ZXN0cHJvZy5qcGcKLQlmYyAvYiAkKHNyY2RpcilcdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KLQlmYyAvYiAkKHNyY2RpcilcdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKLQlmYyAvYiAkKHNyY2RpcilcdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKLQlmYyAvYiAkKHNyY2RpcilcdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCi0JZmMgL2IgJChzcmNkaXIpXHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKLQlmYyAvYiAkKHNyY2RpcilcdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwotCi0KLWpzaW1kY2ZnLmluYzogbWFrZWNmZy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vIG1ha2VjZmcuZXhlICQoc3JjZGlyKS9tYWtlY2ZnLmMgJChMRExJQlMpCi0JLlxtYWtlY2ZnLmV4ZSA+IGpzaW1kY2ZnLmluYwotCSQoUk0pIG1ha2VjZmcuZXhlCi0KLSUubyA6ICUuYXNtCi0JJChOQVNNKSAkKE5BRkxBR1MpIC1vICRAICQ8Ci0KLWpzaW1kY3B1Lm86IGpzaW1kY3B1LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jCi1qc2ltZHczMi5vOiBqc2ltZHczMi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYwotanNpbWRkamcubzoganNpbWRkamcuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMKLWpjY29sbW14Lm86IGpjY29sbW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamNjb2xzczIubzogamNjb2xzczIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qY3NhbW1teC5vOiBqY3NhbW1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpjc2Ftc3MyLm86IGpjc2Ftc3MyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRjb2xtbXgubzogamRjb2xtbXguYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZGNvbHNzMi5vOiBqZGNvbHNzMi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkbWVybW14Lm86IGpkbWVybW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRtZXJzczIubzogamRtZXJzczIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZHNhbW1teC5vOiBqZHNhbW1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkc2Ftc3MyLm86IGpkc2Ftc3MyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamNxbnRpbnQubzogamNxbnRpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpjcW50Zmx0Lm86IGpjcW50Zmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudG1teC5vOiBqY3FudG1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnQzZG4ubzogamNxbnQzZG4uYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpjcW50czJpLm86IGpjcW50czJpLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudHNzZS5vOiBqY3FudHNzZS5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnRzMmYubzogamNxbnRzMmYuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmZGN0aW50Lm86IGpmZGN0aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZmRjdGZzdC5vOiBqZmRjdGZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZkY3RmbHQubzogamZkY3RmbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmbW14aW50Lm86IGpmbW14aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZm1teGZzdC5vOiBqZm1teGZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamYzZG5mbHQubzogamYzZG5mbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmc3MyaW50Lm86IGpmc3MyaW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZnNzMmZzdC5vOiBqZnNzMmZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZzc2VmbHQubzogamZzc2VmbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppZGN0aW50Lm86IGppZGN0aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaWRjdGZzdC5vOiBqaWRjdGZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlkY3RyZWQubzogamlkY3RyZWQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppZGN0Zmx0Lm86IGppZGN0Zmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaW1teGludC5vOiBqaW1teGludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamltbXhmc3QubzogamltbXhmc3QuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppbW14cmVkLm86IGppbW14cmVkLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaTNkbmZsdC5vOiBqaTNkbmZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlzczJpbnQubzogamlzczJpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppc3MyZnN0Lm86IGppc3MyZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzMnJlZC5vOiBqaXNzMnJlZC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlzc2VmbHQubzogamlzc2VmbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppc3MyZmx0Lm86IGppc3MyZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi0KLWpzaW1kZ2NjLm86IGpzaW1kZ2NjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLQotamNhcGltaW4ubzogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjYXBpc3RkLm86IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvZWZjdC5vOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2xvci5vOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjb2xzYW1wLmgKLWpjZGN0bWdyLm86IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNpbml0Lm86IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYWluY3QubzogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFya2VyLm86IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hc3Rlci5vOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNvbWFwaS5vOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BhcmFtLm86IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYubzogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNwcmVwY3QubzogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjc2FtcGxlLm86IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjb2xzYW1wLmgKLWpjdHJhbnMubzogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGltaW4ubzogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpc3RkLm86IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGF0YWRzdC5vOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGF0YXNyYy5vOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGNvZWZjdC5vOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRjb2xvci5vOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjb2xzYW1wLmgKLWpkZGN0bWdyLm86IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamRodWZmLm86IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRpbnB1dC5vOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1haW5jdC5vOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXJrZXIubzogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFzdGVyLm86IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1lcmdlLm86IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamRwaHVmZi5vOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZHBvc3RjdC5vOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRzYW1wbGUubzogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamR0cmFucy5vOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZXJyb3IubzogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAotIyBqZmRjdGZsdC5vOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamZkY3Rmc3QubzogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGpmZGN0aW50Lm86IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotIyBqaWRjdGZsdC5vOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamlkY3Rmc3QubzogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGppZGN0aW50Lm86IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotIyBqaWRjdHJlZC5vOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpxdWFudDEubzoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanF1YW50Mi5vOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qdXRpbHMubzoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qbWVtbWdyLm86IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtYW5zaS5vOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1uYW1lLm86IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5vYnMubzogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtZG9zLm86IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbWFjLm86IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1janBlZy5vOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1kanBlZy5vOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1qcGVndHJhbi5vOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKLXJkanBnY29tLm86IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLXdyanBnY29tLm86IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLWNkanBlZy5vOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkY29sbWFwLm86IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHN3aXRjaC5vOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotdHJhbnN1cHAubzogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAotcmRwcG0ubzogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycHBtLm86IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGdpZi5vOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JnaWYubzogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkdGFyZ2EubzogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3J0YXJnYS5vOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGJtcC5vOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JibXAubzogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkcmxlLm86IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnJsZS5vOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvbWFrZWZpbGUudW5peCBiL21ha2VmaWxlLnVuaXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNWVjYzAuLjAwMDAwMDAKLS0tIGEvbWFrZWZpbGUudW5peAorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKLSMgTW9kaWZpZWQgZm9yIHg4NiBTSU1EIGV4dGVuc2lvbgotCi0jIFRoaXMgbWFrZWZpbGUgaXMgc3VpdGFibGUgZm9yIFVuaXgtbGlrZSBzeXN0ZW1zIHdpdGggbm9uLUFOU0kgY29tcGlsZXJzLgotIyBJZiB5b3UgaGF2ZSBhbiBBTlNJIGNvbXBpbGVyLCBtYWtlZmlsZS5hbnNpIGlzIGEgYmV0dGVyIHN0YXJ0aW5nIHBvaW50LgotCi0jIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQotCi0jIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKLUNDPSBjYwotCi0jIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY2Mgb3B0aW9uczoKLUNGTEFHUz0gLU8KLSMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCi0jIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KLSMgSG93ZXZlciwgYW55IHNwZWNpYWwgZGVmaW5lcyBmb3IgYW5zaTJrbnIuYyBtYXkgYmUgaW5jbHVkZWQgaGVyZToKLUFOU0kyS05SRkxBR1M9IAotCi0jIFRoZSBleGVjdXRhYmxlIG5hbWUgb2YgTkFTTSBhbmQgaXRzIG9wdGlvbnM6Ci1OQVNNPSBuYXNtCi1OQUZMQUdTPSAkKE5BU01fT0JKRk1UKSAtSS4vCi0jIG9iamVjdCBmaWxlIGZvcm1hdCBzcGVjaWZpZXIgZm9yIE5BU00KLSMgc2VlIGpzaW1kZXh0LmluYyBmb3IgbW9yZSBkZXRhaWxzLgotTkFTTV9PQkpGTVQ9IC1mYW91dCAtREFPVVQKLQotIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKLUxERkxBR1M9IAotCi0jIFRvIGxpbmsgYW55IHNwZWNpYWwgbGlicmFyaWVzLCBhZGQgdGhlIG5lY2Vzc2FyeSAtbCBjb21tYW5kcyBoZXJlLgotTERMSUJTPSAKLQotIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKLSMgbWFuYWdlciBmaWxlLiAgRm9yIFVuaXggdGhpcyBpcyB1c3VhbGx5IGptZW1ub2JzLm8sIGJ1dCB5b3UgbWF5IHdhbnQKLSMgdG8gdXNlIGptZW1hbnNpLm8gb3Igam1lbW5hbWUubyBpZiB5b3UgaGF2ZSBsaW1pdGVkIHN3YXAgc3BhY2UuCi1TWVNERVBNRU09IGptZW1ub2JzLm8KLQotIyBPUy1kZXBlbmRlbnQgU0lNRCBpbnN0cnVjdGlvbiBzdXBwb3J0IGNoZWNrZXIKLSMganNpbWR3MzIubyAoV2luMzIpIC8ganNpbWRkamcubyAoREpHUFAgVi4yKSAvIGpzaW1kZ2NjLm8gKFVuaXgvZ2NjKQotU1lTREVQU0lNRENISz0ganNpbWRnY2MubwotCi0jIG1pc2NlbGxhbmVvdXMgT1MtZGVwZW5kZW50IHN0dWZmCi0jIGxpbmtlcgotTE49ICQoQ0MpCi0jIGZpbGUgZGVsZXRpb24gY29tbWFuZAotUk09IHJtIC1mCi0jIGZpbGUgcmVuYW1lIGNvbW1hbmQKLU1WPSBtdgotIyBsaWJyYXJ5ICguYSkgZmlsZSBjcmVhdGlvbiBjb21tYW5kCi1BUj0gYXIgcmMKLSMgc2Vjb25kIHN0ZXAgaW4gLmEgY3JlYXRpb24gKHVzZSAidG91Y2giIGlmIG5vdCBuZWVkZWQpCi1BUjI9IHJhbmxpYgotCi0jIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KLQotCi0jIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgotTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAotICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKLSAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKLSAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAotICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCi0gICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKLSAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCi0gICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKLSMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5Ci1TWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCi0jIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCi1BUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAotICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKLSAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCi1TT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQotIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKLUlOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCi0gICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAotIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcwotRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKLSAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKLSAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZwotTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKLSAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKLSAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKLSAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCi0gICAgICAgIG1ha3Ztcy5vcHQKLUNPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKLSAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCi0gICAgICAgIGpjb25maWcudm1zCi1DT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKLU9USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQotVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKLSAgICAgICAgdGVzdGltZ3AuanBnCi1ESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKLSAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKLSMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1DT01PQkpFQ1RTPSBqY29tYXBpLm8ganV0aWxzLm8gamVycm9yLm8gam1lbW1nci5vICQoU1lTREVQTUVNKSBqc2ltZGNwdS5vIFwKLSAgICAgICAgJChTWVNERVBTSU1EQ0hLKQotIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm8gamNhcGlzdGQubyBqY3RyYW5zLm8gamNwYXJhbS5vIGpkYXRhZHN0Lm8gamNpbml0Lm8gXAotICAgICAgICBqY21hc3Rlci5vIGpjbWFya2VyLm8gamNtYWluY3QubyBqY3ByZXBjdC5vIGpjY29lZmN0Lm8gamNjb2xvci5vIFwKLSAgICAgICAgamNzYW1wbGUubyBqY2h1ZmYubyBqY3BodWZmLm8gamNkY3RtZ3IubyBqY2NvbG1teC5vIGpjY29sc3MyLm8gXAotICAgICAgICBqY3NhbW1teC5vIGpjc2Ftc3MyLm8gamNxbnRpbnQubyBqY3FudGZsdC5vIGpjcW50bW14Lm8gamNxbnQzZG4ubyBcCi0gICAgICAgIGpjcW50czJpLm8gamNxbnRzc2UubyBqY3FudHMyZi5vIGpmZGN0aW50Lm8gamZkY3Rmc3QubyBqZmRjdGZsdC5vIFwKLSAgICAgICAgamZtbXhpbnQubyBqZm1teGZzdC5vIGpmM2RuZmx0Lm8gamZzczJpbnQubyBqZnNzMmZzdC5vIGpmc3NlZmx0Lm8KLSMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotRExJQk9CSkVDVFM9IGpkYXBpbWluLm8gamRhcGlzdGQubyBqZHRyYW5zLm8gamRhdGFzcmMubyBqZG1hc3Rlci5vIFwKLSAgICAgICAgamRpbnB1dC5vIGpkbWFya2VyLm8gamRodWZmLm8gamRwaHVmZi5vIGpkbWFpbmN0Lm8gamRjb2VmY3QubyBcCi0gICAgICAgIGpkcG9zdGN0Lm8gamRkY3RtZ3IubyBqZHNhbXBsZS5vIGpkY29sb3IubyBqcXVhbnQxLm8ganF1YW50Mi5vIFwKLSAgICAgICAgamRtZXJnZS5vIGppZGN0aW50Lm8gamlkY3Rmc3QubyBqaWRjdHJlZC5vIGppZGN0Zmx0Lm8gamltbXhpbnQubyBcCi0gICAgICAgIGppbW14ZnN0Lm8gamltbXhyZWQubyBqaTNkbmZsdC5vIGppc3MyaW50Lm8gamlzczJmc3QubyBqaXNzMnJlZC5vIFwKLSAgICAgICAgamlzc2VmbHQubyBqaXNzMmZsdC5vIGpkc2FtbW14Lm8gamRzYW1zczIubyBqZGNvbG1teC5vIGpkY29sc3MyLm8gXAotICAgICAgICBqZG1lcm1teC5vIGpkbWVyc3MyLm8KLSMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcuYQotTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQotIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQotQ09CSkVDVFM9IGNqcGVnLm8gcmRwcG0ubyByZGdpZi5vIHJkdGFyZ2EubyByZHJsZS5vIHJkYm1wLm8gcmRzd2l0Y2gubyBcCi0gICAgICAgIGNkanBlZy5vCi1ET0JKRUNUUz0gZGpwZWcubyB3cnBwbS5vIHdyZ2lmLm8gd3J0YXJnYS5vIHdycmxlLm8gd3JibXAubyByZGNvbG1hcC5vIFwKLSAgICAgICAgY2RqcGVnLm8KLVRST0JKRUNUUz0ganBlZ3RyYW4ubyByZHN3aXRjaC5vIGNkanBlZy5vIHRyYW5zdXBwLm8KLQotCi1hbGw6IGFuc2kya25yIGxpYmpwZWcuYSBjanBlZyBkanBlZyBqcGVndHJhbiByZGpwZ2NvbSB3cmpwZ2NvbQotCi0jIFRoaXMgcnVsZSBjYXVzZXMgYW5zaTJrbnIgdG8gYmUgaW52b2tlZC4KLS5jLm86Ci0JLi9hbnNpMmtuciAkKi5jIFQkKi5jCi0JJChDQykgJChDRkxBR1MpIC1jIFQkKi5jCi0JJChSTSkgVCQqLmMgJCoubwotCSQoTVYpIFQkKi5vICQqLm8KLQotYW5zaTJrbnI6IGFuc2kya25yLmMKLQkkKENDKSAkKENGTEFHUykgJChBTlNJMktOUkZMQUdTKSAtbyBhbnNpMmtuciBhbnNpMmtuci5jCi0KLWxpYmpwZWcuYTogYW5zaTJrbnIgJChMSUJPQkpFQ1RTKQotCSQoUk0pIGxpYmpwZWcuYQotCSQoQVIpIGxpYmpwZWcuYSAgJChMSUJPQkpFQ1RTKQotCSQoQVIyKSBsaWJqcGVnLmEKLQotY2pwZWc6IGFuc2kya25yICQoQ09CSkVDVFMpIGxpYmpwZWcuYQotCSQoTE4pICQoTERGTEFHUykgLW8gY2pwZWcgJChDT0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQotCi1kanBlZzogYW5zaTJrbnIgJChET0JKRUNUUykgbGlianBlZy5hCi0JJChMTikgJChMREZMQUdTKSAtbyBkanBlZyAkKERPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCi0KLWpwZWd0cmFuOiBhbnNpMmtuciAkKFRST0JKRUNUUykgbGlianBlZy5hCi0JJChMTikgJChMREZMQUdTKSAtbyBqcGVndHJhbiAkKFRST0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQotCi1yZGpwZ2NvbTogcmRqcGdjb20ubwotCSQoTE4pICQoTERGTEFHUykgLW8gcmRqcGdjb20gcmRqcGdjb20ubyAkKExETElCUykKLQotd3JqcGdjb206IHdyanBnY29tLm8KLQkkKExOKSAkKExERkxBR1MpIC1vIHdyanBnY29tIHdyanBnY29tLm8gJChMRExJQlMpCi0KLWpjb25maWcuaDogamNvbmZpZy5kb2MKLQllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgotCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgotCWV4aXQgMQotCi1jbGVhbjoKLQkkKFJNKSAqLm8gY2pwZWcgZGpwZWcganBlZ3RyYW4gbGlianBlZy5hIHJkanBnY29tIHdyanBnY29tCi0JJChSTSkganNpbWRjZmcuaW5jIGFuc2kya25yIGNvcmUgdGVzdG91dCoKLQotdGVzdDogY2pwZWcgZGpwZWcganBlZ3RyYW4KLQkkKFJNKSB0ZXN0b3V0KgotCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgdGVzdG9yaWcuanBnCi0JLi9kanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlIHRlc3RvdXQuYm1wICB0ZXN0b3JpZy5qcGcKLQkuL2NqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICB0ZXN0aW1nLnBwbQotCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCi0JLi9janBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSB0ZXN0b3V0cC5qcGcgdGVzdGltZy5wcG0KLQkuL2pwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKLQljbXAgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KLQljbXAgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKLQljbXAgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKLQljbXAgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCi0JY21wIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKLQljbXAgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwotCi0KLWpzaW1kY2ZnLmluYzogbWFrZWNmZy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vIG1ha2VjZmcgLi9tYWtlY2ZnLmMgJChMRExJQlMpCi0JLi9tYWtlY2ZnID4ganNpbWRjZmcuaW5jCi0JJChSTSkgLi9tYWtlY2ZnCi0KLS5hc20ubzoKLQkkKE5BU00pICQoTkFGTEFHUykgLW8gJEAgJCouYXNtCi0KLWpzaW1kY3B1Lm86IGpzaW1kY3B1LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jCi1qc2ltZHczMi5vOiBqc2ltZHczMi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYwotanNpbWRkamcubzoganNpbWRkamcuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMKLWpjY29sbW14Lm86IGpjY29sbW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamNjb2xzczIubzogamNjb2xzczIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qY3NhbW1teC5vOiBqY3NhbW1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpjc2Ftc3MyLm86IGpjc2Ftc3MyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRjb2xtbXgubzogamRjb2xtbXguYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZGNvbHNzMi5vOiBqZGNvbHNzMi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkbWVybW14Lm86IGpkbWVybW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRtZXJzczIubzogamRtZXJzczIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZHNhbW1teC5vOiBqZHNhbW1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkc2Ftc3MyLm86IGpkc2Ftc3MyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamNxbnRpbnQubzogamNxbnRpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpjcW50Zmx0Lm86IGpjcW50Zmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudG1teC5vOiBqY3FudG1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnQzZG4ubzogamNxbnQzZG4uYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpjcW50czJpLm86IGpjcW50czJpLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudHNzZS5vOiBqY3FudHNzZS5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnRzMmYubzogamNxbnRzMmYuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmZGN0aW50Lm86IGpmZGN0aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZmRjdGZzdC5vOiBqZmRjdGZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZkY3RmbHQubzogamZkY3RmbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmbW14aW50Lm86IGpmbW14aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZm1teGZzdC5vOiBqZm1teGZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamYzZG5mbHQubzogamYzZG5mbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWpmc3MyaW50Lm86IGpmc3MyaW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZnNzMmZzdC5vOiBqZnNzMmZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZzc2VmbHQubzogamZzc2VmbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppZGN0aW50Lm86IGppZGN0aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaWRjdGZzdC5vOiBqaWRjdGZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlkY3RyZWQubzogamlkY3RyZWQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppZGN0Zmx0Lm86IGppZGN0Zmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaW1teGludC5vOiBqaW1teGludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamltbXhmc3QubzogamltbXhmc3QuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppbW14cmVkLm86IGppbW14cmVkLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaTNkbmZsdC5vOiBqaTNkbmZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlzczJpbnQubzogamlzczJpbnQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppc3MyZnN0Lm86IGppc3MyZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzMnJlZC5vOiBqaXNzMnJlZC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlzc2VmbHQubzogamlzc2VmbHQuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamRjdC5pbmMKLWppc3MyZmx0Lm86IGppc3MyZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi0KLWpzaW1kZ2NjLm86IGpzaW1kZ2NjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLQotamNhcGltaW4ubzogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjYXBpc3RkLm86IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvZWZjdC5vOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2xvci5vOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjb2xzYW1wLmgKLWpjZGN0bWdyLm86IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNpbml0Lm86IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYWluY3QubzogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFya2VyLm86IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hc3Rlci5vOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNvbWFwaS5vOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BhcmFtLm86IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYubzogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNwcmVwY3QubzogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjc2FtcGxlLm86IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjb2xzYW1wLmgKLWpjdHJhbnMubzogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGltaW4ubzogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpc3RkLm86IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGF0YWRzdC5vOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGF0YXNyYy5vOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGNvZWZjdC5vOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRjb2xvci5vOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjb2xzYW1wLmgKLWpkZGN0bWdyLm86IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamRodWZmLm86IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRpbnB1dC5vOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1haW5jdC5vOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXJrZXIubzogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFzdGVyLm86IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1lcmdlLm86IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamRwaHVmZi5vOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZHBvc3RjdC5vOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRzYW1wbGUubzogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamR0cmFucy5vOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZXJyb3IubzogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAotIyBqZmRjdGZsdC5vOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamZkY3Rmc3QubzogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGpmZGN0aW50Lm86IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotIyBqaWRjdGZsdC5vOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamlkY3Rmc3QubzogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGppZGN0aW50Lm86IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotIyBqaWRjdHJlZC5vOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpxdWFudDEubzoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanF1YW50Mi5vOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qdXRpbHMubzoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qbWVtbWdyLm86IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtYW5zaS5vOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1uYW1lLm86IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5vYnMubzogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtZG9zLm86IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbWFjLm86IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1janBlZy5vOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1kanBlZy5vOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1qcGVndHJhbi5vOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKLXJkanBnY29tLm86IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLXdyanBnY29tLm86IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLWNkanBlZy5vOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkY29sbWFwLm86IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHN3aXRjaC5vOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotdHJhbnN1cHAubzogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAotcmRwcG0ubzogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycHBtLm86IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGdpZi5vOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JnaWYubzogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkdGFyZ2EubzogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3J0YXJnYS5vOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGJtcC5vOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JibXAubzogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkcmxlLm86IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnJsZS5vOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvbWFrZWZpbGUudmMgYi9tYWtlZmlsZS52YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmZWRhMy4uMDAwMDAwMAotLS0gYS9tYWtlZmlsZS52YworKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKLSMgTW9kaWZpZWQgZm9yIHg4NiBTSU1EIGV4dGVuc2lvbgotCi0jIFRoaXMgbWFrZWZpbGUgaXMgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrIG9uIFdpbmRvd3MgTlQgKGFuZCA5NT8pLgotIyBJdCBidWlsZHMgdGhlIElKRyBsaWJyYXJ5IGFzIGEgc3RhdGljYWxseSBsaW5rYWJsZSBsaWJyYXJ5ICguTElCKSwKLSMgYW5kIGJ1aWxkcyB0aGUgc2FtcGxlIGFwcGxpY2F0aW9ucyBhcyBjb25zb2xlLW1vZGUgYXBwcy4KLQotIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibm1ha2UiICEhCi0KLSMgVGhlIG5hbWUgb2YgeW91ciBDIGNvbXBpbGVyOgotQ0M9IGNsCi1MRD0gbGluawotCi0jIFlvdSBtYXkgd2FudCB0byBhZGp1c3QgdGhlc2UgY29tcGlsZXIgb3B0aW9uczoKLSFpZmRlZiBjcnRkbGwKLSMgKERMTCB2ZXJzaW9uIG9mIENSVCkKLUNGTEFHUz0gLW5vbG9nbyAtYyAtTUQgLVczIC1PMiAtR0YgLUd5IC1ETkRFQlVHIC1JLgotIWVsc2UKLSMgKFNpbmdsZSB0aHJlYWRlZCBzdGF0aWMgQ1JUKQotQ0ZMQUdTPSAtbm9sb2dvIC1jIC1NTCAtVzMgLU8yIC1HRiAtR3kgLUROREVCVUcgLUkuCi0hZW5kaWYKLQotIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKLSMgTk9UIHZpYSAtRCBzd2l0Y2hlcyBoZXJlLgotCi0jIFRoZSBleGVjdXRhYmxlIG5hbWUgb2YgTkFTTSBhbmQgaXRzIG9wdGlvbnM6Ci1OQVNNPSBuYXNtdwotTkFGTEFHUz0gJChOQVNNX09CSkZNVCkgLUkuLwotIyBvYmplY3QgZmlsZSBmb3JtYXQgc3BlY2lmaWVyIGZvciBOQVNNCi0jIHNlZSBqc2ltZGV4dC5pbmMgZm9yIG1vcmUgZGV0YWlscy4KLU5BU01fT0JKRk1UPSAtZndpbjMyIC1EV0lOMzIKLQotIyBMaW5rLXRpbWUgb3B0aW9uczoKLUxERkxBR1M9IC1ub2xvZ28gLXJlbGVhc2UgLXN1YnN5c3RlbTpjb25zb2xlLDQuMCAtb3B0Om5vd2luOTgKLQotIyBUbyBsaW5rIGFueSBzcGVjaWFsIGxpYnJhcmllcywgYWRkIHRoZSBuZWNlc3NhcnkgY29tbWFuZHMgaGVyZS4KLUxETElCUz0gCi0KLSMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5Ci0jIG1hbmFnZXIgZmlsZS4gIEZvciBOVCB3ZSBzdWdnZXN0IGptZW1ub2JzLm9iaiwgd2hpY2ggZXhwZWN0cyB0aGUgT1MgdG8KLSMgcHJvdmlkZSBhZGVxdWF0ZSB2aXJ0dWFsIG1lbW9yeS4KLVNZU0RFUE1FTT0gam1lbW5vYnMub2JqCi0KLSMgT1MtZGVwZW5kZW50IFNJTUQgaW5zdHJ1Y3Rpb24gc3VwcG9ydCBjaGVja2VyCi0jIGpzaW1kdzMyLm9iaiAoV2luMzIpIC8ganNpbWRkamcub2JqIChESkdQUCBWLjIpIC8ganNpbWRnY2Mub2JqIChVbml4L2djYykKLVNZU0RFUFNJTURDSEs9IGpzaW1kdzMyLm9iagotCi0jIG1pc2NlbGxhbmVvdXMgT1MtZGVwZW5kZW50IHN0dWZmCi0jIGZpbGUgZGVsZXRpb24gY29tbWFuZAotUk09IGRlbAotCi0jIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KLQotCi0jIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgotTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAotICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKLSAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKLSAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAotICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCi0gICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKLSAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCi0gICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKLSMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5Ci1TWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCi0jIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCi1BUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAotICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKLSAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCi1TT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQotIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKLUlOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCi0gICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAotIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcwotRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKLSAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKLSAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZwotTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKLSAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKLSAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKLSAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCi0gICAgICAgIG1ha3Ztcy5vcHQKLUNPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKLSAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCi0gICAgICAgIGpjb25maWcudm1zCi1DT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKLU9USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQotVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKLSAgICAgICAgdGVzdGltZ3AuanBnCi1ESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKLSAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKLSMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1DT01PQkpFQ1RTPSBqY29tYXBpLm9iaiBqdXRpbHMub2JqIGplcnJvci5vYmogam1lbW1nci5vYmogJChTWVNERVBNRU0pIFwKLSAgICAgICAganNpbWRjcHUub2JqICQoU1lTREVQU0lNRENISykKLSMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLUNMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vYmogamNhcGlzdGQub2JqIGpjdHJhbnMub2JqIGpjcGFyYW0ub2JqIGpkYXRhZHN0Lm9iaiBcCi0gICAgICAgIGpjaW5pdC5vYmogamNtYXN0ZXIub2JqIGpjbWFya2VyLm9iaiBqY21haW5jdC5vYmogamNwcmVwY3Qub2JqIFwKLSAgICAgICAgamNjb2VmY3Qub2JqIGpjY29sb3Iub2JqIGpjc2FtcGxlLm9iaiBqY2h1ZmYub2JqIGpjcGh1ZmYub2JqIFwKLSAgICAgICAgamNkY3RtZ3Iub2JqIGpjY29sbW14Lm9iaiBqY2NvbHNzMi5vYmogamNzYW1tbXgub2JqIGpjc2Ftc3MyLm9iaiBcCi0gICAgICAgIGpjcW50aW50Lm9iaiBqY3FudGZsdC5vYmogamNxbnRtbXgub2JqIGpjcW50M2RuLm9iaiBqY3FudHMyaS5vYmogXAotICAgICAgICBqY3FudHNzZS5vYmogamNxbnRzMmYub2JqIGpmZGN0aW50Lm9iaiBqZmRjdGZzdC5vYmogamZkY3RmbHQub2JqIFwKLSAgICAgICAgamZtbXhpbnQub2JqIGpmbW14ZnN0Lm9iaiBqZjNkbmZsdC5vYmogamZzczJpbnQub2JqIGpmc3MyZnN0Lm9iaiBcCi0gICAgICAgIGpmc3NlZmx0Lm9iagotIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1ETElCT0JKRUNUUz0gamRhcGltaW4ub2JqIGpkYXBpc3RkLm9iaiBqZHRyYW5zLm9iaiBqZGF0YXNyYy5vYmogXAotICAgICAgICBqZG1hc3Rlci5vYmogamRpbnB1dC5vYmogamRtYXJrZXIub2JqIGpkaHVmZi5vYmogamRwaHVmZi5vYmogXAotICAgICAgICBqZG1haW5jdC5vYmogamRjb2VmY3Qub2JqIGpkcG9zdGN0Lm9iaiBqZGRjdG1nci5vYmogamRzYW1wbGUub2JqIFwKLSAgICAgICAgamRjb2xvci5vYmoganF1YW50MS5vYmoganF1YW50Mi5vYmogamRtZXJnZS5vYmogamlkY3RpbnQub2JqIFwKLSAgICAgICAgamlkY3Rmc3Qub2JqIGppZGN0cmVkLm9iaiBqaWRjdGZsdC5vYmogamltbXhpbnQub2JqIGppbW14ZnN0Lm9iaiBcCi0gICAgICAgIGppbW14cmVkLm9iaiBqaTNkbmZsdC5vYmogamlzczJpbnQub2JqIGppc3MyZnN0Lm9iaiBqaXNzMnJlZC5vYmogXAotICAgICAgICBqaXNzZWZsdC5vYmogamlzczJmbHQub2JqIGpkc2FtbW14Lm9iaiBqZHNhbXNzMi5vYmogamRjb2xtbXgub2JqIFwKLSAgICAgICAgamRjb2xzczIub2JqIGpkbWVybW14Lm9iaiBqZG1lcnNzMi5vYmoKLSMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcubGliCi1MSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCi0jIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCi1DT0JKRUNUUz0gY2pwZWcub2JqIHJkcHBtLm9iaiByZGdpZi5vYmogcmR0YXJnYS5vYmogcmRybGUub2JqIHJkYm1wLm9iaiBcCi0gICAgICAgIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqCi1ET0JKRUNUUz0gZGpwZWcub2JqIHdycHBtLm9iaiB3cmdpZi5vYmogd3J0YXJnYS5vYmogd3JybGUub2JqIHdyYm1wLm9iaiBcCi0gICAgICAgIHJkY29sbWFwLm9iaiBjZGpwZWcub2JqCi1UUk9CSkVDVFM9IGpwZWd0cmFuLm9iaiByZHN3aXRjaC5vYmogY2RqcGVnLm9iaiB0cmFuc3VwcC5vYmoKLQotIyBUZW1wbGF0ZSBjb21tYW5kIGZvciBjb21waWxpbmcgLmMgdG8gLm9iagotLmMub2JqOjoKLQkkKENDKSAkKENGTEFHUykgJDwKLQotCi1hbGw6IGxpYmpwZWcubGliIGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlIHJkanBnY29tLmV4ZSB3cmpwZ2NvbS5leGUKLQotbGlianBlZy5saWI6ICQoTElCT0JKRUNUUykKLQktJChSTSkgbGlianBlZy5saWIKLQlsaWIgLW91dDpsaWJqcGVnLmxpYiAgJChMSUJPQkpFQ1RTKQotCi1janBlZy5leGU6ICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCi0JJChMRCkgJChMREZMQUdTKSAtb3V0OmNqcGVnLmV4ZSAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYiAkKExETElCUykKLQotZGpwZWcuZXhlOiAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCSQoTEQpICQoTERGTEFHUykgLW91dDpkanBlZy5leGUgJChET0JKRUNUUykgbGlianBlZy5saWIgJChMRExJQlMpCi0KLWpwZWd0cmFuLmV4ZTogJChUUk9CSkVDVFMpIGxpYmpwZWcubGliCi0JJChMRCkgJChMREZMQUdTKSAtb3V0OmpwZWd0cmFuLmV4ZSAkKFRST0JKRUNUUykgbGlianBlZy5saWIgJChMRExJQlMpCi0KLXJkanBnY29tLmV4ZTogcmRqcGdjb20ub2JqCi0JJChMRCkgJChMREZMQUdTKSAtb3V0OnJkanBnY29tLmV4ZSByZGpwZ2NvbS5vYmogJChMRExJQlMpCi0KLXdyanBnY29tLmV4ZTogd3JqcGdjb20ub2JqCi0JJChMRCkgJChMREZMQUdTKSAtb3V0OndyanBnY29tLmV4ZSB3cmpwZ2NvbS5vYmogJChMRExJQlMpCi0KLQotY2xlYW46Ci0JLSQoUk0pICoub2JqCi0JLSQoUk0pIGNqcGVnLmV4ZQotCS0kKFJNKSBkanBlZy5leGUKLQktJChSTSkganBlZ3RyYW4uZXhlCi0JLSQoUk0pIHJkanBnY29tLmV4ZQotCS0kKFJNKSB3cmpwZ2NvbS5leGUKLQktJChSTSkganNpbWRjZmcuaW5jCi0JLSQoUk0pIGxpYmpwZWcubGliCi0JLWlmIGV4aXN0ICoubWFuaWZlc3QgJChSTSkgKi5tYW5pZmVzdAotCS1pZiBleGlzdCB0ZXN0b3V0KiAgICQoUk0pIHRlc3RvdXQqCi0KLXRlc3Q6IGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlCi0JLWlmIGV4aXN0IHRlc3RvdXQqICQoUk0pIHRlc3RvdXQqCi0JLlxkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtICB0ZXN0b3JpZy5qcGcKLQkuXGRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZwotCS5cY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCi0JLlxkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKLQkuXGNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQotCS5canBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZwotCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtCi0JZmMgL2IgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKLQlmYyAvYiB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZwotCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQotCWZjIC9iIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKLQlmYyAvYiB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCi0KLQotanNpbWRjZmcuaW5jOiBtYWtlY2ZnLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi0JJChDQykgJChDRkxBR1MpIG1ha2VjZmcuYwotCSQoTEQpICQoTERGTEFHUykgLW91dDptYWtlY2ZnLmV4ZSBtYWtlY2ZnLm9iaiAkKExETElCUykKLQkuXG1ha2VjZmcuZXhlID4ganNpbWRjZmcuaW5jCi0JJChSTSkgbWFrZWNmZy5vYmoKLQkkKFJNKSBtYWtlY2ZnLmV4ZQotCWlmIGV4aXN0IG1ha2VjZmcuZXhlLm1hbmlmZXN0ICQoUk0pIG1ha2VjZmcuZXhlLm1hbmlmZXN0Ci0KLS5hc20ub2JqOgotCSQoTkFTTSkgJChOQUZMQUdTKSAtbyAkQCAkPAotCi1qc2ltZGNwdS5vYmo6IGpzaW1kY3B1LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jCi1qc2ltZHczMi5vYmo6IGpzaW1kdzMyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jCi1qc2ltZGRqZy5vYmo6IGpzaW1kZGpnLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jCi1qY2NvbG1teC5vYmo6IGpjY29sbW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamNjb2xzczIub2JqOiBqY2NvbHNzMi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpjc2FtbW14Lm9iajogamNzYW1tbXguYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qY3NhbXNzMi5vYmo6IGpjc2Ftc3MyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRjb2xtbXgub2JqOiBqZGNvbG1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkY29sc3MyLm9iajogamRjb2xzczIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZG1lcm1teC5vYmo6IGpkbWVybW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRtZXJzczIub2JqOiBqZG1lcnNzMi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkc2FtbW14Lm9iajogamRzYW1tbXguYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZHNhbXNzMi5vYmo6IGpkc2Ftc3MyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamNxbnRpbnQub2JqOiBqY3FudGludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnRmbHQub2JqOiBqY3FudGZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnRtbXgub2JqOiBqY3FudG1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnQzZG4ub2JqOiBqY3FudDNkbi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnRzMmkub2JqOiBqY3FudHMyaS5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnRzc2Uub2JqOiBqY3FudHNzZS5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamNxbnRzMmYub2JqOiBqY3FudHMyZi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZkY3RpbnQub2JqOiBqZmRjdGludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZkY3Rmc3Qub2JqOiBqZmRjdGZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZkY3RmbHQub2JqOiBqZmRjdGZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZtbXhpbnQub2JqOiBqZm1teGludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZtbXhmc3Qub2JqOiBqZm1teGZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamYzZG5mbHQub2JqOiBqZjNkbmZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZzczJpbnQub2JqOiBqZnNzMmludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZzczJmc3Qub2JqOiBqZnNzMmZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamZzc2VmbHQub2JqOiBqZnNzZWZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlkY3RpbnQub2JqOiBqaWRjdGludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlkY3Rmc3Qub2JqOiBqaWRjdGZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlkY3RyZWQub2JqOiBqaWRjdHJlZC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlkY3RmbHQub2JqOiBqaWRjdGZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamltbXhpbnQub2JqOiBqaW1teGludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamltbXhmc3Qub2JqOiBqaW1teGZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamltbXhyZWQub2JqOiBqaW1teHJlZC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamkzZG5mbHQub2JqOiBqaTNkbmZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlzczJpbnQub2JqOiBqaXNzMmludC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlzczJmc3Qub2JqOiBqaXNzMmZzdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlzczJyZWQub2JqOiBqaXNzMnJlZC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlzc2VmbHQub2JqOiBqaXNzZWZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotamlzczJmbHQub2JqOiBqaXNzMmZsdC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqZGN0LmluYwotCi1qc2ltZGdjYy5vYmo6IGpzaW1kZ2NjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLQotamNhcGltaW4ub2JqOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNhcGlzdGQub2JqOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2VmY3Qub2JqOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2xvci5vYmo6IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamNkY3RtZ3Iub2JqOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpjaHVmZi5vYmo6IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNpbml0Lm9iajogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21haW5jdC5vYmo6IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hcmtlci5vYmo6IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hc3Rlci5vYmo6IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY29tYXBpLm9iajogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwYXJhbS5vYmo6IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYub2JqOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY3ByZXBjdC5vYmo6IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3NhbXBsZS5vYmo6IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjb2xzYW1wLmgKLWpjdHJhbnMub2JqOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaW1pbi5vYmo6IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaXN0ZC5vYmo6IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGF0YWRzdC5vYmo6IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkYXRhc3JjLm9iajogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRjb2VmY3Qub2JqOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRjb2xvci5vYmo6IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamRkY3RtZ3Iub2JqOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpkaHVmZi5vYmo6IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRpbnB1dC5vYmo6IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFpbmN0Lm9iajogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFya2VyLm9iajogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFzdGVyLm9iajogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWVyZ2Uub2JqOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjb2xzYW1wLmgKLWpkcGh1ZmYub2JqOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZHBvc3RjdC5vYmo6IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHNhbXBsZS5vYmo6IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjb2xzYW1wLmgKLWpkdHJhbnMub2JqOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZXJyb3Iub2JqOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCi0jIGpmZGN0Zmx0Lm9iajogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGpmZGN0ZnN0Lm9iajogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGpmZGN0aW50Lm9iajogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGppZGN0Zmx0Lm9iajogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGppZGN0ZnN0Lm9iajogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGppZGN0aW50Lm9iajogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi0jIGppZGN0cmVkLm9iajogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qcXVhbnQxLm9iajoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanF1YW50Mi5vYmo6IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWp1dGlscy5vYmo6IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotam1lbW1nci5vYmo6IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtYW5zaS5vYmo6IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5hbWUub2JqOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1ub2JzLm9iajogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtZG9zLm9iajogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1tYWMub2JqOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotY2pwZWcub2JqOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1kanBlZy5vYmo6IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWpwZWd0cmFuLm9iajoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCi1yZGpwZ2NvbS5vYmo6IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLXdyanBnY29tLm9iajogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotY2RqcGVnLm9iajogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGNvbG1hcC5vYmo6IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHN3aXRjaC5vYmo6IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi10cmFuc3VwcC5vYmo6IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKLXJkcHBtLm9iajogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycHBtLm9iajogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkZ2lmLm9iajogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyZ2lmLm9iajogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkdGFyZ2Eub2JqOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnRhcmdhLm9iajogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRibXAub2JqOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JibXAub2JqOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRybGUub2JqOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JybGUub2JqOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvbWFrZWZpbGUudmNkbGwgYi9tYWtlZmlsZS52Y2RsbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q3MTVlYi4uMDAwMDAwMAotLS0gYS9tYWtlZmlsZS52Y2RsbAorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKLSMgTW9kaWZpZWQgZm9yIHg4NiBTSU1EIGV4dGVuc2lvbgotCi0jIFRoaXMgbWFrZWZpbGUgaXMgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrIDYuMC4KLSMgSXQgYnVpbGRzIHRoZSBJSkcgbGlicmFyeSBhcyBhIGR5bmFtaWNhbGx5IGxpbmthYmxlIGxpYnJhcnkgKC5ETEwpLAotIyBhbmQgYnVpbGRzIHRoZSBzYW1wbGUgYXBwbGljYXRpb25zIHdoaWNoIGFyZSBsaW5rZWQgYWdhaW5zdCB0aGUgRExMLgotCi0jIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJubWFrZSIgISEKLQotIyBUaGUgbmFtZSBvZiB5b3VyIEMgY29tcGlsZXI6Ci1DQz0gY2wKLUxEPSBsaW5rCi1SQz0gcmMKLQotIyBZb3UgbWF5IHdhbnQgdG8gYWRqdXN0IHRoZXNlIGNvbXBpbGVyIG9wdGlvbnM6Ci0jICBZb3UgaGF2ZSB0byB1c2UgYSBETEwgdmVyc2lvbiBvZiBDIFJ1bi1UaW1lIGxpYnJhcnkgZm9yIGJvdGgKLSMgIHRoZSBKUEVHIERMTCBhbmQgYW55IGFwcGxpY2F0aW9ucyBsaW5rZWQgdG8gdGhlIEpQRUcgRExMLgotQ0ZMQUdTPSAtbm9sb2dvIC1jIC1NRCAtVzMgLU8yIC1HRiAtR3kgLUROREVCVUcgLUkuCi0KLSMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCi0jIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KLQotIyBUaGUgZXhlY3V0YWJsZSBuYW1lIG9mIE5BU00gYW5kIGl0cyBvcHRpb25zOgotTkFTTT0gbmFzbXcKLU5BRkxBR1M9ICQoTkFTTV9PQkpGTVQpIC1JLi8KLSMgb2JqZWN0IGZpbGUgZm9ybWF0IHNwZWNpZmllciBmb3IgTkFTTQotIyBzZWUganNpbWRleHQuaW5jIGZvciBtb3JlIGRldGFpbHMuCi1OQVNNX09CSkZNVD0gLWZ3aW4zMiAtRFdJTjMyCi0KLSMgTGluay10aW1lIG9wdGlvbnM6Ci1MREZMQUdTPSAtbm9sb2dvIC1yZWxlYXNlIC1zdWJzeXN0ZW06Y29uc29sZSw0LjAgLW9wdDpub3dpbjk4Ci1MREZMQUdTX0RMTD0gLW5vbG9nbyAtcmVsZWFzZSAtZGxsIC1vcHQ6bm93aW45OAotCi0jIFRvIGxpbmsgYW55IHNwZWNpYWwgbGlicmFyaWVzLCBhZGQgdGhlIG5lY2Vzc2FyeSBjb21tYW5kcyBoZXJlLgotTERMSUJTPSAKLQotIyBETEwgdG8gYnVpbGQKLURMTE5BTUUgPSBqcGVnNjIuZGxsCi0jIGltcG9ydCBsaWJyYXJ5Ci1MSUJOQU1FID0ganBlZzYyLmxpYgotCi0jIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQotIyBtYW5hZ2VyIGZpbGUuICBGb3IgTlQgd2Ugc3VnZ2VzdCBqbWVtbm9icy5vYmosIHdoaWNoIGV4cGVjdHMgdGhlIE9TIHRvCi0jIHByb3ZpZGUgYWRlcXVhdGUgdmlydHVhbCBtZW1vcnkuCi1TWVNERVBNRU09IGptZW1ub2JzLm9iagotCi0jIE9TLWRlcGVuZGVudCBTSU1EIGluc3RydWN0aW9uIHN1cHBvcnQgY2hlY2tlcgotIyBqc2ltZHczMi5vYmogKFdpbjMyKSAvIGpzaW1kZGpnLm9iaiAoREpHUFAgVi4yKSAvIGpzaW1kZ2NjLm9iaiAoVW5peC9nY2MpCi1TWVNERVBTSU1EQ0hLPSBqc2ltZHczMi5vYmoKLQotIyBtaXNjZWxsYW5lb3VzIE9TLWRlcGVuZGVudCBzdHVmZgotIyBmaWxlIGRlbGV0aW9uIGNvbW1hbmQKLVJNPSBkZWwKLQotIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCi0KLQotIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAotICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCi0jIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQotU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYwotIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQotQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKLSAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCi0gICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYwotU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKLSMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCi1JTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAotICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKLSMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0Ci1DT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCi0gICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAotICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KLVRFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCi0gICAgICAgIHRlc3RpbWdwLmpwZwotRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCi0gICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCi0jIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotQ09NT0JKRUNUUz0gamNvbWFwaS5vYmoganV0aWxzLm9iaiBqZXJyb3Iub2JqIGptZW1tZ3Iub2JqICQoU1lTREVQTUVNKSBcCi0gICAgICAgIGpzaW1kY3B1Lm9iaiAkKFNZU0RFUFNJTURDSEspCi0jIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1DTElCT0JKRUNUUz0gamNhcGltaW4ub2JqIGpjYXBpc3RkLm9iaiBqY3RyYW5zLm9iaiBqY3BhcmFtLm9iaiBqZGF0YWRzdC5vYmogXAotICAgICAgICBqY2luaXQub2JqIGpjbWFzdGVyLm9iaiBqY21hcmtlci5vYmogamNtYWluY3Qub2JqIGpjcHJlcGN0Lm9iaiBcCi0gICAgICAgIGpjY29lZmN0Lm9iaiBqY2NvbG9yLm9iaiBqY3NhbXBsZS5vYmogamNodWZmLm9iaiBqY3BodWZmLm9iaiBcCi0gICAgICAgIGpjZGN0bWdyLm9iaiBqY2NvbG1teC5vYmogamNjb2xzczIub2JqIGpjc2FtbW14Lm9iaiBqY3NhbXNzMi5vYmogXAotICAgICAgICBqY3FudGludC5vYmogamNxbnRmbHQub2JqIGpjcW50bW14Lm9iaiBqY3FudDNkbi5vYmogamNxbnRzMmkub2JqIFwKLSAgICAgICAgamNxbnRzc2Uub2JqIGpjcW50czJmLm9iaiBqZmRjdGludC5vYmogamZkY3Rmc3Qub2JqIGpmZGN0Zmx0Lm9iaiBcCi0gICAgICAgIGpmbW14aW50Lm9iaiBqZm1teGZzdC5vYmogamYzZG5mbHQub2JqIGpmc3MyaW50Lm9iaiBqZnNzMmZzdC5vYmogXAotICAgICAgICBqZnNzZWZsdC5vYmoKLSMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotRExJQk9CSkVDVFM9IGpkYXBpbWluLm9iaiBqZGFwaXN0ZC5vYmogamR0cmFucy5vYmogamRhdGFzcmMub2JqIFwKLSAgICAgICAgamRtYXN0ZXIub2JqIGpkaW5wdXQub2JqIGpkbWFya2VyLm9iaiBqZGh1ZmYub2JqIGpkcGh1ZmYub2JqIFwKLSAgICAgICAgamRtYWluY3Qub2JqIGpkY29lZmN0Lm9iaiBqZHBvc3RjdC5vYmogamRkY3RtZ3Iub2JqIGpkc2FtcGxlLm9iaiBcCi0gICAgICAgIGpkY29sb3Iub2JqIGpxdWFudDEub2JqIGpxdWFudDIub2JqIGpkbWVyZ2Uub2JqIGppZGN0aW50Lm9iaiBcCi0gICAgICAgIGppZGN0ZnN0Lm9iaiBqaWRjdHJlZC5vYmogamlkY3RmbHQub2JqIGppbW14aW50Lm9iaiBqaW1teGZzdC5vYmogXAotICAgICAgICBqaW1teHJlZC5vYmogamkzZG5mbHQub2JqIGppc3MyaW50Lm9iaiBqaXNzMmZzdC5vYmogamlzczJyZWQub2JqIFwKLSAgICAgICAgamlzc2VmbHQub2JqIGppc3MyZmx0Lm9iaiBqZHNhbW1teC5vYmogamRzYW1zczIub2JqIGpkY29sbW14Lm9iaiBcCi0gICAgICAgIGpkY29sc3MyLm9iaiBqZG1lcm1teC5vYmogamRtZXJzczIub2JqCi0jIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmxpYgotTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQotIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQotQ09CSkVDVFM9IGNqcGVnLm9iaiByZHBwbS5vYmogcmRnaWYub2JqIHJkdGFyZ2Eub2JqIHJkcmxlLm9iaiByZGJtcC5vYmogXAotICAgICAgICByZHN3aXRjaC5vYmogY2RqcGVnLm9iagotRE9CSkVDVFM9IGRqcGVnLm9iaiB3cnBwbS5vYmogd3JnaWYub2JqIHdydGFyZ2Eub2JqIHdycmxlLm9iaiB3cmJtcC5vYmogXAotICAgICAgICByZGNvbG1hcC5vYmogY2RqcGVnLm9iagotVFJPQkpFQ1RTPSBqcGVndHJhbi5vYmogcmRzd2l0Y2gub2JqIGNkanBlZy5vYmogdHJhbnN1cHAub2JqCi0KLSMgVGVtcGxhdGUgY29tbWFuZCBmb3IgY29tcGlsaW5nIC5jIHRvIC5vYmoKLS5jLm9iajo6Ci0JJChDQykgJChDRkxBR1MpICQ8Ci0KLQotYWxsOiAkKERMTE5BTUUpIGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlIHJkanBnY29tLmV4ZSB3cmpwZ2NvbS5leGUKLQotJChMSUJOQU1FKTogJChETExOQU1FKQotJChETExOQU1FKTogJChMSUJPQkpFQ1RTKSBqcGVnZGxsLnJlcyBqcGVnZGxsLmRlZgotCSQoTEQpICQoTERGTEFHU19ETEwpIC1vdXQ6JChETExOQU1FKSAtaW1wbGliOiQoTElCTkFNRSkgXAotCQkkKExJQk9CSkVDVFMpIGpwZWdkbGwucmVzIC1kZWY6anBlZ2RsbC5kZWYKLQotanBlZ2RsbC5yZXM6IGpwZWdkbGwucmMKLQkkKFJDKSAtZm8gJEAgJCoucmMKLQotY2pwZWcuZXhlOiAkKENPQkpFQ1RTKSAkKExJQk5BTUUpCi0JJChMRCkgJChMREZMQUdTKSAtb3V0OmNqcGVnLmV4ZSAkKENPQkpFQ1RTKSAkKExJQk5BTUUpICQoTERMSUJTKQotCi1kanBlZy5leGU6ICQoRE9CSkVDVFMpICQoTElCTkFNRSkKLQkkKExEKSAkKExERkxBR1MpIC1vdXQ6ZGpwZWcuZXhlICQoRE9CSkVDVFMpICQoTElCTkFNRSkgJChMRExJQlMpCi0KLWpwZWd0cmFuLmV4ZTogJChUUk9CSkVDVFMpICQoTElCTkFNRSkKLQkkKExEKSAkKExERkxBR1MpIC1vdXQ6anBlZ3RyYW4uZXhlICQoVFJPQkpFQ1RTKSAkKExJQk5BTUUpICQoTERMSUJTKQotCi1yZGpwZ2NvbS5leGU6IHJkanBnY29tLm9iagotCSQoTEQpICQoTERGTEFHUykgLW91dDpyZGpwZ2NvbS5leGUgcmRqcGdjb20ub2JqICQoTERMSUJTKQotCi13cmpwZ2NvbS5leGU6IHdyanBnY29tLm9iagotCSQoTEQpICQoTERGTEFHUykgLW91dDp3cmpwZ2NvbS5leGUgd3JqcGdjb20ub2JqICQoTERMSUJTKQotCi0KLWNsZWFuOgotCS0kKFJNKSAqLm9iagotCS0kKFJNKSBjanBlZy5leGUKLQktJChSTSkgZGpwZWcuZXhlCi0JLSQoUk0pIGpwZWd0cmFuLmV4ZQotCS0kKFJNKSByZGpwZ2NvbS5leGUKLQktJChSTSkgd3JqcGdjb20uZXhlCi0JLSQoUk0pIGpzaW1kY2ZnLmluYwotCS0kKFJNKSBqcGVnZGxsLnJlcwotCS0kKFJNKSAkKERMTE5BTUUpCi0JLSQoUk0pICQoRExMTkFNRTouZGxsPS5leHApCi0JLSQoUk0pICQoTElCTkFNRSkKLQktaWYgZXhpc3QgKi5tYW5pZmVzdCAkKFJNKSAqLm1hbmlmZXN0Ci0JLWlmIGV4aXN0IHRlc3RvdXQqICAgJChSTSkgdGVzdG91dCoKLQotdGVzdDogY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUKLQktaWYgZXhpc3QgdGVzdG91dCogJChSTSkgdGVzdG91dCoKLQkuXGRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZwotCS5cZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCi0JLlxjanBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAgdGVzdGltZy5wcG0KLQkuXGRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZwotCS5cY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCi0JLlxqcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCi0JZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KLQlmYyAvYiB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAotCWZjIC9iIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCi0JZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCi0JZmMgL2IgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZwotCWZjIC9iIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKLQotCi1qc2ltZGNmZy5pbmM6IG1ha2VjZmcuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLQkkKENDKSAkKENGTEFHUykgbWFrZWNmZy5jCi0JJChMRCkgJChMREZMQUdTKSAtb3V0Om1ha2VjZmcuZXhlIG1ha2VjZmcub2JqICQoTERMSUJTKQotCS5cbWFrZWNmZy5leGUgPiBqc2ltZGNmZy5pbmMKLQkkKFJNKSBtYWtlY2ZnLm9iagotCSQoUk0pIG1ha2VjZmcuZXhlCi0JaWYgZXhpc3QgbWFrZWNmZy5leGUubWFuaWZlc3QgJChSTSkgbWFrZWNmZy5leGUubWFuaWZlc3QKLQotLmFzbS5vYmo6Ci0JJChOQVNNKSAkKE5BRkxBR1MpIC1vICRAICQ8Ci0KLWpzaW1kY3B1Lm9iajoganNpbWRjcHUuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMKLWpzaW1kdzMyLm9iajoganNpbWR3MzIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMKLWpzaW1kZGpnLm9iajoganNpbWRkamcuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMKLWpjY29sbW14Lm9iajogamNjb2xtbXguYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qY2NvbHNzMi5vYmo6IGpjY29sc3MyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamNzYW1tbXgub2JqOiBqY3NhbW1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpjc2Ftc3MyLm9iajogamNzYW1zczIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZGNvbG1teC5vYmo6IGpkY29sbW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRjb2xzczIub2JqOiBqZGNvbHNzMi5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkbWVybW14Lm9iajogamRtZXJtbXguYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qZG1lcnNzMi5vYmo6IGpkbWVyc3MyLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpjb2xzYW1wLmluYwotamRzYW1tbXgub2JqOiBqZHNhbW1teC5hc20ganNpbWRjZmcuaW5jIGpzaW1kZXh0LmluYyBqY29sc2FtcC5pbmMKLWpkc2Ftc3MyLm9iajogamRzYW1zczIuYXNtIGpzaW1kY2ZnLmluYyBqc2ltZGV4dC5pbmMgamNvbHNhbXAuaW5jCi1qY3FudGludC5vYmo6IGpjcW50aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudGZsdC5vYmo6IGpjcW50Zmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudG1teC5vYmo6IGpjcW50bW14LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudDNkbi5vYmo6IGpjcW50M2RuLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudHMyaS5vYmo6IGpjcW50czJpLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudHNzZS5vYmo6IGpjcW50c3NlLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qY3FudHMyZi5vYmo6IGpjcW50czJmLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZmRjdGludC5vYmo6IGpmZGN0aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZmRjdGZzdC5vYmo6IGpmZGN0ZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZmRjdGZsdC5vYmo6IGpmZGN0Zmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZm1teGludC5vYmo6IGpmbW14aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZm1teGZzdC5vYmo6IGpmbW14ZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZjNkbmZsdC5vYmo6IGpmM2RuZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZnNzMmludC5vYmo6IGpmc3MyaW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZnNzMmZzdC5vYmo6IGpmc3MyZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qZnNzZWZsdC5vYmo6IGpmc3NlZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaWRjdGludC5vYmo6IGppZGN0aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaWRjdGZzdC5vYmo6IGppZGN0ZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaWRjdHJlZC5vYmo6IGppZGN0cmVkLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaWRjdGZsdC5vYmo6IGppZGN0Zmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaW1teGludC5vYmo6IGppbW14aW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaW1teGZzdC5vYmo6IGppbW14ZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaW1teHJlZC5vYmo6IGppbW14cmVkLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaTNkbmZsdC5vYmo6IGppM2RuZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzMmludC5vYmo6IGppc3MyaW50LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzMmZzdC5vYmo6IGppc3MyZnN0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzMnJlZC5vYmo6IGppc3MycmVkLmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzZWZsdC5vYmo6IGppc3NlZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi1qaXNzMmZsdC5vYmo6IGppc3MyZmx0LmFzbSBqc2ltZGNmZy5pbmMganNpbWRleHQuaW5jIGpkY3QuaW5jCi0KLWpzaW1kZ2NjLm9iajoganNpbWRnY2MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotCi1qY2FwaW1pbi5vYmo6IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2FwaXN0ZC5vYmo6IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvZWZjdC5vYmo6IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvbG9yLm9iajogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY29sc2FtcC5oCi1qY2RjdG1nci5vYmo6IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm9iajogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY2luaXQub2JqOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFpbmN0Lm9iajogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFya2VyLm9iajogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFzdGVyLm9iajogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjb21hcGkub2JqOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BhcmFtLm9iajogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwaHVmZi5vYmo6IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjcHJlcGN0Lm9iajogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjc2FtcGxlLm9iajogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamN0cmFucy5vYmo6IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpbWluLm9iajogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpc3RkLm9iajogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXRhZHN0Lm9iajogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRhdGFzcmMub2JqOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGNvZWZjdC5vYmo6IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGNvbG9yLm9iajogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY29sc2FtcC5oCi1qZGRjdG1nci5vYmo6IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamRodWZmLm9iajogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZGlucHV0Lm9iajogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYWluY3Qub2JqOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXJrZXIub2JqOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXN0ZXIub2JqOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtZXJnZS5vYmo6IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamRwaHVmZi5vYmo6IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkcG9zdGN0Lm9iajogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkc2FtcGxlLm9iajogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNvbHNhbXAuaAotamR0cmFucy5vYmo6IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWplcnJvci5vYmo6IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKLSMgamZkY3RmbHQub2JqOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamZkY3Rmc3Qub2JqOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamZkY3RpbnQub2JqOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamlkY3RmbHQub2JqOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamlkY3Rmc3Qub2JqOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamlkY3RpbnQub2JqOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLSMgamlkY3RyZWQub2JqOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpxdWFudDEub2JqOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qcXVhbnQyLm9iajoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanV0aWxzLm9iajoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qbWVtbWdyLm9iajogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1hbnNpLm9iajogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbmFtZS5vYmo6IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5vYnMub2JqOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1kb3Mub2JqOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW1hYy5vYmo6IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1janBlZy5vYmo6IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWRqcGVnLm9iajogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotanBlZ3RyYW4ub2JqOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKLXJkanBnY29tLm9iajogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotd3JqcGdjb20ub2JqOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi1jZGpwZWcub2JqOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkY29sbWFwLm9iajogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkc3dpdGNoLm9iajogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXRyYW5zdXBwLm9iajogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAotcmRwcG0ub2JqOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JwcG0ub2JqOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRnaWYub2JqOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JnaWYub2JqOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmR0YXJnYS5vYmo6IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdydGFyZ2Eub2JqOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGJtcC5vYmo6IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmJtcC5vYmo6IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHJsZS5vYmo6IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnJsZS5vYmo6IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS9uYXNtX2x0LnNoIGIvbmFzbV9sdC5zaApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmRpZmYgLS1naXQgYS9yZGJtcC5jIGIvcmRibXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0NTg0Ny4uMDAwMDAwMAotLS0gYS9yZGJtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDU0ICswLDAgQEAKLS8qCi0gKiByZGJtcC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KLSAqIFRoaXMgZmlsZSBoYXMgYmVlbiBtb2RpZmllZCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLgotICogTGFzdCBNb2RpZmllZCA6IE9jdG9iZXIgMTksIDIwMDQKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byByZWFkIGlucHV0IGltYWdlcyBpbiBNaWNyb3NvZnQgIkJNUCIKLSAqIGZvcm1hdCAoTVMgV2luZG93cyAzLngsIE9TLzIgMS54LCBhbmQgT1MvMiAyLnggZmxhdm9ycykuCi0gKiBDdXJyZW50bHksIG9ubHkgOC1iaXQgYW5kIDI0LWJpdCBpbWFnZXMgYXJlIHN1cHBvcnRlZCwgbm90IDEtYml0IG9yCi0gKiA0LWJpdCAoZmVlZGluZyBzdWNoIGxvdy1kZXB0aCBpbWFnZXMgaW50byBKUEVHIHdvdWxkIGJlIHNpbGx5IGFueXdheSkuCi0gKiBBbHNvLCB3ZSBkb24ndCBzdXBwb3J0IFJMRS1jb21wcmVzc2VkIGZpbGVzLgotICoKLSAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCi0gKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBpbnB1dCBmcm9tCi0gKiBhbiBvcmRpbmFyeSBzdGRpbyBzdHJlYW0uICBUaGV5IGZ1cnRoZXIgYXNzdW1lIHRoYXQgcmVhZGluZyBiZWdpbnMKLSAqIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZTsgc3RhcnRfaW5wdXQgbWF5IG5lZWQgd29yayBpZiB0aGUKLSAqIHVzZXIgaW50ZXJmYWNlIGhhcyBhbHJlYWR5IHJlYWQgc29tZSBkYXRhIChlLmcuLCB0byBkZXRlcm1pbmUgdGhhdAotICogdGhlIGZpbGUgaXMgaW5kZWVkIEJNUCBmb3JtYXQpLgotICoKLSAqIFRoaXMgY29kZSBjb250cmlidXRlZCBieSBKYW1lcyBBcnRodXIgQm91Y2hlci4KLSAqLwotCi0jaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLwotCi0jaWZkZWYgQk1QX1NVUFBPUlRFRAotCi0KLS8qIE1hY3JvcyB0byBkZWFsIHdpdGggdW5zaWduZWQgY2hhcnMgYXMgZWZmaWNpZW50bHkgYXMgY29tcGlsZXIgYWxsb3dzICovCi0KLSNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVX0NIQVI7Ci0jZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpKQotI2Vsc2UgLyogIUhBVkVfVU5TSUdORURfQ0hBUiAqLwotI2lmZGVmIENIQVJfSVNfVU5TSUdORUQKLXR5cGVkZWYgY2hhciBVX0NIQVI7Ci0jZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpKQotI2Vsc2UKLXR5cGVkZWYgY2hhciBVX0NIQVI7Ci0jZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpICYgMHhGRikKLSNlbmRpZgotI2VuZGlmIC8qIEhBVkVfVU5TSUdORURfQ0hBUiAqLwotCi0KLSNkZWZpbmUJUmVhZE9LKGZpbGUsYnVmZmVyLGxlbikJKEpGUkVBRChmaWxlLGJ1ZmZlcixsZW4pID09ICgoc2l6ZV90KSAobGVuKSkpCi0KLQotLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIGRhdGEgc291cmNlIG9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCBfYm1wX3NvdXJjZV9zdHJ1Y3QgKiBibXBfc291cmNlX3B0cjsKLQotdHlwZWRlZiBzdHJ1Y3QgX2JtcF9zb3VyY2Vfc3RydWN0IHsKLSAgc3RydWN0IGNqcGVnX3NvdXJjZV9zdHJ1Y3QgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgal9jb21wcmVzc19wdHIgY2luZm87CQkvKiBiYWNrIGxpbmsgc2F2ZXMgcGFzc2luZyBzZXBhcmF0ZSBwYXJtICovCi0KLSAgSlNBTVBBUlJBWSBjb2xvcm1hcDsJCS8qIEJNUCBjb2xvcm1hcCAoY29udmVydGVkIHRvIG15IGZvcm1hdCkgKi8KLQotICBqdmlydF9zYXJyYXlfcHRyIHdob2xlX2ltYWdlOwkvKiBOZWVkZWQgdG8gcmV2ZXJzZSByb3cgb3JkZXIgKi8KLSAgSkRJTUVOU0lPTiBzb3VyY2Vfcm93OwkvKiBDdXJyZW50IHNvdXJjZSByb3cgbnVtYmVyICovCi0gIEpESU1FTlNJT04gcm93X3dpZHRoOwkJLyogUGh5c2ljYWwgd2lkdGggb2Ygc2NhbmxpbmVzIGluIGZpbGUgKi8KLQotICBpbnQgYml0c19wZXJfcGl4ZWw7CQkvKiByZW1lbWJlcnMgOC0gb3IgMjQtYml0IGZvcm1hdCAqLwotfSBibXBfc291cmNlX3N0cnVjdDsKLQotCi1MT0NBTChpbnQpCi1yZWFkX2J5dGUgKGJtcF9zb3VyY2VfcHRyIHNpbmZvKQotLyogUmVhZCBuZXh0IGJ5dGUgZnJvbSBCTVAgZmlsZSAqLwotewotICByZWdpc3RlciBGSUxFICppbmZpbGUgPSBzaW5mby0+cHViLmlucHV0X2ZpbGU7Ci0gIHJlZ2lzdGVyIGludCBjOwotCi0gIGlmICgoYyA9IGdldGMoaW5maWxlKSkgPT0gRU9GKQotICAgIEVSUkVYSVQoc2luZm8tPmNpbmZvLCBKRVJSX0lOUFVUX0VPRik7Ci0gIHJldHVybiBjOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1yZWFkX2NvbG9ybWFwIChibXBfc291cmNlX3B0ciBzaW5mbywgaW50IGNtYXBsZW4sIGludCBtYXBlbnRyeXNpemUpCi0vKiBSZWFkIHRoZSBjb2xvcm1hcCBmcm9tIGEgQk1QIGZpbGUgKi8KLXsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoIChtYXBlbnRyeXNpemUpIHsKLSAgY2FzZSAzOgotICAgIC8qIEJHUiBmb3JtYXQgKG9jY3VycyBpbiBPUy8yIGZpbGVzKSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBjbWFwbGVuOyBpKyspIHsKLSAgICAgIHNpbmZvLT5jb2xvcm1hcFsyXVtpXSA9IChKU0FNUExFKSByZWFkX2J5dGUoc2luZm8pOwotICAgICAgc2luZm8tPmNvbG9ybWFwWzFdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7Ci0gICAgICBzaW5mby0+Y29sb3JtYXBbMF1baV0gPSAoSlNBTVBMRSkgcmVhZF9ieXRlKHNpbmZvKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgNDoKLSAgICAvKiBCR1IwIGZvcm1hdCAob2NjdXJzIGluIE1TIFdpbmRvd3MgZmlsZXMpICovCi0gICAgZm9yIChpID0gMDsgaSA8IGNtYXBsZW47IGkrKykgewotICAgICAgc2luZm8tPmNvbG9ybWFwWzJdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7Ci0gICAgICBzaW5mby0+Y29sb3JtYXBbMV1baV0gPSAoSlNBTVBMRSkgcmVhZF9ieXRlKHNpbmZvKTsKLSAgICAgIHNpbmZvLT5jb2xvcm1hcFswXVtpXSA9IChKU0FNUExFKSByZWFkX2J5dGUoc2luZm8pOwotICAgICAgKHZvaWQpIHJlYWRfYnl0ZShzaW5mbyk7Ci0gICAgfQotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoc2luZm8tPmNpbmZvLCBKRVJSX0JNUF9CQURDTUFQKTsKLSAgICBicmVhazsKLSAgfQotfQotCi0KLS8qCi0gKiBSZWFkIG9uZSByb3cgb2YgcGl4ZWxzLgotICogVGhlIGltYWdlIGhhcyBiZWVuIHJlYWQgaW50byB0aGUgd2hvbGVfaW1hZ2UgYXJyYXksIGJ1dCBpcyBvdGhlcndpc2UKLSAqIHVucHJvY2Vzc2VkLiAgV2UgbXVzdCByZWFkIGl0IG91dCBpbiB0b3AtdG8tYm90dG9tIHJvdyBvcmRlciwgYW5kIGlmCi0gKiBpdCBpcyBhbiA4LWJpdCBpbWFnZSwgd2UgbXVzdCBleHBhbmQgY29sb3JtYXBwZWQgcGl4ZWxzIHRvIDI0Yml0IGZvcm1hdC4KLSAqLwotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLWdldF84Yml0X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgOC1iaXQgY29sb3JtYXAgaW5kZXhlcyAqLwotewotICBibXBfc291cmNlX3B0ciBzb3VyY2UgPSAoYm1wX3NvdXJjZV9wdHIpIHNpbmZvOwotICByZWdpc3RlciBKU0FNUEFSUkFZIGNvbG9ybWFwID0gc291cmNlLT5jb2xvcm1hcDsKLSAgSlNBTVBBUlJBWSBpbWFnZV9wdHI7Ci0gIHJlZ2lzdGVyIGludCB0OwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLQotICAvKiBGZXRjaCBuZXh0IHJvdyBmcm9tIHZpcnR1YWwgYXJyYXkgKi8KLSAgc291cmNlLT5zb3VyY2Vfcm93LS07Ci0gIGltYWdlX3B0ciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgc291cmNlLT53aG9sZV9pbWFnZSwKLSAgICAgc291cmNlLT5zb3VyY2Vfcm93LCAoSkRJTUVOU0lPTikgMSwgRkFMU0UpOwotCi0gIC8qIEV4cGFuZCB0aGUgY29sb3JtYXAgaW5kZXhlcyB0byByZWFsIGRhdGEgKi8KLSAgaW5wdHIgPSBpbWFnZV9wdHJbMF07Ci0gIG91dHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKLSAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgdCA9IEdFVEpTQU1QTEUoKmlucHRyKyspOwotICAgICpvdXRwdHIrKyA9IGNvbG9ybWFwWzBdW3RdOwkvKiBjYW4gb21pdCBHRVRKU0FNUExFKCkgc2FmZWx5ICovCi0gICAgKm91dHB0cisrID0gY29sb3JtYXBbMV1bdF07Ci0gICAgKm91dHB0cisrID0gY29sb3JtYXBbMl1bdF07Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLWdldF8yNGJpdF9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIDI0LWJpdCBwaXhlbHMgKi8KLXsKLSAgYm1wX3NvdXJjZV9wdHIgc291cmNlID0gKGJtcF9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgSlNBTVBBUlJBWSBpbWFnZV9wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotCi0gIC8qIEZldGNoIG5leHQgcm93IGZyb20gdmlydHVhbCBhcnJheSAqLwotICBzb3VyY2UtPnNvdXJjZV9yb3ctLTsKLSAgaW1hZ2VfcHRyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPndob2xlX2ltYWdlLAotICAgICBzb3VyY2UtPnNvdXJjZV9yb3csIChKRElNRU5TSU9OKSAxLCBGQUxTRSk7Ci0KLSAgLyogVHJhbnNmZXIgZGF0YS4gIE5vdGUgc291cmNlIHZhbHVlcyBhcmUgaW4gQkdSIG9yZGVyCi0gICAqIChldmVuIHRob3VnaCBNaWNyb3NvZnQncyBvd24gZG9jdW1lbnRzIHNheSB0aGUgb3Bwb3NpdGUpLgotICAgKi8KLSAgaW5wdHIgPSBpbWFnZV9wdHJbMF07Ci0gIG91dHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKLSAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgb3V0cHRyWzJdID0gKmlucHRyKys7CS8qIGNhbiBvbWl0IEdFVEpTQU1QTEUoKSBzYWZlbHkgKi8KLSAgICBvdXRwdHJbMV0gPSAqaW5wdHIrKzsKLSAgICBvdXRwdHJbMF0gPSAqaW5wdHIrKzsKLSAgICBvdXRwdHIgKz0gMzsKLSAgfQotCi0gIHJldHVybiAxOwotfQotCi0KLS8qCi0gKiBUaGlzIG1ldGhvZCBsb2FkcyB0aGUgaW1hZ2UgaW50byB3aG9sZV9pbWFnZSBkdXJpbmcgdGhlIGZpcnN0IGNhbGwgb24KLSAqIGdldF9waXhlbF9yb3dzLiAgVGhlIGdldF9waXhlbF9yb3dzIHBvaW50ZXIgaXMgdGhlbiBhZGp1c3RlZCB0byBjYWxsCi0gKiBnZXRfOGJpdF9yb3cgb3IgZ2V0XzI0Yml0X3JvdyBvbiBzdWJzZXF1ZW50IGNhbGxzLgotICovCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotcHJlbG9hZF9pbWFnZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi17Ci0gIGJtcF9zb3VyY2VfcHRyIHNvdXJjZSA9IChibXBfc291cmNlX3B0cikgc2luZm87Ci0jaWYgKEJJVFNfSU5fSlNBTVBMRSAhPSA4KSB8fCBkZWZpbmVkKE5FRURfRkFSX1BPSU5URVJTKQotICByZWdpc3RlciBGSUxFICppbmZpbGUgPSBzb3VyY2UtPnB1Yi5pbnB1dF9maWxlOwotICByZWdpc3RlciBpbnQgYzsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0X3B0cjsKLSAgSkRJTUVOU0lPTiBjb2w7Ci0jZW5kaWYKLSAgSkRJTUVOU0lPTiByb3c7Ci0gIEpTQU1QQVJSQVkgaW1hZ2VfcHRyOwotICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7Ci0KLSAgLyogUmVhZCB0aGUgZGF0YSBpbnRvIGEgdmlydHVhbCBhcnJheSBpbiBpbnB1dC1maWxlIHJvdyBvcmRlci4gKi8KLSAgZm9yIChyb3cgPSAwOyByb3cgPCBjaW5mby0+aW1hZ2VfaGVpZ2h0OyByb3crKykgewotICAgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlciA9IChsb25nKSByb3c7Ci0gICAgICBwcm9ncmVzcy0+cHViLnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPmltYWdlX2hlaWdodDsKLSAgICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgIH0KLSAgICBpbWFnZV9wdHIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgc291cmNlLT53aG9sZV9pbWFnZSwKLSAgICAgICByb3csIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKLSNpZiAoQklUU19JTl9KU0FNUExFID09IDgpICYmICFkZWZpbmVkKE5FRURfRkFSX1BPSU5URVJTKQotICAgIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBpbWFnZV9wdHJbMF0sIHNvdXJjZS0+cm93X3dpZHRoKSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKLSNlbHNlCi0gICAgb3V0X3B0ciA9IGltYWdlX3B0clswXTsKLSAgICBmb3IgKGNvbCA9IHNvdXJjZS0+cm93X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICAgLyogaW5saW5lIGNvcHkgb2YgcmVhZF9ieXRlKCkgZm9yIHNwZWVkICovCi0gICAgICBpZiAoKGMgPSBnZXRjKGluZmlsZSkpID09IEVPRikKLQlFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7Ci0gICAgICAqb3V0X3B0cisrID0gKEpTQU1QTEUpIGM7Ci0gICAgfQotI2VuZGlmCi0gIH0KLSAgaWYgKHByb2dyZXNzICE9IE5VTEwpCi0gICAgcHJvZ3Jlc3MtPmNvbXBsZXRlZF9leHRyYV9wYXNzZXMrKzsKLQotICAvKiBTZXQgdXAgdG8gcmVhZCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5IGluIHRvcC10by1ib3R0b20gb3JkZXIgKi8KLSAgc3dpdGNoIChzb3VyY2UtPmJpdHNfcGVyX3BpeGVsKSB7Ci0gIGNhc2UgODoKLSAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF84Yml0X3JvdzsKLSAgICBicmVhazsKLSAgY2FzZSAyNDoKLSAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF8yNGJpdF9yb3c7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFEREVQVEgpOwotICB9Ci0gIHNvdXJjZS0+c291cmNlX3JvdyA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0KLSAgLyogQW5kIHJlYWQgdGhlIGZpcnN0IHJvdyAqLwotICByZXR1cm4gKCpzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cykgKGNpbmZvLCBzaW5mbyk7Ci19Ci0KLQotLyoKLSAqIFJlYWQgdGhlIGZpbGUgaGVhZGVyOyByZXR1cm4gaW1hZ2Ugc2l6ZSBhbmQgY29tcG9uZW50IGNvdW50LgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfaW5wdXRfYm1wIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLXsKLSAgYm1wX3NvdXJjZV9wdHIgc291cmNlID0gKGJtcF9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgVV9DSEFSIGJtcGZpbGVoZWFkZXJbMTRdOwotICBVX0NIQVIgYm1waW5mb2hlYWRlcls2NF07Ci0jZGVmaW5lIEdFVF8yQihhcnJheSxvZmZzZXQpICAoKHVuc2lnbmVkIGludCkgVUNIKGFycmF5W29mZnNldF0pICsgXAotCQkJICAgICAgICgoKHVuc2lnbmVkIGludCkgVUNIKGFycmF5W29mZnNldCsxXSkpIDw8IDgpKQotI2RlZmluZSBHRVRfNEIoYXJyYXksb2Zmc2V0KSAgKChJTlQzMikgVUNIKGFycmF5W29mZnNldF0pICsgXAotCQkJICAgICAgICgoKElOVDMyKSBVQ0goYXJyYXlbb2Zmc2V0KzFdKSkgPDwgOCkgKyBcCi0JCQkgICAgICAgKCgoSU5UMzIpIFVDSChhcnJheVtvZmZzZXQrMl0pKSA8PCAxNikgKyBcCi0JCQkgICAgICAgKCgoSU5UMzIpIFVDSChhcnJheVtvZmZzZXQrM10pKSA8PCAyNCkpCi0gIElOVDMyIGJmT2ZmQml0czsKLSAgSU5UMzIgaGVhZGVyU2l6ZTsKLSAgSU5UMzIgYmlXaWR0aCA9IDA7CQkvKiBpbml0aWFsaXplIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcgKi8KLSAgSU5UMzIgYmlIZWlnaHQgPSAwOwotICB1bnNpZ25lZCBpbnQgYmlQbGFuZXM7Ci0gIElOVDMyIGJpQ29tcHJlc3Npb247Ci0gIElOVDMyIGJpWFBlbHNQZXJNZXRlcixiaVlQZWxzUGVyTWV0ZXI7Ci0gIElOVDMyIGJpQ2xyVXNlZCA9IDA7Ci0gIGludCBtYXBlbnRyeXNpemUgPSAwOwkJLyogMCBpbmRpY2F0ZXMgbm8gY29sb3JtYXAgKi8KLSAgSU5UMzIgYlBhZDsKLSAgSkRJTUVOU0lPTiByb3dfd2lkdGg7Ci0KLSAgLyogUmVhZCBhbmQgdmVyaWZ5IHRoZSBiaXRtYXAgZmlsZSBoZWFkZXIgKi8KLSAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIGJtcGZpbGVoZWFkZXIsIDE0KSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7Ci0gIGlmIChHRVRfMkIoYm1wZmlsZWhlYWRlciwwKSAhPSAweDRENDIpIC8qICdCTScgKi8KLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9OT1QpOwotICBiZk9mZkJpdHMgPSAoSU5UMzIpIEdFVF80QihibXBmaWxlaGVhZGVyLDEwKTsKLSAgLyogV2UgaWdub3JlIHRoZSByZW1haW5pbmcgZmlsZWhlYWRlciBmaWVsZHMgKi8KLQotICAvKiBUaGUgaW5mb2hlYWRlciBtaWdodCBiZSAxMiBieXRlcyAoT1MvMiAxLngpLCA0MCBieXRlcyAoV2luZG93cyksCi0gICAqIG9yIDY0IGJ5dGVzIChPUy8yIDIueCkuICBDaGVjayB0aGUgZmlyc3QgNCBieXRlcyB0byBmaW5kIG91dCB3aGljaC4KLSAgICovCi0gIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBibXBpbmZvaGVhZGVyLCA0KSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7Ci0gIGhlYWRlclNpemUgPSAoSU5UMzIpIEdFVF80QihibXBpbmZvaGVhZGVyLDApOwotICBpZiAoaGVhZGVyU2l6ZSA8IDEyIHx8IGhlYWRlclNpemUgPiA2NCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURIRUFERVIpOwotICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgYm1waW5mb2hlYWRlcis0LCBoZWFkZXJTaXplLTQpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKLQotICBzd2l0Y2ggKChpbnQpIGhlYWRlclNpemUpIHsKLSAgY2FzZSAxMjoKLSAgICAvKiBEZWNvZGUgT1MvMiAxLnggaGVhZGVyIChNaWNyb3NvZnQgY2FsbHMgdGhpcyBhIEJJVE1BUENPUkVIRUFERVIpICovCi0gICAgYmlXaWR0aCA9IChJTlQzMikgR0VUXzJCKGJtcGluZm9oZWFkZXIsNCk7Ci0gICAgYmlIZWlnaHQgPSAoSU5UMzIpIEdFVF8yQihibXBpbmZvaGVhZGVyLDYpOwotICAgIGJpUGxhbmVzID0gR0VUXzJCKGJtcGluZm9oZWFkZXIsOCk7Ci0gICAgc291cmNlLT5iaXRzX3Blcl9waXhlbCA9IChpbnQpIEdFVF8yQihibXBpbmZvaGVhZGVyLDEwKTsKLQotICAgIHN3aXRjaCAoc291cmNlLT5iaXRzX3Blcl9waXhlbCkgewotICAgIGNhc2UgODoJCQkvKiBjb2xvcm1hcHBlZCBpbWFnZSAqLwotICAgICAgbWFwZW50cnlzaXplID0gMzsJCS8qIE9TLzIgdXNlcyBSR0JUUklQTEUgY29sb3JtYXAgKi8KLSAgICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0JNUF9PUzJfTUFQUEVELCAoaW50KSBiaVdpZHRoLCAoaW50KSBiaUhlaWdodCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgkJCS8qIFJHQiBpbWFnZSAqLwotICAgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfQk1QX09TMiwgKGludCkgYmlXaWR0aCwgKGludCkgYmlIZWlnaHQpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX0JBRERFUFRIKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoYmlQbGFuZXMgIT0gMSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX0JBRFBMQU5FUyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgNDA6Ci0gIGNhc2UgNjQ6Ci0gICAgLyogRGVjb2RlIFdpbmRvd3MgMy54IGhlYWRlciAoTWljcm9zb2Z0IGNhbGxzIHRoaXMgYSBCSVRNQVBJTkZPSEVBREVSKSAqLwotICAgIC8qIG9yIE9TLzIgMi54IGhlYWRlciwgd2hpY2ggaGFzIGFkZGl0aW9uYWwgZmllbGRzIHRoYXQgd2UgaWdub3JlICovCi0gICAgYmlXaWR0aCA9IEdFVF80QihibXBpbmZvaGVhZGVyLDQpOwotICAgIGJpSGVpZ2h0ID0gR0VUXzRCKGJtcGluZm9oZWFkZXIsOCk7Ci0gICAgYmlQbGFuZXMgPSBHRVRfMkIoYm1waW5mb2hlYWRlciwxMik7Ci0gICAgc291cmNlLT5iaXRzX3Blcl9waXhlbCA9IChpbnQpIEdFVF8yQihibXBpbmZvaGVhZGVyLDE0KTsKLSAgICBiaUNvbXByZXNzaW9uID0gR0VUXzRCKGJtcGluZm9oZWFkZXIsMTYpOwotICAgIGJpWFBlbHNQZXJNZXRlciA9IEdFVF80QihibXBpbmZvaGVhZGVyLDI0KTsKLSAgICBiaVlQZWxzUGVyTWV0ZXIgPSBHRVRfNEIoYm1waW5mb2hlYWRlciwyOCk7Ci0gICAgYmlDbHJVc2VkID0gR0VUXzRCKGJtcGluZm9oZWFkZXIsMzIpOwotICAgIC8qIGJpU2l6ZUltYWdlLCBiaUNsckltcG9ydGFudCBmaWVsZHMgYXJlIGlnbm9yZWQgKi8KLQotICAgIHN3aXRjaCAoc291cmNlLT5iaXRzX3Blcl9waXhlbCkgewotICAgIGNhc2UgODoJCQkvKiBjb2xvcm1hcHBlZCBpbWFnZSAqLwotICAgICAgbWFwZW50cnlzaXplID0gNDsJCS8qIFdpbmRvd3MgdXNlcyBSR0JRVUFEIGNvbG9ybWFwICovCi0gICAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19CTVBfTUFQUEVELCAoaW50KSBiaVdpZHRoLCAoaW50KSBiaUhlaWdodCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgkJCS8qIFJHQiBpbWFnZSAqLwotICAgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfQk1QLCAoaW50KSBiaVdpZHRoLCAoaW50KSBiaUhlaWdodCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFEREVQVEgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChiaVBsYW5lcyAhPSAxKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFEUExBTkVTKTsKLSAgICBpZiAoYmlDb21wcmVzc2lvbiAhPSAwKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQ09NUFJFU1NFRCk7Ci0KLSAgICBpZiAoYmlYUGVsc1Blck1ldGVyID4gMCAmJiBiaVlQZWxzUGVyTWV0ZXIgPiAwKSB7Ci0gICAgICAvKiBTZXQgSkZJRiBkZW5zaXR5IHBhcmFtZXRlcnMgZnJvbSB0aGUgQk1QIGRhdGEgKi8KLSAgICAgIGNpbmZvLT5YX2RlbnNpdHkgPSAoVUlOVDE2KSAoYmlYUGVsc1Blck1ldGVyLzEwMCk7IC8qIDEwMCBjbSBwZXIgbWV0ZXIgKi8KLSAgICAgIGNpbmZvLT5ZX2RlbnNpdHkgPSAoVUlOVDE2KSAoYmlZUGVsc1Blck1ldGVyLzEwMCk7Ci0gICAgICBjaW5mby0+ZGVuc2l0eV91bml0ID0gMjsJLyogZG90cy9jbSAqLwotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURIRUFERVIpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogQ29tcHV0ZSBkaXN0YW5jZSB0byBiaXRtYXAgZGF0YSAtLS0gd2lsbCBhZGp1c3QgZm9yIGNvbG9ybWFwIGJlbG93ICovCi0gIGJQYWQgPSBiZk9mZkJpdHMgLSAoaGVhZGVyU2l6ZSArIDE0KTsKLQotICAvKiBSZWFkIHRoZSBjb2xvcm1hcCwgaWYgYW55ICovCi0gIGlmIChtYXBlbnRyeXNpemUgPiAwKSB7Ci0gICAgaWYgKGJpQ2xyVXNlZCA8PSAwKQotICAgICAgYmlDbHJVc2VkID0gMjU2OwkJLyogYXNzdW1lIGl0J3MgMjU2ICovCi0gICAgZWxzZSBpZiAoYmlDbHJVc2VkID4gMjU2KQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFEQ01BUCk7Ci0gICAgLyogQWxsb2NhdGUgc3BhY2UgdG8gc3RvcmUgdGhlIGNvbG9ybWFwICovCi0gICAgc291cmNlLT5jb2xvcm1hcCA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLSAgICAgICAoSkRJTUVOU0lPTikgYmlDbHJVc2VkLCAoSkRJTUVOU0lPTikgMyk7Ci0gICAgLyogYW5kIHJlYWQgaXQgZnJvbSB0aGUgZmlsZSAqLwotICAgIHJlYWRfY29sb3JtYXAoc291cmNlLCAoaW50KSBiaUNsclVzZWQsIG1hcGVudHJ5c2l6ZSk7Ci0gICAgLyogYWNjb3VudCBmb3Igc2l6ZSBvZiBjb2xvcm1hcCAqLwotICAgIGJQYWQgLT0gYmlDbHJVc2VkICogbWFwZW50cnlzaXplOwotICB9Ci0KLSAgLyogU2tpcCBhbnkgcmVtYWluaW5nIHBhZCBieXRlcyAqLwotICBpZiAoYlBhZCA8IDApCQkJLyogaW5jb3JyZWN0IGJmT2ZmQml0cyB2YWx1ZT8gKi8KLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURIRUFERVIpOwotICB3aGlsZSAoLS1iUGFkID49IDApIHsKLSAgICAodm9pZCkgcmVhZF9ieXRlKHNvdXJjZSk7Ci0gIH0KLQotICAvKiBDb21wdXRlIHJvdyB3aWR0aCBpbiBmaWxlLCBpbmNsdWRpbmcgcGFkZGluZyB0byA0LWJ5dGUgYm91bmRhcnkgKi8KLSAgaWYgKHNvdXJjZS0+Yml0c19wZXJfcGl4ZWwgPT0gMjQpCi0gICAgcm93X3dpZHRoID0gKEpESU1FTlNJT04pIChiaVdpZHRoICogMyk7Ci0gIGVsc2UKLSAgICByb3dfd2lkdGggPSAoSkRJTUVOU0lPTikgYmlXaWR0aDsKLSAgd2hpbGUgKChyb3dfd2lkdGggJiAzKSAhPSAwKSByb3dfd2lkdGgrKzsKLSAgc291cmNlLT5yb3dfd2lkdGggPSByb3dfd2lkdGg7Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIGludmVyc2lvbiBhcnJheSwgcHJlcGFyZSBmb3IgcHJlbG9hZCBwYXNzICovCi0gIHNvdXJjZS0+d2hvbGVfaW1hZ2UgPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCi0gICAgIHJvd193aWR0aCwgKEpESU1FTlNJT04pIGJpSGVpZ2h0LCAoSkRJTUVOU0lPTikgMSk7Ci0gIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gcHJlbG9hZF9pbWFnZTsKLSAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOwotICAgIHByb2dyZXNzLT50b3RhbF9leHRyYV9wYXNzZXMrKzsgLyogY291bnQgZmlsZSBpbnB1dCBhcyBzZXBhcmF0ZSBwYXNzICovCi0gIH0KLQotICAvKiBBbGxvY2F0ZSBvbmUtcm93IGJ1ZmZlciBmb3IgcmV0dXJuZWQgZGF0YSAqLwotICBzb3VyY2UtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAoSkRJTUVOU0lPTikgKGJpV2lkdGggKiAzKSwgKEpESU1FTlNJT04pIDEpOwotICBzb3VyY2UtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKLQotICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOwotICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IDM7Ci0gIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiA9IDg7Ci0gIGNpbmZvLT5pbWFnZV93aWR0aCA9IChKRElNRU5TSU9OKSBiaVdpZHRoOwotICBjaW5mby0+aW1hZ2VfaGVpZ2h0ID0gKEpESU1FTlNJT04pIGJpSGVpZ2h0OwotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9pbnB1dF9ibXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotewotICAvKiBubyB3b3JrICovCi19Ci0KLQotLyoKLSAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIEJNUCBmb3JtYXQgaW5wdXQuCi0gKi8KLQotR0xPQkFMKGNqcGVnX3NvdXJjZV9wdHIpCi1qaW5pdF9yZWFkX2JtcCAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGJtcF9zb3VyY2VfcHRyIHNvdXJjZTsKLQotICAvKiBDcmVhdGUgbW9kdWxlIGludGVyZmFjZSBvYmplY3QgKi8KLSAgc291cmNlID0gKGJtcF9zb3VyY2VfcHRyKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIFNJWkVPRihibXBfc291cmNlX3N0cnVjdCkpOwotICBzb3VyY2UtPmNpbmZvID0gY2luZm87CS8qIG1ha2UgYmFjayBsaW5rIGZvciBzdWJyb3V0aW5lcyAqLwotICAvKiBGaWxsIGluIG1ldGhvZCBwdHJzLCBleGNlcHQgZ2V0X3BpeGVsX3Jvd3Mgd2hpY2ggc3RhcnRfaW5wdXQgc2V0cyAqLwotICBzb3VyY2UtPnB1Yi5zdGFydF9pbnB1dCA9IHN0YXJ0X2lucHV0X2JtcDsKLSAgc291cmNlLT5wdWIuZmluaXNoX2lucHV0ID0gZmluaXNoX2lucHV0X2JtcDsKLQotICByZXR1cm4gKGNqcGVnX3NvdXJjZV9wdHIpIHNvdXJjZTsKLX0KLQotI2VuZGlmIC8qIEJNUF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL3JkY29sbWFwLmMgYi9yZGNvbG1hcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmIzNDM3Li4wMDAwMDAwCi0tLSBhL3JkY29sbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoKLSAqIHJkY29sbWFwLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGRqcGVnJ3MgIi1tYXAgZmlsZSIgc3dpdGNoLiAgSXQgcmVhZHMgYSBzb3VyY2UgaW1hZ2UKLSAqIGFuZCBjb25zdHJ1Y3RzIGEgY29sb3JtYXAgdG8gYmUgc3VwcGxpZWQgdG8gdGhlIEpQRUcgZGVjb21wcmVzc29yLgotICoKLSAqIEN1cnJlbnRseSwgdGhlc2UgZmlsZSBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQgZm9yIHRoZSBtYXAgZmlsZToKLSAqICAgR0lGOiB0aGUgY29udGVudHMgb2YgdGhlIEdJRidzIGdsb2JhbCBjb2xvcm1hcCBhcmUgdXNlZC4KLSAqICAgUFBNIChlaXRoZXIgdGV4dCBvciByYXcgZmxhdm9yKTogdGhlIGVudGlyZSBmaWxlIGlzIHJlYWQgYW5kCi0gKiAgICAgIGVhY2ggdW5pcXVlIHBpeGVsIHZhbHVlIGlzIGVudGVyZWQgaW4gdGhlIG1hcC4KLSAqIE5vdGUgdGhhdCByZWFkaW5nIGEgbGFyZ2UgUFBNIGZpbGUgd2lsbCBiZSBob3JyZW5kb3VzbHkgc2xvdy4KLSAqIFR5cGljYWxseSwgYSBQUE0tZm9ybWF0IG1hcCBmaWxlIHNob3VsZCBjb250YWluIGp1c3Qgb25lIHBpeGVsCi0gKiBvZiBlYWNoIGRlc2lyZWQgY29sb3IuICBTdWNoIGEgZmlsZSBjYW4gYmUgZXh0cmFjdGVkIGZyb20gYW4KLSAqIG9yZGluYXJ5IGltYWdlIFBQTSBmaWxlIHdpdGggcHBtdG9tYXAoMSkuCi0gKgotICogUmVzY2FsaW5nIGEgUFBNIHRoYXQgaGFzIGEgbWF4dmFsIHVuZXF1YWwgdG8gTUFYSlNBTVBMRSBpcyBub3QKLSAqIGN1cnJlbnRseSBpbXBsZW1lbnRlZC4KLSAqLwotCi0jaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLwotCi0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECS8qIG90aGVyd2lzZSBjYW4ndCBxdWFudGl6ZSB0byBzdXBwbGllZCBtYXAgKi8KLQotLyogUG9ydGlvbnMgb2YgdGhpcyBjb2RlIGFyZSBiYXNlZCBvbiB0aGUgUEJNUExVUyBsaWJyYXJ5LCB3aGljaCBpczoKLSoqCi0qKiBDb3B5cmlnaHQgKEMpIDE5ODggYnkgSmVmIFBvc2thbnplci4KLSoqCi0qKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSoqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQKLSoqIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0qKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0qKiBkb2N1bWVudGF0aW9uLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvcgotKiogaW1wbGllZCB3YXJyYW50eS4KLSovCi0KLQotLyoKLSAqIEFkZCBhIChwb3RlbnRpYWxseSkgbmV3IGNvbG9yIHRvIHRoZSBjb2xvciBtYXAuCi0gKi8KLQotTE9DQUwodm9pZCkKLWFkZF9tYXBfZW50cnkgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBSLCBpbnQgRywgaW50IEIpCi17Ci0gIEpTQU1QUk9XIGNvbG9ybWFwMCA9IGNpbmZvLT5jb2xvcm1hcFswXTsKLSAgSlNBTVBST1cgY29sb3JtYXAxID0gY2luZm8tPmNvbG9ybWFwWzFdOwotICBKU0FNUFJPVyBjb2xvcm1hcDIgPSBjaW5mby0+Y29sb3JtYXBbMl07Ci0gIGludCBuY29sb3JzID0gY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOwotICBpbnQgaW5kZXg7Ci0KLSAgLyogQ2hlY2sgZm9yIGR1cGxpY2F0ZSBjb2xvci4gKi8KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbmNvbG9yczsgaW5kZXgrKykgewotICAgIGlmIChHRVRKU0FNUExFKGNvbG9ybWFwMFtpbmRleF0pID09IFIgJiYKLQlHRVRKU0FNUExFKGNvbG9ybWFwMVtpbmRleF0pID09IEcgJiYKLQlHRVRKU0FNUExFKGNvbG9ybWFwMltpbmRleF0pID09IEIpCi0gICAgICByZXR1cm47CQkJLyogY29sb3IgaXMgYWxyZWFkeSBpbiBtYXAgKi8KLSAgfQotCi0gIC8qIENoZWNrIGZvciBtYXAgb3ZlcmZsb3cuICovCi0gIGlmIChuY29sb3JzID49IChNQVhKU0FNUExFKzEpKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1FVQU5UX01BTllfQ09MT1JTLCAoTUFYSlNBTVBMRSsxKSk7Ci0KLSAgLyogT0ssIGFkZCBjb2xvciB0byBtYXAuICovCi0gIGNvbG9ybWFwMFtuY29sb3JzXSA9IChKU0FNUExFKSBSOwotICBjb2xvcm1hcDFbbmNvbG9yc10gPSAoSlNBTVBMRSkgRzsKLSAgY29sb3JtYXAyW25jb2xvcnNdID0gKEpTQU1QTEUpIEI7Ci0gIGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycysrOwotfQotCi0KLS8qCi0gKiBFeHRyYWN0IGNvbG9yIG1hcCBmcm9tIGEgR0lGIGZpbGUuCi0gKi8KLQotTE9DQUwodm9pZCkKLXJlYWRfZ2lmX21hcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkKLXsKLSAgaW50IGhlYWRlclsxM107Ci0gIGludCBpLCBjb2xvcm1hcGxlbjsKLSAgaW50IFIsIEcsIEI7Ci0KLSAgLyogSW5pdGlhbCAnRycgaGFzIGFscmVhZHkgYmVlbiByZWFkIGJ5IHJlYWRfY29sb3JfbWFwICovCi0gIC8qIFJlYWQgdGhlIHJlc3Qgb2YgdGhlIEdJRiBoZWFkZXIgYW5kIGxvZ2ljYWwgc2NyZWVuIGRlc2NyaXB0b3IgKi8KLSAgZm9yIChpID0gMTsgaSA8IDEzOyBpKyspIHsKLSAgICBpZiAoKGhlYWRlcltpXSA9IGdldGMoaW5maWxlKSkgPT0gRU9GKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKLSAgfQotCi0gIC8qIFZlcmlmeSBHSUYgSGVhZGVyICovCi0gIGlmIChoZWFkZXJbMV0gIT0gJ0knIHx8IGhlYWRlclsyXSAhPSAnRicpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKLQotICAvKiBUaGVyZSBtdXN0IGJlIGEgZ2xvYmFsIGNvbG9yIG1hcC4gKi8KLSAgaWYgKChoZWFkZXJbMTBdICYgMHg4MCkgPT0gMCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOwotCi0gIC8qIE9LLCBmZXRjaCBpdC4gKi8KLSAgY29sb3JtYXBsZW4gPSAyIDw8IChoZWFkZXJbMTBdICYgMHgwNyk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvbG9ybWFwbGVuOyBpKyspIHsKLSAgICBSID0gZ2V0YyhpbmZpbGUpOwotICAgIEcgPSBnZXRjKGluZmlsZSk7Ci0gICAgQiA9IGdldGMoaW5maWxlKTsKLSAgICBpZiAoUiA9PSBFT0YgfHwgRyA9PSBFT0YgfHwgQiA9PSBFT0YpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOwotICAgIGFkZF9tYXBfZW50cnkoY2luZm8sCi0JCSAgUiA8PCAoQklUU19JTl9KU0FNUExFLTgpLAotCQkgIEcgPDwgKEJJVFNfSU5fSlNBTVBMRS04KSwKLQkJICBCIDw8IChCSVRTX0lOX0pTQU1QTEUtOCkpOwotICB9Ci19Ci0KLQotLyogU3VwcG9ydCByb3V0aW5lcyBmb3IgcmVhZGluZyBQUE0gKi8KLQotCi1MT0NBTChpbnQpCi1wYm1fZ2V0YyAoRklMRSAqIGluZmlsZSkKLS8qIFJlYWQgbmV4dCBjaGFyLCBza2lwcGluZyBvdmVyIGFueSBjb21tZW50cyAqLwotLyogQSBjb21tZW50L25ld2xpbmUgc2VxdWVuY2UgaXMgcmV0dXJuZWQgYXMgYSBuZXdsaW5lICovCi17Ci0gIHJlZ2lzdGVyIGludCBjaDsKLSAgCi0gIGNoID0gZ2V0YyhpbmZpbGUpOwotICBpZiAoY2ggPT0gJyMnKSB7Ci0gICAgZG8gewotICAgICAgY2ggPSBnZXRjKGluZmlsZSk7Ci0gICAgfSB3aGlsZSAoY2ggIT0gJ1xuJyAmJiBjaCAhPSBFT0YpOwotICB9Ci0gIHJldHVybiBjaDsKLX0KLQotCi1MT0NBTCh1bnNpZ25lZCBpbnQpCi1yZWFkX3BibV9pbnRlZ2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogaW5maWxlKQotLyogUmVhZCBhbiB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIgZnJvbSB0aGUgUFBNIGZpbGUgKi8KLS8qIFN3YWxsb3dzIG9uZSB0cmFpbGluZyBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGludGVnZXIgKi8KLS8qIE5vdGUgdGhhdCBvbiBhIDE2LWJpdC1pbnQgbWFjaGluZSwgb25seSB2YWx1ZXMgdXAgdG8gNjRrIGNhbiBiZSByZWFkLiAqLwotLyogVGhpcyBzaG91bGQgbm90IGJlIGEgcHJvYmxlbSBpbiBwcmFjdGljZS4gKi8KLXsKLSAgcmVnaXN0ZXIgaW50IGNoOwotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgdmFsOwotICAKLSAgLyogU2tpcCBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gIGRvIHsKLSAgICBjaCA9IHBibV9nZXRjKGluZmlsZSk7Ci0gICAgaWYgKGNoID09IEVPRikKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7Ci0gIH0gd2hpbGUgKGNoID09ICcgJyB8fCBjaCA9PSAnXHQnIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJyk7Ci0gIAotICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKLSAgCi0gIHZhbCA9IGNoIC0gJzAnOwotICB3aGlsZSAoKGNoID0gcGJtX2dldGMoaW5maWxlKSkgPj0gJzAnICYmIGNoIDw9ICc5JykgewotICAgIHZhbCAqPSAxMDsKLSAgICB2YWwgKz0gY2ggLSAnMCc7Ci0gIH0KLSAgcmV0dXJuIHZhbDsKLX0KLQotCi0vKgotICogRXh0cmFjdCBjb2xvciBtYXAgZnJvbSBhIFBQTSBmaWxlLgotICovCi0KLUxPQ0FMKHZvaWQpCi1yZWFkX3BwbV9tYXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBpbmZpbGUpCi17Ci0gIGludCBjOwotICB1bnNpZ25lZCBpbnQgdywgaCwgbWF4dmFsLCByb3csIGNvbDsKLSAgaW50IFIsIEcsIEI7Ci0KLSAgLyogSW5pdGlhbCAnUCcgaGFzIGFscmVhZHkgYmVlbiByZWFkIGJ5IHJlYWRfY29sb3JfbWFwICovCi0gIGMgPSBnZXRjKGluZmlsZSk7CQkvKiBzYXZlIGZvcm1hdCBkaXNjcmltaW5hdG9yIGZvciBhIHNlYyAqLwotCi0gIC8qIHdoaWxlIHdlIGZldGNoIHRoZSByZW1haW5pbmcgaGVhZGVyIGluZm8gKi8KLSAgdyA9IHJlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSk7Ci0gIGggPSByZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpOwotICBtYXh2YWwgPSByZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpOwotCi0gIGlmICh3IDw9IDAgfHwgaCA8PSAwIHx8IG1heHZhbCA8PSAwKSAvKiBlcnJvciBjaGVjayAqLwotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7Ci0KLSAgLyogRm9yIG5vdywgd2UgZG9uJ3Qgc3VwcG9ydCByZXNjYWxpbmcgZnJvbSBhbiB1bnVzdWFsIG1heHZhbC4gKi8KLSAgaWYgKG1heHZhbCAhPSAodW5zaWduZWQgaW50KSBNQVhKU0FNUExFKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7Ci0KLSAgc3dpdGNoIChjKSB7Ci0gIGNhc2UgJzMnOgkJCS8qIGl0J3MgYSB0ZXh0LWZvcm1hdCBQUE0gZmlsZSAqLwotICAgIGZvciAocm93ID0gMDsgcm93IDwgaDsgcm93KyspIHsKLSAgICAgIGZvciAoY29sID0gMDsgY29sIDwgdzsgY29sKyspIHsKLQlSID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKTsKLQlHID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKTsKLQlCID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKTsKLQlhZGRfbWFwX2VudHJ5KGNpbmZvLCBSLCBHLCBCKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAnNic6CQkJLyogaXQncyBhIHJhdy1mb3JtYXQgUFBNIGZpbGUgKi8KLSAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IGg7IHJvdysrKSB7Ci0gICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHc7IGNvbCsrKSB7Ci0JUiA9IGdldGMoaW5maWxlKTsKLQlHID0gZ2V0YyhpbmZpbGUpOwotCUIgPSBnZXRjKGluZmlsZSk7Ci0JaWYgKFIgPT0gRU9GIHx8IEcgPT0gRU9GIHx8IEIgPT0gRU9GKQotCSAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKLQlhZGRfbWFwX2VudHJ5KGNpbmZvLCBSLCBHLCBCKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLQotLyoKLSAqIE1haW4gZW50cnkgcG9pbnQgZnJvbSBkanBlZy5jLgotICogIElucHV0OiBvcGVuZWQgaW5wdXQgZmlsZSAoZnJvbSBmaWxlIG5hbWUgYXJndW1lbnQgb24gY29tbWFuZCBsaW5lKS4KLSAqICBPdXRwdXQ6IGNvbG9ybWFwIGFuZCBhY3R1YWxfbnVtYmVyX29mX2NvbG9ycyBmaWVsZHMgYXJlIHNldCBpbiBjaW5mby4KLSAqLwotCi1HTE9CQUwodm9pZCkKLXJlYWRfY29sb3JfbWFwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogaW5maWxlKQotewotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSBjb2xvciBtYXAgb2YgbWF4aW11bSBzdXBwb3J0ZWQgc2l6ZS4gKi8KLSAgY2luZm8tPmNvbG9ybWFwID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLSAgICAgKEpESU1FTlNJT04pIChNQVhKU0FNUExFKzEpLCAoSkRJTUVOU0lPTikgMyk7Ci0gIGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycyA9IDA7IC8qIGluaXRpYWxpemUgbWFwIHRvIGVtcHR5ICovCi0KLSAgLyogUmVhZCBmaXJzdCBieXRlIHRvIGRldGVybWluZSBmaWxlIGZvcm1hdCAqLwotICBzd2l0Y2ggKGdldGMoaW5maWxlKSkgewotICBjYXNlICdHJzoKLSAgICByZWFkX2dpZl9tYXAoY2luZm8sIGluZmlsZSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgJ1AnOgotICAgIHJlYWRfcHBtX21hcChjaW5mbywgaW5maWxlKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLSNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL3JkZ2lmLmMgYi9yZGdpZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGEyNTE1Li4wMDAwMDAwCi0tLSBhL3JkZ2lmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ODMgKzAsMCBAQAotLyoKLSAqIHJkZ2lmLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogV0FSTklORzogWW91IHdpbGwgbmVlZCBhbiBMWlcgcGF0ZW50IGxpY2Vuc2UgZnJvbSBVbmlzeXMgaW4gb3JkZXIgdG8gICAqCi0gKiB1c2UgdGhpcyBmaWxlIGxlZ2FsbHkgaW4gYW55IGNvbW1lcmNpYWwgb3Igc2hhcmV3YXJlIGFwcGxpY2F0aW9uLiAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byByZWFkIGlucHV0IGltYWdlcyBpbiBHSUYgZm9ybWF0LgotICoKLSAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCi0gKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBpbnB1dCBmcm9tCi0gKiBhbiBvcmRpbmFyeSBzdGRpbyBzdHJlYW0uICBUaGV5IGZ1cnRoZXIgYXNzdW1lIHRoYXQgcmVhZGluZyBiZWdpbnMKLSAqIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZTsgaW5wdXRfaW5pdCBtYXkgbmVlZCB3b3JrIGlmIHRoZQotICogdXNlciBpbnRlcmZhY2UgaGFzIGFscmVhZHkgcmVhZCBzb21lIGRhdGEgKGUuZy4sIHRvIGRldGVybWluZSB0aGF0Ci0gKiB0aGUgZmlsZSBpcyBpbmRlZWQgR0lGIGZvcm1hdCkuCi0gKi8KLQotLyoKLSAqIFRoaXMgY29kZSBpcyBsb29zZWx5IGJhc2VkIG9uIGdpZnRvcHBtIGZyb20gdGhlIFBCTVBMVVMgZGlzdHJpYnV0aW9uCi0gKiBvZiBGZWIuIDE5OTEuICBUaGF0IGZpbGUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgbm90aWNlOgotICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiB8IENvcHlyaWdodCAxOTkwLCBEYXZpZCBLb2JsYXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlICAgfAotICogfCAgIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSB8Ci0gKiB8ICAgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIHwKLSAqIHwgICBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiAgfAotICogfCAgIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgVGhpcyBzb2Z0d2FyZSBpcyAgICB8Ci0gKiB8ICAgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4gICAgICAgICAgIHwKLSAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICoKLSAqIFdlIGFyZSBhbHNvIHJlcXVpcmVkIHRvIHN0YXRlIHRoYXQKLSAqICAgICJUaGUgR3JhcGhpY3MgSW50ZXJjaGFuZ2UgRm9ybWF0KGMpIGlzIHRoZSBDb3B5cmlnaHQgcHJvcGVydHkgb2YKLSAqICAgIENvbXB1U2VydmUgSW5jb3Jwb3JhdGVkLiBHSUYoc20pIGlzIGEgU2VydmljZSBNYXJrIHByb3BlcnR5IG9mCi0gKiAgICBDb21wdVNlcnZlIEluY29ycG9yYXRlZC4iCi0gKi8KLQotI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KLQotI2lmZGVmIEdJRl9TVVBQT1JURUQKLQotCi0jZGVmaW5lCU1BWENPTE9STUFQU0laRQkyNTYJLyogbWF4ICMgb2YgY29sb3JzIGluIGEgR0lGIGNvbG9ybWFwICovCi0jZGVmaW5lIE5VTUNPTE9SUwkzCS8qICMgb2YgY29sb3JzICovCi0jZGVmaW5lIENNX1JFRAkJMAkvKiBjb2xvciBjb21wb25lbnQgbnVtYmVycyAqLwotI2RlZmluZSBDTV9HUkVFTgkxCi0jZGVmaW5lIENNX0JMVUUJCTIKLQotI2RlZmluZQlNQVhfTFpXX0JJVFMJMTIJLyogbWF4aW11bSBMWlcgY29kZSBzaXplICovCi0jZGVmaW5lIExaV19UQUJMRV9TSVpFCSgxPDxNQVhfTFpXX0JJVFMpIC8qICMgb2YgcG9zc2libGUgTFpXIHN5bWJvbHMgKi8KLQotLyogTWFjcm9zIGZvciBleHRyYWN0aW5nIGhlYWRlciBkYXRhIC0tLSBub3RlIHdlIGFzc3VtZSBjaGFycyBtYXkgYmUgc2lnbmVkICovCi0KLSNkZWZpbmUgTE1fdG9fdWludChhLGIpCQkoKCgoYikmMHhGRikgPDwgOCkgfCAoKGEpJjB4RkYpKQotCi0jZGVmaW5lIEJpdFNldChieXRlLCBiaXQpCSgoYnl0ZSkgJiAoYml0KSkKLSNkZWZpbmUgSU5URVJMQUNFCTB4NDAJLyogbWFzayBmb3IgYml0IHNpZ25pZnlpbmcgaW50ZXJsYWNlZCBpbWFnZSAqLwotI2RlZmluZSBDT0xPUk1BUEZMQUcJMHg4MAkvKiBtYXNrIGZvciBiaXQgc2lnbmlmeWluZyBjb2xvcm1hcCBwcmVzZW5jZSAqLwotCi0jZGVmaW5lCVJlYWRPSyhmaWxlLGJ1ZmZlcixsZW4pCShKRlJFQUQoZmlsZSxidWZmZXIsbGVuKSA9PSAoKHNpemVfdCkgKGxlbikpKQotCi0vKiBMWlcgZGVjb21wcmVzc2lvbiB0YWJsZXMgbG9vayBsaWtlIHRoaXM6Ci0gKiAgIHN5bWJvbF9oZWFkW0tdID0gcHJlZml4IHN5bWJvbCBvZiBhbnkgTFpXIHN5bWJvbCBLICgwLi5MWldfVEFCTEVfU0laRS0xKQotICogICBzeW1ib2xfdGFpbFtLXSA9IHN1ZmZpeCBieXRlICAgb2YgYW55IExaVyBzeW1ib2wgSyAoMC4uTFpXX1RBQkxFX1NJWkUtMSkKLSAqIE5vdGUgdGhhdCBlbnRyaWVzIDAuLmVuZF9jb2RlIG9mIHRoZSBhYm92ZSB0YWJsZXMgYXJlIG5vdCB1c2VkLAotICogc2luY2UgdGhvc2Ugc3ltYm9scyByZXByZXNlbnQgcmF3IGJ5dGVzIG9yIHNwZWNpYWwgY29kZXMuCi0gKgotICogVGhlIHN0YWNrIHJlcHJlc2VudHMgdGhlIG5vdC15ZXQtdXNlZCBleHBhbnNpb24gb2YgdGhlIGxhc3QgTFpXIHN5bWJvbC4KLSAqIEluIHRoZSB3b3JzdCBjYXNlLCBhIHN5bWJvbCBjb3VsZCBleHBhbmQgdG8gYXMgbWFueSBieXRlcyBhcyB0aGVyZSBhcmUKLSAqIExaVyBzeW1ib2xzLCBzbyB3ZSBhbGxvY2F0ZSBMWldfVEFCTEVfU0laRSBieXRlcyBmb3IgdGhlIHN0YWNrLgotICogKFRoaXMgaXMgY29uc2VydmF0aXZlIHNpbmNlIHRoYXQgbnVtYmVyIGluY2x1ZGVzIHRoZSByYXctYnl0ZSBzeW1ib2xzLikKLSAqCi0gKiBUaGUgdGFibGVzIGFyZSBhbGxvY2F0ZWQgZnJvbSBGQVIgaGVhcCBzcGFjZSBzaW5jZSB0aGV5IHdvdWxkIHVzZSB1cAotICogcmF0aGVyIGEgbG90IG9mIHRoZSBuZWFyIGRhdGEgc3BhY2UgaW4gYSBQQy4KLSAqLwotCi0KLS8qIFByaXZhdGUgdmVyc2lvbiBvZiBkYXRhIHNvdXJjZSBvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QgY2pwZWdfc291cmNlX3N0cnVjdCBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBqX2NvbXByZXNzX3B0ciBjaW5mbzsJCS8qIGJhY2sgbGluayBzYXZlcyBwYXNzaW5nIHNlcGFyYXRlIHBhcm0gKi8KLQotICBKU0FNUEFSUkFZIGNvbG9ybWFwOwkJLyogR0lGIGNvbG9ybWFwIChjb252ZXJ0ZWQgdG8gbXkgZm9ybWF0KSAqLwotCi0gIC8qIFN0YXRlIGZvciBHZXRDb2RlIGFuZCBMWldSZWFkQnl0ZSAqLwotICBjaGFyIGNvZGVfYnVmWzI1Nis0XTsJCS8qIGN1cnJlbnQgaW5wdXQgZGF0YSBibG9jayAqLwotICBpbnQgbGFzdF9ieXRlOwkJLyogIyBvZiBieXRlcyBpbiBjb2RlX2J1ZiAqLwotICBpbnQgbGFzdF9iaXQ7CQkJLyogIyBvZiBiaXRzIGluIGNvZGVfYnVmICovCi0gIGludCBjdXJfYml0OwkJCS8qIG5leHQgYml0IGluZGV4IHRvIHJlYWQgKi8KLSAgYm9vbGVhbiBvdXRfb2ZfYmxvY2tzOwkvKiBUUlVFIGlmIGhpdCB0ZXJtaW5hdG9yIGRhdGEgYmxvY2sgKi8KLQotICBpbnQgaW5wdXRfY29kZV9zaXplOwkJLyogY29kZXNpemUgZ2l2ZW4gaW4gR0lGIGZpbGUgKi8KLSAgaW50IGNsZWFyX2NvZGUsZW5kX2NvZGU7CS8qIHZhbHVlcyBmb3IgQ2xlYXIgYW5kIEVuZCBjb2RlcyAqLwotCi0gIGludCBjb2RlX3NpemU7CQkvKiBjdXJyZW50IGFjdHVhbCBjb2RlIHNpemUgKi8KLSAgaW50IGxpbWl0X2NvZGU7CQkvKiAyXmNvZGVfc2l6ZSAqLwotICBpbnQgbWF4X2NvZGU7CQkJLyogZmlyc3QgdW51c2VkIGNvZGUgdmFsdWUgKi8KLSAgYm9vbGVhbiBmaXJzdF90aW1lOwkJLyogZmxhZ3MgZmlyc3QgY2FsbCB0byBMWldSZWFkQnl0ZSAqLwotCi0gIC8qIFByaXZhdGUgc3RhdGUgZm9yIExaV1JlYWRCeXRlICovCi0gIGludCBvbGRjb2RlOwkJCS8qIHByZXZpb3VzIExaVyBzeW1ib2wgKi8KLSAgaW50IGZpcnN0Y29kZTsJCS8qIGZpcnN0IGJ5dGUgb2Ygb2xkY29kZSdzIGV4cGFuc2lvbiAqLwotCi0gIC8qIExaVyBzeW1ib2wgdGFibGUgYW5kIGV4cGFuc2lvbiBzdGFjayAqLwotICBVSU5UMTYgRkFSICpzeW1ib2xfaGVhZDsJLyogPT4gdGFibGUgb2YgcHJlZml4IHN5bWJvbHMgKi8KLSAgVUlOVDggIEZBUiAqc3ltYm9sX3RhaWw7CS8qID0+IHRhYmxlIG9mIHN1ZmZpeCBieXRlcyAqLwotICBVSU5UOCAgRkFSICpzeW1ib2xfc3RhY2s7CS8qID0+IHN0YWNrIGZvciBzeW1ib2wgZXhwYW5zaW9ucyAqLwotICBVSU5UOCAgRkFSICpzcDsJCS8qIHN0YWNrIHBvaW50ZXIgKi8KLQotICAvKiBTdGF0ZSBmb3IgaW50ZXJsYWNlZCBpbWFnZSBwcm9jZXNzaW5nICovCi0gIGJvb2xlYW4gaXNfaW50ZXJsYWNlZDsJLyogVFJVRSBpZiBoYXZlIGludGVybGFjZWQgaW1hZ2UgKi8KLSAganZpcnRfc2FycmF5X3B0ciBpbnRlcmxhY2VkX2ltYWdlOyAvKiBmdWxsIGltYWdlIGluIGludGVybGFjZWQgb3JkZXIgKi8KLSAgSkRJTUVOU0lPTiBjdXJfcm93X251bWJlcjsJLyogbmVlZCB0byBrbm93IGFjdHVhbCByb3cgbnVtYmVyICovCi0gIEpESU1FTlNJT04gcGFzczJfb2Zmc2V0OwkvKiAjIG9mIHBpeGVsIHJvd3MgaW4gcGFzcyAxICovCi0gIEpESU1FTlNJT04gcGFzczNfb2Zmc2V0OwkvKiAjIG9mIHBpeGVsIHJvd3MgaW4gcGFzc2VzIDEmMiAqLwotICBKRElNRU5TSU9OIHBhc3M0X29mZnNldDsJLyogIyBvZiBwaXhlbCByb3dzIGluIHBhc3NlcyAxLDIsMyAqLwotfSBnaWZfc291cmNlX3N0cnVjdDsKLQotdHlwZWRlZiBnaWZfc291cmNlX3N0cnVjdCAqIGdpZl9zb3VyY2VfcHRyOwotCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1NRVRIT0RERUYoSkRJTUVOU0lPTikgZ2V0X3BpeGVsX3Jvd3MKLQlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKSk7Ci1NRVRIT0RERUYoSkRJTUVOU0lPTikgbG9hZF9pbnRlcmxhY2VkX2ltYWdlCi0JSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykpOwotTUVUSE9EREVGKEpESU1FTlNJT04pIGdldF9pbnRlcmxhY2VkX3JvdwotCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pKTsKLQotCi1MT0NBTChpbnQpCi1SZWFkQnl0ZSAoZ2lmX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBSZWFkIG5leHQgYnl0ZSBmcm9tIEdJRiBmaWxlICovCi17Ci0gIHJlZ2lzdGVyIEZJTEUgKiBpbmZpbGUgPSBzaW5mby0+cHViLmlucHV0X2ZpbGU7Ci0gIGludCBjOwotCi0gIGlmICgoYyA9IGdldGMoaW5maWxlKSkgPT0gRU9GKQotICAgIEVSUkVYSVQoc2luZm8tPmNpbmZvLCBKRVJSX0lOUFVUX0VPRik7Ci0gIHJldHVybiBjOwotfQotCi0KLUxPQ0FMKGludCkKLUdldERhdGFCbG9jayAoZ2lmX3NvdXJjZV9wdHIgc2luZm8sIGNoYXIgKmJ1ZikKLS8qIFJlYWQgYSBHSUYgZGF0YSBibG9jaywgd2hpY2ggaGFzIGEgbGVhZGluZyBjb3VudCBieXRlICovCi0vKiBBIHplcm8tbGVuZ3RoIGJsb2NrIG1hcmtzIHRoZSBlbmQgb2YgYSBkYXRhIGJsb2NrIHNlcXVlbmNlICovCi17Ci0gIGludCBjb3VudDsKLQotICBjb3VudCA9IFJlYWRCeXRlKHNpbmZvKTsKLSAgaWYgKGNvdW50ID4gMCkgewotICAgIGlmICghIFJlYWRPSyhzaW5mby0+cHViLmlucHV0X2ZpbGUsIGJ1ZiwgY291bnQpKQotICAgICAgRVJSRVhJVChzaW5mby0+Y2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKLSAgfQotICByZXR1cm4gY291bnQ7Ci19Ci0KLQotTE9DQUwodm9pZCkKLVNraXBEYXRhQmxvY2tzIChnaWZfc291cmNlX3B0ciBzaW5mbykKLS8qIFNraXAgYSBzZXJpZXMgb2YgZGF0YSBibG9ja3MsIHVudGlsIGEgYmxvY2sgdGVybWluYXRvciBpcyBmb3VuZCAqLwotewotICBjaGFyIGJ1ZlsyNTZdOwotCi0gIHdoaWxlIChHZXREYXRhQmxvY2soc2luZm8sIGJ1ZikgPiAwKQotICAgIC8qIHNraXAgKi87Ci19Ci0KLQotTE9DQUwodm9pZCkKLVJlSW5pdExaVyAoZ2lmX3NvdXJjZV9wdHIgc2luZm8pCi0vKiAoUmUpaW5pdGlhbGl6ZSBMWlcgc3RhdGU7IHNoYXJlZCBjb2RlIGZvciBzdGFydHVwIGFuZCBDbGVhciBwcm9jZXNzaW5nICovCi17Ci0gIHNpbmZvLT5jb2RlX3NpemUgPSBzaW5mby0+aW5wdXRfY29kZV9zaXplICsgMTsKLSAgc2luZm8tPmxpbWl0X2NvZGUgPSBzaW5mby0+Y2xlYXJfY29kZSA8PCAxOwkvKiAyXmNvZGVfc2l6ZSAqLwotICBzaW5mby0+bWF4X2NvZGUgPSBzaW5mby0+Y2xlYXJfY29kZSArIDI7CS8qIGZpcnN0IHVudXNlZCBjb2RlIHZhbHVlICovCi0gIHNpbmZvLT5zcCA9IHNpbmZvLT5zeW1ib2xfc3RhY2s7CQkvKiBpbml0IHN0YWNrIHRvIGVtcHR5ICovCi19Ci0KLQotTE9DQUwodm9pZCkKLUluaXRMWldDb2RlIChnaWZfc291cmNlX3B0ciBzaW5mbykKLS8qIEluaXRpYWxpemUgZm9yIGEgc2VyaWVzIG9mIExaV1JlYWRCeXRlIChhbmQgaGVuY2UgR2V0Q29kZSkgY2FsbHMgKi8KLXsKLSAgLyogR2V0Q29kZSBpbml0aWFsaXphdGlvbiAqLwotICBzaW5mby0+bGFzdF9ieXRlID0gMjsJCS8qIG1ha2Ugc2FmZSB0byAicmVjb3B5IGxhc3QgdHdvIGJ5dGVzIiAqLwotICBzaW5mby0+bGFzdF9iaXQgPSAwOwkJLyogbm90aGluZyBpbiB0aGUgYnVmZmVyICovCi0gIHNpbmZvLT5jdXJfYml0ID0gMDsJCS8qIGZvcmNlIGJ1ZmZlciBsb2FkIG9uIGZpcnN0IGNhbGwgKi8KLSAgc2luZm8tPm91dF9vZl9ibG9ja3MgPSBGQUxTRTsKLQotICAvKiBMWldSZWFkQnl0ZSBpbml0aWFsaXphdGlvbjogKi8KLSAgLyogY29tcHV0ZSBzcGVjaWFsIGNvZGUgdmFsdWVzIChub3RlIHRoYXQgdGhlc2UgZG8gbm90IGNoYW5nZSBsYXRlcikgKi8KLSAgc2luZm8tPmNsZWFyX2NvZGUgPSAxIDw8IHNpbmZvLT5pbnB1dF9jb2RlX3NpemU7Ci0gIHNpbmZvLT5lbmRfY29kZSA9IHNpbmZvLT5jbGVhcl9jb2RlICsgMTsKLSAgc2luZm8tPmZpcnN0X3RpbWUgPSBUUlVFOwotICBSZUluaXRMWlcoc2luZm8pOwotfQotCi0KLUxPQ0FMKGludCkKLUdldENvZGUgKGdpZl9zb3VyY2VfcHRyIHNpbmZvKQotLyogRmV0Y2ggdGhlIG5leHQgY29kZV9zaXplIGJpdHMgZnJvbSB0aGUgR0lGIGRhdGEgKi8KLS8qIFdlIGFzc3VtZSBjb2RlX3NpemUgaXMgbGVzcyB0aGFuIDE2ICovCi17Ci0gIHJlZ2lzdGVyIElOVDMyIGFjY3VtOwotICBpbnQgb2ZmcywgcmV0LCBjb3VudDsKLQotICB3aGlsZSAoIChzaW5mby0+Y3VyX2JpdCArIHNpbmZvLT5jb2RlX3NpemUpID4gc2luZm8tPmxhc3RfYml0KSB7Ci0gICAgLyogVGltZSB0byByZWxvYWQgdGhlIGJ1ZmZlciAqLwotICAgIGlmIChzaW5mby0+b3V0X29mX2Jsb2NrcykgewotICAgICAgV0FSTk1TKHNpbmZvLT5jaW5mbywgSldSTl9HSUZfTk9NT1JFREFUQSk7Ci0gICAgICByZXR1cm4gc2luZm8tPmVuZF9jb2RlOwkvKiBmYWtlIHNvbWV0aGluZyB1c2VmdWwgKi8KLSAgICB9Ci0gICAgLyogcHJlc2VydmUgbGFzdCB0d28gYnl0ZXMgb2Ygd2hhdCB3ZSBoYXZlIC0tIGFzc3VtZSBjb2RlX3NpemUgPD0gMTYgKi8KLSAgICBzaW5mby0+Y29kZV9idWZbMF0gPSBzaW5mby0+Y29kZV9idWZbc2luZm8tPmxhc3RfYnl0ZS0yXTsKLSAgICBzaW5mby0+Y29kZV9idWZbMV0gPSBzaW5mby0+Y29kZV9idWZbc2luZm8tPmxhc3RfYnl0ZS0xXTsKLSAgICAvKiBMb2FkIG1vcmUgYnl0ZXM7IHNldCBmbGFnIGlmIHdlIHJlYWNoIHRoZSB0ZXJtaW5hdG9yIGJsb2NrICovCi0gICAgaWYgKChjb3VudCA9IEdldERhdGFCbG9jayhzaW5mbywgJnNpbmZvLT5jb2RlX2J1ZlsyXSkpID09IDApIHsKLSAgICAgIHNpbmZvLT5vdXRfb2ZfYmxvY2tzID0gVFJVRTsKLSAgICAgIFdBUk5NUyhzaW5mby0+Y2luZm8sIEpXUk5fR0lGX05PTU9SRURBVEEpOwotICAgICAgcmV0dXJuIHNpbmZvLT5lbmRfY29kZTsJLyogZmFrZSBzb21ldGhpbmcgdXNlZnVsICovCi0gICAgfQotICAgIC8qIFJlc2V0IGNvdW50ZXJzICovCi0gICAgc2luZm8tPmN1cl9iaXQgPSAoc2luZm8tPmN1cl9iaXQgLSBzaW5mby0+bGFzdF9iaXQpICsgMTY7Ci0gICAgc2luZm8tPmxhc3RfYnl0ZSA9IDIgKyBjb3VudDsKLSAgICBzaW5mby0+bGFzdF9iaXQgPSBzaW5mby0+bGFzdF9ieXRlICogODsKLSAgfQotCi0gIC8qIEZvcm0gdXAgbmV4dCAyNCBiaXRzIGluIGFjY3VtICovCi0gIG9mZnMgPSBzaW5mby0+Y3VyX2JpdCA+PiAzOwkvKiBieXRlIGNvbnRhaW5pbmcgY3VyX2JpdCAqLwotI2lmZGVmIENIQVJfSVNfVU5TSUdORUQKLSAgYWNjdW0gPSBzaW5mby0+Y29kZV9idWZbb2ZmcysyXTsKLSAgYWNjdW0gPDw9IDg7Ci0gIGFjY3VtIHw9IHNpbmZvLT5jb2RlX2J1ZltvZmZzKzFdOwotICBhY2N1bSA8PD0gODsKLSAgYWNjdW0gfD0gc2luZm8tPmNvZGVfYnVmW29mZnNdOwotI2Vsc2UKLSAgYWNjdW0gPSBzaW5mby0+Y29kZV9idWZbb2ZmcysyXSAmIDB4RkY7Ci0gIGFjY3VtIDw8PSA4OwotICBhY2N1bSB8PSBzaW5mby0+Y29kZV9idWZbb2ZmcysxXSAmIDB4RkY7Ci0gIGFjY3VtIDw8PSA4OwotICBhY2N1bSB8PSBzaW5mby0+Y29kZV9idWZbb2Zmc10gJiAweEZGOwotI2VuZGlmCi0KLSAgLyogUmlnaHQtYWxpZ24gY3VyX2JpdCBpbiBhY2N1bSwgdGhlbiBtYXNrIG9mZiBkZXNpcmVkIG51bWJlciBvZiBiaXRzICovCi0gIGFjY3VtID4+PSAoc2luZm8tPmN1cl9iaXQgJiA3KTsKLSAgcmV0ID0gKChpbnQpIGFjY3VtKSAmICgoMSA8PCBzaW5mby0+Y29kZV9zaXplKSAtIDEpOwotICAKLSAgc2luZm8tPmN1cl9iaXQgKz0gc2luZm8tPmNvZGVfc2l6ZTsKLSAgcmV0dXJuIHJldDsKLX0KLQotCi1MT0NBTChpbnQpCi1MWldSZWFkQnl0ZSAoZ2lmX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBSZWFkIGFuIExaVy1jb21wcmVzc2VkIGJ5dGUgKi8KLXsKLSAgcmVnaXN0ZXIgaW50IGNvZGU7CQkvKiBjdXJyZW50IHdvcmtpbmcgY29kZSAqLwotICBpbnQgaW5jb2RlOwkJCS8qIHNhdmVzIGFjdHVhbCBpbnB1dCBjb2RlICovCi0KLSAgLyogRmlyc3QgdGltZSwganVzdCBlYXQgdGhlIGV4cGVjdGVkIENsZWFyIGNvZGUocykgYW5kIHJldHVybiBuZXh0IGNvZGUsICovCi0gIC8qIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGJlIGEgcmF3IGJ5dGUuICovCi0gIGlmIChzaW5mby0+Zmlyc3RfdGltZSkgewotICAgIHNpbmZvLT5maXJzdF90aW1lID0gRkFMU0U7Ci0gICAgY29kZSA9IHNpbmZvLT5jbGVhcl9jb2RlOwkvKiBlbmFibGVzIHNoYXJpbmcgY29kZSB3aXRoIENsZWFyIGNhc2UgKi8KLSAgfSBlbHNlIHsKLQotICAgIC8qIElmIGFueSBjb2RlcyBhcmUgc3RhY2tlZCBmcm9tIGEgcHJldmlvdXNseSByZWFkIHN5bWJvbCwgcmV0dXJuIHRoZW0gKi8KLSAgICBpZiAoc2luZm8tPnNwID4gc2luZm8tPnN5bWJvbF9zdGFjaykKLSAgICAgIHJldHVybiAoaW50KSAqKC0tIHNpbmZvLT5zcCk7Ci0KLSAgICAvKiBUaW1lIHRvIHJlYWQgYSBuZXcgc3ltYm9sICovCi0gICAgY29kZSA9IEdldENvZGUoc2luZm8pOwotCi0gIH0KLQotICBpZiAoY29kZSA9PSBzaW5mby0+Y2xlYXJfY29kZSkgewotICAgIC8qIFJlaW5pdCBzdGF0ZSwgc3dhbGxvdyBhbnkgZXh0cmEgQ2xlYXIgY29kZXMsIGFuZCAqLwotICAgIC8qIHJldHVybiBuZXh0IGNvZGUsIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGJlIGEgcmF3IGJ5dGUuICovCi0gICAgUmVJbml0TFpXKHNpbmZvKTsKLSAgICBkbyB7Ci0gICAgICBjb2RlID0gR2V0Q29kZShzaW5mbyk7Ci0gICAgfSB3aGlsZSAoY29kZSA9PSBzaW5mby0+Y2xlYXJfY29kZSk7Ci0gICAgaWYgKGNvZGUgPiBzaW5mby0+Y2xlYXJfY29kZSkgeyAvKiBtYWtlIHN1cmUgaXQgaXMgYSByYXcgYnl0ZSAqLwotICAgICAgV0FSTk1TKHNpbmZvLT5jaW5mbywgSldSTl9HSUZfQkFEREFUQSk7Ci0gICAgICBjb2RlID0gMDsJCQkvKiB1c2Ugc29tZXRoaW5nIHZhbGlkICovCi0gICAgfQotICAgIC8qIG1ha2UgZmlyc3Rjb2RlLCBvbGRjb2RlIHZhbGlkISAqLwotICAgIHNpbmZvLT5maXJzdGNvZGUgPSBzaW5mby0+b2xkY29kZSA9IGNvZGU7Ci0gICAgcmV0dXJuIGNvZGU7Ci0gIH0KLQotICBpZiAoY29kZSA9PSBzaW5mby0+ZW5kX2NvZGUpIHsKLSAgICAvKiBTa2lwIHRoZSByZXN0IG9mIHRoZSBpbWFnZSwgdW5sZXNzIEdldENvZGUgYWxyZWFkeSByZWFkIHRlcm1pbmF0b3IgKi8KLSAgICBpZiAoISBzaW5mby0+b3V0X29mX2Jsb2NrcykgewotICAgICAgU2tpcERhdGFCbG9ja3Moc2luZm8pOwotICAgICAgc2luZm8tPm91dF9vZl9ibG9ja3MgPSBUUlVFOwotICAgIH0KLSAgICAvKiBDb21wbGFpbiB0aGF0IHRoZXJlJ3Mgbm90IGVub3VnaCBkYXRhICovCi0gICAgV0FSTk1TKHNpbmZvLT5jaW5mbywgSldSTl9HSUZfRU5EQ09ERSk7Ci0gICAgLyogUGFkIGRhdGEgd2l0aCAwJ3MgKi8KLSAgICByZXR1cm4gMDsJCQkvKiBmYWtlIHNvbWV0aGluZyB1c2FibGUgKi8KLSAgfQotCi0gIC8qIEdvdCBub3JtYWwgcmF3IGJ5dGUgb3IgTFpXIHN5bWJvbCAqLwotICBpbmNvZGUgPSBjb2RlOwkJLyogc2F2ZSBmb3IgYSBtb21lbnQgKi8KLSAgCi0gIGlmIChjb2RlID49IHNpbmZvLT5tYXhfY29kZSkgeyAvKiBzcGVjaWFsIGNhc2UgZm9yIG5vdC15ZXQtZGVmaW5lZCBzeW1ib2wgKi8KLSAgICAvKiBjb2RlID09IG1heF9jb2RlIGlzIE9LOyBhbnl0aGluZyBiaWdnZXIgaXMgYmFkIGRhdGEgKi8KLSAgICBpZiAoY29kZSA+IHNpbmZvLT5tYXhfY29kZSkgewotICAgICAgV0FSTk1TKHNpbmZvLT5jaW5mbywgSldSTl9HSUZfQkFEREFUQSk7Ci0gICAgICBpbmNvZGUgPSAwOwkJLyogcHJldmVudCBjcmVhdGlvbiBvZiBsb29wcyBpbiBzeW1ib2wgdGFibGUgKi8KLSAgICB9Ci0gICAgLyogdGhpcyBzeW1ib2wgd2lsbCBiZSBkZWZpbmVkIGFzIG9sZGNvZGUvZmlyc3Rjb2RlICovCi0gICAgKihzaW5mby0+c3ArKykgPSAoVUlOVDgpIHNpbmZvLT5maXJzdGNvZGU7Ci0gICAgY29kZSA9IHNpbmZvLT5vbGRjb2RlOwotICB9Ci0KLSAgLyogSWYgaXQncyBhIHN5bWJvbCwgZXhwYW5kIGl0IGludG8gdGhlIHN0YWNrICovCi0gIHdoaWxlIChjb2RlID49IHNpbmZvLT5jbGVhcl9jb2RlKSB7Ci0gICAgKihzaW5mby0+c3ArKykgPSBzaW5mby0+c3ltYm9sX3RhaWxbY29kZV07IC8qIHRhaWwgaXMgYSBieXRlIHZhbHVlICovCi0gICAgY29kZSA9IHNpbmZvLT5zeW1ib2xfaGVhZFtjb2RlXTsgLyogaGVhZCBpcyBhbm90aGVyIExaVyBzeW1ib2wgKi8KLSAgfQotICAvKiBBdCB0aGlzIHBvaW50IGNvZGUganVzdCByZXByZXNlbnRzIGEgcmF3IGJ5dGUgKi8KLSAgc2luZm8tPmZpcnN0Y29kZSA9IGNvZGU7CS8qIHNhdmUgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgKi8KLQotICAvKiBJZiB0aGVyZSdzIHJvb20gaW4gdGFibGUsICovCi0gIGlmICgoY29kZSA9IHNpbmZvLT5tYXhfY29kZSkgPCBMWldfVEFCTEVfU0laRSkgewotICAgIC8qIERlZmluZSBhIG5ldyBzeW1ib2wgPSBwcmV2IHN5bSArIGhlYWQgb2YgdGhpcyBzeW0ncyBleHBhbnNpb24gKi8KLSAgICBzaW5mby0+c3ltYm9sX2hlYWRbY29kZV0gPSBzaW5mby0+b2xkY29kZTsKLSAgICBzaW5mby0+c3ltYm9sX3RhaWxbY29kZV0gPSAoVUlOVDgpIHNpbmZvLT5maXJzdGNvZGU7Ci0gICAgc2luZm8tPm1heF9jb2RlKys7Ci0gICAgLyogSXMgaXQgdGltZSB0byBpbmNyZWFzZSBjb2RlX3NpemU/ICovCi0gICAgaWYgKChzaW5mby0+bWF4X2NvZGUgPj0gc2luZm8tPmxpbWl0X2NvZGUpICYmCi0JKHNpbmZvLT5jb2RlX3NpemUgPCBNQVhfTFpXX0JJVFMpKSB7Ci0gICAgICBzaW5mby0+Y29kZV9zaXplKys7Ci0gICAgICBzaW5mby0+bGltaXRfY29kZSA8PD0gMTsJLyoga2VlcCBlcXVhbCB0byAyXmNvZGVfc2l6ZSAqLwotICAgIH0KLSAgfQotICAKLSAgc2luZm8tPm9sZGNvZGUgPSBpbmNvZGU7CS8qIHNhdmUgbGFzdCBpbnB1dCBzeW1ib2wgZm9yIGZ1dHVyZSB1c2UgKi8KLSAgcmV0dXJuIHNpbmZvLT5maXJzdGNvZGU7CS8qIHJldHVybiBmaXJzdCBieXRlIG9mIHN5bWJvbCdzIGV4cGFuc2lvbiAqLwotfQotCi0KLUxPQ0FMKHZvaWQpCi1SZWFkQ29sb3JNYXAgKGdpZl9zb3VyY2VfcHRyIHNpbmZvLCBpbnQgY21hcGxlbiwgSlNBTVBBUlJBWSBjbWFwKQotLyogUmVhZCBhIEdJRiBjb2xvcm1hcCAqLwotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY21hcGxlbjsgaSsrKSB7Ci0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLSNkZWZpbmUgVVBTQ0FMRSh4KSAgKHgpCi0jZWxzZQotI2RlZmluZSBVUFNDQUxFKHgpICAoKHgpIDw8IChCSVRTX0lOX0pTQU1QTEUtOCkpCi0jZW5kaWYKLSAgICBjbWFwW0NNX1JFRF1baV0gICA9IChKU0FNUExFKSBVUFNDQUxFKFJlYWRCeXRlKHNpbmZvKSk7Ci0gICAgY21hcFtDTV9HUkVFTl1baV0gPSAoSlNBTVBMRSkgVVBTQ0FMRShSZWFkQnl0ZShzaW5mbykpOwotICAgIGNtYXBbQ01fQkxVRV1baV0gID0gKEpTQU1QTEUpIFVQU0NBTEUoUmVhZEJ5dGUoc2luZm8pKTsKLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1Eb0V4dGVuc2lvbiAoZ2lmX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBQcm9jZXNzIGFuIGV4dGVuc2lvbiBibG9jayAqLwotLyogQ3VycmVudGx5IHdlIGlnbm9yZSAnZW0gYWxsICovCi17Ci0gIGludCBleHRsYWJlbDsKLQotICAvKiBSZWFkIGV4dGVuc2lvbiBsYWJlbCBieXRlICovCi0gIGV4dGxhYmVsID0gUmVhZEJ5dGUoc2luZm8pOwotICBUUkFDRU1TMShzaW5mby0+Y2luZm8sIDEsIEpUUkNfR0lGX0VYVEVOU0lPTiwgZXh0bGFiZWwpOwotICAvKiBTa2lwIHRoZSBkYXRhIGJsb2NrKHMpIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXh0ZW5zaW9uICovCi0gIFNraXBEYXRhQmxvY2tzKHNpbmZvKTsKLX0KLQotCi0vKgotICogUmVhZCB0aGUgZmlsZSBoZWFkZXI7IHJldHVybiBpbWFnZSBzaXplIGFuZCBjb21wb25lbnQgY291bnQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9pbnB1dF9naWYgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotewotICBnaWZfc291cmNlX3B0ciBzb3VyY2UgPSAoZ2lmX3NvdXJjZV9wdHIpIHNpbmZvOwotICBjaGFyIGhkcmJ1ZlsxMF07CQkvKiB3b3Jrc3BhY2UgZm9yIHJlYWRpbmcgY29udHJvbCBibG9ja3MgKi8KLSAgdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQ7CS8qIGltYWdlIGRpbWVuc2lvbnMgKi8KLSAgaW50IGNvbG9ybWFwbGVuLCBhc3BlY3RSYXRpbzsKLSAgaW50IGM7Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgdG8gc3RvcmUgdGhlIGNvbG9ybWFwICovCi0gIHNvdXJjZS0+Y29sb3JtYXAgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAoSkRJTUVOU0lPTikgTUFYQ09MT1JNQVBTSVpFLCAoSkRJTUVOU0lPTikgTlVNQ09MT1JTKTsKLQotICAvKiBSZWFkIGFuZCB2ZXJpZnkgR0lGIEhlYWRlciAqLwotICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgaGRyYnVmLCA2KSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0dJRl9OT1QpOwotICBpZiAoaGRyYnVmWzBdICE9ICdHJyB8fCBoZHJidWZbMV0gIT0gJ0knIHx8IGhkcmJ1ZlsyXSAhPSAnRicpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9HSUZfTk9UKTsKLSAgLyogQ2hlY2sgZm9yIGV4cGVjdGVkIHZlcnNpb24gbnVtYmVycy4KLSAgICogSWYgdW5rbm93biB2ZXJzaW9uLCBnaXZlIHdhcm5pbmcgYW5kIHRyeSB0byBwcm9jZXNzIGFueXdheTsKLSAgICogdGhpcyBpcyBwZXIgcmVjb21tZW5kYXRpb24gaW4gR0lGODlhIHN0YW5kYXJkLgotICAgKi8KLSAgaWYgKChoZHJidWZbM10gIT0gJzgnIHx8IGhkcmJ1Zls0XSAhPSAnNycgfHwgaGRyYnVmWzVdICE9ICdhJykgJiYKLSAgICAgIChoZHJidWZbM10gIT0gJzgnIHx8IGhkcmJ1Zls0XSAhPSAnOScgfHwgaGRyYnVmWzVdICE9ICdhJykpCi0gICAgVFJBQ0VNUzMoY2luZm8sIDEsIEpUUkNfR0lGX0JBRFZFUlNJT04sIGhkcmJ1ZlszXSwgaGRyYnVmWzRdLCBoZHJidWZbNV0pOwotCi0gIC8qIFJlYWQgYW5kIGRlY2lwaGVyIExvZ2ljYWwgU2NyZWVuIERlc2NyaXB0b3IgKi8KLSAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIGhkcmJ1ZiwgNykpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOwotICB3aWR0aCA9IExNX3RvX3VpbnQoaGRyYnVmWzBdLGhkcmJ1ZlsxXSk7Ci0gIGhlaWdodCA9IExNX3RvX3VpbnQoaGRyYnVmWzJdLGhkcmJ1ZlszXSk7Ci0gIGNvbG9ybWFwbGVuID0gMiA8PCAoaGRyYnVmWzRdICYgMHgwNyk7Ci0gIC8qIHdlIGlnbm9yZSB0aGUgY29sb3IgcmVzb2x1dGlvbiwgc29ydCBmbGFnLCBhbmQgYmFja2dyb3VuZCBjb2xvciBpbmRleCAqLwotICBhc3BlY3RSYXRpbyA9IGhkcmJ1Zls2XSAmIDB4RkY7Ci0gIGlmIChhc3BlY3RSYXRpbyAhPSAwICYmIGFzcGVjdFJhdGlvICE9IDQ5KQotICAgIFRSQUNFTVMoY2luZm8sIDEsIEpUUkNfR0lGX05PTlNRVUFSRSk7Ci0KLSAgLyogUmVhZCBnbG9iYWwgY29sb3JtYXAgaWYgaGVhZGVyIGluZGljYXRlcyBpdCBpcyBwcmVzZW50ICovCi0gIGlmIChCaXRTZXQoaGRyYnVmWzRdLCBDT0xPUk1BUEZMQUcpKQotICAgIFJlYWRDb2xvck1hcChzb3VyY2UsIGNvbG9ybWFwbGVuLCBzb3VyY2UtPmNvbG9ybWFwKTsKLQotICAvKiBTY2FuIHVudGlsIHdlIHJlYWNoIHN0YXJ0IG9mIGRlc2lyZWQgaW1hZ2UuCi0gICAqIFdlIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0IHNraXBwaW5nIGltYWdlcywgYnV0IGNvdWxkIGFkZCBpdCBlYXNpbHkuCi0gICAqLwotICBmb3IgKDs7KSB7Ci0gICAgYyA9IFJlYWRCeXRlKHNvdXJjZSk7Ci0KLSAgICBpZiAoYyA9PSAnOycpCQkvKiBHSUYgdGVybWluYXRvcj8/ICovCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0dJRl9JTUFHRU5PVEZPVU5EKTsKLQotICAgIGlmIChjID09ICchJykgewkJLyogRXh0ZW5zaW9uICovCi0gICAgICBEb0V4dGVuc2lvbihzb3VyY2UpOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIAotICAgIGlmIChjICE9ICcsJykgewkJLyogTm90IGFuIGltYWdlIHNlcGFyYXRvcj8gKi8KLSAgICAgIFdBUk5NUzEoY2luZm8sIEpXUk5fR0lGX0NIQVIsIGMpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLyogUmVhZCBhbmQgZGVjaXBoZXIgTG9jYWwgSW1hZ2UgRGVzY3JpcHRvciAqLwotICAgIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBoZHJidWYsIDkpKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOwotICAgIC8qIHdlIGlnbm9yZSB0b3AvbGVmdCBwb3NpdGlvbiBpbmZvLCBhbHNvIHNvcnQgZmxhZyAqLwotICAgIHdpZHRoID0gTE1fdG9fdWludChoZHJidWZbNF0saGRyYnVmWzVdKTsKLSAgICBoZWlnaHQgPSBMTV90b191aW50KGhkcmJ1Zls2XSxoZHJidWZbN10pOwotICAgIHNvdXJjZS0+aXNfaW50ZXJsYWNlZCA9IEJpdFNldChoZHJidWZbOF0sIElOVEVSTEFDRSk7Ci0KLSAgICAvKiBSZWFkIGxvY2FsIGNvbG9ybWFwIGlmIGhlYWRlciBpbmRpY2F0ZXMgaXQgaXMgcHJlc2VudCAqLwotICAgIC8qIE5vdGU6IGlmIHdlIHdhbnRlZCB0byBzdXBwb3J0IHNraXBwaW5nIGltYWdlcywgKi8KLSAgICAvKiB3ZSdkIG5lZWQgdG8gc2tpcCByYXRoZXIgdGhhbiByZWFkIGNvbG9ybWFwIGZvciBpZ25vcmVkIGltYWdlcyAqLwotICAgIGlmIChCaXRTZXQoaGRyYnVmWzhdLCBDT0xPUk1BUEZMQUcpKSB7Ci0gICAgICBjb2xvcm1hcGxlbiA9IDIgPDwgKGhkcmJ1Zls4XSAmIDB4MDcpOwotICAgICAgUmVhZENvbG9yTWFwKHNvdXJjZSwgY29sb3JtYXBsZW4sIHNvdXJjZS0+Y29sb3JtYXApOwotICAgIH0KLQotICAgIHNvdXJjZS0+aW5wdXRfY29kZV9zaXplID0gUmVhZEJ5dGUoc291cmNlKTsgLyogZ2V0IG1pbi1jb2RlLXNpemUgYnl0ZSAqLwotICAgIGlmIChzb3VyY2UtPmlucHV0X2NvZGVfc2l6ZSA8IDIgfHwgc291cmNlLT5pbnB1dF9jb2RlX3NpemUgPj0gTUFYX0xaV19CSVRTKQotICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfR0lGX0NPREVTSVpFLCBzb3VyY2UtPmlucHV0X2NvZGVfc2l6ZSk7Ci0KLSAgICAvKiBSZWFjaGVkIGRlc2lyZWQgaW1hZ2UsIHNvIGJyZWFrIG91dCBvZiBsb29wICovCi0gICAgLyogSWYgd2Ugd2FudGVkIHRvIHNraXAgdGhpcyBpbWFnZSwgKi8KLSAgICAvKiB3ZSdkIGNhbGwgU2tpcERhdGFCbG9ja3MgYW5kIHRoZW4gY29udGludWUgdGhlIGxvb3AgKi8KLSAgICBicmVhazsKLSAgfQotCi0gIC8qIFByZXBhcmUgdG8gcmVhZCBzZWxlY3RlZCBpbWFnZTogZmlyc3QgaW5pdGlhbGl6ZSBMWlcgZGVjb21wcmVzc29yICovCi0gIHNvdXJjZS0+c3ltYm9sX2hlYWQgPSAoVUlOVDE2IEZBUiAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJTFpXX1RBQkxFX1NJWkUgKiBTSVpFT0YoVUlOVDE2KSk7Ci0gIHNvdXJjZS0+c3ltYm9sX3RhaWwgPSAoVUlOVDggRkFSICopCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlMWldfVEFCTEVfU0laRSAqIFNJWkVPRihVSU5UOCkpOwotICBzb3VyY2UtPnN5bWJvbF9zdGFjayA9IChVSU5UOCBGQVIgKikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCUxaV19UQUJMRV9TSVpFICogU0laRU9GKFVJTlQ4KSk7Ci0gIEluaXRMWldDb2RlKHNvdXJjZSk7Ci0KLSAgLyoKLSAgICogSWYgaW1hZ2UgaXMgaW50ZXJsYWNlZCwgd2UgcmVhZCBpdCBpbnRvIGEgZnVsbC1zaXplIHNhbXBsZSBhcnJheSwKLSAgICogZGVjb21wcmVzc2luZyBhcyB3ZSBnbzsgdGhlbiBnZXRfaW50ZXJsYWNlZF9yb3cgc2VsZWN0cyByb3dzIGZyb20gdGhlCi0gICAqIHNhbXBsZSBhcnJheSBpbiB0aGUgcHJvcGVyIG9yZGVyLgotICAgKi8KLSAgaWYgKHNvdXJjZS0+aXNfaW50ZXJsYWNlZCkgewotICAgIC8qIFdlIHJlcXVlc3QgdGhlIHZpcnR1YWwgYXJyYXkgbm93LCBidXQgY2FuJ3QgYWNjZXNzIGl0IHVudGlsIHZpcnR1YWwKLSAgICAgKiBhcnJheXMgaGF2ZSBiZWVuIGFsbG9jYXRlZC4gIEhlbmNlLCB0aGUgYWN0dWFsIHdvcmsgb2YgcmVhZGluZyB0aGUKLSAgICAgKiBpbWFnZSBpcyBwb3N0cG9uZWQgdW50aWwgdGhlIGZpcnN0IGNhbGwgdG8gZ2V0X3BpeGVsX3Jvd3MuCi0gICAgICovCi0gICAgc291cmNlLT5pbnRlcmxhY2VkX2ltYWdlID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfc2FycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCi0gICAgICAgKEpESU1FTlNJT04pIHdpZHRoLCAoSkRJTUVOU0lPTikgaGVpZ2h0LCAoSkRJTUVOU0lPTikgMSk7Ci0gICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7Ci0gICAgICBwcm9ncmVzcy0+dG90YWxfZXh0cmFfcGFzc2VzKys7IC8qIGNvdW50IGZpbGUgaW5wdXQgYXMgc2VwYXJhdGUgcGFzcyAqLwotICAgIH0KLSAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGxvYWRfaW50ZXJsYWNlZF9pbWFnZTsKLSAgfSBlbHNlIHsKLSAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF9waXhlbF9yb3dzOwotICB9Ci0KLSAgLyogQ3JlYXRlIGNvbXByZXNzb3IgaW5wdXQgYnVmZmVyLiAqLwotICBzb3VyY2UtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAoSkRJTUVOU0lPTikgd2lkdGggKiBOVU1DT0xPUlMsIChKRElNRU5TSU9OKSAxKTsKLSAgc291cmNlLT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7Ci0KLSAgLyogUmV0dXJuIGluZm8gYWJvdXQgdGhlIGltYWdlLiAqLwotICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOwotICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IE5VTUNPTE9SUzsKLSAgY2luZm8tPmRhdGFfcHJlY2lzaW9uID0gQklUU19JTl9KU0FNUExFOyAvKiB3ZSBhbHdheXMgcmVzY2FsZSBkYXRhIHRvIHRoaXMgKi8KLSAgY2luZm8tPmltYWdlX3dpZHRoID0gd2lkdGg7Ci0gIGNpbmZvLT5pbWFnZV9oZWlnaHQgPSBoZWlnaHQ7Ci0KLSAgVFJBQ0VNUzMoY2luZm8sIDEsIEpUUkNfR0lGLCB3aWR0aCwgaGVpZ2h0LCBjb2xvcm1hcGxlbik7Ci19Ci0KLQotLyoKLSAqIFJlYWQgb25lIHJvdyBvZiBwaXhlbHMuCi0gKiBUaGlzIHZlcnNpb24gaXMgdXNlZCBmb3Igbm9uaW50ZXJsYWNlZCBHSUYgaW1hZ2VzOgotICogd2UgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBHSUYgZmlsZS4KLSAqLwotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLWdldF9waXhlbF9yb3dzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLXsKLSAgZ2lmX3NvdXJjZV9wdHIgc291cmNlID0gKGdpZl9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgcmVnaXN0ZXIgaW50IGM7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIHJlZ2lzdGVyIEpTQU1QQVJSQVkgY29sb3JtYXAgPSBzb3VyY2UtPmNvbG9ybWFwOwotICAKLSAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOwotICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICBjID0gTFpXUmVhZEJ5dGUoc291cmNlKTsKLSAgICAqcHRyKysgPSBjb2xvcm1hcFtDTV9SRURdW2NdOwotICAgICpwdHIrKyA9IGNvbG9ybWFwW0NNX0dSRUVOXVtjXTsKLSAgICAqcHRyKysgPSBjb2xvcm1hcFtDTV9CTFVFXVtjXTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotCi0vKgotICogUmVhZCBvbmUgcm93IG9mIHBpeGVscy4KLSAqIFRoaXMgdmVyc2lvbiBpcyB1c2VkIGZvciB0aGUgZmlyc3QgY2FsbCBvbiBnZXRfcGl4ZWxfcm93cyB3aGVuCi0gKiByZWFkaW5nIGFuIGludGVybGFjZWQgR0lGIGZpbGU6IHdlIHJlYWQgdGhlIHdob2xlIGltYWdlIGludG8gbWVtb3J5LgotICovCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotbG9hZF9pbnRlcmxhY2VkX2ltYWdlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLXsKLSAgZ2lmX3NvdXJjZV9wdHIgc291cmNlID0gKGdpZl9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgSlNBTVBBUlJBWSBpbWFnZV9wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHNwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIHJvdzsKLSAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOwotCi0gIC8qIFJlYWQgdGhlIGludGVybGFjZWQgaW1hZ2UgaW50byB0aGUgdmlydHVhbCBhcnJheSB3ZSd2ZSBjcmVhdGVkLiAqLwotICBmb3IgKHJvdyA9IDA7IHJvdyA8IGNpbmZvLT5pbWFnZV9oZWlnaHQ7IHJvdysrKSB7Ci0gICAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKLSAgICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyID0gKGxvbmcpIHJvdzsKLSAgICAgIHByb2dyZXNzLT5wdWIucGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0OwotICAgICAgKCpwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICAgfQotICAgIGltYWdlX3B0ciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPmludGVybGFjZWRfaW1hZ2UsCi0gICAgICAgcm93LCAoSkRJTUVOU0lPTikgMSwgVFJVRSk7Ci0gICAgc3B0ciA9IGltYWdlX3B0clswXTsKLSAgICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICAgICpzcHRyKysgPSAoSlNBTVBMRSkgTFpXUmVhZEJ5dGUoc291cmNlKTsKLSAgICB9Ci0gIH0KLSAgaWYgKHByb2dyZXNzICE9IE5VTEwpCi0gICAgcHJvZ3Jlc3MtPmNvbXBsZXRlZF9leHRyYV9wYXNzZXMrKzsKLQotICAvKiBSZXBsYWNlIG1ldGhvZCBwb2ludGVyIHNvIHN1YnNlcXVlbnQgY2FsbHMgZG9uJ3QgY29tZSBoZXJlLiAqLwotICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF9pbnRlcmxhY2VkX3JvdzsKLSAgLyogSW5pdGlhbGl6ZSBmb3IgZ2V0X2ludGVybGFjZWRfcm93LCBhbmQgcGVyZm9ybSBmaXJzdCBjYWxsIG9uIGl0LiAqLwotICBzb3VyY2UtPmN1cl9yb3dfbnVtYmVyID0gMDsKLSAgc291cmNlLT5wYXNzMl9vZmZzZXQgPSAoY2luZm8tPmltYWdlX2hlaWdodCArIDcpIC8gODsKLSAgc291cmNlLT5wYXNzM19vZmZzZXQgPSBzb3VyY2UtPnBhc3MyX29mZnNldCArIChjaW5mby0+aW1hZ2VfaGVpZ2h0ICsgMykgLyA4OwotICBzb3VyY2UtPnBhc3M0X29mZnNldCA9IHNvdXJjZS0+cGFzczNfb2Zmc2V0ICsgKGNpbmZvLT5pbWFnZV9oZWlnaHQgKyAxKSAvIDQ7Ci0KLSAgcmV0dXJuIGdldF9pbnRlcmxhY2VkX3JvdyhjaW5mbywgc2luZm8pOwotfQotCi0KLS8qCi0gKiBSZWFkIG9uZSByb3cgb2YgcGl4ZWxzLgotICogVGhpcyB2ZXJzaW9uIGlzIHVzZWQgZm9yIGludGVybGFjZWQgR0lGIGltYWdlczoKLSAqIHdlIHJlYWQgZnJvbSB0aGUgdmlydHVhbCBhcnJheS4KLSAqLwotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLWdldF9pbnRlcmxhY2VkX3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi17Ci0gIGdpZl9zb3VyY2VfcHRyIHNvdXJjZSA9IChnaWZfc291cmNlX3B0cikgc2luZm87Ci0gIEpTQU1QQVJSQVkgaW1hZ2VfcHRyOwotICByZWdpc3RlciBpbnQgYzsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgc3B0ciwgcHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgcmVnaXN0ZXIgSlNBTVBBUlJBWSBjb2xvcm1hcCA9IHNvdXJjZS0+Y29sb3JtYXA7Ci0gIEpESU1FTlNJT04gaXJvdzsKLQotICAvKiBGaWd1cmUgb3V0IHdoaWNoIHJvdyBvZiBpbnRlcmxhY2VkIGltYWdlIGlzIG5lZWRlZCwgYW5kIGFjY2VzcyBpdC4gKi8KLSAgc3dpdGNoICgoaW50KSAoc291cmNlLT5jdXJfcm93X251bWJlciAmIDcpKSB7Ci0gIGNhc2UgMDoJCQkvKiBmaXJzdC1wYXNzIHJvdyAqLwotICAgIGlyb3cgPSBzb3VyY2UtPmN1cl9yb3dfbnVtYmVyID4+IDM7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgNDoJCQkvKiBzZWNvbmQtcGFzcyByb3cgKi8KLSAgICBpcm93ID0gKHNvdXJjZS0+Y3VyX3Jvd19udW1iZXIgPj4gMykgKyBzb3VyY2UtPnBhc3MyX29mZnNldDsKLSAgICBicmVhazsKLSAgY2FzZSAyOgkJCS8qIHRoaXJkLXBhc3Mgcm93ICovCi0gIGNhc2UgNjoKLSAgICBpcm93ID0gKHNvdXJjZS0+Y3VyX3Jvd19udW1iZXIgPj4gMikgKyBzb3VyY2UtPnBhc3MzX29mZnNldDsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoJCQkvKiBmb3VydGgtcGFzcyByb3cgKi8KLSAgICBpcm93ID0gKHNvdXJjZS0+Y3VyX3Jvd19udW1iZXIgPj4gMSkgKyBzb3VyY2UtPnBhc3M0X29mZnNldDsKLSAgICBicmVhazsKLSAgfQotICBpbWFnZV9wdHIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+aW50ZXJsYWNlZF9pbWFnZSwKLSAgICAgaXJvdywgKEpESU1FTlNJT04pIDEsIEZBTFNFKTsKLSAgLyogU2NhbiB0aGUgcm93LCBleHBhbmQgY29sb3JtYXAsIGFuZCBvdXRwdXQgKi8KLSAgc3B0ciA9IGltYWdlX3B0clswXTsKLSAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOwotICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICBjID0gR0VUSlNBTVBMRSgqc3B0cisrKTsKLSAgICAqcHRyKysgPSBjb2xvcm1hcFtDTV9SRURdW2NdOwotICAgICpwdHIrKyA9IGNvbG9ybWFwW0NNX0dSRUVOXVtjXTsKLSAgICAqcHRyKysgPSBjb2xvcm1hcFtDTV9CTFVFXVtjXTsKLSAgfQotICBzb3VyY2UtPmN1cl9yb3dfbnVtYmVyKys7CS8qIGZvciBuZXh0IHRpbWUgKi8KLSAgcmV0dXJuIDE7Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX2lucHV0X2dpZiAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgKi8KLX0KLQotCi0vKgotICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgR0lGIGZvcm1hdCBpbnB1dC4KLSAqLwotCi1HTE9CQUwoY2pwZWdfc291cmNlX3B0cikKLWppbml0X3JlYWRfZ2lmIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgZ2lmX3NvdXJjZV9wdHIgc291cmNlOwotCi0gIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCAqLwotICBzb3VyY2UgPSAoZ2lmX3NvdXJjZV9wdHIpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgU0laRU9GKGdpZl9zb3VyY2Vfc3RydWN0KSk7Ci0gIHNvdXJjZS0+Y2luZm8gPSBjaW5mbzsJLyogbWFrZSBiYWNrIGxpbmsgZm9yIHN1YnJvdXRpbmVzICovCi0gIC8qIEZpbGwgaW4gbWV0aG9kIHB0cnMsIGV4Y2VwdCBnZXRfcGl4ZWxfcm93cyB3aGljaCBzdGFydF9pbnB1dCBzZXRzICovCi0gIHNvdXJjZS0+cHViLnN0YXJ0X2lucHV0ID0gc3RhcnRfaW5wdXRfZ2lmOwotICBzb3VyY2UtPnB1Yi5maW5pc2hfaW5wdXQgPSBmaW5pc2hfaW5wdXRfZ2lmOwotCi0gIHJldHVybiAoY2pwZWdfc291cmNlX3B0cikgc291cmNlOwotfQotCi0jZW5kaWYgLyogR0lGX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvcmRqcGdjb20uMSBiL3JkanBnY29tLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYmEwNGUuLjAwMDAwMDAKLS0tIGEvcmRqcGdjb20uMQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS5USCBSREpQR0NPTSAxICIxMSBPY3RvYmVyIDE5OTciCi0uU0ggTkFNRQotcmRqcGdjb20gXC0gZGlzcGxheSB0ZXh0IGNvbW1lbnRzIGZyb20gYSBKUEVHIGZpbGUKLS5TSCBTWU5PUFNJUwotLkIgcmRqcGdjb20KLVsKLS5CIFwtdmVyYm9zZQotXQotWwotLkkgZmlsZW5hbWUKLV0KLS5MUAotLlNIIERFU0NSSVBUSU9OCi0uTFAKLS5CIHJkanBnY29tCi1yZWFkcyB0aGUgbmFtZWQgSlBFRy9KRklGIGZpbGUsIG9yIHRoZSBzdGFuZGFyZCBpbnB1dCBpZiBubyBmaWxlIGlzIG5hbWVkLAotYW5kIHByaW50cyBhbnkgdGV4dCBjb21tZW50cyBmb3VuZCBpbiB0aGUgZmlsZSBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotLlBQCi1UaGUgSlBFRyBzdGFuZGFyZCBhbGxvd3MgImNvbW1lbnQiIChDT00pIGJsb2NrcyB0byBvY2N1ciB3aXRoaW4gYSBKUEVHIGZpbGUuCi1BbHRob3VnaCB0aGUgc3RhbmRhcmQgZG9lc24ndCBhY3R1YWxseSBkZWZpbmUgd2hhdCBDT00gYmxvY2tzIGFyZSBmb3IsIHRoZXkKLWFyZSB3aWRlbHkgdXNlZCB0byBob2xkIHVzZXItc3VwcGxpZWQgdGV4dCBzdHJpbmdzLiAgVGhpcyBsZXRzIHlvdSBhZGQKLWFubm90YXRpb25zLCB0aXRsZXMsIGluZGV4IHRlcm1zLCBldGMgdG8geW91ciBKUEVHIGZpbGVzLCBhbmQgbGF0ZXIgcmV0cmlldmUKLXRoZW0gYXMgdGV4dC4gIENPTSBibG9ja3MgZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZSBpbWFnZSBzdG9yZWQgaW4gdGhlIEpQRUcKLWZpbGUuICBUaGUgbWF4aW11bSBzaXplIG9mIGEgQ09NIGJsb2NrIGlzIDY0SywgYnV0IHlvdSBjYW4gaGF2ZSBhcyBtYW55IG9mCi10aGVtIGFzIHlvdSBsaWtlIGluIG9uZSBKUEVHIGZpbGUuCi0uU0ggT1BUSU9OUwotLlRQCi0uQiBcLXZlcmJvc2UKLUNhdXNlcwotLkIgcmRqcGdjb20KLXRvIGFsc28gZGlzcGxheSB0aGUgSlBFRyBpbWFnZSBkaW1lbnNpb25zLgotLlBQCi1Td2l0Y2ggbmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkLCBhbmQgYXJlIG5vdCBjYXNlIHNlbnNpdGl2ZS4KLS5TSCBISU5UUwotLkIgcmRqcGdjb20KLWRvZXMgbm90IGRlcGVuZCBvbiB0aGUgSUpHIEpQRUcgbGlicmFyeS4gIEl0cyBzb3VyY2UgY29kZSBpcyBpbnRlbmRlZCBhcyBhbgotaWxsdXN0cmF0aW9uIG9mIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBjb2RlIHJlcXVpcmVkIHRvIHBhcnNlIGEgSlBFRyBmaWxlCi1oZWFkZXIgY29ycmVjdGx5LgotLlBQCi1JbgotLkIgXC12ZXJib3NlCi1tb2RlLAotLkIgcmRqcGdjb20KLXdpbGwgYWxzbyBhdHRlbXB0IHRvIHByaW50IHRoZSBjb250ZW50cyBvZiBhbnkgIkFQUDEyIiBtYXJrZXJzIGFzIHRleHQuCi1Tb21lIGRpZ2l0YWwgY2FtZXJhcyBwcm9kdWNlIEFQUDEyIG1hcmtlcnMgY29udGFpbmluZyB1c2VmdWwgdGV4dHVhbAotaW5mb3JtYXRpb24uICBJZiB5b3UgbGlrZSwgeW91IGNhbiBtb2RpZnkgdGhlIHNvdXJjZSBjb2RlIHRvIHByaW50Ci1vdGhlciBBUFBuIG1hcmtlciB0eXBlcyBhcyB3ZWxsLgotLlNIIFNFRSBBTFNPCi0uQlIgY2pwZWcgKDEpLAotLkJSIGRqcGVnICgxKSwKLS5CUiBqcGVndHJhbiAoMSksCi0uQlIgd3JqcGdjb20gKDEpCi0uU0ggQVVUSE9SCi1JbmRlcGVuZGVudCBKUEVHIEdyb3VwCmRpZmYgLS1naXQgYS9yZGpwZ2NvbS5jIGIvcmRqcGdjb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlNmZjNi4uMDAwMDAwMAotLS0gYS9yZGpwZ2NvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDk2ICswLDAgQEAKLS8qCi0gKiByZGpwZ2NvbS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYSB2ZXJ5IHNpbXBsZSBzdGFuZC1hbG9uZSBhcHBsaWNhdGlvbiB0aGF0IGRpc3BsYXlzCi0gKiB0aGUgdGV4dCBpbiBDT00gKGNvbW1lbnQpIG1hcmtlcnMgaW4gYSBKRklGIGZpbGUuCi0gKiBUaGlzIG1heSBiZSB1c2VmdWwgYXMgYW4gZXhhbXBsZSBvZiB0aGUgbWluaW11bSBsb2dpYyBuZWVkZWQgdG8gcGFyc2UKLSAqIEpQRUcgbWFya2Vycy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfQ0pQRUdfREpQRUcJLyogdG8gZ2V0IHRoZSBjb21tYW5kLWxpbmUgY29uZmlnIHN5bWJvbHMgKi8KLSNpbmNsdWRlICJqaW5jbHVkZS5oIgkJLyogZ2V0IGF1dG8tY29uZmlnIHN5bWJvbHMsIDxzdGRpby5oPiAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4JCS8qIHRvIGRlY2xhcmUgaXN1cHBlcigpLCB0b2xvd2VyKCkgKi8KLSNpZmRlZiBVU0VfU0VUTU9ERQotI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiB0byBkZWNsYXJlIHNldG1vZGUoKSdzIHBhcmFtZXRlciBtYWNyb3MgKi8KLS8qIElmIHlvdSBoYXZlIHNldG1vZGUoKSBidXQgbm90IDxpby5oPiwganVzdCBkZWxldGUgdGhpcyBsaW5lOiAqLwotI2luY2x1ZGUgPGlvLmg+CQkJLyogdG8gZGVjbGFyZSBzZXRtb2RlKCkgKi8KLSNlbmRpZgotCi0jaWZkZWYgVVNFX0NDT01NQU5ECQkvKiBjb21tYW5kLWxpbmUgcmVhZGVyIGZvciBNYWNpbnRvc2ggKi8KLSNpZmRlZiBfX01XRVJLU19fCi0jaW5jbHVkZSA8U0lPVVguaD4gICAgICAgICAgICAgIC8qIE1ldHJvd2Vya3MgbmVlZHMgdGhpcyAqLwotI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIC4uLiBhbmQgdGhpcyAqLwotI2VuZGlmCi0jaWZkZWYgVEhJTktfQwotI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIFRoaW5rIGRlY2xhcmVzIGl0IGhlcmUgKi8KLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBET05UX1VTRV9CX01PREUJCS8qIGRlZmluZSBtb2RlIHBhcmFtZXRlcnMgZm9yIGZvcGVuKCkgKi8KLSNkZWZpbmUgUkVBRF9CSU5BUlkJInIiCi0jZWxzZQotI2lmZGVmIFZNUwkJCS8qIFZNUyBpcyB2ZXJ5IG5vbnN0YW5kYXJkICovCi0jZGVmaW5lIFJFQURfQklOQVJZCSJyYiIsICJjdHg9c3RtIgotI2Vsc2UJCQkJLyogc3RhbmRhcmQgQU5TSS1jb21wbGlhbnQgY2FzZSAqLwotI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEVYSVRfRkFJTFVSRQkJLyogZGVmaW5lIGV4aXQoKSBjb2RlcyBpZiBub3QgcHJvdmlkZWQgKi8KLSNkZWZpbmUgRVhJVF9GQUlMVVJFICAxCi0jZW5kaWYKLSNpZm5kZWYgRVhJVF9TVUNDRVNTCi0jaWZkZWYgVk1TCi0jZGVmaW5lIEVYSVRfU1VDQ0VTUyAgMQkJLyogVk1TIGlzIHZlcnkgbm9uc3RhbmRhcmQgKi8KLSNlbHNlCi0jZGVmaW5lIEVYSVRfU1VDQ0VTUyAgMAotI2VuZGlmCi0jZW5kaWYKLQotCi0vKgotICogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIHRvIHJlYWQgdGhlIGlucHV0IGZpbGUuCi0gKiBUbyByZXVzZSB0aGlzIGNvZGUgaW4gYW5vdGhlciBhcHBsaWNhdGlvbiwgeW91IG1pZ2h0IG5lZWQgdG8gY2hhbmdlIHRoZXNlLgotICovCi0KLXN0YXRpYyBGSUxFICogaW5maWxlOwkJLyogaW5wdXQgSlBFRyBmaWxlICovCi0KLS8qIFJldHVybiBuZXh0IGlucHV0IGJ5dGUsIG9yIEVPRiBpZiBubyBtb3JlICovCi0jZGVmaW5lIE5FWFRCWVRFKCkgIGdldGMoaW5maWxlKQotCi0KLS8qIEVycm9yIGV4aXQgaGFuZGxlciAqLwotI2RlZmluZSBFUlJFWElUKG1zZykgIChmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBtc2cpLCBleGl0KEVYSVRfRkFJTFVSRSkpCi0KLQotLyogUmVhZCBvbmUgYnl0ZSwgdGVzdGluZyBmb3IgRU9GICovCi1zdGF0aWMgaW50Ci1yZWFkXzFfYnl0ZSAodm9pZCkKLXsKLSAgaW50IGM7Ci0KLSAgYyA9IE5FWFRCWVRFKCk7Ci0gIGlmIChjID09IEVPRikKLSAgICBFUlJFWElUKCJQcmVtYXR1cmUgRU9GIGluIEpQRUcgZmlsZSIpOwotICByZXR1cm4gYzsKLX0KLQotLyogUmVhZCAyIGJ5dGVzLCBjb252ZXJ0IHRvIHVuc2lnbmVkIGludCAqLwotLyogQWxsIDItYnl0ZSBxdWFudGl0aWVzIGluIEpQRUcgbWFya2VycyBhcmUgTVNCIGZpcnN0ICovCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzJfYnl0ZXMgKHZvaWQpCi17Ci0gIGludCBjMSwgYzI7Ci0KLSAgYzEgPSBORVhUQllURSgpOwotICBpZiAoYzEgPT0gRU9GKQotICAgIEVSUkVYSVQoIlByZW1hdHVyZSBFT0YgaW4gSlBFRyBmaWxlIik7Ci0gIGMyID0gTkVYVEJZVEUoKTsKLSAgaWYgKGMyID09IEVPRikKLSAgICBFUlJFWElUKCJQcmVtYXR1cmUgRU9GIGluIEpQRUcgZmlsZSIpOwotICByZXR1cm4gKCgodW5zaWduZWQgaW50KSBjMSkgPDwgOCkgKyAoKHVuc2lnbmVkIGludCkgYzIpOwotfQotCi0KLS8qCi0gKiBKUEVHIG1hcmtlcnMgY29uc2lzdCBvZiBvbmUgb3IgbW9yZSAweEZGIGJ5dGVzLCBmb2xsb3dlZCBieSBhIG1hcmtlcgotICogY29kZSBieXRlICh3aGljaCBpcyBub3QgYW4gRkYpLiAgSGVyZSBhcmUgdGhlIG1hcmtlciBjb2RlcyBvZiBpbnRlcmVzdAotICogaW4gdGhpcyBwcm9ncmFtLiAgKFNlZSBqZG1hcmtlci5jIGZvciBhIG1vcmUgY29tcGxldGUgbGlzdC4pCi0gKi8KLQotI2RlZmluZSBNX1NPRjAgIDB4QzAJCS8qIFN0YXJ0IE9mIEZyYW1lIE4gKi8KLSNkZWZpbmUgTV9TT0YxICAweEMxCQkvKiBOIGluZGljYXRlcyB3aGljaCBjb21wcmVzc2lvbiBwcm9jZXNzICovCi0jZGVmaW5lIE1fU09GMiAgMHhDMgkJLyogT25seSBTT0YwLVNPRjIgYXJlIG5vdyBpbiBjb21tb24gdXNlICovCi0jZGVmaW5lIE1fU09GMyAgMHhDMwotI2RlZmluZSBNX1NPRjUgIDB4QzUJCS8qIE5COiBjb2RlcyBDNCBhbmQgQ0MgYXJlIE5PVCBTT0YgbWFya2VycyAqLwotI2RlZmluZSBNX1NPRjYgIDB4QzYKLSNkZWZpbmUgTV9TT0Y3ICAweEM3Ci0jZGVmaW5lIE1fU09GOSAgMHhDOQotI2RlZmluZSBNX1NPRjEwIDB4Q0EKLSNkZWZpbmUgTV9TT0YxMSAweENCCi0jZGVmaW5lIE1fU09GMTMgMHhDRAotI2RlZmluZSBNX1NPRjE0IDB4Q0UKLSNkZWZpbmUgTV9TT0YxNSAweENGCi0jZGVmaW5lIE1fU09JICAgMHhEOAkJLyogU3RhcnQgT2YgSW1hZ2UgKGJlZ2lubmluZyBvZiBkYXRhc3RyZWFtKSAqLwotI2RlZmluZSBNX0VPSSAgIDB4RDkJCS8qIEVuZCBPZiBJbWFnZSAoZW5kIG9mIGRhdGFzdHJlYW0pICovCi0jZGVmaW5lIE1fU09TICAgMHhEQQkJLyogU3RhcnQgT2YgU2NhbiAoYmVnaW5zIGNvbXByZXNzZWQgZGF0YSkgKi8KLSNkZWZpbmUgTV9BUFAwCTB4RTAJCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIG1hcmtlciwgdHlwZSBOICovCi0jZGVmaW5lIE1fQVBQMTIJMHhFQwkJLyogKHdlIGRvbid0IGJvdGhlciB0byBsaXN0IGFsbCAxNiBBUFBuJ3MpICovCi0jZGVmaW5lIE1fQ09NICAgMHhGRQkJLyogQ09NbWVudCAqLwotCi0KLS8qCi0gKiBGaW5kIHRoZSBuZXh0IEpQRUcgbWFya2VyIGFuZCByZXR1cm4gaXRzIG1hcmtlciBjb2RlLgotICogV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBGRiBieXRlLCBwb3NzaWJseSBtb3JlIGlmIHRoZSBjb21wcmVzc29yIHVzZWQgRkZzCi0gKiB0byBwYWQgdGhlIGZpbGUuCi0gKiBUaGVyZSBjb3VsZCBhbHNvIGJlIG5vbi1GRiBnYXJiYWdlIGJldHdlZW4gbWFya2Vycy4gIFRoZSB0cmVhdG1lbnQgb2Ygc3VjaAotICogZ2FyYmFnZSBpcyB1bnNwZWNpZmllZDsgd2UgY2hvb3NlIHRvIHNraXAgb3ZlciBpdCBidXQgZW1pdCBhIHdhcm5pbmcgbXNnLgotICogTkI6IHRoaXMgcm91dGluZSBtdXN0IG5vdCBiZSB1c2VkIGFmdGVyIHNlZWluZyBTT1MgbWFya2VyLCBzaW5jZSBpdCB3aWxsCi0gKiBub3QgZGVhbCBjb3JyZWN0bHkgd2l0aCBGRi8wMCBzZXF1ZW5jZXMgaW4gdGhlIGNvbXByZXNzZWQgaW1hZ2UgZGF0YS4uLgotICovCi0KLXN0YXRpYyBpbnQKLW5leHRfbWFya2VyICh2b2lkKQotewotICBpbnQgYzsKLSAgaW50IGRpc2NhcmRlZF9ieXRlcyA9IDA7Ci0KLSAgLyogRmluZCAweEZGIGJ5dGU7IGNvdW50IGFuZCBza2lwIGFueSBub24tRkZzLiAqLwotICBjID0gcmVhZF8xX2J5dGUoKTsKLSAgd2hpbGUgKGMgIT0gMHhGRikgewotICAgIGRpc2NhcmRlZF9ieXRlcysrOwotICAgIGMgPSByZWFkXzFfYnl0ZSgpOwotICB9Ci0gIC8qIEdldCBtYXJrZXIgY29kZSBieXRlLCBzd2FsbG93aW5nIGFueSBkdXBsaWNhdGUgRkYgYnl0ZXMuICBFeHRyYSBGRnMKLSAgICogYXJlIGxlZ2FsIGFzIHBhZCBieXRlcywgc28gZG9uJ3QgY291bnQgdGhlbSBpbiBkaXNjYXJkZWRfYnl0ZXMuCi0gICAqLwotICBkbyB7Ci0gICAgYyA9IHJlYWRfMV9ieXRlKCk7Ci0gIH0gd2hpbGUgKGMgPT0gMHhGRik7Ci0KLSAgaWYgKGRpc2NhcmRlZF9ieXRlcyAhPSAwKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBnYXJiYWdlIGRhdGEgZm91bmQgaW4gSlBFRyBmaWxlXG4iKTsKLSAgfQotCi0gIHJldHVybiBjOwotfQotCi0KLS8qCi0gKiBSZWFkIHRoZSBpbml0aWFsIG1hcmtlciwgd2hpY2ggc2hvdWxkIGJlIFNPSS4KLSAqIEZvciBhIEpGSUYgZmlsZSwgdGhlIGZpcnN0IHR3byBieXRlcyBvZiB0aGUgZmlsZSBzaG91bGQgYmUgbGl0ZXJhbGx5Ci0gKiAweEZGIE1fU09JLiAgVG8gYmUgbW9yZSBnZW5lcmFsLCB3ZSBjb3VsZCB1c2UgbmV4dF9tYXJrZXIsIGJ1dCBpZiB0aGUKLSAqIGlucHV0IGZpbGUgd2VyZW4ndCBhY3R1YWxseSBKUEVHIGF0IGFsbCwgbmV4dF9tYXJrZXIgbWlnaHQgcmVhZCB0aGUgd2hvbGUKLSAqIGZpbGUgYW5kIHRoZW4gcmV0dXJuIGEgbWlzbGVhZGluZyBlcnJvciBtZXNzYWdlLi4uCi0gKi8KLQotc3RhdGljIGludAotZmlyc3RfbWFya2VyICh2b2lkKQotewotICBpbnQgYzEsIGMyOwotCi0gIGMxID0gTkVYVEJZVEUoKTsKLSAgYzIgPSBORVhUQllURSgpOwotICBpZiAoYzEgIT0gMHhGRiB8fCBjMiAhPSBNX1NPSSkKLSAgICBFUlJFWElUKCJOb3QgYSBKUEVHIGZpbGUiKTsKLSAgcmV0dXJuIGMyOwotfQotCi0KLS8qCi0gKiBNb3N0IHR5cGVzIG9mIG1hcmtlciBhcmUgZm9sbG93ZWQgYnkgYSB2YXJpYWJsZS1sZW5ndGggcGFyYW1ldGVyIHNlZ21lbnQuCi0gKiBUaGlzIHJvdXRpbmUgc2tpcHMgb3ZlciB0aGUgcGFyYW1ldGVycyBmb3IgYW55IG1hcmtlciB3ZSBkb24ndCBvdGhlcndpc2UKLSAqIHdhbnQgdG8gcHJvY2Vzcy4KLSAqIE5vdGUgdGhhdCB3ZSBNVVNUIHNraXAgdGhlIHBhcmFtZXRlciBzZWdtZW50IGV4cGxpY2l0bHkgaW4gb3JkZXIgbm90IHRvCi0gKiBiZSBmb29sZWQgYnkgMHhGRiBieXRlcyB0aGF0IG1pZ2h0IGFwcGVhciB3aXRoaW4gdGhlIHBhcmFtZXRlciBzZWdtZW50OwotICogc3VjaCBieXRlcyBkbyBOT1QgaW50cm9kdWNlIG5ldyBtYXJrZXJzLgotICovCi0KLXN0YXRpYyB2b2lkCi1za2lwX3ZhcmlhYmxlICh2b2lkKQotLyogU2tpcCBvdmVyIGFuIHVua25vd24gb3IgdW5pbnRlcmVzdGluZyB2YXJpYWJsZS1sZW5ndGggbWFya2VyICovCi17Ci0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0KLSAgLyogR2V0IHRoZSBtYXJrZXIgcGFyYW1ldGVyIGxlbmd0aCBjb3VudCAqLwotICBsZW5ndGggPSByZWFkXzJfYnl0ZXMoKTsKLSAgLyogTGVuZ3RoIGluY2x1ZGVzIGl0c2VsZiwgc28gbXVzdCBiZSBhdCBsZWFzdCAyICovCi0gIGlmIChsZW5ndGggPCAyKQotICAgIEVSUkVYSVQoIkVycm9uZW91cyBKUEVHIG1hcmtlciBsZW5ndGgiKTsKLSAgbGVuZ3RoIC09IDI7Ci0gIC8qIFNraXAgb3ZlciB0aGUgcmVtYWluaW5nIGJ5dGVzICovCi0gIHdoaWxlIChsZW5ndGggPiAwKSB7Ci0gICAgKHZvaWQpIHJlYWRfMV9ieXRlKCk7Ci0gICAgbGVuZ3RoLS07Ci0gIH0KLX0KLQotCi0vKgotICogUHJvY2VzcyBhIENPTSBtYXJrZXIuCi0gKiBXZSB3YW50IHRvIHByaW50IG91dCB0aGUgbWFya2VyIGNvbnRlbnRzIGFzIGxlZ2libGUgdGV4dDsKLSAqIHdlIG11c3QgZ3VhcmQgYWdhaW5zdCBub24tdGV4dCBqdW5rIGFuZCB2YXJ5aW5nIG5ld2xpbmUgcmVwcmVzZW50YXRpb25zLgotICovCi0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX0NPTSAodm9pZCkKLXsKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSAgaW50IGNoOwotICBpbnQgbGFzdGNoID0gMDsKLQotICAvKiBHZXQgdGhlIG1hcmtlciBwYXJhbWV0ZXIgbGVuZ3RoIGNvdW50ICovCi0gIGxlbmd0aCA9IHJlYWRfMl9ieXRlcygpOwotICAvKiBMZW5ndGggaW5jbHVkZXMgaXRzZWxmLCBzbyBtdXN0IGJlIGF0IGxlYXN0IDIgKi8KLSAgaWYgKGxlbmd0aCA8IDIpCi0gICAgRVJSRVhJVCgiRXJyb25lb3VzIEpQRUcgbWFya2VyIGxlbmd0aCIpOwotICBsZW5ndGggLT0gMjsKLQotICB3aGlsZSAobGVuZ3RoID4gMCkgewotICAgIGNoID0gcmVhZF8xX2J5dGUoKTsKLSAgICAvKiBFbWl0IHRoZSBjaGFyYWN0ZXIgaW4gYSByZWFkYWJsZSBmb3JtLgotICAgICAqIE5vbnByaW50YWJsZXMgYXJlIGNvbnZlcnRlZCB0byBcbm5uIGZvcm0sCi0gICAgICogd2hpbGUgXCBpcyBjb252ZXJ0ZWQgdG8gXFwuCi0gICAgICogTmV3bGluZXMgaW4gQ1IsIENSL0xGLCBvciBMRiBmb3JtIHdpbGwgYmUgcHJpbnRlZCBhcyBvbmUgbmV3bGluZS4KLSAgICAgKi8KLSAgICBpZiAoY2ggPT0gJ1xyJykgewotICAgICAgcHJpbnRmKCJcbiIpOwotICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xuJykgewotICAgICAgaWYgKGxhc3RjaCAhPSAnXHInKQotCXByaW50ZigiXG4iKTsKLSAgICB9IGVsc2UgaWYgKGNoID09ICdcXCcpIHsKLSAgICAgIHByaW50ZigiXFxcXCIpOwotICAgIH0gZWxzZSBpZiAoaXNwcmludChjaCkpIHsKLSAgICAgIHB1dGMoY2gsIHN0ZG91dCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByaW50ZigiXFwlMDNvIiwgY2gpOwotICAgIH0KLSAgICBsYXN0Y2ggPSBjaDsKLSAgICBsZW5ndGgtLTsKLSAgfQotICBwcmludGYoIlxuIik7Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3MgYSBTT0ZuIG1hcmtlci4KLSAqIFRoaXMgY29kZSBpcyBvbmx5IG5lZWRlZCBpZiB5b3Ugd2FudCB0byBrbm93IHRoZSBpbWFnZSBkaW1lbnNpb25zLi4uCi0gKi8KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfU09GbiAoaW50IG1hcmtlcikKLXsKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSAgdW5zaWduZWQgaW50IGltYWdlX2hlaWdodCwgaW1hZ2Vfd2lkdGg7Ci0gIGludCBkYXRhX3ByZWNpc2lvbiwgbnVtX2NvbXBvbmVudHM7Ci0gIGNvbnN0IGNoYXIgKiBwcm9jZXNzOwotICBpbnQgY2k7Ci0KLSAgbGVuZ3RoID0gcmVhZF8yX2J5dGVzKCk7CS8qIHVzdWFsIHBhcmFtZXRlciBsZW5ndGggY291bnQgKi8KLQotICBkYXRhX3ByZWNpc2lvbiA9IHJlYWRfMV9ieXRlKCk7Ci0gIGltYWdlX2hlaWdodCA9IHJlYWRfMl9ieXRlcygpOwotICBpbWFnZV93aWR0aCA9IHJlYWRfMl9ieXRlcygpOwotICBudW1fY29tcG9uZW50cyA9IHJlYWRfMV9ieXRlKCk7Ci0KLSAgc3dpdGNoIChtYXJrZXIpIHsKLSAgY2FzZSBNX1NPRjA6CXByb2Nlc3MgPSAiQmFzZWxpbmUiOyAgYnJlYWs7Ci0gIGNhc2UgTV9TT0YxOglwcm9jZXNzID0gIkV4dGVuZGVkIHNlcXVlbnRpYWwiOyAgYnJlYWs7Ci0gIGNhc2UgTV9TT0YyOglwcm9jZXNzID0gIlByb2dyZXNzaXZlIjsgIGJyZWFrOwotICBjYXNlIE1fU09GMzoJcHJvY2VzcyA9ICJMb3NzbGVzcyI7ICBicmVhazsKLSAgY2FzZSBNX1NPRjU6CXByb2Nlc3MgPSAiRGlmZmVyZW50aWFsIHNlcXVlbnRpYWwiOyAgYnJlYWs7Ci0gIGNhc2UgTV9TT0Y2Oglwcm9jZXNzID0gIkRpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSI7ICBicmVhazsKLSAgY2FzZSBNX1NPRjc6CXByb2Nlc3MgPSAiRGlmZmVyZW50aWFsIGxvc3NsZXNzIjsgIGJyZWFrOwotICBjYXNlIE1fU09GOToJcHJvY2VzcyA9ICJFeHRlbmRlZCBzZXF1ZW50aWFsLCBhcml0aG1ldGljIGNvZGluZyI7ICBicmVhazsKLSAgY2FzZSBNX1NPRjEwOglwcm9jZXNzID0gIlByb2dyZXNzaXZlLCBhcml0aG1ldGljIGNvZGluZyI7ICBicmVhazsKLSAgY2FzZSBNX1NPRjExOglwcm9jZXNzID0gIkxvc3NsZXNzLCBhcml0aG1ldGljIGNvZGluZyI7ICBicmVhazsKLSAgY2FzZSBNX1NPRjEzOglwcm9jZXNzID0gIkRpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBhcml0aG1ldGljIGNvZGluZyI7ICBicmVhazsKLSAgY2FzZSBNX1NPRjE0Oglwcm9jZXNzID0gIkRpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgYXJpdGhtZXRpYyBjb2RpbmciOyBicmVhazsKLSAgY2FzZSBNX1NPRjE1Oglwcm9jZXNzID0gIkRpZmZlcmVudGlhbCBsb3NzbGVzcywgYXJpdGhtZXRpYyBjb2RpbmciOyAgYnJlYWs7Ci0gIGRlZmF1bHQ6CXByb2Nlc3MgPSAiVW5rbm93biI7ICBicmVhazsKLSAgfQotCi0gIHByaW50ZigiSlBFRyBpbWFnZSBpcyAldXcgKiAldWgsICVkIGNvbG9yIGNvbXBvbmVudHMsICVkIGJpdHMgcGVyIHNhbXBsZVxuIiwKLQkgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCwgbnVtX2NvbXBvbmVudHMsIGRhdGFfcHJlY2lzaW9uKTsKLSAgcHJpbnRmKCJKUEVHIHByb2Nlc3M6ICVzXG4iLCBwcm9jZXNzKTsKLQotICBpZiAobGVuZ3RoICE9ICh1bnNpZ25lZCBpbnQpICg4ICsgbnVtX2NvbXBvbmVudHMgKiAzKSkKLSAgICBFUlJFWElUKCJCb2d1cyBTT0YgbWFya2VyIGxlbmd0aCIpOwotCi0gIGZvciAoY2kgPSAwOyBjaSA8IG51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgKHZvaWQpIHJlYWRfMV9ieXRlKCk7CS8qIENvbXBvbmVudCBJRCBjb2RlICovCi0gICAgKHZvaWQpIHJlYWRfMV9ieXRlKCk7CS8qIEgsIFYgc2FtcGxpbmcgZmFjdG9ycyAqLwotICAgICh2b2lkKSByZWFkXzFfYnl0ZSgpOwkvKiBRdWFudGl6YXRpb24gdGFibGUgbnVtYmVyICovCi0gIH0KLX0KLQotCi0vKgotICogUGFyc2UgdGhlIG1hcmtlciBzdHJlYW0gdW50aWwgU09TIG9yIEVPSSBpcyBzZWVuOwotICogZGlzcGxheSBhbnkgQ09NIG1hcmtlcnMuCi0gKiBXaGlsZSB0aGUgY29tcGFuaW9uIHByb2dyYW0gd3JqcGdjb20gd2lsbCBhbHdheXMgaW5zZXJ0IENPTSBtYXJrZXJzIGJlZm9yZQotICogU09Gbiwgb3RoZXIgaW1wbGVtZW50YXRpb25zIG1pZ2h0IG5vdCwgc28gd2Ugc2NhbiB0byBTT1MgYmVmb3JlIHN0b3BwaW5nLgotICogSWYgd2Ugd2VyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGltYWdlIGRpbWVuc2lvbnMsIHdlIHdvdWxkIHN0b3AgYXQgU09Gbi4KLSAqIChDb252ZXJzZWx5LCBpZiB3ZSBvbmx5IGNhcmVkIGFib3V0IENPTSBtYXJrZXJzLCB0aGVyZSB3b3VsZCBiZSBubyBuZWVkCi0gKiBmb3Igc3BlY2lhbCBjb2RlIHRvIGhhbmRsZSBTT0ZuOyB3ZSBjb3VsZCB0cmVhdCBpdCBsaWtlIG90aGVyIG1hcmtlcnMuKQotICovCi0KLXN0YXRpYyBpbnQKLXNjYW5fSlBFR19oZWFkZXIgKGludCB2ZXJib3NlKQotewotICBpbnQgbWFya2VyOwotCi0gIC8qIEV4cGVjdCBTT0kgYXQgc3RhcnQgb2YgZmlsZSAqLwotICBpZiAoZmlyc3RfbWFya2VyKCkgIT0gTV9TT0kpCi0gICAgRVJSRVhJVCgiRXhwZWN0ZWQgU09JIG1hcmtlciBmaXJzdCIpOwotCi0gIC8qIFNjYW4gbWlzY2VsbGFuZW91cyBtYXJrZXJzIHVudGlsIHdlIHJlYWNoIFNPUy4gKi8KLSAgZm9yICg7OykgewotICAgIG1hcmtlciA9IG5leHRfbWFya2VyKCk7Ci0gICAgc3dpdGNoIChtYXJrZXIpIHsKLSAgICAgIC8qIE5vdGUgdGhhdCBtYXJrZXIgY29kZXMgMHhDNCwgMHhDOCwgMHhDQyBhcmUgbm90LCBhbmQgbXVzdCBub3QgYmUsCi0gICAgICAgKiB0cmVhdGVkIGFzIFNPRm4uICBDNCBpbiBwYXJ0aWN1bGFyIGlzIGFjdHVhbGx5IERIVC4KLSAgICAgICAqLwotICAgIGNhc2UgTV9TT0YwOgkJLyogQmFzZWxpbmUgKi8KLSAgICBjYXNlIE1fU09GMToJCS8qIEV4dGVuZGVkIHNlcXVlbnRpYWwsIEh1ZmZtYW4gKi8KLSAgICBjYXNlIE1fU09GMjoJCS8qIFByb2dyZXNzaXZlLCBIdWZmbWFuICovCi0gICAgY2FzZSBNX1NPRjM6CQkvKiBMb3NzbGVzcywgSHVmZm1hbiAqLwotICAgIGNhc2UgTV9TT0Y1OgkJLyogRGlmZmVyZW50aWFsIHNlcXVlbnRpYWwsIEh1ZmZtYW4gKi8KLSAgICBjYXNlIE1fU09GNjoJCS8qIERpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgSHVmZm1hbiAqLwotICAgIGNhc2UgTV9TT0Y3OgkJLyogRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBIdWZmbWFuICovCi0gICAgY2FzZSBNX1NPRjk6CQkvKiBFeHRlbmRlZCBzZXF1ZW50aWFsLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjEwOgkJLyogUHJvZ3Jlc3NpdmUsIGFyaXRobWV0aWMgKi8KLSAgICBjYXNlIE1fU09GMTE6CQkvKiBMb3NzbGVzcywgYXJpdGhtZXRpYyAqLwotICAgIGNhc2UgTV9TT0YxMzoJCS8qIERpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjE0OgkJLyogRGlmZmVyZW50aWFsIHByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjE1OgkJLyogRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBhcml0aG1ldGljICovCi0gICAgICBpZiAodmVyYm9zZSkKLQlwcm9jZXNzX1NPRm4obWFya2VyKTsKLSAgICAgIGVsc2UKLQlza2lwX3ZhcmlhYmxlKCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TT1M6CQkJLyogc3RvcCBiZWZvcmUgaGl0dGluZyBjb21wcmVzc2VkIGRhdGEgKi8KLSAgICAgIHJldHVybiBtYXJrZXI7Ci0KLSAgICBjYXNlIE1fRU9JOgkJCS8qIGluIGNhc2UgaXQncyBhIHRhYmxlcy1vbmx5IEpQRUcgc3RyZWFtICovCi0gICAgICByZXR1cm4gbWFya2VyOwotCi0gICAgY2FzZSBNX0NPTToKLSAgICAgIHByb2Nlc3NfQ09NKCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9BUFAxMjoKLSAgICAgIC8qIFNvbWUgZGlnaXRhbCBjYW1lcmEgbWFrZXJzIHB1dCB1c2VmdWwgdGV4dHVhbCBpbmZvcm1hdGlvbiBpbnRvCi0gICAgICAgKiBBUFAxMiBtYXJrZXJzLCBzbyB3ZSBwcmludCB0aG9zZSBvdXQgdG9vIHdoZW4gaW4gLXZlcmJvc2UgbW9kZS4KLSAgICAgICAqLwotICAgICAgaWYgKHZlcmJvc2UpIHsKLQlwcmludGYoIkFQUDEyIGNvbnRhaW5zOlxuIik7Ci0JcHJvY2Vzc19DT00oKTsKLSAgICAgIH0gZWxzZQotCXNraXBfdmFyaWFibGUoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoJCQkvKiBBbnl0aGluZyBlbHNlIGp1c3QgZ2V0cyBza2lwcGVkICovCi0gICAgICBza2lwX3ZhcmlhYmxlKCk7CQkvKiB3ZSBhc3N1bWUgaXQgaGFzIGEgcGFyYW1ldGVyIGNvdW50Li4uICovCi0gICAgICBicmVhazsKLSAgICB9Ci0gIH0gLyogZW5kIGxvb3AgKi8KLX0KLQotCi0vKiBDb21tYW5kIGxpbmUgcGFyc2luZyBjb2RlICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICogcHJvZ25hbWU7CS8qIHByb2dyYW0gbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KLQotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHZvaWQpCi0vKiBjb21wbGFpbiBhYm91dCBiYWQgY29tbWFuZCBsaW5lICovCi17Ci0gIGZwcmludGYoc3RkZXJyLCAicmRqcGdjb20gZGlzcGxheXMgYW55IHRleHR1YWwgY29tbWVudHMgaW4gYSBKUEVHIGZpbGUuXG4iKTsKLQotICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbc3dpdGNoZXNdIFtpbnB1dGZpbGVdXG4iLCBwcm9nbmFtZSk7Ci0KLSAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyAobmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkKTpcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZlcmJvc2UgICAgQWxzbyBkaXNwbGF5IGRpbWVuc2lvbnMgb2YgSlBFRyBpbWFnZVxuIik7Ci0KLSAgZXhpdChFWElUX0ZBSUxVUkUpOwotfQotCi0KLXN0YXRpYyBpbnQKLWtleW1hdGNoIChjaGFyICogYXJnLCBjb25zdCBjaGFyICoga2V5d29yZCwgaW50IG1pbmNoYXJzKQotLyogQ2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZyBvZiAocG9zc2libHkgYWJicmV2aWF0ZWQpIGtleXdvcmQgc3dpdGNoZXMuICovCi0vKiBrZXl3b3JkIGlzIHRoZSBjb25zdGFudCBrZXl3b3JkIChtdXN0IGJlIGxvd2VyIGNhc2UgYWxyZWFkeSksICovCi0vKiBtaW5jaGFycyBpcyBsZW5ndGggb2YgbWluaW11bSBsZWdhbCBhYmJyZXZpYXRpb24uICovCi17Ci0gIHJlZ2lzdGVyIGludCBjYSwgY2s7Ci0gIHJlZ2lzdGVyIGludCBubWF0Y2hlZCA9IDA7Ci0KLSAgd2hpbGUgKChjYSA9ICphcmcrKykgIT0gJ1wwJykgewotICAgIGlmICgoY2sgPSAqa2V5d29yZCsrKSA9PSAnXDAnKQotICAgICAgcmV0dXJuIDA7CQkJLyogYXJnIGxvbmdlciB0aGFuIGtleXdvcmQsIG5vIGdvb2QgKi8KLSAgICBpZiAoaXN1cHBlcihjYSkpCQkvKiBmb3JjZSBhcmcgdG8gbGNhc2UgKGFzc3VtZSBjayBpcyBhbHJlYWR5KSAqLwotICAgICAgY2EgPSB0b2xvd2VyKGNhKTsKLSAgICBpZiAoY2EgIT0gY2spCi0gICAgICByZXR1cm4gMDsJCQkvKiBubyBnb29kICovCi0gICAgbm1hdGNoZWQrKzsJCQkvKiBjb3VudCBtYXRjaGVkIGNoYXJhY3RlcnMgKi8KLSAgfQotICAvKiByZWFjaGVkIGVuZCBvZiBhcmd1bWVudDsgZmFpbCBpZiBpdCdzIHRvbyBzaG9ydCBmb3IgdW5pcXVlIGFiYnJldiAqLwotICBpZiAobm1hdGNoZWQgPCBtaW5jaGFycykKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7CQkJLyogQS1PSyAqLwotfQotCi0KLS8qCi0gKiBUaGUgbWFpbiBwcm9ncmFtLgotICovCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICBpbnQgYXJnbjsKLSAgY2hhciAqIGFyZzsKLSAgaW50IHZlcmJvc2UgPSAwOwotCi0gIC8qIE9uIE1hYywgZmV0Y2ggYSBjb21tYW5kIGxpbmUuICovCi0jaWZkZWYgVVNFX0NDT01NQU5ECi0gIGFyZ2MgPSBjY29tbWFuZCgmYXJndik7Ci0jZW5kaWYKLQotICBwcm9nbmFtZSA9IGFyZ3ZbMF07Ci0gIGlmIChwcm9nbmFtZSA9PSBOVUxMIHx8IHByb2duYW1lWzBdID09IDApCi0gICAgcHJvZ25hbWUgPSAicmRqcGdjb20iOwkvKiBpbiBjYXNlIEMgbGlicmFyeSBkb2Vzbid0IHByb3ZpZGUgaXQgKi8KLQotICAvKiBQYXJzZSBzd2l0Y2hlcywgaWYgYW55ICovCi0gIGZvciAoYXJnbiA9IDE7IGFyZ24gPCBhcmdjOyBhcmduKyspIHsKLSAgICBhcmcgPSBhcmd2W2FyZ25dOwotICAgIGlmIChhcmdbMF0gIT0gJy0nKQotICAgICAgYnJlYWs7CQkJLyogbm90IHN3aXRjaCwgbXVzdCBiZSBmaWxlIG5hbWUgKi8KLSAgICBhcmcrKzsJCQkvKiBhZHZhbmNlIG92ZXIgJy0nICovCi0gICAgaWYgKGtleW1hdGNoKGFyZywgInZlcmJvc2UiLCAxKSkgewotICAgICAgdmVyYm9zZSsrOwotICAgIH0gZWxzZQotICAgICAgdXNhZ2UoKTsKLSAgfQotCi0gIC8qIE9wZW4gdGhlIGlucHV0IGZpbGUuICovCi0gIC8qIFVuaXggc3R5bGU6IGV4cGVjdCB6ZXJvIG9yIG9uZSBmaWxlIG5hbWUgKi8KLSAgaWYgKGFyZ24gPCBhcmdjLTEpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBvbmx5IG9uZSBpbnB1dCBmaWxlXG4iLCBwcm9nbmFtZSk7Ci0gICAgdXNhZ2UoKTsKLSAgfQotICBpZiAoYXJnbiA8IGFyZ2MpIHsKLSAgICBpZiAoKGluZmlsZSA9IGZvcGVuKGFyZ3ZbYXJnbl0sIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbYXJnbl0pOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBkZWZhdWx0IGlucHV0IGZpbGUgaXMgc3RkaW4gKi8KLSNpZmRlZiBVU0VfU0VUTU9ERQkJLyogbmVlZCB0byBoYWNrIGZpbGUgbW9kZT8gKi8KLSAgICBzZXRtb2RlKGZpbGVubyhzdGRpbiksIE9fQklOQVJZKTsKLSNlbmRpZgotI2lmZGVmIFVTRV9GRE9QRU4JCS8qIG5lZWQgdG8gcmUtb3BlbiBpbiBiaW5hcnkgbW9kZT8gKi8KLSAgICBpZiAoKGluZmlsZSA9IGZkb3BlbihmaWxlbm8oc3RkaW4pLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gc3RkaW5cbiIsIHByb2duYW1lKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0jZWxzZQotICAgIGluZmlsZSA9IHN0ZGluOwotI2VuZGlmCi0gIH0KLQotICAvKiBTY2FuIHRoZSBKUEVHIGhlYWRlcnMuICovCi0gICh2b2lkKSBzY2FuX0pQRUdfaGVhZGVyKHZlcmJvc2UpOwotCi0gIC8qIEFsbCBkb25lLiAqLwotICBleGl0KEVYSVRfU1VDQ0VTUyk7Ci0gIHJldHVybiAwOwkJCS8qIHN1cHByZXNzIG5vLXJldHVybi12YWx1ZSB3YXJuaW5ncyAqLwotfQpkaWZmIC0tZ2l0IGEvcmRwcG0uYyBiL3JkcHBtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjM1YzEuLjAwMDAwMDAKLS0tIGEvcmRwcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDQ1OCArMCwwIEBACi0vKgotICogcmRwcG0uYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHJlYWQgaW5wdXQgaW1hZ2VzIGluIFBQTS9QR00gZm9ybWF0LgotICogVGhlIGV4dGVuZGVkIDItYnl0ZS1wZXItc2FtcGxlIHJhdyBQUE0vUEdNIGZvcm1hdHMgYXJlIHN1cHBvcnRlZC4KLSAqIFRoZSBQQk1QTFVTIGxpYnJhcnkgaXMgTk9UIHJlcXVpcmVkIHRvIGNvbXBpbGUgdGhpcyBzb2Z0d2FyZQotICogKGJ1dCBpdCBpcyBoaWdobHkgdXNlZnVsIGFzIGEgc2V0IG9mIFBQTSBpbWFnZSBtYW5pcHVsYXRpb24gcHJvZ3JhbXMpLgotICoKLSAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCi0gKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBpbnB1dCBmcm9tCi0gKiBhbiBvcmRpbmFyeSBzdGRpbyBzdHJlYW0uICBUaGV5IGZ1cnRoZXIgYXNzdW1lIHRoYXQgcmVhZGluZyBiZWdpbnMKLSAqIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZTsgc3RhcnRfaW5wdXQgbWF5IG5lZWQgd29yayBpZiB0aGUKLSAqIHVzZXIgaW50ZXJmYWNlIGhhcyBhbHJlYWR5IHJlYWQgc29tZSBkYXRhIChlLmcuLCB0byBkZXRlcm1pbmUgdGhhdAotICogdGhlIGZpbGUgaXMgaW5kZWVkIFBQTSBmb3JtYXQpLgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0KLSNpZmRlZiBQUE1fU1VQUE9SVEVECi0KLQotLyogUG9ydGlvbnMgb2YgdGhpcyBjb2RlIGFyZSBiYXNlZCBvbiB0aGUgUEJNUExVUyBsaWJyYXJ5LCB3aGljaCBpczoKLSoqCi0qKiBDb3B5cmlnaHQgKEMpIDE5ODggYnkgSmVmIFBvc2thbnplci4KLSoqCi0qKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSoqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQKLSoqIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0qKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0qKiBkb2N1bWVudGF0aW9uLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvcgotKiogaW1wbGllZCB3YXJyYW50eS4KLSovCi0KLQotLyogTWFjcm9zIHRvIGRlYWwgd2l0aCB1bnNpZ25lZCBjaGFycyBhcyBlZmZpY2llbnRseSBhcyBjb21waWxlciBhbGxvd3MgKi8KLQotI2lmZGVmIEhBVkVfVU5TSUdORURfQ0hBUgotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVfQ0hBUjsKLSNkZWZpbmUgVUNIKHgpCSgoaW50KSAoeCkpCi0jZWxzZSAvKiAhSEFWRV9VTlNJR05FRF9DSEFSICovCi0jaWZkZWYgQ0hBUl9JU19VTlNJR05FRAotdHlwZWRlZiBjaGFyIFVfQ0hBUjsKLSNkZWZpbmUgVUNIKHgpCSgoaW50KSAoeCkpCi0jZWxzZQotdHlwZWRlZiBjaGFyIFVfQ0hBUjsKLSNkZWZpbmUgVUNIKHgpCSgoaW50KSAoeCkgJiAweEZGKQotI2VuZGlmCi0jZW5kaWYgLyogSEFWRV9VTlNJR05FRF9DSEFSICovCi0KLQotI2RlZmluZQlSZWFkT0soZmlsZSxidWZmZXIsbGVuKQkoSkZSRUFEKGZpbGUsYnVmZmVyLGxlbikgPT0gKChzaXplX3QpIChsZW4pKSkKLQotCi0vKgotICogT24gbW9zdCBzeXN0ZW1zLCByZWFkaW5nIGluZGl2aWR1YWwgYnl0ZXMgd2l0aCBnZXRjKCkgaXMgZHJhc3RpY2FsbHkgbGVzcwotICogZWZmaWNpZW50IHRoYW4gYnVmZmVyaW5nIGEgcm93IGF0IGEgdGltZSB3aXRoIGZyZWFkKCkuICBPbiBQQ3MsIHdlIG11c3QKLSAqIGFsbG9jYXRlIHRoZSBidWZmZXIgaW4gbmVhciBkYXRhIHNwYWNlLCBiZWNhdXNlIHdlIGFyZSBhc3N1bWluZyBzbWFsbC1kYXRhCi0gKiBtZW1vcnkgbW9kZWwsIHdoZXJlaW4gZnJlYWQoKSBjYW4ndCByZWFjaCBmYXIgbWVtb3J5LiAgSWYgeW91IG5lZWQgdG8KLSAqIHByb2Nlc3MgdmVyeSB3aWRlIGltYWdlcyBvbiBhIFBDLCB5b3UgbWlnaHQgaGF2ZSB0byBjb21waWxlIGluIGxhcmdlLW1lbW9yeQotICogbW9kZWwsIG9yIGVsc2UgcmVwbGFjZSBmcmVhZCgpIHdpdGggYSBnZXRjKCkgbG9vcCAtLS0gd2hpY2ggd2lsbCBiZSBtdWNoCi0gKiBzbG93ZXIuCi0gKi8KLQotCi0vKiBQcml2YXRlIHZlcnNpb24gb2YgZGF0YSBzb3VyY2Ugb2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGNqcGVnX3NvdXJjZV9zdHJ1Y3QgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgVV9DSEFSICppb2J1ZmZlcjsJCS8qIG5vbi1GQVIgcG9pbnRlciB0byBJL08gYnVmZmVyICovCi0gIEpTQU1QUk9XIHBpeHJvdzsJCS8qIEZBUiBwb2ludGVyIHRvIHNhbWUgKi8KLSAgc2l6ZV90IGJ1ZmZlcl93aWR0aDsJCS8qIHdpZHRoIG9mIEkvTyBidWZmZXIgKi8KLSAgSlNBTVBMRSAqcmVzY2FsZTsJCS8qID0+IG1heHZhbC1yZW1hcHBpbmcgYXJyYXksIG9yIE5VTEwgKi8KLX0gcHBtX3NvdXJjZV9zdHJ1Y3Q7Ci0KLXR5cGVkZWYgcHBtX3NvdXJjZV9zdHJ1Y3QgKiBwcG1fc291cmNlX3B0cjsKLQotCi1MT0NBTChpbnQpCi1wYm1fZ2V0YyAoRklMRSAqIGluZmlsZSkKLS8qIFJlYWQgbmV4dCBjaGFyLCBza2lwcGluZyBvdmVyIGFueSBjb21tZW50cyAqLwotLyogQSBjb21tZW50L25ld2xpbmUgc2VxdWVuY2UgaXMgcmV0dXJuZWQgYXMgYSBuZXdsaW5lICovCi17Ci0gIHJlZ2lzdGVyIGludCBjaDsKLQotICBjaCA9IGdldGMoaW5maWxlKTsKLSAgaWYgKGNoID09ICcjJykgewotICAgIGRvIHsKLSAgICAgIGNoID0gZ2V0YyhpbmZpbGUpOwotICAgIH0gd2hpbGUgKGNoICE9ICdcbicgJiYgY2ggIT0gRU9GKTsKLSAgfQotICByZXR1cm4gY2g7Ci19Ci0KLQotTE9DQUwodW5zaWduZWQgaW50KQotcmVhZF9wYm1faW50ZWdlciAoal9jb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBpbmZpbGUpCi0vKiBSZWFkIGFuIHVuc2lnbmVkIGRlY2ltYWwgaW50ZWdlciBmcm9tIHRoZSBQUE0gZmlsZSAqLwotLyogU3dhbGxvd3Mgb25lIHRyYWlsaW5nIGNoYXJhY3RlciBhZnRlciB0aGUgaW50ZWdlciAqLwotLyogTm90ZSB0aGF0IG9uIGEgMTYtYml0LWludCBtYWNoaW5lLCBvbmx5IHZhbHVlcyB1cCB0byA2NGsgY2FuIGJlIHJlYWQuICovCi0vKiBUaGlzIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtIGluIHByYWN0aWNlLiAqLwotewotICByZWdpc3RlciBpbnQgY2g7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCB2YWw7Ci0KLSAgLyogU2tpcCBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gIGRvIHsKLSAgICBjaCA9IHBibV9nZXRjKGluZmlsZSk7Ci0gICAgaWYgKGNoID09IEVPRikKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKLSAgfSB3aGlsZSAoY2ggPT0gJyAnIHx8IGNoID09ICdcdCcgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInKTsKLQotICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9QUE1fTk9OTlVNRVJJQyk7Ci0KLSAgdmFsID0gY2ggLSAnMCc7Ci0gIHdoaWxlICgoY2ggPSBwYm1fZ2V0YyhpbmZpbGUpKSA+PSAnMCcgJiYgY2ggPD0gJzknKSB7Ci0gICAgdmFsICo9IDEwOwotICAgIHZhbCArPSBjaCAtICcwJzsKLSAgfQotICByZXR1cm4gdmFsOwotfQotCi0KLS8qCi0gKiBSZWFkIG9uZSByb3cgb2YgcGl4ZWxzLgotICoKLSAqIFdlIHByb3ZpZGUgc2V2ZXJhbCBkaWZmZXJlbnQgdmVyc2lvbnMgZGVwZW5kaW5nIG9uIGlucHV0IGZpbGUgZm9ybWF0LgotICogSW4gYWxsIGNhc2VzLCBpbnB1dCBpcyBzY2FsZWQgdG8gdGhlIHNpemUgb2YgSlNBTVBMRS4KLSAqCi0gKiBBIHJlYWxseSBmYXN0IHBhdGggaXMgcHJvdmlkZWQgZm9yIHJlYWRpbmcgYnl0ZS9zYW1wbGUgcmF3IGZpbGVzIHdpdGgKLSAqIG1heHZhbCA9IE1BWEpTQU1QTEUsIHdoaWNoIGlzIHRoZSBub3JtYWwgY2FzZSBmb3IgOC1iaXQgZGF0YS4KLSAqLwotCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotZ2V0X3RleHRfZ3JheV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIHRleHQtZm9ybWF0IFBHTSBmaWxlcyB3aXRoIGFueSBtYXh2YWwgKi8KLXsKLSAgcHBtX3NvdXJjZV9wdHIgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgRklMRSAqIGluZmlsZSA9IHNvdXJjZS0+cHViLmlucHV0X2ZpbGU7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBMRSAqcmVzY2FsZSA9IHNvdXJjZS0+cmVzY2FsZTsKLSAgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOwotICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICAqcHRyKysgPSByZXNjYWxlW3JlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSldOwotICB9Ci0gIHJldHVybiAxOwotfQotCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotZ2V0X3RleHRfcmdiX3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgdGV4dC1mb3JtYXQgUFBNIGZpbGVzIHdpdGggYW55IG1heHZhbCAqLwotewotICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOwotICBGSUxFICogaW5maWxlID0gc291cmNlLT5wdWIuaW5wdXRfZmlsZTsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOwotICByZWdpc3RlciBKU0FNUExFICpyZXNjYWxlID0gc291cmNlLT5yZXNjYWxlOwotICBKRElNRU5TSU9OIGNvbDsKLQotICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07Ci0gIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICpwdHIrKyA9IHJlc2NhbGVbcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKV07Ci0gICAgKnB0cisrID0gcmVzY2FsZVtyZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpXTsKLSAgICAqcHRyKysgPSByZXNjYWxlW3JlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSldOwotICB9Ci0gIHJldHVybiAxOwotfQotCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotZ2V0X3NjYWxlZF9ncmF5X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgcmF3LWJ5dGUtZm9ybWF0IFBHTSBmaWxlcyB3aXRoIGFueSBtYXh2YWwgKi8KLXsKLSAgcHBtX3NvdXJjZV9wdHIgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOwotICByZWdpc3RlciBVX0NIQVIgKiBidWZmZXJwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QTEUgKnJlc2NhbGUgPSBzb3VyY2UtPnJlc2NhbGU7Ci0gIEpESU1FTlNJT04gY29sOwotCi0gIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBzb3VyY2UtPmlvYnVmZmVyLCBzb3VyY2UtPmJ1ZmZlcl93aWR0aCkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOwotICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07Ci0gIGJ1ZmZlcnB0ciA9IHNvdXJjZS0+aW9idWZmZXI7Ci0gIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICpwdHIrKyA9IHJlc2NhbGVbVUNIKCpidWZmZXJwdHIrKyldOwotICB9Ci0gIHJldHVybiAxOwotfQotCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotZ2V0X3NjYWxlZF9yZ2Jfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLS8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyByYXctYnl0ZS1mb3JtYXQgUFBNIGZpbGVzIHdpdGggYW55IG1heHZhbCAqLwotewotICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOwotICByZWdpc3RlciBKU0FNUFJPVyBwdHI7Ci0gIHJlZ2lzdGVyIFVfQ0hBUiAqIGJ1ZmZlcnB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBMRSAqcmVzY2FsZSA9IHNvdXJjZS0+cmVzY2FsZTsKLSAgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIHNvdXJjZS0+aW9idWZmZXIsIHNvdXJjZS0+YnVmZmVyX3dpZHRoKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7Ci0gIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKLSAgYnVmZmVycHRyID0gc291cmNlLT5pb2J1ZmZlcjsKLSAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgKnB0cisrID0gcmVzY2FsZVtVQ0goKmJ1ZmZlcnB0cisrKV07Ci0gICAgKnB0cisrID0gcmVzY2FsZVtVQ0goKmJ1ZmZlcnB0cisrKV07Ci0gICAgKnB0cisrID0gcmVzY2FsZVtVQ0goKmJ1ZmZlcnB0cisrKV07Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotTUVUSE9EREVGKEpESU1FTlNJT04pCi1nZXRfcmF3X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgcmF3LWJ5dGUtZm9ybWF0IGZpbGVzIHdpdGggbWF4dmFsID0gTUFYSlNBTVBMRS4KLSAqIEluIHRoaXMgY2FzZSB3ZSBqdXN0IHJlYWQgcmlnaHQgaW50byB0aGUgSlNBTVBMRSBidWZmZXIhCi0gKiBOb3RlIHRoYXQgc2FtZSBjb2RlIHdvcmtzIGZvciBQUE0gYW5kIFBHTSBmaWxlcy4KLSAqLwotewotICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOwotCi0gIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBzb3VyY2UtPmlvYnVmZmVyLCBzb3VyY2UtPmJ1ZmZlcl93aWR0aCkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOwotICByZXR1cm4gMTsKLX0KLQotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLWdldF93b3JkX2dyYXlfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLS8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyByYXctd29yZC1mb3JtYXQgUEdNIGZpbGVzIHdpdGggYW55IG1heHZhbCAqLwotewotICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOwotICByZWdpc3RlciBKU0FNUFJPVyBwdHI7Ci0gIHJlZ2lzdGVyIFVfQ0hBUiAqIGJ1ZmZlcnB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBMRSAqcmVzY2FsZSA9IHNvdXJjZS0+cmVzY2FsZTsKLSAgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIHNvdXJjZS0+aW9idWZmZXIsIHNvdXJjZS0+YnVmZmVyX3dpZHRoKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7Ci0gIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKLSAgYnVmZmVycHRyID0gc291cmNlLT5pb2J1ZmZlcjsKLSAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0gICAgdGVtcCAgPSBVQ0goKmJ1ZmZlcnB0cisrKTsKLSAgICB0ZW1wIHw9IFVDSCgqYnVmZmVycHRyKyspIDw8IDg7Ci0gICAgKnB0cisrID0gcmVzY2FsZVt0ZW1wXTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLWdldF93b3JkX3JnYl9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIHJhdy13b3JkLWZvcm1hdCBQUE0gZmlsZXMgd2l0aCBhbnkgbWF4dmFsICovCi17Ci0gIHBwbV9zb3VyY2VfcHRyIHNvdXJjZSA9IChwcG1fc291cmNlX3B0cikgc2luZm87Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgVV9DSEFSICogYnVmZmVycHRyOwotICByZWdpc3RlciBKU0FNUExFICpyZXNjYWxlID0gc291cmNlLT5yZXNjYWxlOwotICBKRElNRU5TSU9OIGNvbDsKLQotICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgc291cmNlLT5pb2J1ZmZlciwgc291cmNlLT5idWZmZXJfd2lkdGgpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKLSAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOwotICBidWZmZXJwdHIgPSBzb3VyY2UtPmlvYnVmZmVyOwotICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICByZWdpc3RlciBpbnQgdGVtcDsKLSAgICB0ZW1wICA9IFVDSCgqYnVmZmVycHRyKyspOwotICAgIHRlbXAgfD0gVUNIKCpidWZmZXJwdHIrKykgPDwgODsKLSAgICAqcHRyKysgPSByZXNjYWxlW3RlbXBdOwotICAgIHRlbXAgID0gVUNIKCpidWZmZXJwdHIrKyk7Ci0gICAgdGVtcCB8PSBVQ0goKmJ1ZmZlcnB0cisrKSA8PCA4OwotICAgICpwdHIrKyA9IHJlc2NhbGVbdGVtcF07Ci0gICAgdGVtcCAgPSBVQ0goKmJ1ZmZlcnB0cisrKTsKLSAgICB0ZW1wIHw9IFVDSCgqYnVmZmVycHRyKyspIDw8IDg7Ci0gICAgKnB0cisrID0gcmVzY2FsZVt0ZW1wXTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotCi0vKgotICogUmVhZCB0aGUgZmlsZSBoZWFkZXI7IHJldHVybiBpbWFnZSBzaXplIGFuZCBjb21wb25lbnQgY291bnQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9pbnB1dF9wcG0gKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotewotICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOwotICBpbnQgYzsKLSAgdW5zaWduZWQgaW50IHcsIGgsIG1heHZhbDsKLSAgYm9vbGVhbiBuZWVkX2lvYnVmZmVyLCB1c2VfcmF3X2J1ZmZlciwgbmVlZF9yZXNjYWxlOwotCi0gIGlmIChnZXRjKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUpICE9ICdQJykKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1BQTV9OT1QpOwotCi0gIGMgPSBnZXRjKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUpOyAvKiBzdWJmb3JtYXQgZGlzY3JpbWluYXRvciBjaGFyYWN0ZXIgKi8KLQotICAvKiBkZXRlY3QgdW5zdXBwb3J0ZWQgdmFyaWFudHMgKGllLCBQQk0pIGJlZm9yZSB0cnlpbmcgdG8gcmVhZCBoZWFkZXIgKi8KLSAgc3dpdGNoIChjKSB7Ci0gIGNhc2UgJzInOgkJCS8qIGl0J3MgYSB0ZXh0LWZvcm1hdCBQR00gZmlsZSAqLwotICBjYXNlICczJzoJCQkvKiBpdCdzIGEgdGV4dC1mb3JtYXQgUFBNIGZpbGUgKi8KLSAgY2FzZSAnNSc6CQkJLyogaXQncyBhIHJhdy1mb3JtYXQgUEdNIGZpbGUgKi8KLSAgY2FzZSAnNic6CQkJLyogaXQncyBhIHJhdy1mb3JtYXQgUFBNIGZpbGUgKi8KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1BQTV9OT1QpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogZmV0Y2ggdGhlIHJlbWFpbmluZyBoZWFkZXIgaW5mbyAqLwotICB3ID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgc291cmNlLT5wdWIuaW5wdXRfZmlsZSk7Ci0gIGggPSByZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBzb3VyY2UtPnB1Yi5pbnB1dF9maWxlKTsKLSAgbWF4dmFsID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgc291cmNlLT5wdWIuaW5wdXRfZmlsZSk7Ci0KLSAgaWYgKHcgPD0gMCB8fCBoIDw9IDAgfHwgbWF4dmFsIDw9IDApIC8qIGVycm9yIGNoZWNrICovCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9QUE1fTk9UKTsKLQotICBjaW5mby0+ZGF0YV9wcmVjaXNpb24gPSBCSVRTX0lOX0pTQU1QTEU7IC8qIHdlIGFsd2F5cyByZXNjYWxlIGRhdGEgdG8gdGhpcyAqLwotICBjaW5mby0+aW1hZ2Vfd2lkdGggPSAoSkRJTUVOU0lPTikgdzsKLSAgY2luZm8tPmltYWdlX2hlaWdodCA9IChKRElNRU5TSU9OKSBoOwotCi0gIC8qIGluaXRpYWxpemUgZmxhZ3MgdG8gbW9zdCBjb21tb24gc2V0dGluZ3MgKi8KLSAgbmVlZF9pb2J1ZmZlciA9IFRSVUU7CQkvKiBkbyB3ZSBuZWVkIGFuIEkvTyBidWZmZXI/ICovCi0gIHVzZV9yYXdfYnVmZmVyID0gRkFMU0U7CS8qIGRvIHdlIG1hcCBpbnB1dCBidWZmZXIgb250byBJL08gYnVmZmVyPyAqLwotICBuZWVkX3Jlc2NhbGUgPSBUUlVFOwkJLyogZG8gd2UgbmVlZCBhIHJlc2NhbGUgYXJyYXk/ICovCi0KLSAgc3dpdGNoIChjKSB7Ci0gIGNhc2UgJzInOgkJCS8qIGl0J3MgYSB0ZXh0LWZvcm1hdCBQR00gZmlsZSAqLwotICAgIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzID0gMTsKLSAgICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOwotICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1BHTV9URVhULCB3LCBoKTsKLSAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF90ZXh0X2dyYXlfcm93OwotICAgIG5lZWRfaW9idWZmZXIgPSBGQUxTRTsKLSAgICBicmVhazsKLQotICBjYXNlICczJzoJCQkvKiBpdCdzIGEgdGV4dC1mb3JtYXQgUFBNIGZpbGUgKi8KLSAgICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IDM7Ci0gICAgY2luZm8tPmluX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKLSAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19QUE1fVEVYVCwgdywgaCk7Ci0gICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfdGV4dF9yZ2Jfcm93OwotICAgIG5lZWRfaW9idWZmZXIgPSBGQUxTRTsKLSAgICBicmVhazsKLQotICBjYXNlICc1JzoJCQkvKiBpdCdzIGEgcmF3LWZvcm1hdCBQR00gZmlsZSAqLwotICAgIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzID0gMTsKLSAgICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOwotICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1BHTSwgdywgaCk7Ci0gICAgaWYgKG1heHZhbCA+IDI1NSkgewotICAgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfd29yZF9ncmF5X3JvdzsKLSAgICB9IGVsc2UgaWYgKG1heHZhbCA9PSBNQVhKU0FNUExFICYmIFNJWkVPRihKU0FNUExFKSA9PSBTSVpFT0YoVV9DSEFSKSkgewotICAgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfcmF3X3JvdzsKLSAgICAgIHVzZV9yYXdfYnVmZmVyID0gVFJVRTsKLSAgICAgIG5lZWRfcmVzY2FsZSA9IEZBTFNFOwotICAgIH0gZWxzZSB7Ci0gICAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF9zY2FsZWRfZ3JheV9yb3c7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgJzYnOgkJCS8qIGl0J3MgYSByYXctZm9ybWF0IFBQTSBmaWxlICovCi0gICAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAzOwotICAgIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7Ci0gICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfUFBNLCB3LCBoKTsKLSAgICBpZiAobWF4dmFsID4gMjU1KSB7Ci0gICAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF93b3JkX3JnYl9yb3c7Ci0gICAgfSBlbHNlIGlmIChtYXh2YWwgPT0gTUFYSlNBTVBMRSAmJiBTSVpFT0YoSlNBTVBMRSkgPT0gU0laRU9GKFVfQ0hBUikpIHsKLSAgICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X3Jhd19yb3c7Ci0gICAgICB1c2VfcmF3X2J1ZmZlciA9IFRSVUU7Ci0gICAgICBuZWVkX3Jlc2NhbGUgPSBGQUxTRTsKLSAgICB9IGVsc2UgewotICAgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfc2NhbGVkX3JnYl9yb3c7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIEkvTyBidWZmZXI6IDEgb3IgMyBieXRlcyBvciB3b3Jkcy9waXhlbC4gKi8KLSAgaWYgKG5lZWRfaW9idWZmZXIpIHsKLSAgICBzb3VyY2UtPmJ1ZmZlcl93aWR0aCA9IChzaXplX3QpIHcgKiBjaW5mby0+aW5wdXRfY29tcG9uZW50cyAqCi0gICAgICAoKG1heHZhbDw9MjU1KSA/IFNJWkVPRihVX0NIQVIpIDogKDIqU0laRU9GKFVfQ0hBUikpKTsKLSAgICBzb3VyY2UtPmlvYnVmZmVyID0gKFVfQ0hBUiAqKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIHNvdXJjZS0+YnVmZmVyX3dpZHRoKTsKLSAgfQotCi0gIC8qIENyZWF0ZSBjb21wcmVzc29yIGlucHV0IGJ1ZmZlci4gKi8KLSAgaWYgKHVzZV9yYXdfYnVmZmVyKSB7Ci0gICAgLyogRm9yIHVuc2NhbGVkIHJhdy1pbnB1dCBjYXNlLCB3ZSBjYW4ganVzdCBtYXAgaXQgb250byB0aGUgSS9PIGJ1ZmZlci4gKi8KLSAgICAvKiBTeW50aGVzaXplIGEgSlNBTVBBUlJBWSBwb2ludGVyIHN0cnVjdHVyZSAqLwotICAgIC8qIENhc3QgaGVyZSBpbXBsaWVzIG5lYXItPmZhciBwb2ludGVyIGNvbnZlcnNpb24gb24gUENzICovCi0gICAgc291cmNlLT5waXhyb3cgPSAoSlNBTVBST1cpIHNvdXJjZS0+aW9idWZmZXI7Ci0gICAgc291cmNlLT5wdWIuYnVmZmVyID0gJiBzb3VyY2UtPnBpeHJvdzsKLSAgICBzb3VyY2UtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKLSAgfSBlbHNlIHsKLSAgICAvKiBOZWVkIHRvIHRyYW5zbGF0ZSBhbnl3YXksIHNvIG1ha2UgYSBzZXBhcmF0ZSBzYW1wbGUgYnVmZmVyLiAqLwotICAgIHNvdXJjZS0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLSAgICAgICAoSkRJTUVOU0lPTikgdyAqIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzLCAoSkRJTUVOU0lPTikgMSk7Ci0gICAgc291cmNlLT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7Ci0gIH0KLQotICAvKiBDb21wdXRlIHRoZSByZXNjYWxpbmcgYXJyYXkgaWYgcmVxdWlyZWQuICovCi0gIGlmIChuZWVkX3Jlc2NhbGUpIHsKLSAgICBJTlQzMiB2YWwsIGhhbGZfbWF4dmFsOwotCi0gICAgLyogT24gMTYtYml0LWludCBtYWNoaW5lcyB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwgb2YgbWF4dmFsID0gNjU1MzUgKi8KLSAgICBzb3VyY2UtPnJlc2NhbGUgPSAoSlNBTVBMRSAqKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIChzaXplX3QpICgoKGxvbmcpIG1heHZhbCArIDFMKSAqIFNJWkVPRihKU0FNUExFKSkpOwotICAgIGhhbGZfbWF4dmFsID0gbWF4dmFsIC8gMjsKLSAgICBmb3IgKHZhbCA9IDA7IHZhbCA8PSAoSU5UMzIpIG1heHZhbDsgdmFsKyspIHsKLSAgICAgIC8qIFRoZSBtdWx0aXBsaWNhdGlvbiBoZXJlIG11c3QgYmUgZG9uZSBpbiAzMiBiaXRzIHRvIGF2b2lkIG92ZXJmbG93ICovCi0gICAgICBzb3VyY2UtPnJlc2NhbGVbdmFsXSA9IChKU0FNUExFKSAoKHZhbCpNQVhKU0FNUExFICsgaGFsZl9tYXh2YWwpL21heHZhbCk7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX2lucHV0X3BwbSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgKi8KLX0KLQotCi0vKgotICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgUFBNIGZvcm1hdCBpbnB1dC4KLSAqLwotCi1HTE9CQUwoY2pwZWdfc291cmNlX3B0cikKLWppbml0X3JlYWRfcHBtIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcHBtX3NvdXJjZV9wdHIgc291cmNlOwotCi0gIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCAqLwotICBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgU0laRU9GKHBwbV9zb3VyY2Vfc3RydWN0KSk7Ci0gIC8qIEZpbGwgaW4gbWV0aG9kIHB0cnMsIGV4Y2VwdCBnZXRfcGl4ZWxfcm93cyB3aGljaCBzdGFydF9pbnB1dCBzZXRzICovCi0gIHNvdXJjZS0+cHViLnN0YXJ0X2lucHV0ID0gc3RhcnRfaW5wdXRfcHBtOwotICBzb3VyY2UtPnB1Yi5maW5pc2hfaW5wdXQgPSBmaW5pc2hfaW5wdXRfcHBtOwotCi0gIHJldHVybiAoY2pwZWdfc291cmNlX3B0cikgc291cmNlOwotfQotCi0jZW5kaWYgLyogUFBNX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvcmRybGUuYyBiL3JkcmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MmJjMzcuLjAwMDAwMDAKLS0tIGEvcmRybGUuYworKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKgotICogcmRybGUuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHJlYWQgaW5wdXQgaW1hZ2VzIGluIFV0YWggUkxFIGZvcm1hdC4KLSAqIFRoZSBVdGFoIFJhc3RlciBUb29sa2l0IGxpYnJhcnkgaXMgcmVxdWlyZWQgKHZlcnNpb24gMy4xIG9yIGxhdGVyKS4KLSAqCi0gKiBUaGVzZSByb3V0aW5lcyBtYXkgbmVlZCBtb2RpZmljYXRpb24gZm9yIG5vbi1Vbml4IGVudmlyb25tZW50cyBvcgotICogc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgQXMgdGhleSBzdGFuZCwgdGhleSBhc3N1bWUgaW5wdXQgZnJvbQotICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLiAgVGhleSBmdXJ0aGVyIGFzc3VtZSB0aGF0IHJlYWRpbmcgYmVnaW5zCi0gKiBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGU7IHN0YXJ0X2lucHV0IG1heSBuZWVkIHdvcmsgaWYgdGhlCi0gKiB1c2VyIGludGVyZmFjZSBoYXMgYWxyZWFkeSByZWFkIHNvbWUgZGF0YSAoZS5nLiwgdG8gZGV0ZXJtaW5lIHRoYXQKLSAqIHRoZSBmaWxlIGlzIGluZGVlZCBSTEUgZm9ybWF0KS4KLSAqCi0gKiBCYXNlZCBvbiBjb2RlIGNvbnRyaWJ1dGVkIGJ5IE1pa2UgTGlqZXdza2ksCi0gKiB3aXRoIHVwZGF0ZXMgZnJvbSBSb2JlcnQgSHV0Y2hpbnNvbi4KLSAqLwotCi0jaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLwotCi0jaWZkZWYgUkxFX1NVUFBPUlRFRAotCi0vKiBybGUuaCBpcyBwcm92aWRlZCBieSB0aGUgVXRhaCBSYXN0ZXIgVG9vbGtpdC4gKi8KLQotI2luY2x1ZGUgPHJsZS5oPgotCi0vKgotICogV2UgYXNzdW1lIHRoYXQgSlNBTVBMRSBoYXMgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gYXMgcmxlX3BpeGVsLAotICogdG8gd2l0LCAidW5zaWduZWQgY2hhciIuICBIZW5jZSB3ZSBjYW4ndCBjb3BlIHdpdGggMTItIG9yIDE2LWJpdCBzYW1wbGVzLgotICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgIT0gOAotICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4LWJpdCBKU0FNUExFcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCi0jZW5kaWYKLQotLyoKLSAqIFdlIHN1cHBvcnQgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBSTEUgZmlsZXM6Ci0gKiAgIAotICogICBHUkFZU0NBTEUgICAtIDggYml0cywgbm8gY29sb3JtYXAKLSAqICAgTUFQUEVER1JBWSAgLSA4IGJpdHMsIDEgY2hhbm5lbCBjb2xvbWFwCi0gKiAgIFBTRVVET0NPTE9SIC0gOCBiaXRzLCAzIGNoYW5uZWwgY29sb3JtYXAKLSAqICAgVFJVRUNPTE9SICAgLSAyNCBiaXRzLCAzIGNoYW5uZWwgY29sb3JtYXAKLSAqICAgRElSRUNUQ09MT1IgLSAyNCBiaXRzLCBubyBjb2xvcm1hcAotICoKLSAqIEZvciBub3csIHdlIGlnbm9yZSBhbnkgYWxwaGEgY2hhbm5lbCBpbiB0aGUgaW1hZ2UuCi0gKi8KLQotdHlwZWRlZiBlbnVtCi0gIHsgR1JBWVNDQUxFLCBNQVBQRURHUkFZLCBQU0VVRE9DT0xPUiwgVFJVRUNPTE9SLCBESVJFQ1RDT0xPUiB9IHJsZV9raW5kOwotCi0KLS8qCi0gKiBTaW5jZSBSTEUgc3RvcmVzIHNjYW5saW5lcyBib3R0b20tdG8tdG9wLCB3ZSBoYXZlIHRvIGludmVydCB0aGUgaW1hZ2UKLSAqIHRvIGNvbmZvcm0gdG8gSlBFRydzIHRvcC10by1ib3R0b20gb3JkZXIuICBUbyBkbyB0aGlzLCB3ZSByZWFkIHRoZQotICogaW5jb21pbmcgaW1hZ2UgaW50byBhIHZpcnR1YWwgYXJyYXkgb24gdGhlIGZpcnN0IGdldF9waXhlbF9yb3dzIGNhbGwsCi0gKiB0aGVuIGZldGNoIHRoZSByZXF1aXJlZCByb3cgZnJvbSB0aGUgdmlydHVhbCBhcnJheSBvbiBzdWJzZXF1ZW50IGNhbGxzLgotICovCi0KLXR5cGVkZWYgc3RydWN0IF9ybGVfc291cmNlX3N0cnVjdCAqIHJsZV9zb3VyY2VfcHRyOwotCi10eXBlZGVmIHN0cnVjdCBfcmxlX3NvdXJjZV9zdHJ1Y3QgewotICBzdHJ1Y3QgY2pwZWdfc291cmNlX3N0cnVjdCBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBybGVfa2luZCB2aXN1YWw7ICAgICAgICAgICAgICAvKiBhY3R1YWwgdHlwZSBvZiBpbnB1dCBmaWxlICovCi0gIGp2aXJ0X3NhcnJheV9wdHIgaW1hZ2U7ICAgICAgIC8qIHZpcnR1YWwgYXJyYXkgdG8gaG9sZCB0aGUgaW1hZ2UgKi8KLSAgSkRJTUVOU0lPTiByb3c7CQkvKiBjdXJyZW50IHJvdyAjIGluIHRoZSB2aXJ0dWFsIGFycmF5ICovCi0gIHJsZV9oZHIgaGVhZGVyOyAgICAgICAgICAgICAgIC8qIElucHV0IGZpbGUgaW5mb3JtYXRpb24gKi8KLSAgcmxlX3BpeGVsKiogcmxlX3JvdzsgICAgICAgICAgLyogaG9sZHMgYSByb3cgcmV0dXJuZWQgYnkgcmxlX2dldHJvdygpICovCi0KLX0gcmxlX3NvdXJjZV9zdHJ1Y3Q7Ci0KLQotLyoKLSAqIFJlYWQgdGhlIGZpbGUgaGVhZGVyOyByZXR1cm4gaW1hZ2Ugc2l6ZSBhbmQgY29tcG9uZW50IGNvdW50LgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfaW5wdXRfcmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLXsKLSAgcmxlX3NvdXJjZV9wdHIgc291cmNlID0gKHJsZV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgSkRJTUVOU0lPTiB3aWR0aCwgaGVpZ2h0OwotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7Ci0jZW5kaWYKLQotICAvKiBVc2UgUkxFIGxpYnJhcnkgcm91dGluZSB0byBnZXQgdGhlIGhlYWRlciBpbmZvICovCi0gIHNvdXJjZS0+aGVhZGVyID0gKnJsZV9oZHJfaW5pdChOVUxMKTsKLSAgc291cmNlLT5oZWFkZXIucmxlX2ZpbGUgPSBzb3VyY2UtPnB1Yi5pbnB1dF9maWxlOwotICBzd2l0Y2ggKHJsZV9nZXRfc2V0dXAoJihzb3VyY2UtPmhlYWRlcikpKSB7Ci0gIGNhc2UgUkxFX1NVQ0NFU1M6Ci0gICAgLyogQS1PSyAqLwotICAgIGJyZWFrOwotICBjYXNlIFJMRV9OT1RfUkxFOgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUkxFX05PVCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgUkxFX05PX1NQQUNFOgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUkxFX01FTSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgUkxFX0VNUFRZOgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUkxFX0VNUFRZKTsKLSAgICBicmVhazsKLSAgY2FzZSBSTEVfRU9GOgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUkxFX0VPRik7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9STEVfQkFERVJST1IpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogRmlndXJlIG91dCB3aGF0IHdlIGhhdmUsIHNldCBwcml2YXRlIHZhcnMgYW5kIHJldHVybiB2YWx1ZXMgYWNjb3JkaW5nbHkgKi8KLSAgCi0gIHdpZHRoICA9IHNvdXJjZS0+aGVhZGVyLnhtYXggLSBzb3VyY2UtPmhlYWRlci54bWluICsgMTsKLSAgaGVpZ2h0ID0gc291cmNlLT5oZWFkZXIueW1heCAtIHNvdXJjZS0+aGVhZGVyLnltaW4gKyAxOwotICBzb3VyY2UtPmhlYWRlci54bWluID0gMDsJCS8qIHJlYWxpZ24gaG9yaXpvbnRhbGx5ICovCi0gIHNvdXJjZS0+aGVhZGVyLnhtYXggPSB3aWR0aC0xOwotCi0gIGNpbmZvLT5pbWFnZV93aWR0aCAgICAgID0gd2lkdGg7Ci0gIGNpbmZvLT5pbWFnZV9oZWlnaHQgICAgID0gaGVpZ2h0OwotICBjaW5mby0+ZGF0YV9wcmVjaXNpb24gICA9IDg7ICAvKiB3ZSBjYW4gb25seSBoYW5kbGUgOCBiaXQgZGF0YSAqLwotCi0gIGlmIChzb3VyY2UtPmhlYWRlci5uY29sb3JzID09IDEgJiYgc291cmNlLT5oZWFkZXIubmNtYXAgPT0gMCkgewotICAgIHNvdXJjZS0+dmlzdWFsICAgICA9IEdSQVlTQ0FMRTsKLSAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19STEVfR1JBWSwgd2lkdGgsIGhlaWdodCk7Ci0gIH0gZWxzZSBpZiAoc291cmNlLT5oZWFkZXIubmNvbG9ycyA9PSAxICYmIHNvdXJjZS0+aGVhZGVyLm5jbWFwID09IDEpIHsKLSAgICBzb3VyY2UtPnZpc3VhbCAgICAgPSBNQVBQRURHUkFZOwotICAgIFRSQUNFTVMzKGNpbmZvLCAxLCBKVFJDX1JMRV9NQVBHUkFZLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgIDEgPDwgc291cmNlLT5oZWFkZXIuY21hcGxlbik7Ci0gIH0gZWxzZSBpZiAoc291cmNlLT5oZWFkZXIubmNvbG9ycyA9PSAxICYmIHNvdXJjZS0+aGVhZGVyLm5jbWFwID09IDMpIHsKLSAgICBzb3VyY2UtPnZpc3VhbCAgICAgPSBQU0VVRE9DT0xPUjsKLSAgICBUUkFDRU1TMyhjaW5mbywgMSwgSlRSQ19STEVfTUFQUEVELCB3aWR0aCwgaGVpZ2h0LAotCSAgICAgMSA8PCBzb3VyY2UtPmhlYWRlci5jbWFwbGVuKTsKLSAgfSBlbHNlIGlmIChzb3VyY2UtPmhlYWRlci5uY29sb3JzID09IDMgJiYgc291cmNlLT5oZWFkZXIubmNtYXAgPT0gMykgewotICAgIHNvdXJjZS0+dmlzdWFsICAgICA9IFRSVUVDT0xPUjsKLSAgICBUUkFDRU1TMyhjaW5mbywgMSwgSlRSQ19STEVfRlVMTE1BUCwgd2lkdGgsIGhlaWdodCwKLQkgICAgIDEgPDwgc291cmNlLT5oZWFkZXIuY21hcGxlbik7Ci0gIH0gZWxzZSBpZiAoc291cmNlLT5oZWFkZXIubmNvbG9ycyA9PSAzICYmIHNvdXJjZS0+aGVhZGVyLm5jbWFwID09IDApIHsKLSAgICBzb3VyY2UtPnZpc3VhbCAgICAgPSBESVJFQ1RDT0xPUjsKLSAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19STEUsIHdpZHRoLCBoZWlnaHQpOwotICB9IGVsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1JMRV9VTlNVUFBPUlRFRCk7Ci0gIAotICBpZiAoc291cmNlLT52aXN1YWwgPT0gR1JBWVNDQUxFIHx8IHNvdXJjZS0+dmlzdWFsID09IE1BUFBFREdSQVkpIHsKLSAgICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgICA9IEpDU19HUkFZU0NBTEU7Ci0gICAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAxOwotICB9IGVsc2UgewotICAgIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSAgID0gSkNTX1JHQjsKLSAgICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IDM7Ci0gIH0KLQotICAvKgotICAgKiBBIHBsYWNlIHRvIGhvbGQgZWFjaCBzY2FubGluZSB3aGlsZSBpdCdzIGNvbnZlcnRlZC4KLSAgICogKEdSQVlTQ0FMRSBzY2FubGluZXMgZG9uJ3QgbmVlZCBjb252ZXJ0aW5nKQotICAgKi8KLSAgaWYgKHNvdXJjZS0+dmlzdWFsICE9IEdSQVlTQ0FMRSkgewotICAgIHNvdXJjZS0+cmxlX3JvdyA9IChybGVfcGl4ZWwqKikgKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAgIChKRElNRU5TSU9OKSB3aWR0aCwgKEpESU1FTlNJT04pIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzKTsKLSAgfQotCi0gIC8qIHJlcXVlc3QgYSB2aXJ0dWFsIGFycmF5IHRvIGhvbGQgdGhlIGltYWdlICovCi0gIHNvdXJjZS0+aW1hZ2UgPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCi0gICAgIChKRElNRU5TSU9OKSAod2lkdGggKiBzb3VyY2UtPmhlYWRlci5uY29sb3JzKSwKLSAgICAgKEpESU1FTlNJT04pIGhlaWdodCwgKEpESU1FTlNJT04pIDEpOwotCi0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgLyogY291bnQgZmlsZSBpbnB1dCBhcyBzZXBhcmF0ZSBwYXNzICovCi0gICAgcHJvZ3Jlc3MtPnRvdGFsX2V4dHJhX3Bhc3NlcysrOwotICB9Ci0jZW5kaWYKLQotICBzb3VyY2UtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKLX0KLQotCi0vKgotICogUmVhZCBvbmUgcm93IG9mIHBpeGVscy4KLSAqIENhbGxlZCBvbmx5IGFmdGVyIGxvYWRfaW1hZ2UgaGFzIHJlYWQgdGhlIGltYWdlIGludG8gdGhlIHZpcnR1YWwgYXJyYXkuCi0gKiBVc2VkIGZvciBHUkFZU0NBTEUsIE1BUFBFREdSQVksIFRSVUVDT0xPUiwgYW5kIERJUkVDVENPTE9SIGltYWdlcy4KLSAqLwotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLWdldF9ybGVfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLXsKLSAgcmxlX3NvdXJjZV9wdHIgc291cmNlID0gKHJsZV9zb3VyY2VfcHRyKSBzaW5mbzsKLQotICBzb3VyY2UtPnJvdy0tOwotICBzb3VyY2UtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+aW1hZ2UsIHNvdXJjZS0+cm93LCAoSkRJTUVOU0lPTikgMSwgRkFMU0UpOwotCi0gIHJldHVybiAxOwotfQotCi0vKgotICogUmVhZCBvbmUgcm93IG9mIHBpeGVscy4KLSAqIENhbGxlZCBvbmx5IGFmdGVyIGxvYWRfaW1hZ2UgaGFzIHJlYWQgdGhlIGltYWdlIGludG8gdGhlIHZpcnR1YWwgYXJyYXkuCi0gKiBVc2VkIGZvciBQU0VVRE9DT0xPUiBpbWFnZXMuCi0gKi8KLQotTUVUSE9EREVGKEpESU1FTlNJT04pCi1nZXRfcHNldWRvY29sb3Jfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLXsKLSAgcmxlX3NvdXJjZV9wdHIgc291cmNlID0gKHJsZV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgSlNBTVBST1cgc3JjX3JvdywgZGVzdF9yb3c7Ci0gIEpESU1FTlNJT04gY29sOwotICBybGVfbWFwICpjb2xvcm1hcDsKLSAgaW50IHZhbDsKLQotICBjb2xvcm1hcCA9IHNvdXJjZS0+aGVhZGVyLmNtYXA7Ci0gIGRlc3Rfcm93ID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOwotICBzb3VyY2UtPnJvdy0tOwotICBzcmNfcm93ID0gKiAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+aW1hZ2UsIHNvdXJjZS0+cm93LCAoSkRJTUVOU0lPTikgMSwgRkFMU0UpOwotCi0gIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgIHZhbCA9IEdFVEpTQU1QTEUoKnNyY19yb3crKyk7Ci0gICAgKmRlc3Rfcm93KysgPSAoSlNBTVBMRSkgKGNvbG9ybWFwW3ZhbCAgICAgIF0gPj4gOCk7Ci0gICAgKmRlc3Rfcm93KysgPSAoSlNBTVBMRSkgKGNvbG9ybWFwW3ZhbCArIDI1Nl0gPj4gOCk7Ci0gICAgKmRlc3Rfcm93KysgPSAoSlNBTVBMRSkgKGNvbG9ybWFwW3ZhbCArIDUxMl0gPj4gOCk7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotCi0vKgotICogTG9hZCB0aGUgaW1hZ2UgaW50byBhIHZpcnR1YWwgYXJyYXkuICBXZSBoYXZlIHRvIGRvIHRoaXMgYmVjYXVzZSBSTEUKLSAqIGZpbGVzIHN0YXJ0IGF0IHRoZSBsb3dlciBsZWZ0IHdoaWxlIHRoZSBKUEVHIHN0YW5kYXJkIGhhcyB0aGVtIHN0YXJ0aW5nCi0gKiBpbiB0aGUgdXBwZXIgbGVmdC4gIFRoaXMgaXMgY2FsbGVkIHRoZSBmaXJzdCB0aW1lIHdlIHdhbnQgdG8gZ2V0IGEgcm93Ci0gKiBvZiBpbnB1dC4gIFdoYXQgd2UgZG8gaXMgbG9hZCB0aGUgUkxFIGRhdGEgaW50byB0aGUgYXJyYXkgYW5kIHRoZW4gY2FsbAotICogdGhlIGFwcHJvcHJpYXRlIHJvdXRpbmUgdG8gcmVhZCBvbmUgcm93IGZyb20gdGhlIGFycmF5LiAgQmVmb3JlIHJldHVybmluZywKLSAqIHdlIHNldCBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyBzbyB0aGF0IHN1YnNlcXVlbnQgY2FsbHMgZ28gc3RyYWlnaHQgdG8KLSAqIHRoZSBhcHByb3ByaWF0ZSByb3ctcmVhZGluZyByb3V0aW5lLgotICovCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotbG9hZF9pbWFnZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi17Ci0gIHJsZV9zb3VyY2VfcHRyIHNvdXJjZSA9IChybGVfc291cmNlX3B0cikgc2luZm87Ci0gIEpESU1FTlNJT04gcm93LCBjb2w7Ci0gIEpTQU1QUk9XICBzY2FubGluZSwgcmVkX3B0ciwgZ3JlZW5fcHRyLCBibHVlX3B0cjsKLSAgcmxlX3BpeGVsICoqcmxlX3JvdzsKLSAgcmxlX21hcCAqY29sb3JtYXA7Ci0gIGNoYXIgY2hhbm5lbDsKLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOwotI2VuZGlmCi0KLSAgY29sb3JtYXAgPSBzb3VyY2UtPmhlYWRlci5jbWFwOwotICBybGVfcm93ID0gc291cmNlLT5ybGVfcm93OwotCi0gIC8qIFJlYWQgdGhlIFJMRSBkYXRhIGludG8gb3VyIHZpcnR1YWwgYXJyYXkuCi0gICAqIFdlIGFzc3VtZSBoZXJlIHRoYXQgKGEpIHJsZV9waXhlbCBpcyByZXByZXNlbnRlZCB0aGUgc2FtZSBhcyBKU0FNUExFLAotICAgKiBhbmQgKGIpIHdlIGFyZSBub3Qgb24gYSBtYWNoaW5lIHdoZXJlIEZBUiBwb2ludGVycyBkaWZmZXIgZnJvbSByZWd1bGFyLgotICAgKi8KLSAgUkxFX0NMUl9CSVQoc291cmNlLT5oZWFkZXIsIFJMRV9BTFBIQSk7IC8qIGRvbid0IHJlYWQgdGhlIGFscGhhIGNoYW5uZWwgKi8KLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIHByb2dyZXNzLT5wdWIucGFzc19saW1pdCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0gICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2NvdW50ZXIgPSAwOwotICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICB9Ci0jZW5kaWYKLQotICBzd2l0Y2ggKHNvdXJjZS0+dmlzdWFsKSB7Ci0KLSAgY2FzZSBHUkFZU0NBTEU6Ci0gIGNhc2UgUFNFVURPQ09MT1I6Ci0gICAgZm9yIChyb3cgPSAwOyByb3cgPCBjaW5mby0+aW1hZ2VfaGVpZ2h0OyByb3crKykgewotICAgICAgcmxlX3JvdyA9IChybGVfcGl4ZWwgKiopICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotICAgICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPmltYWdlLCByb3csIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKLSAgICAgIHJsZV9nZXRyb3coJnNvdXJjZS0+aGVhZGVyLCBybGVfcm93KTsKLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgICAgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyKys7Ci0gICAgICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgICAgfQotI2VuZGlmCi0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgTUFQUEVER1JBWToKLSAgY2FzZSBUUlVFQ09MT1I6Ci0gICAgZm9yIChyb3cgPSAwOyByb3cgPCBjaW5mby0+aW1hZ2VfaGVpZ2h0OyByb3crKykgewotICAgICAgc2NhbmxpbmUgPSAqICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotICAgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+aW1hZ2UsIHJvdywgKEpESU1FTlNJT04pIDEsIFRSVUUpOwotICAgICAgcmxlX3JvdyA9IHNvdXJjZS0+cmxlX3JvdzsKLSAgICAgIHJsZV9nZXRyb3coJnNvdXJjZS0+aGVhZGVyLCBybGVfcm93KTsKLQotICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCsrKSB7Ci0gICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBzb3VyY2UtPmhlYWRlci5uY29sb3JzOyBjaGFubmVsKyspIHsKLSAgICAgICAgICAqc2NhbmxpbmUrKyA9IChKU0FNUExFKQotICAgICAgICAgICAgKGNvbG9ybWFwW0dFVEpTQU1QTEUocmxlX3Jvd1tjaGFubmVsXVtjb2xdKSArIDI1NiAqIGNoYW5uZWxdID4+IDgpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgICAgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyKys7Ci0gICAgICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgICAgfQotI2VuZGlmCi0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgRElSRUNUQ09MT1I6Ci0gICAgZm9yIChyb3cgPSAwOyByb3cgPCBjaW5mby0+aW1hZ2VfaGVpZ2h0OyByb3crKykgewotICAgICAgc2NhbmxpbmUgPSAqICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotICAgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+aW1hZ2UsIHJvdywgKEpESU1FTlNJT04pIDEsIFRSVUUpOwotICAgICAgcmxlX2dldHJvdygmc291cmNlLT5oZWFkZXIsIHJsZV9yb3cpOwotCi0gICAgICByZWRfcHRyICAgPSBybGVfcm93WzBdOwotICAgICAgZ3JlZW5fcHRyID0gcmxlX3Jvd1sxXTsKLSAgICAgIGJsdWVfcHRyICA9IHJsZV9yb3dbMl07Ci0KLSAgICAgIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICAgICAqc2NhbmxpbmUrKyA9ICpyZWRfcHRyKys7Ci0gICAgICAgICpzY2FubGluZSsrID0gKmdyZWVuX3B0cisrOwotICAgICAgICAqc2NhbmxpbmUrKyA9ICpibHVlX3B0cisrOwotICAgICAgfQotCi0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gICAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlcisrOwotICAgICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLSAgfQotCi0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIGlmIChwcm9ncmVzcyAhPSBOVUxMKQotICAgIHByb2dyZXNzLT5jb21wbGV0ZWRfZXh0cmFfcGFzc2VzKys7Ci0jZW5kaWYKLQotICAvKiBTZXQgdXAgdG8gY2FsbCBwcm9wZXIgcm93LWV4dHJhY3Rpb24gcm91dGluZSBpbiBmdXR1cmUgKi8KLSAgaWYgKHNvdXJjZS0+dmlzdWFsID09IFBTRVVET0NPTE9SKSB7Ci0gICAgc291cmNlLT5wdWIuYnVmZmVyID0gc291cmNlLT5ybGVfcm93OwotICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X3BzZXVkb2NvbG9yX3JvdzsKLSAgfSBlbHNlIHsKLSAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF9ybGVfcm93OwotICB9Ci0gIHNvdXJjZS0+cm93ID0gY2luZm8tPmltYWdlX2hlaWdodDsKLQotICAvKiBBbmQgZmV0Y2ggdGhlIHRvcG1vc3QgKGJvdHRvbW1vc3QpIHJvdyAqLwotICByZXR1cm4gKCpzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cykgKGNpbmZvLCBzaW5mbyk7ICAgCi19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX2lucHV0X3JsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgKi8KLX0KLQotCi0vKgotICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgUkxFIGZvcm1hdCBpbnB1dC4KLSAqLwotCi1HTE9CQUwoY2pwZWdfc291cmNlX3B0cikKLWppbml0X3JlYWRfcmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcmxlX3NvdXJjZV9wdHIgc291cmNlOwotCi0gIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCAqLwotICBzb3VyY2UgPSAocmxlX3NvdXJjZV9wdHIpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkVPRihybGVfc291cmNlX3N0cnVjdCkpOwotICAvKiBGaWxsIGluIG1ldGhvZCBwdHJzICovCi0gIHNvdXJjZS0+cHViLnN0YXJ0X2lucHV0ID0gc3RhcnRfaW5wdXRfcmxlOwotICBzb3VyY2UtPnB1Yi5maW5pc2hfaW5wdXQgPSBmaW5pc2hfaW5wdXRfcmxlOwotICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGxvYWRfaW1hZ2U7Ci0KLSAgcmV0dXJuIChjanBlZ19zb3VyY2VfcHRyKSBzb3VyY2U7Ci19Ci0KLSNlbmRpZiAvKiBSTEVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9yZHN3aXRjaC5jIGIvcmRzd2l0Y2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0YmI0Zi4uMDAwMDAwMAotLS0gYS9yZHN3aXRjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qCi0gKiByZHN3aXRjaC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gcHJvY2VzcyBzb21lIG9mIGNqcGVnJ3MgbW9yZSBjb21wbGljYXRlZAotICogY29tbWFuZC1saW5lIHN3aXRjaGVzLiAgU3dpdGNoZXMgcHJvY2Vzc2VkIGhlcmUgYXJlOgotICoJLXF0YWJsZXMgZmlsZQkJUmVhZCBxdWFudGl6YXRpb24gdGFibGVzIGZyb20gdGV4dCBmaWxlCi0gKgktc2NhbnMgZmlsZQkJUmVhZCBzY2FuIHNjcmlwdCBmcm9tIHRleHQgZmlsZQotICoJLXFzbG90cyBOWyxOLC4uLl0JU2V0IGNvbXBvbmVudCBxdWFudGl6YXRpb24gdGFibGUgc2VsZWN0b3JzCi0gKgktc2FtcGxlIEh4VlssSHhWLC4uLl0JU2V0IGNvbXBvbmVudCBzYW1wbGluZyBmYWN0b3JzCi0gKi8KLQotI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KLSNpbmNsdWRlIDxjdHlwZS5oPgkJLyogdG8gZGVjbGFyZSBpc2RpZ2l0KCksIGlzc3BhY2UoKSAqLwotCi0KLUxPQ0FMKGludCkKLXRleHRfZ2V0YyAoRklMRSAqIGZpbGUpCi0vKiBSZWFkIG5leHQgY2hhciwgc2tpcHBpbmcgb3ZlciBhbnkgY29tbWVudHMgKCMgdG8gZW5kIG9mIGxpbmUpICovCi0vKiBBIGNvbW1lbnQvbmV3bGluZSBzZXF1ZW5jZSBpcyByZXR1cm5lZCBhcyBhIG5ld2xpbmUgKi8KLXsKLSAgcmVnaXN0ZXIgaW50IGNoOwotICAKLSAgY2ggPSBnZXRjKGZpbGUpOwotICBpZiAoY2ggPT0gJyMnKSB7Ci0gICAgZG8gewotICAgICAgY2ggPSBnZXRjKGZpbGUpOwotICAgIH0gd2hpbGUgKGNoICE9ICdcbicgJiYgY2ggIT0gRU9GKTsKLSAgfQotICByZXR1cm4gY2g7Ci19Ci0KLQotTE9DQUwoYm9vbGVhbikKLXJlYWRfdGV4dF9pbnRlZ2VyIChGSUxFICogZmlsZSwgbG9uZyAqIHJlc3VsdCwgaW50ICogdGVybWNoYXIpCi0vKiBSZWFkIGFuIHVuc2lnbmVkIGRlY2ltYWwgaW50ZWdlciBmcm9tIGEgZmlsZSwgc3RvcmUgaXQgaW4gcmVzdWx0ICovCi0vKiBSZWFkcyBvbmUgdHJhaWxpbmcgY2hhcmFjdGVyIGFmdGVyIHRoZSBpbnRlZ2VyOyByZXR1cm5zIGl0IGluIHRlcm1jaGFyICovCi17Ci0gIHJlZ2lzdGVyIGludCBjaDsKLSAgcmVnaXN0ZXIgbG9uZyB2YWw7Ci0gIAotICAvKiBTa2lwIGFueSBsZWFkaW5nIHdoaXRlc3BhY2UsIGRldGVjdCBFT0YgKi8KLSAgZG8gewotICAgIGNoID0gdGV4dF9nZXRjKGZpbGUpOwotICAgIGlmIChjaCA9PSBFT0YpIHsKLSAgICAgICp0ZXJtY2hhciA9IGNoOwotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgfSB3aGlsZSAoaXNzcGFjZShjaCkpOwotICAKLSAgaWYgKCEgaXNkaWdpdChjaCkpIHsKLSAgICAqdGVybWNoYXIgPSBjaDsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICB2YWwgPSBjaCAtICcwJzsKLSAgd2hpbGUgKChjaCA9IHRleHRfZ2V0YyhmaWxlKSkgIT0gRU9GKSB7Ci0gICAgaWYgKCEgaXNkaWdpdChjaCkpCi0gICAgICBicmVhazsKLSAgICB2YWwgKj0gMTA7Ci0gICAgdmFsICs9IGNoIC0gJzAnOwotICB9Ci0gICpyZXN1bHQgPSB2YWw7Ci0gICp0ZXJtY2hhciA9IGNoOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi1HTE9CQUwoYm9vbGVhbikKLXJlYWRfcXVhbnRfdGFibGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqIGZpbGVuYW1lLAotCQkgICBpbnQgc2NhbGVfZmFjdG9yLCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQotLyogUmVhZCBhIHNldCBvZiBxdWFudGl6YXRpb24gdGFibGVzIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlLgotICogVGhlIGZpbGUgaXMgcGxhaW4gQVNDSUkgdGV4dDogZGVjaW1hbCBudW1iZXJzIHdpdGggd2hpdGVzcGFjZSBiZXR3ZWVuLgotICogQ29tbWVudHMgcHJlY2VkZWQgYnkgJyMnIG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgZmlsZS4KLSAqIFRoZXJlIG1heSBiZSBvbmUgdG8gTlVNX1FVQU5UX1RCTFMgdGFibGVzIGluIHRoZSBmaWxlLCBlYWNoIG9mIDY0IHZhbHVlcy4KLSAqIFRoZSB0YWJsZXMgYXJlIGltcGxpY2l0bHkgbnVtYmVyZWQgMCwxLGV0Yy4KLSAqIE5PVEU6IGRvZXMgbm90IGFmZmVjdCB0aGUgcXNsb3RzIG1hcHBpbmcsIHdoaWNoIHdpbGwgZGVmYXVsdCB0byBzZWxlY3RpbmcKLSAqIHRhYmxlIDAgZm9yIGx1bWluYW5jZSAob3IgcHJpbWFyeSkgY29tcG9uZW50cywgMSBmb3IgY2hyb21pbmFuY2UgY29tcG9uZW50cy4KLSAqIFlvdSBtdXN0IHVzZSAtcXNsb3RzIGlmIHlvdSB3YW50IGEgZGlmZmVyZW50IGNvbXBvbmVudC0+dGFibGUgbWFwcGluZy4KLSAqLwotewotICBGSUxFICogZnA7Ci0gIGludCB0YmxubywgaSwgdGVybWNoYXI7Ci0gIGxvbmcgdmFsOwotICB1bnNpZ25lZCBpbnQgdGFibGVbRENUU0laRTJdOwotCi0gIGlmICgoZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKSkgPT0gTlVMTCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3Qgb3BlbiB0YWJsZSBmaWxlICVzXG4iLCBmaWxlbmFtZSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0gIHRibG5vID0gMDsKLQotICB3aGlsZSAocmVhZF90ZXh0X2ludGVnZXIoZnAsICZ2YWwsICZ0ZXJtY2hhcikpIHsgLyogcmVhZCAxc3QgZWxlbWVudCBvZiB0YWJsZSAqLwotICAgIGlmICh0YmxubyA+PSBOVU1fUVVBTlRfVEJMUykgewotICAgICAgZnByaW50ZihzdGRlcnIsICJUb28gbWFueSB0YWJsZXMgaW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOwotICAgICAgZmNsb3NlKGZwKTsKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgdGFibGVbMF0gPSAodW5zaWduZWQgaW50KSB2YWw7Ci0gICAgZm9yIChpID0gMTsgaSA8IERDVFNJWkUyOyBpKyspIHsKLSAgICAgIGlmICghIHJlYWRfdGV4dF9pbnRlZ2VyKGZwLCAmdmFsLCAmdGVybWNoYXIpKSB7Ci0JZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHRhYmxlIGRhdGEgaW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOwotCWZjbG9zZShmcCk7Ci0JcmV0dXJuIEZBTFNFOwotICAgICAgfQotICAgICAgdGFibGVbaV0gPSAodW5zaWduZWQgaW50KSB2YWw7Ci0gICAgfQotICAgIGpwZWdfYWRkX3F1YW50X3RhYmxlKGNpbmZvLCB0YmxubywgdGFibGUsIHNjYWxlX2ZhY3RvciwgZm9yY2VfYmFzZWxpbmUpOwotICAgIHRibG5vKys7Ci0gIH0KLQotICBpZiAodGVybWNoYXIgIT0gRU9GKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJOb24tbnVtZXJpYyBkYXRhIGluIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKLSAgICBmY2xvc2UoZnApOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIGZjbG9zZShmcCk7Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLSNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLQotTE9DQUwoYm9vbGVhbikKLXJlYWRfc2Nhbl9pbnRlZ2VyIChGSUxFICogZmlsZSwgbG9uZyAqIHJlc3VsdCwgaW50ICogdGVybWNoYXIpCi0vKiBWYXJpYW50IG9mIHJlYWRfdGV4dF9pbnRlZ2VyIHRoYXQgYWx3YXlzIGxvb2tzIGZvciBhIG5vbi1zcGFjZSB0ZXJtY2hhcjsKLSAqIHRoaXMgc2ltcGxpZmllcyBwYXJzaW5nIG9mIHB1bmN0dWF0aW9uIGluIHNjYW4gc2NyaXB0cy4KLSAqLwotewotICByZWdpc3RlciBpbnQgY2g7Ci0KLSAgaWYgKCEgcmVhZF90ZXh0X2ludGVnZXIoZmlsZSwgcmVzdWx0LCB0ZXJtY2hhcikpCi0gICAgcmV0dXJuIEZBTFNFOwotICBjaCA9ICp0ZXJtY2hhcjsKLSAgd2hpbGUgKGNoICE9IEVPRiAmJiBpc3NwYWNlKGNoKSkKLSAgICBjaCA9IHRleHRfZ2V0YyhmaWxlKTsKLSAgaWYgKGlzZGlnaXQoY2gpKSB7CQkvKiBvb3BzLCBwdXQgaXQgYmFjayAqLwotICAgIGlmICh1bmdldGMoY2gsIGZpbGUpID09IEVPRikKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICBjaCA9ICcgJzsKLSAgfSBlbHNlIHsKLSAgICAvKiBBbnkgc2VwYXJhdG9ycyBvdGhlciB0aGFuICc7JyBhbmQgJzonIGFyZSBpZ25vcmVkOwotICAgICAqIHRoaXMgYWxsb3dzIHVzZXIgdG8gaW5zZXJ0IGNvbW1hcywgZXRjLCBpZiBkZXNpcmVkLgotICAgICAqLwotICAgIGlmIChjaCAhPSBFT0YgJiYgY2ggIT0gJzsnICYmIGNoICE9ICc6JykKLSAgICAgIGNoID0gJyAnOwotICB9Ci0gICp0ZXJtY2hhciA9IGNoOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi1HTE9CQUwoYm9vbGVhbikKLXJlYWRfc2Nhbl9zY3JpcHQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjaGFyICogZmlsZW5hbWUpCi0vKiBSZWFkIGEgc2NhbiBzY3JpcHQgZnJvbSB0aGUgc3BlY2lmaWVkIHRleHQgZmlsZS4KLSAqIEVhY2ggZW50cnkgaW4gdGhlIGZpbGUgZGVmaW5lcyBvbmUgc2NhbiB0byBiZSBlbWl0dGVkLgotICogRW50cmllcyBhcmUgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnMgJzsnLgotICogQW4gZW50cnkgY29udGFpbnMgb25lIHRvIGZvdXIgY29tcG9uZW50IGluZGV4ZXMsCi0gKiBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgY29sb24gJzonIGFuZCBmb3VyIHByb2dyZXNzaXZlLUpQRUcgcGFyYW1ldGVycy4KLSAqIFRoZSBjb21wb25lbnQgaW5kZXhlcyBkZW5vdGUgd2hpY2ggY29tcG9uZW50KHMpIGFyZSB0byBiZSB0cmFuc21pdHRlZAotICogaW4gdGhlIGN1cnJlbnQgc2Nhbi4gIFRoZSBmaXJzdCBjb21wb25lbnQgaGFzIGluZGV4IDAuCi0gKiBTZXF1ZW50aWFsIEpQRUcgaXMgdXNlZCBpZiB0aGUgcHJvZ3Jlc3NpdmUtSlBFRyBwYXJhbWV0ZXJzIGFyZSBvbWl0dGVkLgotICogVGhlIGZpbGUgaXMgZnJlZSBmb3JtYXQgdGV4dDogYW55IHdoaXRlc3BhY2UgbWF5IGFwcGVhciBiZXR3ZWVuIG51bWJlcnMKLSAqIGFuZCB0aGUgJzonIGFuZCAnOycgcHVuY3R1YXRpb24gbWFya3MuICBBbHNvLCBvdGhlciBwdW5jdHVhdGlvbiAoc3VjaAotICogYXMgY29tbWFzIG9yIGRhc2hlcykgY2FuIGJlIHBsYWNlZCBiZXR3ZWVuIG51bWJlcnMgaWYgZGVzaXJlZC4KLSAqIENvbW1lbnRzIHByZWNlZGVkIGJ5ICcjJyBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIGZpbGUuCi0gKiBOb3RlOiB3ZSBkbyB2ZXJ5IGxpdHRsZSB2YWxpZGl0eSBjaGVja2luZyBoZXJlOwotICogamNtYXN0ZXIuYyB3aWxsIHZhbGlkYXRlIHRoZSBzY3JpcHQgcGFyYW1ldGVycy4KLSAqLwotewotICBGSUxFICogZnA7Ci0gIGludCBzY2Fubm8sIG5jb21wcywgdGVybWNoYXI7Ci0gIGxvbmcgdmFsOwotICBqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHI7Ci0jZGVmaW5lIE1BWF9TQ0FOUyAgMTAwCQkvKiBxdWl0ZSBhcmJpdHJhcnkgbGltaXQgKi8KLSAganBlZ19zY2FuX2luZm8gc2NhbnNbTUFYX1NDQU5TXTsKLQotICBpZiAoKGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIikpID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG9wZW4gc2NhbiBkZWZpbml0aW9uIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLSAgc2NhbnB0ciA9IHNjYW5zOwotICBzY2Fubm8gPSAwOwotCi0gIHdoaWxlIChyZWFkX3NjYW5faW50ZWdlcihmcCwgJnZhbCwgJnRlcm1jaGFyKSkgewotICAgIGlmIChzY2Fubm8gPj0gTUFYX1NDQU5TKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlRvbyBtYW55IHNjYW5zIGRlZmluZWQgaW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOwotICAgICAgZmNsb3NlKGZwKTsKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4WzBdID0gKGludCkgdmFsOwotICAgIG5jb21wcyA9IDE7Ci0gICAgd2hpbGUgKHRlcm1jaGFyID09ICcgJykgewotICAgICAgaWYgKG5jb21wcyA+PSBNQVhfQ09NUFNfSU5fU0NBTikgewotCWZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgY29tcG9uZW50cyBpbiBvbmUgc2NhbiBpbiBmaWxlICVzXG4iLAotCQlmaWxlbmFtZSk7Ci0JZmNsb3NlKGZwKTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICB9Ci0gICAgICBpZiAoISByZWFkX3NjYW5faW50ZWdlcihmcCwgJnZhbCwgJnRlcm1jaGFyKSkKLQlnb3RvIGJvZ3VzOwotICAgICAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W25jb21wc10gPSAoaW50KSB2YWw7Ci0gICAgICBuY29tcHMrKzsKLSAgICB9Ci0gICAgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbiA9IG5jb21wczsKLSAgICBpZiAodGVybWNoYXIgPT0gJzonKSB7Ci0gICAgICBpZiAoISByZWFkX3NjYW5faW50ZWdlcihmcCwgJnZhbCwgJnRlcm1jaGFyKSB8fCB0ZXJtY2hhciAhPSAnICcpCi0JZ290byBib2d1czsKLSAgICAgIHNjYW5wdHItPlNzID0gKGludCkgdmFsOwotICAgICAgaWYgKCEgcmVhZF9zY2FuX2ludGVnZXIoZnAsICZ2YWwsICZ0ZXJtY2hhcikgfHwgdGVybWNoYXIgIT0gJyAnKQotCWdvdG8gYm9ndXM7Ci0gICAgICBzY2FucHRyLT5TZSA9IChpbnQpIHZhbDsKLSAgICAgIGlmICghIHJlYWRfc2Nhbl9pbnRlZ2VyKGZwLCAmdmFsLCAmdGVybWNoYXIpIHx8IHRlcm1jaGFyICE9ICcgJykKLQlnb3RvIGJvZ3VzOwotICAgICAgc2NhbnB0ci0+QWggPSAoaW50KSB2YWw7Ci0gICAgICBpZiAoISByZWFkX3NjYW5faW50ZWdlcihmcCwgJnZhbCwgJnRlcm1jaGFyKSkKLQlnb3RvIGJvZ3VzOwotICAgICAgc2NhbnB0ci0+QWwgPSAoaW50KSB2YWw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHNldCBub24tcHJvZ3Jlc3NpdmUgcGFyYW1ldGVycyAqLwotICAgICAgc2NhbnB0ci0+U3MgPSAwOwotICAgICAgc2NhbnB0ci0+U2UgPSBEQ1RTSVpFMi0xOwotICAgICAgc2NhbnB0ci0+QWggPSAwOwotICAgICAgc2NhbnB0ci0+QWwgPSAwOwotICAgIH0KLSAgICBpZiAodGVybWNoYXIgIT0gJzsnICYmIHRlcm1jaGFyICE9IEVPRikgewotYm9ndXM6Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgc2NhbiBlbnRyeSBmb3JtYXQgaW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOwotICAgICAgZmNsb3NlKGZwKTsKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgc2NhbnB0cisrLCBzY2Fubm8rKzsKLSAgfQotCi0gIGlmICh0ZXJtY2hhciAhPSBFT0YpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk5vbi1udW1lcmljIGRhdGEgaW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOwotICAgIGZjbG9zZShmcCk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgaWYgKHNjYW5ubyA+IDApIHsKLSAgICAvKiBTdGFzaCBjb21wbGV0ZWQgc2NhbiBsaXN0IGluIGNpbmZvIHN0cnVjdHVyZS4KLSAgICAgKiBOT1RFOiBmb3IgY2pwZWcncyB1c2UsIEpQT09MX0lNQUdFIGlzIHRoZSByaWdodCBsaWZldGltZSBmb3IgdGhpcyBkYXRhLAotICAgICAqIGJ1dCBpZiB5b3Ugd2FudCB0byBjb21wcmVzcyBtdWx0aXBsZSBpbWFnZXMgeW91J2Qgd2FudCBKUE9PTF9QRVJNQU5FTlQuCi0gICAgICovCi0gICAgc2NhbnB0ciA9IChqcGVnX3NjYW5faW5mbyAqKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIHNjYW5ubyAqIFNJWkVPRihqcGVnX3NjYW5faW5mbykpOwotICAgIE1FTUNPUFkoc2NhbnB0ciwgc2NhbnMsIHNjYW5ubyAqIFNJWkVPRihqcGVnX3NjYW5faW5mbykpOwotICAgIGNpbmZvLT5zY2FuX2luZm8gPSBzY2FucHRyOwotICAgIGNpbmZvLT5udW1fc2NhbnMgPSBzY2Fubm87Ci0gIH0KLQotICBmY2xvc2UoZnApOwotICByZXR1cm4gVFJVRTsKLX0KLQotI2VuZGlmIC8qIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLwotCi0KLUdMT0JBTChib29sZWFuKQotc2V0X3F1YW50X3Nsb3RzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqYXJnKQotLyogUHJvY2VzcyBhIHF1YW50aXphdGlvbi10YWJsZS1zZWxlY3RvcnMgcGFyYW1ldGVyIHN0cmluZywgb2YgdGhlIGZvcm0KLSAqICAgICBOWyxOLC4uLl0KLSAqIElmIHRoZXJlIGFyZSBtb3JlIGNvbXBvbmVudHMgdGhhbiBwYXJhbWV0ZXJzLCB0aGUgbGFzdCB2YWx1ZSBpcyByZXBsaWNhdGVkLgotICovCi17Ci0gIGludCB2YWwgPSAwOwkJCS8qIGRlZmF1bHQgdGFibGUgIyAqLwotICBpbnQgY2k7Ci0gIGNoYXIgY2g7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgTUFYX0NPTVBPTkVOVFM7IGNpKyspIHsKLSAgICBpZiAoKmFyZykgewotICAgICAgY2ggPSAnLCc7CQkJLyogaWYgbm90IHNldCBieSBzc2NhbmYsIHdpbGwgYmUgJywnICovCi0gICAgICBpZiAoc3NjYW5mKGFyZywgIiVkJWMiLCAmdmFsLCAmY2gpIDwgMSkKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICBpZiAoY2ggIT0gJywnKQkJLyogc3ludGF4IGNoZWNrICovCi0JcmV0dXJuIEZBTFNFOwotICAgICAgaWYgKHZhbCA8IDAgfHwgdmFsID49IE5VTV9RVUFOVF9UQkxTKSB7Ci0JZnByaW50ZihzdGRlcnIsICJKUEVHIHF1YW50aXphdGlvbiB0YWJsZXMgYXJlIG51bWJlcmVkIDAuLiVkXG4iLAotCQlOVU1fUVVBTlRfVEJMUy0xKTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICB9Ci0gICAgICBjaW5mby0+Y29tcF9pbmZvW2NpXS5xdWFudF90Ymxfbm8gPSB2YWw7Ci0gICAgICB3aGlsZSAoKmFyZyAmJiAqYXJnKysgIT0gJywnKSAvKiBhZHZhbmNlIHRvIG5leHQgc2VnbWVudCBvZiBhcmcgc3RyaW5nICovCi0JOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiByZWFjaGVkIGVuZCBvZiBwYXJhbWV0ZXIsIHNldCByZW1haW5pbmcgY29tcG9uZW50cyB0byBsYXN0IHRhYmxlICovCi0gICAgICBjaW5mby0+Y29tcF9pbmZvW2NpXS5xdWFudF90Ymxfbm8gPSB2YWw7Ci0gICAgfQotICB9Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLUdMT0JBTChib29sZWFuKQotc2V0X3NhbXBsZV9mYWN0b3JzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqYXJnKQotLyogUHJvY2VzcyBhIHNhbXBsZS1mYWN0b3JzIHBhcmFtZXRlciBzdHJpbmcsIG9mIHRoZSBmb3JtCi0gKiAgICAgSHhWWyxIeFYsLi4uXQotICogSWYgdGhlcmUgYXJlIG1vcmUgY29tcG9uZW50cyB0aGFuIHBhcmFtZXRlcnMsICIxeDEiIGlzIGFzc3VtZWQgZm9yIHRoZSByZXN0LgotICovCi17Ci0gIGludCBjaSwgdmFsMSwgdmFsMjsKLSAgY2hhciBjaDEsIGNoMjsKLQotICBmb3IgKGNpID0gMDsgY2kgPCBNQVhfQ09NUE9ORU5UUzsgY2krKykgewotICAgIGlmICgqYXJnKSB7Ci0gICAgICBjaDIgPSAnLCc7CQkvKiBpZiBub3Qgc2V0IGJ5IHNzY2FuZiwgd2lsbCBiZSAnLCcgKi8KLSAgICAgIGlmIChzc2NhbmYoYXJnLCAiJWQlYyVkJWMiLCAmdmFsMSwgJmNoMSwgJnZhbDIsICZjaDIpIDwgMykKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICBpZiAoKGNoMSAhPSAneCcgJiYgY2gxICE9ICdYJykgfHwgY2gyICE9ICcsJykgLyogc3ludGF4IGNoZWNrICovCi0JcmV0dXJuIEZBTFNFOwotICAgICAgaWYgKHZhbDEgPD0gMCB8fCB2YWwxID4gNCB8fCB2YWwyIDw9IDAgfHwgdmFsMiA+IDQpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkpQRUcgc2FtcGxpbmcgZmFjdG9ycyBtdXN0IGJlIDEuLjRcbiIpOwotCXJldHVybiBGQUxTRTsKLSAgICAgIH0KLSAgICAgIGNpbmZvLT5jb21wX2luZm9bY2ldLmhfc2FtcF9mYWN0b3IgPSB2YWwxOwotICAgICAgY2luZm8tPmNvbXBfaW5mb1tjaV0udl9zYW1wX2ZhY3RvciA9IHZhbDI7Ci0gICAgICB3aGlsZSAoKmFyZyAmJiAqYXJnKysgIT0gJywnKSAvKiBhZHZhbmNlIHRvIG5leHQgc2VnbWVudCBvZiBhcmcgc3RyaW5nICovCi0JOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiByZWFjaGVkIGVuZCBvZiBwYXJhbWV0ZXIsIHNldCByZW1haW5pbmcgY29tcG9uZW50cyB0byAxeDEgc2FtcGxpbmcgKi8KLSAgICAgIGNpbmZvLT5jb21wX2luZm9bY2ldLmhfc2FtcF9mYWN0b3IgPSAxOwotICAgICAgY2luZm8tPmNvbXBfaW5mb1tjaV0udl9zYW1wX2ZhY3RvciA9IDE7Ci0gICAgfQotICB9Ci0gIHJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvcmR0YXJnYS5jIGIvcmR0YXJnYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzJjZDI2Li4wMDAwMDAwCi0tLSBhL3JkdGFyZ2EuYworKysgL2Rldi9udWxsCkBAIC0xLDUwMCArMCwwIEBACi0vKgotICogcmR0YXJnYS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gcmVhZCBpbnB1dCBpbWFnZXMgaW4gVGFyZ2EgZm9ybWF0LgotICoKLSAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCi0gKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBpbnB1dCBmcm9tCi0gKiBhbiBvcmRpbmFyeSBzdGRpbyBzdHJlYW0uICBUaGV5IGZ1cnRoZXIgYXNzdW1lIHRoYXQgcmVhZGluZyBiZWdpbnMKLSAqIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZTsgc3RhcnRfaW5wdXQgbWF5IG5lZWQgd29yayBpZiB0aGUKLSAqIHVzZXIgaW50ZXJmYWNlIGhhcyBhbHJlYWR5IHJlYWQgc29tZSBkYXRhIChlLmcuLCB0byBkZXRlcm1pbmUgdGhhdAotICogdGhlIGZpbGUgaXMgaW5kZWVkIFRhcmdhIGZvcm1hdCkuCi0gKgotICogQmFzZWQgb24gY29kZSBjb250cmlidXRlZCBieSBMZWUgRGFuaWVsIENyb2NrZXIuCi0gKi8KLQotI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KLQotI2lmZGVmIFRBUkdBX1NVUFBPUlRFRAotCi0KLS8qIE1hY3JvcyB0byBkZWFsIHdpdGggdW5zaWduZWQgY2hhcnMgYXMgZWZmaWNpZW50bHkgYXMgY29tcGlsZXIgYWxsb3dzICovCi0KLSNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVX0NIQVI7Ci0jZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpKQotI2Vsc2UgLyogIUhBVkVfVU5TSUdORURfQ0hBUiAqLwotI2lmZGVmIENIQVJfSVNfVU5TSUdORUQKLXR5cGVkZWYgY2hhciBVX0NIQVI7Ci0jZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpKQotI2Vsc2UKLXR5cGVkZWYgY2hhciBVX0NIQVI7Ci0jZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpICYgMHhGRikKLSNlbmRpZgotI2VuZGlmIC8qIEhBVkVfVU5TSUdORURfQ0hBUiAqLwotCi0KLSNkZWZpbmUJUmVhZE9LKGZpbGUsYnVmZmVyLGxlbikJKEpGUkVBRChmaWxlLGJ1ZmZlcixsZW4pID09ICgoc2l6ZV90KSAobGVuKSkpCi0KLQotLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIGRhdGEgc291cmNlIG9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCBfdGdhX3NvdXJjZV9zdHJ1Y3QgKiB0Z2Ffc291cmNlX3B0cjsKLQotdHlwZWRlZiBzdHJ1Y3QgX3RnYV9zb3VyY2Vfc3RydWN0IHsKLSAgc3RydWN0IGNqcGVnX3NvdXJjZV9zdHJ1Y3QgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgal9jb21wcmVzc19wdHIgY2luZm87CQkvKiBiYWNrIGxpbmsgc2F2ZXMgcGFzc2luZyBzZXBhcmF0ZSBwYXJtICovCi0KLSAgSlNBTVBBUlJBWSBjb2xvcm1hcDsJCS8qIFRhcmdhIGNvbG9ybWFwIChjb252ZXJ0ZWQgdG8gbXkgZm9ybWF0KSAqLwotCi0gIGp2aXJ0X3NhcnJheV9wdHIgd2hvbGVfaW1hZ2U7CS8qIE5lZWRlZCBpZiBmdW5ueSBpbnB1dCByb3cgb3JkZXIgKi8KLSAgSkRJTUVOU0lPTiBjdXJyZW50X3JvdzsJLyogQ3VycmVudCBsb2dpY2FsIHJvdyBudW1iZXIgdG8gcmVhZCAqLwotCi0gIC8qIFBvaW50ZXIgdG8gcm91dGluZSB0byBleHRyYWN0IG5leHQgVGFyZ2EgcGl4ZWwgZnJvbSBpbnB1dCBmaWxlICovCi0gIEpNRVRIT0Qodm9pZCwgcmVhZF9waXhlbCwgKHRnYV9zb3VyY2VfcHRyIHNpbmZvKSk7Ci0KLSAgLyogUmVzdWx0IG9mIHJlYWRfcGl4ZWwgaXMgZGVsaXZlcmVkIGhlcmU6ICovCi0gIFVfQ0hBUiB0Z2FfcGl4ZWxbNF07Ci0KLSAgaW50IHBpeGVsX3NpemU7CQkvKiBCeXRlcyBwZXIgVGFyZ2EgcGl4ZWwgKDEgdG8gNCkgKi8KLQotICAvKiBTdGF0ZSBpbmZvIGZvciByZWFkaW5nIFJMRS1jb2RlZCBwaXhlbHM7IGJvdGggY291bnRzIG11c3QgYmUgaW5pdCB0byAwICovCi0gIGludCBibG9ja19jb3VudDsJCS8qICMgb2YgcGl4ZWxzIHJlbWFpbmluZyBpbiBSTEUgYmxvY2sgKi8KLSAgaW50IGR1cF9waXhlbF9jb3VudDsJCS8qICMgb2YgdGltZXMgdG8gZHVwbGljYXRlIHByZXZpb3VzIHBpeGVsICovCi0KLSAgLyogVGhpcyBzYXZlcyB0aGUgY29ycmVjdCBwaXhlbC1yb3ctZXhwYW5zaW9uIG1ldGhvZCBmb3IgcHJlbG9hZF9pbWFnZSAqLwotICBKTUVUSE9EKEpESU1FTlNJT04sIGdldF9waXhlbF9yb3dzLCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJICAgICAgIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pKTsKLX0gdGdhX3NvdXJjZV9zdHJ1Y3Q7Ci0KLQotLyogRm9yIGV4cGFuZGluZyA1LWJpdCBwaXhlbCB2YWx1ZXMgdG8gOC1iaXQgd2l0aCBiZXN0IHJvdW5kaW5nICovCi0KLXN0YXRpYyBjb25zdCBVSU5UOCBjNXRvOGJpdHNbMzJdID0gewotICAgIDAsICAgOCwgIDE2LCAgMjUsICAzMywgIDQxLCAgNDksICA1OCwKLSAgIDY2LCAgNzQsICA4MiwgIDkwLCAgOTksIDEwNywgMTE1LCAxMjMsCi0gIDEzMiwgMTQwLCAxNDgsIDE1NiwgMTY1LCAxNzMsIDE4MSwgMTg5LAotICAxOTcsIDIwNiwgMjE0LCAyMjIsIDIzMCwgMjM5LCAyNDcsIDI1NQotfTsKLQotCi0KLUxPQ0FMKGludCkKLXJlYWRfYnl0ZSAodGdhX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBSZWFkIG5leHQgYnl0ZSBmcm9tIFRhcmdhIGZpbGUgKi8KLXsKLSAgcmVnaXN0ZXIgRklMRSAqaW5maWxlID0gc2luZm8tPnB1Yi5pbnB1dF9maWxlOwotICByZWdpc3RlciBpbnQgYzsKLQotICBpZiAoKGMgPSBnZXRjKGluZmlsZSkpID09IEVPRikKLSAgICBFUlJFWElUKHNpbmZvLT5jaW5mbywgSkVSUl9JTlBVVF9FT0YpOwotICByZXR1cm4gYzsKLX0KLQotCi1MT0NBTCh2b2lkKQotcmVhZF9jb2xvcm1hcCAodGdhX3NvdXJjZV9wdHIgc2luZm8sIGludCBjbWFwbGVuLCBpbnQgbWFwZW50cnlzaXplKQotLyogUmVhZCB0aGUgY29sb3JtYXAgZnJvbSBhIFRhcmdhIGZpbGUgKi8KLXsKLSAgaW50IGk7Ci0KLSAgLyogUHJlc2VudGx5IG9ubHkgaGFuZGxlcyAyNC1iaXQgQkdSIGZvcm1hdCAqLwotICBpZiAobWFwZW50cnlzaXplICE9IDI0KQotICAgIEVSUkVYSVQoc2luZm8tPmNpbmZvLCBKRVJSX1RHQV9CQURDTUFQKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY21hcGxlbjsgaSsrKSB7Ci0gICAgc2luZm8tPmNvbG9ybWFwWzJdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7Ci0gICAgc2luZm8tPmNvbG9ybWFwWzFdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7Ci0gICAgc2luZm8tPmNvbG9ybWFwWzBdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7Ci0gIH0KLX0KLQotCi0vKgotICogcmVhZF9waXhlbCBtZXRob2RzOiBnZXQgYSBzaW5nbGUgcGl4ZWwgZnJvbSBUYXJnYSBmaWxlIGludG8gdGdhX3BpeGVsW10KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXJlYWRfbm9uX3JsZV9waXhlbCAodGdhX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBSZWFkIG9uZSBUYXJnYSBwaXhlbCBmcm9tIHRoZSBpbnB1dCBmaWxlOyBubyBSTEUgZXhwYW5zaW9uICovCi17Ci0gIHJlZ2lzdGVyIEZJTEUgKmluZmlsZSA9IHNpbmZvLT5wdWIuaW5wdXRfZmlsZTsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpbmZvLT5waXhlbF9zaXplOyBpKyspIHsKLSAgICBzaW5mby0+dGdhX3BpeGVsW2ldID0gKFVfQ0hBUikgZ2V0YyhpbmZpbGUpOwotICB9Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi1yZWFkX3JsZV9waXhlbCAodGdhX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBSZWFkIG9uZSBUYXJnYSBwaXhlbCBmcm9tIHRoZSBpbnB1dCBmaWxlLCBleHBhbmRpbmcgUkxFIGRhdGEgYXMgbmVlZGVkICovCi17Ci0gIHJlZ2lzdGVyIEZJTEUgKmluZmlsZSA9IHNpbmZvLT5wdWIuaW5wdXRfZmlsZTsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0KLSAgLyogRHVwbGljYXRlIHByZXZpb3VzbHkgcmVhZCBwaXhlbD8gKi8KLSAgaWYgKHNpbmZvLT5kdXBfcGl4ZWxfY291bnQgPiAwKSB7Ci0gICAgc2luZm8tPmR1cF9waXhlbF9jb3VudC0tOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFRpbWUgdG8gcmVhZCBSTEUgYmxvY2sgaGVhZGVyPyAqLwotICBpZiAoLS1zaW5mby0+YmxvY2tfY291bnQgPCAwKSB7IC8qIGRlY3JlbWVudCBwaXhlbHMgcmVtYWluaW5nIGluIGJsb2NrICovCi0gICAgaSA9IHJlYWRfYnl0ZShzaW5mbyk7Ci0gICAgaWYgKGkgJiAweDgwKSB7CQkvKiBTdGFydCBvZiBkdXBsaWNhdGUtcGl4ZWwgYmxvY2s/ICovCi0gICAgICBzaW5mby0+ZHVwX3BpeGVsX2NvdW50ID0gaSAmIDB4N0Y7IC8qIG51bWJlciBvZiBkdXBzIGFmdGVyIHRoaXMgb25lICovCi0gICAgICBzaW5mby0+YmxvY2tfY291bnQgPSAwOwkvKiB0aGVuIHJlYWQgbmV3IGJsb2NrIGhlYWRlciAqLwotICAgIH0gZWxzZSB7Ci0gICAgICBzaW5mby0+YmxvY2tfY291bnQgPSBpICYgMHg3RjsgLyogbnVtYmVyIG9mIHBpeGVscyBhZnRlciB0aGlzIG9uZSAqLwotICAgIH0KLSAgfQotCi0gIC8qIFJlYWQgbmV4dCBwaXhlbCAqLwotICBmb3IgKGkgPSAwOyBpIDwgc2luZm8tPnBpeGVsX3NpemU7IGkrKykgewotICAgIHNpbmZvLT50Z2FfcGl4ZWxbaV0gPSAoVV9DSEFSKSBnZXRjKGluZmlsZSk7Ci0gIH0KLX0KLQotCi0vKgotICogUmVhZCBvbmUgcm93IG9mIHBpeGVscy4KLSAqCi0gKiBXZSBwcm92aWRlIHNldmVyYWwgZGlmZmVyZW50IHZlcnNpb25zIGRlcGVuZGluZyBvbiBpbnB1dCBmaWxlIGZvcm1hdC4KLSAqLwotCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotZ2V0XzhiaXRfZ3JheV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIDgtYml0IGdyYXlzY2FsZSBwaXhlbHMgKi8KLXsKLSAgdGdhX3NvdXJjZV9wdHIgc291cmNlID0gKHRnYV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgCi0gIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKLSAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgKCpzb3VyY2UtPnJlYWRfcGl4ZWwpIChzb3VyY2UpOyAvKiBMb2FkIG5leHQgcGl4ZWwgaW50byB0Z2FfcGl4ZWwgKi8KLSAgICAqcHRyKysgPSAoSlNBTVBMRSkgVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzBdKTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotTUVUSE9EREVGKEpESU1FTlNJT04pCi1nZXRfOGJpdF9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIDgtYml0IGNvbG9ybWFwIGluZGV4ZXMgKi8KLXsKLSAgdGdhX3NvdXJjZV9wdHIgc291cmNlID0gKHRnYV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgcmVnaXN0ZXIgaW50IHQ7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIHJlZ2lzdGVyIEpTQU1QQVJSQVkgY29sb3JtYXAgPSBzb3VyY2UtPmNvbG9ybWFwOwotCi0gIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKLSAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgKCpzb3VyY2UtPnJlYWRfcGl4ZWwpIChzb3VyY2UpOyAvKiBMb2FkIG5leHQgcGl4ZWwgaW50byB0Z2FfcGl4ZWwgKi8KLSAgICB0ID0gVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzBdKTsKLSAgICAqcHRyKysgPSBjb2xvcm1hcFswXVt0XTsKLSAgICAqcHRyKysgPSBjb2xvcm1hcFsxXVt0XTsKLSAgICAqcHRyKysgPSBjb2xvcm1hcFsyXVt0XTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotTUVUSE9EREVGKEpESU1FTlNJT04pCi1nZXRfMTZiaXRfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLS8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyAxNi1iaXQgcGl4ZWxzICovCi17Ci0gIHRnYV9zb3VyY2VfcHRyIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikgc2luZm87Ci0gIHJlZ2lzdGVyIGludCB0OwotICByZWdpc3RlciBKU0FNUFJPVyBwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICAKLSAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOwotICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICAoKnNvdXJjZS0+cmVhZF9waXhlbCkgKHNvdXJjZSk7IC8qIExvYWQgbmV4dCBwaXhlbCBpbnRvIHRnYV9waXhlbCAqLwotICAgIHQgPSBVQ0goc291cmNlLT50Z2FfcGl4ZWxbMF0pOwotICAgIHQgKz0gVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzFdKSA8PCA4OwotICAgIC8qIFdlIGV4cGFuZCA1IGJpdCBkYXRhIHRvIDggYml0IHNhbXBsZSB3aWR0aC4KLSAgICAgKiBUaGUgZm9ybWF0IG9mIHRoZSAxNi1iaXQgKExTQiBmaXJzdCkgaW5wdXQgd29yZCBpcwotICAgICAqICAgICB4UlJSUlJHR0dHR0JCQkJCCi0gICAgICovCi0gICAgcHRyWzJdID0gKEpTQU1QTEUpIGM1dG84Yml0c1t0ICYgMHgxRl07Ci0gICAgdCA+Pj0gNTsKLSAgICBwdHJbMV0gPSAoSlNBTVBMRSkgYzV0bzhiaXRzW3QgJiAweDFGXTsKLSAgICB0ID4+PSA1OwotICAgIHB0clswXSA9IChKU0FNUExFKSBjNXRvOGJpdHNbdCAmIDB4MUZdOwotICAgIHB0ciArPSAzOwotICB9Ci0gIHJldHVybiAxOwotfQotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLWdldF8yNGJpdF9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIDI0LWJpdCBwaXhlbHMgKi8KLXsKLSAgdGdhX3NvdXJjZV9wdHIgc291cmNlID0gKHRnYV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgCi0gIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKLSAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgKCpzb3VyY2UtPnJlYWRfcGl4ZWwpIChzb3VyY2UpOyAvKiBMb2FkIG5leHQgcGl4ZWwgaW50byB0Z2FfcGl4ZWwgKi8KLSAgICAqcHRyKysgPSAoSlNBTVBMRSkgVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzJdKTsgLyogY2hhbmdlIEJHUiB0byBSR0Igb3JkZXIgKi8KLSAgICAqcHRyKysgPSAoSlNBTVBMRSkgVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzFdKTsKLSAgICAqcHRyKysgPSAoSlNBTVBMRSkgVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzBdKTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIFRhcmdhIGFsc28gZGVmaW5lcyBhIDMyLWJpdCBwaXhlbCBmb3JtYXQgd2l0aCBvcmRlciBCLEcsUixBLgotICogV2UgcHJlc2VudGx5IGlnbm9yZSB0aGUgYXR0cmlidXRlIGJ5dGUsIHNvIHRoZSBjb2RlIGZvciByZWFkaW5nCi0gKiB0aGVzZSBwaXhlbHMgaXMgaWRlbnRpY2FsIHRvIHRoZSAyNC1iaXQgcm91dGluZSBhYm92ZS4KLSAqIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgYWN0dWFsIHBpeGVsIGxlbmd0aCBpcyBvbmx5IGtub3duIHRvIHJlYWRfcGl4ZWwuCi0gKi8KLQotI2RlZmluZSBnZXRfMzJiaXRfcm93ICBnZXRfMjRiaXRfcm93Ci0KLQotLyoKLSAqIFRoaXMgbWV0aG9kIGlzIGZvciByZS1yZWFkaW5nIHRoZSBpbnB1dCBkYXRhIGluIHN0YW5kYXJkIHRvcC1kb3duCi0gKiByb3cgb3JkZXIuICBUaGUgZW50aXJlIGltYWdlIGhhcyBhbHJlYWR5IGJlZW4gcmVhZCBpbnRvIHdob2xlX2ltYWdlCi0gKiB3aXRoIHByb3BlciBjb252ZXJzaW9uIG9mIHBpeGVsIGZvcm1hdCwgYnV0IGl0J3MgaW4gYSBmdW5ueSByb3cgb3JkZXIuCi0gKi8KLQotTUVUSE9EREVGKEpESU1FTlNJT04pCi1nZXRfbWVtb3J5X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi17Ci0gIHRnYV9zb3VyY2VfcHRyIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikgc2luZm87Ci0gIEpESU1FTlNJT04gc291cmNlX3JvdzsKLQotICAvKiBDb21wdXRlIHJvdyBvZiBzb3VyY2UgdGhhdCBtYXBzIHRvIGN1cnJlbnRfcm93IG9mIG5vcm1hbCBvcmRlciAqLwotICAvKiBGb3Igbm93LCBhc3N1bWUgaW1hZ2UgaXMgYm90dG9tLXVwIGFuZCBub3QgaW50ZXJsYWNlZC4gKi8KLSAgLyogTkVFRFMgV09SSyB0byBzdXBwb3J0IGludGVybGFjZWQgaW1hZ2VzISAqLwotICBzb3VyY2Vfcm93ID0gY2luZm8tPmltYWdlX2hlaWdodCAtIHNvdXJjZS0+Y3VycmVudF9yb3cgLSAxOwotCi0gIC8qIEZldGNoIHRoYXQgcm93IGZyb20gdmlydHVhbCBhcnJheSAqLwotICBzb3VyY2UtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+d2hvbGVfaW1hZ2UsCi0gICAgIHNvdXJjZV9yb3csIChKRElNRU5TSU9OKSAxLCBGQUxTRSk7Ci0KLSAgc291cmNlLT5jdXJyZW50X3JvdysrOwotICByZXR1cm4gMTsKLX0KLQotCi0vKgotICogVGhpcyBtZXRob2QgbG9hZHMgdGhlIGltYWdlIGludG8gd2hvbGVfaW1hZ2UgZHVyaW5nIHRoZSBmaXJzdCBjYWxsIG9uCi0gKiBnZXRfcGl4ZWxfcm93cy4gIFRoZSBnZXRfcGl4ZWxfcm93cyBwb2ludGVyIGlzIHRoZW4gYWRqdXN0ZWQgdG8gY2FsbAotICogZ2V0X21lbW9yeV9yb3cgb24gc3Vic2VxdWVudCBjYWxscy4KLSAqLwotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLXByZWxvYWRfaW1hZ2UgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotewotICB0Z2Ffc291cmNlX3B0ciBzb3VyY2UgPSAodGdhX3NvdXJjZV9wdHIpIHNpbmZvOwotICBKRElNRU5TSU9OIHJvdzsKLSAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOwotCi0gIC8qIFJlYWQgdGhlIGRhdGEgaW50byBhIHZpcnR1YWwgYXJyYXkgaW4gaW5wdXQtZmlsZSByb3cgb3JkZXIuICovCi0gIGZvciAocm93ID0gMDsgcm93IDwgY2luZm8tPmltYWdlX2hlaWdodDsgcm93KyspIHsKLSAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2NvdW50ZXIgPSAobG9uZykgcm93OwotICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0gICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICB9Ci0gICAgc291cmNlLT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+d2hvbGVfaW1hZ2UsIHJvdywgKEpESU1FTlNJT04pIDEsIFRSVUUpOwotICAgICgqc291cmNlLT5nZXRfcGl4ZWxfcm93cykgKGNpbmZvLCBzaW5mbyk7Ci0gIH0KLSAgaWYgKHByb2dyZXNzICE9IE5VTEwpCi0gICAgcHJvZ3Jlc3MtPmNvbXBsZXRlZF9leHRyYV9wYXNzZXMrKzsKLQotICAvKiBTZXQgdXAgdG8gcmVhZCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5IGluIHVuc2NyYW1ibGVkIG9yZGVyICovCi0gIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X21lbW9yeV9yb3c7Ci0gIHNvdXJjZS0+Y3VycmVudF9yb3cgPSAwOwotICAvKiBBbmQgcmVhZCB0aGUgZmlyc3Qgcm93ICovCi0gIHJldHVybiBnZXRfbWVtb3J5X3JvdyhjaW5mbywgc2luZm8pOwotfQotCi0KLS8qCi0gKiBSZWFkIHRoZSBmaWxlIGhlYWRlcjsgcmV0dXJuIGltYWdlIHNpemUgYW5kIGNvbXBvbmVudCBjb3VudC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X2lucHV0X3RnYSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi17Ci0gIHRnYV9zb3VyY2VfcHRyIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikgc2luZm87Ci0gIFVfQ0hBUiB0YXJnYWhlYWRlclsxOF07Ci0gIGludCBpZGxlbiwgY21hcHR5cGUsIHN1YnR5cGUsIGZsYWdzLCBpbnRlcmxhY2VfdHlwZSwgY29tcG9uZW50czsKLSAgdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQsIG1hcGxlbjsKLSAgYm9vbGVhbiBpc19ib3R0b21fdXA7Ci0KLSNkZWZpbmUgR0VUXzJCKG9mZnNldCkJKCh1bnNpZ25lZCBpbnQpIFVDSCh0YXJnYWhlYWRlcltvZmZzZXRdKSArIFwKLQkJCSAoKCh1bnNpZ25lZCBpbnQpIFVDSCh0YXJnYWhlYWRlcltvZmZzZXQrMV0pKSA8PCA4KSkKLQotICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgdGFyZ2FoZWFkZXIsIDE4KSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7Ci0KLSAgLyogUHJldGVuZCAiMTUtYml0IiBwaXhlbHMgYXJlIDE2LWJpdCAtLS0gd2UgaWdub3JlIGF0dHJpYnV0ZSBiaXQgYW55d2F5ICovCi0gIGlmICh0YXJnYWhlYWRlclsxNl0gPT0gMTUpCi0gICAgdGFyZ2FoZWFkZXJbMTZdID0gMTY7Ci0KLSAgaWRsZW4gPSBVQ0godGFyZ2FoZWFkZXJbMF0pOwotICBjbWFwdHlwZSA9IFVDSCh0YXJnYWhlYWRlclsxXSk7Ci0gIHN1YnR5cGUgPSBVQ0godGFyZ2FoZWFkZXJbMl0pOwotICBtYXBsZW4gPSBHRVRfMkIoNSk7Ci0gIHdpZHRoID0gR0VUXzJCKDEyKTsKLSAgaGVpZ2h0ID0gR0VUXzJCKDE0KTsKLSAgc291cmNlLT5waXhlbF9zaXplID0gVUNIKHRhcmdhaGVhZGVyWzE2XSkgPj4gMzsKLSAgZmxhZ3MgPSBVQ0godGFyZ2FoZWFkZXJbMTddKTsJLyogSW1hZ2UgRGVzY3JpcHRvciBieXRlICovCi0KLSAgaXNfYm90dG9tX3VwID0gKChmbGFncyAmIDB4MjApID09IDApOwkvKiBiaXQgNSBzZXQgPT4gdG9wLWRvd24gKi8KLSAgaW50ZXJsYWNlX3R5cGUgPSBmbGFncyA+PiA2OwkvKiBiaXRzIDYvNyBhcmUgaW50ZXJsYWNlIGNvZGUgKi8KLQotICBpZiAoY21hcHR5cGUgPiAxIHx8CQkvKiBjbWFwdHlwZSBtdXN0IGJlIDAgb3IgMSAqLwotICAgICAgc291cmNlLT5waXhlbF9zaXplIDwgMSB8fCBzb3VyY2UtPnBpeGVsX3NpemUgPiA0IHx8Ci0gICAgICAoVUNIKHRhcmdhaGVhZGVyWzE2XSkgJiA3KSAhPSAwIHx8IC8qIGJpdHMvcGl4ZWwgbXVzdCBiZSBtdWx0aXBsZSBvZiA4ICovCi0gICAgICBpbnRlcmxhY2VfdHlwZSAhPSAwKQkvKiBjdXJyZW50bHkgZG9uJ3QgYWxsb3cgaW50ZXJsYWNlZCBpbWFnZSAqLwotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX0JBRFBBUk1TKTsKLSAgCi0gIGlmIChzdWJ0eXBlID4gOCkgewotICAgIC8qIEl0J3MgYW4gUkxFLWNvZGVkIGZpbGUgKi8KLSAgICBzb3VyY2UtPnJlYWRfcGl4ZWwgPSByZWFkX3JsZV9waXhlbDsKLSAgICBzb3VyY2UtPmJsb2NrX2NvdW50ID0gc291cmNlLT5kdXBfcGl4ZWxfY291bnQgPSAwOwotICAgIHN1YnR5cGUgLT0gODsKLSAgfSBlbHNlIHsKLSAgICAvKiBOb24tUkxFIGZpbGUgKi8KLSAgICBzb3VyY2UtPnJlYWRfcGl4ZWwgPSByZWFkX25vbl9ybGVfcGl4ZWw7Ci0gIH0KLQotICAvKiBOb3cgc2hvdWxkIGhhdmUgc3VidHlwZSAxLCAyLCBvciAzICovCi0gIGNvbXBvbmVudHMgPSAzOwkJLyogdW50aWwgcHJvdmVuIGRpZmZlcmVudCAqLwotICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOwotCi0gIHN3aXRjaCAoc3VidHlwZSkgewotICBjYXNlIDE6CQkJLyogQ29sb3JtYXBwZWQgaW1hZ2UgKi8KLSAgICBpZiAoc291cmNlLT5waXhlbF9zaXplID09IDEgJiYgY21hcHR5cGUgPT0gMSkKLSAgICAgIHNvdXJjZS0+Z2V0X3BpeGVsX3Jvd3MgPSBnZXRfOGJpdF9yb3c7Ci0gICAgZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UR0FfQkFEUEFSTVMpOwotICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1RHQV9NQVBQRUQsIHdpZHRoLCBoZWlnaHQpOwotICAgIGJyZWFrOwotICBjYXNlIDI6CQkJLyogUkdCIGltYWdlICovCi0gICAgc3dpdGNoIChzb3VyY2UtPnBpeGVsX3NpemUpIHsKLSAgICBjYXNlIDI6Ci0gICAgICBzb3VyY2UtPmdldF9waXhlbF9yb3dzID0gZ2V0XzE2Yml0X3JvdzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIHNvdXJjZS0+Z2V0X3BpeGVsX3Jvd3MgPSBnZXRfMjRiaXRfcm93OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgc291cmNlLT5nZXRfcGl4ZWxfcm93cyA9IGdldF8zMmJpdF9yb3c7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UR0FfQkFEUEFSTVMpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1RHQSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgMzoJCQkvKiBHcmF5c2NhbGUgaW1hZ2UgKi8KLSAgICBjb21wb25lbnRzID0gMTsKLSAgICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOwotICAgIGlmIChzb3VyY2UtPnBpeGVsX3NpemUgPT0gMSkKLSAgICAgIHNvdXJjZS0+Z2V0X3BpeGVsX3Jvd3MgPSBnZXRfOGJpdF9ncmF5X3JvdzsKLSAgICBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9CQURQQVJNUyk7Ci0gICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfVEdBX0dSQVksIHdpZHRoLCBoZWlnaHQpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX0JBRFBBUk1TKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGlmIChpc19ib3R0b21fdXApIHsKLSAgICAvKiBDcmVhdGUgYSB2aXJ0dWFsIGFycmF5IHRvIGJ1ZmZlciB0aGUgdXBzaWRlLWRvd24gaW1hZ2UuICovCi0gICAgc291cmNlLT53aG9sZV9pbWFnZSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X3NhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAotICAgICAgIChKRElNRU5TSU9OKSB3aWR0aCAqIGNvbXBvbmVudHMsIChKRElNRU5TSU9OKSBoZWlnaHQsIChKRElNRU5TSU9OKSAxKTsKLSAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKLSAgICAgIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKLSAgICAgIHByb2dyZXNzLT50b3RhbF9leHRyYV9wYXNzZXMrKzsgLyogY291bnQgZmlsZSBpbnB1dCBhcyBzZXBhcmF0ZSBwYXNzICovCi0gICAgfQotICAgIC8qIHNvdXJjZS0+cHViLmJ1ZmZlciB3aWxsIHBvaW50IHRvIHRoZSB2aXJ0dWFsIGFycmF5LiAqLwotICAgIHNvdXJjZS0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOyAvKiBpbiBjYXNlIGFueW9uZSBsb29rcyBhdCBpdCAqLwotICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gcHJlbG9hZF9pbWFnZTsKLSAgfSBlbHNlIHsKLSAgICAvKiBEb24ndCBuZWVkIGEgdmlydHVhbCBhcnJheSwgYnV0IGRvIG5lZWQgYSBvbmUtcm93IGlucHV0IGJ1ZmZlci4gKi8KLSAgICBzb3VyY2UtPndob2xlX2ltYWdlID0gTlVMTDsKLSAgICBzb3VyY2UtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0gICAgICAgKEpESU1FTlNJT04pIHdpZHRoICogY29tcG9uZW50cywgKEpESU1FTlNJT04pIDEpOwotICAgIHNvdXJjZS0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOwotICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gc291cmNlLT5nZXRfcGl4ZWxfcm93czsKLSAgfQotICAKLSAgd2hpbGUgKGlkbGVuLS0pCQkvKiBUaHJvdyBhd2F5IElEIGZpZWxkICovCi0gICAgKHZvaWQpIHJlYWRfYnl0ZShzb3VyY2UpOwotCi0gIGlmIChtYXBsZW4gPiAwKSB7Ci0gICAgaWYgKG1hcGxlbiA+IDI1NiB8fCBHRVRfMkIoMykgIT0gMCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX0JBRENNQVApOwotICAgIC8qIEFsbG9jYXRlIHNwYWNlIHRvIHN0b3JlIHRoZSBjb2xvcm1hcCAqLwotICAgIHNvdXJjZS0+Y29sb3JtYXAgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIChKRElNRU5TSU9OKSBtYXBsZW4sIChKRElNRU5TSU9OKSAzKTsKLSAgICAvKiBhbmQgcmVhZCBpdCBmcm9tIHRoZSBmaWxlICovCi0gICAgcmVhZF9jb2xvcm1hcChzb3VyY2UsIChpbnQpIG1hcGxlbiwgVUNIKHRhcmdhaGVhZGVyWzddKSk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGNtYXB0eXBlKQkJLyogYnV0IHlvdSBwcm9taXNlZCBhIGNtYXAhICovCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9CQURQQVJNUyk7Ci0gICAgc291cmNlLT5jb2xvcm1hcCA9IE5VTEw7Ci0gIH0KLQotICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IGNvbXBvbmVudHM7Ci0gIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiA9IDg7Ci0gIGNpbmZvLT5pbWFnZV93aWR0aCA9IHdpZHRoOwotICBjaW5mby0+aW1hZ2VfaGVpZ2h0ID0gaGVpZ2h0OwotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9pbnB1dF90Z2EgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotewotICAvKiBubyB3b3JrICovCi19Ci0KLQotLyoKLSAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIFRhcmdhIGZvcm1hdCBpbnB1dC4KLSAqLwotCi1HTE9CQUwoY2pwZWdfc291cmNlX3B0cikKLWppbml0X3JlYWRfdGFyZ2EgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICB0Z2Ffc291cmNlX3B0ciBzb3VyY2U7Ci0KLSAgLyogQ3JlYXRlIG1vZHVsZSBpbnRlcmZhY2Ugb2JqZWN0ICovCi0gIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBTSVpFT0YodGdhX3NvdXJjZV9zdHJ1Y3QpKTsKLSAgc291cmNlLT5jaW5mbyA9IGNpbmZvOwkvKiBtYWtlIGJhY2sgbGluayBmb3Igc3Vicm91dGluZXMgKi8KLSAgLyogRmlsbCBpbiBtZXRob2QgcHRycywgZXhjZXB0IGdldF9waXhlbF9yb3dzIHdoaWNoIHN0YXJ0X2lucHV0IHNldHMgKi8KLSAgc291cmNlLT5wdWIuc3RhcnRfaW5wdXQgPSBzdGFydF9pbnB1dF90Z2E7Ci0gIHNvdXJjZS0+cHViLmZpbmlzaF9pbnB1dCA9IGZpbmlzaF9pbnB1dF90Z2E7Ci0KLSAgcmV0dXJuIChjanBlZ19zb3VyY2VfcHRyKSBzb3VyY2U7Ci19Ci0KLSNlbmRpZiAvKiBUQVJHQV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2pjY29sbW14LmFzbSBiL3NpbWQvamNjb2xtbXguYXNtCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIGpjY29sbW14LmFzbQpyZW5hbWUgdG8gc2ltZC9qY2NvbG1teC5hc20KaW5kZXggMmUyZmNhNi4uNzAxYTMyNyAxMDA2NDQKLS0tIGEvamNjb2xtbXguYXNtCisrKyBiL3NpbWQvamNjb2xtbXguYXNtCkBAIC0xLDYgKzEsOSBAQAogOwogOyBqY2NvbG1teC5hc20gLSBjb2xvcnNwYWNlIGNvbnZlcnNpb24gKE1NWCkKIDsKKzsgQ29weXJpZ2h0IDIwMDkgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorOworOyBCYXNlZCBvbgogOyB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKIDsgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KIDsgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGpzaW1kZXh0LmluYwpAQCAtMTEsMTUgKzE0LDEwIEBACiA7IE5BU00gaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL25hc20uc291cmNlZm9yZ2UubmV0LyBvcgogOyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD02MjA4CiA7Ci07IExhc3QgTW9kaWZpZWQgOiBGZWJydWFyeSA0LCAyMDA2Ci07CiA7IFtUQUI4XQogCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotJWluY2x1ZGUgImpjb2xzYW1wLmluYyIKLQotJWlmIFJHQl9QSVhFTFNJWkUgPT0gMyB8fCBSR0JfUElYRUxTSVpFID09IDQKLSVpZmRlZiBKQ0NPTE9SX1JHQllDQ19NTVhfU1VQUE9SVEVECislaW5jbHVkZSAic2ltZC9qc2ltZGV4dC5pbmMiCislaW5jbHVkZSAic2ltZC9qY29sc2FtcC5pbmMiCiAKIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNTksMTIgKzU3LDEyIEBACiA7IENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIG91dHB1dCBjb2xvcnNwYWNlLgogOwogOyBHTE9CQUwodm9pZCkKLTsganBlZ19yZ2JfeWNjX2NvbnZlcnRfbW14IChqX2NvbXByZXNzX3B0ciBjaW5mbywKKzsganNpbWRfcmdiX3ljY19jb252ZXJ0X21teCAoSkRJTUVOU0lPTiBpbWdfd2lkdGgsCiA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKIDsgICAgICAgICAgICAgICAgICAgICAgICAgICBKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cyk7CiA7CiAKLSVkZWZpbmUgY2luZm8oYikJKGIpKzgJCTsgal9jb21wcmVzc19wdHIgY2luZm8KKyVkZWZpbmUgaW1nX3dpZHRoKGIpCShiKSs4CQkJOyBKRElNRU5TSU9OIGltZ193aWR0aAogJWRlZmluZSBpbnB1dF9idWYoYikJKGIpKzEyCQk7IEpTQU1QQVJSQVkgaW5wdXRfYnVmCiAlZGVmaW5lIG91dHB1dF9idWYoYikJKGIpKzE2CQk7IEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZgogJWRlZmluZSBvdXRwdXRfcm93KGIpCShiKSsyMAkJOyBKRElNRU5TSU9OIG91dHB1dF9yb3cKQEAgLTc2LDkgKzc0LDkgQEAKICVkZWZpbmUgZ290cHRyCQl3aygwKS1TSVpFT0ZfUE9JTlRFUgk7IHZvaWQgKiBnb3RwdHIKIAogCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19yZ2JfeWNjX2NvbnZlcnRfbW14KQorCWdsb2JhbAlFWFROKGpzaW1kX3JnYl95Y2NfY29udmVydF9tbXgpCiAKLUVYVE4oanBlZ19yZ2JfeWNjX2NvbnZlcnRfbW14KToKK0VYVE4oanNpbWRfcmdiX3ljY19jb252ZXJ0X21teCk6CiAJcHVzaAllYnAKIAltb3YJZWF4LGVzcAkJCQk7IGVheCA9IG9yaWdpbmFsIGVicAogCXN1Ygllc3AsIGJ5dGUgNApAQCAtOTYsOCArOTQsNyBAQAogCWdldF9HT1QJZWJ4CQkJOyBnZXQgR09UIGFkZHJlc3MKIAltb3ZwaWMJUE9JTlRFUiBbZ290cHRyXSwgZWJ4CTsgc2F2ZSBHT1QgYWRkcmVzcwogCi0JbW92CWVjeCwgUE9JTlRFUiBbY2luZm8oZWF4KV0KLQltb3YJZWN4LCBKRElNRU5TSU9OIFtqY3N0cnVjdF9pbWFnZV93aWR0aChlY3gpXQk7IG51bV9jb2xzCisJbW92CWVjeCwgSkRJTUVOU0lPTiBbaW1nX3dpZHRoKGVheCldCTsgbnVtX2NvbHMKIAl0ZXN0CWVjeCxlY3gKIAlqegluZWFyIC5yZXR1cm4KIApAQCAtNTA5LDUgKzUwNiwzIEBACiAJcG9wCWVicAogCXJldAogCi0lZW5kaWYgOyBKQ0NPTE9SX1JHQllDQ19NTVhfU1VQUE9SVEVECi0lZW5kaWYgOyBSR0JfUElYRUxTSVpFID09IDMgfHwgUkdCX1BJWEVMU0laRSA9PSA0CmRpZmYgLS1naXQgYS9zaW1kL2pjb2xzYW1wLmluYyBiL3NpbWQvamNvbHNhbXAuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YjZiZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW1kL2pjb2xzYW1wLmluYwpAQCAtMCwwICsxLDczIEBACis7Cis7IGpjb2xzYW1wLmluYyAtIHByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBjb2xvciBjb252ZXJzaW9uICYgdXAvZG93bnNhbXBsaW5nCis7Cis7IENvcHlyaWdodCAyMDA5IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKzsKKzsgQmFzZWQgb24KKzsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Cis7IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCis7IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKKzsKKzsgW1RBQjhdCisKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOyBwc2V1ZG8tcmVzaXN0ZXJzIHRvIG1ha2Ugb3JkZXJpbmcgb2YgUkdCIGNvbmZpZ3VyYWJsZQorOworJWlmIFJHQl9SRUQgPT0gMAorJWRlZmluZSAgbW1BICBtbTAKKyVkZWZpbmUgIG1tQiAgbW0xCislZWxpZiBSR0JfR1JFRU4gPT0gMAorJWRlZmluZSAgbW1BICBtbTIKKyVkZWZpbmUgIG1tQiAgbW0zCislZWxpZiBSR0JfQkxVRSA9PSAwCislZGVmaW5lICBtbUEgIG1tNAorJWRlZmluZSAgbW1CICBtbTUKKyVlbHNlCislZGVmaW5lICBtbUEgIG1tNgorJWRlZmluZSAgbW1CICBtbTcKKyVlbmRpZgorCislaWYgUkdCX1JFRCA9PSAxCislZGVmaW5lICBtbUMgIG1tMAorJWRlZmluZSAgbW1EICBtbTEKKyVlbGlmIFJHQl9HUkVFTiA9PSAxCislZGVmaW5lICBtbUMgIG1tMgorJWRlZmluZSAgbW1EICBtbTMKKyVlbGlmIFJHQl9CTFVFID09IDEKKyVkZWZpbmUgIG1tQyAgbW00CislZGVmaW5lICBtbUQgIG1tNQorJWVsc2UKKyVkZWZpbmUgIG1tQyAgbW02CislZGVmaW5lICBtbUQgIG1tNworJWVuZGlmCisKKyVpZiBSR0JfUkVEID09IDIKKyVkZWZpbmUgIG1tRSAgbW0wCislZGVmaW5lICBtbUYgIG1tMQorJWVsaWYgUkdCX0dSRUVOID09IDIKKyVkZWZpbmUgIG1tRSAgbW0yCislZGVmaW5lICBtbUYgIG1tMworJWVsaWYgUkdCX0JMVUUgPT0gMgorJWRlZmluZSAgbW1FICBtbTQKKyVkZWZpbmUgIG1tRiAgbW01CislZWxzZQorJWRlZmluZSAgbW1FICBtbTYKKyVkZWZpbmUgIG1tRiAgbW03CislZW5kaWYKKworJWlmIFJHQl9SRUQgPT0gMworJWRlZmluZSAgbW1HICBtbTAKKyVkZWZpbmUgIG1tSCAgbW0xCislZWxpZiBSR0JfR1JFRU4gPT0gMworJWRlZmluZSAgbW1HICBtbTIKKyVkZWZpbmUgIG1tSCAgbW0zCislZWxpZiBSR0JfQkxVRSA9PSAzCislZGVmaW5lICBtbUcgIG1tNAorJWRlZmluZSAgbW1IICBtbTUKKyVlbHNlCislZGVmaW5lICBtbUcgIG1tNgorJWRlZmluZSAgbW1IICBtbTcKKyVlbmRpZgorCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9qY3FudG1teC5hc20gYi9zaW1kL2pjcW50bW14LmFzbQpzaW1pbGFyaXR5IGluZGV4IDc1JQpyZW5hbWUgZnJvbSBqY3FudG1teC5hc20KcmVuYW1lIHRvIHNpbWQvamNxbnRtbXguYXNtCmluZGV4IDljZGY1ODQuLjYwOTZlYWEgMTAwNjQ0Ci0tLSBhL2pjcW50bW14LmFzbQorKysgYi9zaW1kL2pjcW50bW14LmFzbQpAQCAtMSw2ICsxLDkgQEAKIDsKIDsgamNxbnRtbXguYXNtIC0gc2FtcGxlIGRhdGEgY29udmVyc2lvbiBhbmQgcXVhbnRpemF0aW9uIChNTVgpCiA7Cis7IENvcHlyaWdodCAyMDA5IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKzsKKzsgQmFzZWQgb24KIDsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5CiA7IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCiA7IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKQEAgLTExLDIwICsxNCwxMCBAQAogOyBOQVNNIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9uYXNtLnNvdXJjZWZvcmdlLm5ldC8gb3IKIDsgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NjIwOAogOwotOyBMYXN0IE1vZGlmaWVkIDogSmFudWFyeSAyNywgMjAwNQotOwogOyBbVEFCOF0KIAotJWluY2x1ZGUgImpzaW1kZXh0LmluYyIKLSVpbmNsdWRlICJqZGN0LmluYyIKLQotJWlmZGVmIEpGRENUX0lOVF9NTVhfU1VQUE9SVEVECi0KLTsgVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCi07Ci0laWYgRENUU0laRSAhPSA4Ci0lZXJyb3IgIlNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiIKLSVlbmRpZgorJWluY2x1ZGUgInNpbWQvanNpbWRleHQuaW5jIgorJWluY2x1ZGUgInNpbWQvamRjdC5pbmMiCiAKIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAlTRUNUSU9OCVNFR19URVhUCkBAIC0zMyw4ICsyNiw4IEBACiA7IExvYWQgZGF0YSBpbnRvIHdvcmtzcGFjZSwgYXBwbHlpbmcgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uCiA7CiA7IEdMT0JBTCh2b2lkKQotOyBqcGVnX2NvbnZzYW1wX2ludF9tbXggKEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sLAotOyAgICAgICAgICAgICAgICAgICAgICAgIERDVEVMRU0gKiB3b3Jrc3BhY2UpOworOyBqc2ltZF9jb252c2FtcF9tbXggKEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sLAorOyAgICAgICAgICAgICAgICAgICAgIERDVEVMRU0gKiB3b3Jrc3BhY2UpOwogOwogCiAlZGVmaW5lIHNhbXBsZV9kYXRhCWVicCs4CQk7IEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEKQEAgLTQyLDkgKzM1LDkgQEAKICVkZWZpbmUgd29ya3NwYWNlCWVicCsxNgkJOyBEQ1RFTEVNICogd29ya3NwYWNlCiAKIAlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfY29udnNhbXBfaW50X21teCkKKwlnbG9iYWwJRVhUTihqc2ltZF9jb252c2FtcF9tbXgpCiAKLUVYVE4oanBlZ19jb252c2FtcF9pbnRfbW14KToKK0VYVE4oanNpbWRfY29udnNhbXBfbW14KToKIAlwdXNoCWVicAogCW1vdgllYnAsZXNwCiAJcHVzaAllYngKQEAgLTEyNCw4ICsxMTcsNiBAQAogCXBvcAllYnAKIAlyZXQKIAotJWlmbmRlZiBKRkRDVF9JTlRfUVVBTlRJWkVfV0lUSF9ESVZJU0lPTgotCiA7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA7CiA7IFF1YW50aXplL2Rlc2NhbGUgdGhlIGNvZWZmaWNpZW50cywgYW5kIHN0b3JlIGludG8gY29lZl9ibG9jawpAQCAtMTM1LDIyICsxMjYsMjMgQEAKIDsgICAoaHR0cDovL3d3dy5hZ25lci5vcmcvYXNzZW0vKS4KIDsKIDsgR0xPQkFMKHZvaWQpCi07IGpwZWdfcXVhbnRpemVfaW50X21teCAoSkNPRUZQVFIgY29lZl9ibG9jaywgRENURUxFTSAqIGRpdmlzb3JzLAotOyAgICAgICAgICAgICAgICAgICAgICAgIERDVEVMRU0gKiB3b3Jrc3BhY2UpOworOyBqc2ltZF9xdWFudGl6ZV9tbXggKEpDT0VGUFRSIGNvZWZfYmxvY2ssIERDVEVMRU0gKiBkaXZpc29ycywKKzsgICAgICAgICAgICAgICAgICAgICBEQ1RFTEVNICogd29ya3NwYWNlKTsKIDsKIAogJWRlZmluZSBSRUNJUFJPQ0FMKG0sbixiKSBNTUJMT0NLKERDVFNJWkUqMCsobSksKG4pLChiKSxTSVpFT0ZfRENURUxFTSkKICVkZWZpbmUgQ09SUkVDVElPTihtLG4sYikgTU1CTE9DSyhEQ1RTSVpFKjErKG0pLChuKSwoYiksU0laRU9GX0RDVEVMRU0pCiAlZGVmaW5lIFNDQUxFKG0sbixiKSAgICAgIE1NQkxPQ0soRENUU0laRSoyKyhtKSwobiksKGIpLFNJWkVPRl9EQ1RFTEVNKQorJWRlZmluZSBTSElGVChtLG4sYikgICAgICBNTUJMT0NLKERDVFNJWkUqMysobSksKG4pLChiKSxTSVpFT0ZfRENURUxFTSkKIAogJWRlZmluZSBjb2VmX2Jsb2NrCWVicCs4CQk7IEpDT0VGUFRSIGNvZWZfYmxvY2sKICVkZWZpbmUgZGl2aXNvcnMJZWJwKzEyCQk7IERDVEVMRU0gKiBkaXZpc29ycwogJWRlZmluZSB3b3Jrc3BhY2UJZWJwKzE2CQk7IERDVEVMRU0gKiB3b3Jrc3BhY2UKIAogCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19xdWFudGl6ZV9pbnRfbW14KQorCWdsb2JhbAlFWFROKGpzaW1kX3F1YW50aXplX21teCkKIAotRVhUTihqcGVnX3F1YW50aXplX2ludF9tbXgpOgorRVhUTihqc2ltZF9xdWFudGl6ZV9tbXgpOgogCXB1c2gJZWJwCiAJbW92CWVicCxlc3AKIDsJcHVzaAllYngJCTsgdW51c2VkCkBAIC0xNzAsMTUgKzE2MiwyOSBAQAogLnF1YW50bG9vcDI6CiAJbW92cQltbTIsIE1NV09SRCBbTU1CTE9DSygwLDAsZXNpLFNJWkVPRl9EQ1RFTEVNKV0KIAltb3ZxCW1tMywgTU1XT1JEIFtNTUJMT0NLKDAsMSxlc2ksU0laRU9GX0RDVEVMRU0pXQorCiAJbW92cQltbTAsbW0yCiAJbW92cQltbTEsbW0zCi0JcHNyYXcJbW0yLChXT1JEX0JJVC0xKQotCXBzcmF3CW1tMywoV09SRF9CSVQtMSkKLQlweG9yCW1tMCxtbTIKLQlweG9yCW1tMSxtbTMKLQlwc3VidwltbTAsbW0yCQk7IGlmIChtbTAgPCAwKSBtbTAgPSAtbW0wOwotCXBzdWJ3CW1tMSxtbTMJCTsgaWYgKG1tMSA8IDApIG1tMSA9IC1tbTE7CiAKKwlwc3JhdwltbTIsKFdPUkRfQklULTEpICA7IC0xIGlmIHZhbHVlIDwgMCwgMCBvdGhlcndpc2UKKwlwc3JhdwltbTMsKFdPUkRfQklULTEpCisKKwlweG9yCW1tMCxtbTIgICA7IHZhbCA9IC12YWwKKwlweG9yCW1tMSxtbTMKKwlwc3VidwltbTAsbW0yCisJcHN1YncJbW0xLG1tMworCisJOworCTsgTU1YIGlzIGFuIGFubm95aW5nbHkgY3JhcHB5IGluc3RydWN0aW9uIHNldC4gSXQgaGFzIHR3bworCTsgbWlzZmVhdHVyZXMgdGhhdCBhcmUgY2F1c2luZyBwcm9ibGVtcyBoZXJlOgorCTsKKwk7IC0gQWxsIG11bHRpcGxpY2F0aW9ucyBhcmUgc2lnbmVkLgorCTsKKwk7IC0gVGhlIHNlY29uZCBvcGVyYW5kIGZvciB0aGUgc2hpZnRzIGlzIG5vdCB0cmVhdGVkIGFzIHBhY2tlZC4KKwk7CisJOworCTsgV2Ugd29yayBhcm91bmQgdGhlIGZpcnN0IHByb2JsZW0gYnkgaW1wbGVtZW50aW5nIHRoaXMgYWxnb3JpdGhtOgorCTsKIAk7IHVuc2lnbmVkIGxvbmcgdW5zaWduZWRfbXVsdGlwbHkodW5zaWduZWQgc2hvcnQgeCwgdW5zaWduZWQgc2hvcnQgeSkKIAk7IHsKIAk7ICAgZW51bSB7IFNIT1JUX0JJVCA9IDE2IH07CkBAIC0xOTMsNDIgKzE5OSw1NSBAQAogCTsgCiAJOyAgIHJldHVybiAodW5zaWduZWQgbG9uZykgc3o7CiAJOyB9CisJOworCTsgKG5vdGUgdGhhdCBhIG5lZ2F0aXZlIHN4IGFkZHMgX3N5XyBhbmQgdmljZSB2ZXJzYSkKKwk7CisJOyBGb3IgdGhlIHNlY29uZCBwcm9ibGVtLCB3ZSByZXBsYWNlIHRoZSBzaGlmdCBieSBhIG11bHRpcGxpY2F0aW9uLgorCTsgVW5mb3J0dW5hdGVseSB0aGF0IG1lYW5zIHdlIGhhdmUgdG8gZGVhbCB3aXRoIHRoZSBzaWduZWQgaXNzdWUgYWdhaW4uCisJOwogCiAJcGFkZHcJbW0wLCBNTVdPUkQgW0NPUlJFQ1RJT04oMCwwLGVkeCldICAgOyBjb3JyZWN0aW9uICsgcm91bmRmYWN0b3IKIAlwYWRkdwltbTEsIE1NV09SRCBbQ09SUkVDVElPTigwLDEsZWR4KV0KLQlwc2xsdwltbTAsMQotCXBzbGx3CW1tMSwxCi0JbW92cQltbTQsbW0wCisKKwltb3ZxCW1tNCxtbTAgICA7IHN0b3JlIGN1cnJlbnQgdmFsdWUgZm9yIGxhdGVyCiAJbW92cQltbTUsbW0xCiAJcG11bGh3CW1tMCwgTU1XT1JEIFtSRUNJUFJPQ0FMKDAsMCxlZHgpXSAgIDsgcmVjaXByb2NhbAogCXBtdWxodwltbTEsIE1NV09SRCBbUkVDSVBST0NBTCgwLDEsZWR4KV0KKwlwYWRkdwltbTAsbW00CQk7IHJlY2lwcm9jYWwgaXMgYWx3YXlzIG5lZ2F0aXZlIChNU0I9MSksCisJcGFkZHcJbW0xLG1tNSAgIDsgc28gd2UgYWx3YXlzIG5lZWQgdG8gYWRkIHRoZSBpbml0aWFsIHZhbHVlCisJICAgICAgICAgICAgICAgIDsgKGlucHV0IHZhbHVlIGlzIG5ldmVyIG5lZ2F0aXZlIGFzIHdlCisJICAgICAgICAgICAgICAgIDsgaW52ZXJ0ZWQgaXQgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgcm91dGluZSkKKworCTsgaGVyZSBpdCBnZXRzIGEgYml0IHRyaWNreSBhcyBib3RoIHNjYWxlCisJOyBhbmQgbW0wL21tMSBjYW4gYmUgbmVnYXRpdmUKIAltb3ZxCW1tNiwgTU1XT1JEIFtTQ0FMRSgwLDAsZWR4KV0JOyBzY2FsZQogCW1vdnEJbW03LCBNTVdPUkQgW1NDQUxFKDAsMSxlZHgpXQotCXBhZGR3CW1tMCxtbTQJCTsgcmVjaXByb2NhbCBpcyBhbHdheXMgbmVnYXRpdmUgKE1TQj0xKQotCXBhZGR3CW1tMSxtbTUKLQlwc2xsdwltbTAsMQotCXBzbGx3CW1tMSwxCiAJbW92cQltbTQsbW0wCiAJbW92cQltbTUsbW0xCiAJcG11bGh3CW1tMCxtbTYKIAlwbXVsaHcJbW0xLG1tNwotCXBzcmF3CW1tNiwoV09SRF9CSVQtMSkKKworCXBzcmF3CW1tNiwoV09SRF9CSVQtMSkgICAgOyBkZXRlcm1pbmUgaWYgc2NhbGUgaXMgbmVnYXRpdmUKIAlwc3JhdwltbTcsKFdPUkRfQklULTEpCi0JcGFuZAltbTYsbW00CisKKwlwYW5kCW1tNixtbTQgICAgICAgICAgICAgOyBhbmQgYWRkIGlucHV0IGlmIGl0IGlzCiAJcGFuZAltbTcsbW01CiAJcGFkZHcJbW0wLG1tNgogCXBhZGR3CW1tMSxtbTcKLQlwc3JhdwltbTQsKFdPUkRfQklULTEpCisKKwlwc3JhdwltbTQsKFdPUkRfQklULTEpICAgIDsgdGhlbiBjaGVjayBpZiBuZWdhdGl2ZSBpbnB1dCAKIAlwc3JhdwltbTUsKFdPUkRfQklULTEpCi0JcGFuZAltbTQsIE1NV09SRCBbU0NBTEUoMCwwLGVkeCldCTsgc2NhbGUKKworCXBhbmQJbW00LCBNTVdPUkQgW1NDQUxFKDAsMCxlZHgpXQk7IGFuZCBhZGQgc2NhbGUgaWYgaXQgaXMKIAlwYW5kCW1tNSwgTU1XT1JEIFtTQ0FMRSgwLDEsZWR4KV0KIAlwYWRkdwltbTAsbW00CiAJcGFkZHcJbW0xLG1tNQogCi0JcHhvcgltbTAsbW0yCisJcHhvcgltbTAsbW0yICAgOyB2YWwgPSAtdmFsCiAJcHhvcgltbTEsbW0zCiAJcHN1YncJbW0wLG1tMgogCXBzdWJ3CW1tMSxtbTMKKwogCW1vdnEJTU1XT1JEIFtNTUJMT0NLKDAsMCxlZGksU0laRU9GX0RDVEVMRU0pXSwgbW0wCiAJbW92cQlNTVdPUkQgW01NQkxPQ0soMCwxLGVkaSxTSVpFT0ZfRENURUxFTSldLCBtbTEKIApAQCAtMjUwLDUgKzI2OSwzIEBACiAJcG9wCWVicAogCXJldAogCi0lZW5kaWYgOyAhSkZEQ1RfSU5UX1FVQU5USVpFX1dJVEhfRElWSVNJT04KLSVlbmRpZiA7IEpGRENUX0lOVF9NTVhfU1VQUE9SVEVECmRpZmYgLS1naXQgYS9qY3NhbW1teC5hc20gYi9zaW1kL2pjc2FtbW14LmFzbQpzaW1pbGFyaXR5IGluZGV4IDc0JQpyZW5hbWUgZnJvbSBqY3NhbW1teC5hc20KcmVuYW1lIHRvIHNpbWQvamNzYW1tbXguYXNtCmluZGV4IDk1ZmM4MjUuLjVkZTM2MzcgMTAwNjQ0Ci0tLSBhL2pjc2FtbW14LmFzbQorKysgYi9zaW1kL2pjc2FtbW14LmFzbQpAQCAtMSw2ICsxLDkgQEAKIDsKIDsgamNzYW1tbXguYXNtIC0gZG93bnNhbXBsaW5nIChNTVgpCiA7Cis7IENvcHlyaWdodCAyMDA5IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKzsKKzsgQmFzZWQgb24KIDsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5CiA7IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCiA7IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKQEAgLTExLDE0ICsxNCw5IEBACiA7IE5BU00gaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL25hc20uc291cmNlZm9yZ2UubmV0LyBvcgogOyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD02MjA4CiA7Ci07IExhc3QgTW9kaWZpZWQgOiBKYW51YXJ5IDIzLCAyMDA2Ci07CiA7IFtUQUI4XQogCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotJWluY2x1ZGUgImpjb2xzYW1wLmluYyIKLQotJWlmZGVmIEpDU0FNUExFX01NWF9TVVBQT1JURUQKKyVpbmNsdWRlICJzaW1kL2pzaW1kZXh0LmluYyIKIAogOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCVNFQ1RJT04JU0VHX1RFWFQKQEAgLTI5LDIwICsyNywyMiBAQAogOyB3aXRob3V0IHNtb290aGluZy4KIDsKIDsgR0xPQkFMKHZvaWQpCi07IGpwZWdfaDJ2MV9kb3duc2FtcGxlX21teCAoal9jb21wcmVzc19wdHIgY2luZm8sCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKTsKKzsganNpbWRfaDJ2MV9kb3duc2FtcGxlX21teCAoSkRJTUVOU0lPTiBpbWFnZV93aWR0aCwgaW50IG1heF92X3NhbXBfZmFjdG9yLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKRElNRU5TSU9OIHZfc2FtcF9mYWN0b3IsIEpESU1FTlNJT04gd2lkdGhfYmxvY2tzLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpOwogOwogCi0lZGVmaW5lIGNpbmZvKGIpCShiKSs4CQk7IGpfY29tcHJlc3NfcHRyIGNpbmZvCi0lZGVmaW5lIGNvbXBwdHIoYikJKGIpKzEyCQk7IGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyCi0lZGVmaW5lIGlucHV0X2RhdGEoYikJKGIpKzE2CQk7IEpTQU1QQVJSQVkgaW5wdXRfZGF0YQotJWRlZmluZSBvdXRwdXRfZGF0YShiKQkoYikrMjAJCTsgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YQorJWRlZmluZSBpbWdfd2lkdGgoYikJKGIpKzgJCQk7IEpESU1FTlNJT04gaW1hZ2Vfd2lkdGgKKyVkZWZpbmUgbWF4X3Zfc2FtcChiKQkoYikrMTIJCTsgaW50IG1heF92X3NhbXBfZmFjdG9yCislZGVmaW5lIHZfc2FtcChiKQkJCShiKSsxNgkJOyBKRElNRU5TSU9OIHZfc2FtcF9mYWN0b3IKKyVkZWZpbmUgd2lkdGhfYmxrcyhiKQkoYikrMjAJCTsgSkRJTUVOU0lPTiB3aWR0aF9ibG9ja3MKKyVkZWZpbmUgaW5wdXRfZGF0YShiKQkoYikrMjQJCTsgSlNBTVBBUlJBWSBpbnB1dF9kYXRhCislZGVmaW5lIG91dHB1dF9kYXRhKGIpCShiKSsyOAk7IEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEKIAogCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19oMnYxX2Rvd25zYW1wbGVfbW14KQorCWdsb2JhbAlFWFROKGpzaW1kX2gydjFfZG93bnNhbXBsZV9tbXgpCiAKLUVYVE4oanBlZ19oMnYxX2Rvd25zYW1wbGVfbW14KToKK0VYVE4oanNpbWRfaDJ2MV9kb3duc2FtcGxlX21teCk6CiAJcHVzaAllYnAKIAltb3YJZWJwLGVzcAogOwlwdXNoCWVieAkJOyB1bnVzZWQKQEAgLTUxLDEzICs1MSwxMSBAQAogCXB1c2gJZXNpCiAJcHVzaAllZGkKIAotCW1vdgllY3gsIFBPSU5URVIgW2NvbXBwdHIoZWJwKV0KLQltb3YJZWN4LCBKRElNRU5TSU9OIFtqY29tcGluZm9fd2lkdGhfaW5fYmxvY2tzKGVjeCldCisJbW92CWVjeCwgSkRJTUVOU0lPTiBbd2lkdGhfYmxrcyhlYnApXQogCXNobAllY3gsMwkJCTsgaW11bCBlY3gsRENUU0laRSAoZWN4ID0gb3V0cHV0X2NvbHMpCiAJanoJbmVhciAucmV0dXJuCiAKLQltb3YJZWR4LCBQT0lOVEVSIFtjaW5mbyhlYnApXQotCW1vdgllZHgsIEpESU1FTlNJT04gW2pjc3RydWN0X2ltYWdlX3dpZHRoKGVkeCldCisJbW92CWVkeCwgSkRJTUVOU0lPTiBbaW1nX3dpZHRoKGVicCldCiAKIAk7IC0tIGV4cGFuZF9yaWdodF9lZGdlCiAKQEAgLTY2LDggKzY0LDcgQEAKIAlzdWIJZWN4LGVkeAogCWpsZQlzaG9ydCAuZXhwYW5kX2VuZAogCi0JbW92CWVheCwgUE9JTlRFUiBbY2luZm8oZWJwKV0KLQltb3YJZWF4LCBJTlQgW2pjc3RydWN0X21heF92X3NhbXBfZmFjdG9yKGVheCldCisJbW92CWVheCwgSU5UIFttYXhfdl9zYW1wKGVicCldCiAJdGVzdAllYXgsZWF4CiAJamxlCXNob3J0IC5leHBhbmRfZW5kCiAKQEAgLTk2LDggKzkzLDcgQEAKIAogCTsgLS0gaDJ2MV9kb3duc2FtcGxlCiAKLQltb3YJZWF4LCBQT0lOVEVSIFtjb21wcHRyKGVicCldCi0JbW92CWVheCwgSkRJTUVOU0lPTiBbamNvbXBpbmZvX3Zfc2FtcF9mYWN0b3IoZWF4KV0JOyByb3djdHIKKwltb3YJZWF4LCBKRElNRU5TSU9OIFt2X3NhbXAoZWJwKV0JOyByb3djdHIKIAl0ZXN0CWVheCxlYXgKIAlqbGUJc2hvcnQgLnJldHVybgogCkBAIC0xNzMsMjAgKzE2OSwyMiBAQAogOyB3aXRob3V0IHNtb290aGluZy4KIDsKIDsgR0xPQkFMKHZvaWQpCi07IGpwZWdfaDJ2Ml9kb3duc2FtcGxlX21teCAoal9jb21wcmVzc19wdHIgY2luZm8sCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKTsKKzsganNpbWRfaDJ2Ml9kb3duc2FtcGxlX21teCAoSkRJTUVOU0lPTiBpbWFnZV93aWR0aCwgaW50IG1heF92X3NhbXBfZmFjdG9yLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKRElNRU5TSU9OIHZfc2FtcF9mYWN0b3IsIEpESU1FTlNJT04gd2lkdGhfYmxvY2tzLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpOwogOwogCi0lZGVmaW5lIGNpbmZvKGIpCShiKSs4CQk7IGpfY29tcHJlc3NfcHRyIGNpbmZvCi0lZGVmaW5lIGNvbXBwdHIoYikJKGIpKzEyCQk7IGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyCi0lZGVmaW5lIGlucHV0X2RhdGEoYikJKGIpKzE2CQk7IEpTQU1QQVJSQVkgaW5wdXRfZGF0YQotJWRlZmluZSBvdXRwdXRfZGF0YShiKQkoYikrMjAJCTsgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YQorJWRlZmluZSBpbWdfd2lkdGgoYikJKGIpKzgJCQk7IEpESU1FTlNJT04gaW1hZ2Vfd2lkdGgKKyVkZWZpbmUgbWF4X3Zfc2FtcChiKQkoYikrMTIJCTsgaW50IG1heF92X3NhbXBfZmFjdG9yCislZGVmaW5lIHZfc2FtcChiKQkJCShiKSsxNgkJOyBKRElNRU5TSU9OIHZfc2FtcF9mYWN0b3IKKyVkZWZpbmUgd2lkdGhfYmxrcyhiKQkoYikrMjAJCTsgSkRJTUVOU0lPTiB3aWR0aF9ibG9ja3MKKyVkZWZpbmUgaW5wdXRfZGF0YShiKQkoYikrMjQJCTsgSlNBTVBBUlJBWSBpbnB1dF9kYXRhCislZGVmaW5lIG91dHB1dF9kYXRhKGIpCShiKSsyOAk7IEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEKIAogCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19oMnYyX2Rvd25zYW1wbGVfbW14KQorCWdsb2JhbAlFWFROKGpzaW1kX2gydjJfZG93bnNhbXBsZV9tbXgpCiAKLUVYVE4oanBlZ19oMnYyX2Rvd25zYW1wbGVfbW14KToKK0VYVE4oanNpbWRfaDJ2Ml9kb3duc2FtcGxlX21teCk6CiAJcHVzaAllYnAKIAltb3YJZWJwLGVzcAogOwlwdXNoCWVieAkJOyB1bnVzZWQKQEAgLTE5NSwxMyArMTkzLDExIEBACiAJcHVzaAllc2kKIAlwdXNoCWVkaQogCi0JbW92CWVjeCwgUE9JTlRFUiBbY29tcHB0cihlYnApXQotCW1vdgllY3gsIEpESU1FTlNJT04gW2pjb21waW5mb193aWR0aF9pbl9ibG9ja3MoZWN4KV0KKwltb3YJZWN4LCBKRElNRU5TSU9OIFt3aWR0aF9ibGtzKGVicCldCiAJc2hsCWVjeCwzCQkJOyBpbXVsIGVjeCxEQ1RTSVpFIChlY3ggPSBvdXRwdXRfY29scykKIAlqegluZWFyIC5yZXR1cm4KIAotCW1vdgllZHgsIFBPSU5URVIgW2NpbmZvKGVicCldCi0JbW92CWVkeCwgSkRJTUVOU0lPTiBbamNzdHJ1Y3RfaW1hZ2Vfd2lkdGgoZWR4KV0KKwltb3YJZWR4LCBKRElNRU5TSU9OIFtpbWdfd2lkdGgoZWJwKV0KIAogCTsgLS0gZXhwYW5kX3JpZ2h0X2VkZ2UKIApAQCAtMjEwLDggKzIwNiw3IEBACiAJc3ViCWVjeCxlZHgKIAlqbGUJc2hvcnQgLmV4cGFuZF9lbmQKIAotCW1vdgllYXgsIFBPSU5URVIgW2NpbmZvKGVicCldCi0JbW92CWVheCwgSU5UIFtqY3N0cnVjdF9tYXhfdl9zYW1wX2ZhY3RvcihlYXgpXQorCW1vdgllYXgsIElOVCBbbWF4X3Zfc2FtcChlYnApXQogCXRlc3QJZWF4LGVheAogCWpsZQlzaG9ydCAuZXhwYW5kX2VuZAogCkBAIC0yNDAsOCArMjM1LDcgQEAKIAogCTsgLS0gaDJ2Ml9kb3duc2FtcGxlCiAKLQltb3YJZWF4LCBQT0lOVEVSIFtjb21wcHRyKGVicCldCi0JbW92CWVheCwgSkRJTUVOU0lPTiBbamNvbXBpbmZvX3Zfc2FtcF9mYWN0b3IoZWF4KV0JOyByb3djdHIKKwltb3YJZWF4LCBKRElNRU5TSU9OIFt2X3NhbXAoZWJwKV0JOyByb3djdHIKIAl0ZXN0CWVheCxlYXgKIAlqbGUJbmVhciAucmV0dXJuCiAKQEAgLTMyNSw0ICszMTksMyBAQAogCXBvcAllYnAKIAlyZXQKIAotJWVuZGlmIDsgSkNTQU1QTEVfTU1YX1NVUFBPUlRFRApkaWZmIC0tZ2l0IGEvamRjb2xtbXguYXNtIGIvc2ltZC9qZGNvbG1teC5hc20Kc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gamRjb2xtbXguYXNtCnJlbmFtZSB0byBzaW1kL2pkY29sbW14LmFzbQppbmRleCBlNDY2MjJjLi4zM2Q1MDYzIDEwMDY0NAotLS0gYS9qZGNvbG1teC5hc20KKysrIGIvc2ltZC9qZGNvbG1teC5hc20KQEAgLTEsNiArMSw5IEBACiA7CiA7IGpkY29sbW14LmFzbSAtIGNvbG9yc3BhY2UgY29udmVyc2lvbiAoTU1YKQogOworOyBDb3B5cmlnaHQgMjAwOSBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCis7Cis7IEJhc2VkIG9uCiA7IHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQogOyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgogOyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4ganNpbWRleHQuaW5jCkBAIC0xMSwxNSArMTQsMTAgQEAKIDsgTkFTTSBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vbmFzbS5zb3VyY2Vmb3JnZS5uZXQvIG9yCiA7IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTYyMDgKIDsKLTsgTGFzdCBNb2RpZmllZCA6IEZlYnJ1YXJ5IDQsIDIwMDYKLTsKIDsgW1RBQjhdCiAKLSVpbmNsdWRlICJqc2ltZGV4dC5pbmMiCi0laW5jbHVkZSAiamNvbHNhbXAuaW5jIgotCi0laWYgUkdCX1BJWEVMU0laRSA9PSAzIHx8IFJHQl9QSVhFTFNJWkUgPT0gNAotJWlmZGVmIEpEQ09MT1JfWUNDUkdCX01NWF9TVVBQT1JURUQKKyVpbmNsdWRlICJzaW1kL2pzaW1kZXh0LmluYyIKKyVpbmNsdWRlICJzaW1kL2pjb2xzYW1wLmluYyIKIAogOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC01NiwxMiArNTQsMTIgQEAKIDsgQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgb3V0cHV0IGNvbG9yc3BhY2UuCiA7CiA7IEdMT0JBTCh2b2lkKQotOyBqcGVnX3ljY19yZ2JfY29udmVydF9tbXggKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQorOyBqc2ltZF95Y2NfcmdiX2NvbnZlcnRfbW14IChKRElNRU5TSU9OIG91dF93aWR0aCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKIDsKIAotJWRlZmluZSBjaW5mbyhiKQkoYikrOAkJOyBqX2RlY29tcHJlc3NfcHRyIGNpbmZvCislZGVmaW5lIG91dF93aWR0aChiKQkoYikrOAkJCTsgSkRJTUVOU0lPTiBvdXRfd2lkdGgKICVkZWZpbmUgaW5wdXRfYnVmKGIpCShiKSsxMgkJOyBKU0FNUElNQUdFIGlucHV0X2J1ZgogJWRlZmluZSBpbnB1dF9yb3coYikJKGIpKzE2CQk7IEpESU1FTlNJT04gaW5wdXRfcm93CiAlZGVmaW5lIG91dHB1dF9idWYoYikJKGIpKzIwCQk7IEpTQU1QQVJSQVkgb3V0cHV0X2J1ZgpAQCAtNzMsOSArNzEsOSBAQAogJWRlZmluZSBnb3RwdHIJCXdrKDApLVNJWkVPRl9QT0lOVEVSCTsgdm9pZCAqIGdvdHB0cgogCiAJYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX3ljY19yZ2JfY29udmVydF9tbXgpCisJZ2xvYmFsCUVYVE4oanNpbWRfeWNjX3JnYl9jb252ZXJ0X21teCkKIAotRVhUTihqcGVnX3ljY19yZ2JfY29udmVydF9tbXgpOgorRVhUTihqc2ltZF95Y2NfcmdiX2NvbnZlcnRfbW14KToKIAlwdXNoCWVicAogCW1vdgllYXgsZXNwCQkJCTsgZWF4ID0gb3JpZ2luYWwgZWJwCiAJc3ViCWVzcCwgYnl0ZSA0CkBAIC05Myw4ICs5MSw3IEBACiAJZ2V0X0dPVAllYngJCQk7IGdldCBHT1QgYWRkcmVzcwogCW1vdnBpYwlQT0lOVEVSIFtnb3RwdHJdLCBlYngJOyBzYXZlIEdPVCBhZGRyZXNzCiAKLQltb3YJZWN4LCBQT0lOVEVSIFtjaW5mbyhlYXgpXQotCW1vdgllY3gsIEpESU1FTlNJT04gW2pkc3RydWN0X291dHB1dF93aWR0aChlY3gpXQk7IG51bV9jb2xzCisJbW92CWVjeCwgSkRJTUVOU0lPTiBbb3V0X3dpZHRoKGVheCldCTsgbnVtX2NvbHMKIAl0ZXN0CWVjeCxlY3gKIAlqegluZWFyIC5yZXR1cm4KIApAQCAtNDM0LDUgKzQzMSwzIEBACiAJcG9wCWVicAogCXJldAogCi0lZW5kaWYgOyBKRENPTE9SX1lDQ1JHQl9NTVhfU1VQUE9SVEVECi0lZW5kaWYgOyBSR0JfUElYRUxTSVpFID09IDMgfHwgUkdCX1BJWEVMU0laRSA9PSA0CmRpZmYgLS1naXQgYS9zaW1kL2pkY3QuaW5jIGIvc2ltZC9qZGN0LmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTNmNjZlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltZC9qZGN0LmluYwpAQCAtMCwwICsxLDI3IEBACis7Cis7IGpkY3QuaW5jIC0gcHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIGZvcndhcmQgJiByZXZlcnNlIERDVCBzdWJzeXN0ZW1zCis7Cis7IENvcHlyaWdodCAyMDA5IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKzsKKzsgQmFzZWQgb24KKzsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5Cis7IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCis7IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKKzsKKzsgW1RBQjhdCisKKzsgRWFjaCBJRENUIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHJhbmdlLWxpbWl0aW5nIGl0cyByZXN1bHRzIGFuZAorOyBjb252ZXJ0aW5nIHRoZW0gdG8gdW5zaWduZWQgZm9ybSAoMC4uTUFYSlNBTVBMRSkuICBUaGUgcmF3IG91dHB1dHMgY291bGQKKzsgYmUgcXVpdGUgZmFyIG91dCBvZiByYW5nZSBpZiB0aGUgaW5wdXQgZGF0YSBpcyBjb3JydXB0LCBzbyBhIGJ1bGxldHByb29mCis7IHJhbmdlLWxpbWl0aW5nIHN0ZXAgaXMgcmVxdWlyZWQuICBXZSB1c2UgYSBtYXNrLWFuZC10YWJsZS1sb29rdXAgbWV0aG9kCis7IHRvIGRvIHRoZSBjb21iaW5lZCBvcGVyYXRpb25zIHF1aWNrbHkuCis7CislZGVmaW5lIFJBTkdFX01BU0sgIChNQVhKU0FNUExFICogNCArIDMpICA7IDIgYml0cyB3aWRlciB0aGFuIGxlZ2FsIHNhbXBsZXMKKworJWRlZmluZSBST1cobixiLHMpCQkoKGIpKyhuKSoocykpCislZGVmaW5lIENPTChuLGIscykJCSgoYikrKG4pKihzKSpEQ1RTSVpFKQorCislZGVmaW5lIERXQkxPQ0sobSxuLGIscykJKChiKSsobSkqRENUU0laRSoocykrKG4pKlNJWkVPRl9EV09SRCkKKyVkZWZpbmUgTU1CTE9DSyhtLG4sYixzKQkoKGIpKyhtKSpEQ1RTSVpFKihzKSsobikqU0laRU9GX01NV09SRCkKKworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc2ltZC9qZG1lcm1teC5hc20gYi9zaW1kL2pkbWVybW14LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDgyZTQwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltZC9qZG1lcm1teC5hc20KQEAgLTAsMCArMSw0OTIgQEAKKzsKKzsgamRtZXJtbXguYXNtIC0gbWVyZ2VkIHVwc2FtcGxpbmcvY29sb3IgY29udmVyc2lvbiAoTU1YKQorOworOyBDb3B5cmlnaHQgMjAwOSBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCis7Cis7IEJhc2VkIG9uCis7IHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQorOyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgorOyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4ganNpbWRleHQuaW5jCis7Cis7IFRoaXMgZmlsZSBzaG91bGQgYmUgYXNzZW1ibGVkIHdpdGggTkFTTSAoTmV0d2lkZSBBc3NlbWJsZXIpLAorOyBjYW4gKm5vdCogYmUgYXNzZW1ibGVkIHdpdGggTWljcm9zb2Z0J3MgTUFTTSBvciBhbnkgY29tcGF0aWJsZQorOyBhc3NlbWJsZXIgKGluY2x1ZGluZyBCb3JsYW5kJ3MgVHVyYm8gQXNzZW1ibGVyKS4KKzsgTkFTTSBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vbmFzbS5zb3VyY2Vmb3JnZS5uZXQvIG9yCis7IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTYyMDgKKzsKKzsgW1RBQjhdCisKKyVpbmNsdWRlICJzaW1kL2pzaW1kZXh0LmluYyIKKyVpbmNsdWRlICJzaW1kL2pjb2xzYW1wLmluYyIKKworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislZGVmaW5lIFNDQUxFQklUUwkxNgorCitGXzBfMzQ0CWVxdQkgMjI1NTQJCQk7IEZJWCgwLjM0NDE0KQorRl8wXzcxNAllcXUJIDQ2ODAyCQkJOyBGSVgoMC43MTQxNCkKK0ZfMV80MDIJZXF1CSA5MTg4MQkJCTsgRklYKDEuNDAyMDApCitGXzFfNzcyCWVxdQkxMTYxMzAJCQk7IEZJWCgxLjc3MjAwKQorRl8wXzQwMgllcXUJKEZfMV80MDIgLSA2NTUzNikJOyBGSVgoMS40MDIwMCkgLSBGSVgoMSkKK0ZfMF8yODUJZXF1CSggNjU1MzYgLSBGXzBfNzE0KQk7IEZJWCgxKSAtIEZJWCgwLjcxNDE0KQorRl8wXzIyOAllcXUJKDEzMTA3MiAtIEZfMV83NzIpCTsgRklYKDIpIC0gRklYKDEuNzcyMDApCisKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlTRUNUSU9OCVNFR19DT05TVAorCisJYWxpZ256CTE2CisJZ2xvYmFsCUVYVE4oamNvbnN0X21lcmdlZF91cHNhbXBsZV9tbXgpCisKK0VYVE4oamNvbnN0X21lcmdlZF91cHNhbXBsZV9tbXgpOgorCitQV19GMDQwMgl0aW1lcyA0IGR3ICBGXzBfNDAyCitQV19NRjAyMjgJdGltZXMgNCBkdyAtRl8wXzIyOAorUFdfTUYwMzQ0X0YwMjg1CXRpbWVzIDIgZHcgLUZfMF8zNDQsIEZfMF8yODUKK1BXX09ORQkJdGltZXMgNCBkdyAgMQorUERfT05FSEFMRgl0aW1lcyAyIGRkICAxIDw8IChTQ0FMRUJJVFMtMSkKKworCWFsaWduegkxNgorCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJU0VDVElPTglTRUdfVEVYVAorCUJJVFMJMzIKKzsKKzsgVXBzYW1wbGUgYW5kIGNvbG9yIGNvbnZlcnQgZm9yIHRoZSBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAxOjEgdmVydGljYWwuCis7Cis7IEdMT0JBTCh2b2lkKQorOyBqc2ltZF9oMnYxX21lcmdlZF91cHNhbXBsZV9tbXggKEpESU1FTlNJT04gb3V0cHV0X3dpZHRoLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYpOworOworCislZGVmaW5lIG91dHB1dF93aWR0aChiKQkoYikrOAkJCTsgSkRJTUVOU0lPTiBvdXRwdXRfd2lkdGgKKyVkZWZpbmUgaW5wdXRfYnVmKGIpCQkoYikrMTIJCTsgSlNBTVBJTUFHRSBpbnB1dF9idWYKKyVkZWZpbmUgaW5fcm93X2dyb3VwX2N0cihiKQkoYikrMTYJCTsgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyCislZGVmaW5lIG91dHB1dF9idWYoYikJCShiKSsyMAkJOyBKU0FNUEFSUkFZIG91dHB1dF9idWYKKworJWRlZmluZSBvcmlnaW5hbF9lYnAJZWJwKzAKKyVkZWZpbmUgd2soaSkJCWVicC0oV0tfTlVNLShpKSkqU0laRU9GX01NV09SRAk7IG1td29yZCB3a1tXS19OVU1dCislZGVmaW5lIFdLX05VTQkJMworJWRlZmluZSBnb3RwdHIJCXdrKDApLVNJWkVPRl9QT0lOVEVSCTsgdm9pZCAqIGdvdHB0cgorCisJYWxpZ24JMTYKKwlnbG9iYWwJRVhUTihqc2ltZF9oMnYxX21lcmdlZF91cHNhbXBsZV9tbXgpCisKK0VYVE4oanNpbWRfaDJ2MV9tZXJnZWRfdXBzYW1wbGVfbW14KToKKwlwdXNoCWVicAorCW1vdgllYXgsZXNwCQkJCTsgZWF4ID0gb3JpZ2luYWwgZWJwCisJc3ViCWVzcCwgYnl0ZSA0CisJYW5kCWVzcCwgYnl0ZSAoLVNJWkVPRl9NTVdPUkQpCTsgYWxpZ24gdG8gNjQgYml0cworCW1vdglbZXNwXSxlYXgKKwltb3YJZWJwLGVzcAkJCQk7IGVicCA9IGFsaWduZWQgZWJwCisJbGVhCWVzcCwgW3drKDApXQorCXB1c2hwaWMJZWF4CQk7IG1ha2UgYSByb29tIGZvciBHT1QgYWRkcmVzcworCXB1c2gJZWJ4Cis7CXB1c2gJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAorOwlwdXNoCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKKwlwdXNoCWVzaQorCXB1c2gJZWRpCisKKwlnZXRfR09UCWVieAkJCTsgZ2V0IEdPVCBhZGRyZXNzCisJbW92cGljCVBPSU5URVIgW2dvdHB0cl0sIGVieAk7IHNhdmUgR09UIGFkZHJlc3MKKworCW1vdgllY3gsIEpESU1FTlNJT04gW291dHB1dF93aWR0aChlYXgpXQk7IGNvbAorCXRlc3QJZWN4LGVjeAorCWp6CW5lYXIgLnJldHVybgorCisJcHVzaAllY3gKKworCW1vdgllZGksIEpTQU1QSU1BR0UgW2lucHV0X2J1ZihlYXgpXQorCW1vdgllY3gsIEpESU1FTlNJT04gW2luX3Jvd19ncm91cF9jdHIoZWF4KV0KKwltb3YJZXNpLCBKU0FNUEFSUkFZIFtlZGkrMCpTSVpFT0ZfSlNBTVBBUlJBWV0KKwltb3YJZWJ4LCBKU0FNUEFSUkFZIFtlZGkrMSpTSVpFT0ZfSlNBTVBBUlJBWV0KKwltb3YJZWR4LCBKU0FNUEFSUkFZIFtlZGkrMipTSVpFT0ZfSlNBTVBBUlJBWV0KKwltb3YJZWRpLCBKU0FNUEFSUkFZIFtvdXRwdXRfYnVmKGVheCldCisJbW92CWVzaSwgSlNBTVBST1cgW2VzaStlY3gqU0laRU9GX0pTQU1QUk9XXQkJOyBpbnB0cjAKKwltb3YJZWJ4LCBKU0FNUFJPVyBbZWJ4K2VjeCpTSVpFT0ZfSlNBTVBST1ddCQk7IGlucHRyMQorCW1vdgllZHgsIEpTQU1QUk9XIFtlZHgrZWN4KlNJWkVPRl9KU0FNUFJPV10JCTsgaW5wdHIyCisJbW92CWVkaSwgSlNBTVBST1cgW2VkaV0JCQkJOyBvdXRwdHIKKworCXBvcAllY3gJCQk7IGNvbAorCisJYWxpZ254CTE2LDcKKy5jb2x1bW5sb29wOgorCW1vdnBpYwllYXgsIFBPSU5URVIgW2dvdHB0cl0JOyBsb2FkIEdPVCBhZGRyZXNzIChlYXgpCisKKwltb3ZxICAgICAgbW02LCBNTVdPUkQgW2VieF0JOyBtbTY9Q2IoMDEyMzQ1NjcpCisJbW92cSAgICAgIG1tNywgTU1XT1JEIFtlZHhdCTsgbW03PUNyKDAxMjM0NTY3KQorCisJcHhvciAgICAgIG1tMSxtbTEJCTsgbW0xPShhbGwgMCdzKQorCXBjbXBlcXcgICBtbTMsbW0zCisJcHNsbHcgICAgIG1tMyw3CQkJOyBtbTM9ezB4RkY4MCAweEZGODAgMHhGRjgwIDB4RkY4MH0KKworCW1vdnEgICAgICBtbTQsbW02CisJcHVucGNraGJ3IG1tNixtbTEJCTsgbW02PUNiKDQ1NjcpPUNiSAorCXB1bnBja2xidyBtbTQsbW0xCQk7IG1tND1DYigwMTIzKT1DYkwKKwltb3ZxICAgICAgbW0wLG1tNworCXB1bnBja2hidyBtbTcsbW0xCQk7IG1tNz1Dcig0NTY3KT1DckgKKwlwdW5wY2tsYncgbW0wLG1tMQkJOyBtbTA9Q3IoMDEyMyk9Q3JMCisKKwlwYWRkdyAgICAgbW02LG1tMworCXBhZGR3ICAgICBtbTQsbW0zCisJcGFkZHcgICAgIG1tNyxtbTMKKwlwYWRkdyAgICAgbW0wLG1tMworCisJOyAoT3JpZ2luYWwpCisJOyBSID0gWSAgICAgICAgICAgICAgICArIDEuNDAyMDAgKiBDcgorCTsgRyA9IFkgLSAwLjM0NDE0ICogQ2IgLSAwLjcxNDE0ICogQ3IKKwk7IEIgPSBZICsgMS43NzIwMCAqIENiCisJOworCTsgKFRoaXMgaW1wbGVtZW50YXRpb24pCisJOyBSID0gWSAgICAgICAgICAgICAgICArIDAuNDAyMDAgKiBDciArIENyCisJOyBHID0gWSAtIDAuMzQ0MTQgKiBDYiArIDAuMjg1ODYgKiBDciAtIENyCisJOyBCID0gWSAtIDAuMjI4MDAgKiBDYiArIENiICsgQ2IKKworCW1vdnEJbW01LG1tNgkJCTsgbW01PUNiSAorCW1vdnEJbW0yLG1tNAkJCTsgbW0yPUNiTAorCXBhZGR3CW1tNixtbTYJCQk7IG1tNj0yKkNiSAorCXBhZGR3CW1tNCxtbTQJCQk7IG1tND0yKkNiTAorCW1vdnEJbW0xLG1tNwkJCTsgbW0xPUNySAorCW1vdnEJbW0zLG1tMAkJCTsgbW0zPUNyTAorCXBhZGR3CW1tNyxtbTcJCQk7IG1tNz0yKkNySAorCXBhZGR3CW1tMCxtbTAJCQk7IG1tMD0yKkNyTAorCisJcG11bGh3CW1tNixbR09UT0ZGKGVheCxQV19NRjAyMjgpXQk7IG1tNj0oMipDYkggKiAtRklYKDAuMjI4MDApKQorCXBtdWxodwltbTQsW0dPVE9GRihlYXgsUFdfTUYwMjI4KV0JOyBtbTQ9KDIqQ2JMICogLUZJWCgwLjIyODAwKSkKKwlwbXVsaHcJbW03LFtHT1RPRkYoZWF4LFBXX0YwNDAyKV0JOyBtbTc9KDIqQ3JIICogRklYKDAuNDAyMDApKQorCXBtdWxodwltbTAsW0dPVE9GRihlYXgsUFdfRjA0MDIpXQk7IG1tMD0oMipDckwgKiBGSVgoMC40MDIwMCkpCisKKwlwYWRkdwltbTYsW0dPVE9GRihlYXgsUFdfT05FKV0KKwlwYWRkdwltbTQsW0dPVE9GRihlYXgsUFdfT05FKV0KKwlwc3JhdwltbTYsMQkJCTsgbW02PShDYkggKiAtRklYKDAuMjI4MDApKQorCXBzcmF3CW1tNCwxCQkJOyBtbTQ9KENiTCAqIC1GSVgoMC4yMjgwMCkpCisJcGFkZHcJbW03LFtHT1RPRkYoZWF4LFBXX09ORSldCisJcGFkZHcJbW0wLFtHT1RPRkYoZWF4LFBXX09ORSldCisJcHNyYXcJbW03LDEJCQk7IG1tNz0oQ3JIICogRklYKDAuNDAyMDApKQorCXBzcmF3CW1tMCwxCQkJOyBtbTA9KENyTCAqIEZJWCgwLjQwMjAwKSkKKworCXBhZGR3CW1tNixtbTUKKwlwYWRkdwltbTQsbW0yCisJcGFkZHcJbW02LG1tNQkJCTsgbW02PShDYkggKiBGSVgoMS43NzIwMCkpPShCLVkpSAorCXBhZGR3CW1tNCxtbTIJCQk7IG1tND0oQ2JMICogRklYKDEuNzcyMDApKT0oQi1ZKUwKKwlwYWRkdwltbTcsbW0xCQkJOyBtbTc9KENySCAqIEZJWCgxLjQwMjAwKSk9KFItWSlICisJcGFkZHcJbW0wLG1tMwkJCTsgbW0wPShDckwgKiBGSVgoMS40MDIwMCkpPShSLVkpTAorCisJbW92cQlNTVdPUkQgW3drKDApXSwgbW02CTsgd2soMCk9KEItWSlICisJbW92cQlNTVdPUkQgW3drKDEpXSwgbW03CTsgd2soMSk9KFItWSlICisKKwltb3ZxICAgICAgbW02LG1tNQorCW1vdnEgICAgICBtbTcsbW0yCisJcHVucGNrbHdkIG1tNSxtbTEKKwlwdW5wY2tod2QgbW02LG1tMQorCXBtYWRkd2QgICBtbTUsW0dPVE9GRihlYXgsUFdfTUYwMzQ0X0YwMjg1KV0KKwlwbWFkZHdkICAgbW02LFtHT1RPRkYoZWF4LFBXX01GMDM0NF9GMDI4NSldCisJcHVucGNrbHdkIG1tMixtbTMKKwlwdW5wY2tod2QgbW03LG1tMworCXBtYWRkd2QgICBtbTIsW0dPVE9GRihlYXgsUFdfTUYwMzQ0X0YwMjg1KV0KKwlwbWFkZHdkICAgbW03LFtHT1RPRkYoZWF4LFBXX01GMDM0NF9GMDI4NSldCisKKwlwYWRkZCAgICAgbW01LFtHT1RPRkYoZWF4LFBEX09ORUhBTEYpXQorCXBhZGRkICAgICBtbTYsW0dPVE9GRihlYXgsUERfT05FSEFMRildCisJcHNyYWQgICAgIG1tNSxTQ0FMRUJJVFMKKwlwc3JhZCAgICAgbW02LFNDQUxFQklUUworCXBhZGRkICAgICBtbTIsW0dPVE9GRihlYXgsUERfT05FSEFMRildCisJcGFkZGQgICAgIG1tNyxbR09UT0ZGKGVheCxQRF9PTkVIQUxGKV0KKwlwc3JhZCAgICAgbW0yLFNDQUxFQklUUworCXBzcmFkICAgICBtbTcsU0NBTEVCSVRTCisKKwlwYWNrc3NkdyAgbW01LG1tNgk7IG1tNT1DYkgqLUZJWCgwLjM0NCkrQ3JIKkZJWCgwLjI4NSkKKwlwYWNrc3NkdyAgbW0yLG1tNwk7IG1tMj1DYkwqLUZJWCgwLjM0NCkrQ3JMKkZJWCgwLjI4NSkKKwlwc3VidyAgICAgbW01LG1tMQk7IG1tNT1DYkgqLUZJWCgwLjM0NCkrQ3JIKi1GSVgoMC43MTQpPShHLVkpSAorCXBzdWJ3ICAgICBtbTIsbW0zCTsgbW0yPUNiTCotRklYKDAuMzQ0KStDckwqLUZJWCgwLjcxNCk9KEctWSlMCisKKwltb3ZxCU1NV09SRCBbd2soMildLCBtbTUJOyB3aygyKT0oRy1ZKUgKKworCW1vdglhbCwyCQkJOyBZY3RyCisJam1wCXNob3J0IC5ZbG9vcF8xc3QKKwlhbGlnbngJMTYsNworCisuWWxvb3BfMm5kOgorCW1vdnEJbW0wLCBNTVdPUkQgW3drKDEpXQk7IG1tMD0oUi1ZKUgKKwltb3ZxCW1tMiwgTU1XT1JEIFt3aygyKV0JOyBtbTI9KEctWSlICisJbW92cQltbTQsIE1NV09SRCBbd2soMCldCTsgbW00PShCLVkpSAorCWFsaWdueAkxNiw3CisKKy5ZbG9vcF8xc3Q6CisJbW92cQltbTcsIE1NV09SRCBbZXNpXQk7IG1tNz1ZKDAxMjM0NTY3KQorCisJcGNtcGVxdwltbTYsbW02CisJcHNybHcJbW02LEJZVEVfQklUCQk7IG1tNj17MHhGRiAweDAwIDB4RkYgMHgwMCAuLn0KKwlwYW5kCW1tNixtbTcJCQk7IG1tNj1ZKDAyNDYpPVlFCisJcHNybHcJbW03LEJZVEVfQklUCQk7IG1tNz1ZKDEzNTcpPVlPCisKKwltb3ZxCW1tMSxtbTAJCQk7IG1tMT1tbTA9KFItWSkoTC9IKQorCW1vdnEJbW0zLG1tMgkJCTsgbW0zPW1tMj0oRy1ZKShML0gpCisJbW92cQltbTUsbW00CQkJOyBtbTU9bW00PShCLVkpKEwvSCkKKworCXBhZGR3ICAgICBtbTAsbW02CQk7IG1tMD0oKFItWSkrWUUpPVJFPShSMCBSMiBSNCBSNikKKwlwYWRkdyAgICAgbW0xLG1tNwkJOyBtbTE9KChSLVkpK1lPKT1STz0oUjEgUjMgUjUgUjcpCisJcGFja3Vzd2IgIG1tMCxtbTAJCTsgbW0wPShSMCBSMiBSNCBSNiAqKiAqKiAqKiAqKikKKwlwYWNrdXN3YiAgbW0xLG1tMQkJOyBtbTE9KFIxIFIzIFI1IFI3ICoqICoqICoqICoqKQorCisJcGFkZHcgICAgIG1tMixtbTYJCTsgbW0yPSgoRy1ZKStZRSk9R0U9KEcwIEcyIEc0IEc2KQorCXBhZGR3ICAgICBtbTMsbW03CQk7IG1tMz0oKEctWSkrWU8pPUdPPShHMSBHMyBHNSBHNykKKwlwYWNrdXN3YiAgbW0yLG1tMgkJOyBtbTI9KEcwIEcyIEc0IEc2ICoqICoqICoqICoqKQorCXBhY2t1c3diICBtbTMsbW0zCQk7IG1tMz0oRzEgRzMgRzUgRzcgKiogKiogKiogKiopCisKKwlwYWRkdyAgICAgbW00LG1tNgkJOyBtbTQ9KChCLVkpK1lFKT1CRT0oQjAgQjIgQjQgQjYpCisJcGFkZHcgICAgIG1tNSxtbTcJCTsgbW01PSgoQi1ZKStZTyk9Qk89KEIxIEIzIEI1IEI3KQorCXBhY2t1c3diICBtbTQsbW00CQk7IG1tND0oQjAgQjIgQjQgQjYgKiogKiogKiogKiopCisJcGFja3Vzd2IgIG1tNSxtbTUJCTsgbW01PShCMSBCMyBCNSBCNyAqKiAqKiAqKiAqKikKKworJWlmIFJHQl9QSVhFTFNJWkUgPT0gMyA7IC0tLS0tLS0tLS0tLS0tLQorCisJOyBtbUE9KDAwIDAyIDA0IDA2ICoqICoqICoqICoqKSwgbW1CPSgwMSAwMyAwNSAwNyAqKiAqKiAqKiAqKikKKwk7IG1tQz0oMTAgMTIgMTQgMTYgKiogKiogKiogKiopLCBtbUQ9KDExIDEzIDE1IDE3ICoqICoqICoqICoqKQorCTsgbW1FPSgyMCAyMiAyNCAyNiAqKiAqKiAqKiAqKiksIG1tRj0oMjEgMjMgMjUgMjcgKiogKiogKiogKiopCisJOyBtbUc9KCoqICoqICoqICoqICoqICoqICoqICoqKSwgbW1IPSgqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKikKKworCXB1bnBja2xidyBtbUEsbW1DCQk7IG1tQT0oMDAgMTAgMDIgMTIgMDQgMTQgMDYgMTYpCisJcHVucGNrbGJ3IG1tRSxtbUIJCTsgbW1FPSgyMCAwMSAyMiAwMyAyNCAwNSAyNiAwNykKKwlwdW5wY2tsYncgbW1ELG1tRgkJOyBtbUQ9KDExIDIxIDEzIDIzIDE1IDI1IDE3IDI3KQorCisJbW92cSAgICAgIG1tRyxtbUEKKwltb3ZxICAgICAgbW1ILG1tQQorCXB1bnBja2x3ZCBtbUEsbW1FCQk7IG1tQT0oMDAgMTAgMjAgMDEgMDIgMTIgMjIgMDMpCisJcHVucGNraHdkIG1tRyxtbUUJCTsgbW1HPSgwNCAxNCAyNCAwNSAwNiAxNiAyNiAwNykKKworCXBzcmxxICAgICBtbUgsMipCWVRFX0JJVAk7IG1tSD0oMDIgMTIgMDQgMTQgMDYgMTYgLS0gLS0pCisJcHNybHEgICAgIG1tRSwyKkJZVEVfQklUCTsgbW1FPSgyMiAwMyAyNCAwNSAyNiAwNyAtLSAtLSkKKworCW1vdnEgICAgICBtbUMsbW1ECisJbW92cSAgICAgIG1tQixtbUQKKwlwdW5wY2tsd2QgbW1ELG1tSAkJOyBtbUQ9KDExIDIxIDAyIDEyIDEzIDIzIDA0IDE0KQorCXB1bnBja2h3ZCBtbUMsbW1ICQk7IG1tQz0oMTUgMjUgMDYgMTYgMTcgMjcgLS0gLS0pCisKKwlwc3JscSAgICAgbW1CLDIqQllURV9CSVQJOyBtbUI9KDEzIDIzIDE1IDI1IDE3IDI3IC0tIC0tKQorCisJbW92cSAgICAgIG1tRixtbUUKKwlwdW5wY2tsd2QgbW1FLG1tQgkJOyBtbUU9KDIyIDAzIDEzIDIzIDI0IDA1IDE1IDI1KQorCXB1bnBja2h3ZCBtbUYsbW1CCQk7IG1tRj0oMjYgMDcgMTcgMjcgLS0gLS0gLS0gLS0pCisKKwlwdW5wY2tsZHEgbW1BLG1tRAkJOyBtbUE9KDAwIDEwIDIwIDAxIDExIDIxIDAyIDEyKQorCXB1bnBja2xkcSBtbUUsbW1HCQk7IG1tRT0oMjIgMDMgMTMgMjMgMDQgMTQgMjQgMDUpCisJcHVucGNrbGRxIG1tQyxtbUYJCTsgbW1DPSgxNSAyNSAwNiAxNiAyNiAwNyAxNyAyNykKKworCWNtcAllY3gsIGJ5dGUgU0laRU9GX01NV09SRAorCWpiCXNob3J0IC5jb2x1bW5fc3QxNgorCisJbW92cQlNTVdPUkQgW2VkaSswKlNJWkVPRl9NTVdPUkRdLCBtbUEKKwltb3ZxCU1NV09SRCBbZWRpKzEqU0laRU9GX01NV09SRF0sIG1tRQorCW1vdnEJTU1XT1JEIFtlZGkrMipTSVpFT0ZfTU1XT1JEXSwgbW1DCisKKwlzdWIJZWN4LCBieXRlIFNJWkVPRl9NTVdPUkQKKwlqeglzaG9ydCAuZW5kY29sdW1uCisKKwlhZGQJZWRpLCBieXRlIFJHQl9QSVhFTFNJWkUqU0laRU9GX01NV09SRAk7IG91dHB0cgorCWFkZAllc2ksIGJ5dGUgU0laRU9GX01NV09SRAkJCTsgaW5wdHIwCisJZGVjCWFsCQkJOyBZY3RyCisJam56CW5lYXIgLllsb29wXzJuZAorCisJYWRkCWVieCwgYnl0ZSBTSVpFT0ZfTU1XT1JECQkJOyBpbnB0cjEKKwlhZGQJZWR4LCBieXRlIFNJWkVPRl9NTVdPUkQJCQk7IGlucHRyMgorCWptcAluZWFyIC5jb2x1bW5sb29wCisJYWxpZ254CTE2LDcKKworLmNvbHVtbl9zdDE2OgorCWxlYQllY3gsIFtlY3grZWN4KjJdCTsgaW11bCBlY3gsIFJHQl9QSVhFTFNJWkUKKwljbXAJZWN4LCBieXRlIDIqU0laRU9GX01NV09SRAorCWpiCXNob3J0IC5jb2x1bW5fc3Q4CisJbW92cQlNTVdPUkQgW2VkaSswKlNJWkVPRl9NTVdPUkRdLCBtbUEKKwltb3ZxCU1NV09SRCBbZWRpKzEqU0laRU9GX01NV09SRF0sIG1tRQorCW1vdnEJbW1BLG1tQworCXN1YgllY3gsIGJ5dGUgMipTSVpFT0ZfTU1XT1JECisJYWRkCWVkaSwgYnl0ZSAyKlNJWkVPRl9NTVdPUkQKKwlqbXAJc2hvcnQgLmNvbHVtbl9zdDQKKy5jb2x1bW5fc3Q4OgorCWNtcAllY3gsIGJ5dGUgU0laRU9GX01NV09SRAorCWpiCXNob3J0IC5jb2x1bW5fc3Q0CisJbW92cQlNTVdPUkQgW2VkaSswKlNJWkVPRl9NTVdPUkRdLCBtbUEKKwltb3ZxCW1tQSxtbUUKKwlzdWIJZWN4LCBieXRlIFNJWkVPRl9NTVdPUkQKKwlhZGQJZWRpLCBieXRlIFNJWkVPRl9NTVdPUkQKKy5jb2x1bW5fc3Q0OgorCW1vdmQJZWF4LG1tQQorCWNtcAllY3gsIGJ5dGUgU0laRU9GX0RXT1JECisJamIJc2hvcnQgLmNvbHVtbl9zdDIKKwltb3YJRFdPUkQgW2VkaSswKlNJWkVPRl9EV09SRF0sIGVheAorCXBzcmxxCW1tQSxEV09SRF9CSVQKKwltb3ZkCWVheCxtbUEKKwlzdWIJZWN4LCBieXRlIFNJWkVPRl9EV09SRAorCWFkZAllZGksIGJ5dGUgU0laRU9GX0RXT1JECisuY29sdW1uX3N0MjoKKwljbXAJZWN4LCBieXRlIFNJWkVPRl9XT1JECisJamIJc2hvcnQgLmNvbHVtbl9zdDEKKwltb3YJV09SRCBbZWRpKzAqU0laRU9GX1dPUkRdLCBheAorCXNocgllYXgsV09SRF9CSVQKKwlzdWIJZWN4LCBieXRlIFNJWkVPRl9XT1JECisJYWRkCWVkaSwgYnl0ZSBTSVpFT0ZfV09SRAorLmNvbHVtbl9zdDE6CisJY21wCWVjeCwgYnl0ZSBTSVpFT0ZfQllURQorCWpiCXNob3J0IC5lbmRjb2x1bW4KKwltb3YJQllURSBbZWRpKzAqU0laRU9GX0JZVEVdLCBhbAorCislZWxzZSA7IFJHQl9QSVhFTFNJWkUgPT0gNCA7IC0tLS0tLS0tLS0tCisKKyVpZmRlZiBSR0JYX0ZJTExFUl8wWEZGCisJcGNtcGVxYiAgIG1tNixtbTYJCTsgbW02PShYMCBYMiBYNCBYNiAqKiAqKiAqKiAqKikKKwlwY21wZXFiICAgbW03LG1tNwkJOyBtbTc9KFgxIFgzIFg1IFg3ICoqICoqICoqICoqKQorJWVsc2UKKwlweG9yICAgICAgbW02LG1tNgkJOyBtbTY9KFgwIFgyIFg0IFg2ICoqICoqICoqICoqKQorCXB4b3IgICAgICBtbTcsbW03CQk7IG1tNz0oWDEgWDMgWDUgWDcgKiogKiogKiogKiopCislZW5kaWYKKwk7IG1tQT0oMDAgMDIgMDQgMDYgKiogKiogKiogKiopLCBtbUI9KDAxIDAzIDA1IDA3ICoqICoqICoqICoqKQorCTsgbW1DPSgxMCAxMiAxNCAxNiAqKiAqKiAqKiAqKiksIG1tRD0oMTEgMTMgMTUgMTcgKiogKiogKiogKiopCisJOyBtbUU9KDIwIDIyIDI0IDI2ICoqICoqICoqICoqKSwgbW1GPSgyMSAyMyAyNSAyNyAqKiAqKiAqKiAqKikKKwk7IG1tRz0oMzAgMzIgMzQgMzYgKiogKiogKiogKiopLCBtbUg9KDMxIDMzIDM1IDM3ICoqICoqICoqICoqKQorCisJcHVucGNrbGJ3IG1tQSxtbUMJCTsgbW1BPSgwMCAxMCAwMiAxMiAwNCAxNCAwNiAxNikKKwlwdW5wY2tsYncgbW1FLG1tRwkJOyBtbUU9KDIwIDMwIDIyIDMyIDI0IDM0IDI2IDM2KQorCXB1bnBja2xidyBtbUIsbW1ECQk7IG1tQj0oMDEgMTEgMDMgMTMgMDUgMTUgMDcgMTcpCisJcHVucGNrbGJ3IG1tRixtbUgJCTsgbW1GPSgyMSAzMSAyMyAzMyAyNSAzNSAyNyAzNykKKworCW1vdnEgICAgICBtbUMsbW1BCisJcHVucGNrbHdkIG1tQSxtbUUJCTsgbW1BPSgwMCAxMCAyMCAzMCAwMiAxMiAyMiAzMikKKwlwdW5wY2tod2QgbW1DLG1tRQkJOyBtbUM9KDA0IDE0IDI0IDM0IDA2IDE2IDI2IDM2KQorCW1vdnEgICAgICBtbUcsbW1CCisJcHVucGNrbHdkIG1tQixtbUYJCTsgbW1CPSgwMSAxMSAyMSAzMSAwMyAxMyAyMyAzMykKKwlwdW5wY2tod2QgbW1HLG1tRgkJOyBtbUc9KDA1IDE1IDI1IDM1IDA3IDE3IDI3IDM3KQorCisJbW92cSAgICAgIG1tRCxtbUEKKwlwdW5wY2tsZHEgbW1BLG1tQgkJOyBtbUE9KDAwIDEwIDIwIDMwIDAxIDExIDIxIDMxKQorCXB1bnBja2hkcSBtbUQsbW1CCQk7IG1tRD0oMDIgMTIgMjIgMzIgMDMgMTMgMjMgMzMpCisJbW92cSAgICAgIG1tSCxtbUMKKwlwdW5wY2tsZHEgbW1DLG1tRwkJOyBtbUM9KDA0IDE0IDI0IDM0IDA1IDE1IDI1IDM1KQorCXB1bnBja2hkcSBtbUgsbW1HCQk7IG1tSD0oMDYgMTYgMjYgMzYgMDcgMTcgMjcgMzcpCisKKwljbXAJZWN4LCBieXRlIFNJWkVPRl9NTVdPUkQKKwlqYglzaG9ydCAuY29sdW1uX3N0MTYKKworCW1vdnEJTU1XT1JEIFtlZGkrMCpTSVpFT0ZfTU1XT1JEXSwgbW1BCisJbW92cQlNTVdPUkQgW2VkaSsxKlNJWkVPRl9NTVdPUkRdLCBtbUQKKwltb3ZxCU1NV09SRCBbZWRpKzIqU0laRU9GX01NV09SRF0sIG1tQworCW1vdnEJTU1XT1JEIFtlZGkrMypTSVpFT0ZfTU1XT1JEXSwgbW1ICisKKwlzdWIJZWN4LCBieXRlIFNJWkVPRl9NTVdPUkQKKwlqeglzaG9ydCAuZW5kY29sdW1uCisKKwlhZGQJZWRpLCBieXRlIFJHQl9QSVhFTFNJWkUqU0laRU9GX01NV09SRAk7IG91dHB0cgorCWFkZAllc2ksIGJ5dGUgU0laRU9GX01NV09SRAkJCTsgaW5wdHIwCisJZGVjCWFsCQkJOyBZY3RyCisJam56CW5lYXIgLllsb29wXzJuZAorCisJYWRkCWVieCwgYnl0ZSBTSVpFT0ZfTU1XT1JECQkJOyBpbnB0cjEKKwlhZGQJZWR4LCBieXRlIFNJWkVPRl9NTVdPUkQJCQk7IGlucHRyMgorCWptcAluZWFyIC5jb2x1bW5sb29wCisJYWxpZ254CTE2LDcKKworLmNvbHVtbl9zdDE2OgorCWNtcAllY3gsIGJ5dGUgU0laRU9GX01NV09SRC8yCisJamIJc2hvcnQgLmNvbHVtbl9zdDgKKwltb3ZxCU1NV09SRCBbZWRpKzAqU0laRU9GX01NV09SRF0sIG1tQQorCW1vdnEJTU1XT1JEIFtlZGkrMSpTSVpFT0ZfTU1XT1JEXSwgbW1ECisJbW92cQltbUEsbW1DCisJbW92cQltbUQsbW1ICisJc3ViCWVjeCwgYnl0ZSBTSVpFT0ZfTU1XT1JELzIKKwlhZGQJZWRpLCBieXRlIDIqU0laRU9GX01NV09SRAorLmNvbHVtbl9zdDg6CisJY21wCWVjeCwgYnl0ZSBTSVpFT0ZfTU1XT1JELzQKKwlqYglzaG9ydCAuY29sdW1uX3N0NAorCW1vdnEJTU1XT1JEIFtlZGkrMCpTSVpFT0ZfTU1XT1JEXSwgbW1BCisJbW92cQltbUEsbW1ECisJc3ViCWVjeCwgYnl0ZSBTSVpFT0ZfTU1XT1JELzQKKwlhZGQJZWRpLCBieXRlIDEqU0laRU9GX01NV09SRAorLmNvbHVtbl9zdDQ6CisJY21wCWVjeCwgYnl0ZSBTSVpFT0ZfTU1XT1JELzgKKwlqYglzaG9ydCAuZW5kY29sdW1uCisJbW92ZAlEV09SRCBbZWRpKzAqU0laRU9GX0RXT1JEXSwgbW1BCisKKyVlbmRpZiA7IFJHQl9QSVhFTFNJWkUgOyAtLS0tLS0tLS0tLS0tLS0KKworLmVuZGNvbHVtbjoKKwllbW1zCQk7IGVtcHR5IE1NWCBzdGF0ZQorCisucmV0dXJuOgorCXBvcAllZGkKKwlwb3AJZXNpCis7CXBvcAllZHgJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCis7CXBvcAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCisJcG9wCWVieAorCW1vdgllc3AsZWJwCQk7IGVzcCA8LSBhbGlnbmVkIGVicAorCXBvcAllc3AJCTsgZXNwIDwtIG9yaWdpbmFsIGVicAorCXBvcAllYnAKKwlyZXQKKworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBVcHNhbXBsZSBhbmQgY29sb3IgY29udmVydCBmb3IgdGhlIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDI6MSB2ZXJ0aWNhbC4KKzsKKzsgR0xPQkFMKHZvaWQpCis7IGpzaW1kX2gydjJfbWVyZ2VkX3Vwc2FtcGxlX21teCAoSkRJTUVOU0lPTiBvdXRwdXRfd2lkdGgsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1Zik7Cis7CisKKyVkZWZpbmUgb3V0cHV0X3dpZHRoKGIpCShiKSs4CQkJOyBKRElNRU5TSU9OIG91dHB1dF93aWR0aAorJWRlZmluZSBpbnB1dF9idWYoYikJCShiKSsxMgkJOyBKU0FNUElNQUdFIGlucHV0X2J1ZgorJWRlZmluZSBpbl9yb3dfZ3JvdXBfY3RyKGIpCShiKSsxNgkJOyBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIKKyVkZWZpbmUgb3V0cHV0X2J1ZihiKQkJKGIpKzIwCQk7IEpTQU1QQVJSQVkgb3V0cHV0X2J1ZgorCisJYWxpZ24JMTYKKwlnbG9iYWwJRVhUTihqc2ltZF9oMnYyX21lcmdlZF91cHNhbXBsZV9tbXgpCisKK0VYVE4oanNpbWRfaDJ2Ml9tZXJnZWRfdXBzYW1wbGVfbW14KToKKwlwdXNoCWVicAorCW1vdgllYnAsZXNwCisJcHVzaAllYngKKzsJcHVzaAllY3gJCTsgbmVlZCBub3QgYmUgcHJlc2VydmVkCis7CXB1c2gJZWR4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAorCXB1c2gJZXNpCisJcHVzaAllZGkKKworCW1vdgllYXgsIEpESU1FTlNJT04gW291dHB1dF93aWR0aChlYnApXQorCisJbW92CWVkaSwgSlNBTVBJTUFHRSBbaW5wdXRfYnVmKGVicCldCisJbW92CWVjeCwgSkRJTUVOU0lPTiBbaW5fcm93X2dyb3VwX2N0cihlYnApXQorCW1vdgllc2ksIEpTQU1QQVJSQVkgW2VkaSswKlNJWkVPRl9KU0FNUEFSUkFZXQorCW1vdgllYngsIEpTQU1QQVJSQVkgW2VkaSsxKlNJWkVPRl9KU0FNUEFSUkFZXQorCW1vdgllZHgsIEpTQU1QQVJSQVkgW2VkaSsyKlNJWkVPRl9KU0FNUEFSUkFZXQorCW1vdgllZGksIEpTQU1QQVJSQVkgW291dHB1dF9idWYoZWJwKV0KKwlsZWEJZXNpLCBbZXNpK2VjeCpTSVpFT0ZfSlNBTVBST1ddCisKKwlwdXNoCWVkeAkJCTsgaW5wdHIyCisJcHVzaAllYngJCQk7IGlucHRyMQorCXB1c2gJZXNpCQkJOyBpbnB0cjAwCisJbW92CWVieCxlc3AKKworCXB1c2gJZWRpCQkJOyBvdXRwdXRfYnVmIChvdXRwdHIwKQorCXB1c2gJZWN4CQkJOyBpbl9yb3dfZ3JvdXBfY3RyCisJcHVzaAllYngJCQk7IGlucHV0X2J1ZgorCXB1c2gJZWF4CQkJOyBvdXRwdXRfd2lkdGgKKworCWNhbGwJbmVhciBFWFROKGpzaW1kX2gydjFfbWVyZ2VkX3Vwc2FtcGxlX21teCkKKworCWFkZAllc2ksIGJ5dGUgU0laRU9GX0pTQU1QUk9XCTsgaW5wdHIwMQorCWFkZAllZGksIGJ5dGUgU0laRU9GX0pTQU1QUk9XCTsgb3V0cHRyMQorCW1vdglQT0lOVEVSIFtlYngrMCpTSVpFT0ZfUE9JTlRFUl0sIGVzaQorCW1vdglQT0lOVEVSIFtlYngtMSpTSVpFT0ZfUE9JTlRFUl0sIGVkaQorCisJY2FsbAluZWFyIEVYVE4oanNpbWRfaDJ2MV9tZXJnZWRfdXBzYW1wbGVfbW14KQorCisJYWRkCWVzcCwgYnl0ZSA3KlNJWkVPRl9EV09SRAorCisJcG9wCWVkaQorCXBvcAllc2kKKzsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKKzsJcG9wCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorCmRpZmYgLS1naXQgYS9qZHNhbW1teC5hc20gYi9zaW1kL2pkc2FtbW14LmFzbQpzaW1pbGFyaXR5IGluZGV4IDcyJQpyZW5hbWUgZnJvbSBqZHNhbW1teC5hc20KcmVuYW1lIHRvIHNpbWQvamRzYW1tbXguYXNtCmluZGV4IGJiMTdkMzcuLmYwNjFlZTkgMTAwNjQ0Ci0tLSBhL2pkc2FtbW14LmFzbQorKysgYi9zaW1kL2pkc2FtbW14LmFzbQpAQCAtMSw2ICsxLDkgQEAKIDsKIDsgamRzYW1tbXguYXNtIC0gdXBzYW1wbGluZyAoTU1YKQogOworOyBDb3B5cmlnaHQgMjAwOSBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCis7Cis7IEJhc2VkIG9uCiA7IHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQogOyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgogOyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4ganNpbWRleHQuaW5jCkBAIC0xMSwxNCArMTQsOSBAQAogOyBOQVNNIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9uYXNtLnNvdXJjZWZvcmdlLm5ldC8gb3IKIDsgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NjIwOAogOwotOyBMYXN0IE1vZGlmaWVkIDogRmVicnVhcnkgNCwgMjAwNgotOwogOyBbVEFCOF0KIAotJWluY2x1ZGUgImpzaW1kZXh0LmluYyIKLSVpbmNsdWRlICJqY29sc2FtcC5pbmMiCi0KLSVpZmRlZiBKRFNBTVBMRV9GQU5DWV9NTVhfU1VQUE9SVEVECislaW5jbHVkZSAic2ltZC9qc2ltZGV4dC5pbmMiCiAKIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAlTRUNUSU9OCVNFR19DT05TVApAQCAtNDgsMjEgKzQ2LDIxIEBACiA7IG9mIHRoZSB3YXkgYmV0d2VlbiBpbnB1dCBwaXhlbCBjZW50ZXJzLgogOwogOyBHTE9CQUwodm9pZCkKLTsganBlZ19oMnYxX2ZhbmN5X3Vwc2FtcGxlX21teCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cik7Cis7IGpzaW1kX2gydjFfZmFuY3lfdXBzYW1wbGVfbW14IChpbnQgbWF4X3Zfc2FtcF9mYWN0b3IsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKRElNRU5TSU9OIGRvd25zYW1wbGVkX3dpZHRoLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cik7CiA7CiAKLSVkZWZpbmUgY2luZm8oYikJCShiKSs4CQk7IGpfZGVjb21wcmVzc19wdHIgY2luZm8KLSVkZWZpbmUgY29tcHB0cihiKQkJKGIpKzEyCQk7IGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyCislZGVmaW5lIG1heF92X3NhbXAoYikJCShiKSs4CQkJOyBpbnQgbWF4X3Zfc2FtcF9mYWN0b3IKKyVkZWZpbmUgZG93bnNhbXBfd2lkdGgoYikJKGIpKzEyCTsgSkRJTUVOU0lPTiBkb3duc2FtcGxlZF93aWR0aAogJWRlZmluZSBpbnB1dF9kYXRhKGIpCQkoYikrMTYJCTsgSlNBTVBBUlJBWSBpbnB1dF9kYXRhCiAlZGVmaW5lIG91dHB1dF9kYXRhX3B0cihiKQkoYikrMjAJCTsgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cgogCiAJYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2gydjFfZmFuY3lfdXBzYW1wbGVfbW14KQorCWdsb2JhbAlFWFROKGpzaW1kX2gydjFfZmFuY3lfdXBzYW1wbGVfbW14KQogCi1FWFROKGpwZWdfaDJ2MV9mYW5jeV91cHNhbXBsZV9tbXgpOgorRVhUTihqc2ltZF9oMnYxX2ZhbmN5X3Vwc2FtcGxlX21teCk6CiAJcHVzaAllYnAKIAltb3YJZWJwLGVzcAogCXB1c2hwaWMJZWJ4CkBAIC03MywxMyArNzEsMTEgQEAKIAogCWdldF9HT1QJZWJ4CQk7IGdldCBHT1QgYWRkcmVzcwogCi0JbW92CWVheCwgUE9JTlRFUiBbY29tcHB0cihlYnApXQotCW1vdgllYXgsIEpESU1FTlNJT04gW2pjb21waW5mb19kb3duc2FtcGxlZF93aWR0aChlYXgpXSAgOyBjb2xjdHIKKwltb3YJZWF4LCBKRElNRU5TSU9OIFtkb3duc2FtcF93aWR0aChlYnApXSAgOyBjb2xjdHIKIAl0ZXN0CWVheCxlYXgKIAlqegluZWFyIC5yZXR1cm4KIAotCW1vdgllY3gsIFBPSU5URVIgW2NpbmZvKGVicCldCi0JbW92CWVjeCwgSU5UIFtqZHN0cnVjdF9tYXhfdl9zYW1wX2ZhY3RvcihlY3gpXQk7IHJvd2N0cgorCW1vdgllY3gsIElOVCBbbWF4X3Zfc2FtcChlYnApXQk7IHJvd2N0cgogCXRlc3QJZWN4LGVjeAogCWp6CW5lYXIgLnJldHVybgogCkBAIC0yMDMsMTQgKzE5OSwxNCBAQAogOyBBZ2FpbiBhIHRyaWFuZ2xlIGZpbHRlcjsgc2VlIGNvbW1lbnRzIGZvciBoMnYxIGNhc2UsIGFib3ZlLgogOwogOyBHTE9CQUwodm9pZCkKLTsganBlZ19oMnYyX2ZhbmN5X3Vwc2FtcGxlX21teCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cik7Cis7IGpzaW1kX2gydjJfZmFuY3lfdXBzYW1wbGVfbW14IChpbnQgbWF4X3Zfc2FtcF9mYWN0b3IsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKRElNRU5TSU9OIGRvd25zYW1wbGVkX3dpZHRoLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cik7CiA7CiAKLSVkZWZpbmUgY2luZm8oYikJCShiKSs4CQk7IGpfZGVjb21wcmVzc19wdHIgY2luZm8KLSVkZWZpbmUgY29tcHB0cihiKQkJKGIpKzEyCQk7IGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyCislZGVmaW5lIG1heF92X3NhbXAoYikJCShiKSs4CQkJOyBpbnQgbWF4X3Zfc2FtcF9mYWN0b3IKKyVkZWZpbmUgZG93bnNhbXBfd2lkdGgoYikJKGIpKzEyCTsgSkRJTUVOU0lPTiBkb3duc2FtcGxlZF93aWR0aAogJWRlZmluZSBpbnB1dF9kYXRhKGIpCQkoYikrMTYJCTsgSlNBTVBBUlJBWSBpbnB1dF9kYXRhCiAlZGVmaW5lIG91dHB1dF9kYXRhX3B0cihiKQkoYikrMjAJCTsgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cgogCkBAIC0yMjAsOSArMjE2LDkgQEAKICVkZWZpbmUgZ290cHRyCQl3aygwKS1TSVpFT0ZfUE9JTlRFUgk7IHZvaWQgKiBnb3RwdHIKIAogCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19oMnYyX2ZhbmN5X3Vwc2FtcGxlX21teCkKKwlnbG9iYWwJRVhUTihqc2ltZF9oMnYyX2ZhbmN5X3Vwc2FtcGxlX21teCkKIAotRVhUTihqcGVnX2gydjJfZmFuY3lfdXBzYW1wbGVfbW14KToKK0VYVE4oanNpbWRfaDJ2Ml9mYW5jeV91cHNhbXBsZV9tbXgpOgogCXB1c2gJZWJwCiAJbW92CWVheCxlc3AJCQkJOyBlYXggPSBvcmlnaW5hbCBlYnAKIAlzdWIJZXNwLCBieXRlIDQKQEAgLTI0MSwxMyArMjM3LDExIEBACiAJbW92cGljCVBPSU5URVIgW2dvdHB0cl0sIGVieAk7IHNhdmUgR09UIGFkZHJlc3MKIAogCW1vdgllZHgsZWF4CQkJCTsgZWR4ID0gb3JpZ2luYWwgZWJwCi0JbW92CWVheCwgUE9JTlRFUiBbY29tcHB0cihlZHgpXQotCW1vdgllYXgsIEpESU1FTlNJT04gW2pjb21waW5mb19kb3duc2FtcGxlZF93aWR0aChlYXgpXSAgOyBjb2xjdHIKKwltb3YJZWF4LCBKRElNRU5TSU9OIFtkb3duc2FtcF93aWR0aChlZHgpXSAgOyBjb2xjdHIKIAl0ZXN0CWVheCxlYXgKIAlqegluZWFyIC5yZXR1cm4KIAotCW1vdgllY3gsIFBPSU5URVIgW2NpbmZvKGVkeCldCi0JbW92CWVjeCwgSU5UIFtqZHN0cnVjdF9tYXhfdl9zYW1wX2ZhY3RvcihlY3gpXQk7IHJvd2N0cgorCW1vdgllY3gsIElOVCBbbWF4X3Zfc2FtcChlZHgpXQk7IHJvd2N0cgogCXRlc3QJZWN4LGVjeAogCWp6CW5lYXIgLnJldHVybgogCkBAIC01MzAsMTc1ICs1MjQsMjcgQEAKIAlwb3AJZWJwCiAJcmV0CiAKLSVpZmRlZiBVUFNBTVBMRV9IMVYyX1NVUFBPUlRFRAotCiA7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA7Ci07IEZhbmN5IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAxOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLgotOyBBZ2FpbiBhIHRyaWFuZ2xlIGZpbHRlcjsgc2VlIGNvbW1lbnRzIGZvciBoMnYxIGNhc2UsIGFib3ZlLgotOwotOyBHTE9CQUwodm9pZCkKLTsganBlZ19oMXYyX2ZhbmN5X3Vwc2FtcGxlX21teCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cik7Ci07Ci0KLSVkZWZpbmUgY2luZm8oYikJCShiKSs4CQk7IGpfZGVjb21wcmVzc19wdHIgY2luZm8KLSVkZWZpbmUgY29tcHB0cihiKQkJKGIpKzEyCQk7IGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyCi0lZGVmaW5lIGlucHV0X2RhdGEoYikJCShiKSsxNgkJOyBKU0FNUEFSUkFZIGlucHV0X2RhdGEKLSVkZWZpbmUgb3V0cHV0X2RhdGFfcHRyKGIpCShiKSsyMAkJOyBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyCi0KLSVkZWZpbmUgZ290cHRyCQllYnAtU0laRU9GX1BPSU5URVIJOyB2b2lkICogZ290cHRyCi0KLQlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfaDF2Ml9mYW5jeV91cHNhbXBsZV9tbXgpCi0KLUVYVE4oanBlZ19oMXYyX2ZhbmN5X3Vwc2FtcGxlX21teCk6Ci0JcHVzaAllYnAKLQltb3YJZWJwLGVzcAotCXB1c2hwaWMJZWF4CQk7IG1ha2UgYSByb29tIGZvciBHT1QgYWRkcmVzcwotCXB1c2gJZWJ4Ci07CXB1c2gJZWN4CQk7IG5lZWQgbm90IGJlIHByZXNlcnZlZAotOwlwdXNoCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwdXNoCWVzaQotCXB1c2gJZWRpCi0KLQlnZXRfR09UCWVieAkJCTsgZ2V0IEdPVCBhZGRyZXNzCi0JbW92cGljCVBPSU5URVIgW2dvdHB0cl0sIGVieAk7IHNhdmUgR09UIGFkZHJlc3MKLQotCW1vdgllYXgsIFBPSU5URVIgW2NvbXBwdHIoZWJwKV0KLQltb3YJZWF4LCBKRElNRU5TSU9OIFtqY29tcGluZm9fZG93bnNhbXBsZWRfd2lkdGgoZWF4KV0gIDsgY29sY3RyCi0JYWRkCWVheCwgYnl0ZSBTSVpFT0ZfTU1XT1JELTEKLQlhbmQJZWF4LCBieXRlIC1TSVpFT0ZfTU1XT1JECi0JanoJbmVhciAucmV0dXJuCi0KLQltb3YJZWN4LCBQT0lOVEVSIFtjaW5mbyhlYnApXQotCW1vdgllY3gsIElOVCBbamRzdHJ1Y3RfbWF4X3Zfc2FtcF9mYWN0b3IoZWN4KV0JOyByb3djdHIKLQl0ZXN0CWVjeCxlY3gKLQlqegluZWFyIC5yZXR1cm4KLQotCW1vdgllc2ksIEpTQU1QQVJSQVkgW2lucHV0X2RhdGEoZWJwKV0JOyBpbnB1dF9kYXRhCi0JbW92CWVkaSwgUE9JTlRFUiBbb3V0cHV0X2RhdGFfcHRyKGVicCldCi0JbW92CWVkaSwgSlNBTVBBUlJBWSBbZWRpXQkJCTsgb3V0cHV0X2RhdGEKLQlhbGlnbngJMTYsNwotLnJvd2xvb3A6Ci0JcHVzaAllYXgJCQkJCTsgY29sY3RyCi0JcHVzaAllY3gKLQlwdXNoCWVkaQotCXB1c2gJZXNpCi0KLQltb3YJZWN4LCBKU0FNUFJPVyBbZXNpLTEqU0laRU9GX0pTQU1QUk9XXQk7IGlucHRyMShhYm92ZSkKLQltb3YJZWJ4LCBKU0FNUFJPVyBbZXNpKzAqU0laRU9GX0pTQU1QUk9XXQk7IGlucHRyMAotCW1vdgllc2ksIEpTQU1QUk9XIFtlc2krMSpTSVpFT0ZfSlNBTVBST1ddCTsgaW5wdHIxKGJlbG93KQotCW1vdgllZHgsIEpTQU1QUk9XIFtlZGkrMCpTSVpFT0ZfSlNBTVBST1ddCTsgb3V0cHRyMAotCW1vdgllZGksIEpTQU1QUk9XIFtlZGkrMSpTSVpFT0ZfSlNBTVBST1ddCTsgb3V0cHRyMQotCi0JcHhvcgltbTAsbW0wCQkJOyBtbTA9KGFsbCAwJ3MpCi0JYWxpZ254CTE2LDcKLQotLmNvbHVtbmxvb3A6Ci0JbW92cQltbTEsIE1NV09SRCBbZWJ4XQk7IG1tMT1yb3dbIDBdKCAwIDEgMiAzIDQgNSA2IDcpCi0JbW92cQltbTIsIE1NV09SRCBbZWN4XQk7IG1tMj1yb3dbLTFdKCAwIDEgMiAzIDQgNSA2IDcpCi0JbW92cQltbTMsIE1NV09SRCBbZXNpXQk7IG1tMz1yb3dbKzFdKCAwIDEgMiAzIDQgNSA2IDcpCi0KLQlwdXNocGljCWVieAotCW1vdnBpYwllYngsIFBPSU5URVIgW2dvdHB0cl0JOyBsb2FkIEdPVCBhZGRyZXNzCi0KLQltb3ZxICAgICAgbW00LG1tMQotCXB1bnBja2xidyBtbTEsbW0wCQk7IG1tMT1yb3dbIDBdKCAwIDEgMiAzKQotCXB1bnBja2hidyBtbTQsbW0wCQk7IG1tND1yb3dbIDBdKCA0IDUgNiA3KQotCW1vdnEgICAgICBtbTUsbW0yCi0JcHVucGNrbGJ3IG1tMixtbTAJCTsgbW0yPXJvd1stMV0oIDAgMSAyIDMpCi0JcHVucGNraGJ3IG1tNSxtbTAJCTsgbW01PXJvd1stMV0oIDQgNSA2IDcpCi0JbW92cSAgICAgIG1tNixtbTMKLQlwdW5wY2tsYncgbW0zLG1tMAkJOyBtbTM9cm93WysxXSggMCAxIDIgMykKLQlwdW5wY2toYncgbW02LG1tMAkJOyBtbTY9cm93WysxXSggNCA1IDYgNykKLQotCXBtdWxsdwltbTEsW0dPVE9GRihlYngsUFdfVEhSRUUpXQotCXBtdWxsdwltbTQsW0dPVE9GRihlYngsUFdfVEhSRUUpXQotCXBhZGR3CW1tMixbR09UT0ZGKGVieCxQV19PTkUpXQotCXBhZGR3CW1tNSxbR09UT0ZGKGVieCxQV19PTkUpXQotCXBhZGR3CW1tMyxbR09UT0ZGKGVieCxQV19UV08pXQotCXBhZGR3CW1tNixbR09UT0ZGKGVieCxQV19UV08pXQotCi0JcGFkZHcJbW0yLG1tMQotCXBhZGR3CW1tNSxtbTQKLQlwc3JsdwltbTIsMgkJCTsgbW0yPU91dDBMPSggMCAxIDIgMykKLQlwc3JsdwltbTUsMgkJCTsgbW01PU91dDBIPSggNCA1IDYgNykKLQlwYWRkdwltbTMsbW0xCi0JcGFkZHcJbW02LG1tNAotCXBzcmx3CW1tMywyCQkJOyBtbTM9T3V0MUw9KCAwIDEgMiAzKQotCXBzcmx3CW1tNiwyCQkJOyBtbTY9T3V0MUg9KCA0IDUgNiA3KQotCi0JcGFja3Vzd2IgIG1tMixtbTUJCTsgbW0yPU91dDA9KCAwIDEgMiAzIDQgNSA2IDcpCi0JcGFja3Vzd2IgIG1tMyxtbTYJCTsgbW0zPU91dDE9KCAwIDEgMiAzIDQgNSA2IDcpCi0KLQltb3ZxCU1NV09SRCBbZWR4XSwgbW0yCi0JbW92cQlNTVdPUkQgW2VkaV0sIG1tMwotCi0JcG9wcGljCWVieAotCi0JYWRkCWVjeCwgYnl0ZSAxKlNJWkVPRl9NTVdPUkQJOyBpbnB0cjEoYWJvdmUpCi0JYWRkCWVieCwgYnl0ZSAxKlNJWkVPRl9NTVdPUkQJOyBpbnB0cjAKLQlhZGQJZXNpLCBieXRlIDEqU0laRU9GX01NV09SRAk7IGlucHRyMShiZWxvdykKLQlhZGQJZWR4LCBieXRlIDEqU0laRU9GX01NV09SRAk7IG91dHB0cjAKLQlhZGQJZWRpLCBieXRlIDEqU0laRU9GX01NV09SRAk7IG91dHB0cjEKLQlzdWIJZWF4LCBieXRlIFNJWkVPRl9NTVdPUkQKLQlqbnoJbmVhciAuY29sdW1ubG9vcAotCi0JcG9wCWVzaQotCXBvcAllZGkKLQlwb3AJZWN4Ci0JcG9wCWVheAotCi0JYWRkCWVzaSwgYnl0ZSAxKlNJWkVPRl9KU0FNUFJPVwk7IGlucHV0X2RhdGEKLQlhZGQJZWRpLCBieXRlIDIqU0laRU9GX0pTQU1QUk9XCTsgb3V0cHV0X2RhdGEKLQlzdWIJZWN4LCBieXRlIDIJCQk7IHJvd2N0cgotCWpnCW5lYXIgLnJvd2xvb3AKLQotCWVtbXMJCTsgZW1wdHkgTU1YIHN0YXRlCi0KLS5yZXR1cm46Ci0JcG9wCWVkaQotCXBvcAllc2kKLTsJcG9wCWVkeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLTsJcG9wCWVjeAkJOyBuZWVkIG5vdCBiZSBwcmVzZXJ2ZWQKLQlwb3AJZWJ4Ci0JcG9wcGljCWVheAkJOyByZW1vdmUgZ290cHRyCi0JcG9wCWVicAotCXJldAotCi0lZW5kaWYgOyBVUFNBTVBMRV9IMVYyX1NVUFBPUlRFRAotJWVuZGlmIDsgSkRTQU1QTEVfRkFOQ1lfTU1YX1NVUFBPUlRFRAotCi0laWZkZWYgSkRTQU1QTEVfU0lNUExFX01NWF9TVVBQT1JURUQKLQotJWlmbmRlZiBKRFNBTVBMRV9GQU5DWV9NTVhfU1VQUE9SVEVECi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JU0VDVElPTglTRUdfVEVYVAotCUJJVFMJMzIKLSVlbmRpZgotOwogOyBGYXN0IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMToxIHZlcnRpY2FsLgogOyBJdCdzIHN0aWxsIGEgYm94IGZpbHRlci4KIDsKIDsgR0xPQkFMKHZvaWQpCi07IGpwZWdfaDJ2MV91cHNhbXBsZV9tbXggKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi07ICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotOyAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsCi07ICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpOworOyBqc2ltZF9oMnYxX3Vwc2FtcGxlX21teCAoaW50IG1heF92X3NhbXBfZmFjdG9yLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBvdXRwdXRfd2lkdGgsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKTsKIDsKIAotJWRlZmluZSBjaW5mbyhiKQkJKGIpKzgJCTsgal9kZWNvbXByZXNzX3B0ciBjaW5mbwotJWRlZmluZSBjb21wcHRyKGIpCQkoYikrMTIJCTsganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIKKyVkZWZpbmUgbWF4X3Zfc2FtcChiKQkJKGIpKzgJCQk7IGludCBtYXhfdl9zYW1wX2ZhY3RvcgorJWRlZmluZSBvdXRwdXRfd2lkdGgoYikJKGIpKzEyCQk7IEpESU1FTlNJT04gb3V0cHV0X3dpZHRoCiAlZGVmaW5lIGlucHV0X2RhdGEoYikJCShiKSsxNgkJOyBKU0FNUEFSUkFZIGlucHV0X2RhdGEKICVkZWZpbmUgb3V0cHV0X2RhdGFfcHRyKGIpCShiKSsyMAkJOyBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyCiAKIAlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfaDJ2MV91cHNhbXBsZV9tbXgpCisJZ2xvYmFsCUVYVE4oanNpbWRfaDJ2MV91cHNhbXBsZV9tbXgpCiAKLUVYVE4oanBlZ19oMnYxX3Vwc2FtcGxlX21teCk6CitFWFROKGpzaW1kX2gydjFfdXBzYW1wbGVfbW14KToKIAlwdXNoCWVicAogCW1vdgllYnAsZXNwCiA7CXB1c2gJZWJ4CQk7IHVudXNlZApAQCAtNzA3LDE0ICs1NTMsMTIgQEAKIAlwdXNoCWVzaQogCXB1c2gJZWRpCiAKLQltb3YJZWR4LCBQT0lOVEVSIFtjaW5mbyhlYnApXQotCW1vdgllZHgsIEpESU1FTlNJT04gW2pkc3RydWN0X291dHB1dF93aWR0aChlZHgpXQorCW1vdgllZHgsIEpESU1FTlNJT04gW291dHB1dF93aWR0aChlYnApXQogCWFkZAllZHgsIGJ5dGUgKDIqU0laRU9GX01NV09SRCktMQogCWFuZAllZHgsIGJ5dGUgLSgyKlNJWkVPRl9NTVdPUkQpCiAJanoJc2hvcnQgLnJldHVybgogCi0JbW92CWVjeCwgUE9JTlRFUiBbY2luZm8oZWJwKV0KLQltb3YJZWN4LCBJTlQgW2pkc3RydWN0X21heF92X3NhbXBfZmFjdG9yKGVjeCldCTsgcm93Y3RyCisJbW92CWVjeCwgSU5UIFttYXhfdl9zYW1wKGVicCldCTsgcm93Y3RyCiAJdGVzdAllY3gsZWN4CiAJanoJc2hvcnQgLnJldHVybgogCkBAIC03ODcsMjEgKzYzMSwyMSBAQAogOyBJdCdzIHN0aWxsIGEgYm94IGZpbHRlci4KIDsKIDsgR0xPQkFMKHZvaWQpCi07IGpwZWdfaDJ2Ml91cHNhbXBsZV9tbXggKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi07ICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotOyAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsCi07ICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpOworOyBqc2ltZF9oMnYyX3Vwc2FtcGxlX21teCAoaW50IG1heF92X3NhbXBfZmFjdG9yLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBvdXRwdXRfd2lkdGgsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKTsKIDsKIAotJWRlZmluZSBjaW5mbyhiKQkJKGIpKzgJCTsgal9kZWNvbXByZXNzX3B0ciBjaW5mbwotJWRlZmluZSBjb21wcHRyKGIpCQkoYikrMTIJCTsganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIKKyVkZWZpbmUgbWF4X3Zfc2FtcChiKQkJKGIpKzgJCQk7IGludCBtYXhfdl9zYW1wX2ZhY3RvcgorJWRlZmluZSBvdXRwdXRfd2lkdGgoYikJKGIpKzEyCQk7IEpESU1FTlNJT04gb3V0cHV0X3dpZHRoCiAlZGVmaW5lIGlucHV0X2RhdGEoYikJCShiKSsxNgkJOyBKU0FNUEFSUkFZIGlucHV0X2RhdGEKICVkZWZpbmUgb3V0cHV0X2RhdGFfcHRyKGIpCShiKSsyMAkJOyBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyCiAKIAlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfaDJ2Ml91cHNhbXBsZV9tbXgpCisJZ2xvYmFsCUVYVE4oanNpbWRfaDJ2Ml91cHNhbXBsZV9tbXgpCiAKLUVYVE4oanBlZ19oMnYyX3Vwc2FtcGxlX21teCk6CitFWFROKGpzaW1kX2gydjJfdXBzYW1wbGVfbW14KToKIAlwdXNoCWVicAogCW1vdgllYnAsZXNwCiAJcHVzaAllYngKQEAgLTgxMCwxNCArNjU0LDEyIEBACiAJcHVzaAllc2kKIAlwdXNoCWVkaQogCi0JbW92CWVkeCwgUE9JTlRFUiBbY2luZm8oZWJwKV0KLQltb3YJZWR4LCBKRElNRU5TSU9OIFtqZHN0cnVjdF9vdXRwdXRfd2lkdGgoZWR4KV0KKwltb3YJZWR4LCBKRElNRU5TSU9OIFtvdXRwdXRfd2lkdGgoZWJwKV0KIAlhZGQJZWR4LCBieXRlICgyKlNJWkVPRl9NTVdPUkQpLTEKIAlhbmQJZWR4LCBieXRlIC0oMipTSVpFT0ZfTU1XT1JEKQogCWp6CW5lYXIgLnJldHVybgogCi0JbW92CWVjeCwgUE9JTlRFUiBbY2luZm8oZWJwKV0KLQltb3YJZWN4LCBJTlQgW2pkc3RydWN0X21heF92X3NhbXBfZmFjdG9yKGVjeCldCTsgcm93Y3RyCisJbW92CWVjeCwgSU5UIFttYXhfdl9zYW1wKGVicCldCTsgcm93Y3RyCiAJdGVzdAllY3gsZWN4CiAJanoJc2hvcnQgLnJldHVybgogCkBAIC04OTAsNCArNzMyLDMgQEAKIAlwb3AJZWJwCiAJcmV0CiAKLSVlbmRpZiA7IEpEU0FNUExFX1NJTVBMRV9NTVhfU1VQUE9SVEVECmRpZmYgLS1naXQgYS9qZm1teGZzdC5hc20gYi9zaW1kL2pmbW14ZnN0LmFzbQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBqZm1teGZzdC5hc20KcmVuYW1lIHRvIHNpbWQvamZtbXhmc3QuYXNtCmluZGV4IDJmOGQ1M2YuLjQ2NTU2YjEgMTAwNjQ0Ci0tLSBhL2pmbW14ZnN0LmFzbQorKysgYi9zaW1kL2pmbW14ZnN0LmFzbQpAQCAtMSw2ICsxLDkgQEAKIDsKIDsgamZtbXhmc3QuYXNtIC0gZmFzdCBpbnRlZ2VyIEZEQ1QgKE1NWCkKIDsKKzsgQ29weXJpZ2h0IDIwMDkgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorOworOyBCYXNlZCBvbgogOyB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKIDsgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KIDsgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGpzaW1kZXh0LmluYwpAQCAtMTYsMjEgKzE5LDEwIEBACiA7IGJhc2VkIGRpcmVjdGx5IG9uIHRoZSBJSkcncyBvcmlnaW5hbCBqZmRjdGZzdC5jOyBzZWUgdGhlIGpmZGN0ZnN0LmMKIDsgZm9yIG1vcmUgZGV0YWlscy4KIDsKLTsgTGFzdCBNb2RpZmllZCA6IEZlYnJ1YXJ5IDQsIDIwMDYKLTsKIDsgW1RBQjhdCiAKLSVpbmNsdWRlICJqc2ltZGV4dC5pbmMiCi0laW5jbHVkZSAiamRjdC5pbmMiCi0KLSVpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0laWZkZWYgSkZEQ1RfSU5UX01NWF9TVVBQT1JURUQKLQotOyBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLTsKLSVpZiBEQ1RTSVpFICE9IDgKLSVlcnJvciAiU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIgotJWVuZGlmCislaW5jbHVkZSAic2ltZC9qc2ltZGV4dC5pbmMiCislaW5jbHVkZSAic2ltZC9qZGN0LmluYyIKIAogOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC03OCw3ICs3MCw3IEBACiA7IFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIG9uZSBibG9jayBvZiBzYW1wbGVzLgogOwogOyBHTE9CQUwodm9pZCkKLTsganBlZ19mZGN0X2lmYXN0X21teCAoRENURUxFTSAqIGRhdGEpCis7IGpzaW1kX2ZkY3RfaWZhc3RfbW14IChEQ1RFTEVNICogZGF0YSkKIDsKIAogJWRlZmluZSBkYXRhKGIpCQkoYikrOAkJOyBEQ1RFTEVNICogZGF0YQpAQCAtODgsOSArODAsOSBAQAogJWRlZmluZSBXS19OVU0JCTIKIAogCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19mZGN0X2lmYXN0X21teCkKKwlnbG9iYWwJRVhUTihqc2ltZF9mZGN0X2lmYXN0X21teCkKIAotRVhUTihqcGVnX2ZkY3RfaWZhc3RfbW14KToKK0VYVE4oanNpbWRfZmRjdF9pZmFzdF9tbXgpOgogCXB1c2gJZWJwCiAJbW92CWVheCxlc3AJCQkJOyBlYXggPSBvcmlnaW5hbCBlYnAKIAlzdWIJZXNwLCBieXRlIDQKQEAgLTQwMCw1ICszOTIsMyBAQAogCXBvcAllYnAKIAlyZXQKIAotJWVuZGlmIDsgSkZEQ1RfSU5UX01NWF9TVVBQT1JURUQKLSVlbmRpZiA7IERDVF9JRkFTVF9TVVBQT1JURUQKZGlmZiAtLWdpdCBhL2pmbW14aW50LmFzbSBiL3NpbWQvamZtbXhpbnQuYXNtCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGpmbW14aW50LmFzbQpyZW5hbWUgdG8gc2ltZC9qZm1teGludC5hc20KaW5kZXggYWZlNDdmZC4uODc5MzVhOSAxMDA2NDQKLS0tIGEvamZtbXhpbnQuYXNtCisrKyBiL3NpbWQvamZtbXhpbnQuYXNtCkBAIC0xLDYgKzEsOSBAQAogOwogOyBqZm1teGludC5hc20gLSBhY2N1cmF0ZSBpbnRlZ2VyIEZEQ1QgKE1NWCkKIDsKKzsgQ29weXJpZ2h0IDIwMDkgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorOworOyBCYXNlZCBvbgogOyB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKIDsgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIE1JWUFTQUtBIE1hc2FydS4KIDsgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGpzaW1kZXh0LmluYwpAQCAtMTYsMjEgKzE5LDEwIEBACiA7IGRpcmVjdGx5IG9uIHRoZSBJSkcncyBvcmlnaW5hbCBqZmRjdGludC5jOyBzZWUgdGhlIGpmZGN0aW50LmMgZm9yCiA7IG1vcmUgZGV0YWlscy4KIDsKLTsgTGFzdCBNb2RpZmllZCA6IEZlYnJ1YXJ5IDQsIDIwMDYKLTsKIDsgW1RBQjhdCiAKLSVpbmNsdWRlICJqc2ltZGV4dC5pbmMiCi0laW5jbHVkZSAiamRjdC5pbmMiCi0KLSVpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECi0laWZkZWYgSkZEQ1RfSU5UX01NWF9TVVBQT1JURUQKLQotOyBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLTsKLSVpZiBEQ1RTSVpFICE9IDgKLSVlcnJvciAiU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIgotJWVuZGlmCislaW5jbHVkZSAic2ltZC9qc2ltZGV4dC5pbmMiCislaW5jbHVkZSAic2ltZC9qZGN0LmluYyIKIAogOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC05OSw3ICs5MSw3IEBACiA7IFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIG9uZSBibG9jayBvZiBzYW1wbGVzLgogOwogOyBHTE9CQUwodm9pZCkKLTsganBlZ19mZGN0X2lzbG93X21teCAoRENURUxFTSAqIGRhdGEpCis7IGpzaW1kX2ZkY3RfaXNsb3dfbW14IChEQ1RFTEVNICogZGF0YSkKIDsKIAogJWRlZmluZSBkYXRhKGIpCQkoYikrOAkJOyBEQ1RFTEVNICogZGF0YQpAQCAtMTA5LDkgKzEwMSw5IEBACiAlZGVmaW5lIFdLX05VTQkJMgogCiAJYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2ZkY3RfaXNsb3dfbW14KQorCWdsb2JhbAlFWFROKGpzaW1kX2ZkY3RfaXNsb3dfbW14KQogCi1FWFROKGpwZWdfZmRjdF9pc2xvd19tbXgpOgorRVhUTihqc2ltZF9mZGN0X2lzbG93X21teCk6CiAJcHVzaAllYnAKIAltb3YJZWF4LGVzcAkJCQk7IGVheCA9IG9yaWdpbmFsIGVicAogCXN1Ygllc3AsIGJ5dGUgNApAQCAtNjI1LDUgKzYxNywzIEBACiAJcG9wCWVicAogCXJldAogCi0lZW5kaWYgOyBKRkRDVF9JTlRfTU1YX1NVUFBPUlRFRAotJWVuZGlmIDsgRENUX0lTTE9XX1NVUFBPUlRFRApkaWZmIC0tZ2l0IGEvamltbXhmc3QuYXNtIGIvc2ltZC9qaW1teGZzdC5hc20Kc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gamltbXhmc3QuYXNtCnJlbmFtZSB0byBzaW1kL2ppbW14ZnN0LmFzbQppbmRleCBkZTBkZWY2Li42NjJhNTIyIDEwMDY0NAotLS0gYS9qaW1teGZzdC5hc20KKysrIGIvc2ltZC9qaW1teGZzdC5hc20KQEAgLTEsNiArMSw5IEBACiA7CiA7IGppbW14ZnN0LmFzbSAtIGZhc3QgaW50ZWdlciBJRENUIChNTVgpCiA7Cis7IENvcHlyaWdodCAyMDA5IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKzsKKzsgQmFzZWQgb24KIDsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5CiA7IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCiA7IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKQEAgLTE2LDIxICsxOSwxMCBAQAogOyBiYXNlZCBkaXJlY3RseSBvbiB0aGUgSUpHJ3Mgb3JpZ2luYWwgamlkY3Rmc3QuYzsgc2VlIHRoZSBqaWRjdGZzdC5jCiA7IGZvciBtb3JlIGRldGFpbHMuCiA7Ci07IExhc3QgTW9kaWZpZWQgOiBGZWJydWFyeSA0LCAyMDA2Ci07CiA7IFtUQUI4XQogCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotJWluY2x1ZGUgImpkY3QuaW5jIgotCi0laWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAotJWlmZGVmIEpJRENUX0lOVF9NTVhfU1VQUE9SVEVECi0KLTsgVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCi07Ci0laWYgRENUU0laRSAhPSA4Ci0lZXJyb3IgIlNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiIKLSVlbmRpZgorJWluY2x1ZGUgInNpbWQvanNpbWRleHQuaW5jIgorJWluY2x1ZGUgInNpbWQvamRjdC5pbmMiCiAKIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtODYsMTYgKzc4LDE0IEBACiA7IFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMuCiA7CiA7IEdMT0JBTCh2b2lkKQotOyBqcGVnX2lkY3RfaWZhc3RfbW14IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLTsgICAgICAgICAgICAgICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKLTsgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCis7IGpzaW1kX2lkY3RfaWZhc3RfbW14ICh2b2lkICogZGN0X3RhYmxlLCBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorOyAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCiA7CiAKLSVkZWZpbmUgY2luZm8oYikJKGIpKzgJCTsgal9kZWNvbXByZXNzX3B0ciBjaW5mbwotJWRlZmluZSBjb21wcHRyKGIpCShiKSsxMgkJOyBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cgotJWRlZmluZSBjb2VmX2Jsb2NrKGIpCShiKSsxNgkJOyBKQ09FRlBUUiBjb2VmX2Jsb2NrCi0lZGVmaW5lIG91dHB1dF9idWYoYikJKGIpKzIwCQk7IEpTQU1QQVJSQVkgb3V0cHV0X2J1ZgotJWRlZmluZSBvdXRwdXRfY29sKGIpCShiKSsyNAkJOyBKRElNRU5TSU9OIG91dHB1dF9jb2wKKyVkZWZpbmUgZGN0X3RhYmxlKGIpCShiKSs4CQkJOyBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cgorJWRlZmluZSBjb2VmX2Jsb2NrKGIpCShiKSsxMgkJOyBKQ09FRlBUUiBjb2VmX2Jsb2NrCislZGVmaW5lIG91dHB1dF9idWYoYikJKGIpKzE2CQk7IEpTQU1QQVJSQVkgb3V0cHV0X2J1ZgorJWRlZmluZSBvdXRwdXRfY29sKGIpCShiKSsyMAkJOyBKRElNRU5TSU9OIG91dHB1dF9jb2wKIAogJWRlZmluZSBvcmlnaW5hbF9lYnAJZWJwKzAKICVkZWZpbmUgd2soaSkJCWVicC0oV0tfTlVNLShpKSkqU0laRU9GX01NV09SRAk7IG1td29yZCB3a1tXS19OVU1dCkBAIC0xMDQsOSArOTQsOSBAQAogCQkJCQk7IEpDT0VGIHdvcmtzcGFjZVtEQ1RTSVpFMl0KIAogCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19pZGN0X2lmYXN0X21teCkKKwlnbG9iYWwJRVhUTihqc2ltZF9pZGN0X2lmYXN0X21teCkKIAotRVhUTihqcGVnX2lkY3RfaWZhc3RfbW14KToKK0VYVE4oanNpbWRfaWRjdF9pZmFzdF9tbXgpOgogCXB1c2gJZWJwCiAJbW92CWVheCxlc3AJCQkJOyBlYXggPSBvcmlnaW5hbCBlYnAKIAlzdWIJZXNwLCBieXRlIDQKQEAgLTEyNSw4ICsxMTUsNyBAQAogCTsgLS0tLSBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuCiAKIDsJbW92CWVheCwgW29yaWdpbmFsX2VicF0KLQltb3YJZWR4LCBQT0lOVEVSIFtjb21wcHRyKGVheCldCi0JbW92CWVkeCwgUE9JTlRFUiBbamNvbXBpbmZvX2RjdF90YWJsZShlZHgpXQk7IHF1YW50cHRyCisJbW92CWVkeCwgUE9JTlRFUiBbZGN0X3RhYmxlKGVheCldCTsgcXVhbnRwdHIKIAltb3YJZXNpLCBKQ09FRlBUUiBbY29lZl9ibG9jayhlYXgpXQkJOyBpbnB0cgogCWxlYQllZGksIFt3b3Jrc3BhY2VdCQkJOyBKQ09FRiAqIHdzcHRyCiAJbW92CWVjeCwgRENUU0laRS80CQkJCTsgY3RyCkBAIC01MDYsNSArNDk1LDMgQEAKIAlwb3AJZWJwCiAJcmV0CiAKLSVlbmRpZiA7IEpJRENUX0lOVF9NTVhfU1VQUE9SVEVECi0lZW5kaWYgOyBEQ1RfSUZBU1RfU1VQUE9SVEVECmRpZmYgLS1naXQgYS9qaW1teGludC5hc20gYi9zaW1kL2ppbW14aW50LmFzbQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBqaW1teGludC5hc20KcmVuYW1lIHRvIHNpbWQvamltbXhpbnQuYXNtCmluZGV4IDJhMzNhNjMuLjc3NWIxZTggMTAwNjQ0Ci0tLSBhL2ppbW14aW50LmFzbQorKysgYi9zaW1kL2ppbW14aW50LmFzbQpAQCAtMSw2ICsxLDkgQEAKIDsKIDsgamltbXhpbnQuYXNtIC0gYWNjdXJhdGUgaW50ZWdlciBJRENUIChNTVgpCiA7Cis7IENvcHlyaWdodCAyMDA5IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKzsKKzsgQmFzZWQgb24KIDsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5CiA7IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCiA7IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKQEAgLTE2LDIxICsxOSwxMCBAQAogOyBkaXJlY3RseSBvbiB0aGUgSUpHJ3Mgb3JpZ2luYWwgamlkY3RpbnQuYzsgc2VlIHRoZSBqaWRjdGludC5jIGZvcgogOyBtb3JlIGRldGFpbHMuCiA7Ci07IExhc3QgTW9kaWZpZWQgOiBGZWJydWFyeSA0LCAyMDA2Ci07CiA7IFtUQUI4XQogCi0laW5jbHVkZSAianNpbWRleHQuaW5jIgotJWluY2x1ZGUgImpkY3QuaW5jIgotCi0laWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotJWlmZGVmIEpJRENUX0lOVF9NTVhfU1VQUE9SVEVECi0KLTsgVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCi07Ci0laWYgRENUU0laRSAhPSA4Ci0lZXJyb3IgIlNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiIKLSVlbmRpZgorJWluY2x1ZGUgInNpbWQvanNpbWRleHQuaW5jIgorJWluY2x1ZGUgInNpbWQvamRjdC5pbmMiCiAKIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtOTksMTYgKzkxLDE0IEBACiA7IFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMuCiA7CiA7IEdMT0JBTCh2b2lkKQotOyBqcGVnX2lkY3RfaXNsb3dfbW14IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLTsgICAgICAgICAgICAgICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKLTsgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCis7IGpzaW1kX2lkY3RfaXNsb3dfbW14ICh2b2lkICogZGN0X3RhYmxlLCBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorOyAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCiA7CiAKLSVkZWZpbmUgY2luZm8oYikJKGIpKzgJCTsgal9kZWNvbXByZXNzX3B0ciBjaW5mbwotJWRlZmluZSBjb21wcHRyKGIpCShiKSsxMgkJOyBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cgotJWRlZmluZSBjb2VmX2Jsb2NrKGIpCShiKSsxNgkJOyBKQ09FRlBUUiBjb2VmX2Jsb2NrCi0lZGVmaW5lIG91dHB1dF9idWYoYikJKGIpKzIwCQk7IEpTQU1QQVJSQVkgb3V0cHV0X2J1ZgotJWRlZmluZSBvdXRwdXRfY29sKGIpCShiKSsyNAkJOyBKRElNRU5TSU9OIG91dHB1dF9jb2wKKyVkZWZpbmUgZGN0X3RhYmxlKGIpCShiKSs4CQkJOyBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cgorJWRlZmluZSBjb2VmX2Jsb2NrKGIpCShiKSsxMgkJOyBKQ09FRlBUUiBjb2VmX2Jsb2NrCislZGVmaW5lIG91dHB1dF9idWYoYikJKGIpKzE2CQk7IEpTQU1QQVJSQVkgb3V0cHV0X2J1ZgorJWRlZmluZSBvdXRwdXRfY29sKGIpCShiKSsyMAkJOyBKRElNRU5TSU9OIG91dHB1dF9jb2wKIAogJWRlZmluZSBvcmlnaW5hbF9lYnAJZWJwKzAKICVkZWZpbmUgd2soaSkJCWVicC0oV0tfTlVNLShpKSkqU0laRU9GX01NV09SRAk7IG1td29yZCB3a1tXS19OVU1dCkBAIC0xMTcsOSArMTA3LDkgQEAKIAkJCQkJOyBKQ09FRiB3b3Jrc3BhY2VbRENUU0laRTJdCiAKIAlhbGlnbgkxNgotCWdsb2JhbAlFWFROKGpwZWdfaWRjdF9pc2xvd19tbXgpCisJZ2xvYmFsCUVYVE4oanNpbWRfaWRjdF9pc2xvd19tbXgpCiAKLUVYVE4oanBlZ19pZGN0X2lzbG93X21teCk6CitFWFROKGpzaW1kX2lkY3RfaXNsb3dfbW14KToKIAlwdXNoCWVicAogCW1vdgllYXgsZXNwCQkJCTsgZWF4ID0gb3JpZ2luYWwgZWJwCiAJc3ViCWVzcCwgYnl0ZSA0CkBAIC0xMzgsOCArMTI4LDcgQEAKIAk7IC0tLS0gUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LgogCiA7CW1vdgllYXgsIFtvcmlnaW5hbF9lYnBdCi0JbW92CWVkeCwgUE9JTlRFUiBbY29tcHB0cihlYXgpXQotCW1vdgllZHgsIFBPSU5URVIgW2pjb21waW5mb19kY3RfdGFibGUoZWR4KV0JOyBxdWFudHB0cgorCW1vdgllZHgsIFBPSU5URVIgW2RjdF90YWJsZShlYXgpXQk7IHF1YW50cHRyCiAJbW92CWVzaSwgSkNPRUZQVFIgW2NvZWZfYmxvY2soZWF4KV0JCTsgaW5wdHIKIAlsZWEJZWRpLCBbd29ya3NwYWNlXQkJCTsgSkNPRUYgKiB3c3B0cgogCW1vdgllY3gsIERDVFNJWkUvNAkJCQk7IGN0cgpAQCAtODU4LDUgKzg0NywzIEBACiAJcG9wCWVicAogCXJldAogCi0lZW5kaWYgOyBKSURDVF9JTlRfTU1YX1NVUFBPUlRFRAotJWVuZGlmIDsgRENUX0lTTE9XX1NVUFBPUlRFRApkaWZmIC0tZ2l0IGEvamltbXhyZWQuYXNtIGIvc2ltZC9qaW1teHJlZC5hc20Kc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gamltbXhyZWQuYXNtCnJlbmFtZSB0byBzaW1kL2ppbW14cmVkLmFzbQppbmRleCA0OTFmYTdiLi5hNWFkNTJiIDEwMDY0NAotLS0gYS9qaW1teHJlZC5hc20KKysrIGIvc2ltZC9qaW1teHJlZC5hc20KQEAgLTEsNiArMSw5IEBACiA7CiA7IGppbW14cmVkLmFzbSAtIHJlZHVjZWQtc2l6ZSBJRENUIChNTVgpCiA7Cis7IENvcHlyaWdodCAyMDA5IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKzsKKzsgQmFzZWQgb24KIDsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5CiA7IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCiA7IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKQEAgLTE2LDIxICsxOSwxMCBAQAogOyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgYmFzZWQgZGlyZWN0bHkgb24gdGhlIElKRydzIG9yaWdpbmFsIGppZGN0cmVkLmM7CiA7IHNlZSB0aGUgamlkY3RyZWQuYyBmb3IgbW9yZSBkZXRhaWxzLgogOwotOyBMYXN0IE1vZGlmaWVkIDogRmVicnVhcnkgNCwgMjAwNgotOwogOyBbVEFCOF0KIAotJWluY2x1ZGUgImpzaW1kZXh0LmluYyIKLSVpbmNsdWRlICJqZGN0LmluYyIKLQotJWlmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKLSVpZmRlZiBKSURDVF9JTlRfTU1YX1NVUFBPUlRFRAotCi07IFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotOwotJWlmIERDVFNJWkUgIT0gOAotJWVycm9yICJTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4iCi0lZW5kaWYKKyVpbmNsdWRlICJzaW1kL2pzaW1kZXh0LmluYyIKKyVpbmNsdWRlICJzaW1kL2pkY3QuaW5jIgogCiA7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTEwNywxNiArOTksMTQgQEAKIDsgcHJvZHVjaW5nIGEgcmVkdWNlZC1zaXplIDR4NCBvdXRwdXQgYmxvY2suCiA7CiA7IEdMT0JBTCh2b2lkKQotOyBqcGVnX2lkY3RfNHg0X21teCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi07ICAgICAgICAgICAgICAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotOyAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCis7IGpzaW1kX2lkY3RfNHg0X21teCAodm9pZCAqIGRjdF90YWJsZSwgSkNPRUZQVFIgY29lZl9ibG9jaywKKzsgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKIDsKIAotJWRlZmluZSBjaW5mbyhiKQkoYikrOAkJOyBqX2RlY29tcHJlc3NfcHRyIGNpbmZvCi0lZGVmaW5lIGNvbXBwdHIoYikJKGIpKzEyCQk7IGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyCi0lZGVmaW5lIGNvZWZfYmxvY2soYikJKGIpKzE2CQk7IEpDT0VGUFRSIGNvZWZfYmxvY2sKLSVkZWZpbmUgb3V0cHV0X2J1ZihiKQkoYikrMjAJCTsgSlNBTVBBUlJBWSBvdXRwdXRfYnVmCi0lZGVmaW5lIG91dHB1dF9jb2woYikJKGIpKzI0CQk7IEpESU1FTlNJT04gb3V0cHV0X2NvbAorJWRlZmluZSBkY3RfdGFibGUoYikJKGIpKzgJCQk7IHZvaWQgKiBkY3RfdGFibGUKKyVkZWZpbmUgY29lZl9ibG9jayhiKQkoYikrMTIJCTsgSkNPRUZQVFIgY29lZl9ibG9jaworJWRlZmluZSBvdXRwdXRfYnVmKGIpCShiKSsxNgkJOyBKU0FNUEFSUkFZIG91dHB1dF9idWYKKyVkZWZpbmUgb3V0cHV0X2NvbChiKQkoYikrMjAJCTsgSkRJTUVOU0lPTiBvdXRwdXRfY29sCiAKICVkZWZpbmUgb3JpZ2luYWxfZWJwCWVicCswCiAlZGVmaW5lIHdrKGkpCQllYnAtKFdLX05VTS0oaSkpKlNJWkVPRl9NTVdPUkQJOyBtbXdvcmQgd2tbV0tfTlVNXQpAQCAtMTI1LDkgKzExNSw5IEBACiAJCQkJCTsgSkNPRUYgd29ya3NwYWNlW0RDVFNJWkUyXQogCiAJYWxpZ24JMTYKLQlnbG9iYWwJRVhUTihqcGVnX2lkY3RfNHg0X21teCkKKwlnbG9iYWwJRVhUTihqc2ltZF9pZGN0XzR4NF9tbXgpCiAKLUVYVE4oanBlZ19pZGN0XzR4NF9tbXgpOgorRVhUTihqc2ltZF9pZGN0XzR4NF9tbXgpOgogCXB1c2gJZWJwCiAJbW92CWVheCxlc3AJCQkJOyBlYXggPSBvcmlnaW5hbCBlYnAKIAlzdWIJZXNwLCBieXRlIDQKQEAgLTE0Niw4ICsxMzYsNyBAQAogCTsgLS0tLSBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuCiAKIDsJbW92CWVheCwgW29yaWdpbmFsX2VicF0KLQltb3YJZWR4LCBQT0lOVEVSIFtjb21wcHRyKGVheCldCi0JbW92CWVkeCwgUE9JTlRFUiBbamNvbXBpbmZvX2RjdF90YWJsZShlZHgpXQk7IHF1YW50cHRyCisJbW92CWVkeCwgUE9JTlRFUiBbZGN0X3RhYmxlKGVheCldCTsgcXVhbnRwdHIKIAltb3YJZXNpLCBKQ09FRlBUUiBbY29lZl9ibG9jayhlYXgpXQkJOyBpbnB0cgogCWxlYQllZGksIFt3b3Jrc3BhY2VdCQkJOyBKQ09FRiAqIHdzcHRyCiAJbW92CWVjeCwgRENUU0laRS80CQkJCTsgY3RyCkBAIC01MDQsMjEgKzQ5MywxOSBAQAogOyBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgMngyIG91dHB1dCBibG9jay4KIDsKIDsgR0xPQkFMKHZvaWQpCi07IGpwZWdfaWRjdF8yeDJfbW14IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLTsgICAgICAgICAgICAgICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCi07ICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKKzsganNpbWRfaWRjdF8yeDJfbW14ICh2b2lkICogZGN0X3RhYmxlLCBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorOyAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQogOwogCi0lZGVmaW5lIGNpbmZvKGIpCShiKSs4CQk7IGpfZGVjb21wcmVzc19wdHIgY2luZm8KLSVkZWZpbmUgY29tcHB0cihiKQkoYikrMTIJCTsganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIKLSVkZWZpbmUgY29lZl9ibG9jayhiKQkoYikrMTYJCTsgSkNPRUZQVFIgY29lZl9ibG9jawotJWRlZmluZSBvdXRwdXRfYnVmKGIpCShiKSsyMAkJOyBKU0FNUEFSUkFZIG91dHB1dF9idWYKLSVkZWZpbmUgb3V0cHV0X2NvbChiKQkoYikrMjQJCTsgSkRJTUVOU0lPTiBvdXRwdXRfY29sCislZGVmaW5lIGRjdF90YWJsZShiKQkoYikrOAkJCTsgdm9pZCAqIGRjdF90YWJsZQorJWRlZmluZSBjb2VmX2Jsb2NrKGIpCShiKSsxMgkJOyBKQ09FRlBUUiBjb2VmX2Jsb2NrCislZGVmaW5lIG91dHB1dF9idWYoYikJKGIpKzE2CQk7IEpTQU1QQVJSQVkgb3V0cHV0X2J1ZgorJWRlZmluZSBvdXRwdXRfY29sKGIpCShiKSsyMAkJOyBKRElNRU5TSU9OIG91dHB1dF9jb2wKIAogCWFsaWduCTE2Ci0JZ2xvYmFsCUVYVE4oanBlZ19pZGN0XzJ4Ml9tbXgpCisJZ2xvYmFsCUVYVE4oanNpbWRfaWRjdF8yeDJfbW14KQogCi1FWFROKGpwZWdfaWRjdF8yeDJfbW14KToKK0VYVE4oanNpbWRfaWRjdF8yeDJfbW14KToKIAlwdXNoCWVicAogCW1vdgllYnAsZXNwCiAJcHVzaAllYngKQEAgLTUzMSw4ICs1MTgsNyBAQAogCiAJOyAtLS0tIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQuCiAKLQltb3YJZWR4LCBQT0lOVEVSIFtjb21wcHRyKGVicCldCi0JbW92CWVkeCwgUE9JTlRFUiBbamNvbXBpbmZvX2RjdF90YWJsZShlZHgpXQk7IHF1YW50cHRyCisJbW92CWVkeCwgUE9JTlRFUiBbZGN0X3RhYmxlKGVicCldCTsgcXVhbnRwdHIKIAltb3YJZXNpLCBKQ09FRlBUUiBbY29lZl9ibG9jayhlYnApXQkJOyBpbnB0cgogCiAJOyB8IGlucHV0OiAgICAgICAgICAgICAgICAgIHwgcmVzdWx0OiAgICAgICAgfApAQCAtNzE1LDUgKzcwMSwzIEBACiAJcG9wCWVicAogCXJldAogCi0lZW5kaWYgOyBKSURDVF9JTlRfTU1YX1NVUFBPUlRFRAotJWVuZGlmIDsgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRApkaWZmIC0tZ2l0IGEvc2ltZC9qc2ltZC5oIGIvc2ltZC9qc2ltZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNDhiODQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW1kL2pzaW1kLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBzaW1kL2pzaW1kLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOSBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisgKiAKKyAqIEJhc2VkIG9uIHRoZSB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnksCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgorICoKKyAqLworCisvKiBCaXRtYXNrIGZvciBzdXBwb3J0ZWQgYWNjZWxlcmF0aW9uIG1ldGhvZHMgKi8KKworI2RlZmluZSBKU0lNRF9OT05FICAgIDB4MDAKKyNkZWZpbmUgSlNJTURfTU1YICAgICAweDAxCisKKy8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLiAqLworCisjaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworI2RlZmluZSBqcGVnX3NpbWRfY3B1X3N1cHBvcnQgICAgICAgICAgICAgICAgIGpTaUNwdVN1cHBvcnQKKyNkZWZpbmUganNpbWRfcmdiX3ljY19jb252ZXJ0X21teCAgICAgICAgICAgICBqU1JHQllDQ00KKyNkZWZpbmUganNpbWRfeWNjX3JnYl9jb252ZXJ0X21teCAgICAgICAgICAgICBqU1lDQ1JHQk0KKyNkZWZpbmUganNpbWRfaDJ2Ml9kb3duc2FtcGxlX21teCAgICAgICAgICAgICBqU0RuSDJWMk0KKyNkZWZpbmUganNpbWRfaDJ2MV9kb3duc2FtcGxlX21teCAgICAgICAgICAgICBqU0RuSDJWMU0KKyNkZWZpbmUganNpbWRfaDJ2Ml91cHNhbXBsZV9tbXggICAgICAgICAgICAgICBqU1VwSDJWMk0KKyNkZWZpbmUganNpbWRfaDJ2MV91cHNhbXBsZV9tbXggICAgICAgICAgICAgICBqU1VwSDJWMU0KKyNkZWZpbmUganNpbWRfaDJ2Ml9mYW5jeV91cHNhbXBsZV9tbXggICAgICAgICBqU0ZVcEgyVjJNCisjZGVmaW5lIGpzaW1kX2gydjFfZmFuY3lfdXBzYW1wbGVfbW14ICAgICAgICAgalNGVXBIMlYxTQorI2RlZmluZSBqc2ltZF9oMnYyX21lcmdlZF91cHNhbXBsZV9tbXggICAgICAgIGpTTVVwSDJWMk0KKyNkZWZpbmUganNpbWRfaDJ2MV9tZXJnZWRfdXBzYW1wbGVfbW14ICAgICAgICBqU01VcEgyVjFNCisjZGVmaW5lIGpzaW1kX2NvbnZzYW1wX21teCAgICAgICAgICAgICAgICAgICAgalNDb252TQorI2RlZmluZSBqc2ltZF9mZGN0X2lzbG93X21teCAgICAgICAgICAgICAgICAgIGpTRkRNSVMKKyNkZWZpbmUganNpbWRfZmRjdF9pZmFzdF9tbXggICAgICAgICAgICAgICAgICBqU0ZETUlGCisjZGVmaW5lIGpzaW1kX3F1YW50aXplX21teCAgICAgICAgICAgICAgICAgICAgalNRdWFudE0KKyNkZWZpbmUganNpbWRfaWRjdF8yeDJfbW14ICAgICAgICAgICAgICAgICAgICBqU0lETTIyCisjZGVmaW5lIGpzaW1kX2lkY3RfNHg0X21teCAgICAgICAgICAgICAgICAgICAgalNJRE00NAorI2RlZmluZSBqc2ltZF9pZGN0X2lzbG93X21teCAgICAgICAgICAgICAgICAgIGpTSURNSVMKKyNkZWZpbmUganNpbWRfaWRjdF9pZmFzdF9tbXggICAgICAgICAgICAgICAgICBqU0lETUlGCisjZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLworCisvKiBTSU1EIEV4dDogcmV0cmlldmUgU0lNRC9DUFUgaW5mb3JtYXRpb24gKi8KK0VYVEVSTih1bnNpZ25lZCBpbnQpIGpwZWdfc2ltZF9jcHVfc3VwcG9ydCBKUFAoKHZvaWQpKTsKKworLyogU0lNRCBDb2xvciBTcGFjZSBDb252ZXJzaW9uICovCitFWFRFUk4odm9pZCkganNpbWRfcmdiX3ljY19jb252ZXJ0X21teAorICAgICAgICBKUFAoKEpESU1FTlNJT04gaW1nX3dpZHRoLAorICAgICAgICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCisgICAgICAgICAgICAgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpKTsKK0VYVEVSTih2b2lkKSBqc2ltZF95Y2NfcmdiX2NvbnZlcnRfbW14CisgICAgICAgIEpQUCgoSkRJTUVOU0lPTiBvdXRfd2lkdGgsCisgICAgICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKSk7CisKKy8qIFNJTUQgRG93bnNhbXBsZSAqLworRVhURVJOKHZvaWQpIGpzaW1kX2gydjJfZG93bnNhbXBsZV9tbXgKKyAgICAgICAgSlBQKChKRElNRU5TSU9OIGltYWdlX3dpZHRoLCBpbnQgbWF4X3Zfc2FtcF9mYWN0b3IsCisgICAgICAgICAgICAgSkRJTUVOU0lPTiB2X3NhbXBfZmFjdG9yLCBKRElNRU5TSU9OIHdpZHRoX2Jsb2NrcywKKyAgICAgICAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpKTsKK0VYVEVSTih2b2lkKSBqc2ltZF9oMnYxX2Rvd25zYW1wbGVfbW14CisgICAgICAgIEpQUCgoSkRJTUVOU0lPTiBpbWFnZV93aWR0aCwgaW50IG1heF92X3NhbXBfZmFjdG9yLAorICAgICAgICAgICAgIEpESU1FTlNJT04gdl9zYW1wX2ZhY3RvciwgSkRJTUVOU0lPTiB3aWR0aF9ibG9ja3MsCisgICAgICAgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKSk7CisKKy8qIFNJTUQgVXBzYW1wbGUgKi8KK0VYVEVSTih2b2lkKSBqc2ltZF9oMnYyX3Vwc2FtcGxlX21teAorICAgICAgICBKUFAoKGludCBtYXhfdl9zYW1wX2ZhY3RvciwgSkRJTUVOU0lPTiBvdXRwdXRfd2lkdGgsCisgICAgICAgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKSk7CitFWFRFUk4odm9pZCkganNpbWRfaDJ2MV91cHNhbXBsZV9tbXgKKyAgICAgICAgSlBQKChpbnQgbWF4X3Zfc2FtcF9mYWN0b3IsIEpESU1FTlNJT04gb3V0cHV0X3dpZHRoLAorICAgICAgICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikpOworCitFWFRFUk4odm9pZCkganNpbWRfaDJ2Ml9mYW5jeV91cHNhbXBsZV9tbXgKKyAgICAgICAgSlBQKChpbnQgbWF4X3Zfc2FtcF9mYWN0b3IsIEpESU1FTlNJT04gZG93bnNhbXBsZWRfd2lkdGgsCisgICAgICAgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKSk7CitFWFRFUk4odm9pZCkganNpbWRfaDJ2MV9mYW5jeV91cHNhbXBsZV9tbXgKKyAgICAgICAgSlBQKChpbnQgbWF4X3Zfc2FtcF9mYWN0b3IsIEpESU1FTlNJT04gZG93bnNhbXBsZWRfd2lkdGgsCisgICAgICAgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKSk7CisKK0VYVEVSTih2b2lkKSBqc2ltZF9oMnYyX21lcmdlZF91cHNhbXBsZV9tbXgKKyAgICAgICAgSlBQKChKRElNRU5TSU9OIG91dHB1dF93aWR0aCwgSlNBTVBJTUFHRSBpbnB1dF9idWYsCisgICAgICAgICAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLCBKU0FNUEFSUkFZIG91dHB1dF9idWYpKTsKK0VYVEVSTih2b2lkKSBqc2ltZF9oMnYxX21lcmdlZF91cHNhbXBsZV9tbXgKKyAgICAgICAgSlBQKChKRElNRU5TSU9OIG91dHB1dF93aWR0aCwgSlNBTVBJTUFHRSBpbnB1dF9idWYsCisgICAgICAgICAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLCBKU0FNUEFSUkFZIG91dHB1dF9idWYpKTsKKworLyogU0lNRCBTYW1wbGUgQ29udmVyc2lvbiAqLworRVhURVJOKHZvaWQpIGpzaW1kX2NvbnZzYW1wX21teCBKUFAoKEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBzdGFydF9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRENURUxFTSAqIHdvcmtzcGFjZSkpOworCisvKiBTSU1EIEZvcndhcmQgRENUICovCitFWFRFUk4odm9pZCkganNpbWRfZmRjdF9pc2xvd19tbXggSlBQKChEQ1RFTEVNICogZGF0YSkpOworRVhURVJOKHZvaWQpIGpzaW1kX2ZkY3RfaWZhc3RfbW14IEpQUCgoRENURUxFTSAqIGRhdGEpKTsKKworLyogU0lNRCBRdWFudGl6YXRpb24gKi8KK0VYVEVSTih2b2lkKSBqc2ltZF9xdWFudGl6ZV9tbXggSlBQKChKQ09FRlBUUiBjb2VmX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDVEVMRU0gKiBkaXZpc29ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ1RFTEVNICogd29ya3NwYWNlKSk7CisKKy8qIFNJTUQgUmVkdWNlZCBJbnZlcnNlIERDVCAqLworRVhURVJOKHZvaWQpIGpzaW1kX2lkY3RfMngyX21teCBKUFAoKHZvaWQgKiBkY3RfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CitFWFRFUk4odm9pZCkganNpbWRfaWRjdF80eDRfbW14IEpQUCgodm9pZCAqIGRjdF90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKKworLyogU0lNRCBJbnZlcnNlIERDVCAqLworRVhURVJOKHZvaWQpIGpzaW1kX2lkY3RfaXNsb3dfbW14IEpQUCgodm9pZCAqIGRjdF90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqc2ltZF9pZGN0X2lmYXN0X21teCBKUFAoKHZvaWQgKiBkY3RfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CisKZGlmZiAtLWdpdCBhL3NpbWQvanNpbWRjZmcuaW5jLmggYi9zaW1kL2pzaW1kY2ZnLmluYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmY2JlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW1kL2pzaW1kY2ZnLmluYy5oCkBAIC0wLDAgKzEsMTE4IEBACisvLyBUaGlzIGZpbGUgZ2VuZXJhdGVzIHRoZSBpbmNsdWRlIGZpbGUgZm9yIHRoZSBhc3NlbWJseQorLy8gaW1wbGVtZW50YXRpb25zIGJ5IGFidXNpbmcgdGhlIEMgcHJlcHJvY2Vzc29yLgorLy8KKy8vIE5vdGU6IFNvbWUgdGhpbmdzIGFyZSBtYW51YWxseSBkZWZpbmVkIGFzIHRoZXkgbmVlZCB0bworLy8gYmUgbWFwcGVkIHRvIE5BU00gdHlwZXMuCisKKzsKKzsgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgaW5jbHVkZSBmaWxlIGZyb20ganNpbWRjZmcuaW5jLmgKKzsKKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworCisjaW5jbHVkZSAiLi4vanBlZ2xpYi5oIgorI2luY2x1ZGUgIi4uL2pjb25maWcuaCIKKyNpbmNsdWRlICIuLi9qbW9yZWNmZy5oIgorI2luY2x1ZGUgImpzaW1kLmgiCisKKyNkZWZpbmUgZGVmaW5lKHZhcikgJWRlZmluZSBfY3BwX3Byb3RlY3Rpb25fIyN2YXIKKyNkZWZpbmUgZGVmaW5ldih2YXIpICVkZWZpbmUgX2NwcF9wcm90ZWN0aW9uXyMjdmFyIHZhcgorCis7Cis7IC0tIGpwZWdsaWIuaAorOworCitkZWZpbmV2KERDVFNJWkUpCitkZWZpbmV2KERDVFNJWkUyKQorCis7Cis7IC0tIGptb3JlY2ZnLmgKKzsKKworZGVmaW5ldihSR0JfUkVEKQorZGVmaW5ldihSR0JfR1JFRU4pCitkZWZpbmV2KFJHQl9CTFVFKQorCitkZWZpbmV2KFJHQl9QSVhFTFNJWkUpCisKKzsgUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgc2FtcGxlIChwaXhlbCBlbGVtZW50IHZhbHVlKS4KKzsgT24gdGhpcyBTSU1EIGltcGxlbWVudGF0aW9uLCB0aGlzIG11c3QgYmUgJ3Vuc2lnbmVkIGNoYXInLgorOworCislZGVmaW5lIEpTQU1QTEUgICAgICAgICAgICAgICAgIGJ5dGUgICAgICAgICAgOyB1bnNpZ25lZCBjaGFyCislZGVmaW5lIFNJWkVPRl9KU0FNUExFICAgICAgICAgIFNJWkVPRl9CWVRFICAgOyBzaXplb2YoSlNBTVBMRSkKKworZGVmaW5ldihDRU5URVJKU0FNUExFKQorCis7IFJlcHJlc2VudGF0aW9uIG9mIGEgRENUIGZyZXF1ZW5jeSBjb2VmZmljaWVudC4KKzsgT24gdGhpcyBTSU1EIGltcGxlbWVudGF0aW9uLCB0aGlzIG11c3QgYmUgJ3Nob3J0Jy4KKzsKKyVkZWZpbmUgSkNPRUYgICAgICAgICAgICAgICAgICAgd29yZCAgICAgICAgICA7IHNob3J0CislZGVmaW5lIFNJWkVPRl9KQ09FRiAgICAgICAgICAgIFNJWkVPRl9XT1JEICAgOyBzaXplb2YoSkNPRUYpCisKKzsgRGF0YXR5cGUgdXNlZCBmb3IgaW1hZ2UgZGltZW5zaW9ucy4KKzsgT24gdGhpcyBTSU1EIGltcGxlbWVudGF0aW9uLCB0aGlzIG11c3QgYmUgJ3Vuc2lnbmVkIGludCcuCis7CislZGVmaW5lIEpESU1FTlNJT04gICAgICAgICAgICAgIGR3b3JkICAgICAgICAgOyB1bnNpZ25lZCBpbnQKKyVkZWZpbmUgU0laRU9GX0pESU1FTlNJT04gICAgICAgU0laRU9GX0RXT1JEICA7IHNpemVvZihKRElNRU5TSU9OKQorCislZGVmaW5lIEpTQU1QUk9XICAgICAgICAgICAgICAgIFBPSU5URVIgICAgICAgOyBKU0FNUExFIEZBUiAqIChqcGVnbGliLmgpCislZGVmaW5lIEpTQU1QQVJSQVkgICAgICAgICAgICAgIFBPSU5URVIgICAgICAgOyBKU0FNUFJPVyAqICAgIChqcGVnbGliLmgpCislZGVmaW5lIEpTQU1QSU1BR0UgICAgICAgICAgICAgIFBPSU5URVIgICAgICAgOyBKU0FNUEFSUkFZICogIChqcGVnbGliLmgpCislZGVmaW5lIEpDT0VGUFRSICAgICAgICAgICAgICAgIFBPSU5URVIgICAgICAgOyBKQ09FRiBGQVIgKiAgIChqcGVnbGliLmgpCislZGVmaW5lIFNJWkVPRl9KU0FNUFJPVyAgICAgICAgIFNJWkVPRl9QT0lOVEVSICA7IHNpemVvZihKU0FNUFJPVykKKyVkZWZpbmUgU0laRU9GX0pTQU1QQVJSQVkgICAgICAgU0laRU9GX1BPSU5URVIgIDsgc2l6ZW9mKEpTQU1QQVJSQVkpCislZGVmaW5lIFNJWkVPRl9KU0FNUElNQUdFICAgICAgIFNJWkVPRl9QT0lOVEVSICA7IHNpemVvZihKU0FNUElNQUdFKQorJWRlZmluZSBTSVpFT0ZfSkNPRUZQVFIgICAgICAgICBTSVpFT0ZfUE9JTlRFUiAgOyBzaXplb2YoSkNPRUZQVFIpCisKKzsKKzsgLS0gamRjdC5oCis7CisKKzsgQSBmb3J3YXJkIERDVCByb3V0aW5lIGlzIGdpdmVuIGEgcG9pbnRlciB0byBhIHdvcmsgYXJlYSBvZiB0eXBlIERDVEVMRU1bXTsKKzsgdGhlIERDVCBpcyB0byBiZSBwZXJmb3JtZWQgaW4tcGxhY2UgaW4gdGhhdCBidWZmZXIuCis7IFRvIG1heGltaXplIHBhcmFsbGVsaXNtLCBUeXBlIERDVEVMRU0gaXMgY2hhbmdlZCB0byBzaG9ydCAob3JpZ2luYWxseSwgaW50KS4KKzsKKyVkZWZpbmUgRENURUxFTSAgICAgICAgICAgICAgICAgd29yZCAgICAgICAgICA7IHNob3J0CislZGVmaW5lIFNJWkVPRl9EQ1RFTEVNICAgICAgICAgIFNJWkVPRl9XT1JEICAgOyBzaXplb2YoRENURUxFTSkKKworOyBUbyBtYXhpbWl6ZSBwYXJhbGxlbGlzbSwgVHlwZSBNVUxUSVBMSUVSIGlzIGNoYW5nZWQgdG8gc2hvcnQuCis7CislZGVmaW5lIElTTE9XX01VTFRfVFlQRSAgICAgICAgIHdvcmQgICAgICAgICAgOyBtdXN0IGJlIHNob3J0CislZGVmaW5lIFNJWkVPRl9JU0xPV19NVUxUX1RZUEUgIFNJWkVPRl9XT1JEICAgOyBzaXplb2YoSVNMT1dfTVVMVF9UWVBFKQorCislZGVmaW5lIElGQVNUX01VTFRfVFlQRSAgICAgICAgIHdvcmQgICAgICAgICAgOyBtdXN0IGJlIHNob3J0CislZGVmaW5lIFNJWkVPRl9JRkFTVF9NVUxUX1RZUEUgIFNJWkVPRl9XT1JEICAgOyBzaXplb2YoSUZBU1RfTVVMVF9UWVBFKQorJWRlZmluZSBJRkFTVF9TQ0FMRV9CSVRTICAgICAgICAyICAgICAgICAgICAgIDsgZnJhY3Rpb25hbCBiaXRzIGluIHNjYWxlIGZhY3RvcnMKKworOworOyAtLSBqc2ltZC5oCis7CisKK2RlZmluZXYoSlNJTURfTk9ORSkKK2RlZmluZXYoSlNJTURfTU1YKQorCis7IFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLgorOworI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKK2RlZmluZXYoanBlZ19zaW1kX2NwdV9zdXBwb3J0KQorZGVmaW5ldihqc2ltZF9yZ2JfeWNjX2NvbnZlcnRfbW14KQorZGVmaW5ldihqc2ltZF95Y2NfcmdiX2NvbnZlcnRfbW14KQorZGVmaW5ldihqc2ltZF9oMnYyX2Rvd25zYW1wbGVfbW14KQorZGVmaW5ldihqc2ltZF9oMnYxX2Rvd25zYW1wbGVfbW14KQorZGVmaW5ldihqc2ltZF9oMnYyX3Vwc2FtcGxlX21teCkKK2RlZmluZXYoanNpbWRfaDJ2MV91cHNhbXBsZV9tbXgpCitkZWZpbmV2KGpzaW1kX2gydjFfZmFuY3lfdXBzYW1wbGVfbW14KQorZGVmaW5ldihqc2ltZF9oMnYyX2ZhbmN5X3Vwc2FtcGxlX21teCkKK2RlZmluZXYoanNpbWRfaDJ2MV9tZXJnZWRfdXBzYW1wbGVfbW14KQorZGVmaW5ldihqc2ltZF9oMnYyX21lcmdlZF91cHNhbXBsZV9tbXgpCitkZWZpbmV2KGpzaW1kX2NvbnZzYW1wX21teCkKK2RlZmluZXYoanNpbWRfZmRjdF9pc2xvd19tbXgpCitkZWZpbmV2KGpzaW1kX2ZkY3RfaWZhc3RfbW14KQorZGVmaW5ldihqc2ltZF9xdWFudGl6ZV9tbXgpCitkZWZpbmV2KGpzaW1kX2lkY3RfMngyX21teCkKK2RlZmluZXYoanNpbWRfaWRjdF80eDRfbW14KQorZGVmaW5ldihqc2ltZF9pZGN0X2lzbG93X21teCkKK2RlZmluZXYoanNpbWRfaWRjdF9pZmFzdF9tbXgpCisjZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLworCmRpZmYgLS1naXQgYS9qc2ltZGNwdS5hc20gYi9zaW1kL2pzaW1kY3B1LmFzbQpzaW1pbGFyaXR5IGluZGV4IDY0JQpyZW5hbWUgZnJvbSBqc2ltZGNwdS5hc20KcmVuYW1lIHRvIHNpbWQvanNpbWRjcHUuYXNtCmluZGV4IDFjODUxZDEuLjg2MmRlMjkgMTAwNjQ0Ci0tLSBhL2pzaW1kY3B1LmFzbQorKysgYi9zaW1kL2pzaW1kY3B1LmFzbQpAQCAtMSw2ICsxLDkgQEAKIDsKIDsganNpbWRjcHUuYXNtIC0gU0lNRCBpbnN0cnVjdGlvbiBzdXBwb3J0IGNoZWNrCiA7Cis7IENvcHlyaWdodCAyMDA5IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKzsKKzsgQmFzZWQgb24KIDsgeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5CiA7IENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCiA7IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBqc2ltZGV4dC5pbmMKQEAgLTExLDIyICsxNCw5IEBACiA7IE5BU00gaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL25hc20uc291cmNlZm9yZ2UubmV0LyBvcgogOyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD02MjA4CiA7Ci07IExhc3QgTW9kaWZpZWQgOiBBdWd1c3QgMjMsIDIwMDUKLTsKIDsgW1RBQjhdCiAKLSVpbmNsdWRlICJqc2ltZGV4dC5pbmMiCi0KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTRUNUSU9OCVNFR19DT05TVAotCi0JYWxpZ256CTE2Ci0KLWNvcHlyaWdodDoKLQlkYgkiIHg4NiBTSU1EIGV4dCBmb3IgSUpHIGxpYiBWIiwgSlBFR19TSU1ERVhUX1ZFUl9TVFIKLQlkYgkiIENvcHlyaWdodCAyMDA2LCBNSVlBU0FLQSBNYXNhcnUgIgotCi0JYWxpZ256CTE2CislaW5jbHVkZSAic2ltZC9qc2ltZGV4dC5pbmMiCiAKIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAlTRUNUSU9OCVNFR19URVhUCkBAIC02MSw3ICs1MSw3IEBACiAJeG9yCWVheCxlZHgKIAlqeglzaG9ydCAucmV0dXJuCQk7IENQVUlEIGlzIG5vdCBzdXBwb3J0ZWQKIAotCTsgQ2hlY2sgZm9yIE1NWCwgU1NFIGFuZCBTU0UyIGluc3RydWN0aW9uIHN1cHBvcnQKKwk7IENoZWNrIGZvciBNTVggaW5zdHJ1Y3Rpb24gc3VwcG9ydAogCXhvcgllYXgsZWF4CiAJY3B1aWQKIAl0ZXN0CWVheCxlYXgKQEAgLTc2LDI5ICs2Niw2IEBACiAJanoJc2hvcnQgLm5vX21teAogCW9yCWVkaSwgYnl0ZSBKU0lNRF9NTVgKIC5ub19tbXg6Ci0JdGVzdAllYXgsIDE8PDI1CQk7IGJpdDI1OlNTRQotCWp6CXNob3J0IC5ub19zc2UKLQlvcgllZGksIGJ5dGUgSlNJTURfU1NFCi0ubm9fc3NlOgotCXRlc3QJZWF4LCAxPDwyNgkJOyBiaXQyNjpTU0UyCi0JanoJc2hvcnQgLm5vX3NzZTIKLQlvcgllZGksIGJ5dGUgSlNJTURfU1NFMgotLm5vX3NzZTI6Ci0KLQk7IENoZWNrIGZvciAzRE5vdyEgaW5zdHJ1Y3Rpb24gc3VwcG9ydAotCW1vdgllYXgsIDB4ODAwMDAwMDAKLQljcHVpZAotCWNtcAllYXgsIDB4ODAwMDAwMDAKLQlqYmUJc2hvcnQgLnJldHVybgotCi0JbW92CWVheCwgMHg4MDAwMDAwMQotCWNwdWlkCi0JbW92CWVheCxlZHgJCQk7IGVheCA9IEV4dGVuZGVkIGZlYXR1cmUgZmxhZ3MKLQotCXRlc3QJZWF4LCAxPDwzMQkJOyBiaXQzMTozRE5vdyEodmVuZG9yIGluZGVwZW5kZW50KQotCWp6CXNob3J0IC5ub18zZG5vdwotCW9yCWVkaSwgYnl0ZSBKU0lNRF8zRE5PVwotLm5vXzNkbm93OgogCiAucmV0dXJuOgogCW1vdgllYXgsZWRpCmRpZmYgLS1naXQgYS9qc2ltZGV4dC5pbmMgYi9zaW1kL2pzaW1kZXh0LmluYwpzaW1pbGFyaXR5IGluZGV4IDYxJQpyZW5hbWUgZnJvbSBqc2ltZGV4dC5pbmMKcmVuYW1lIHRvIHNpbWQvanNpbWRleHQuaW5jCmluZGV4IGE1MDJjMDcuLjA4ZTNhMDQgMTAwNjQ0Ci0tLSBhL2pzaW1kZXh0LmluYworKysgYi9zaW1kL2pzaW1kZXh0LmluYwpAQCAtMSw2ICsxLDkgQEAKIDsKIDsganNpbWRleHQuaW5jIC0gY29tbW9uIGRlY2xhcmF0aW9ucwogOworOyBDb3B5cmlnaHQgMjAwOSBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCis7Cis7IEJhc2VkIG9uCiA7IHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeSAtIHZlcnNpb24gMS4wMgogOwogOyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgTUlZQVNBS0EgTWFzYXJ1LgpAQCAtMjEsMTQgKzI0LDggQEAKIDsgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgogOyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgogOwotOyBMYXN0IE1vZGlmaWVkIDogRmVicnVhcnkgNCwgMjAwNgotOwogOyBbVEFCOF0KIAotJWlmbmRlZiBKU0lNRENGR19JTkNMVURFRAk7IGluIGNhc2UganNpbWRjZmcuaW5jIGFscmVhZHkgZGlkCi0laW5jbHVkZSAianNpbWRjZmcuaW5jIgkJOyBjb25maWd1cmF0aW9uIGRlY2xhcmF0aW9ucwotJWVuZGlmCi0KIDsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIDsgIFN5c3RlbS1kZXBlbmRlbnQgY29uZmlndXJhdGlvbnMKIApAQCAtMTAzLDExOSArMTAwLDMwIEBACiAKIDsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotOyAtLS0tIGpwZWdsaWIuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0lZGVmaW5lIERDVFNJWkUJCTgJOyBUaGUgYmFzaWMgRENUIGJsb2NrIGlzIDh4OCBzYW1wbGVzCi0lZGVmaW5lIERDVFNJWkUyCTY0CTsgRENUU0laRSBzcXVhcmVkOyAjIG9mIGVsZW1lbnRzIGluIGEgYmxvY2sKLQotJWRlZmluZSBKU0lNRF9OT05FCTB4MDAJOyBiaXRmbGFncyBmb3IganBlZ19zaW1kXypfc3VwcG9ydCgpCi0lZGVmaW5lIEpTSU1EX01NWAkweDAxCi0lZGVmaW5lIEpTSU1EXzNETk9XCTB4MDIKLSVkZWZpbmUgSlNJTURfU1NFCTB4MDQKLSVkZWZpbmUgSlNJTURfU1NFMgkweDA4Ci0lZGVmaW5lIEpTSU1EX0FMTAkoSlNJTURfTU1YIHwgSlNJTURfM0ROT1cgfCBKU0lNRF9TU0UgfCBKU0lNRF9TU0UyKQotCi07IC0tLS0ganBlZ2ludC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTsgU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuCi07Ci0laWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotJWRlZmluZSBqcGVnX3NpbWRfY3B1X3N1cHBvcnQJalNpQ3B1U3VwcG9ydAotJWRlZmluZSBqcGVnX3NpbWRfb3Nfc3VwcG9ydAlqU2lPc1N1cHBvcnQKLSVlbmRpZiA7IE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLQotOyAtLS0tIGptb3JlY2ZnLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOwotOyBCSVRTX0lOX0pTQU1QTEU9PTggKDgtYml0IHNhbXBsZSB2YWx1ZXMpIGlzIHRoZSBvbmx5IHZhbGlkIHNldHRpbmcKLTsgb24gdGhpcyBTSU1EIGltcGxlbWVudGF0aW9uLgotOwotJWRlZmluZSBCSVRTX0lOX0pTQU1QTEUJOAk7IENhdXRpb246IENhbm5vdCBiZSBjaGFuZ2VkCi0KLTsgUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgc2FtcGxlIChwaXhlbCBlbGVtZW50IHZhbHVlKS4KLTsgT24gdGhpcyBTSU1EIGltcGxlbWVudGF0aW9uLCB0aGlzIG11c3QgYmUgJ3Vuc2lnbmVkIGNoYXInLgotOwotJWRlZmluZSBKU0FNUExFCQlieXRlCQk7IHVuc2lnbmVkIGNoYXIKLSVkZWZpbmUgU0laRU9GX0pTQU1QTEUJU0laRU9GX0JZVEUJOyBzaXplb2YoSlNBTVBMRSkKLSVkZWZpbmUgTUFYSlNBTVBMRQkyNTUKLSVkZWZpbmUgQ0VOVEVSSlNBTVBMRQkxMjgKLQotOyBSZXByZXNlbnRhdGlvbiBvZiBhIERDVCBmcmVxdWVuY3kgY29lZmZpY2llbnQuCi07IE9uIHRoaXMgU0lNRCBpbXBsZW1lbnRhdGlvbiwgdGhpcyBtdXN0IGJlICdzaG9ydCcuCi07Ci0lZGVmaW5lIEpDT0VGCQl3b3JkCQk7IHNob3J0Ci0lZGVmaW5lIFNJWkVPRl9KQ09FRglTSVpFT0ZfV09SRAk7IHNpemVvZihKQ09FRikKLQotOyBJTlQzMiBtdXN0IGhvbGQgYXQgbGVhc3Qgc2lnbmVkIDMyLWJpdCB2YWx1ZXMuCi07IE9uIHRoaXMgU0lNRCBpbXBsZW1lbnRhdGlvbiwgdGhpcyBtdXN0IGJlICdsb25nJy4KLTsKLSVkZWZpbmUgSU5UMzIJCWR3b3JkCQk7IGxvbmcKLSVkZWZpbmUgU0laRU9GX0lOVDMyCVNJWkVPRl9EV09SRAk7IHNpemVvZihJTlQzMikKLQotOyBEYXRhdHlwZSB1c2VkIGZvciBpbWFnZSBkaW1lbnNpb25zLgotOyBPbiB0aGlzIFNJTUQgaW1wbGVtZW50YXRpb24sIHRoaXMgbXVzdCBiZSAndW5zaWduZWQgaW50Jy4KLTsKLSVkZWZpbmUgSkRJTUVOU0lPTgkJZHdvcmQJCTsgdW5zaWduZWQgaW50Ci0lZGVmaW5lIFNJWkVPRl9KRElNRU5TSU9OCVNJWkVPRl9EV09SRAk7IHNpemVvZihKRElNRU5TSU9OKQotCiA7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7ICBDb21tb24gdHlwZXMKKzsKKyVkZWZpbmUgUE9JTlRFUiAgICAgICAgICAgICAgICAgZHdvcmQgICAgICAgICAgIDsgZ2VuZXJhbCBwb2ludGVyIHR5cGUKKyVkZWZpbmUgU0laRU9GX1BPSU5URVIgICAgICAgICAgU0laRU9GX0RXT1JEICAgIDsgc2l6ZW9mKFBPSU5URVIpCislZGVmaW5lIFBPSU5URVJfQklUICAgICAgICAgICAgIERXT1JEX0JJVCAgICAgICA7IHNpemVvZihQT0lOVEVSKSpCWVRFX0JJVAogCi0lZGVmaW5lIEpTQU1QUk9XCQlQT0lOVEVSCQk7IEpTQU1QTEUgRkFSICogKGpwZWdsaWIuaCkKLSVkZWZpbmUgSlNBTVBBUlJBWQkJUE9JTlRFUgkJOyBKU0FNUFJPVyAqICAgIChqcGVnbGliLmgpCi0lZGVmaW5lIEpTQU1QSU1BR0UJCVBPSU5URVIJCTsgSlNBTVBBUlJBWSAqICAoanBlZ2xpYi5oKQotJWRlZmluZSBKQ09FRlBUUgkJUE9JTlRFUgkJOyBKQ09FRiBGQVIgKiAgIChqcGVnbGliLmgpCi0lZGVmaW5lIFNJWkVPRl9KU0FNUFJPVwkJU0laRU9GX1BPSU5URVIJOyBzaXplb2YoSlNBTVBST1cpCi0lZGVmaW5lIFNJWkVPRl9KU0FNUEFSUkFZCVNJWkVPRl9QT0lOVEVSCTsgc2l6ZW9mKEpTQU1QQVJSQVkpCi0lZGVmaW5lIFNJWkVPRl9KU0FNUElNQUdFCVNJWkVPRl9QT0lOVEVSCTsgc2l6ZW9mKEpTQU1QSU1BR0UpCi0lZGVmaW5lIFNJWkVPRl9KQ09FRlBUUgkJU0laRU9GX1BPSU5URVIJOyBzaXplb2YoSkNPRUZQVFIpCislZGVmaW5lIElOVCAgICAgICAgICAgICAgICAgICAgIGR3b3JkICAgICAgICAgICA7IHNpZ25lZCBpbnRlZ2VyIHR5cGUKKyVkZWZpbmUgU0laRU9GX0lOVCAgICAgICAgICAgICAgU0laRU9GX0RXT1JEICAgIDsgc2l6ZW9mKElOVCkKKyVkZWZpbmUgSU5UX0JJVCAgICAgICAgICAgICAgICAgRFdPUkRfQklUICAgICAgIDsgc2l6ZW9mKElOVCkqQllURV9CSVQKIAotJWRlZmluZSBQT0lOVEVSCQkJZHdvcmQJCTsgZ2VuZXJhbCBwb2ludGVyIHR5cGUKLSVkZWZpbmUgU0laRU9GX1BPSU5URVIJCVNJWkVPRl9EV09SRAk7IHNpemVvZihQT0lOVEVSKQotJWRlZmluZSBQT0lOVEVSX0JJVAkJRFdPUkRfQklUCTsgc2l6ZW9mKFBPSU5URVIpKkJZVEVfQklUCislZGVmaW5lIE1NV09SRCAgICAgICAgICAgICAgICAgIHF3b3JkICAgICAgICAgICA7IGludDY0ICAoTU1YIHJlZ2lzdGVyKQorJWRlZmluZSBTSVpFT0ZfTU1XT1JEICAgICAgICAgICBTSVpFT0ZfUVdPUkQgICAgOyBzaXplb2YoTU1XT1JEKQorJWRlZmluZSBNTVdPUkRfQklUICAgICAgICAgICAgICBRV09SRF9CSVQgICAgICAgOyBzaXplb2YoTU1XT1JEKSpCWVRFX0JJVAogCi0lZGVmaW5lIElOVAkJCWR3b3JkCQk7IHNpZ25lZCBpbnRlZ2VyIHR5cGUKLSVkZWZpbmUgU0laRU9GX0lOVAkJU0laRU9GX0RXT1JECTsgc2l6ZW9mKElOVCkKLSVkZWZpbmUgSU5UX0JJVAkJCURXT1JEX0JJVAk7IHNpemVvZihJTlQpKkJZVEVfQklUCislZGVmaW5lIFNJWkVPRl9CWVRFICAgICAgICAgICAgIDEgICAgICAgICAgICAgICA7IHNpemVvZihCWVRFKQorJWRlZmluZSBTSVpFT0ZfV09SRCAgICAgICAgICAgICAyICAgICAgICAgICAgICAgOyBzaXplb2YoV09SRCkKKyVkZWZpbmUgU0laRU9GX0RXT1JEICAgICAgICAgICAgNCAgICAgICAgICAgICAgIDsgc2l6ZW9mKERXT1JEKQorJWRlZmluZSBTSVpFT0ZfUVdPUkQgICAgICAgICAgICA4ICAgICAgICAgICAgICAgOyBzaXplb2YoUVdPUkQpCiAKLSVkZWZpbmUgRlAzMgkJCWR3b3JkCQk7IElFRUU3NTQgc2luZ2xlCi0lZGVmaW5lIFNJWkVPRl9GUDMyCQlTSVpFT0ZfRFdPUkQJOyBzaXplb2YoRlAzMikKLSVkZWZpbmUgRlAzMl9CSVQJCURXT1JEX0JJVAk7IHNpemVvZihGUDMyKSpCWVRFX0JJVAotCi0lZGVmaW5lIEZQNjQJCQlxd29yZAkJOyBJRUVFNzU0IGRvdWJsZQotJWRlZmluZSBTSVpFT0ZfRlA2NAkJU0laRU9GX1FXT1JECTsgc2l6ZW9mKEZQNjQpCi0lZGVmaW5lIEZQNjRfQklUCQlRV09SRF9CSVQJOyBzaXplb2YoRlA2NCkqQllURV9CSVQKLQotJWRlZmluZSBGUDgwCQkJdHdvcmQJCTsgSUVFRTc1NCBkb3VibGUtZXh0ZW5kZWQoeDg2KQotJWRlZmluZSBTSVpFT0ZfRlA4MAkJU0laRU9GX1RXT1JECTsgc2l6ZW9mKEZQODApCi0lZGVmaW5lIEZQODBfQklUCQlUV09SRF9CSVQJOyBzaXplb2YoRlA4MCkqQllURV9CSVQKLQotJWRlZmluZSBNTVdPUkQJCQlxd29yZAkJOyBpbnQ2NCAgKE1NWCByZWdpc3RlcikKLSVkZWZpbmUgU0laRU9GX01NV09SRAkJU0laRU9GX1FXT1JECTsgc2l6ZW9mKE1NV09SRCkKLSVkZWZpbmUgTU1XT1JEX0JJVAkJUVdPUkRfQklUCTsgc2l6ZW9mKE1NV09SRCkqQllURV9CSVQKLQotJWRlZmluZSBYTU1XT1JECQkJZHF3b3JkCQk7IGludDEyOCAoU1NFIHJlZ2lzdGVyKQotJWRlZmluZSBTSVpFT0ZfWE1NV09SRAkJU0laRU9GX0RRV09SRAk7IHNpemVvZihYTU1XT1JEKQotJWRlZmluZSBYTU1XT1JEX0JJVAkJRFFXT1JEX0JJVAk7IHNpemVvZihYTU1XT1JEKSpCWVRFX0JJVAotCi0lZGVmaW5lIFNJWkVPRl9CWVRFCQkxCQk7IHNpemVvZihCWVRFKQotJWRlZmluZSBTSVpFT0ZfV09SRAkJMgkJOyBzaXplb2YoV09SRCkKLSVkZWZpbmUgU0laRU9GX0RXT1JECQk0CQk7IHNpemVvZihEV09SRCkKLSVkZWZpbmUgU0laRU9GX1FXT1JECQk4CQk7IHNpemVvZihRV09SRCkKLSVkZWZpbmUgU0laRU9GX1RCWVRFCQkxMAkJOyBzaXplb2YoVEJZVEUpCi0lZGVmaW5lIFNJWkVPRl9UV09SRAkJMTAJCTsgc2l6ZW9mKFRXT1JEKQotJWRlZmluZSBTSVpFT0ZfRFFXT1JECQkxNgkJOyBzaXplb2YoRFFXT1JEKQotCi0lZGVmaW5lIEJZVEVfQklUCQk4CQk7IENIQVJfQklUIGluIEMKLSVkZWZpbmUgV09SRF9CSVQJCTE2CQk7IHNpemVvZihXT1JEKSpCWVRFX0JJVAotJWRlZmluZSBEV09SRF9CSVQJCTMyCQk7IHNpemVvZihEV09SRCkqQllURV9CSVQKLSVkZWZpbmUgUVdPUkRfQklUCQk2NAkJOyBzaXplb2YoUVdPUkQpKkJZVEVfQklUCi0lZGVmaW5lIFRCWVRFX0JJVAkJODAJCTsgc2l6ZW9mKFRCWVRFKSpCWVRFX0JJVAotJWRlZmluZSBUV09SRF9CSVQJCTgwCQk7IHNpemVvZihUV09SRCkqQllURV9CSVQKLSVkZWZpbmUgRFFXT1JEX0JJVAkJMTI4CQk7IHNpemVvZihEUVdPUkQpKkJZVEVfQklUCi0KLSVpZGVmaW5lIFRCWVRFCVRXT1JECTsgTkFTTSB1c2VzIHRoZSBrZXl3b3JkICdUV09SRCcgaW5zdGVhZCBvZiAnVEJZVEUnCi0laWRlZmluZSBEUVdPUkQJCTsgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgYnkgTkFTTQotJWlkZWZpbmUgX01NV09SRAk7Ci0laWRlZmluZSBfRFdPUkQJCTsKKyVkZWZpbmUgQllURV9CSVQgICAgICAgICAgICAgICAgOCAgICAgICAgICAgICAgIDsgQ0hBUl9CSVQgaW4gQworJWRlZmluZSBXT1JEX0JJVCAgICAgICAgICAgICAgICAxNiAgICAgICAgICAgICAgOyBzaXplb2YoV09SRCkqQllURV9CSVQKKyVkZWZpbmUgRFdPUkRfQklUICAgICAgICAgICAgICAgMzIgICAgICAgICAgICAgIDsgc2l6ZW9mKERXT1JEKSpCWVRFX0JJVAorJWRlZmluZSBRV09SRF9CSVQgICAgICAgICAgICAgICA2NCAgICAgICAgICAgICAgOyBzaXplb2YoUVdPUkQpKkJZVEVfQklUCiAKIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDsgIEV4dGVybmFsIFN5bWJvbCBOYW1lCkBAIC0zNDQsNCArMjUyLDEwIEBACiAJYWxpZ24gJTEsIGRiIDAJCTsgZmlsbGluZyB6ZXJvcwogJWVuZG1hY3JvCiAKKworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyAgRGVmaW5lcyBwaWNrZWQgdXAgZnJvbSB0aGUgQyBoZWFkZXJzCis7CislaW5jbHVkZSAic2ltZC9qc2ltZGNmZy5pbmMiCisKIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NpbWRfUkVBRE1FLmphLnR4dCBiL3NpbWRfUkVBRE1FLmphLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMxMGI2My4uMDAwMDAwMAotLS0gYS9zaW1kX1JFQURNRS5qYS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIEpQRUcgc29mdHdhcmUgcmVsZWFzZSA2YgotICB3aXRoIHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeSB2ZXJzaW9uIDEuMDIKLSAgICA9PSBSRUFETUUgPT0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAqKiBOb3RlICoqCi1UaGUgYWNjb21wYW55aW5nIGRvY3VtZW50cyByZWxhdGVkIHRvIHg4NiBTSU1EIGV4dGVuc2lvbiBhcmUgd3JpdHRlbiBpbgotSmFwYW5lc2UuIFRoZSBFbmdsaXNoIHZlcnNpb24gb2YgdGhlc2UgZG9jdW1lbnRzIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZS4KLUkgYXBvbG9naXplIGZvciB0aGlzIGluY29udmVuaWVuY2UgdG8gaW50ZXJuYXRpb25hbCBwcm9ncmFtbWVycy4KLQotTW9zdCBvZiB0aGUgc291cmNlIGNvZGUgb2YgdGhlIGV4dGVuc2lvbiBwYXJ0IGlzIHdyaXR0ZW4gaW4gYXNzZW1ibHkKLWxhbmd1YWdlLiBUbyBjb21waWxlIHRoZSBzb3VyY2UsIHlvdSBuZWVkIE5BU00gKG5ldHdpZGUgYXNzZW1ibGVyKS4KLU5BU00gaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL25hc20uc291cmNlZm9yZ2UubmV0LyBvcgotaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NjIwOCAuCi0KLUF0IHByZXNlbnQsIHRoZSB4ODYgU0lNRCBleHRlbnNpb24gZG9lc24ndCBzdXBwb3J0IDY0LWJpdCBtb2RlIG9mCi1BTUQ2NCAoeDg2XzY0KS4KLQotVGhlIHg4NiBTSU1EIGV4dGVuc2lvbiBpcyBhbiB1bm9mZmljaWFsIGV4dGVuc2lvbiB0byB0aGUgSUpHIEpQRUcKLXNvZnR3YXJlLiBQbGVhc2UgZG8gbm90IHNlbmQgYW55IHF1ZXN0aW9ucyBhYm91dCB0aGlzIGRpc3RyaWJ1dGlvbgotdG8gdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAuCi0KLUZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIElKRydzIFJFQURNRSBmaWxlLgotVGhlIHNhbWUgY29uZGl0aW9ucyBhcHBseSB0byB0aGlzIFNJTUQtZXh0ZW5kZWQgSlBFRyBzb2Z0d2FyZS4KLQotCi0KLaKjpLOkzqW9pdWlyKTPCi0KLSAgSlBFRyCkzqW1pd2hvKXIpemlpKXWpeml6qTIpLekxrmtpK+7yKTvpOykxqSkpOsgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzCi0gIEpQRUcgbGlicmFyeSAobGlianBlZyCl6aWkpdal6aXqKSCky6GiSW50ZWwgeDg2ILfPIENQVSCkzrv9pMQgU0lNRCDMv87hpPIKLSAgzfjN0aS3pL+ls6G8pckopeuhvKXBpfMppPK/t6S/pMvEybLDpLehorniwq6yvbL+wqSkt6S/pOKkzqTHpLmhowotICBNTVggpOQgU1NFIKTKpMmkziBTSU1EILHpu7u1oce9pPLB9cj3pLekxqSkpOul16Xtpbulw6W1vuWkx8awuu6ktaS7pOukyKGiCi0gIKWqpeqluKXKpevIx6TOIGxpYmpwZWcgpemlpKXWpeml6qTIyOaz06S3pMYgMqHBMyDH3MT4xdmkzsKuxdmkx8awuu6kt6TepLmhowotICCk3qS/oaJTSU1EILK9pMuwzaTppMqkpLniwq6yvbL+wqSk4qSkpK+kxKSru9yktaTspMakqqTqoaJTSU1EILHpu7ukzrvIpKgKLSAgpMqkpLXst79DUFWky6SqpKSkxqTioaKlqqXqpbilyqXryMekyMjms9Okt6TGvb2/9KHzxPjF2bniwq6ky8awuu6kt6TepLmhowotCi0gIEpQRUcgsLW9zKG/xbizq73ozf2kzrniwq6yvaTyzNzFqqTIpLekxqSkpN6kuaSsoaLGsLruwq7F2brHzaXA6KTHpM+kyqSvoaIKLSAgpaql6qW4pcql68jHpMjGscX5sMq+5aTOt9e7u8C6xdmk8rv9pMSks6TIpPK6x82lwOiky7nNpKikv6WzobylyaTyus7N0QotICCkt6TGpKSk3qS5oaO8wrrdoaJEQ1Sx6bu7pMvJ4sawvq6/9MXARENUpPK7yKTDpL++7LnnoaKkqqTopNOhoqTkpOTGw7zspMoKLSAgpbWl86XXpeql86WwyOYoaDF2Mimk8rv9pMRKUEVHpdWloaWkpeuk8sW4s6ukuaTrvuy556TyvfykpKTGpM+hogotICClqqXqpbilyqXryMekyKOxpdOlw6XIpOKw46TvpMqkpLfrssyk8r3QpLek3qS5oaO+5bWtpM6jsqTEpM7O47OwpM6+7LnnpOIKLSAgpaql6qW4pcql68jHpOik6qTPueKy6LzBsr0oueLAusXZsr0ppLWk7KTGpKSk3qS5oaMKLQotICBTSU1EIMLQsf6yvaTLut2kt6TGpM+horLEx72kyrjCpOqhoqWqpeqluKXKpevIx6TOIGxpYmpwZWcgpemlpKXWpeml6qTIpM4KLSAguN+0ucCtpKy8uqTvpOykyqSkpOikpqTLuc3OuKS1pOykxqSkpN6kuaTOpMehoqTbpMik86TJpM6+7LnnoaKlqqXqpbilyqXrCi0gIMjHpPKkvaTOpN6k3sPWpK20uaSopOuks6TIpKyyxMe9pMekuaGjxsOky6GitqbNraXppaSl1qXppeqky7TYpLekxrjApKik0KGiCi0gILDsyfSkzs7js7AoY3lnd2luIKTOvuy55ymk8r38pK2hoqS9pOykz6WqpeqluKXKpevIx6TIpdClpKXKpeql7KXZpeukx6TOCi0gIL7lsMy437S5wK2krKSipOqk3qS5pM6kx6GipL2kzqTepN6lqqXqpbilyqXryMek8sPWpK20uaSopOuks6TIpKykx6StpN6kuaGjCi0KLSAgU0lNRCDC0LH+sr2ktaTspMakpKTryfTKrKTPoaKwyrK8pM6kyKSqpOqhpwotCi0gILC1vcy96M39oacKLSAgICC/p7b1tNbK0bS5KFJHQi0+WUNiQ3IpICA6IE1NWCBvciBTU0UyCi0gICAgpcClpqXzpbWl86XXpeql86WwICAgICAgOiBNTVggb3IgU1NFMgotICAgIERDVL3nytG0uSi54sC6xdnAsL/0KSAgIDogTU1YIG9yIFNTRTIKLSAgICBEQ1S958rRtLkoueLCrsCwv/QpICAgICA6IE1NWCBvciBTU0UyCi0gICAgRENUvefK0bS5KMnixrC+rr/0KSAgICAgOiAzRE5vdyEgb3IgU1NFICjAsL/0sem7u8n0OiBNTVggb3IgU1NFMikKLSAgICBEQ1S3uL/0zsy70rK9KMCwv/QpICAgICA6IE1NWCBvciBTU0UyCi0gICAgRENUt7i/9M7Mu9KyvSjJ4sawvq6/9CkgOiAzRE5vdyEgb3IgU1NFICjAsL/0sem7u8n0OiBNTVggb3IgU1NFMikKLQotICDFuLOrvejN/aGnCi0gICAgv6e29bTWytG0uShZQ2JDci0+UkdCKSAgOiBNTVggb3IgU1NFMgotICAgIKWipcOl16W1pfOl16XqpfOlsCAgICAgIDogTU1YIG9yIFNTRTIKLSAgICBEQ1S11crRtLkoueLAusXZwLC/9CkgICA6IE1NWCBvciBTU0UyCi0gICAgRENUtdXK0bS5KLniwq7AsL/0KSAgICAgOiBNTVggb3IgU1NFMgotICAgIERDVLXVytG0uSjJ4sawvq6/9CkgICAgIDogM0ROb3chIG9yIFNTRSAowLC/9LHpu7vJ9DogTU1YIG9yIFNTRTIpCi0gICAgRENUtdXK0bS5KL3Mvq7FuLOrKSAgICAgOiBNTVggb3IgU1NFMgotCi0gIMPtoctTU0UyIKTLpMSkpKTGpM+holNJTUQgwLC/9LHpu7ukzqTfpPLN+M3RpLekxqSkpN6kuaGjU0lNRCDH3MC6xdkKLSAgICAgIMnixrC+rr/0xcCx6bu7pM/N+M3RpLekxqSkpN6ku6TzoaOk3qS/oaJTU0UzIKTPu8jN0aS1pOykxqSkpN6ku6TzoaMKLSAgICAgIKSzpM4gSlBFRyCl6aWkpdal6aXqpMukqqSkpMakz6GiU1NFMyCk8rvIzdGkt6TGpOLGsLruwq7F2bj+vuWkzgotICAgICAguKu5/qTfpKyk26TIpPOkyaTKpKSkv6ThpMeholNTRTMgpPKltaXdobylyKS5pOvNvcTqpM+koqTqpN6ku6TzoaMKLQotICCks6TOpNukq6TLoaKloqW7pfOl1qXquMC47MjHRENUpeuhvKXBpfMoyPNTSU1EOyC958rRtLmjs7zvob+11crRtLmjtLzvKQotICCky6TopOqholNJTUTMv87hpM67yKSopMqkpLXst79DUFWkx6Tivb2/9KHzxPjF2aTOueLCrrK9pKy0/MLUpMekraTepLmhowotICCktaTppMuhosW4s6u96M39pMekzqXPpdWl3qXzpcels6G8pcml66G8pcGl86TPoaJTSU1EILK9pMuwzaTppMqkpMr9y6GkxwotICC54sKusr2y/sKkpLWk7KTGpKSk3qS5oaMKLQotCi2io8LQsf6kt6TGpKSk66XXpemlw6XIpdWlqaG8peAKLQotICBJbnRlbCB4ODYgQ1BVIKTLuMfNraTOtaHHvaTyzfjN0aS3pMakpKTepLmkzqTHoaKlqqXqpbilyqXryMekyKTPsNukyqTqoaIKLSAgSW50ZWwgeDg2IENQVSCkqqTopNOkvaTOuN+0uSBDUFUgpPK6zs3RpLekxqSkpOult6W5pcal4KTLuMKk6aTspN6kuaGjCi0gIFBvd2VyUEMgpMqkyaTOIEludGVsIHg4NiC3z7DKs7CkzqW3pbmlxqXgpMukz8LQsf6kt6TGpKSk3qS7pPOhowotICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAgtvHCzsWqpMukz6GiODAzODYgsMq536TOIEludGVsIHg4NiBDUFUgpKqk6KTTpL2kzrjftLkgQ1BVIKTyus7N0aS3pMakpKTrCi0gIKXPobylyaWmpaeloqTHoaKkq6TEoaIzMmJpdKXVpemlw6XIpaKlyaXspbml4qG8pckoyt247qXiobylySmk8rvIzdGkt6TGCi0gIKSkpOul16XppcOlyKXVpamhvKXgKE9TKaSswtC+3aTHpLmho6SzpOyky6TPoaJXaW4zMiAoV2luZG93cyA5eLfPL05Ut88pCi0gIKTks8a87yBQQy1VTklYIChsaW51eCCk5CB4QlNEIKXVpaGl36XqpMqkySkgpMqkyaSss7rF9qS3pN6kuaGjpMqkqqGiCi0gIEFNRDY0IChFTTY0VCkgpM42NGJpdKXiobylybTEtq2ky6TPwtCx/qS3pMakpKTepLuk86GjpLTD7bDVpK+kwKS1pKShowotICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotoqOks6TOIFNJTUQgs8jEpcjHIElKRyBKUEVHIGxpYnJhcnkguMfNraTOwKm4wgotCi0gIKWqpeqluKXKpevIx6TOIElKRyBKUEVHIGxpYnJhcnkgpMekz6GipbOl86XRpaSl67v+pM6lqqXXpbel56XzpMehogotICA4Yml0wLrF2UpQRUcgpMggMTJiaXTAusXZSlBFRyCkzs6+yv2ky8LQsf6kt6TepLmkrKGipLOkziBTSU1EILPIxKXIx6TPCi0gIDhiaXTAusXZSlBFRyCkzqTfpM7C0LH+pMehojEyYml0wLrF2UpQRUcgpMukz8LQsf6kt6TepLuk86GjpMikz6SkpKihogotICAxMmJpdMC6xdlKUEVHIKTPsOXOxc3RpMqkyaTOxsO87MqszO6k8r38pKSkxsvYpMm7yKTvpOykxqSkpMqkpKTOpMehogotICDM5MLqpM++r6TKpKSkyLvXpKSk3qS5oaMKLQotCi2io7vIpKTK/QotCi0gIKXepcul5aWipeukz6GisMqyvKTOpdWloaWkpeuky8qspKuk7KTGpKSk3qS5pM6kx6GivMK63aTOu8ikpMr9pMqkyaTLCi0gIKTEpKSkxqTPoaKkvaTBpOmk8ruyvsikt6TGpK+kwKS1pKShowotCi0gICAgc2ltZF9SRUFETUUuamEudHh0ICAgLSCks6TOpdWloaWkpesKLSAgICBzaW1kX2ZpbGVsaXN0LmphLnR4dCAtILz9z7+l1aWhpaSl66TOpdWloaWkpeul6qW5pcgKLSAgICBzaW1kX2luc3RhbGwuamEudHh0ICAtIKWzpfOl0aWkpeukzrvFyv0KLSAgICBzaW1kX2ludGVybmFsLmphLnR4dCAtIFNJTUQgs8jEpcn0yqykzr7cutkKLSAgICBzaW1kX2NkanBlZy5qYS50eHQgICAtIFNJTUQgyMcgY2pwZWcvZGpwZWcgpMu4x82tpM61oce9pM6y8sDiCi0gICAgc2ltZF9jaGFuZ2VzLmphLnR4dCAgLSBTSU1EILPIxKXJ9MqspM6y/sjHzfrO8gotCi0KLaKju8jN0b7yt++hpqW1pd2hvKXICi0KLSAgpLOkziBTSU1EILPIxKXIxyBJSkcgSlBFRyBzb2Z0d2FyZSCkzrvIzdG+8rfvpMukxKSkpMakz6Gipaql6qW4pcql68jHpM4KLSAgSUpHIEpQRUcgc29mdHdhcmUgpM67yM3RvvK376SsxazN0aS1pOyk3qS5oaO+3KS3pK+kz6GixrG6raTOIFJFQURNRQotICCl1aWhpaSl6yix0cq4KaTOIExFR0FMIElTU1VFUyCkzrngpPK7sr7IpLekxqSvpMCktaSkoaMKLQotICC+5bWtpM67yM3RvvK376TOxuLNxqTOt6uk6srWpLeky6TKpOqk3qS5pKyhoqSzpM6lvaXVpcilpqWnpaKkz6HWuL2+9aTOCi0gIKTepN6kx6HXxPO2oaS1pOykxqSkpOuk4qTOpMehor6mtsjFqqTKu8jN0bLEx73AraGipKqk6KTTxsPE6qTOzNzFqqTLCi0gIMLQpLmk68WsuefAraTKpMmk4rTepOGhoqSkpKukyqTryt2+2qTipKKk6qTepLuk86GjCi0gIKTepL+hori2uu681ChUaGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCmk4rL+wqS81ChNSVlBU0FLQSBNYXNhcnUppOKhogotICC79s2zpM6kpKSrpPOk8szkpO+kuqGiy9ylvaXVpcilpqWnpaKkzrvIzdGky6TopMOkxsivwLikt6S/x6Gyv6TKpOvCu7OypMsKLSAgpMSkpKTGpOKhorDswNqkvaTOwNXHpKTyyemk76TKpKSk4qTOpMikt6TepLmhowotCi0gIKSzpM4gU0lNRCCzyMSlyMcgSUpHIEpQRUcgc29mdHdhcmUgpM+hoqWqpeqluKXKpeuzq8ivuLWkziBJSkcgpMikz7TYt7gKLSAgpMqkr6Gixsi8q6TLs8jEpaTyudSkyqTDpL+k4qTOpMekuaGjpMekuaTOpMehoqSzpM4gU0lNRCCzyMSlyMcgSUpHIEpQRUcKLSAgc29mdHdhcmUgpMu02KS5pOu8wczkpPKhoqWqpeqluKXKpeuzq8ivuLUgKFRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwKQotICCky8H3pOmkyqSkpMekr6TApLWkpKGjCi0KLSAgpLOkziBTSU1EILPIxKXIxyBJSkcgSlBFRyBzb2Z0d2FyZSCky7TYpLekxqTPoaK4tsKnpMikt6TGpc6hvKW1pd2hvKXIpMgKLSAgpLWku6TGpKSkv6TApK2k3qS5oaOl4aG8peukyqTJpMektLzBzOSkyqTJpPKkpKS/pMCkraTepLekxqTioaK+76TLsr+k6aSrCi0gIKTOytbF+qSspMekraTrpO+ksaTHpM+koqTqpN6ku6TzpM6kx6GipLS+tcPOpKqkraSvpMCktaSkoaMKLSAgxsOky6GiocqlqqXqpbilyqXrpM6x0cq4pd6ly6XlpaKl66TytN6k4aHLxrG6raTOpd6ly6XlpaKl687gpMuy88X6pKwKLSAgvfGkpKTGpKKk67zBzOSk5KGiu8jN0bzUpM6lvaXVpcilpqWnpaK1u73RvNSkyKS3pMakzrW7zszJ1MKtoaa30LizydTCraTLCi0gILTYpO+k67zBzOShorzBzOSkzs3Xzs6k8sbApMqkpLzBzOSkyqTJpMukxKSkpMakz6GisvPF+qTypKSkv6S3pN6ku6TzpM6kx6GiCi0gIKSipLekq6TppLqktM67vrWkr6TApLWkpKGjCi0KLQotCi0gICAgICAgICAgIEUtTWFpbCBBZGRyZXNzIDogYWxrYWlkQGNvcmFsLm9jbi5uZS5qcCAotdy65CC4rS9NSVlBU0FLQSBNYXNhcnUpCi1bRU9GXQpkaWZmIC0tZ2l0IGEvc2ltZF9jZGpwZWcuamEudHh0IGIvc2ltZF9jZGpwZWcuamEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDFhMTVhLi4wMDAwMDAwCi0tLSBhL3NpbWRfY2RqcGVnLmphLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLUluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBKUEVHIHNvZnR3YXJlIHJlbGVhc2UgNmIKLSAgd2l0aCB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkgdmVyc2lvbiAxLjAyCi0gICAgPT0gQ0RKUEVHID09Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi2io6SzpM6l1aWhpaSl66TPCi0KLSAgpLOkzqXVpaGlpKXrpMekz6GiU0lNRCDIx6TOIGNqcGVnIC8gZGpwZWcgpMu4x82tpM61oce9pPKy8sDipLek3qS5oaMKLQotICAgIKKjIFNJTUQgxrC67qXiobylyb7wyvMgKC12IKWqpdelt6XnpfMpCi0gICAgoqMgxsPE6qTOIFNJTUQgsem7u6Tyu8jN0aS3pMqkpKTopKaky6S5pOsgKC1ub1hYWCClqqXXpbel56XzKQotICAgIKKjIEdJRiC3wbywpM7GyaTfuf6k36G/vfGkrb3QpLcgKGRqcGVnIKTOIC1naWYgpaql16W3peel8ykKLQotCi2ioyBTSU1EIMawuu6l4qG8pcm+8MrzICgtdiClqqXXpbel56XzKQotCi0gIKSzpM4gU0lNRCDIxyBjanBlZyAvIGRqcGVnIKTHpM+hoi12IKWqpdelt6XnpfOk8qTEpLGkxrWvxrCkuaTrpMihorDKsrwKLSAgpM6k6KSmpMogU0lNRCDGsLrupeKhvKXJvvDK86SspdChvKW4peel877wyvOkyLampMvJvbyopLWk7KTepLmhowotCi0gICAgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIERKUEVHLCB2ZXJzaW9uIDZiICAyNy1NYXItMTk5OAotICAgIENvcHlyaWdodCAoQykgMTk5OCwgVGhvbWFzIEcuIExhbmUKLQotICAgIHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeSwgdmVyc2lvbiAxLjAyCi0KLSAgICBTSU1EIGluc3RydWN0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIHN5c3RlbSA6IE1NWCAzRE5vdyEgU1NFIFNTRTIKLQotICAgICAgICAgID09PSBTSU1EIE9wZXJhdGlvbiBNb2RlcyA9PT0KLSAgICBBY2N1cmF0ZSBpbnRlZ2VyIERDVCAgKC1kY3QgaW50KSAgIDogU1NFMgotICAgIEZhc3QgaW50ZWdlciBEQ1QgICAgICAoLWRjdCBmYXN0KSAgOiBTU0UyCi0gICAgRmxvYXRpbmctcG9pbnQgRENUICAgICgtZGN0IGZsb2F0KSA6IFNTRQotICAgIFJlZHVjZWQtc2l6ZSBEQ1QgICAgICAoLXNjYWxlIE0vTikgOiBTU0UyCi0gICAgSGlnaC1xdWFsaXR5IHVwc2FtcGxpbmcgKGRlZmF1bHQpICA6IFNTRTIKLSAgICBMb3ctcXVhbGl0eSB1cHNhbXBsaW5nICgtbm9zbW9vdGgpIDogU1NFMgotICAgIENvbG9yc3BhY2UgY29udmVyc2lvbiAoWUNiQ3ItPlJHQikgOiBTU0UyCi0KLSAgIlNJTUQgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZCBieSB0aGUgc3lzdGVtIiCkzrngzNykx87ztfOktaTspOukzqTPoaIKLSAgpbeluaXGpeAoQ1BVL09TKaTHpbWl3aG8pciktaTspMakpKTrIFNJTUQgsem7u6TOvO/O4KTHpLmho6TKpKqhoqSzpM4KLSAgpb2l1aXIpMekzyBTU0UzIKTPu8jN0aS1pOykxqSkpN6ku6TzpLcgU1NFMyCkzqW1pd2hvKXIpM64ob3QpOK51KTKpO+k7AotICCk3qS7pPOkzqTHoaJTU0UzIKSspbWl3aG8pciktaTspMakpKTGpOKks6TOueDM3KTLpM+4vaTspN6ku6TzoaMKLQotICCkvaTOsrykziAiU0lNRCBPcGVyYXRpb24gTW9kZXMiIKTPoaKzxr3ozf3DyrOspMe7yM3RpLWk7KTrIFNJTUQgsem7u6TOCi0gILzvzuCkx6S5oaNGbG9hdGluZy1wb2ludCBEQ1QgpMekzyAzRE5vdyEgpKsgU1NFIKGipL2k7LDKs7CkzqTIpLOk7aTHpM8KLSAgTU1YIKSrIFNTRTIgpKzBqsLypLWk7KTepLmho7DsyMyky6GiU1NFL1NTRTIgpM7K/aSsIE1NWC8zRE5vdyEgpOik6qTiCi0gILniwK3HvaTIpLWk7KTrpM6kx6GipLOkzsHQyv2krM34zdGyxMe9pMq+7LnnpM8gU1NFL1NTRTIgpKzNpcDoxaqky8GqwvIKLSAgpLWk7KTepLmhowotCi0KLaKjIMbDxOqkziBTSU1EILHpu7uk8rvIzdGkt6TKpKSk6KSmpMukuaTrICgtbm9YWFggpaql16W3peel8ykKLQotICCks6TOIFNJTUQgyMcgY2pwZWcgLyBkanBlZyCkx6TPoaKwyrK8pM6k6KSmpMqlqqXXpbel56XzpPK72MTqpLmk66SzpMikx6GiCi0gIMbDxOqkziBTSU1EILHpu7uk8rvIzdGkt6TKpKSk6KSmpMukx6StpN6kuaGjCi0KLSAgICAtbm9tbXggICAgICAgICBNTVggpPK7yM3RpLekyqSkCi0gICAgLW5vM2Rub3cgICAgICAgM0ROb3chIKTyu8jN0aS3pMqkpAotICAgIC1ub3NzZSAgICAgICAgIFNTRSCk8rvIzdGkt6TKpKQKLSAgICAtbm9zc2UyICAgICAgICBTU0UyIKTyu8jN0aS3pMqkpAotICAgIC1ub3NpbWQgICAgICAgIKS5pNmkxqTOIFNJTUQgsem7u6Tyu8jN0aS3pMqkpAotCi0gIKSzpOyk6aTOpaql16W3peel86TPoaJjanBlZy9kanBlZyCkzqWzpd6l86XJpemlpKXzpM7A6MaspMu72MTqpLmk66TopKYKLSAgpMukt6TGpK+kwKS1pKShowotCi0KLaKjIEdJRiC3wbywpM7GyaTfuf6k36G/vfGkrb3QpLcgKGRqcGVnIKTOIC1naWYgpaql16W3peel8ykKLQotICClqqXqpbilyqXryMcgY2pwZWcvZGpwZWcgpM4gdmVyc2lvbiA2YiCkx6TPoaLGw7X2vuWkzszkwuqkq6TpoaJHSUYgt8G8sAotICCy6MH8pM7GyaTfuf6k36G/vfGkrb3QpLekrKW1pd2hvKXIpLWk7KTKpK+kyqTDpMakpKTepLekv6GjpMekuaSsoaIKLSAgR0lGIKTLtNikuaTrxsO19qSsIDIwMDOhwTIwMDQgx6+ky6SrpLGkxsCks6bFqqTLtPy4wsDapOyky6TKpMOkv6S/pOGhogotICDF9iBTSU1EIMjHpMekzyBHSUYgt8G8sKTOxsmk37n+pN+hv73xpK290KS3pPLJ/LPopLWku6TGpKKk6qTepLmhowotCi0gIM2+w8ykx6S5pKyhosX2IFNJTUQgyMekxyBHSUYgt8G8sKTOxsmk37n+pN+hv73xpK290KS3pMu7yM3RpLekxqSkpOsKLSAgpeKluKXlobyl66TPoaK17MjHpMekoqTrIHZlcnNpb24gNmEgpM6k4qTOpPLOrs3RpLekxqSkpN6kuaGjCi0KLQotCi1bRU9GXQpkaWZmIC0tZ2l0IGEvc2ltZF9jaGFuZ2VzLmphLnR4dCBiL3NpbWRfY2hhbmdlcy5qYS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNTYwMDIuLjAwMDAwMDAKLS0tIGEvc2ltZF9jaGFuZ2VzLmphLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLUluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBKUEVHIHNvZnR3YXJlIHJlbGVhc2UgNmIKLSAgd2l0aCB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkgdmVyc2lvbiAxLjAyCi0gICAgPT0gQ0hBTkdFUyA9PQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSUpHIFI2YiB3aXRoIHg4NlNJTUQgVjEuMDIgKDIwMDYtMDItMDQpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogeDg2IMjHIERhcndpbiCky8LQsf6kt6TepLekv6GjxrC67rPOx6ekzyBEYXJ3aW4gOC4wLjEgZm9yIHg4NiCky6TGCi0gILnUpMqkpKTepLekv6GjeDg2IMjHIE1hYyBPUyBYIKTHpOKhosawuu6kuaTrpOKkzqTIu9ek76TspN6kuaGjCi0gIKTepL+holNvbGFyaXMgMTAgpMekzsawuu6zzsenpOK51KTKpKSk3qS3pL+howotCi1JSkcgUjZiIHdpdGggeDg2U0lNRCBWMS4wMSAoMjAwNi0wMS0yNikKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBqc2ltZGdjYy5jIKTyu8ikw6S/pMikraGiTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyCkrMTqtcGktaTspMakpKTrpMgKLSAgwLW+76TLpeql86WvpMekraTKpKSl0KWwpPK9pMC1pLek3qS3pL+howotKiCwtb3MwqakzqWzobylyaTOsOzJ9ChqY3NhbW1teC5hc20sIGpjc2Ftc3MyLmFzbSwgamNxbnQzZG4uYXNtKaTLpOSk5AotICC+6cS5pMqy1b3qpKykoqTDpL+kzqTHoaKks6TspPK9pMC1pLek3qS3pL+howotCi1JSkcgUjZiIHdpdGggeDg2U0lNRCBWMS4wICgyMDA2LTAxLTEwKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoguse96aTOuPizq8jHoaMKLQotCi1bRU9GXQpkaWZmIC0tZ2l0IGEvc2ltZF9maWxlbGlzdC5qYS50eHQgYi9zaW1kX2ZpbGVsaXN0LmphLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJlZTQzMS4uMDAwMDAwMAotLS0gYS9zaW1kX2ZpbGVsaXN0LmphLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi1JbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFRyBzb2Z0d2FyZSByZWxlYXNlIDZiCi0gIHdpdGggeDg2IFNJTUQgZXh0ZW5zaW9uIGZvciBJSkcgSlBFRyBsaWJyYXJ5IHZlcnNpb24gMS4wMgotICAgID09IEZJTEVMSVNUID09Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi2io6SzpM6l1aWhpaSl66TPCi0KLSAgpLOkzqXVpaGlpKXrpMekz6GiU0lNRCDIxyBJSkcgSlBFRyBzb2Z0d2FyZSCkzsfbyduloqG8paulpKXWpMu8/aThpOmk7KTGCi0gIKSkpOuzxqXVpaGlpKXrpM6ztc3XpPKy8sDipLek3qS5oaOkyqSqoaKks6SzpMekzyB4ODYgU0lNRCBleHRlbnNpb24gpMcKLSAgv7ekv6TLxMmyw6S1pOykv6XVpaGlpKXrpMihong4NiBTSU1EIGV4dGVuc2lvbiCkx7L+ytGkrLLDpKik6aTspMa1oce9ob8KLSAgzPKz5KSspaql6qW4pcql68jHpMikz7DbpMqk66XVpaGlpKXrpM6k36TysvLA4qS3pN6kuaGjpL2k7LDKs7CkzqXVpaGlpKXrCi0gIKTLpMSkpKTGpM+hoqWqpeqluKXKpevIx6TOIGZpbGVsaXN0LmRvYyAosdHKuCkgpPK7sr7IpLekxqSvpMCktaSkoaMKLQotICAgIKKjpd6ly6XlpaKl687gCi0gICAgoqNjb25maWd1cmUgpbmlr6XqpdelyKTLtNi3uKS5pOul1aWhpaSl6wotICAgIKKjTWljcm9zb2Z0IFZpc3VhbCBDKysgNi4wIM3RpM6l16Xtpbilp6Wvpcil1aWhpaSl67eyICh2YzZwcm9qLykKLSAgICCio8bDxOqkzqWzpfOl0aWkpenN0aTOIGpjb25maWcuaCCkyCBNYWtlZmlsZQotICAgIKKjpb2hvKW5pdWloaWkpesKLSAgICAgIKH8IHg4NiBTSU1EIGV4dGVuc2lvbiCkx7+3pL+ky8TJssOktaTspL+l1aWhpaSl6wotICAgICAgofwgeDg2IFNJTUQgZXh0ZW5zaW9uIKTHsv7K0aSsssOkqKTppOykv6XVpaGlpKXrCi0gICAgoqPKo7/0pdWloaWkpevC0LH+yMekziBjanBlZy9kanBlZyAoYWx0dWkvKQotICAgIKKjU0lNRCDIx6THpM+7yKTvpOykyqSkpdWloaWkpeu3siAodW51c2VkLykKLQotCi2io6Xepcul5aWipevO4AotCi0gILDKsrykziBTSU1EIMjHpM6l3qXLpeWloqXrpM7CvqTLoaKlqqXqpbilyqXryMekzrHRyril3qXLpeWloqXrpOIKLSAgpL2kzqTepN68/c+/pLekxqSipOqk3qS5oaPKu6S7pMa7sr7IpLekxqSvpMCktaSkoaMKLQotICBzaW1kX1JFQURNRS5qYS50eHQgICAgvOel3qXLpeWloqXrKHg4NiBTSU1EIGV4dGVuc2lvbiCkzrO1zdekyqTJKQotICBzaW1kX2ZpbGVsaXN0LmphLnR4dCAgU0lNRCDIxyBJSkcgSlBFRyBzb2Z0d2FyZSCkzqXVpaGlpKXrpeqluaXICi0gIHNpbWRfaW5zdGFsbC5qYS50eHQgICBTSU1EIMjHIGxpYmpwZWcgpemlpKXWpeml6qTOpbOl86XRpaSl66TOu8XK/QotICBzaW1kX2ludGVybmFsLmphLnR4dCAgU0lNRCDIxyBsaWJqcGVnIKXppaSl1qXppeqkzqGiU0lNRCCzyMSlyfTKrKTOvty62QotICBzaW1kX2NkanBlZy5qYS50eHQgICAgU0lNRCDIx6TOIGNqcGVnIC8gZGpwZWcgpMu4x82tpM61oce9pM6y8sDiCi0gIHNpbWRfY2hhbmdlcy5qYS50eHQgICBTSU1EIMjHIGxpYmpwZWcgpemlpKXWpeml6qTOsv7Ix836zvIKLQotCi2ioyBjb25maWd1cmUgpbmlr6XqpdelyKTLtNi3uKS5pOul1aWhpaSl6wotCi0gIFVOSVggtMS2raTHIGNvbmZpZ3VyZSCluaWvpeql16XIpPLB9qTppLuk677sueeky8mszdekyKTKpOul1aWhpaSl67eyCi0gIKTHpLmho8jzIFVOSVggtMS2raTHpM+horrvvfykt6TGpOKkq6TepKSk3qS7pPOhowotCi0gIGNvbmZpZ3VyZSAgICAgY29uZmlndXJlIKW5pa+l6qXXpcjL3MLOCi0gIGNvbmZpZy52ZXIgICAgY29uZmlndXJlIKSrpOm4xqTTvdCktaTspOuluaWvpeql16XIpMehoramza2l6aWkpdal6aXqpM4KLSAgICAgICAgICAgICAgICCl0KG8pbil56XzyNa55qTyxOq1waS3pMakpKTepLkKLSAgbHRtYWluLnNoICAgICBjb25maWd1cmUgpM6ltaXdobylyKW5pa+l6qXXpcggKGZyb20gR05VIGxpYnRvb2wpCi0gIGNvbmZpZy5ndWVzcyAgICAgICAgICChtwotICBjb25maWcuc3ViICAgICAgICAgICAgobcKLSAgaW5zdGFsbC1zaCAgICBpbnN0YWxsIKWzpd6l86XJpKykyqSkvuy556TOwuXN0aW5pa+l6qXXpcgKLSAgbmFzbV9sdC5zaCAgICBuYXNtIKTyIEdOVSBsaWJ0b29sIKTHu8ikpr7sueekzqXppcOl0aGmpbmlr6XqpdelyAotICBqY29uZmlnLmNmZyAgIGNvbmZpZ3VyZSCkrMC4wK6kuaTrIGpjb25maWcuaCCkzr/3t7+l1aWhpaSl6wotICBtYWtlZmlsZS5jZmcgIGNvbmZpZ3VyZSCkrMC4wK6kuaTrIE1ha2VmaWxlIKTOv/e3v6XVpaGlpKXrCi0gIGNvbmZpZ3VyZS5pbiAgY29uZmlndXJlIKW5pa+l6qXXpcikzqW9obyluaXVpaGlpKXrIChmb3IgR05VIGF1dG9jb25mKQotICBhY2xvY2FsLm00ICAgICAgICAgICAgobcKLSAgbGlianBlZy5zcGVjICBSUE0gpPK6zs3RpLekxqSkpOsgbGludXggpbeluaXGpeC4/qSxpM4gc3BlYyCl1aWhpaSl6wotCi0KLaKjIE1pY3Jvc29mdCBWaXN1YWwgQysrIDYuMCDN0aTOpdel7aW4paelr6XIpdWloaWkpeu3siAodmM2cHJvai8pCi0KLSAgpLOk7KTppM6l1aWhpaSl66Tyu8ikpr7sueekz6Gipb2hvKW5pdWloaWkpeukrKSipOuw7KTEvuWkzqXVpaml66XApMsKLSAgpLOk7KTppM6l1aWhpaSl66TypLmk2aTGsNzGsKS3pMakr6TApLWkpKGjvtykt6SvpM+honNpbWRfaW5zdGFsbC5qYS50eHQKLSAgpPK7sr7IpLekxqSvpMCktaSkoaMKLQotICBWaXN1YWwgQysrIDYuMCCwyrnfpM7F/bnns6vIr7TEtq0oRGV2U3R1ZGlvKaTOvuy556TPoaKks6TspOmkzqXVpaGlpKXrCi0gIKTyytG0uSilpKXzpd2hvKXIKaS3pMa7yKTDpMakr6TApLWkpKGjCi0KLSAgdmM2cHJvai9saWJqcGVnLmRzdyAgIKXXpe2luKWnpa+lyKGmpe+hvKWvpbml2qG8pbkKLSAgdmM2cHJvai9tYWtlY2ZnLmRzcCAgIGxpYmpwZWcuZHNwIChsaWJqcGVnLmxpYikgpM6l06Xrpcmky8mszdekygotICAgICAgICAgICAgICAgICAgICAgICAgwN/E6qXVpaGlpKXrIGpzaW1kY2ZnLmluYyCk8rrupOsKLSAgdmM2cHJvai9saWJqcGVnLmRzcCAgIGxpYmpwZWcubGliIKTOpdel7aW4paelr6XIpdWloaWkpesKLSAgdmM2cHJvai9janBlZy5kc3AgICAgIGNqcGVnLmV4ZSCkzqXXpe2luKWnpa+lyKXVpaGlpKXrCi0gIHZjNnByb2ovZGpwZWcuZHNwICAgICBkanBlZy5leGUgpM6l16Xtpbilp6Wvpcil1aWhpaSl6wotICB2YzZwcm9qL2pwZWd0cmFuLmRzcCAganBlZ3RyYW4uZXhlIKTOpdel7aW4paelr6XIpdWloaWkpesKLSAgdmM2cHJvai9yZGpwZ2NvbS5kc3AgIHJkanBnY29tLmV4ZSCkzqXXpe2luKWnpa+lyKXVpaGlpKXrCi0gIHZjNnByb2ovd3JqcGdjb20uZHNwICB3cmpwZ2NvbS5leGUgpM6l16Xtpbilp6Wvpcil1aWhpaSl6wotICB2YzZwcm9qL2FwcHRlc3QuZHNwICAgY2pwZWcsIGRqcGVnLCBqcGVndHJhbiCkzsawuu6lxqW5pcgobWFrZSB0ZXN0KQotICB2YzZwcm9qL2pjb25maWcuaCAgICAgVkMrKyDN0aTOIGpjb25maWcuaCAoamNvbmZpZy52YyCkyMaxpLik4qTOKQotCi0KLaKjxsPE6qTOpbOl86XRpaSl6c3RpM4gamNvbmZpZy5oIKTIIE1ha2VmaWxlCi0KLSAgvtykt6SvpM+honNpbWRfaW5zdGFsbC5qYS50eHQgpPK7sr7IpLekxqSvpMCktaSkoaOks6TspOmkzqXVpaGlpKXrpMukz6GiCi0gIFNJTUQgsr2ky8i8pMOkxr+3pL+ky8TJssOktaTspL+lvaG8pbml1aWhpaSl66TLtNikuaTrta290qSsxMmyw6S1pOykxgotICCkpKTepLmkq6TpoaKlqqXqpbilyqXryMeky8nVwrCkziBqY29uZmlnLiogpMggTWFrZWZpbGUuKiCkz6GiCi0gIKSzpM4gU0lNRCDIx6THpM+7yM3RpMekraTepLuk86GjCi0KLSAgamNvbmZpZy5iYzUgICAgICAgQm9ybGFuZCBDKysgQ29tcGlsZXIgNS41ICh3aW4zMikgzdGkziBqY29uZmlnLmgKLSAgbWFrZWZpbGUuYmM1ICAgICAgQm9ybGFuZCBDKysgQ29tcGlsZXIgNS41ICh3aW4zMikgzdGkziBNYWtlZmlsZQotICBqY29uZmlnLmRqICAgICAgICBESkdQUCB2Mi4wIM3RpM4gamNvbmZpZy5oCi0gIG1ha2VmaWxlLmRqICAgICAgIERKR1BQIHYyLjAgzdGkziBNYWtlZmlsZQotICBqY29uZmlnLm1ndyAgICAgICBNaW5HVyDN0aTOIGpjb25maWcuaAotICBtYWtlZmlsZS5tZ3cgICAgICBNaW5HVyDN0aTOIE1ha2VmaWxlICjAxcWqIEpQRUcgpemlpKXWpeml6qTyuu7ArikKLSAgbWFrZWZpbGUubWd3ZGxsICAgTWluR1cgzdGkziBNYWtlZmlsZSAoRExMIMjHIEpQRUcgpemlpKXWpeml6qTyuu7ArikKLSAgamNvbmZpZy52YyAgICAgICAgVkMrKyDN0aTOIGpjb25maWcuaAotICBtYWtlZmlsZS52YyAgICAgICBWQysrIM3RpM4gTWFrZWZpbGUgKMDFxaogSlBFRyCl6aWkpdal6aXqpPK67sCuKQotICBtYWtlZmlsZS52Y2RsbCAgICBWQysrIM3RpM4gTWFrZWZpbGUgKERMTMjHIEpQRUcgpemlpKXWpeml6qTyuu7ArikKLSAgamNvbmZpZy5saW51eCAgICAgbGludXggzdGkziBqY29uZmlnLmggKMPtoadjb25maWd1cmUgpM67yM3RpPK/5L6pKQotICBtYWtlZmlsZS5saW51eCAgICBsaW51eCDN0aTOIE1ha2VmaWxlICjD7aGnY29uZmlndXJlIKTOu8jN0aTyv+S+qSkKLQotICCwyrK8pM6l1aWhpaSl66TPoaK+5bWtsMqzsKTOpbOl86XRpaSl6aTLwtCx/qS5pOsgamNvbmZpZy5oIKTIIE1ha2VmaWxlCi0gIKTyv7ekv6TLuu7ArqS5pOu+7LnnpM6/97e/pMikyqTrpdWloaWkpeukx6S5oaOlqqXqpbilyqXryMeky6Tiwri636S3pN6kuQotICCkrKGiU0lNRCCyvaTLyLykpsrRubmkrLvcpLWk7KTGpKSk3qS5oaMKLQotICBja2NvbmZpZy5jICAgICAgICBqY29uZmlnLmggpPLAuMCupLmk66XXpe2lsKXppeAKLSAgbWFrZWZpbGUuYW5zaSAgICAgTWFrZWZpbGUgpM6/97e/pdWloaWkpesgKEFOU0kgpbOl86XRpaSl6c3RKQotICBtYWtlZmlsZS51bml4ICAgICBNYWtlZmlsZSCkzr/3t7+l1aWhpaSl6yAoyPMgQU5TSSCls6XzpdGlpKXpzdEpCi0KLQotoqOlvaG8pbml1aWhpaSl6wotCi0gIKH8IHg4NiBTSU1EIGV4dGVuc2lvbiCkx7+3pL+ky8TJssOktaTspL+l1aWhpaSl6wotCi0gIGpjY29sbW14LmFzbSAgUkdCLT5ZQ2JDciC/p7b1tNbK0bS5IChNTVgpCi0gIGpjY29sc3MyLmFzbSAgUkdCLT5ZQ2JDciC/p7b1tNbK0bS5IChTU0UyKQotICBqY3NhbW1teC5hc20gIKXApaal86W1pfOl16XqpfOlsCAoTU1YKQotICBqY3NhbXNzMi5hc20gIKXApaal86W1pfOl16XqpfOlsCAoU1NFMikKLQotICBqZGNvbG1teC5hc20gIFlDYkNyLT5SR0Igv6e29bTWytG0uSAoTU1YKQotICBqZGNvbHNzMi5hc20gIFlDYkNyLT5SR0Igv6e29bTWytG0uSAoU1NFMikKLSAgamRzYW1tbXguYXNtICCloqXDpdeltaXzpdel6qXzpbAgKE1NWCkKLSAgamRzYW1zczIuYXNtICCloqXDpdeltaXzpdel6qXzpbAgKFNTRTIpCi0gIGpkbWVybW14LmFzbSAgv6e29bTWytG0uaG/paKlw6XXpbWl86XXpeql86Wwxf255yAoTU1YKQotICBqZG1lcnNzMi5hc20gIL+ntvW01srRtLmhv6WipcOl16W1pfOl16XqpfOlsMX9uecgKFNTRTIpCi0KLSAgamNxbnRpbnQuYXNtICClx6G8pb/K0bS5pMjOzLvSsr0gKMjzU0lNRCwgwLC/9CkKLSAgamNxbnRmbHQuYXNtICClx6G8pb/K0bS5pMjOzLvSsr0gKMjzU0lNRCwgyeLGsL6uv/TFwCkKLSAgamNxbnRtbXguYXNtICClx6G8pb/K0bS5pMjOzLvSsr0gKE1NWCwgwLC/9CkKLSAgamNxbnRzMmkuYXNtICClx6G8pb/K0bS5pMjOzLvSsr0gKFNTRTIsIMCwv/QpCi0gIGpjcW50M2RuLmFzbSAgpcehvKW/ytG0uaTIzsy70rK9ICgzRE5vdyEgJiBNTVgsIMnixrC+rr/0xcApCi0gIGpjcW50c3NlLmFzbSAgpcehvKW/ytG0uaTIzsy70rK9IChTU0UgJiBNTVgsIMnixrC+rr/0xcApCi0gIGpjcW50czJmLmFzbSAgpcehvKW/ytG0uaTIzsy70rK9IChTU0UgJiBTU0UyLCDJ4sawvq6/9MXAKQotCi0gIGpmZGN0aW50LmFzbSAgueLAusXZwLC/9Ci958r9uP4pRENUICjI81NJTUQpCi0gIGpmbW14aW50LmFzbSAgueLAusXZwLC/9Ci958r9uP4pRENUIChNTVgpCi0gIGpmc3MyaW50LmFzbSAgueLAusXZwLC/9Ci958r9uP4pRENUIChTU0UyKQotICBqZmRjdGZzdC5hc20gILniwq7AsL/0KL3nyv24/ilEQ1QgKMjzU0lNRCkKLSAgamZtbXhmc3QuYXNtICC54sKuwLC/9Ci958r9uP4pRENUIChNTVgpCi0gIGpmc3MyZnN0LmFzbSAgueLCrsCwv/QovefK/bj+KURDVCAoU1NFMikKLSAgamZkY3RmbHQuYXNtICDJ4sawvq6/9MXAKL3nyv24/ilEQ1QgKMjzU0lNRCkKLSAgamYzZG5mbHQuYXNtICDJ4sawvq6/9MXAKL3nyv24/ilEQ1QgKDNETm93ISkKLSAgamZzc2VmbHQuYXNtICDJ4sawvq6/9MXAKL3nyv24/ilEQ1QgKFNTRSkKLQotICBqaWRjdGludC5hc20gILniwLrF2cCwv/QotdXK/bj+KURDVCAoyPNTSU1EKQotICBqaW1teGludC5hc20gILniwLrF2cCwv/QotdXK/bj+KURDVCAoTU1YKQotICBqaXNzMmludC5hc20gILniwLrF2cCwv/QotdXK/bj+KURDVCAoU1NFMikKLSAgamlkY3Rmc3QuYXNtICC54sKuwLC/9Ci11cr9uP4pRENUICjI81NJTUQpCi0gIGppbW14ZnN0LmFzbSAgueLCrsCwv/QotdXK/bj+KURDVCAoTU1YKQotICBqaXNzMmZzdC5hc20gILniwq7AsL/0KLXVyv24/ilEQ1QgKFNTRTIpCi0gIGppZGN0Zmx0LmFzbSAgyeLGsL6uv/TFwCi11cr9uP4pRENUICjI81NJTUQpCi0gIGppM2RuZmx0LmFzbSAgyeLGsL6uv/TFwCi11cr9uP4pRENUICgzRE5vdyEgJiBNTVgpCi0gIGppc3NlZmx0LmFzbSAgyeLGsL6uv/TFwCi11cr9uP4pRENUIChTU0UgJiBNTVgpCi0gIGppc3MyZmx0LmFzbSAgyeLGsL6uv/TFwCi11cr9uP4pRENUIChTU0UgJiBTU0UyKQotICBqaWRjdHJlZC5hc20gIL3Mvq7FuLOrzdEotdXK/bj+KURDVCAoyPNTSU1EKQotICBqaW1teHJlZC5hc20gIL3Mvq7FuLOrzdEotdXK/bj+KURDVCAoTU1YKQotICBqaXNzMnJlZC5hc20gIL3Mvq7FuLOrzdEotdXK/bj+KURDVCAoU1NFMikKLQotICBqc2ltZGNwdS5hc20gIENQVSCkziBTSU1EIKW1pd2hvKXIpcGlp6XDpa8KLSAganNpbWRkamcuYXNtICBPUyCkziBTSU1EIKW1pd2hvKXIpcGlp6XDpa8gKGZvciBESkdQUCBWLjIpCi0gIGpzaW1kdzMyLmFzbSAgT1MgpM4gU0lNRCCltaXdobylyKXBpaelw6WvIChmb3IgV2luMzIpCi0gIGpzaW1kZ2NjLmMgICAgT1MgpM4gU0lNRCCltaXdobylyKXBpaelw6WvIChmb3IgZ2NjKQotCi0gIG1ha2VjZmcuYyAgICAgpaKlu6Xzpdal6rjAuOzN0cDfxOql1aWhpaSl6yBqc2ltZGNmZy5pbmMgpPK67sCupLmk6wotCi0gIGpzaW1kZXh0LmluYyAgpaKlu6Xzpdal6rjAuOylvaG8pbnN0aTOtqbEzKXYpcOlwKXVpaGlpKXrCi0gIGpkY3QuaW5jICAgICAgRENUILTYz6Kl1aWhpaSl683RpM6l2KXDpcCl1aWhpaSl6wotICBqY29sc2FtcC5pbmMgIL+ntvW01srRtLmhv6W1pfOl16XqpfOlsLTYz6Kl1aWhpaSl683RpM6l2KXDpcCl1aWhpaSl6wotCi0gIGpjb2xzYW1wLmggICAgv6e29bTWytG0uaG/pbWl86XXpeql86WwtNjPoqXVpaGlpKXrzdGkzqXYpcOlwKXVpaGlpKXrCi0gICAgICAgICAgICAgICAgpaql6qW4pcql68jHpMukz8K4ut+kt6TKpKSjw7jAuOyl2KXDpcCl1aWhpaSl66THoaIKLSAgICAgICAgICAgICAgICBTSU1EILK9pMfGs8b+pLWk7KS/tNi/9KTOwOu4wKSsta290qS1pOykxqSkpN6kuaGjCi0KLSAganBlZ2RsbC5kZWYgICBETEwgyMcgSlBFRyBMaWJyYXJ5IM3RpM602L/0pailr6W5pd2hvKXIxOq1waXVpaGlpKXrCi0gIGpwZWdkbGwucmMgICAgRExMIMjHIEpQRUcgTGlicmFyeSDN0aTOpdChvKW4peel86Xqpb2hvKW5xOq1waXVpaGlpKXrCi0gICAgICAgICAgICAgICAgpLOk7KTppM6l1aWhpaSl66TPoaJJSkcgSlBFRyBMaWJyYXJ5IKTypL2kzqTepN4gRExMIKTLCi0gICAgICAgICAgICAgICAgpLmk677sueeky7vIzdGkt6TepLkobWFrZWZpbGUudmNkbGwvbWFrZWZpbGUubWd3ZGxsKaGjCi0KLSAgofwgeDg2IFNJTUQgZXh0ZW5zaW9uIKTHsv7K0aSsssOkqKTppOykv6XVpaGlpKXrCi0KLSAgytG5ucbizcaky6TEpKSkxsbDpMu1rb3SpM6kyqSkpdWloaWkpeuky6TPoaJTSU1EILK9pMe/t6S/pMvGs8b+pLWk7KS/Ci0gILTYv/SkzsDruMCk5KS9pM64xqTTvdCkt7WtvdKholNJTUQgsr2ky7TYz6KkuaTrpd6lr6XtxOq1waTKpMmkrMTJssMKLSAgpLWk7KTGpKSk3qS5oaMKLQotICBqcGVnbGliLmggICAgIEpQRUcgpemlpKXWpeml6qTOpeGlpKXzpdilw6XApdWloaWkpesKLSAganBlZ2ludC5oICAgICBKUEVHIKXppaSl1qXppeqkzsbiyfTN0aXYpcOlwKXVpaGlpKXrCi0gIGptb3JlY2ZnLmggICAgSlBFRyCl6aWkpdal6aXqpM6+3LrZwN/E6qXYpcOlwKXVpaGlpKXrCi0KLSAgamRjdC5oICAgICAgICBEQ1QgtNjPoqXVpaGlpKXrzdGkzqXYpcOlwKXVpaGlpKXrCi0gICAgICAgICAgICAgICAgU0lNRCC96M39pMvFrKS5pOuk6KSmpMuhorT2pMSkq6TOytG/9KTOt7+k4srRubmktaTspMYKLSAgICAgICAgICAgICAgICCkpKTepLmhowotCi0gIGpjZGN0bWdyLmMgICAgvefK/bj+RENUpM6l3qXNobyluKXhpfOlyL3ozf0KLSAgamRkY3RtZ3IuYyAgICC11cr9uP5EQ1SkzqXepc2hvKW4peGl86XIvejN/QotCi0gIGpjY29sb3IuYyAgICAgUkdCLT5ZQ2JDciC/p7b1tNbK0bS5ICjI81NJTUQpCi0gIGpkY29sb3IuYyAgICAgWUNiQ3ItPlJHQiC/p7b1tNbK0bS5ICjI81NJTUQpCi0gIGpkbWVyZ2UuYyAgICAgv6e29bTWytG0uaG/paKlw6XXpbWl86XXpeql86Wwxf255yAoyPNTSU1EKQotICBqY3NhbXBsZS5jICAgIKXApaal86W1pfOl16XqpfOlsCAoyPNTSU1EKQotICBqZHNhbXBsZS5jICAgIKWipcOl16W1pfOl16XqpfOlsCAoyPNTSU1EKQotICAgICAgICAgICAgICAgIGpkc2FtcGxlLmMgpMukz6GiyPNTSU1EyMekziBoMXYyIKWipcOl16W1pfOl16XqpfOlsLTYv/QKLSAgICAgICAgICAgICAgICAoaDF2Ml91cHNhbXBsZSwgaDF2Ml9mYW5jeV91cHNhbXBsZSkgpOLEybLDpLWk7KTGpKSk3qS5oaMKLQotICBqZGh1ZmYuaCAgICAgIKXPpdWl3qXzyeS55qXHpbOhvKXJvejN/SAopdilw6XAKQotICBqZGh1ZmYuYyAgICAgIKXPpdWl3qXzyeS55qXHpbOhvKXJvejN/SAopbehvKWxpfOlt6XjpespCi0gIGpkcGh1ZmYuYyAgICAgpc+l1aXepfPJ5Lnmpcels6G8pcm96M39ICil16XtpbCl7KXDpbel1ikKLSAgICAgICAgICAgICAgICCks6TspOmkzqOzpMSkzqXVpaGlpKXrpM7K0bm5xcCkz6GiU0lNRCCyvaTHpM+koqTqpN6ku6TzoaMKLSAgICAgICAgICAgICAgICClx6Wzobylyb3ozf2kzsr9y6Gk8rj6zqiyvaS1pLukxqSipOqk3qS5oaMKLQotICBqZGNvZWZjdC5jICAgIERDVKXHobylv6XWpe2lw6WvpM6l3qXNobyluKXhpfOlyAotICAgICAgICAgICAgICAgIFNJTUQgsr2kyKTPtNi3uKTKpK+horDsyfSkzqWzobylyaTyuPrOqLK9pLWku6TGpKKk6qTepLmhowotCi0gIGpjb21hcGkuYyAgICAgsLW9zC/FuLOrILamxMwgQVBJILTYv/TE6rXBCi0gICAgICAgICAgICAgICAgU0lNRCCltaXdobylyKXBpaelw6WvtNi/9KTKpMmkrMTJssOktaTspMakpKTepLmhowotCi0gIGptZW1tZ3IuYyAgICAgSlBFRyBsaWJyYXJ5IM3RpeGl4qXqpd6lzaG8pbil4yAopeGlpKXzKQotICAgICAgICAgICAgICAgIFNJTUQgsr2ky8i8pKShojE2pdClpKXIpaKlyaXspbm2rbOmpMu556TDpL+l4aXiperOzrDopPIKLSAgICAgICAgICAgICAgICC+76TLMTal0KWkpcjDsbDMpMezzsrdpLmk66TopKaky8rRubmkt6TGpKKk6qTepLmhowotCi0gIGNqcGVnLmMgICAgICAgSlBFRyCwtb3MzdEgpbOl3qXzpcml6aWkpfOhpqXmobylxqWjpeqlxqWjCi0gIGRqcGVnLmMgICAgICAgSlBFRyDFuLOrzdEgpbOl3qXzpcml6aWkpfOhpqXmobylxqWjpeqlxqWjCi0gICAgICAgICAgICAgICAgLXYgpaql16W3peel86THpM4gU0lNRCC02M+ivvDK86TOyb28qKTkoaItbm9zaW1kIKTKpMmkzgotICAgICAgICAgICAgICAgIKWqpdelt6XnpfOluaWkpcOlwaSsxMmyw6S1pOykxqSkpN6kuaGjCi0KLSAgcmRibXAuYyAgICAgICBCTVAgpdWloaWkpevGyaTfuf6k36Xipbil5aG8pesKLSAgd3JibXAuYyAgICAgICBCTVAgpdWloaWkpeu98aStvdCkt6Xipbil5aG8pesKLSAgICAgICAgICAgICAgICBTSU1EILK9pMikz7TYt7ikyqSvoaKw7Mn0pM6ls6G8pcmk8rj6zqiyvaS1pLukxqSipOqk3qS5oaMKLQotICByZGdpZi5jICAgICAgIEdJRiCl1aWhpaSl68bJpN+5/qTfpeKluKXlobyl6yh2ZXJzaW9uIDZhKQotICB3cmdpZi5jICAgICAgIEdJRiCl1aWhpaSl673xpK290KS3peKluKXlobyl6yh2ZXJzaW9uIDZhKQotICAgICAgICAgICAgICAgIFVuaXN5cyCkziBHSUYgKExaVykgxsO19ry6uPqky8i8pKShonZlcnNpb24gNmEgpMeltaXdobylyAotICAgICAgICAgICAgICAgIKS1pOykxqSkpL8gY2pwZWcvZGpwZWcgpMekziBHSUYgpM7G/r3Qzs+k8sn8s+iktaS7pN6kt6S/oaMKLSAgICAgICAgICAgICAgICCks6TOIEdJRiCl4qW4peWhvKXrpM8gdmVyc2lvbiA2YSCkzqTipM6k8s6uzdGkt6TGpKSk3qS5oaMKLSAgICAgICAgICAgICAgICB2ZXJzaW9uIDZiIKTOIEdJRiCl4qW4peWhvKXrpM8gdW51c2VkLyCky6SipOqk3qS5oaMKLQotCi2io8qjv/Sl1aWhpaSl68LQsf7Ix6TOIGNqcGVnL2RqcGVnIChhbHR1aS8pCi0KLSAgYWx0dWkvIKTLpKKk66XVpaGlpKXrpM+hori1obkganBlZ2FsdHVpLnY2Yi50YXIuZ3ogpMikpKSmpdWloaWkpevMvqTHCi0gIMrMpMvH28nbpLWk7KTGpKSkv6TipM6kx6S5oaOks6TOIFNJTUQgyMekx6TPoaKjsaXVpaGlpKXryMcgY2pwZWcvZGpwZWcKLSAgpMjGsc3NpM4gU0lNRCDC0LH+sr2ky7TYpLmk672kwLWkyKGiQm9ybGFuZCBDKysgLyBNaWNyb3NvZnQgVkMrKyCkywotICCkqqSkpMal76G8peulyaWrobylycW4s6u96M39pPLNrbj6sr2kuaTrpL+k4aTOpbOhvKXJpPK98aStssOkqKS/pOKkzqTHpLmhowotCi0gIGFsdHVpL2NqcGVnLmMgICAgICAgICDKo7/0pdWloaWkpevC0LH+yMekziBjanBlZwotICBhbHR1aS9kanBlZy5jICAgICAgICAgyqO/9KXVpaGlpKXrwtCx/sjHpM4gZGpwZWcKLSAgYWx0dWkvUkVBRE1FLmFsdCAgICAgIGpwZWdhbHR1aS52NmIudGFyLmd6IKTLxrG6raS1pOykxqSkpL8gUkVBRE1FCi0gIGFsdHVpL3VzYWdlLmFsdCAgICAgICDKo7/0pdWloaWkpevC0LH+yMcgY2pwZWcvZGpwZWcgpM6l3qXLpeWloqXrKLq5yqwpCi0KLQotoqNTSU1EIMjHpMekz7vIpO+k7KTKpKSl1aWhpaSl67eyICh1bnVzZWQvKQotCi0gIHVudXNlZC8gpMukoqTrpdWloaWkpeukz6Gipaql6qW4pcql68jHpM4gSUpHIEpQRUcgc29mdHdhcmUgpMu8/c+/pLWk7KTGCi0gIKSkpL+krKGipLOkziBTSU1EIMjHpMekz7vIpO+k7KTKpKQvu8ikqKTKpKSl1aWhpaSl67eypKy8/aThpOmk7KTGpKSk3qS5oaMKLQotICB1bnVzZWQvaj9kY3Q/Pz8uYyAgICAgpaql6qW4pcql66TOo8O4wLjsyMcgRENUILTYv/QKLSAgdW51c2VkL2ptZW0qLiogICAgICAgIKW3pbmlxqXgsM3CuKXhpeKl6qXepc2hvKW4peMoZm9yIE1TLURPUy9NYWNpbnRvc2gpCi0gIHVudXNlZC8/P2dpZi5jICAgICAgICB2ZXJzaW9uIDZiIKTOIEdJRiCl4qW4peWhvKXrCi0gIHVudXNlZC9qY29uZmlnLiogICAgICClqqXqpbilyqXryMeky8nVwrCkziBqY29uZmlnLioKLSAgdW51c2VkL21hayouKiAgICAgICAgIKWqpeqluKXKpevIx6TLydXCsKTOIE1ha2VmaWxlLioKLQotCi0KLVtFT0ZdCmRpZmYgLS1naXQgYS9zaW1kX2luc3RhbGwuamEudHh0IGIvc2ltZF9pbnN0YWxsLmphLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4ZjgyNS4uMDAwMDAwMAotLS0gYS9zaW1kX2luc3RhbGwuamEudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLUluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBKUEVHIHNvZnR3YXJlIHJlbGVhc2UgNmIKLSAgd2l0aCB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkgdmVyc2lvbiAxLjAyCi0gICAgPT0gSU5TVEFMTCA9PQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotoqOks6TOpdWloaWkpeukzwotCi0gIKSzpM6l1aWhpaSl66THpM+holNJTUQgyMcgbGlianBlZyCl6aWkpdal6aXqpM6ls6XzpdGlpKXrpM67xcr9pPKy8sDiCi0gIKS3pN6kuaGjvqG86qTKpKyk6aGipLOks6THpM+lqqXqpbilyqXryMekziBsaWJqcGVnIKXppaSl1qXppeqkzrC3pKTK/QotICAopbOl86XRpaSl66TOu8XK/aG/pdel7aWwpeml4KTOw+akx6TOu8ikpMr9KaTypKKk68T4xdm/tMbApMakpKTrpMikpKSmCi0gIL/NpPLC0L7dpMuktaS7pMakpKS/pMCkraTepLmho6WqpeqluKXKpevIx6TOu8jN0cuhpMukxKSkpMakz6GiCi0gIGluc3RhbGwuZG9jICix0cq4KSCk8ruyvsikt6TGpK+kwKS1pKShowotCi0gICAgoqOloqW7pfOl1qXpIE5BU00gpM7G/rzqob+lpKXzpbmlyKG8pesKLSAgICCio6WzpfOl0aWkpeukzrvFyv0KLSAgICAgIKH8IE1pY3Jvc29mdCBWaXN1YWwgQysrIDYuMCCwyrnfpM7F/bnns6vIr7TEtq0oRGV2U3R1ZGlvKaTOvuy55wotICAgICAgofwgamNvbmZpZy5oIKTIIE1ha2VmaWxlIKTywarC8qS3pMals6XzpdGlpKXrpLmk6wotICAgICAgofwgVU5JWCC0xLatpMcgY29uZmlndXJlIKW5pa+l6qXXpcik8rvIpKYKLSAgICCio8qjv/Sl1aWhpaSl68LQsf7Ix6TOIGNqcGVnL2RqcGVnIChhbHR1aS8pCi0gICAgoqOls6G8pcmltaWkpbqk8ri6pOmkuaTLpM8KLSAgICCio8bDxOqkziBTSU1EIMy/zuGk8rvIzdGkt6TKpKSk6KSmpMukuaTrpMukzwotCi0KLaKjpaKlu6Xzpdal6SBOQVNNIKTOxv686qG/paSl86W5pcihvKXrCi0KLSAgpLOkziB4ODYgU0lNRCDIxyBsaWJqcGVnIKXppaSl1qXppeqkziBTSU1EILPIxKXJ9MqspM+hoqS9pM6k26TIpPOkyaSsCi0gIHg4NiCkzqWipbul86XWpeq4wLjspMe98aSrpOykxqSkpN6kuaGjpLOkzqWipbul86XWpeq4wLjspb2hvKW5pbOhvKXJpPIKLSAgpaKlu6Xzpdal66S5pOuky6TPoaJOQVNNIChOZXR3aWRlIEFzc2VtYmxlcikgpMikpKSmpaKlu6Xzpdal6aSsyazN16THpLmhowotICBNaWNyb3NvZnQgpM4gTUFTTSCk5KS9pM6437S5paKlu6Xzpdal6aTHpM+wt6SopN6ku6TzpM6kx8PtsNWkt6TGpK+kwKS1pKShowotICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAgTkFTTSAoTmV0d2lkZSBBc3NlbWJsZXIpIKTPoaK4+LywpbWlpKXIIGh0dHA6Ly9uYXNtLnNvdXJjZWZvcmdlLm5ldC8gb3IKLSAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NjIwOCCkq6TppcClpqXzCi0gIKXtobylyaTHpK2k3qS5oaNWZXIuMC45OC4yNSCwyrnfpM7I5rPTxaq/t6S3pKSl0KG8pbil56XzpM6k4qTOpKzJrM3XpMekuaGjCi0gILi9u/7FwCgyMDA2LzAyKaTHpM66x7+3yMekzyBWZXIuMC45OC4zOSCkx6S5oaMKLQotICCkyqSqoaJ4ODYgyMekziBEYXJ3aW4gpOQgTWFjIE9TIFggpMqkyaTHu8jN0aS5pOu+7LnnpM+hori9u/7FwKTHpM+k3qTACi0gIMC1vLCky6XqpeqhvKW5pLWk7KTGpKSkyqSkIFZlci4wLjk4LjQwILDKud+kzqXQobyluKXnpfOkzqTipM6krMmszdekx6S5oaMKLSAguL27/sXApMekz6GiVmVyLjAuOTguNDAgpM++5bWtpM64+LywpbWlpKXIpM4gQ1ZTIKXqpd2luKXIpeqkq6Tppb2hvKW5Ci0gIKWzobylyaTypcClpqXzpe2hvKXJpLekxqWzpfOl0aWkpeuhv6WkpfOluaXIobyl66S5pOvJrM3XpKykoqTqpN6kuaGjCi0KLSAgV2luZG93cyC3z6TOvuy556TPoaJuYXNtLTAuWFguWVktd2luMzIuemlwIChYWC5ZWSCky6TPpdChvKW4peel88jWueakrMb+pOspCi0gIKTIpKSkpsy+wbCkzqXVpaGlpKXrpPKlwKWmpfOl7aG8pcmkt6TGoaKkvaTspMu03qTepOyk6yBuYXNtdy5leGUgpPIKLSAgo8Ols6XzpdGlpKXppM68wrnUpdWloaWkpeu3sqSspaSl86W5pcihvKXrpLWk7KTGpKSk677sveqky6WzpdShvKS3pN6kuaGjCi0KLSAgs8a87yBQQy1VTklYIKTOvuy556TPoaJPUyCkzsfbydu4taTLpMaw3L+iutGk36XRpcOlsaG8pbikrMTztqGktaTspMakpKTrCi0gIL7sueekrKSipOqk3qS5pM6kx6GipN6kurrHvemky6S9pMGk6aTys87Hp6S3pMak36TGpK+kwKS1pKSho6S9pOykrKTKpKQKLSAgvuy556TPoaK+5bWtuPi8sKW1paSlyKSrpOmlvaG8pbmls6G8pckobmFzbS0wLlhYLllZLnRhci5neimk8qXApaal86XtobylyQotICCkt6TGpbOl86XRpaSl66G/paSl86W5pcihvKXrpLekxqSvpMCktaSkoaNsaW51eCCkzr7sueekxyBycG0gpdGlw6WxobyluKTyCi0gILC3pKik66W3pbmlxqXgpM6+7LnnpM+hor7lta24+LywpbWlpKXIpMukxiBycG0gpdClpKXKpeql0aXDpbGhvKW4pOLG/rzqCi0gIKTHpK2k3qS5oaMKLQotICDD7bDVxcCkyKS3pMahollBU00gKGh0dHA6Ly93d3cudG9ydGFsbC5uZXQvcHJvamVjdHMveWFzbS8pIKTPu8ik76TKpKSkxwotICCkr6TApLWkpKGjWUFTTSCkzyBOQVNNILjftLmk8uvwpMOkxqSkpN6kuaSsoaK4vbrfpM6l0KG8pbil56XzKDAuNC4wKaTHpM8KLSAgpN6kwLjftLnF2aSsxOOkpL7lpMul0KWwpKykoqTrKKWipcml7KW5t9e7u6SspN6kw6S/pK+lx6W/peml4aTKpbOhvKXJpPIKLSAgwLjArqS3pMakpKTrKaS/pOGhosX2yv2kzqXGpbmlyKTHpM8gWUFTTSCkx6Wipbul86XWpeukt6S/pbOhvKXJpM+k3qTDpL+krwotICDGsKStpN6ku6TzpMekt6S/oaOhysPtoaeks6TOIHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeQotICCkx6TPoaKkv6TIpKggWUFTTSCk8s3RpKSkxqTiIEFNRDY0IKTOIDY0Yml0IMLQsf6ky6TPpMqk6qTepLuk86GjocsKLQotCi2io6WzpfOl0aWkpeukzrvFyv0KLQotICCk26TIpPOkyaTOyfTKrKTHpaql6qW4pcql68jHpMjK0aTvpOqkoqTqpN6ku6TzpM6kx6GisMqyvKTOwOLMwKTHpM+hogotICCks6TOIFNJTUQgs8jEpcjHpMvGw82tpM7D7bDVxcCk8sPmv7Sky73SpNmk3qS5oaMKLQotCi0gIKH8IE1pY3Jvc29mdCBWaXN1YWwgQysrIDYuMCCwyrnfpM7F/bnns6vIr7TEtq0oRGV2U3R1ZGlvKaTOvuy55wotCi0gICAgpLOkzsfbydulu6XDpciky6TPoaJNaWNyb3NvZnQgVmlzdWFsIEMrKyA2LjAgzdGkzqXXpe2luKWnpa+lyKXVpaGlpKXrCi0gICAgpKzJ1cKwpLekxqSkpN6kuaGjVjYuMCCwyrnfpM4gVkMrKyCkzr7sueekz6GiVkMrKyA2LjAgpM6l1aWhpaSl66TyCi0gICAgytG0uSilpKXzpd2hvKXIKaS3pMa7yKTDpMakr6TApLWkpKGjTWljcm9zb2Z0IFZpc3VhbCBDKysgMjAwNSBFeHByZXNzCi0gICAgRWRpdGlvbiCky6TGoaKlpKXzpd2hvKXIob+ls6XzpdGlpKXrpMekraTrpLOkyKTys87Hp6S3pMakpKTepLmhowotCi0gICAgyv3LoaTPoaKk3qS6IHZjNnByb2ogpdWlqaXrpcCkzsPmpMukoqTrpdWloaWkpeuk8qGipb2hvKW5pdWloaWkpeu3sgotICAgICgqLmMpIKTOpKKk66XVpaml66XApMukuaTZpMaw3MawpLek3qS5oaOkvaS3pMYgbGlianBlZy5kc3cgpPKzq6SkpMYKLSAgICAopOKkt6SvpM+lpKXzpd2hvKXIpLekximhoqXhpcul5aG8pM4gpdOl66XJoqql0KXDpcGl06XrpckgpMekuaTZpMakywotICAgIKXBpaelw6WvpPLG/qTspMal06XrpcmkuaTspNCjz6PLpMekuaGjCi0KLSAgICCl76G8pa+luaXaobyluSBsaWJqcGVnLmRzdyCky6TPoaKwyrK8pM6l16Xtpbilp6WvpcikrLz9pOGk6aTspMakpKTepLmhowotCi0gICAgoqEgbWFrZWNmZy5kc3AKLQotICAgICAgpLOkzqXXpe2luKWnpa+lyKTPoaJtYWtlY2ZnLmMgpPKls6XzpdGlpKXrob+l6qXzpa+kt6TGoaKlq6W5pb+l4AotICAgICAgpdOl66XJpbmlxqXDpdekx6S9pOwobWFrZWNmZy5leGUppPK8wrnUpLehomxpYmpwZWcuZHNwIKTOpdOl66XJpMsKLSAgICAgIMmszdekysDfxOql1aWhpaSl6yBqc2ltZGNmZy5pbmMgpPK67qTrxq+kraTypLekxqSkpN6kuaGjCi0KLSAgICAgIKSzpOykz6GibGlianBlZy5kc3AgpKyls6XzpdGlpKXrpLWk7KTrwbCky8mspLqls6XzpdGlpKXrKLzCudQpCi0gICAgICCktaTspMqksaTspNCkyqTqpN6ku6TzoaMKLQotICAgIKKhIGxpYmpwZWcuZHNwCi0KLSAgICAgIEpQRUcgpemlpKXWpeml6iBsaWJqcGVnLmxpYiCk8qXTpeulyaS3pN6kuaGjbWFrZWNmZy5kc3AgpKy90M7PpLmk6wotICAgICAgwN/E6qXVpaGlpKXrIGpzaW1kY2ZnLmluYyCkrMmszdekx6S5oaMKLQotICAgIKKhIGNqcGVnLmRzcCwgZGpwZWcuZHNwLCBqcGVndHJhbi5kc3AsIHJkanBnY29tLmRzcCwgd3JqcGdjb20uZHNwCi0KLSAgICAgIElKRyBKUEVHIGxpYnJhcnkgpMvJ1cKwpLekxqSkpOultaXzpdel66GmpaKl16XqpbGhvKW3peel86THpLmhowotICAgICAgY2pwZWcgpM8gSlBFRyCwtb3MpPKhomRqcGVnIKTPIEpQRUcgxbizq6TyoaJqcGVndHJhbiCkzyBKUEVHCi0gICAgICCl1aWhpaSl66TOytG0uaTypLek3qS5oaNyZGpwZ2NvbSCkyCB3cmpwZ2NvbSCkz6GiSlBFR6XVpaGlpKXrCi0gICAgICDD5qTOpcalraW5pcils6XhpfOlyMq4pPLB4LrupLek3qS5oaMKLQotICAgIKKhIGFwcHRlc3QuZHNwCi0KLSAgICAgIKTHpK2koqSspMOkvyBjanBlZywgZGpwZWcsIGpwZWd0cmFuIKTLwtCkt6TGtMrDsaTKxrC67qXGpbmlyKTyCi0gICAgICCkt6TepLkobWFrZSB0ZXN0IKTIxrHF+Smho6TepLqhoqSzpOyk6aTOpb2l1aXIpMe8wrrdpMuy6MH8pdWloaWkpesKLSAgICAgIKTyytG0uaS1pLuhoqS9pM690M7PpPIgZmMuZXhlIKTHyOaz06S3pN6kuaGjIkZDOiDB6rDjxcCkz7ihvdAKLSAgICAgIKS1pOyk3qS7pPOkx6S3pL8iIKTIpKSkpqXhpcOlu6G8pbikrKO2svPJvbyopLWk7KTspNChoqXXpe2lsKXppeCkzwotICAgICAgwLWkt6SvxrCkpKTGpKSk3qS5oaMKLQotICAgIEpQRUcgpemlpKXWpeml6iBsaWJqcGVnLmxpYiCk8sK+pM6lvaXVpciky6XqpfOlr6S5pOukv6ThpMsgbGlianBlZy5kc3AKLSAgICCk8sK+pM6l76G8pa+luaXaobyluaG/pb2l6qXlobylt6XnpfOky7TepOGk677sueekz6GibWFrZWNmZy5kc3AgpOIKLSAgICDJrKS6xrGkuKXvobylr6W5pdqhvKW5ob+lvaXqpeWhvKW3peel86TLtN6k4aGivu+kyyBtYWtlY2ZnLmRzcCCkrAotICAgIGxpYmpwZWcuZHNwIKTopOqk4sDopMul06XrpcmktaTspOuk6KSmpMuhorDNwri02Le4pPLA38TqpLekxqSvpMCktaSkoaMKLSAgICCks6TspM+hosDopMu90qTZpL+k6KSmpMuhomxpYmpwZWcuZHNwIKTPIG1ha2VjZmcuZHNwIKSsvdDOz6S5pOvA38TqCi0gICAgpdWloaWkpesganNpbWRjZmcuaW5jIKTyyazN16TIpLekxqSkpOukv6ThpMekuaGjCi0KLSAgICDA38Tqy6Gkz6GiKFZDKysgNi4wpM6+7LnnKSCl4aXLpeWhvKTOIKXXpe2luKWnpa+lyCCiqiCwzcK4tNi3uCCkxwotICAgIGxpYmpwZWcgpPLBqsLypLehorK8pM6w7M33pM7D5qTOIG1ha2VjZmcgpMulwaWnpcOlr6Tyxv6k7KTepLmhowotCi0KLSAgofwgamNvbmZpZy5oIKTIIE1ha2VmaWxlIKTywarC8qS3pMals6XzpdGlpKXrpLmk6wotCi0gICAgV2luZG93cyC3z6TOpbOl86XRpaSl6aTOvuy556THoaKls6XepfOlyaXppaSl86SrpOmls6XzpdGlpKXrpLmk677suecKLSAgICCkz6GipLOkzsr9y6Gk8qTIpMOkxqSvpMCktaSkoaMKLQotICAgIMr9y6Gkz6GiydXCsKTOIGpjb25maWcuKiCkyCBNYWtlZmlsZS4qIKTOw+akq6TpxazA2qTKpOKkzqTypL2k7KS+pOwKLSAgICCw7KTEpLqkxMGqpNOhoqS9pOykvqTsIGpjb25maWcuaCCkyCBNYWtlZmlsZSCky8y+wbCk8srRpKik3qS5oaMKLSAgICCkvaS3pMahoqW9obyluaXVpaGlpKXrpM6koqTrpcelo6Xspa+lyKXqKKXVpaml66XAKaTypaul7KXzpcilx6WjpewKLSAgICClr6XIpeqky6S3pMahoqWzpd6l86XJpemlpKXzpMcgbWFrZSAoVkMrKyCkzr7sueekzyBubWFrZSmkyKW/paSl1wotICAgIKS5pOyk0KPPo8ukx6S5oaO45aTPvKvGsMWqpMuhomxpYmpwZWcgpemlpKXWpeml6qTIoaKltaXzpdel66Wipdel6gotICAgIKWxobylt6XnpfMoY2pwZWcgpOQgZGpwZWcgpMqkySmkrKWzpfOl0aWkpeuktaTspN6kuaGjCi0KLSAgICDJ1cKwpLekxqSkpOsgamNvbmZpZy4qIKTIIE1ha2VmaWxlLiogpM+horDKsrykzr3ozf23z6TLwtCx/qS3pMakpKTepLmhowotICAgIKTKpKqhoqWqpeqluKXKpevIx6TLydXCsKS3pMakpKTrIGpjb25maWcuKiCkyCBNYWtlZmlsZS4qIKTPoaKks6TOCi0gICAgU0lNRCDC0LH+yMekx6TPu8jN0aTHpK2k3qS7pPMopb2hvKW5pdWloaWkpeukzrm9wK6krMrRpO+kw6TGpKSk66S/pOEpoaMKLQotICAgIKGmIGpjb25maWcuZGogICYgbWFrZWZpbGUuZGogIC0tIERKR1BQIHYyLjAgb3IgbGF0ZXIKLSAgICChpiBqY29uZmlnLmJjNSAmIG1ha2VmaWxlLmJjNSAtLSBCb3JsYW5kIEMrKyBDb21waWxlciA1LjUgKHdpbjMyKQotICAgIKGmIGpjb25maWcubWd3ICYgbWFrZWZpbGUubWd3LCBtYWtlZmlsZS5tZ3dkbGwgLS0gTWluR1cKLSAgICChpiBqY29uZmlnLnZjICAmIG1ha2VmaWxlLnZjICwgbWFrZWZpbGUudmNkbGwgIC0tIFZDKysgNi4wIG9yIGxhdGVyCi0gICAgoaYgamNvbmZpZy5saW51eCAmIG1ha2VmaWxlLmxpbnV4IC0tIGxpbnV4Ci0KLSAgICCks6TspOmwyrOwpM6ls6XzpdGlpKXppMvC0LH+pLWku6Trvuy556TPoaJpbnN0YWxsLmRvYyCky73xpKSkxqSipOsKLSAgICCk6KSmpMuhoqTepLogY2tjb25maWcuYyCk8qWzpfOl0aWkpeuhv7zCudSkt6TGIGpjb25maWcuaCCk8sC4wK6kt6GiCi0gICAgbWFrZWZpbGUudW5peCCk4qS3pK+kzyBtYWtlZmlsZS5hbnNpIKTyvOq67rbIpMfK1L24pLekxiBNYWtlZmlsZSCk8gotICAgILruwK6kt6TGpK+kwKS1pKShowotCi0gICAgsMqyvKGis8als6XzpdGlpKXppMu4x82tpM7D7bDVxcCk8r3SpNmk3qS5oaMKLQotICAgIKKhIGpjb25maWcuZGogICYgbWFrZWZpbGUuZGogIC0tIERKR1BQIHYyLjAgb3IgbGF0ZXIuCi0KLSAgICAgILLEx72kyrjCpOq/t6S3pKSl0KG8pbil56XzpPK7yM3RpLekxqSvpMCktaSkoaNESkdQUCAyLjAzICsgZ2NjIDMuNC40Ci0gICAgICArIGJpbnV0aWxzIDIuMTYuMSCkyKSkpKbByKTfueek76S7pMfGsLrupPKzzsenpLekxqSkpN6kuaGjCi0KLSAgICAgIG1ha2VmaWxlLmRqIKTLpM+homdjYyAzLjQueCC4/qSxpM6ls6XzpdGlpKXrpaql16W3peel86SsvfGkq6TspMYKLSAgICAgIKSkpN6kuaTOpMehomdjYyAzLjQueCCwyrOwpMekpqTepK+ls6XzpdGlpKXrpMekraTKpKS+7LnnpM+hosWsxfakywotICAgICAgvfGkrcS+pLekxrvIpMOkxqSvpMCktaSkoaMKLQotICAgIKKhIGpjb25maWcuYmM1ICYgbWFrZWZpbGUuYmM1IC0tIEJvcmxhbmQgQysrIENvbXBpbGVyIDUuNSAod2luMzIpCi0KLSAgICAgILK/pM7M5MLqpOKkyqSvpbOl86XRpaSl66TPpMekraTrpM+kuqTHpLmkrKGipLOkziBCQ0MgNS41IKTOvuy556TPoaIKLSAgICAgIKTbpMik86TJpM6lsaG8pbmkxyBTU0UvU1NFMiCkrMawuu6kt6TepLuk86Gjzf3Ns6TPoaJCQ0MgNS41IKTLydXCsKTOCi0gICAgICCl6qXzpasoaWxpbmszMi5leGUppKy4xaSvoaJTU0XE6r/0pPIxNqXQpaSlyLats6aloqXJpeyluaTLx9vD1qS5pOsKLSAgICAgIKSzpMikrKTHpK2kyqSkpL+k4aTHpLmhowotCi0gICAgICCkvaTOpL+k4aGiQkNDIDUuNSCk8rvIpKa+7LnnpM8gU1NFL1NTRTIgpM6ltaXdobylyKTyuu+9/Ci45b3SKaS3pMYKLSAgICAgIKWzpfOl0aWkpeukuaTrpLOkyKTypKq0q6ThpKSkv6S3pN6kuaGjCi0KLSAgICCioSBqY29uZmlnLm1ndyAmIG1ha2VmaWxlLm1ndywgbWFrZWZpbGUubWd3ZGxsIC0tIE1pbkdXCi0KLSAgICAgILLEx72kyrjCpOq/t6S3pKSl0KG8pbil56XzpPK7yM3RpLekxqSvpMCktaSkoaNnY2MgMy40LjQgKyBiaW51dGlscwotICAgICAgMi4xNi45MSCkyKSkpKbByKTfueek76S7pMfGsLrupPKzzsenpLekxqSkpN6kuaGjCi0KLSAgICAgIKTepL+hokdOVSBtYWtlIKSspaSl86W5pcihvKXrpLWk7KTGpKSk66SzpMik4smszdekx6S5oaNNaW5HVyCkzr7sueehogotICAgICAgKG1ha2UuZXhlIKTHpM+kyqSvKSBtaW5ndzMyLW1ha2UuZXhlIKTIpKSkpsy+wbCkx6WkpfOluaXIobyl66S1pOwKLSAgICAgIKTepLmkzqTHoaJtYWtlIKTHpM+kyqSvIG1pbmd3MzItbWFrZSCkyKW/paSl16S5pOvJrM3XpKykoqTqpN6kuaGjCi0KLSAgICAgIKSzpOyk6aTOIG1ha2VmaWxlIKTLpM+homdjYyAzLjQueCC4/qSxpM6ls6XzpdGlpKXrpaql16W3peel86SsvfGkqwotICAgICAgpOykxqSkpN6kuaTOpMehomdjYyAzLjQueCCwyrOwpMekpqTepK+ls6XzpdGlpKXrpMekraTKpKS+7LnnpM+hogotICAgICAgxazF9qTLvfGkrcS+pLekxrvIpMOkxqSvpMCktaSkoaMKLQotICAgICAgbWFrZWZpbGUubWd3IKTPoaJsaWJqcGVnIKXppaSl1qXppeqk8sDFxaql6aWkpdal6aXqKGxpYmpwZWcuYSmkywotICAgICAgpbOl86XRpaSl66S3pL++5aTHoaKks6TOIGxpYmpwZWcuYSCk8qXqpfOlr6S3pL8gY2pwZWcsIGRqcGVnLAotICAgICAganBlZ3RyYW4gpPK67sCupLek3qS5oaNtYWtlZmlsZS5tZ3dkbGwgpM+homxpYmpwZWcgpemlpKXWpeml6qTyCi0gICAgICBETEwoanBlZzYyLmRsbCmky6WzpfOl0aWkpeukt6S/vuWkx6GipLOkziBqcGVnNjIuZGxsIKTypeql86WvpLekvwotICAgICAgY2pwZWcsIGRqcGVnLCBqcGVndHJhbiCk8rruwK6kt6TepLmhowotCi0gICAgoqEgamNvbmZpZy52YyAgJiBtYWtlZmlsZS52YyAsIG1ha2VmaWxlLnZjZGxsICAtLSBWQysrIDYuMCBvciBsYXRlcgotCi0gICAgICBWQysrIDYuMCCwyrnfpMqk6bK/pM7M5MLqpOKkyqSvpbOl86XRpaSl66THpK2k66TPpLqkx6S5oaOl1aXqobykxwotICAgICAguPizq6S1pOykxqSkpOsgTWljcm9zb2Z0IFZpc3VhbCBDKysgVG9vbGtpdCAyMDAzIKTHpOKhom5tYWtlLmV4ZQotICAgICAgpKylpKXzpbmlyKG8peuktaTspMakpKTspNCls6XzpdGlpKXrpMekraTepLmhowotCi0gICAgICBtYWtlZmlsZS52YyCkz6GibGlianBlZyCl6aWkpdal6aXqpPLAxcWqpemlpKXWpeml6ihsaWJqcGVnLmxpYimkywotICAgICAgpbOl86XRpaSl66S3pL++5aTHoaKks6TOIGxpYmpwZWcubGliIKTypeql86WvpLekvyBjanBlZywgZGpwZWcsCi0gICAgICBqcGVndHJhbiCk8rruwK6kt6TepLmho21ha2VmaWxlLnZjZGxsIKTPoaJsaWJqcGVnIKXppaSl1qXppeqk8gotICAgICAgRExMKGpwZWc2Mi5kbGwppMuls6XzpdGlpKXrpLekv77lpMehoqSzpM4ganBlZzYyLmRsbCCk8qXqpfOlr6S3pL8KLSAgICAgIGNqcGVnLCBkanBlZywganBlZ3RyYW4gpPK67sCupLek3qS5oaMKLQotICAgIKKhIGpjb25maWcubGludXggJiBtYWtlZmlsZS5saW51eCAtLSBsaW51eAotCi0gICAgICCzxrzvpM4gbGludXggpMvC0LH+pLek3qS5pKyhomxpbnV4IKTOvuy556TPIGNvbmZpZ3VyZSCluaWvpeql16XIpPIKLSAgICAgILvIpKaks6TIpPK2r6SvpKq0q6ThpKSkv6S3pN6kuaGjCi0KLQotICCh/CBVTklYILTEtq2kxyBjb25maWd1cmUgpbmlr6XqpdelyKTyu8ikpgotCi0gICAgs8a876TOIFBDLVVOSVggpM6+7LnnpMqkyaGipbelp6XroaaluaWvpeql16XIpPLB9qTppLuk66SzpMikzqTHpK2k6wotICAgILTEtq2kzr7sueekz6GiY29uZmlndXJlIKW5pa+l6qXXpcik8rvIpKakyLTKw7Gky6WzpfOl0aWkpeukx6StpN6kuaGjCi0KLSAgICAgICQgLi9jb25maWd1cmUgLS1lbmFibGUtc2hhcmVkIC0tZW5hYmxlLXN0YXRpYwotICAgICAgJCBtYWtlCi0gICAgICAkIG1ha2UgdGVzdCAgICAgICiiq8awuu6lxqW5pcihqMmszdeky7H+pLikxikKLSAgICAgICMgbWFrZSBpbnN0YWxsCi0KLSAgICCks6TOyv3LoaTHpM+horDKsrykzqXXpemlw6XIpdWlqaG8peCkx6WzpfOl0aWkpeukx6StpOuks6TIpPKzzsenpLekxgotICAgIKSkpN6kuaGjpLOk7LDKs7CkziBVTklYILfPIE9TIKTHpOKls6XzpdGlpKXrpM+yxMe9pMCkyLvXpO+k7KTepLmkrKGiCi0gICAgvOO0s6TOvOrEvqS3pKzJrM3XpMukyqTrvuy556TipKKk66SrpMi716SkpN6kuaGjCi0KLSAgICChplZpbmUgTGludXggMi42cjQgKGdjYyAyLjk1LjMpIKSqpOik0yBWaW5lIExpbnV4IDMuMiAoZ2NjIDMuNC40KQotICAgIKGmRmVkb3JhIGNvcmUgMyAoZ2NjIDMuNC4yKSCkqqTopNMgRmVkb3JhIGNvcmUgNCAoZ2NjIDQuMC4wKQotICAgIKGmRnJlZUJTRCA1LjQgKGdjYyAzLjQuMikgpKqk6KTTIEZyZWVCU0QgNi4wIChnY2MgMy40LjQpCi0gICAgoaZOZXRCU0QgMi4wIChnY2MgMy4zLjMpIKSqpOik0yBOZXRCU0QgMy4wIChnY2MgMy4zLjMpCi0gICAgoaZTb2xhcmlzIDEwIDEvMDYgZm9yIHg2NC94ODYgKGkzODYtcGMtc29sYXJpczIuMTApCi0gICAgoaZEYXJ3aW4gOC4wLjEgZm9yIHg4NiAoaTM4Ni1hcHBsZS1kYXJ3aW44LjAuMTsgZ2NjIDMuMykKLSAgICChpk1pbkdXICYgTVNZUyAoZ2NjIDMuNC40KQotICAgIKGmY3lnd2luIChnY2MgMy40LjQpCi0KLSAgICDGsbqtpM4gY29uZmlndXJlIKW5pa+l6qXXpcikzyBHTlUgYXV0b2NvbmYgpMfAuMCupLWk7KS/pOKkzqTHpLmhowotICAgIKSzpM4gY29uZmlndXJlIKW5pa+l6qXXpcikz6GisOzIzMWqpMogY29uZmlndXJlIKW5pa+l6qXXpcikrMenvLGkuaTrCi0gICAgpbmlpKXDpcGlqqXXpbel56XzpM7CvqTLoaKwyrK8pM6luaWkpcOlwaTyx6e8saS3pN6kuaGjCi0KLSAgICCh+yAtLWVuYWJsZS1zaGFyZWQgLyAtLWVuYWJsZS1zdGF0aWMKLQotICAgICAgLS1lbmFibGUtc2hhcmVkIKTyu9jE6qS5pOukyKGiR05VIGxpYnRvb2wgpPK7yKTDpMa2ps2tpemlpKXWpeml6qTyCi0gICAgICC67sCupLek3qS5oaMtLWVuYWJsZS1zdGF0aWMgpPK72MTqpLmk66TIoaLGsaS4pK8gR05VIGxpYnRvb2wgpPIKLSAgICAgILvIpMOkxsDFxaql6aWkpdal6aXqpPK67sCupLek3qS5oaPOvsr9pPK72MTqpLmk66TIoaK2ps2tpemlpKXWpeml6gotICAgICAgpMjAxcWqpemlpKXWpeml6qTOzr7K/aTyuu7ArqS3pN6kuaGjtdWky6SzpM7Ovsr9pMik4rvYxOqkt6TKpKSkyKGiCi0gICAgICBHTlUgbGlidG9vbCCk8rvIpO+kuqTLwMXFqqXppaSl1qXppeqkzqTfpPK67sCupLek3qS5oaMKLQotICAgICAgpbeluaXGpeCky6WkpfOluaXIobyl66S5pOul6aWkpdal6aXqpPK67sCupLmk677sueekz86+yv2k8rvYxOqkuaTrCi0gICAgICDJrM3XpKykoqTrpMekt6TnpKahowotCi0gICAgofsgLS1kaXNhYmxlLW1teCAvIC0tZGlzYWJsZS0zZG5vdyAvIC0tZGlzYWJsZS1zc2UgLyAtLWRpc2FibGUtc3NlMgotCi0gICAgICDGw8TqpM4gU0lNRCDMv87hpbulw6XIpM6ltaXdobylyCils6G8pckppPK67738pLekxqWzpfOl0aWkpeukt6TepLmhowotCi0gICAgofsgLS1lbmFibGUtdWNoYXItYm9vbGVhbgotCi0gICAgICClvaG8pbmls6G8pcnD5qTOIGJvb2wgt7+kzsTqtcGk8iBpbnQgt7+kx6TPpMqkryB1bnNpZ25lZCBjaGFyILe/pMsKLSAgICAgIMrRubmkt6TepLmho6SzpM6lqqXXpbel56XzpM/EzL7vpM8oxsOky8mszdekx6TKpKS4wqTqKbvIzdGkt6TKpKSkxwotICAgICAgpK+kwKS1pKSho6SzpOykz6GiTWluR1cgpMqkyaTOIFdpbmRvd3MgvuWkziBVTklYILTEtq2ky6TGoaJib29sILe/Ci0gICAgICCkzsTqtcGk8iBXaW5kb3dzIKTOvay0t6TLueek76S7pOukv6ThpMvN0bDVpLWk7KTGpKSk66TipM6kx6S5oaMKLQotICAgILDKsryhorPGpdel6aXDpcil1aWpobyl4KTLuMfNraTOw+2w1cXApPK90qTZpN6kuaGjCi0KLSAgICCioSCzxrzvIGxpbnV4IKXHpaOluaXIpeql06Xlobylt6XnpfMKLQotICAgICAgpOik26TJuMWkpKTipM6kx6TKpKS4wqTqoaK+5bWtpM686r3npMeyv6TOzOTC6qTipMqkr6WzpfOl0aWkpeukx6StpOsKLSAgICAgIKTPpLqkx6S5oaMKLQotICAgICAgvuW1raTOvOq956THtqbNraXppaSl1qXppeqk8rruwK6kt6S/vuy556GipL2kzqXQobyluKXnpfPI1rnmpM8KLSAgICAgIDYyLjEuMCAopdWloaWkpevMvqGnbGlianBlZy5zby42Mi4xLjApIKTIpMqk6qTepLmho6SzpOykz8GwvdKkt6S/Ci0gICAgICCkyKSqpOqhoqWqpeqluKXKpevIxyil1aWhpaSl68y+oadsaWJqcGVnLnNvLjYyLjAuMCmkyKXQpaSlyqXqpeyl2aXrCi0gICAgICCkx6TOvuWwzLjftLnAraSspKKk6qTepLmkzqTHoaKlqqXqpbilyqXryMekyKS9pM6k3qTew9akrbS5pKik66SzpMgKLSAgICAgIKSspMekraTepLmhowotCi0gICAgICBycG0gpPK7yKTDpL+l0aXDpbGhvKW4tMnN/aTyus7N0aS3pMakpKTrpcelo6W5pcil6qXTpeWhvKW3peel86THpM+hogotICAgICAgxrG6raTOIHNwZWMgpdWloaWkpesgKGxpYmpwZWcuc3BlYykgpOKktM34zdGkpKS/pMCksaTepLmho6SzpOykz6GiCi0gICAgICBWaW5lIExpbnV4IDMuMiCkqqTopNMgRmVkb3JhIGNvcmUgNCCkx6TOxrC67qTys87Hp6S3pMakpKTepLmhowotCi0gICAgoqEgeEJTRCCl1aWhpd+l6iAoRnJlZUJTRC9OZXRCU0QvT3BlbkJTRCkKLQotICAgICAguse24aTOpdChvKW4peel86TOIEZyZWVCU0QgpMggTmV0QlNEIKTLtNikt6TGpM+hoqWzpfOl0aWkpeukx6StpOsKLSAgICAgIKSzpMik8rPOx6ekt6TGpKSk3qS5oaNPcGVuQlNEIKTLtNikt6TGpOLM5MLqpM+kyqSkpMi716SkpN6kuaGjCi0gICAgICCkv6TAoaKlqqXWpbilp6Wvpcil1aWpobyl3qXDpcikyyBhLm91dCCk8rvIpMOkv7jFpKSk4qTOpMu02KS3pMakz6GiCi0gICAgICCl1aWhpaSl66XVpamhvKXepcOlyKTOvO/O4KTisOyx/iBjb25maWd1cmUgpbmlr6XqpdelyKTLpMa4ob3QpMekraTrCi0gICAgICCk6KSmpMukt6TGpKKk6qTepLmkrKGixrC67qTPzKSzzsenpMekuaGjCi0KLSAgICAgIEZyZWVCU0QgpM6+7LnnoaK+5bWtpM686r3npMe2ps2tpemlpKXWpeml6qTyuu7ArqS3pL++7LnnoaKkvaTOCi0gICAgICCl0KG8pbil56XzyNa55qTPIDkgKKXVpaGlpKXrzL6hp2xpYmpwZWcuc28uOSkgpMikyqTqpN6kuaGjpLOk7KTPoaIKLSAgICAgIHBvcnRzIGNvbGxlY3Rpb24gpM7D5qTLpKKk67j4vLDIx6TOpdChvKW4peel88jWueaky73gpLikv6TipM6kx6GiCi0gICAgICAopdClpKXKpeq+5bDMuN+0uaTKpM6kxym4+LywyMekyKS9pM6k3qTew9akrbS5pKik66SzpMikrKTHpK2k3qS5oaMKLSAgICAgIE5ldEJTRC9PcGVuQlNEIKTOvuy556TOpdChvKW4peel88jWueakzyA2Mi4xLjAgKKXVpaGlpKXrzL6hpwotICAgICAgbGlianBlZy5zby42Mi4xLjApIKTLpMqk6qTepLkopdClpKXKpeq+5bDMuN+0uSmhowotCi0gICAgoqEgU29sYXJpcyAxMAotCi0gICAgICC67rzUpM6lxqW5pcikx6TPoaLAtb7vpMuls6XzpdGlpKXrpMekraTGoaK2ps2tpemlpKXWpeml6qSspdClpKXKpeoKLSAgICAgILjftLmky6TKpOuks6TIpPKzzsenpLekxqSkpN6kuSil1aWhpaSl68y+oadsaWJqcGVnLnNvLjYyLjEuMCmhowotICAgICAgpMekuaSsoaKks6TOIFNJTUQgyMcgbGlianBlZyCl6aWkpdal6aXqpM8gQU1ENjQgpMukz7i9u/7FwKTHpM/C0LH+Ci0gICAgICCkt6TGpKSkyqSkpL+k4aGiMzJiaXTIx6TOpemlpKXWpeml6qS3pKu67qTspN6ku6TzoaMKLQotICAgIKKhIERhcndpbiBmb3IgeDg2Ci0KLSAgICAgILruvNSkzqXGpbmlyKTHpM+hosC1vu+ky6WzpfOl0aWkpeukx6StpMahoramza2l6aWkpdal6aXqpKyl0KWkpcql6gotICAgICAguN+0uaTLpMqk66SzpMik8rPOx6ekt6TGpKSk3qS5KKXVpaGlpKXrzL6hp2xpYmpwZWcuNjIuMS4wLmR5bGliKaGjCi0gICAgICB4ODYgyMcgTWFjIE9TIFggpMek4qGipbOl86XRpaSl66S1pKikx6StpOyk0Mawuu6kuaTrpOKkzqTIu9ek76TspN6kuaGjCi0KLSAgICAgILi9u/7FwKTHpM+hoqWipbul86XWpekgbmFzbSCkziBEYXJ3aW4gpNikzqW1pd2hvKXIpKy9vcqspMekyqSkpL+k4aGiCi0gICAgICCk5KTkpcil6qXDpa2hvKTKpbOhvKXJpMcgRGFyd2luIC8gTWFjIE9TIFggpMvC0LH+pLWku6TGpKSk3qS5pKyhogotICAgICAgxrC67qTLpM+k3qTDpL+kr8zkwuqkyqSkpM+kuqTHpLmhowotCi0gICAgoqEgTWluR1cgJiBNU1lTIChnY2MgMy40LjQpCi0KLSAgICAgIE1pbkdXIKTOvuy556TPoaLJ1cKwpM4gbWFrZWZpbGUubWd3IC8gbWFrZWZpbGUubWd3ZGxsIKTyu8ikpqSzpMik8gotICAgICAgv+S+qaS3pN6kuaSsoaJNU1lTIKSspaSl86W5pcihvKXrpLWk7KTGpKSk7KTQIGNvbmZpZ3VyZSCluaWvpeql16XICi0gICAgICCk4rvIpKik3qS5oaOks6TOvuy556TPoaJjb25maWd1cmUgpbmlr6XqpdelyKTywfak6aS7pOu63aTLCi0gICAgICAtLWVuYWJsZS11Y2hhci1ib29sZWFuIKTyyaykurvYxOqkt6TGpK+kwKS1pKSho6SzpKakuaTrpLOkyKTHoaIKLSAgICAgIMK+pM4gV2luZG93cyC3z6TOvejN/bfPKFZDKyukyqTJKaSsvdDOz6S5pOuls6G8pcmkyKXQpaSlyqXquN+0uaTLCi0gICAgICCkyqTqpN6kuaGjCi0KLSAgICCioSBjeWd3aW4gKGdjYyAzLjQuNCkKLQotICAgICAgpN6kusPtsNWkuaTZpK3FwKTPoaJjeWd3aW4gpM6+7LnnoaJjeWd3aW4gpKuk6bj4vLCky6XqpeqhvKW5pLWk7KTGCi0gICAgICCkpKTrIERMTCAoY3lnanBlZy02Mi5kbGwpIKTIpM+l0KWkpcql6rjftLmky6TPpMqk6qTepLuk86GjpLOk7KTPoaIKLSAgICAgILj4vLDIx6TOpdClpKXKpeqky6TPIGxvc3NsZXNzIGpwZWcgcGF0Y2ggKGxqcGVnLTZiLnRhci5neikgpMikpKSmCi0gICAgICC9pMC1pdGlw6XBpKy03qTepOykxqSkpOukv6ThpMehosX2U0lNRMjHpMvC0KS3pMaks6TOpdGlw6XBpPLFrM3RCi0gICAgICCkuaTrpLOkyKTPuqTG8aTApKuk6aTHpLmhowotCi0gICAgICCl0KWkpcql6rjftLmkx6TPpMqkpKS/pOGhorj4vLCl6qXqobylucjHpM4gRExMIKTypLOkzlNJTUTIx6THw9akrQotICAgICAgtLmkqKTrpLOkyKTPpMekraTepLuk86GjpL2kzqS/pOHF9lNJTUTIx6TOIERMTCCkzyBjeWdqcGVnLTE2Mi5kbGwKLSAgICAgIKTIpKSkpsy+wbCky6TKpOuk6KSmpMukt6TGpKKk6qTepLmho6SzpOyk8qW3pbmlxqXgpMulpKXzpbmlyKG8peukuaTrCi0gICAgICCks6TIpOKkx6StpN6kuaSsoaKks6TOU0lNRMjHpM4gRExMIKTyzfjN0aS5pOuky6TPoaJKUEVHIKXppaSl1qXppeqk8gotICAgICAgu8jN0aS3pMakpKTrpb2l1aXIpPK6xqWzpfOl0aWkpeuhv7rGpeql86WvpLmk68mszdekrKSipOqk3qS5oaMKLQotICAgICAgpMqkqqGipLOkziBETEwgpMukxKSxpOmk7KTrpdChvKW4peel88jWueak8srRpKikv6SxpOyk0KGiY29uZmlndXJlCi0gICAgICCluaWvpeql16XIpPLB9qTppLuk68GwpMsgY29uZmlnLnZlciCkzsbizcak8srRubmkt6TGpK+kwKS1pKShowotCi0KLaKjyqO/9KXVpaGlpKXrwtCx/sjHpM4gY2pwZWcvZGpwZWcgKGFsdHVpLykKLQotICCltaXzpdel66Wipdel6qWxobylt6XnpfOkziBjanBlZyCkyCBkanBlZyCky6TEpKSkxqTHpLmkrKGipcel1aWppeulyKTOCi0gIL71wtakx6WzpfOl0aWkpeuktaTspOuk4qTOKMK+pM6lvaG8pbml1aWhpaSl67eypMjGsaS4vuy96qTLpKKk6yBjanBlZy5jCi0gIKTIIGRqcGVnLmMpIKTPoaKw7MXZpMuw7KTEpM6l1aWhpaSl66S3pKvK0bS5pMekraTKpKSk4qTOpMekuaGjpMSk3qTqoaIKLSAgxv7Oz6XVpaGlpKXrpM+ls6XepfOlyaXppaSl877lpMuw7KTEpLekq7vYxOqkx6StpLqhor3Qzs+kz8m4veC90M7PpKsKLSAgLW91dGZpbGUgpaql16W3peel86THu9jE6qS3pL+l1aWhpaSl66TLvfGkrb3QpLWk7KTepLmho7PGvO+kziBVTklYILfPCi0gIE9TIKTLpaSl86W5pcihvKXrpLWk7M34zdGktaTspMakpKTrIGNqcGVnL2RqcGVnIKTPpLOkzqW/paSl16TOpOKkzqTHpLmhowotCi0gILDsyv2hoklKRyCkq6TpuPi8sKTLpeql6qG8pbmktaTspMakpKTrIE1TLURPUyDIx6TOIGNqcGVnL2RqcGVnCi0gIChmdHA6Ly9mdHAuc2ltdGVsLm5ldC8uMi9zaW10ZWxuZXQvbXNkb3MvZ3JhcGhpY3MvanBlZzZfYi56aXApIKTHpM+hogotICDKo7/0pM7G/s7PpdWloaWkpeuk8rvYxOqkx6StoaK90M7PpM/G/s7PpdWloaWkpeukyMaxpLi+7L3qpMu8q8awxaqkywotICC67qTppOyk3qS5oaOks6TOpb+lpKXXpM4gY2pwZWcvZGpwZWcgpPK67qTqpL+ksaTspNChomFsdHVpLyCkzsPmpMukoqTrCi0gIGNqcGVnLmMgpMggZGpwZWcuYyCk8qGiuLWkq6TppKKk6yijsaXVpaGlpKXryMekzikgY2pwZWcuYyAvIGRqcGVnLmMgpMgKLSAgxv6k7MLYpKikxqWzpfOl0aWkpeukt6TGpK+kwKS1pKSho6SzpM4gYWx0dWkgyMekziBjanBlZy5jIC8gZGpwZWcuYyCkz6GiCi0gILi1obkganBlZ2FsdHVpLnY2Yi50YXIuZ3ogpMikpKSmpdWloaWkpevMvqTHx9vJ26S1pOykxqSkpL+k4qTOpMvC0KS3pMYKLSAgU0lNRCDC0LH+sr2ky7TYpLmk672kwLWk8rLDpKikv6TipM6kx6S5oaMKLQotICCks6TOyqO/9KXVpaGlpKXrwtCx/sjHpM4gY2pwZWcvZGpwZWcgpPIgV2luZG93cyC3z6TKpMmkzsjzIFVOSVggtMS2raTHCi0gILvIzdGkuaTrvuy556Gixv7Oz6XVpaGlpKXrzL6k8qXvpaSl66XJpauhvKXJpMe72MTqpMekraTrpOikpqTLpLmk66TLpM+hogotICCzxqWzpfOl0aWkpemky7jHza2kzsbDysykysDfxOqkrMmszdeky6TKpOu+7LnnpKykoqTqpN6kuaGjpMqkvKTKpOmhogotICBNUy1ET1O3z6G/V2luZG93c7fPpM60xLatpMekz7DsyMyky6Gipe+lpKXrpcmlq6G8pcmkzsW4s6u96M39pM+ls6XzpdGlpKXpCi0gIKTLydXCsKTOpbmlv6G8pciloqXDpdels6G8pcnG4qTHudSkyqTvpOyk66S/pOGkx6S5oaMKLQotICBNaW5HVyCk5CBESkdQUCBWLjIgpMqkyaTOvuy556TPoaKl76WkpeulyaWrobylyaTOxbizq73ozf2kz7rHvemkq6Tpza24+gotICCky6TKpMOkxqSkpOukv6ThoaLGw8rMpMqks6TIpPKkt6TKpK+kxqTipe+lpKXrpcmlq6G8pcmky6TopOul1aWhpaSl67vYxOoKLSAgpM+kx6StpN6kuaGjTWljcm9zb2Z0IFZpc3VhbCBDKysgpOQgQm9ybGFuZCBDKysgpM6+7LnnpM+hosnhxMyhoqXvpaSl66XJCi0gIKWrobylycW4s6uk8s2tuPqyvaS5pOulqqXWpbilp6Wvpcil1aWhpaSl66THpKKk6yBzZXRhcmd2Lm9iaiCk5AotICB3aWxkYXJncy5vYmogpPIgRVhFIKXVpaGlpKXrpM6l6qXzpa+7/qTLwr6kzqWqpdaluKWnpa+lyKXVpaGlpKXrpMiw7L3vpMsKLSAgpeql86WvpLmk66SzpMikx6Gipe+lpKXrpcmlq6G8pcnFuLOrpPLNrbj6sr2kx6StpN6kuaSsoaKks6TOIFNJTUQgyMcKLSAgY2pwZWcvZGpwZWcgpM6+7LnnpM+honNldGFyZ3Yub2JqIKTkIHdpbGRhcmdzLm9iaiCkzsbizcaky8HqxfakuaTrpbOhvKXJpPIKLSAgY2pwZWcuYy9kanBlZy5jIKTLxL7A3L3xpK25/qTzpMekoqTrpL+k4aGipdel7aW4paelr6XIpdWloaWkpeuk5CBNYWtlZmlsZQotICCky77lta2kzqWqpdaluKWnpa+lyKXVpaGlpKXrpPLEybLDpLekyqSvpMak4qGipe+lpKXrpcmlq6G8pcmky6TopOul1aWhpaSl6wotICC72MTqpKykx6StpOuk6KSmpMukt6TGpKKk6qTepLmho6SzpOyk6bDKs7CkzqPDpbOl86XRpaSl6aTyu8jN0aS3pL++7LnnpMehogotICCl76WkpeulyaWrobylyaTLpOik66XVpaGlpKXru9jE6qSspMekraTKpKS+7LnnpM+hoqWzpfOl0aWkpemkzqXepcul5aWipesKLSAgpPK7sr7IpLekxqGipe+lpKXrpcmlq6G8pcnFuLOrpPLNrbj6sr2kuaTrwN/E6qTHpbOl86XRpaSl66S3pMakr6TApLWkpKGjCi0KLSAgsOzK/aGibGludXggpMqkyaTOIFVOSVggtMS2raTHpM+hoqXvpaSl66XJpauhvKXJpM7FuLOrvejN/aTPpdel7aWwpeml4KSsCi0gILWvxrCktaTspOvBsKTLpbOl3qXzpcmlt6Wnpeuky6TopMOkxrnUpMqk76TspOukv6ThoaKls6XzpdGlpKXppM7A38TqpMqkyQotICCkz8mszdekoqTqpN6ku6TzoaOl76WkpeulyaWrobylyaTLpOik66XVpaGlpKXrzL672MTqpM++76TLu8ikqKTepLmhowotCi0KLaKjpbOhvKXJpbWlpKW6pPK4uqTppLmky6TPCi0KLSAgU0lNRCCls6G8pcmk8snVssOkt6S/pL+k4aGipL2kzsqspMCksaWzobylyaW1paSluqSswf2kqKTGpKSk3qS5oaOkx6S5pKyhogotICBKUEVHIGxpYnJhcnkgpPKwyrK8pM6k6KSmpMqlx6XVpaml66XIpM6+9cLWpMe+76TLu8jN0aS3pMakpKTrpM6kyqTppNChogotICBqbW9yZWNmZy5oIKTOw+aky6SipOvA38TqueDM3Cil3qWvpe0ppPKwyrK8pM6k6KSmpMvK0bm5pLekxqWzpfOl0aWkpesKLSAgpLmk66SzpMikx6Giu8jN0aS1pOykyqSkpbOhvKXJpPK9/LOwpLmk66SzpMikrKTHpK2hoqWzobylyaW1paSluqTyuLqk6aS5Ci0gIKSzpMikrKTHpK2k3qS5oaMKLQotICCh+yBjaW5mby5kY3RfbWV0aG9kIKTOw82k8srRubmkt6TGpKSkyqSkvuy55wotCi0gICAgpLOkzsrRv/SkzyBEQ1Sx6bu7pM7K/cuhpPK72MTqpLehomNqcGVnL2RqcGVnIKTHpM8gLWRjdCClqqXXpbel56XzpMsKLSAgICDC0LH+pLek3qS5oaOks6TOytG/9KTOw82kz6XHpdWlqaXrpcikx6TPIEpEQ1RfSVNMT1cgpMehosbDpMvN/c2zpM4KLSAgICCkyqSkuMKk6qSzpM6lx6XVpaml66XIpM6+9cLWpMe7yM3RpLmk66SzpMik8ravpK+/5L6ppLek3qS5oaOwyrK8pM4KLSAgICCl3qWvpe2k8iAjdW5kZWYgpMukuaTrpLOkyKTHoaJKRENUX0lTTE9XIKTOvvXC1qTHpM+36KS3pMa7yM3RpLWk7KTKpKQKLSAgICCls6G8pcmk8r38s7Ckx6StpN6kuaGjCi0KLSAgICAjZGVmaW5lIERDVF9JRkFTVF9TVVBQT1JURUQgIC0+ICAjdW5kZWYgRENUX0lGQVNUX1NVUFBPUlRFRAotICAgICNkZWZpbmUgRENUX0ZMT0FUX1NVUFBPUlRFRCAgLT4gICN1bmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0KLSAgICCks6TspMCksaTHpOKkq6TKpOqkzqWzobylyaW1paSluqSsuu+4uqTHpK2k3qS5oaPGw6TLIERDVF9GTE9BVF9TVVBQT1JURUQKLSAgICCk8iAjdW5kZWYgpMukuaTrpMihojNETm93ISCkyCBTU0UgpM6ltaXdobylyKTivKvGsMWqpMvMtbj6pMukyqTqpN6kuaGjCi0KLSAgofvFuLOrvejN/aTHIGNpbmZvLmRvX2ZhbmN5X3Vwc2FtcGxpbmcgpM7DzaTyytG5uaS3pMakpKTKpKS+7LnnCi0KLSAgICCks6TOytG/9KTPIGRqcGVnIKTHpM8gLW5vc21vb3RoIKWqpdelt6XnpfOky8Hqxfakt6GiLW5vc21vb3RoIKTyu9jE6gotICAgIKS5pOukyCBGQUxTRSCky8DfxOqktaTspN6kuaGjpcel1aWppeulyKTHpM8gVFJVRSCkx6GipLOk7KTixsOky839zbOkzgotICAgIKTKpKS4wqTqpLOkzqXHpdWlqaXrpcikzr71wtakx7vIzdGkuaTrpLOkyKTytq+kr7/kvqmkt6TepLmho7DKsrykzgotICAgIKXepa+l7aTyICN1bmRlZiCky6S5pOuks6TIpMeholRSVUUgpM6+9cLWpMekz7fopLekxrvIzdGktaTspMqkpKWzobylyaTyCi0gICAgvfyzsKTHpK2k3qS5oaMKLQotICAgICNkZWZpbmUgVVBTQU1QTEVfTUVSR0lOR19TVVBQT1JURUQgIC0+ICAjdW5kZWYgVVBTQU1QTEVfTUVSR0lOR19TVVBQT1JURUQKLQotICCh+8W4s6u96M39pMcgY2luZm8uc2NhbGVfbnVtLCBjaW5mby5zY2FsZV9kZW5vbSCkzsPNpPLK0bm5pLekxqSkpMqkpL7suecKLQotICAgIKSzpOykz83XpLmk66TLodZKUEVHvcy+rsW4s6uh16TOtaHHvaTHoaJkanBlZyCkx6TPIC1zY2FsZSBNL04gpaql1wotICAgIKW3peel86TLwerF9qS3pN6kuaGjpbWl4KXNpaSl67ruwK6kyqTJpM6+7LnnpMvN+M3RpLWk7KTrpLOkyKSswr+kpAotICAgILWhx72kx6S5pKyhoqSzpOyk8qTepMOkv6Svu8jN0aS3pMakpKTKpKS+7LnnpM+horDKsrykzqXepa+l7aTyICN1bmRlZgotICAgIKTLpLmk66SzpMikx6GipbOhvKXJzsyk8rrvuLqkx6StpN6kuaGjCi0KLSAgICAjZGVmaW5lIElEQ1RfU0NBTElOR19TVVBQT1JURUQgIC0+ICAjdW5kZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAotCi0gIMPtsNXFwKTIpLekxqGipLOk7KTppM7A38TqytG/9KSspMmkzqTopKakyr71wtakx7vIpO+k7KTrpKvNvcKspMekraTKpKQKLSAgvuy556GipL+kyKSopNChoqW3pbmlxqXgpMulpKXzpbmlyKG8peukuaTrtqbNraXppaSl1qXppeqk8rrupOu+7LnnpMqkyQotICCkz6GipLOkpqSkpMOkv6WzobylybrvuLqkz7nUpMqkpqTZpK2kx6TPpKKk6qTepLuk86GjpbOhvKXJuu+4uqTyudSkyqSmCi0gIKTOpM+hokpQRUcgpemlpKXWpeml6qTOu8ik76Tsyv2krKTopK+k76SrpMOkxqSkpOvGw8TqpM6loqXXpeqlsaG8pbel56XzCi0gIKTLpeql86WvpLmk677sueekzqTfpMukt6TGpK+kwKS1pKShowotCi0KLaKjxsPE6qTOIFNJTUQgzL/O4aTyu8jN0aS3pMqkpKTopKaky6S5pOuky6TPCi0KLSAgpLOk7KTPIGpjb25maWcuaCCkzsPmxPiky6SipOuhoiN1bmRlZiBKU0lNRF8qKipfTk9UX1NVUFBPUlRFRCCkyKSkpKYKLSAgpd6lr6XtpPIgI2RlZmluZSCky6S5pOuks6TIpMe8wri9pMekraTepLmho2NvbmZpZ3VyZSCluaWvpeql16XIpMcKLSAgLS1kaXNhYmxlLW1teCCkyqTJpM6lqqXXpbel56XzpPK72MTqpLekv77sueekz6GipLOkzqXepa+l7aTPvKvGsMWqpMsKLSAgI2RlZmluZSCktaTspN6kuaGjCi0KLSAgM0ROb3chIKTIIFNTRSCkz7i1obmhosnixrC+rr/0xcBEQ1Sky6S3pKvN+M3RpLWk7KTGpKSk3qS7pPOkzqTHoaK+5b3SpM4KLSAgRENUX0ZMT0FUX1NVUFBPUlRFRCCk8iAjdW5kZWYgpMukt6S/pMCksaTHpN6kyKThpMbMtbj6pMuktaTspN6kuaGjCi0gIE1NWCCkyCBTU0UyIKTPoaKwtb3Mxbizq73ozf2kzrPGveqky834zdGktaTspMakpKTGoaK54sKusr2k2KTOude4pcXZpKwKLSAgueKkpKTOpMehos2tuPqky6S3pMakqqSvpLOkyKTypKrBpqThpLek3qS5pKyhosHIpN+5/qTfzdHF06TKpMmhoqWzobylyQotICCk8sH2pOmku6Trpdel7aW7pcOltaTOvO/O4KSspO+kq6TDpMakpKTrvuy556TPoaKh1sTMvu/N+M3RpLWk7KTKpKTK/aHXCi0gIKTOpbWl3aG8pcik8rOwpLmks6TIpMehoqWzobylyaW1paSluqTOuu+4uqSspMekraTepLmhowotCi0KLQotW0VPRl0KZGlmZiAtLWdpdCBhL3NpbWRfaW50ZXJuYWwuamEudHh0IGIvc2ltZF9pbnRlcm5hbC5qYS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMzQ5MDEuLjAwMDAwMDAKLS0tIGEvc2ltZF9pbnRlcm5hbC5qYS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIEpQRUcgc29mdHdhcmUgcmVsZWFzZSA2YgotICB3aXRoIHg4NiBTSU1EIGV4dGVuc2lvbiBmb3IgSUpHIEpQRUcgbGlicmFyeSB2ZXJzaW9uIDEuMDIKLSAgICA9PSBJTlRFUk5BTCA9PQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotoqOks6TOpdWloaWkpeukzwotCi0gIKSzpM6l1aWhpaSl66THpM+holNJTUQgyMcgbGlianBlZyCl6aWkpdal6aXqpM6holNJTUQgs8jEpcn0yqykzr7cutmk8gotICCy8sDipLek3qS5oaNTSU1EILPIxKXJ9MqspMvC0KS3pMayv6TppKukzrzqpPKyw6SopL+kpL7sueek5KGiybi94KTHpM8KLSAgwtCx/qS3pMakpKTKpKSl16XppcOlyKXVpamhvKXgpMvC0LH+pLWku6S/pKS+7LnnpMqkyaTPoaKks6SzpPLGyaTzpMcKLSAgpK+kwKS1pKShowotCi0gICAgoqOl1aWhpaSl66XVpamhvKXepcOlyKG/uMak073QpLe1rMzzKEFCSSmkzrvYxOoKLSAgICCio09TIKTOIFNJTUQgpbWl3aG8pcilwaWnpcOlryAoanNpbWRnY2MuYyAvIGpzaW1kZGpnLmFzbSAvIGpzaW1kdzMyLmFzbSkKLSAgICCio6Wipbul86XWpeq4wLjszdHA38TqpdWloaWkpesganNpbWRjZmcuaW5jIKTOuu7AriAobWFrZWNmZy5jKQotICAgIKKjU0lNRCDMv87hpM68wrnUu/6kzsGqwvKhv1NJTUQgxrC67qXiobylyb7wyvMKLSAgICCio6S9pM6k26SrpM7A38TqueDM3KXepa+l7QotICAgICAgofsgUkdCX1JFRCAvIFJHQl9HUkVFTiAvIFJHQl9CTFVFIC8gUkdCX1BJWEVMU0laRQotICAgICAgofsgUkdCWF9GSUxMRVJfMFhGRgotICAgICAgofsgSkZEQ1RfSU5UX1FVQU5USVpFX1dJVEhfRElWSVNJT04KLSAgICAgIKH7IFVQU0FNUExFX0gxVjJfU1VQUE9SVEVECi0KLQotoqOl1aWhpaSl66XVpamhvKXepcOlyKG/uMak073QpLe1rMzzKEFCSSmkzrvYxOoKLQotICCloqW7pfOl1qXquMC47KTHvfGkq6TspL+ls6G8pcmk8qGio8O4wLjspMqkyaTOueK16bjAuOykx73xpKuk7KS/pbOhvKXJCi0gIKTIpeql86WvpLmk66TLpM+hoqWqpdaluKWnpa+lyKXVpaGlpKXrpM6l1aWpobyl3qXDpcik8rDsw9ektaS7pOuks6TIoaIKLSAgpKqk6KTToaK4xqTTvdCkt7WszPOkyqTJpM6l0KWkpcql6qWzobylyaTOtazM8yhBQkkppPKw7MPXpLWku6TrpLOkyKSsCi0gIMmszdekx6S5oaOks6TOpb2l1aXIpMekz6GipLOk7KTppM672MTqpPKhoqWipbul86XWpekgbmFzbSCky82/pKik66WqpdcKLSAgpbel56XzpMe72MTqpLekxqSkpN6kuaGjCi0KLSAgoaZuYXNtIC1md2luMzIgLURXSU4zMiAuLi4KLQotICAgIFdpbjMyIKTOIGNvZmYgpdWlqaG8pd6lw6XIoaNNaWNyb3NvZnQgVmlzdWFsIEMrKyCk5CBNaW5HV6GmQ3lnV2luCi0gICAgpMqkyaGiV2luMzIgpbOl86XRpaSl6aTOwufJ9MqspKyzusX2oaMKLQotICChpm5hc20gLWZvYmogLURPQkozMiAuLi4KLQotICAgIFdpbjMyIKTOIG9iaiCl1aWpobyl3qXDpciho7i1obmkzyBNUy1ET1MgpMe7yKTvpOykxqSkpL8gb2JqILfBvLAKLSAgICAoTVNPTUYppPIgMzJiaXQgpMuzyMSlpLekv6TipM6ho0JvcmxhbmQgQysrIENvbXBsaWVyIChXaW4zMikgpMqkyaGjCi0KLSAgoaZuYXNtIC1mZWxmIC1ERUxGIC4uLgotCi0gICAgs8a876TOIFVOSVggpMe5raSvus7N0aS1pOykxqSkpOsgRUxGIKXVpamhvKXepcOlyKGjbGludXggpOQgeEJTRAotICAgIKXVpaGl36XqpMqkyaGiuL2636TOIFVOSVggpM7C58n0yqykrLO6xfahowotCi0gIKGmbmFzbSAtZmFvdXRiIC1EQU9VVCAuLi4KLQotICAgILDKwbCkziB4QlNEIKXVpaGl36XqpMe7yKTvpOykxqSkpL8gYS5vdXQgpdWlqaG8pd6lw6XIoaMKLQotICChpm5hc20gLWZtYWNobyAtRE1BQ0hPIC4uLgotCi0gICAgRGFyd2luIChNYWNPUyBYKSCkyqTJpMe6zs3RpLWk7KTGpKSk6yBNYWNoLU8gpdWlqaG8pd6lw6XIoaMKLSAgICDD7aHLLWZtYWNobyClqqXXpbel56XzpM8gbmFzbSAwLjk4LjQwILDKud+kx6W1pd2hvKXIpLWk7KTepLmhowotCi0gIKGmbmFzbSAtZmNvZmYgLURESkdQUCAuLi4KLQotICAgIE1TLURPUyCkziBESkdQUCCls6XzpdGlpKXppMe7yKTvpOyk6yBjb2ZmIKXVpamhvKXepcOlyKGjCi0KLSAgpLOkzqSmpMGhoi1mIKWqpdelt6XnpfOkzyBuYXNtIKSssvK84aS5pOul1aWhpaSl66XVpamhvKXepcOlyKTOu9jE6rvSpMehogotICAtRCClqqXXpbel56XzKKXepa+l7aTOxOq1wSmkzyBqc2ltZGV4dC5pbmMgpM7D5qTHsvK84aS1pOyk66XQpaSlyqXqtazM8wotICAoQUJJKaTOu9jE6rvSpMekuaGjanNpbWRleHQuaW5jIKTHpM+hoi1EIKWqpdelt6XnpfOkx6TOpd6lr6XtxOq1waTLvb6kw6TGoaIKLSAgpbulsKXhpfOlyCilu6Wvpbel56XzKaTOxOq1waTks7DJ9My+zL7BsMH1vv6kzsTqtcGk8rnUpMqkw6TGpKSk3qS5oaMKLSAgvtykt6SvpM8ganNpbWRleHQuaW5jIKTypLTN96SvpMCktaSkoaMKLQotICBFTEYgt8G8sCCkqqTopNMgYS5vdXQgt8G8sCCkzr7sueehoi1EUElDIKTyxMmyw6S3pMa72MTqpLmk66TIpbOhvKXJpKwKLSAgUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSAosMzD1sbIzqmls6G8pckpIKTLpMqk6qTepLmhoy1EUElDIKTPCi0gIGpzaW1kZXh0LmluYyCkzsPmpMey8rzhpLWk7KGipbOhvKXJpPIgUElDIKTLpLmk66S/pOGkzqXepa+l7aTyxOq1waS3pN6kuaGjCi0gIE1hY2gtTyC3wbywpM6+7LnnpM+hoqWzobylyaTPvu+kyyBQSUMgpMekoqTryazN16SspKKk66S/pOGhoi1EUElDIKTyCi0gILvYxOqkt6TKpK+kxqTivu+kyyBQSUMgt8G8sKTOpbOhvKXJpPLAuMCupLek3qS5oaMKLQotICCl16XppcOlyKXVpamhvKXgpMux/qS4pMahoqSzpOyk6aTOw+akq6TpxazA2qTKpOKkzqTywarC8qS5pOvJrM3XpKykoqTqCi0gIKTepLmho8axuq2kziBtYWtlZmlsZSCkx6TPoaKkoqTppKukuKThxazA2qTKpOKkzqSsu9jE6qS1pOykxqSkpN6kuaGjCi0gIGNvbmZpZ3VyZSCluaWvpeql16XIpMekz6GiY29uZmlnLmd1ZXNzIKSsvdDOz6S5pOul26W5pci+8MrzpPK4taTLwarC8gotICCkt6TGpKSk3qS5oaMKLQotCi2io09TIKTOIFNJTUQgpbWl3aG8pcilwaWnpcOlryAoanNpbWRnY2MuYyAvIGpzaW1kZGpnLmFzbSAvIGpzaW1kdzMyLmFzbSkKLQotICBTSU1EIMy/zuGk8rzCudSkuaTrpMukz6Giu/bBsKTOIENQVSCkzqW1pd2hvKXIpcGlp6XDpa+kwKSxpMekz6TKpK+hogotICBPUyCkzqW1pd2hvKXIpcGlp6XDpa+k4smszdekx6S5oaPGw6TLIFNTRS9TU0UyIKTLpMSkpKTGpM+hok9TIMKmpMcKLSAgU1NFL1NTRTIgzL/O4aTyvMK51KTHpK2k66TopKaky7v2wbCky0NQVaTywN/E6qS5pOvJrM3XpKykoqTqoaKkvaTspPIKLSAgudSkyqTDpMakpKTKpKQgT1MgpMekz6GiT1MgpKylt6XzpbCl66W/pbmlr6Srpd6l66XBpb+luaWvpKuky7TYpO+k6aS6oaIKLSAgU1NFL1NTRTIgpM+8wrnUpMekraTepLuk86GjpLWk6aTLoaKkoqTepOrDzqTppOykxqSkpN6ku6TzpKyhokNQVSCkywotICDG4sKipLWk7KS/IEZQVSAov/TDzbHpu7ul16Xtpbulw6W1KSCk8rvIzdGkt6TKpKQopail36XlpeyhvKXIpLmk6ynA38TqCi0gIKTLpMqkw6TGpKSk66TIoaJNTVggpOQgM0ROb3chIKTitN6k4aS5pNmkxqTOIFNJTUQgzL/O4aTPwbSkr7zCudSkx6StCi0gIKTepLuk86GjzdekuaTrpMuholNJTUQgzL/O4aTyvMK51KTHpK2k66SrpMmkpqSrpPLEtKTZpOuky6TPoaJDUFVJRCCkzgotICCl1aXppbCk8sS0pNmk66TApLGkx6TPydS9vcqspMikpKSmpLOkyKTHpLmhowotCi0gIFNJTUQgzL/O4aTOIE9TIKW1pd2hvKXIpcGlp6XDpa+kyKSkpMOkxqTioaLK3bjupeKhvKXJpMfGsKSkpMakpKTrCi0gIKXXpe2lsKXppeCkzr7sueehokNQVSCkzsDfxOql1aXppbCkzr71wtak8sS+wNyl5qG8pbahpqXXpe2lsKXppeCkq6TpCi0gIMbJpN+kyKTrpLOkyKSspMekraTKpKSkv6ThoaJTSU1EIMy/zuGk8rvupLeky7zCudSkt6TGpN+kxsy1uPrMv87hzuOzsKSsCi0gIMivwLikuaTrpKukyaSmpKuk8rPOpKuk4aTrpMikpKSmoaKw3L+iwK2kzrCtpKS01sDcxaqkysr9y6Gk8rrOpOmktqTrpPIKLSAgxsCkyqSkpM6krLi9vvWkx6S5oaMKLQotICCks6TOIFNJTUQgzL/O4aTOIE9TIKW1pd2hvKXIpcGlp6XDpa+k8qTkpMOkxqSkpOukzqSsoaJqc2ltZGdjYy5jIC8KLSAganNpbWRkamcuYXNtIC8ganNpbWR3MzIuYXNtIKTOo7OkxKTOpb2hvKW5pdWloaWkpeukx6S5oaOkvaTspL6k7KGiCi0gIFVOSVgvZ2NjzdGhokRKR1BQzdGholdpbjMyzdGkx6S5oaNqc2ltZGdjYy5jIKTHpM+hos7js7CkzsivwLik8gotICBzaWduYWwoKSC02L/0pM6lt6Wwpcql66XPpfOlyaXppMfK4aTepKikxqSkpN6kuaGjpbOhvKXJpM6w7Mn0pMsgZ2NjIKTOCi0gIKWkpfOl6aWkpfOloqW7pfOl1qXppPK7yKTDpMakpKTrpL+k4aGiZ2NjIMDszdGkx6S5oaNnY2MgsMqzsKTHpOIKLSAgpbOl86XRpaSl66TPpMekraTepLmkrKGipLOkzr7sueekzyBTSU1EIMy/zuGkzqW1pd2hvKXIpcGlp6XDpa+kzwotICC51KTKpO+k7KTepLuk86GjanNpbWRkamcuYXNtIKTPIERQTUkgpM7O47OwvejN/bWhub2k8sS+wNzN+M3RpLekvwotICDK/cuhpMehompzaW1kdzMyLmFzbSCkzyBXaW4zMiCkzs7js7C96M39taG5vaTyxL7A3M34zdGkt6S/yv3LoaTHpLmhowotCi0gIKXXpemlw6XIpdWlqaG8peCky7H+pLikxqGipLOkzqOzvO/O4KTOw+akq6TpxazA2qTKpOKkzqTywarC8qS5pOvJrM3XpKwKLSAgpKKk6qTepLmho8axuq2kziBtYWtlZmlsZSCkx6TPoaKkoqTppKukuKThxazA2qTKpOKkzqSsu9jE6qS1pOykxqSkpN6kuaGjCi0gIGNvbmZpZ3VyZSCluaWvpeql16XIpMekz6GiY29uZmlnLmd1ZXNzIKSsvdDOz6S5pOul26W5pci+8MrzpPK4taTLwarC8gotICCkt6TGpKSk3qS5oaMKLQotICCks6TOo7O8787gpM6kyaTspMik4sWsueekt6TKpKSl16XppcOlyKXVpamhvKXgpM6+7LnnpM+hor+3pL+kyqXBpaelw6WvCi0gILTYv/Sk8r3xpK/JrM3XpKykoqTqpN6kuaGjpMekuaSsoaKkvaTOIE9TIKSswbSkxqTOIFNJTUQgzL/O4aTypbWl3aG8pcgKLSAgpLekxqSkpOsgT1MgpMekoqTrpLOkyKSspO+kq6TDpMakpKTrvuy556TPoaKks6TOIE9TIKW1pd2hvKXIpcGlp6XDpa+kzwotICC+ys6spLmk66SzpMik4rLEx72kx6S5oaOwyrK8pM6k6KSmpMq29aTOtNi/9KTOpN+kzqW9obyluaXVpaGlpKXrpPIKLSAguu6kw6TGvuW1raTOo7OkxKTOpdWloaWkpeukzsLlpO+k6qTLu8jN0aS5pOukq6GipOKkt6SvpM8gamNvbWFwaS5jIKTyCi0gILL+ytGkt6TGIGpwZWdfc2ltZF9vc19zdXBwb3J0IKTOuMak073QpLek8qXQpaSl0aW5pLmk66TopKaky6S5pOyk0KPPo8sKLSAgpMekuaGjCi0KLSAgICBHTE9CQUwodW5zaWduZWQgaW50KQotICAgIGpwZWdfc2ltZF9vc19zdXBwb3J0ICh1bnNpZ25lZCBpbnQgc2ltZCkKLSAgICB7Ci0gICAgICByZXR1cm4gc2ltZDsKLSAgICB9Ci0KLQotoqOloqW7pfOl1qXquMC47M3RwN/E6qXVpaGlpKXrIGpzaW1kY2ZnLmluYyCkzrruwK4gKG1ha2VjZmcuYykKLQotICDF9qW9pdWlyKTOvuy556GipaKlu6Xzpdal6rjAuOykzqW9obyluaWzobylycPmpKuk6aPDuMC47KTOpdilw6XApdWloaWkpesKLSAgpMukoqTrvvDK86GipL+kyKSopNChoqXXpeql16Xtpbulw6W1pd6lr6XtpM7DzaTkub3CpMLOpM7D5qTLpKKk68rRv/SkzgotICClqqXVpbulw6XIpMqkyaGipPLDzqTryazN16SspKKk6qTepLmho21ha2VjZmcuYyCkz6GiSlBFRyCl6aWkpdal6aXqpM4KLSAgpbOl86XRpaSl66TLwOjOqaTDpMals6XzpdGlpKXroaal6qXzpa+hprzCudSktaTsoaKloqW7pfOl1qXquMC47MKmpM4KLSAgpb2hvKW5pbOhvKXJpMfJrM3XpMikyqTrvvDK86TypaKlu6Xzpdal6rjAuOzN0cDfxOql1aWhpaSl6yBqc2ltZGNmZy5pbmMKLSAgpMikt6TGvdDOz6S5pOvGr6StpPKkt6TGpKSk3qS5oaMKLQotICDD7bDVxcCkyKS3pMahom1ha2VjZmcuYyCkzyBKUEVHIKXppaSl1qXppeqkzqW9obyluaWzobylyaTIxrGkuKWzpfOl0aWkpesKLSAgpaql16W3peel86THpbOl86XRpaSl66S1pOyk68mszdekrKSipOqk3qS5oaPGw6TLoaK5vcKkws6kzrLyvOEopbWlpKW6Ci0gIKTKpMkppKwgSlBFRyCl6aWkpdal6aXqy9zCzqTOpOKkzqTIsNukyqTDpMakt6TepKakyKGiSlBFRyCl6aWkpdal6aXqpKwKLSAgpa+l6aXDpbel5aS3pN6kuaGjCi0KLQotoqNTSU1EIMy/zuGkzrzCudS7/qTOwarC8qG/U0lNRCDGsLrupeKhvKXJvvDK8wotCi0gIKSzpM4gU0lNRCCzyMSlyMcgSlBFRyCl6aWkpdal6aXqpMekz6Gipdel7aWwpeml4KTOvMK51Lv+pMvGw8TqpM4gU0lNRAotICDMv87hpPK7yM3RpLekyqSkpOikpqTLpLekv6TqoaKzxr3ozf3DyrOspMekyaTOIFNJTUQgzL/O4aTyu8jN0aS3pMbGsLruCi0gIKS5pOukzqSrpPLHxLCupMekraTru8XByKTfpKzN0bDVpLWk7KTGpKSk3qS5oaMKLQotICBqcGVnX3NpbWRfbWFzaygpIKTyu8ikpqTIoaLGw8TqpM4gU0lNRCDMv87hpPK8wrnUu/6ky7vIzdGkt6TKpKSk6KSmpMsKLSAgpMekraTepLmhowotCi0gICAgR0xPQkFMKHVuc2lnbmVkKQotICAgIGpwZWdfc2ltZF9tYXNrIChqX2NvbW1vbl9wdHIgY2luZm8sIHVuc2lnbmVkIHJlbW92ZSwgdW5zaWduZWQgYWRkKTsKLQotICCks6TOtNi/9KTPoaKzxiBTSU1EIMy/zuGlu6XDpciky8LQsf6kuaTrpd6luaWvpdOlw6XIpPLA38TqoabK0bm5pLek3qS5oaMKLSAgcmVtb3ZlLCBhZGQgpL2kt6TGzOGk6sPNpM+horPGIFNJTUQgzL/O4aTLwtCx/qS5pOul06XDpcjDzSAoSlNJTURfTU1YLAotICBKU0lNRF8zRE5PVywgSlNJTURfU1NFLCBKU0lNRF9TU0UyKSCk8iBPUiCx6bu7pMfByKTfueek76S7pL+k4qTOpMekuaGjCi0KLSAgIqXepbmlr6XTpcOlyCIgpM+horm9wqTCziBjaW5mbyCky8rdu/2ktaTspOvDzaTHoaKkvaTOvem0/MPNpM8gMCCkx6S5oaMKLSAgpL2kt6TGpLOkzrTYv/Skz6GipLOkzqXepbmlr6XTpcOlyKTysMqyvKTOpOikpqTLubm/tyjB4LruKaS3pN6kuaGjCi0KLSAgICAov7ekt6Skpd6luaWvpdOlw6XIKSA9ICgouMWkpKXepbmlr6XTpcOlyCkgJiB+cmVtb3ZlKSB8IGFkZDsKLQotICCkvaS3pMahoqSzpM6l3qW5pa+l06XDpcikrCAxIKTLpLWk7KS/IFNJTUQgzL/O4aW7pcOlyKTPoaKkv6TIpKggQ1BVL09TCi0gIKTHwtCx/qS3pMakpKTGpOK7yM3RpLWk7KTepLuk86GjpLOkzrTYv/Skz6GipLOkzrTYv/Sk8rjGpNbEvsGwpN6kx8DfxOoKLSAgpLWk7KTGpKSkv6Xepbmlr6XTpcOlyKTyytakt6TepLmho6TKpM6kx6GicmVtb3ZlLCBhZGQgtqakyyAwIKTyzb+kqKTGCi0gILTYv/Sk8rjGpNmk0KGiuL2638DfxOqktaTspMakpKTrpd6luaWvpdOlw6XIpPK86MbApMekraTepLmho6SzpM602L/0pM4KLSAgu8jN0c7jpM+homNqcGVnLmMsIGRqcGVnLmMsIGpjb21hcGkuYyCky6SipOqk3qS5oaMKLQotICCks6TOpd6luaWvpdOlw6XIpM7DzaTPoaK8wrrdpMukz7m9wqTCziBjaW5mbyCkziBvdXRwdXRfZ2FtbWEgpOKkt6SvpM8KLSAgaW5wdXRfZ2FtbWEgytG/9KTOsrywzKXTpcOlyKTOyt3CuKS1pOykxqSkpN6kuSi+3KS3pK+kzyBqY29tYXBpLmMgpPIKLSAgu7K+yCmho6SzpOykz6Giub3CpMLOIGNpbmZvIKTLv7ekv6TKytG/9KTyxMmyw6S3pMakt6TepKakyKXQpaSlyqXquN+0uQotICCkrMr4pOykxqS3pN6kpqS/pOGkx6GiuL2+9aTHpM/MpLvIzdGkyLvXpO+k7KTrvuW1raTOytG/9KTyoda01rzapOqh1wotICCkt6TGpKSk3qS5oaMKLQotICCk3qS/oaKwyrK8pM602L/0t7Kk8rvIpKakyKGipemlpKXWpeml6sbiyfSkzrPGvejN/cPKs6ykx6TJpM4gU0lNRCDMv87hCi0gIKTyu8jN0aS3pMbGsLrupLmk66TOpKuk8sfEsK6kx6StpN6kuaGjCi0KLSAgICBqcGVnX3NpbWRfY29sb3JfY29udmVydGVyKCk7ICAgLT4gv6e29bTWytG0uShSR0ItPllDYkNyKQotICAgIGpwZWdfc2ltZF9kb3duc2FtcGxlcigpOyAgICAgICAtPiClwKWmpfOltaXzpdel6qXzpbAKLSAgICBqcGVnX3NpbWRfZm9yd2FyZF9kY3QoKTsgICAgICAgLT4gRENUvefK0bS5Ci0gICAganBlZ19zaW1kX2NvbG9yX2RlY29udmVydGVyKCk7IC0+IL+ntvW01srRtLkoWUNiQ3ItPlJHQikKLSAgICBqcGVnX3NpbWRfdXBzYW1wbGVyKCk7ICAgICAgICAgLT4gpaKlw6XXpbWl86XXpeql86WwCi0gICAganBlZ19zaW1kX2ludmVyc2VfZGN0KCk7ICAgICAgIC0+IERDVLXVytG0uQotCi0gIMrWpLnDzaTPoaLJ4sawvq6/9MXARENUvefK0bS5L7XVytG0uSCkzr7sueekzyBKU0lNRF8zRE5PVyCkqyBKU0lNRF9TU0WhogotICCkvaTssMqzsKTOvuy556TPIEpTSU1EX01NWCCkqyBKU0lNRF9TU0UyIKTyytakt6TepLmho6TepL+hojAgpKzK1qTDpMYKLSAgpK2kv77sueekzyBTSU1EIMy/zuGlu6XDpcikz7vIpO+k7KS6oaK9vs3opM6l66G8pcGl86Ssu8ik76TspOuks6TIpPIKLSAgsNXMo6S3pN6kuaGjCi0KLSAgpLOk7KTppM602L/0pM6+3KS3pKS7yKSkyv2ky6TEpKSkxqTPoaJjanBlZy5jLCBkanBlZy5jICi7yM3RzuMpIKTypLTN9wotICCkr6TApLWkpKGjCi0KLSAgpMqkqqGipLOk7KTppM4gU0lNRCCl3qW5pa+02L/0ob9TSU1EIKXiobylyb7wyvO02L/0IKSsyazN16TKpKS+7LnnpM+hogotICCwyrK8pM6l3qWvpe2k8iBqY29uZmlnLmggpMqkyaTLtN6k4aTrpLOkyKTHoaK2z6SrpMekuaSspbOhvKXJpbWlpKW6pKwKLSAgwOHM86THpK2k3qS5oaMKLQotICAgICNkZWZpbmUgSlNJTURfTUFTS0ZVTkNfTk9UX1NVUFBPUlRFRAotICAgICNkZWZpbmUgSlNJTURfTU9ERUlORk9fTk9UX1NVUFBPUlRFRAotCi0KLaKjpL2kzqTbpKukzsDfxOq54Mzcpd6lr6XtCi0KLSAgofsgUkdCX1JFRCAvIFJHQl9HUkVFTiAvIFJHQl9CTFVFIC8gUkdCX1BJWEVMU0laRQotCi0gICAgpLOk7KTPoaJqbW9yZWNmZy5oIKTOw+aky6SipOvA38TqueDM3KXepa+l7aTHoaK86KTqsLekpiBSR0Igt8G8sLLowfwKLSAgICClx6G8pb+kziBSR0IgpM7KwqTTveek5KXUpa+lu6XrpbWlpKW6pPLA38TqpLek3qS5oaOks6TOIFNJTUQgs8jEpcjHCi0gICAgpMek4srRubmkx6StpOuk6KSmpMukt6TGpKKk6qTepLmkrKGiUkdCX1BJWEVMU0laRSCkrCAzIKSrIDQgpM6+7LnnpM6k36GiCi0gICAgU0lNRCDIx6TOv6e29bTWytG0uaXrobylwaXzpKzNrbj6pMukyqTqpN6kuaGjpL2k7LDKs7CkzsPNpMukt6S/vuy556TPoaIKLSAgICBTSU1EIMjHpM6/p7b1tNbK0bS5peuhvKXBpfOkz7yrxrDFqqTLzLW4+rK9pLWk7KTGoaK9vs3opM6/p7b1tNbK0bS5Ci0gICAgpeuhvKXBpfOkrLvIpO+k7KTepLkopOSk5MTjwq6ky6TKpOqk3qS5KaGjCi0KLSAgICCks6TspOmkzsPNpPLK0bm5pLmk66SzpMikx6GivdDOz6TyIDMyYml0L3BpeGVsILfBvLCky6S3pL+k6qGiQk1QILfBvLCkywotICAgILnnpO+ku6TGpdSlr6W7peuk8iBCR1Igveeky6S3pL+k6qS5pOuks6TIpKyyxMe9pMukyqTqpN6kuaGjpMqkqqGiCi0gICAgpLOk7KTppM7DzaTyzLe94qS5pOvDzaTLICNkZWZpbmUgpLekv77sueekz6WzpfOl0aWkpeukx6StpMqkpKTopKaky6S3pMYKLSAgICCkoqTqpN6kuaTOpMehosPtsNWkt6TGpK+kwKS1pKShowotCi0gIKH7IFJHQlhfRklMTEVSXzBYRkYKLQotICAgIKSzpOyk4iBqbW9yZWNmZy5oIKTOw+aky6SipOvA38TqueDM3KXepa+l7aTHpLmho6XHpdWlqaXrpcikx6TPICN1bmRlZgotICAgIKTLpMqkw6TGpKSk3qS5oaO+5aTOIFJHQl9QSVhFTFNJWkUgpPIgNCCky6S3pL++7LnnoaKjsaTEpM6l1KWvpbul6wotICAgIKXHobylv8PmpMsoUkdCpM6js6XQpaSlyKTOwr6kyynNvrfXpMqjsaXQpaSlyKSswri636S5pOuks6TIpMukyqTqpN6kuaGjCi0gICAgpcel1aWppeulyKTHpM+hoqSzpM7NvrfXpMqjsaXQpaSlyChmaWxsZXIgYnl0ZSmky6TPIDB4MDAgpKzL5KThpOmk7KTGCi0gICAgvdDOz6S1pOyk3qS5pKyhoqSzpM4gUkdCWF9GSUxMRVJfMFhGRiCk8iAjZGVmaW5lIKS5pOukyCAweDAwIKTOwuWk76TqCi0gICAgpMsgMHhGRiCkrCBmaWxsZXIgYnl0ZSCky8vkpOGk6aTspMa90M7PpLWk7KTepLmhowotCi0gICAgvdDOz6TyIDMyYml0L3BpeGVsILfBvLCky6S3pL++7LnnpMehomZpbGxlciBieXRlIKTypaKl66XVpaGlwaXjpc2l6wotICAgIKTIpLekxrC3pKSkv6Skvuy556TKpMmkz6GiUkdCWF9GSUxMRVJfMFhGRiCk8iAjZGVmaW5lIKS5pOukyMXUueekrM7JpKQKLSAgICC+7LnnpKykoqTrpMekt6TnpKahowotCi0gICAgpMqkqqGipaql6qW4pcql68jHpM4gSlBFRyCl6aWkpdal6aXqpMekz6GipLOkziBmaWxsZXIgYnl0ZSCky6TPsr+k4gotICAgILXNpOGk6aTspLqhori1pM7DzaSspL2kzqTepN7K3bv9pLWk7KTepLmho6THpLmkrKGiU0lNRCDIx6TOv6e29bTWytG0uQotICAgIKXrobylwaXzpMekz7i1pM7DzaTyyt27/aS5pOuky6TPvOq01qSspKukq6TrpL+k4aGivu+kyyAweDAwIKSrIDB4RkYKLSAgICCkx8vkpOGkxr3Qzs+kuaTrpOikpqTLu8XNzcrRubmk8rnUpMqkpKTepLekv6GjCi0KLSAgofsgSkZEQ1RfSU5UX1FVQU5USVpFX1dJVEhfRElWSVNJT04KLQotICAgIKSzpOykz6Giam1vcmVjZmcuaCCkzsPmpMukoqTrwN/E6rngzNyl3qWvpe2kx6GisLW9zL3ozf2kx6TOIERDVLe4v/SkzgotICAgIM7Mu9Kyvb3ozf2kzsr9y6Gk8srRubmkt6TepLmho6XHpdWlqaXrpcikx6TPICN1bmRlZiCkx6GiI3VuZGVmIKTOvvXC1qTOCi0gICAgyv2krLniwq6kyqTOpMehosbDpMvN/c2zpM6kyqSkuMKk6iAjdW5kZWYgpMe7yM3RpLmk66SzpMik8qSqwaak4aSkpL+ktwotICAgIKTepLmhowotCi0gICAgRENUt7i/9KTOzsy70rK9vejN/aTIpKSkpqTOpM+hosO8xaqky7jApKik0LLowfylx6G8pb+ky8LQpLekxrDspMSw7KTECi0gICAgs+Sk6ru7KMCwv/S9/Lu7KaTyvMK51KS5pOuks6TIpMekuaGjpMekuaSsoaK9/Lu7pM+4ts39xaqky7niwq6yvaSsCi0gICAgydSyxMe9pMqkzqTHoaKks6TOIFNJTUQgs8jEpcjHpMekz8Cwv/S9/Lu7pM7C5aTvpOqky8Cwv/S+6Lu7pPK7yM3RpLekxgotICAgIM7Mu9Kyvb3ozf2k8rzCudSkt6TGpKSk3qS5oaMKLQotICAgIKSzpM7AsL/0vui7u6TywuXN0aS5pOvK/cuhpMek4qGiueLAusXZwLC/9ERDVC+54sKuwLC/9ERDVKTyu8ikw6S/vuy556THoaIKLSAgICCkq6TEoaIwocExMDAgpM6kuaTZpMakzrC1vcylr6WqpeqlxqWjwN/E6qTHpaql6qW4pcql68jHpMjBtKSvxrGkuLfrssyk8gotICAgIL3QpLmks6TIpPKzzsenpLekxqSkpN6kuaGjpMekuaSsoaKwtb3Msui8waTyICKlr6WqpeqlxqWjIiCkzrvYybikx8DfxOoKLSAgICCku6S6oaKlr6WqpeqlxqWjIDAgpOik6qTixOOy6LzBpM7OzLvSsr2lxqG8pdal66TyxL7A3M2/pKikxrC1vcykt6S/vuy55wotICAgIKTKpMmkz6Gisem7u8XTw+akzr/0w83Iz7DPpM602Le4pMehoqWqpeqluKXKpevIx6TIpM+w26TKpOu367LMpKy90KTrpLOkyAotICAgIKTiyN3E6qTHpK2k3qS7pPOho6S9pKakpKTDpL/Gw7zspMq2rbOmvvK377K8pMek4qWqpeqluKXKpevIx6TIpM6437S5xdmkrAotICAgILnipK+kyqTppMqksaTspNCkyqTppMqkpL7sueekyqTJpMukz6GipLOkzrngzNyk8iAjZGVmaW5lIKTLpLekxrvIzdGkt6TGCi0gICAgpK+kwKS1pKSho7zjtLPCrsXZpM/N7qTBpN6kuaSsoaK9vs3opMmkqqTqoaKw7KTEsOykxL38u7uk8rnUpMOkxs7Mu9KyvQotICAgIL3ozf2k8rnUpKSk3qS5oaMKLQotICAgIKTipMOkyKTioaKlr6WqpeqlxqWjIDAgpOik6qTixOOy6LzBpM7A38TqpMewtb3MpLekxqTioaKk26TIpPOkybzCzdGkywotICAgIKTKpOqk3qS7pPOkzqTHoaKks6TOwLC/9L7ou7uk8sLlzdGkuaTryv3LoaTHpOKhoszkwuqky6TKpOuks6TIpM+kyqSkpMgKLSAgICC716SkpN6kuaGjCi0KLSAgofsgVVBTQU1QTEVfSDFWMl9TVVBQT1JURUQKLQotICAgIKSzpOykz6Giam1vcmVjZmcuaCCkzsPmpMukoqTroaKlqqXqpbilyqXryMekziBJSkcgSlBFRyBsaWJyYXJ5IKTLpM8KLSAgICDCuLrfpLekyqSkwN/E6rngzNyl3qWvpe2kx6S5oaOks6TspM+holk6MXgyIENiOjF4MSBDcjoxeDEgKDQ6MjoyKSCkzgotICAgIKW1pdaltaXzpdel6qXzpbDI5qTyu/2kxCBKUEVHIKXVpaGlpKXrpPKhoqWqpeqluKXKpevIx6TOIElKRyBKUEVHCi0gICAgbGlicmFyeSCk6KTqpOK54sKuob+54rLovMGky8W4s6ukx6StpOuk6KSmpMukuaTrpOKkzqTHpLmhowotCi0gICAgpbWl1qW1pfOl16XqpfOlsMjmIFk6MXgyIENiOjF4MSBDcjoxeDEgKDQ6MjoyKSCk8rv9pMQgSlBFRyCl1aWhpaSl66TPoaIKLSAgICClqqXqpbilyqXrpM4gSUpHIEpQRUcgTGlicmFyeSCkx6Tixbizq6THpK2k3qS5pKyhoqSzpM6ltaXWpbWl86XXpeql86WwCi0gICAgyOaky8LQsf6kuaTrpaKlw6XXpbWl86XXpeql86Wwoaal66G8pcGl86SstMrDsaTKpOKkzqS3pKvN0bDVpLWk7KTGCi0gICAgpKSkyqSkpL+k4aGixbizq8Kuxdmk4sPZpK+hoqTepL+hor+npM62rczcpKykz6TDpK2k6qS3pMakpKTro8Ojx7LowfwKLSAgICCkyqTJpM6+7LnnpM+luKXjpa6hvKSszNzOqaTDpMakt6TepKaks6TIpKykoqTqpN6kuaGjpLOkzrngzNyk8s2tuPqkywotICAgIKS5pOuks6TIpMehoqSzpM6k6KSmpMqltaXWpbWl86XXpeql86WwyOYgWToxeDIgQ2I6MXgxIENyOjF4MSCk8rv9pMQKLSAgICBKUEVHIKXVpaGlpKXrpPK54sKupMuhoqTepL+hoqW4peOlrqG8pKzM3M6ppL+kyqSkpOikpqTLueKy6LzBpMvFuLOrCi0gICAgpMekraTrpOikpqTLpLek3qS5oaMKLQotICAgIKSzpM6hoqW1pdaltaXzpdel6qXzpbDI5iBZOjF4MiBDYjoxeDEgQ3I6MXgxIKTOIEpQRUcgpdWloaWkpeukz6GipKKk3qTqCi0gICAgsOzIzMWqpMqk4qTOpMekz6SipOqk3qS7pPOkrKGipcelo6W4pb+l66WrpeGl6aTKpMmkrL3Qzs+kuaTrpLOkyKTOwr+kpKGiCi0gICAgpbWl1qW1pfOl16XqpfOlsMjmIFk6MngxIENiOjF4MSBDcjoxeDEgKDQ6MjoyKSCkziBKUEVHIKXVpaGlpKXrpMvC0KS3pMYKLSAgICCh1kpQRUcgpe2luaXspbmy88W+ode96M39pPK51KTKpKakyKGipLOkziBZOjF4MiBDYjoxeDEgQ3I6MXgxIKTOIEpQRUcKLSAgICCl1aWhpaSl66TLpMqk6qTepLmho6XHpaOluKW/peulq6Xhpemkx6Gipaul4aXppPK9xKTLpLekxqHKvcSwzMPWpMehy7ujscYKLSAgICCkt6S/sujB/KTyodZKUEVHIKXtpbml7KW5svPFvqHXpLekxsC1vu+kyrj+pK2ky8S+pLmhoqTKpMmkyKSkpKaks6TIpM+hogotICAgIKTopK+k5KTrpLOkyKTApMi716SkpN6kuaGjpMekuaSsoaKks6TOpOikpqTKodZKUEVHIKXtpbml7KW5svPFvqHXpLWk7KS/Ci0gICAgSlBFRyCl1aWhpaSl66Typaql6qW4pcql66TOIElKRyBKUEVHIExpYnJhcnkgpMfFuLOrpLmk66TIoaK+5bWtpM7N/c2zpKuk6aGiCi0gICAgSlBFRyCl1aWhpaSl66Tyxbizq6S3pMakq6TpsujB/L3ozf2lvaXVpcikx7Lzxb6ktaS7pL+y6MH8pMvI5qTZpMay6LzBpKwKLSAgICDO9KTDpMakt6TepKSk3qS5oaOks6TOueDM3KTyza24+qTLpLmk66SzpMikx6GisujB/L3ozf2lvaXVpcikx7Lzxb6ktaS7pL8KLSAgICCy6MH8pMik26TcxrGkuKWvpaql6qXGpaOkx7Lowfyk8sW4s6ukuaTrpLOkyKSsssTHvaTLpMqk6qTepLmhowotCi0gICAgpLOkzrngzNykz6GixsOky839zbOkzqTKpKS4wqTqoaIjZGVmaW5lIKTOvvXC1qTLpLekxqSqpK+ks6TIpPKkqsGmpOEKLSAgICCkpKS/pLek3qS5oaOlqqXqpbilyqXrpM4gSUpHIEpQRUcgTGlicmFyeSCkyLSwwbSky8axsOykzrfrssykrMmszdekygotICAgIL7sueekzqTfICN1bmRlZiCky6S3pMals6XzpdGlpKXrpLekxqSvpMCktaSkoaMKLQotCi0KLVtFT0ZdCmRpZmYgLS1naXQgYS9zdHJ1Y3R1cmUuZG9jIGIvc3RydWN0dXJlLmRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjOWRlZi4uMDAwMDAwMAotLS0gYS9zdHJ1Y3R1cmUuZG9jCisrKyAvZGV2L251bGwKQEAgLTEsOTQ4ICswLDAgQEAKLUlKRyBKUEVHIExJQlJBUlk6ICBTWVNURU0gQVJDSElURUNUVVJFCi0KLUNvcHlyaWdodCAoQykgMTk5MS0xOTk1LCBUaG9tYXMgRy4gTGFuZS4KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi1Gb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0KLQotVGhpcyBmaWxlIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIElKRyBKUEVHIHNvZnR3YXJlOwotdGhhdCBpcywgdGhlIGZ1bmN0aW9ucyBvZiB0aGUgdmFyaW91cyBtb2R1bGVzIGluIHRoZSBzeXN0ZW0gYW5kIHRoZSBpbnRlcmZhY2VzCi1iZXR3ZWVuIG1vZHVsZXMuICBGb3IgbW9yZSBwcmVjaXNlIGRldGFpbHMgYWJvdXQgYW55IGRhdGEgc3RydWN0dXJlIG9yIGNhbGxpbmcKLWNvbnZlbnRpb24sIHNlZSB0aGUgaW5jbHVkZSBmaWxlcyBhbmQgY29tbWVudHMgaW4gdGhlIHNvdXJjZSBjb2RlLgotCi1XZSBhc3N1bWUgdGhhdCB0aGUgcmVhZGVyIGlzIGFscmVhZHkgc29tZXdoYXQgZmFtaWxpYXIgd2l0aCB0aGUgSlBFRyBzdGFuZGFyZC4KLVRoZSBSRUFETUUgZmlsZSBpbmNsdWRlcyByZWZlcmVuY2VzIGZvciBsZWFybmluZyBhYm91dCBKUEVHLiAgVGhlIGZpbGUKLWxpYmpwZWcuZG9jIGRlc2NyaWJlcyB0aGUgbGlicmFyeSBmcm9tIHRoZSB2aWV3cG9pbnQgb2YgYW4gYXBwbGljYXRpb24KLXByb2dyYW1tZXIgdXNpbmcgdGhlIGxpYnJhcnk7IGl0J3MgYmVzdCB0byByZWFkIHRoYXQgZmlsZSBiZWZvcmUgdGhpcyBvbmUuCi1BbHNvLCB0aGUgZmlsZSBjb2RlcnVsZXMuZG9jIGRlc2NyaWJlcyB0aGUgY29kaW5nIHN0eWxlIGNvbnZlbnRpb25zIHdlIHVzZS4KLQotSW4gdGhpcyBkb2N1bWVudCwgSlBFRy1zcGVjaWZpYyB0ZXJtaW5vbG9neSBmb2xsb3dzIHRoZSBKUEVHIHN0YW5kYXJkOgotICBBICJjb21wb25lbnQiIG1lYW5zIGEgY29sb3IgY2hhbm5lbCwgZS5nLiwgUmVkIG9yIEx1bWluYW5jZS4KLSAgQSAic2FtcGxlIiBpcyBhIHNpbmdsZSBjb21wb25lbnQgdmFsdWUgKGkuZS4sIG9uZSBudW1iZXIgaW4gdGhlIGltYWdlIGRhdGEpLgotICBBICJjb2VmZmljaWVudCIgaXMgYSBmcmVxdWVuY3kgY29lZmZpY2llbnQgKGEgRENUIHRyYW5zZm9ybSBvdXRwdXQgbnVtYmVyKS4KLSAgQSAiYmxvY2siIGlzIGFuIDh4OCBncm91cCBvZiBzYW1wbGVzIG9yIGNvZWZmaWNpZW50cy4KLSAgQW4gIk1DVSIgKG1pbmltdW0gY29kZWQgdW5pdCkgaXMgYW4gaW50ZXJsZWF2ZWQgc2V0IG9mIGJsb2NrcyBvZiBzaXplCi0JZGV0ZXJtaW5lZCBieSB0aGUgc2FtcGxpbmcgZmFjdG9ycywgb3IgYSBzaW5nbGUgYmxvY2sgaW4gYQotCW5vbmludGVybGVhdmVkIHNjYW4uCi1XZSBkbyBub3QgdXNlIHRoZSB0ZXJtcyAicGl4ZWwiIGFuZCAic2FtcGxlIiBpbnRlcmNoYW5nZWFibHkuICBXaGVuIHdlIHNheQotcGl4ZWwsIHdlIG1lYW4gYW4gZWxlbWVudCBvZiB0aGUgZnVsbC1zaXplIGltYWdlLCB3aGlsZSBhIHNhbXBsZSBpcyBhbiBlbGVtZW50Ci1vZiB0aGUgZG93bnNhbXBsZWQgaW1hZ2UuICBUaHVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBtYXkgdmFyeSBhY3Jvc3MKLWNvbXBvbmVudHMgd2hpbGUgdGhlIG51bWJlciBvZiBwaXhlbHMgZG9lcyBub3QuICAoVGhpcyB0ZXJtaW5vbG9neSBpcyBub3QgdXNlZAotcmlnb3JvdXNseSB0aHJvdWdob3V0IHRoZSBjb2RlLCBidXQgaXQgaXMgdXNlZCBpbiBwbGFjZXMgd2hlcmUgY29uZnVzaW9uIHdvdWxkCi1vdGhlcndpc2UgcmVzdWx0LikKLQotCi0qKiogU3lzdGVtIGZlYXR1cmVzICoqKgotCi1UaGUgSUpHIGRpc3RyaWJ1dGlvbiBjb250YWlucyB0d28gcGFydHM6Ci0gICogQSBzdWJyb3V0aW5lIGxpYnJhcnkgZm9yIEpQRUcgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24uCi0gICogY2pwZWcvZGpwZWcsIHR3byBzYW1wbGUgYXBwbGljYXRpb25zIHRoYXQgdXNlIHRoZSBsaWJyYXJ5IHRvIHRyYW5zZm9ybQotICAgIEpGSUYgSlBFRyBmaWxlcyB0byBhbmQgZnJvbSBzZXZlcmFsIG90aGVyIGltYWdlIGZvcm1hdHMuCi1janBlZy9kanBlZyBhcmUgb2Ygbm8gZ3JlYXQgaW50ZWxsZWN0dWFsIGNvbXBsZXhpdHk6IHRoZXkgbWVyZWx5IGFkZCBhIHNpbXBsZQotY29tbWFuZC1saW5lIHVzZXIgaW50ZXJmYWNlIGFuZCBJL08gcm91dGluZXMgZm9yIHNldmVyYWwgdW5jb21wcmVzc2VkIGltYWdlCi1mb3JtYXRzLiAgVGhpcyBkb2N1bWVudCBjb25jZW50cmF0ZXMgb24gdGhlIGxpYnJhcnkgaXRzZWxmLgotCi1XZSBkZXNpcmUgdGhlIGxpYnJhcnkgdG8gYmUgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIGFsbCBKUEVHIGJhc2VsaW5lLCBleHRlbmRlZAotc2VxdWVudGlhbCwgYW5kIHByb2dyZXNzaXZlIERDVCBwcm9jZXNzZXMuICBIaWVyYXJjaGljYWwgcHJvY2Vzc2VzIGFyZSBub3QKLXN1cHBvcnRlZC4KLQotVGhlIGxpYnJhcnkgZG9lcyBub3Qgc3VwcG9ydCB0aGUgbG9zc2xlc3MgKHNwYXRpYWwpIEpQRUcgcHJvY2Vzcy4gIExvc3NsZXNzCi1KUEVHIHNoYXJlcyBsaXR0bGUgb3Igbm8gY29kZSB3aXRoIGxvc3N5IEpQRUcsIGFuZCB3b3VsZCBub3JtYWxseSBiZSB1c2VkCi13aXRob3V0IHRoZSBleHRlbnNpdmUgcHJlLSBhbmQgcG9zdC1wcm9jZXNzaW5nIHByb3ZpZGVkIGJ5IHRoaXMgbGlicmFyeS4KLVdlIGZlZWwgdGhhdCBsb3NzbGVzcyBKUEVHIGlzIGJldHRlciBoYW5kbGVkIGJ5IGEgc2VwYXJhdGUgbGlicmFyeS4KLQotV2l0aGluIHRoZXNlIGxpbWl0cywgYW55IHNldCBvZiBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGFsbG93ZWQgYnkgdGhlIEpQRUcKLXNwZWMgc2hvdWxkIGJlIHJlYWRhYmxlIGZvciBkZWNvbXByZXNzaW9uLiAgKFdlIGNhbiBiZSBtb3JlIHJlc3RyaWN0aXZlIGFib3V0Ci13aGF0IGZvcm1hdHMgd2UgY2FuIGdlbmVyYXRlLikgIEFsdGhvdWdoIHRoZSBzeXN0ZW0gZGVzaWduIGFsbG93cyBmb3IgYWxsCi1wYXJhbWV0ZXIgdmFsdWVzLCBzb21lIHVuY29tbW9uIHNldHRpbmdzIGFyZSBub3QgeWV0IGltcGxlbWVudGVkIGFuZCBtYXkKLW5ldmVyIGJlOyBub25pbnRlZ3JhbCBzYW1wbGluZyByYXRpb3MgYXJlIHRoZSBwcmltZSBleGFtcGxlLiAgRnVydGhlcm1vcmUsCi13ZSB0cmVhdCA4LWJpdCB2cy4gMTItYml0IGRhdGEgcHJlY2lzaW9uIGFzIGEgY29tcGlsZS10aW1lIHN3aXRjaCwgbm90IGEKLXJ1bi10aW1lIG9wdGlvbiwgYmVjYXVzZSBtb3N0IG1hY2hpbmVzIGNhbiBzdG9yZSA4LWJpdCBwaXhlbHMgbXVjaCBtb3JlCi1jb21wYWN0bHkgdGhhbiAxMi1iaXQuCi0KLUZvciBsZWdhbCByZWFzb25zLCBKUEVHIGFyaXRobWV0aWMgY29kaW5nIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLCBidXQKLWV4dGVuZGluZyB0aGUgbGlicmFyeSB0byBpbmNsdWRlIGl0IHdvdWxkIGJlIHN0cmFpZ2h0Zm9yd2FyZC4KLQotQnkgaXRzZWxmLCB0aGUgbGlicmFyeSBoYW5kbGVzIG9ubHkgaW50ZXJjaGFuZ2UgSlBFRyBkYXRhc3RyZWFtcyAtLS0gaW4KLXBhcnRpY3VsYXIgdGhlIHdpZGVseSB1c2VkIEpGSUYgZmlsZSBmb3JtYXQuICBUaGUgbGlicmFyeSBjYW4gYmUgdXNlZCBieQotc3Vycm91bmRpbmcgY29kZSB0byBwcm9jZXNzIGludGVyY2hhbmdlIG9yIGFiYnJldmlhdGVkIEpQRUcgZGF0YXN0cmVhbXMgdGhhdAotYXJlIGVtYmVkZGVkIGluIG1vcmUgY29tcGxleCBmaWxlIGZvcm1hdHMuICAoRm9yIGV4YW1wbGUsIGxpYnRpZmYgdXNlcyB0aGlzCi1saWJyYXJ5IHRvIGltcGxlbWVudCBKUEVHIGNvbXByZXNzaW9uIHdpdGhpbiB0aGUgVElGRiBmaWxlIGZvcm1hdC4pCi0KLVRoZSBsaWJyYXJ5IGluY2x1ZGVzIGEgc3Vic3RhbnRpYWwgYW1vdW50IG9mIGNvZGUgdGhhdCBpcyBub3QgY292ZXJlZCBieSB0aGUKLUpQRUcgc3RhbmRhcmQgYnV0IGlzIG5lY2Vzc2FyeSBmb3IgdHlwaWNhbCBhcHBsaWNhdGlvbnMgb2YgSlBFRy4gIFRoZXNlCi1mdW5jdGlvbnMgcHJlcHJvY2VzcyB0aGUgaW1hZ2UgYmVmb3JlIEpQRUcgY29tcHJlc3Npb24gb3IgcG9zdHByb2Nlc3MgaXQgYWZ0ZXIKLWRlY29tcHJlc3Npb24uICBUaGV5IGluY2x1ZGUgY29sb3JzcGFjZSBjb252ZXJzaW9uLCBkb3duc2FtcGxpbmcvdXBzYW1wbGluZywKLWFuZCBjb2xvciBxdWFudGl6YXRpb24uICBUaGlzIGNvZGUgY2FuIGJlIG9taXR0ZWQgaWYgbm90IG5lZWRlZC4KLQotQSB3aWRlIHJhbmdlIG9mIHF1YWxpdHkgdnMuIHNwZWVkIHRyYWRlb2ZmcyBhcmUgcG9zc2libGUgaW4gSlBFRyBwcm9jZXNzaW5nLAotYW5kIGV2ZW4gbW9yZSBzbyBpbiBkZWNvbXByZXNzaW9uIHBvc3Rwcm9jZXNzaW5nLiAgVGhlIGRlY29tcHJlc3Npb24gbGlicmFyeQotcHJvdmlkZXMgbXVsdGlwbGUgaW1wbGVtZW50YXRpb25zIHRoYXQgY292ZXIgbW9zdCBvZiB0aGUgdXNlZnVsIHRyYWRlb2ZmcywKLXJhbmdpbmcgZnJvbSB2ZXJ5LWhpZ2gtcXVhbGl0eSBkb3duIHRvIGZhc3QtcHJldmlldyBvcGVyYXRpb24uICBPbiB0aGUKLWNvbXByZXNzaW9uIHNpZGUgd2UgaGF2ZSBnZW5lcmFsbHkgbm90IHByb3ZpZGVkIGxvdy1xdWFsaXR5IGNob2ljZXMsIHNpbmNlCi1jb21wcmVzc2lvbiBpcyBub3JtYWxseSBsZXNzIHRpbWUtY3JpdGljYWwuICBJdCBzaG91bGQgYmUgdW5kZXJzdG9vZCB0aGF0IHRoZQotbG93LXF1YWxpdHkgbW9kZXMgbWF5IG5vdCBtZWV0IHRoZSBKUEVHIHN0YW5kYXJkJ3MgYWNjdXJhY3kgcmVxdWlyZW1lbnRzOwotbm9uZXRoZWxlc3MsIHRoZXkgYXJlIHVzZWZ1bCBmb3Igdmlld2Vycy4KLQotCi0qKiogUG9ydGFiaWxpdHkgaXNzdWVzICoqKgotCi1Qb3J0YWJpbGl0eSBpcyBhbiBlc3NlbnRpYWwgcmVxdWlyZW1lbnQgZm9yIHRoZSBsaWJyYXJ5LiAgVGhlIGtleSBwb3J0YWJpbGl0eQotaXNzdWVzIHRoYXQgc2hvdyB1cCBhdCB0aGUgbGV2ZWwgb2Ygc3lzdGVtIGFyY2hpdGVjdHVyZSBhcmU6Ci0KLTEuICBNZW1vcnkgdXNhZ2UuICBXZSB3YW50IHRoZSBjb2RlIHRvIGJlIGFibGUgdG8gcnVuIG9uIFBDLWNsYXNzIG1hY2hpbmVzCi13aXRoIGxpbWl0ZWQgbWVtb3J5LiAgSW1hZ2VzIHNob3VsZCB0aGVyZWZvcmUgYmUgcHJvY2Vzc2VkIHNlcXVlbnRpYWxseSAoaW4KLXN0cmlwcyksIHRvIGF2b2lkIGhvbGRpbmcgdGhlIHdob2xlIGltYWdlIGluIG1lbW9yeSBhdCBvbmNlLiAgV2hlcmUgYQotZnVsbC1pbWFnZSBidWZmZXIgaXMgbmVjZXNzYXJ5LCB3ZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgZWl0aGVyIHZpcnR1YWwgbWVtb3J5Ci1vciB0ZW1wb3JhcnkgZmlsZXMuCi0KLTIuICBOZWFyL2ZhciBwb2ludGVyIGRpc3RpbmN0aW9uLiAgVG8gcnVuIGVmZmljaWVudGx5IG9uIDgweDg2IG1hY2hpbmVzLCB0aGUKLWNvZGUgc2hvdWxkIGRpc3Rpbmd1aXNoICJzbWFsbCIgb2JqZWN0cyAoa2VwdCBpbiBuZWFyIGRhdGEgc3BhY2UpIGZyb20KLSJsYXJnZSIgb25lcyAoa2VwdCBpbiBmYXIgZGF0YSBzcGFjZSkuICBUaGlzIGlzIGFuIGFubm95aW5nIHJlc3RyaWN0aW9uLCBidXQKLWZvcnR1bmF0ZWx5IGl0IGRvZXMgbm90IGltcGFjdCBjb2RlIHF1YWxpdHkgZm9yIGxlc3MgYnJhaW4tZGFtYWdlZCBtYWNoaW5lcywKLWFuZCB0aGUgc291cmNlIGNvZGUgY2x1dHRlciB0dXJucyBvdXQgdG8gYmUgbWluaW1hbCB3aXRoIHN1ZmZpY2llbnQgdXNlIG9mCi1wb2ludGVyIHR5cGVkZWZzLgotCi0zLiBEYXRhIHByZWNpc2lvbi4gIFdlIGFzc3VtZSB0aGF0ICJjaGFyIiBpcyBhdCBsZWFzdCA4IGJpdHMsICJzaG9ydCIgYW5kCi0iaW50IiBhdCBsZWFzdCAxNiwgImxvbmciIGF0IGxlYXN0IDMyLiAgVGhlIGNvZGUgd2lsbCB3b3JrIGZpbmUgd2l0aCBsYXJnZXIKLWRhdGEgc2l6ZXMsIGFsdGhvdWdoIG1lbW9yeSBtYXkgYmUgdXNlZCBpbmVmZmljaWVudGx5IGluIHNvbWUgY2FzZXMuICBIb3dldmVyLAotdGhlIEpQRUcgY29tcHJlc3NlZCBkYXRhc3RyZWFtIG11c3QgdWx0aW1hdGVseSBhcHBlYXIgb24gZXh0ZXJuYWwgc3RvcmFnZSBhcyBhCi1zZXF1ZW5jZSBvZiA4LWJpdCBieXRlcyBpZiBpdCBpcyB0byBjb25mb3JtIHRvIHRoZSBzdGFuZGFyZC4gIFRoaXMgbWF5IHBvc2UgYQotcHJvYmxlbSBvbiBtYWNoaW5lcyB3aGVyZSBjaGFyIGlzIHdpZGVyIHRoYW4gOCBiaXRzLiAgVGhlIGxpYnJhcnkgcmVwcmVzZW50cwotY29tcHJlc3NlZCBkYXRhIGFzIGFuIGFycmF5IG9mIHZhbHVlcyBvZiB0eXBlZGVmIEpPQ1RFVC4gIElmIG5vIGRhdGEgdHlwZQotZXhhY3RseSA4IGJpdHMgd2lkZSBpcyBhdmFpbGFibGUsIGN1c3RvbSBkYXRhIHNvdXJjZSBhbmQgZGF0YSBkZXN0aW5hdGlvbgotbW9kdWxlcyBtdXN0IGJlIHdyaXR0ZW4gdG8gdW5wYWNrIGFuZCBwYWNrIHRoZSBjaG9zZW4gSk9DVEVUIGRhdGF0eXBlIGludG8KLTgtYml0IGV4dGVybmFsIHJlcHJlc2VudGF0aW9uLgotCi0KLSoqKiBTeXN0ZW0gb3ZlcnZpZXcgKioqCi0KLVRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgYXJlIGVhY2ggZGl2aWRlZCBpbnRvIHR3byBtYWluIHNlY3Rpb25zOgotdGhlIEpQRUcgY29tcHJlc3NvciBvciBkZWNvbXByZXNzb3IgcHJvcGVyLCBhbmQgdGhlIHByZXByb2Nlc3Npbmcgb3IKLXBvc3Rwcm9jZXNzaW5nIGZ1bmN0aW9ucy4gIFRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGVzZSB0d28gc2VjdGlvbnMgaXMgdGhlCi1pbWFnZSBkYXRhIHRoYXQgdGhlIG9mZmljaWFsIEpQRUcgc3BlYyByZWdhcmRzIGFzIGl0cyBpbnB1dCBvciBvdXRwdXQ6IHRoaXMKLWRhdGEgaXMgaW4gdGhlIGNvbG9yc3BhY2UgdG8gYmUgdXNlZCBmb3IgY29tcHJlc3Npb24sIGFuZCBpdCBpcyBkb3duc2FtcGxlZAotdG8gdGhlIHNhbXBsaW5nIGZhY3RvcnMgdG8gYmUgdXNlZC4gIFRoZSBwcmVwcm9jZXNzaW5nIGFuZCBwb3N0cHJvY2Vzc2luZwotc3RlcHMgYXJlIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIGEgbm9ybWFsIGltYWdlIHJlcHJlc2VudGF0aW9uIHRvIG9yIGZyb20KLXRoaXMgZm9ybS4gIChUaG9zZSBmZXcgYXBwbGljYXRpb25zIHRoYXQgd2FudCB0byBkZWFsIHdpdGggWUNiQ3IgZG93bnNhbXBsZWQKLWRhdGEgY2FuIHNraXAgdGhlIHByZXByb2Nlc3Npbmcgb3IgcG9zdHByb2Nlc3Npbmcgc3RlcC4pCi0KLUxvb2tpbmcgbW9yZSBjbG9zZWx5LCB0aGUgY29tcHJlc3NvciBsaWJyYXJ5IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbWFpbgotZWxlbWVudHM6Ci0KLSAgUHJlcHJvY2Vzc2luZzoKLSAgICAqIENvbG9yIHNwYWNlIGNvbnZlcnNpb24gKGUuZy4sIFJHQiB0byBZQ2JDcikuCi0gICAgKiBFZGdlIGV4cGFuc2lvbiBhbmQgZG93bnNhbXBsaW5nLiAgT3B0aW9uYWxseSwgdGhpcyBzdGVwIGNhbiBkbyBzaW1wbGUKLSAgICAgIHNtb290aGluZyAtLS0gdGhpcyBpcyBvZnRlbiBoZWxwZnVsIGZvciBsb3ctcXVhbGl0eSBzb3VyY2UgZGF0YS4KLSAgSlBFRyBwcm9wZXI6Ci0gICAgKiBNQ1UgYXNzZW1ibHksIERDVCwgcXVhbnRpemF0aW9uLgotICAgICogRW50cm9weSBjb2RpbmcgKHNlcXVlbnRpYWwgb3IgcHJvZ3Jlc3NpdmUsIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYykuCi0KLUluIGFkZGl0aW9uIHRvIHRoZXNlIG1vZHVsZXMgd2UgbmVlZCBvdmVyYWxsIGNvbnRyb2wsIG1hcmtlciBnZW5lcmF0aW9uLAotYW5kIHN1cHBvcnQgY29kZSAobWVtb3J5IG1hbmFnZW1lbnQgJiBlcnJvciBoYW5kbGluZykuICBUaGVyZSBpcyBhbHNvIGEKLW1vZHVsZSByZXNwb25zaWJsZSBmb3IgcGh5c2ljYWxseSB3cml0aW5nIHRoZSBvdXRwdXQgZGF0YSAtLS0gdHlwaWNhbGx5Ci10aGlzIGlzIGp1c3QgYW4gaW50ZXJmYWNlIHRvIGZ3cml0ZSgpLCBidXQgc29tZSBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8KLWRvIHNvbWV0aGluZyBlbHNlIHdpdGggdGhlIGRhdGEuCi0KLVRoZSBkZWNvbXByZXNzb3IgbGlicmFyeSBjb250YWlucyB0aGUgZm9sbG93aW5nIG1haW4gZWxlbWVudHM6Ci0KLSAgSlBFRyBwcm9wZXI6Ci0gICAgKiBFbnRyb3B5IGRlY29kaW5nIChzZXF1ZW50aWFsIG9yIHByb2dyZXNzaXZlLCBIdWZmbWFuIG9yIGFyaXRobWV0aWMpLgotICAgICogRGVxdWFudGl6YXRpb24sIGludmVyc2UgRENULCBNQ1UgZGlzYXNzZW1ibHkuCi0gIFBvc3Rwcm9jZXNzaW5nOgotICAgICogVXBzYW1wbGluZy4gIE9wdGlvbmFsbHksIHRoaXMgc3RlcCBtYXkgYmUgYWJsZSB0byBkbyBtb3JlIGdlbmVyYWwKLSAgICAgIHJlc2NhbGluZyBvZiB0aGUgaW1hZ2UuCi0gICAgKiBDb2xvciBzcGFjZSBjb252ZXJzaW9uIChlLmcuLCBZQ2JDciB0byBSR0IpLiAgVGhpcyBzdGVwIG1heSBhbHNvCi0gICAgICBwcm92aWRlIGdhbW1hIGFkanVzdG1lbnQgWyBjdXJyZW50bHkgaXQgZG9lcyBub3QgXS4KLSAgICAqIE9wdGlvbmFsIGNvbG9yIHF1YW50aXphdGlvbiAoZS5nLiwgcmVkdWN0aW9uIHRvIDI1NiBjb2xvcnMpLgotICAgICogT3B0aW9uYWwgY29sb3IgcHJlY2lzaW9uIHJlZHVjdGlvbiAoZS5nLiwgMjQtYml0IHRvIDE1LWJpdCBjb2xvcikuCi0gICAgICBbVGhpcyBmZWF0dXJlIGlzIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuXQotCi1XZSBhbHNvIG5lZWQgb3ZlcmFsbCBjb250cm9sLCBtYXJrZXIgcGFyc2luZywgYW5kIGEgZGF0YSBzb3VyY2UgbW9kdWxlLgotVGhlIHN1cHBvcnQgY29kZSAobWVtb3J5IG1hbmFnZW1lbnQgJiBlcnJvciBoYW5kbGluZykgY2FuIGJlIHNoYXJlZCB3aXRoCi10aGUgY29tcHJlc3Npb24gaGFsZiBvZiB0aGUgbGlicmFyeS4KLQotVGhlcmUgbWF5IGJlIHNldmVyYWwgaW1wbGVtZW50YXRpb25zIG9mIGVhY2ggb2YgdGhlc2UgZWxlbWVudHMsIHBhcnRpY3VsYXJseQotaW4gdGhlIGRlY29tcHJlc3Nvciwgd2hlcmUgYSB3aWRlIHJhbmdlIG9mIHNwZWVkL3F1YWxpdHkgdHJhZGVvZmZzIGlzIHZlcnkKLXVzZWZ1bC4gIEl0IG11c3QgYmUgdW5kZXJzdG9vZCB0aGF0IHNvbWUgb2YgdGhlIGJlc3Qgc3BlZWR1cHMgaW52b2x2ZQotbWVyZ2luZyBhZGphY2VudCBzdGVwcyBpbiB0aGUgcGlwZWxpbmUuICBGb3IgZXhhbXBsZSwgdXBzYW1wbGluZywgY29sb3Igc3BhY2UKLWNvbnZlcnNpb24sIGFuZCBjb2xvciBxdWFudGl6YXRpb24gbWlnaHQgYWxsIGJlIGRvbmUgYXQgb25jZSB3aGVuIHVzaW5nIGEKLWxvdy1xdWFsaXR5IG9yZGVyZWQtZGl0aGVyIHRlY2huaXF1ZS4gIFRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlIGlzIGRlc2lnbmVkIHRvCi1hbGxvdyBzdWNoIG1lcmdpbmcgd2hlcmUgYXBwcm9wcmlhdGUuCi0KLQotTm90ZTogaXQgaXMgY29udmVuaWVudCB0byByZWdhcmQgZWRnZSBleHBhbnNpb24gKHBhZGRpbmcgdG8gYmxvY2sgYm91bmRhcmllcykKLWFzIGEgcHJlcHJvY2Vzc2luZy9wb3N0cHJvY2Vzc2luZyBmdW5jdGlvbiwgZXZlbiB0aG91Z2ggdGhlIEpQRUcgc3BlYyBpbmNsdWRlcwotaXQgaW4gY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbi4gIFdlIGRvIHRoaXMgYmVjYXVzZSBkb3duc2FtcGxpbmcvdXBzYW1wbGluZwotY2FuIGJlIHNpbXBsaWZpZWQgYSBsaXR0bGUgaWYgdGhleSB3b3JrIG9uIHBhZGRlZCBkYXRhOiBpdCdzIG5vdCBuZWNlc3NhcnkgdG8KLWhhdmUgc3BlY2lhbCBjYXNlcyBhdCB0aGUgcmlnaHQgYW5kIGJvdHRvbSBlZGdlcy4gIFRoZXJlZm9yZSB0aGUgaW50ZXJmYWNlCi1idWZmZXIgaXMgYWx3YXlzIGFuIGludGVncmFsIG51bWJlciBvZiBibG9ja3Mgd2lkZSBhbmQgaGlnaCwgYW5kIHdlIGV4cGVjdAotY29tcHJlc3Npb24gcHJlcHJvY2Vzc2luZyB0byBwYWQgdGhlIHNvdXJjZSBkYXRhIHByb3Blcmx5LiAgUGFkZGluZyB3aWxsIG9jY3VyCi1vbmx5IHRvIHRoZSBuZXh0IGJsb2NrICg4LXNhbXBsZSkgYm91bmRhcnkuICBJbiBhbiBpbnRlcmxlYXZlZC1zY2FuIHNpdHVhdGlvbiwKLWFkZGl0aW9uYWwgZHVtbXkgYmxvY2tzIG1heSBiZSB1c2VkIHRvIGZpbGwgb3V0IE1DVXMsIGJ1dCB0aGUgTUNVIGFzc2VtYmx5IGFuZAotZGlzYXNzZW1ibHkgbG9naWMgd2lsbCBjcmVhdGUgb3IgZGlzY2FyZCB0aGVzZSBibG9ja3MgaW50ZXJuYWxseS4gIChUaGlzIGlzCi1hZHZhbnRhZ2VvdXMgZm9yIHNwZWVkIHJlYXNvbnMsIHNpbmNlIHdlIGF2b2lkIERDVGluZyB0aGUgZHVtbXkgYmxvY2tzLgotSXQgYWxzbyBwZXJtaXRzIGEgc21hbGwgcmVkdWN0aW9uIGluIGZpbGUgc2l6ZSwgYmVjYXVzZSB0aGUgY29tcHJlc3NvciBjYW4KLWNob29zZSBkdW1teSBibG9jayBjb250ZW50cyBzbyBhcyB0byBtaW5pbWl6ZSB0aGVpciBzaXplIGluIGNvbXByZXNzZWQgZm9ybS4KLUZpbmFsbHksIGl0IG1ha2VzIHRoZSBpbnRlcmZhY2UgYnVmZmVyIHNwZWNpZmljYXRpb24gaW5kZXBlbmRlbnQgb2Ygd2hldGhlcgotdGhlIGZpbGUgaXMgYWN0dWFsbHkgaW50ZXJsZWF2ZWQgb3Igbm90LikgIEFwcGxpY2F0aW9ucyB0aGF0IHdpc2ggdG8gZGVhbAotZGlyZWN0bHkgd2l0aCB0aGUgZG93bnNhbXBsZWQgZGF0YSBtdXN0IHByb3ZpZGUgc2ltaWxhciBidWZmZXJpbmcgYW5kIHBhZGRpbmcKLWZvciBvZGQtc2l6ZWQgaW1hZ2VzLgotCi0KLSoqKiBQb29yIG1hbidzIG9iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZyAqKioKLQotSXQgc2hvdWxkIGJlIGNsZWFyIGJ5IG5vdyB0aGF0IHdlIGhhdmUgYSBsb3Qgb2YgcXVhc2ktaW5kZXBlbmRlbnQgcHJvY2Vzc2luZwotc3RlcHMsIG1hbnkgb2Ygd2hpY2ggaGF2ZSBzZXZlcmFsIHBvc3NpYmxlIGJlaGF2aW9ycy4gIFRvIGF2b2lkIGNsdXR0ZXJpbmcgdGhlCi1jb2RlIHdpdGggbG90cyBvZiBzd2l0Y2ggc3RhdGVtZW50cywgd2UgdXNlIGEgc2ltcGxlIGZvcm0gb2Ygb2JqZWN0LXN0eWxlCi1wcm9ncmFtbWluZyB0byBzZXBhcmF0ZSBvdXQgdGhlIGRpZmZlcmVudCBwb3NzaWJpbGl0aWVzLgotCi1Gb3IgZXhhbXBsZSwgdHdvIGRpZmZlcmVudCBjb2xvciBxdWFudGl6YXRpb24gYWxnb3JpdGhtcyBjb3VsZCBiZSBpbXBsZW1lbnRlZAotYXMgdHdvIHNlcGFyYXRlIG1vZHVsZXMgdGhhdCBwcmVzZW50IHRoZSBzYW1lIGV4dGVybmFsIGludGVyZmFjZTsgYXQgcnVudGltZSwKLXRoZSBjYWxsaW5nIGNvZGUgd2lsbCBhY2Nlc3MgdGhlIHByb3BlciBtb2R1bGUgaW5kaXJlY3RseSB0aHJvdWdoIGFuICJvYmplY3QiLgotCi1XZSBjYW4gZ2V0IHRoZSBsaW1pdGVkIGZlYXR1cmVzIHdlIG5lZWQgd2hpbGUgc3RheWluZyB3aXRoaW4gcG9ydGFibGUgQy4KLVRoZSBiYXNpYyB0b29sIGlzIGEgZnVuY3Rpb24gcG9pbnRlci4gIEFuICJvYmplY3QiIGlzIGp1c3QgYSBzdHJ1Y3QKLWNvbnRhaW5pbmcgb25lIG9yIG1vcmUgZnVuY3Rpb24gcG9pbnRlciBmaWVsZHMsIGVhY2ggb2Ygd2hpY2ggY29ycmVzcG9uZHMgdG8KLWEgbWV0aG9kIG5hbWUgaW4gcmVhbCBvYmplY3Qtb3JpZW50ZWQgbGFuZ3VhZ2VzLiAgRHVyaW5nIGluaXRpYWxpemF0aW9uIHdlCi1maWxsIGluIHRoZSBmdW5jdGlvbiBwb2ludGVycyB3aXRoIHJlZmVyZW5jZXMgdG8gd2hpY2hldmVyIG1vZHVsZSB3ZSBoYXZlCi1kZXRlcm1pbmVkIHdlIG5lZWQgdG8gdXNlIGluIHRoaXMgcnVuLiAgVGhlbiBpbnZvY2F0aW9uIG9mIHRoZSBtb2R1bGUgaXMgZG9uZQotYnkgaW5kaXJlY3RpbmcgdGhyb3VnaCBhIGZ1bmN0aW9uIHBvaW50ZXI7IG9uIG1vc3QgbWFjaGluZXMgdGhpcyBpcyBubyBtb3JlCi1leHBlbnNpdmUgdGhhbiBhIHN3aXRjaCBzdGF0ZW1lbnQsIHdoaWNoIHdvdWxkIGJlIHRoZSBvbmx5IG90aGVyIHdheSBvZgotbWFraW5nIHRoZSByZXF1aXJlZCBydW4tdGltZSBjaG9pY2UuICBUaGUgcmVhbGx5IHNpZ25pZmljYW50IGJlbmVmaXQsIG9mCi1jb3Vyc2UsIGlzIGtlZXBpbmcgdGhlIHNvdXJjZSBjb2RlIGNsZWFuIGFuZCB3ZWxsIHN0cnVjdHVyZWQuCi0KLVdlIGNhbiBhbHNvIGFycmFuZ2UgdG8gaGF2ZSBwcml2YXRlIHN0b3JhZ2UgdGhhdCB2YXJpZXMgYmV0d2VlbiBkaWZmZXJlbnQKLWltcGxlbWVudGF0aW9ucyBvZiB0aGUgc2FtZSBraW5kIG9mIG9iamVjdC4gIFdlIGRvIHRoaXMgYnkgbWFraW5nIGFsbCB0aGUKLW1vZHVsZS1zcGVjaWZpYyBvYmplY3Qgc3RydWN0cyBiZSBzZXBhcmF0ZWx5IGFsbG9jYXRlZCBlbnRpdGllcywgd2hpY2ggd2lsbAotYmUgYWNjZXNzZWQgdmlhIHBvaW50ZXJzIGluIHRoZSBtYXN0ZXIgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBzdHJ1Y3QuCi1UaGUgInB1YmxpYyIgZmllbGRzIG9yIG1ldGhvZHMgZm9yIGEgZ2l2ZW4ga2luZCBvZiBvYmplY3QgYXJlIHNwZWNpZmllZCBieQotYSBjb21tb25seSBrbm93biBzdHJ1Y3QuICBCdXQgYSBtb2R1bGUncyBpbml0aWFsaXphdGlvbiBjb2RlIGNhbiBhbGxvY2F0ZQotYSBsYXJnZXIgc3RydWN0IHRoYXQgY29udGFpbnMgdGhlIGNvbW1vbiBzdHJ1Y3QgYXMgaXRzIGZpcnN0IG1lbWJlciwgcGx1cwotYWRkaXRpb25hbCBwcml2YXRlIGZpZWxkcy4gIFdpdGggYXBwcm9wcmlhdGUgcG9pbnRlciBjYXN0aW5nLCB0aGUgbW9kdWxlJ3MKLWludGVybmFsIGZ1bmN0aW9ucyBjYW4gYWNjZXNzIHRoZXNlIHByaXZhdGUgZmllbGRzLiAgKEZvciBhIHNpbXBsZSBleGFtcGxlLAotc2VlIGpkYXRhZHN0LmMsIHdoaWNoIGltcGxlbWVudHMgdGhlIGV4dGVybmFsIGludGVyZmFjZSBzcGVjaWZpZWQgYnkgc3RydWN0Ci1qcGVnX2Rlc3RpbmF0aW9uX21nciwgYnV0IGFkZHMgZXh0cmEgZmllbGRzLikKLQotKE9mIGNvdXJzZSB0aGlzIHdvdWxkIGFsbCBiZSBhIGxvdCBlYXNpZXIgaWYgd2Ugd2VyZSB1c2luZyBDKyssIGJ1dCB3ZSBhcmUKLW5vdCB5ZXQgcHJlcGFyZWQgdG8gYXNzdW1lIHRoYXQgZXZlcnlvbmUgaGFzIGEgQysrIGNvbXBpbGVyLikKLQotQW4gaW1wb3J0YW50IGJlbmVmaXQgb2YgdGhpcyBzY2hlbWUgaXMgdGhhdCBpdCBpcyBlYXN5IHRvIHByb3ZpZGUgbXVsdGlwbGUKLXZlcnNpb25zIG9mIGFueSBtZXRob2QsIGVhY2ggdHVuZWQgdG8gYSBwYXJ0aWN1bGFyIGNhc2UuICBXaGlsZSBhIGxvdCBvZgotcHJlY2FsY3VsYXRpb24gbWlnaHQgYmUgZG9uZSB0byBzZWxlY3QgYW4gb3B0aW1hbCBpbXBsZW1lbnRhdGlvbiBvZiBhIG1ldGhvZCwKLXRoZSBjb3N0IHBlciBpbnZvY2F0aW9uIGlzIGNvbnN0YW50LiAgRm9yIGV4YW1wbGUsIHRoZSB1cHNhbXBsaW5nIHN0ZXAgbWlnaHQKLWhhdmUgYSAiZ2VuZXJpYyIgbWV0aG9kLCBwbHVzIG9uZSBvciBtb3JlICJoYXJkd2lyZWQiIG1ldGhvZHMgZm9yIHRoZSBtb3N0Ci1wb3B1bGFyIHNhbXBsaW5nIGZhY3RvcnM7IHRoZSBoYXJkd2lyZWQgbWV0aG9kcyB3b3VsZCBiZSBmYXN0ZXIgYmVjYXVzZSB0aGV5J2QKLXVzZSBzdHJhaWdodC1saW5lIGNvZGUgaW5zdGVhZCBvZiBmb3ItbG9vcHMuICBUaGUgY29zdCB0byBkZXRlcm1pbmUgd2hpY2gKLW1ldGhvZCB0byB1c2UgaXMgcGFpZCBvbmx5IG9uY2UsIGF0IHN0YXJ0dXAsIGFuZCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhIGFyZQotaGlkZGVuIGZyb20gdGhlIGNhbGxlcnMgb2YgdGhlIG1ldGhvZC4KLQotVGhpcyBwbGFuIGRpZmZlcnMgYSBsaXR0bGUgYml0IGZyb20gdXN1YWwgb2JqZWN0LW9yaWVudGVkIHN0cnVjdHVyZXMsIGluIHRoYXQKLW9ubHkgb25lIGluc3RhbmNlIG9mIGVhY2ggb2JqZWN0IGNsYXNzIHdpbGwgZXhpc3QgZHVyaW5nIGV4ZWN1dGlvbi4gIFRoZQotcmVhc29uIGZvciBoYXZpbmcgdGhlIGNsYXNzIHN0cnVjdHVyZSBpcyB0aGF0IG9uIGRpZmZlcmVudCBydW5zIHdlIG1heSBjcmVhdGUKLWRpZmZlcmVudCBpbnN0YW5jZXMgKGNob29zZSB0byBleGVjdXRlIGRpZmZlcmVudCBtb2R1bGVzKS4gIFlvdSBjYW4gdGhpbmsgb2YKLXRoZSB0ZXJtICJtZXRob2QiIGFzIGRlbm90aW5nIHRoZSBjb21tb24gaW50ZXJmYWNlIHByZXNlbnRlZCBieSBhIHBhcnRpY3VsYXIKLXNldCBvZiBpbnRlcmNoYW5nZWFibGUgZnVuY3Rpb25zLCBhbmQgIm9iamVjdCIgYXMgZGVub3RpbmcgYSBncm91cCBvZiByZWxhdGVkCi1tZXRob2RzLCBvciB0aGUgdG90YWwgc2hhcmVkIGludGVyZmFjZSBiZWhhdmlvciBvZiBhIGdyb3VwIG9mIG1vZHVsZXMuCi0KLQotKioqIE92ZXJhbGwgY29udHJvbCBzdHJ1Y3R1cmUgKioqCi0KLVdlIHByZXZpb3VzbHkgbWVudGlvbmVkIHRoZSBuZWVkIGZvciBvdmVyYWxsIGNvbnRyb2wgbG9naWMgaW4gdGhlIGNvbXByZXNzaW9uCi1hbmQgZGVjb21wcmVzc2lvbiBsaWJyYXJpZXMuICBJbiBJSkcgaW1wbGVtZW50YXRpb25zIHByaW9yIHRvIHY1LCBvdmVyYWxsCi1jb250cm9sIHdhcyBtb3N0bHkgcHJvdmlkZWQgYnkgInBpcGVsaW5lIGNvbnRyb2wiIG1vZHVsZXMsIHdoaWNoIHByb3ZlZCB0byBiZQotbGFyZ2UsIHVud2llbGR5LCBhbmQgaGFyZCB0byB1bmRlcnN0YW5kLiAgVG8gaW1wcm92ZSB0aGUgc2l0dWF0aW9uLCB0aGUKLWNvbnRyb2wgbG9naWMgaGFzIGJlZW4gc3ViZGl2aWRlZCBpbnRvIG11bHRpcGxlIG1vZHVsZXMuICBUaGUgY29udHJvbCBtb2R1bGVzCi1jb25zaXN0IG9mOgotCi0xLiBNYXN0ZXIgY29udHJvbCBmb3IgbW9kdWxlIHNlbGVjdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24uICBUaGlzIGhhcyB0d28KLXJlc3BvbnNpYmlsaXRpZXM6Ci0KLSAgIDFBLiAgU3RhcnR1cCBpbml0aWFsaXphdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIGltYWdlIHByb2Nlc3NpbmcuCi0gICAgICAgIFRoZSBpbmRpdmlkdWFsIHByb2Nlc3NpbmcgbW9kdWxlcyB0byBiZSB1c2VkIGluIHRoaXMgcnVuIGFyZSBzZWxlY3RlZAotICAgICAgICBhbmQgZ2l2ZW4gaW5pdGlhbGl6YXRpb24gY2FsbHMuCi0KLSAgIDFCLiAgUGVyLXBhc3MgY29udHJvbC4gIFRoaXMgZGV0ZXJtaW5lcyBob3cgbWFueSBwYXNzZXMgd2lsbCBiZSBwZXJmb3JtZWQKLSAgICAgICAgYW5kIGNhbGxzIGVhY2ggYWN0aXZlIHByb2Nlc3NpbmcgbW9kdWxlIHRvIGNvbmZpZ3VyZSBpdHNlbGYKLSAgICAgICAgYXBwcm9wcmlhdGVseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcGFzcy4gIEVuZC1vZi1wYXNzIHByb2Nlc3NpbmcsCi0Jd2hlcmUgbmVjZXNzYXJ5LCBpcyBhbHNvIGludm9rZWQgZnJvbSB0aGUgbWFzdGVyIGNvbnRyb2wgbW9kdWxlLgotCi0gICBNZXRob2Qgc2VsZWN0aW9uIGlzIHBhcnRpYWxseSBkaXN0cmlidXRlZCwgaW4gdGhhdCBhIHBhcnRpY3VsYXIgcHJvY2Vzc2luZwotICAgbW9kdWxlIG1heSBjb250YWluIHNldmVyYWwgcG9zc2libGUgaW1wbGVtZW50YXRpb25zIG9mIGEgcGFydGljdWxhciBtZXRob2QsCi0gICB3aGljaCBpdCB3aWxsIHNlbGVjdCBhbW9uZyB3aGVuIGdpdmVuIGl0cyBpbml0aWFsaXphdGlvbiBjYWxsLiAgVGhlIG1hc3RlcgotICAgY29udHJvbCBjb2RlIG5lZWQgb25seSBiZSBjb25jZXJuZWQgd2l0aCBkZWNpc2lvbnMgdGhhdCBhZmZlY3QgbW9yZSB0aGFuCi0gICBvbmUgbW9kdWxlLgotIAotMi4gRGF0YSBidWZmZXJpbmcgY29udHJvbC4gIEEgc2VwYXJhdGUgY29udHJvbCBtb2R1bGUgZXhpc3RzIGZvciBlYWNoCi0gICBpbnRlci1wcm9jZXNzaW5nLXN0ZXAgZGF0YSBidWZmZXIuICBUaGlzIG1vZHVsZSBpcyByZXNwb25zaWJsZSBmb3IKLSAgIGludm9raW5nIHRoZSBwcm9jZXNzaW5nIHN0ZXBzIHRoYXQgd3JpdGUgb3IgcmVhZCB0aGF0IGRhdGEgYnVmZmVyLgotCi1FYWNoIGJ1ZmZlciBjb250cm9sbGVyIHNlZXMgdGhlIHdvcmxkIGFzIGZvbGxvd3M6Ci0KLWlucHV0IGRhdGEgPT4gcHJvY2Vzc2luZyBzdGVwIEEgPT4gYnVmZmVyID0+IHByb2Nlc3Npbmcgc3RlcCBCID0+IG91dHB1dCBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnRyb2xsZXIgLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBjb250cm9sbGVyIGtub3dzIHRoZSBkYXRhZmxvdyByZXF1aXJlbWVudHMgb2Ygc3RlcHMgQSBhbmQgQjogaG93IG11Y2ggZGF0YQotdGhleSB3YW50IHRvIGFjY2VwdCBpbiBvbmUgY2h1bmsgYW5kIGhvdyBtdWNoIHRoZXkgb3V0cHV0IGluIG9uZSBjaHVuay4gIEl0cwotZnVuY3Rpb24gaXMgdG8gbWFuYWdlIGl0cyBidWZmZXIgYW5kIGNhbGwgQSBhbmQgQiBhdCB0aGUgcHJvcGVyIHRpbWVzLgotCi1BIGRhdGEgYnVmZmVyIGNvbnRyb2wgbW9kdWxlIG1heSBpdHNlbGYgYmUgdmlld2VkIGFzIGEgcHJvY2Vzc2luZyBzdGVwIGJ5IGEKLWhpZ2hlci1sZXZlbCBjb250cm9sIG1vZHVsZTsgdGh1cyB0aGUgY29udHJvbCBtb2R1bGVzIGZvcm0gYSBiaW5hcnkgdHJlZSB3aXRoCi1lbGVtZW50YXJ5IHByb2Nlc3Npbmcgc3RlcHMgYXQgdGhlIGxlYXZlcyBvZiB0aGUgdHJlZS4KLQotVGhlIGNvbnRyb2wgbW9kdWxlcyBhcmUgb2JqZWN0cy4gIEEgY29uc2lkZXJhYmxlIGFtb3VudCBvZiBmbGV4aWJpbGl0eSBjYW4KLWJlIGhhZCBieSByZXBsYWNpbmcgaW1wbGVtZW50YXRpb25zIG9mIGEgY29udHJvbCBtb2R1bGUuICBGb3IgZXhhbXBsZToKLSogTWVyZ2luZyBvZiBhZGphY2VudCBzdGVwcyBpbiB0aGUgcGlwZWxpbmUgaXMgZG9uZSBieSByZXBsYWNpbmcgYSBjb250cm9sCi0gIG1vZHVsZSBhbmQgaXRzIHBhaXIgb2YgcHJvY2Vzc2luZy1zdGVwIG1vZHVsZXMgd2l0aCBhIHNpbmdsZSBwcm9jZXNzaW5nLQotICBzdGVwIG1vZHVsZS4gIChIZW5jZSB0aGUgcG9zc2libGUgbWVyZ2VzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSB0cmVlIG9mCi0gIGNvbnRyb2wgbW9kdWxlcy4pCi0qIEluIHNvbWUgcHJvY2Vzc2luZyBtb2RlcywgYSBnaXZlbiBpbnRlcnN0ZXAgYnVmZmVyIG5lZWQgb25seSBiZSBhICJzdHJpcCIKLSAgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBhY2NvbW1vZGF0ZSB0aGUgZGVzaXJlZCBkYXRhIGNodW5rIHNpemVzLiAgSW4gb3RoZXIKLSAgbW9kZXMsIGEgZnVsbC1pbWFnZSBidWZmZXIgaXMgbmVlZGVkIGFuZCBzZXZlcmFsIHBhc3NlcyBhcmUgcmVxdWlyZWQuCi0gIFRoZSBjb250cm9sIG1vZHVsZSBkZXRlcm1pbmVzIHdoaWNoIGtpbmQgb2YgYnVmZmVyIGlzIHVzZWQgYW5kIG1hbmlwdWxhdGVzCi0gIHZpcnR1YWwgYXJyYXkgYnVmZmVycyBhcyBuZWVkZWQuICBPbmUgb3IgYm90aCBwcm9jZXNzaW5nIHN0ZXBzIG1heSBiZQotICB1bmF3YXJlIG9mIHRoZSBtdWx0aS1wYXNzIGJlaGF2aW9yLgotCi1JbiB0aGVvcnksIHdlIG1pZ2h0IGJlIGFibGUgdG8gbWFrZSBhbGwgb2YgdGhlIGRhdGEgYnVmZmVyIGNvbnRyb2xsZXJzCi1pbnRlcmNoYW5nZWFibGUgYW5kIHByb3ZpZGUganVzdCBvbmUgc2V0IG9mIGltcGxlbWVudGF0aW9ucyBmb3IgYWxsLiAgSW4KLXByYWN0aWNlLCBlYWNoIG9uZSBjb250YWlucyBjb25zaWRlcmFibGUgc3BlY2lhbC1jYXNlIHByb2Nlc3NpbmcgZm9yIGl0cwotcGFydGljdWxhciBqb2IuICBUaGUgYnVmZmVyIGNvbnRyb2xsZXIgY29uY2VwdCBzaG91bGQgYmUgcmVnYXJkZWQgYXMgYW4KLW92ZXJhbGwgc3lzdGVtIHN0cnVjdHVyaW5nIHByaW5jaXBsZSwgbm90IGFzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlCi10YXNrIHBlcmZvcm1lZCBieSBhbnkgb25lIGNvbnRyb2xsZXIuCi0KLQotKioqIENvbXByZXNzaW9uIG9iamVjdCBzdHJ1Y3R1cmUgKioqCi0KLUhlcmUgaXMgYSBza2V0Y2ggb2YgdGhlIGxvZ2ljYWwgc3RydWN0dXJlIG9mIHRoZSBKUEVHIGNvbXByZXNzaW9uIGxpYnJhcnk6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0gQ29sb3JzcGFjZSBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICB8LS0gUHJlcHJvY2Vzc2luZyBjb250cm9sbGVyIC0tfAotICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBEb3duc2FtcGxpbmcKLU1haW4gY29udHJvbGxlciAtLXwKLSAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIEZvcndhcmQgRENULCBxdWFudGl6ZQotICAgICAgICAgICAgICAgICAgfC0tIENvZWZmaWNpZW50IGNvbnRyb2xsZXIgLS18Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBFbnRyb3B5IGVuY29kaW5nCi0KLVRoaXMgc2tldGNoIGFsc28gZGVzY3JpYmVzIHRoZSBmbG93IG9mIGNvbnRyb2wgKHN1YnJvdXRpbmUgY2FsbHMpIGR1cmluZwotdHlwaWNhbCBpbWFnZSBkYXRhIHByb2Nlc3NpbmcuICBFYWNoIG9mIHRoZSBjb21wb25lbnRzIHNob3duIGluIHRoZSBkaWFncmFtIGlzCi1hbiAib2JqZWN0IiB3aGljaCBtYXkgaGF2ZSBzZXZlcmFsIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgYXZhaWxhYmxlLiAgT25lCi1vciBtb3JlIHNvdXJjZSBjb2RlIGZpbGVzIGNvbnRhaW4gdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbihzKSBvZiBlYWNoIG9iamVjdC4KLQotVGhlIG9iamVjdHMgc2hvd24gYWJvdmUgYXJlOgotCi0qIE1haW4gY29udHJvbGxlcjogYnVmZmVyIGNvbnRyb2xsZXIgZm9yIHRoZSBzdWJzYW1wbGVkLWRhdGEgYnVmZmVyLCB3aGljaAotICBob2xkcyB0aGUgcHJlcHJvY2Vzc2VkIGlucHV0IGRhdGEuICBUaGlzIGNvbnRyb2xsZXIgaW52b2tlcyBwcmVwcm9jZXNzaW5nIHRvCi0gIGZpbGwgdGhlIHN1YnNhbXBsZWQtZGF0YSBidWZmZXIsIGFuZCBKUEVHIGNvbXByZXNzaW9uIHRvIGVtcHR5IGl0LiAgVGhlcmUgaXMKLSAgdXN1YWxseSBubyBuZWVkIGZvciBhIGZ1bGwtaW1hZ2UgYnVmZmVyIGhlcmU7IGEgc3RyaXAgYnVmZmVyIGlzIGFkZXF1YXRlLgotCi0qIFByZXByb2Nlc3NpbmcgY29udHJvbGxlcjogYnVmZmVyIGNvbnRyb2xsZXIgZm9yIHRoZSBkb3duc2FtcGxpbmcgaW5wdXQgZGF0YQotICBidWZmZXIsIHdoaWNoIGxpZXMgYmV0d2VlbiBjb2xvcnNwYWNlIGNvbnZlcnNpb24gYW5kIGRvd25zYW1wbGluZy4gIE5vdGUKLSAgdGhhdCBhIHVuaWZpZWQgY29udmVyc2lvbi9kb3duc2FtcGxpbmcgbW9kdWxlIHdvdWxkIHByb2JhYmx5IHJlcGxhY2UgdGhpcwotICBjb250cm9sbGVyIGVudGlyZWx5LgotCi0qIENvbG9yc3BhY2UgY29udmVyc2lvbjogY29udmVydHMgYXBwbGljYXRpb24gaW1hZ2UgZGF0YSBpbnRvIHRoZSBkZXNpcmVkCi0gIEpQRUcgY29sb3Igc3BhY2U7IGFsc28gY2hhbmdlcyB0aGUgZGF0YSBmcm9tIHBpeGVsLWludGVybGVhdmVkIGxheW91dCB0bwotICBzZXBhcmF0ZSBjb21wb25lbnQgcGxhbmVzLiAgUHJvY2Vzc2VzIG9uZSBwaXhlbCByb3cgYXQgYSB0aW1lLgotCi0qIERvd25zYW1wbGluZzogcGVyZm9ybXMgcmVkdWN0aW9uIG9mIGNocm9tYSBjb21wb25lbnRzIGFzIHJlcXVpcmVkLgotICBPcHRpb25hbGx5IG1heSBwZXJmb3JtIHBpeGVsLWxldmVsIHNtb290aGluZyBhcyB3ZWxsLiAgUHJvY2Vzc2VzIGEgInJvdwotICBncm91cCIgYXQgYSB0aW1lLCB3aGVyZSBhIHJvdyBncm91cCBpcyBkZWZpbmVkIGFzIFZtYXggcGl4ZWwgcm93cyBvZiBlYWNoCi0gIGNvbXBvbmVudCBiZWZvcmUgZG93bnNhbXBsaW5nLCBhbmQgVmsgc2FtcGxlIHJvd3MgYWZ0ZXJ3YXJkcyAocmVtZW1iZXIgVmsKLSAgZGlmZmVycyBhY3Jvc3MgY29tcG9uZW50cykuICBTb21lIGRvd25zYW1wbGluZyBvciBzbW9vdGhpbmcgYWxnb3JpdGhtcyBtYXkKLSAgcmVxdWlyZSBjb250ZXh0IHJvd3MgYWJvdmUgYW5kIGJlbG93IHRoZSBjdXJyZW50IHJvdyBncm91cDsgdGhlCi0gIHByZXByb2Nlc3NpbmcgY29udHJvbGxlciBpcyByZXNwb25zaWJsZSBmb3Igc3VwcGx5aW5nIHRoZXNlIHJvd3MgdmlhIHByb3BlcgotICBidWZmZXJpbmcuICBUaGUgZG93bnNhbXBsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVkZ2UgZXhwYW5zaW9uIGF0IHRoZSByaWdodAotICBlZGdlIChpLmUuLCBleHRlbmRpbmcgZWFjaCBzYW1wbGUgcm93IHRvIGEgbXVsdGlwbGUgb2YgOCBzYW1wbGVzKTsgYnV0IHRoZQotICBwcmVwcm9jZXNzaW5nIGNvbnRyb2xsZXIgaXMgcmVzcG9uc2libGUgZm9yIHZlcnRpY2FsIGVkZ2UgZXhwYW5zaW9uIChpLmUuLAotICBkdXBsaWNhdGluZyB0aGUgYm90dG9tIHNhbXBsZSByb3cgYXMgbmVlZGVkIHRvIG1ha2UgYSBtdWx0aXBsZSBvZiA4IHJvd3MpLgotCi0qIENvZWZmaWNpZW50IGNvbnRyb2xsZXI6IGJ1ZmZlciBjb250cm9sbGVyIGZvciB0aGUgRENULWNvZWZmaWNpZW50IGRhdGEuCi0gIFRoaXMgY29udHJvbGxlciBoYW5kbGVzIE1DVSBhc3NlbWJseSwgaW5jbHVkaW5nIGluc2VydGlvbiBvZiBkdW1teSBEQ1QKLSAgYmxvY2tzIHdoZW4gbmVlZGVkIGF0IHRoZSByaWdodCBvciBib3R0b20gZWRnZS4gIFdoZW4gcGVyZm9ybWluZwotICBIdWZmbWFuLWNvZGUgb3B0aW1pemF0aW9uIG9yIGVtaXR0aW5nIGEgbXVsdGlzY2FuIEpQRUcgZmlsZSwgdGhpcwotICBjb250cm9sbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBidWZmZXJpbmcgdGhlIGZ1bGwgaW1hZ2UuICBUaGUgZXF1aXZhbGVudCBvZgotICBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyBvZiBzdWJzYW1wbGVkIGRhdGEgaXMgcHJvY2Vzc2VkIHBlciBjYWxsLAotICBldmVuIHdoZW4gdGhlIEpQRUcgZmlsZSBpcyBub25pbnRlcmxlYXZlZC4KLQotKiBGb3J3YXJkIERDVCBhbmQgcXVhbnRpemF0aW9uOiBQZXJmb3JtIERDVCwgcXVhbnRpemUsIGFuZCBlbWl0IGNvZWZmaWNpZW50cy4KLSAgV29ya3Mgb24gb25lIG9yIG1vcmUgRENUIGJsb2NrcyBhdCBhIHRpbWUuICAoTm90ZTogdGhlIGNvZWZmaWNpZW50cyBhcmUgbm93Ci0gIGVtaXR0ZWQgaW4gbm9ybWFsIGFycmF5IG9yZGVyLCB3aGljaCB0aGUgZW50cm9weSBlbmNvZGVyIGlzIGV4cGVjdGVkIHRvCi0gIGNvbnZlcnQgdG8gemlnemFnIG9yZGVyIGFzIG5lY2Vzc2FyeS4gIFByaW9yIHZlcnNpb25zIG9mIHRoZSBJSkcgY29kZSBkaWQKLSAgdGhlIGNvbnZlcnNpb24gdG8gemlnemFnIG9yZGVyIHdpdGhpbiB0aGUgcXVhbnRpemF0aW9uIHN0ZXAuKQotCi0qIEVudHJvcHkgZW5jb2Rpbmc6IFBlcmZvcm0gSHVmZm1hbiBvciBhcml0aG1ldGljIGVudHJvcHkgY29kaW5nIGFuZCBlbWl0IHRoZQotICBjb2RlZCBkYXRhIHRvIHRoZSBkYXRhIGRlc3RpbmF0aW9uIG1vZHVsZS4gIFdvcmtzIG9uIG9uZSBNQ1UgcGVyIGNhbGwuCi0gIEZvciBwcm9ncmVzc2l2ZSBKUEVHLCB0aGUgc2FtZSBEQ1QgYmxvY2tzIGFyZSBmZWQgdG8gdGhlIGVudHJvcHkgY29kZXIKLSAgZHVyaW5nIGVhY2ggcGFzcywgYW5kIHRoZSBjb2RlciBtdXN0IGVtaXQgdGhlIGFwcHJvcHJpYXRlIHN1YnNldCBvZgotICBjb2VmZmljaWVudHMuCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBvYmplY3RzLCB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBpbmNsdWRlcyB0aGVzZQotb2JqZWN0czoKLQotKiBNYXN0ZXIgY29udHJvbDogZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHBhc3NlcyByZXF1aXJlZCwgY29udHJvbHMgb3ZlcmFsbAotICBhbmQgcGVyLXBhc3MgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG90aGVyIG1vZHVsZXMuCi0KLSogTWFya2VyIHdyaXRpbmc6IGdlbmVyYXRlcyBKUEVHIG1hcmtlcnMgKGV4Y2VwdCBmb3IgUlNUbiwgd2hpY2ggaXMgZW1pdHRlZAotICBieSB0aGUgZW50cm9weSBlbmNvZGVyIHdoZW4gbmVlZGVkKS4KLQotKiBEYXRhIGRlc3RpbmF0aW9uIG1hbmFnZXI6IHdyaXRlcyB0aGUgb3V0cHV0IEpQRUcgZGF0YXN0cmVhbSB0byBpdHMgZmluYWwKLSAgZGVzdGluYXRpb24gKGUuZy4sIGEgZmlsZSkuICBUaGUgZGVzdGluYXRpb24gbWFuYWdlciBzdXBwbGllZCB3aXRoIHRoZQotICBsaWJyYXJ5IGtub3dzIGhvdyB0byB3cml0ZSB0byBhIHN0ZGlvIHN0cmVhbTsgZm9yIG90aGVyIGJlaGF2aW9ycywgdGhlCi0gIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIG1heSBwcm92aWRlIGl0cyBvd24gZGVzdGluYXRpb24gbWFuYWdlci4KLQotKiBNZW1vcnkgbWFuYWdlcjogYWxsb2NhdGVzIGFuZCByZWxlYXNlcyBtZW1vcnksIGNvbnRyb2xzIHZpcnR1YWwgYXJyYXlzCi0gICh3aXRoIGJhY2tpbmcgc3RvcmUgbWFuYWdlbWVudCwgd2hlcmUgcmVxdWlyZWQpLgotCi0qIEVycm9yIGhhbmRsZXI6IHBlcmZvcm1zIGZvcm1hdHRpbmcgYW5kIG91dHB1dCBvZiBlcnJvciBhbmQgdHJhY2UgbWVzc2FnZXM7Ci0gIGRldGVybWluZXMgaGFuZGxpbmcgb2Ygbm9uZmF0YWwgZXJyb3JzLiAgVGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIG1heQotICBvdmVycmlkZSBzb21lIG9yIGFsbCBvZiB0aGlzIG9iamVjdCdzIG1ldGhvZHMgdG8gY2hhbmdlIGVycm9yIGhhbmRsaW5nLgotCi0qIFByb2dyZXNzIG1vbml0b3I6IHN1cHBvcnRzIG91dHB1dCBvZiAicGVyY2VudC1kb25lIiBwcm9ncmVzcyByZXBvcnRzLgotICBUaGlzIG9iamVjdCByZXByZXNlbnRzIGFuIG9wdGlvbmFsIGNhbGxiYWNrIHRvIHRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbjoKLSAgaWYgd2FudGVkLCBpdCBtdXN0IGJlIHN1cHBsaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLQotVGhlIGVycm9yIGhhbmRsZXIsIGRlc3RpbmF0aW9uIG1hbmFnZXIsIGFuZCBwcm9ncmVzcyBtb25pdG9yIG9iamVjdHMgYXJlCi1kZWZpbmVkIGFzIHNlcGFyYXRlIG9iamVjdHMgaW4gb3JkZXIgdG8gc2ltcGxpZnkgYXBwbGljYXRpb24tc3BlY2lmaWMKLWN1c3RvbWl6YXRpb24gb2YgdGhlIEpQRUcgbGlicmFyeS4gIEEgc3Vycm91bmRpbmcgYXBwbGljYXRpb24gbWF5IG92ZXJyaWRlCi1pbmRpdmlkdWFsIG1ldGhvZHMgb3Igc3VwcGx5IGl0cyBvd24gYWxsLW5ldyBpbXBsZW1lbnRhdGlvbiBvZiBvbmUgb2YgdGhlc2UKLW9iamVjdHMuICBUaGUgb2JqZWN0IGludGVyZmFjZXMgZm9yIHRoZXNlIG9iamVjdHMgYXJlIHRoZXJlZm9yZSB0cmVhdGVkIGFzCi1wYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbiBpbnRlcmZhY2Ugb2YgdGhlIGxpYnJhcnksIHdoZXJlYXMgdGhlIG90aGVyIG9iamVjdHMKLWFyZSBpbnRlcm5hbCB0byB0aGUgbGlicmFyeS4KLQotVGhlIGVycm9yIGhhbmRsZXIgYW5kIG1lbW9yeSBtYW5hZ2VyIGFyZSBzaGFyZWQgYnkgSlBFRyBjb21wcmVzc2lvbiBhbmQKLWRlY29tcHJlc3Npb247IHRoZSBwcm9ncmVzcyBtb25pdG9yLCBpZiB1c2VkLCBtYXkgYmUgc2hhcmVkIGFzIHdlbGwuCi0KLQotKioqIERlY29tcHJlc3Npb24gb2JqZWN0IHN0cnVjdHVyZSAqKioKLQotSGVyZSBpcyBhIHNrZXRjaCBvZiB0aGUgbG9naWNhbCBzdHJ1Y3R1cmUgb2YgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBsaWJyYXJ5OgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBFbnRyb3B5IGRlY29kaW5nCi0gICAgICAgICAgICAgICAgICB8LS0gQ29lZmZpY2llbnQgY29udHJvbGxlciAtLXwKLSAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIERlcXVhbnRpemUsIEludmVyc2UgRENUCi1NYWluIGNvbnRyb2xsZXIgLS18Ci0gICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBVcHNhbXBsaW5nCi0gICAgICAgICAgICAgICAgICB8LS0gUG9zdHByb2Nlc3NpbmcgY29udHJvbGxlciAtLXwgICB8LS0gQ29sb3JzcGFjZSBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBDb2xvciBxdWFudGl6YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIENvbG9yIHByZWNpc2lvbiByZWR1Y3Rpb24KLQotQXMgYmVmb3JlLCB0aGlzIGRpYWdyYW0gYWxzbyByZXByZXNlbnRzIHR5cGljYWwgY29udHJvbCBmbG93LiAgVGhlIG9iamVjdHMKLXNob3duIGFyZToKLQotKiBNYWluIGNvbnRyb2xsZXI6IGJ1ZmZlciBjb250cm9sbGVyIGZvciB0aGUgc3Vic2FtcGxlZC1kYXRhIGJ1ZmZlciwgd2hpY2gKLSAgaG9sZHMgdGhlIG91dHB1dCBvZiBKUEVHIGRlY29tcHJlc3Npb24gcHJvcGVyLiAgVGhpcyBjb250cm9sbGVyJ3MgcHJpbWFyeQotICB0YXNrIGlzIHRvIGZlZWQgdGhlIHBvc3Rwcm9jZXNzaW5nIHByb2NlZHVyZS4gIFNvbWUgdXBzYW1wbGluZyBhbGdvcml0aG1zCi0gIG1heSByZXF1aXJlIGNvbnRleHQgcm93cyBhYm92ZSBhbmQgYmVsb3cgdGhlIGN1cnJlbnQgcm93IGdyb3VwOyB3aGVuIHRoaXMKLSAgaXMgdHJ1ZSwgdGhlIG1haW4gY29udHJvbGxlciBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgaXRzIGJ1ZmZlciBzbyBhcwotICB0byBtYWtlIGNvbnRleHQgcm93cyBhdmFpbGFibGUuICBJbiB0aGUgY3VycmVudCBkZXNpZ24sIHRoZSBtYWluIGJ1ZmZlciBpcwotICBhbHdheXMgYSBzdHJpcCBidWZmZXI7IGEgZnVsbC1pbWFnZSBidWZmZXIgaXMgbmV2ZXIgcmVxdWlyZWQuCi0KLSogQ29lZmZpY2llbnQgY29udHJvbGxlcjogYnVmZmVyIGNvbnRyb2xsZXIgZm9yIHRoZSBEQ1QtY29lZmZpY2llbnQgZGF0YS4KLSAgVGhpcyBjb250cm9sbGVyIGhhbmRsZXMgTUNVIGRpc2Fzc2VtYmx5LCBpbmNsdWRpbmcgZGVsZXRpb24gb2YgYW55IGR1bW15Ci0gIERDVCBibG9ja3MgYXQgdGhlIHJpZ2h0IG9yIGJvdHRvbSBlZGdlLiAgV2hlbiByZWFkaW5nIGEgbXVsdGlzY2FuIEpQRUcKLSAgZmlsZSwgdGhpcyBjb250cm9sbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBidWZmZXJpbmcgdGhlIGZ1bGwgaW1hZ2UuCi0gIChCdWZmZXJpbmcgRENUIGNvZWZmaWNpZW50cywgcmF0aGVyIHRoYW4gc2FtcGxlcywgaXMgbmVjZXNzYXJ5IHRvIHN1cHBvcnQKLSAgcHJvZ3Jlc3NpdmUgSlBFRy4pICBUaGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyBvZgotICBzdWJzYW1wbGVkIGRhdGEgaXMgcHJvY2Vzc2VkIHBlciBjYWxsLCBldmVuIHdoZW4gdGhlIHNvdXJjZSBKUEVHIGZpbGUgaXMKLSAgbm9uaW50ZXJsZWF2ZWQuCi0KLSogRW50cm9weSBkZWNvZGluZzogUmVhZCBjb2RlZCBkYXRhIGZyb20gdGhlIGRhdGEgc291cmNlIG1vZHVsZSBhbmQgcGVyZm9ybQotICBIdWZmbWFuIG9yIGFyaXRobWV0aWMgZW50cm9weSBkZWNvZGluZy4gIFdvcmtzIG9uIG9uZSBNQ1UgcGVyIGNhbGwuCi0gIEZvciBwcm9ncmVzc2l2ZSBKUEVHIGRlY29kaW5nLCB0aGUgY29lZmZpY2llbnQgY29udHJvbGxlciBzdXBwbGllcyB0aGUgcHJpb3IKLSAgY29lZmZpY2llbnRzIG9mIGVhY2ggTUNVIChpbml0aWFsbHkgYWxsIHplcm9lcyksIHdoaWNoIHRoZSBlbnRyb3B5IGRlY29kZXIKLSAgbW9kaWZpZXMgaW4gZWFjaCBzY2FuLgotCi0qIERlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVDogbGlrZSBpdCBzYXlzLiAgTm90ZSB0aGF0IHRoZSBjb2VmZmljaWVudHMKLSAgYnVmZmVyZWQgYnkgdGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIgaGF2ZSBOT1QgYmVlbiBkZXF1YW50aXplZDsgd2UKLSAgbWVyZ2UgZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIGludG8gYSBzaW5nbGUgc3RlcCBmb3Igc3BlZWQgcmVhc29ucy4KLSAgV2hlbiBzY2FsZWQtZG93biBvdXRwdXQgaXMgYXNrZWQgZm9yLCBzaW1wbGlmaWVkIERDVCBhbGdvcml0aG1zIG1heSBiZSB1c2VkCi0gIHRoYXQgZW1pdCBvbmx5IDF4MSwgMngyLCBvciA0eDQgc2FtcGxlcyBwZXIgRENUIGJsb2NrLCBub3QgdGhlIGZ1bGwgOHg4LgotICBXb3JrcyBvbiBvbmUgRENUIGJsb2NrIGF0IGEgdGltZS4KLQotKiBQb3N0cHJvY2Vzc2luZyBjb250cm9sbGVyOiBidWZmZXIgY29udHJvbGxlciBmb3IgdGhlIGNvbG9yIHF1YW50aXphdGlvbgotICBpbnB1dCBidWZmZXIsIHdoZW4gcXVhbnRpemF0aW9uIGlzIGluIHVzZS4gIChXaXRob3V0IHF1YW50aXphdGlvbiwgdGhpcwotICBjb250cm9sbGVyIGp1c3QgY2FsbHMgdGhlIHVwc2FtcGxlci4pICBGb3IgdHdvLXBhc3MgcXVhbnRpemF0aW9uLCB0aGlzCi0gIGNvbnRyb2xsZXIgaXMgcmVzcG9uc2libGUgZm9yIGJ1ZmZlcmluZyB0aGUgZnVsbC1pbWFnZSBkYXRhLgotCi0qIFVwc2FtcGxpbmc6IHJlc3RvcmVzIGNocm9tYSBjb21wb25lbnRzIHRvIGZ1bGwgc2l6ZS4gIChNYXkgc3VwcG9ydCBtb3JlCi0gIGdlbmVyYWwgb3V0cHV0IHJlc2NhbGluZywgdG9vLiAgTm90ZSB0aGF0IGlmIHVuZGVyc2l6ZWQgRENUIG91dHB1dHMgaGF2ZQotICBiZWVuIGVtaXR0ZWQgYnkgdGhlIERDVCBtb2R1bGUsIHRoaXMgbW9kdWxlIG11c3QgYWRqdXN0IHNvIHRoYXQgcHJvcGVybHkKLSAgc2l6ZWQgb3V0cHV0cyBhcmUgY3JlYXRlZC4pICBXb3JrcyBvbiBvbmUgcm93IGdyb3VwIGF0IGEgdGltZS4gIFRoaXMgbW9kdWxlCi0gIGFsc28gY2FsbHMgdGhlIGNvbG9yIGNvbnZlcnNpb24gbW9kdWxlLCBzbyBpdHMgdG9wIGxldmVsIGlzIGVmZmVjdGl2ZWx5IGEKLSAgYnVmZmVyIGNvbnRyb2xsZXIgZm9yIHRoZSB1cHNhbXBsaW5nLT5jb2xvciBjb252ZXJzaW9uIGJ1ZmZlci4gIEhvd2V2ZXIsIGluCi0gIGFsbCBidXQgdGhlIGhpZ2hlc3QtcXVhbGl0eSBvcGVyYXRpbmcgbW9kZXMsIHVwc2FtcGxpbmcgYW5kIGNvbG9yCi0gIGNvbnZlcnNpb24gYXJlIGxpa2VseSB0byBiZSBtZXJnZWQgaW50byBhIHNpbmdsZSBzdGVwLgotCi0qIENvbG9yc3BhY2UgY29udmVyc2lvbjogY29udmVydCBmcm9tIEpQRUcgY29sb3Igc3BhY2UgdG8gb3V0cHV0IGNvbG9yIHNwYWNlLAotICBhbmQgY2hhbmdlIGRhdGEgbGF5b3V0IGZyb20gc2VwYXJhdGUgY29tcG9uZW50IHBsYW5lcyB0byBwaXhlbC1pbnRlcmxlYXZlZC4KLSAgV29ya3Mgb24gb25lIHBpeGVsIHJvdyBhdCBhIHRpbWUuCi0KLSogQ29sb3IgcXVhbnRpemF0aW9uOiByZWR1Y2UgdGhlIGRhdGEgdG8gY29sb3JtYXBwZWQgZm9ybSwgdXNpbmcgZWl0aGVyIGFuCi0gIGV4dGVybmFsbHkgc3BlY2lmaWVkIGNvbG9ybWFwIG9yIGFuIGludGVybmFsbHkgZ2VuZXJhdGVkIG9uZS4gIFRoaXMgbW9kdWxlCi0gIGlzIG5vdCB1c2VkIGZvciBmdWxsLWNvbG9yIG91dHB1dC4gIFdvcmtzIG9uIG9uZSBwaXhlbCByb3cgYXQgYSB0aW1lOyBtYXkKLSAgcmVxdWlyZSB0d28gcGFzc2VzIHRvIGdlbmVyYXRlIGEgY29sb3IgbWFwLiAgTm90ZSB0aGF0IHRoZSBvdXRwdXQgd2lsbAotICBhbHdheXMgYmUgYSBzaW5nbGUgY29tcG9uZW50IHJlcHJlc2VudGluZyBjb2xvcm1hcCBpbmRleGVzLiAgSW4gdGhlIGN1cnJlbnQKLSAgZGVzaWduLCB0aGUgb3V0cHV0IHZhbHVlcyBhcmUgSlNBTVBMRXMsIHNvIGFuIDgtYml0IGNvbXBpbGF0aW9uIGNhbm5vdAotICBxdWFudGl6ZSB0byBtb3JlIHRoYW4gMjU2IGNvbG9ycy4gIFRoaXMgaXMgdW5saWtlbHkgdG8gYmUgYSBwcm9ibGVtIGluCi0gIHByYWN0aWNlLgotCi0qIENvbG9yIHJlZHVjdGlvbjogdGhpcyBtb2R1bGUgaGFuZGxlcyBjb2xvciBwcmVjaXNpb24gcmVkdWN0aW9uLCBlLmcuLAotICBnZW5lcmF0aW5nIDE1LWJpdCBjb2xvciAoNSBiaXRzL3ByaW1hcnkpIGZyb20gSlBFRydzIDI0LWJpdCBvdXRwdXQuCi0gIE5vdCBxdWl0ZSBjbGVhciB5ZXQgaG93IHRoaXMgc2hvdWxkIGJlIGhhbmRsZWQuLi4gc2hvdWxkIHdlIG1lcmdlIGl0IHdpdGgKLSAgY29sb3JzcGFjZSBjb252ZXJzaW9uPz8/Ci0KLU5vdGUgdGhhdCBzb21lIGhpZ2gtc3BlZWQgb3BlcmF0aW5nIG1vZGVzIG1pZ2h0IGNvbmRlbnNlIHRoZSBlbnRpcmUKLXBvc3Rwcm9jZXNzaW5nIHNlcXVlbmNlIHRvIGEgc2luZ2xlIG1vZHVsZSAodXBzYW1wbGUsIGNvbG9yIGNvbnZlcnQsIGFuZAotcXVhbnRpemUgaW4gb25lIHN0ZXApLgotCi1JbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgb2JqZWN0cywgdGhlIGRlY29tcHJlc3Npb24gbGlicmFyeSBpbmNsdWRlcyB0aGVzZQotb2JqZWN0czoKLQotKiBNYXN0ZXIgY29udHJvbDogZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHBhc3NlcyByZXF1aXJlZCwgY29udHJvbHMgb3ZlcmFsbAotICBhbmQgcGVyLXBhc3MgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG90aGVyIG1vZHVsZXMuICBUaGlzIGlzIHN1YmRpdmlkZWQgaW50bwotICBpbnB1dCBhbmQgb3V0cHV0IGNvbnRyb2w6IGpkaW5wdXQuYyBjb250cm9scyBvbmx5IGlucHV0LXNpZGUgcHJvY2Vzc2luZywKLSAgd2hpbGUgamRtYXN0ZXIuYyBoYW5kbGVzIG92ZXJhbGwgaW5pdGlhbGl6YXRpb24gYW5kIG91dHB1dC1zaWRlIGNvbnRyb2wuCi0KLSogTWFya2VyIHJlYWRpbmc6IGRlY29kZXMgSlBFRyBtYXJrZXJzIChleGNlcHQgZm9yIFJTVG4pLgotCi0qIERhdGEgc291cmNlIG1hbmFnZXI6IHN1cHBsaWVzIHRoZSBpbnB1dCBKUEVHIGRhdGFzdHJlYW0uICBUaGUgc291cmNlCi0gIG1hbmFnZXIgc3VwcGxpZWQgd2l0aCB0aGUgbGlicmFyeSBrbm93cyBob3cgdG8gcmVhZCBmcm9tIGEgc3RkaW8gc3RyZWFtOwotICBmb3Igb3RoZXIgYmVoYXZpb3JzLCB0aGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24gbWF5IHByb3ZpZGUgaXRzIG93biBzb3VyY2UKLSAgbWFuYWdlci4KLQotKiBNZW1vcnkgbWFuYWdlcjogc2FtZSBhcyBmb3IgY29tcHJlc3Npb24gbGlicmFyeS4KLQotKiBFcnJvciBoYW5kbGVyOiBzYW1lIGFzIGZvciBjb21wcmVzc2lvbiBsaWJyYXJ5LgotCi0qIFByb2dyZXNzIG1vbml0b3I6IHNhbWUgYXMgZm9yIGNvbXByZXNzaW9uIGxpYnJhcnkuCi0KLUFzIHdpdGggY29tcHJlc3Npb24sIHRoZSBkYXRhIHNvdXJjZSBtYW5hZ2VyLCBlcnJvciBoYW5kbGVyLCBhbmQgcHJvZ3Jlc3MKLW1vbml0b3IgYXJlIGNhbmRpZGF0ZXMgZm9yIHJlcGxhY2VtZW50IGJ5IGEgc3Vycm91bmRpbmcgYXBwbGljYXRpb24uCi0KLQotKioqIERlY29tcHJlc3Npb24gaW5wdXQgYW5kIG91dHB1dCBzZXBhcmF0aW9uICoqKgotCi1UbyBzdXBwb3J0IGVmZmljaWVudCBpbmNyZW1lbnRhbCBkaXNwbGF5IG9mIHByb2dyZXNzaXZlIEpQRUcgZmlsZXMsIHRoZQotZGVjb21wcmVzc29yIGlzIGRpdmlkZWQgaW50byB0d28gc2VjdGlvbnMgdGhhdCBjYW4gcnVuIGluZGVwZW5kZW50bHk6Ci0KLTEuIERhdGEgaW5wdXQgaW5jbHVkZXMgbWFya2VyIHBhcnNpbmcsIGVudHJvcHkgZGVjb2RpbmcsIGFuZCBpbnB1dCBpbnRvIHRoZQotICAgY29lZmZpY2llbnQgY29udHJvbGxlcidzIERDVCBjb2VmZmljaWVudCBidWZmZXIuICBOb3RlIHRoYXQgdGhpcwotICAgcHJvY2Vzc2luZyBpcyByZWxhdGl2ZWx5IGNoZWFwIGFuZCBmYXN0LgotCi0yLiBEYXRhIG91dHB1dCByZWFkcyBmcm9tIHRoZSBEQ1QgY29lZmZpY2llbnQgYnVmZmVyIGFuZCBwZXJmb3JtcyB0aGUgSURDVAotICAgYW5kIGFsbCBwb3N0cHJvY2Vzc2luZyBzdGVwcy4KLQotRm9yIGEgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlLCB0aGUgZGF0YSBpbnB1dCBwcm9jZXNzaW5nIGlzIGFsbG93ZWQgdG8gZ2V0Ci1hcmJpdHJhcmlseSBmYXIgYWhlYWQgb2YgdGhlIGRhdGEgb3V0cHV0IHByb2Nlc3NpbmcuICAoVGhpcyBvY2N1cnMgb25seQotaWYgdGhlIGFwcGxpY2F0aW9uIGNhbGxzIGpwZWdfY29uc3VtZV9pbnB1dCgpOyBvdGhlcndpc2UgaW5wdXQgYW5kIG91dHB1dAotcnVuIGluIGxvY2tzdGVwLCBzaW5jZSB0aGUgaW5wdXQgc2VjdGlvbiBpcyBjYWxsZWQgb25seSB3aGVuIHRoZSBvdXRwdXQKLXNlY3Rpb24gbmVlZHMgbW9yZSBkYXRhLikgIEluIHRoaXMgd2F5IHRoZSBhcHBsaWNhdGlvbiBjYW4gYXZvaWQgbWFraW5nCi1leHRyYSBkaXNwbGF5IHBhc3NlcyB3aGVuIGRhdGEgaXMgYXJyaXZpbmcgZmFzdGVyIHRoYW4gdGhlIGRpc3BsYXkgcGFzcwotY2FuIHJ1bi4gIEZ1cnRoZXJtb3JlLCBpdCBpcyBwb3NzaWJsZSB0byBhYm9ydCBhbiBvdXRwdXQgcGFzcyB3aXRob3V0Ci1sb3NpbmcgYW55dGhpbmcsIHNpbmNlIHRoZSBjb2VmZmljaWVudCBidWZmZXIgaXMgcmVhZC1vbmx5IGFzIGZhciBhcyB0aGUKLW91dHB1dCBzZWN0aW9uIGlzIGNvbmNlcm5lZC4gIFNlZSBsaWJqcGVnLmRvYyBmb3IgbW9yZSBkZXRhaWwuCi0KLUEgZnVsbC1pbWFnZSBjb2VmZmljaWVudCBhcnJheSBpcyBvbmx5IGNyZWF0ZWQgaWYgdGhlIEpQRUcgZmlsZSBoYXMgbXVsdGlwbGUKLXNjYW5zIChvciBpZiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWVzIGJ1ZmZlcmVkLWltYWdlIG1vZGUgYW55d2F5KS4gIFdoZW4KLXJlYWRpbmcgYSBzaW5nbGUtc2NhbiBmaWxlLCB0aGUgY29lZmZpY2llbnQgY29udHJvbGxlciBub3JtYWxseSBjcmVhdGVzIG9ubHkKLWEgb25lLU1DVSBidWZmZXIsIHNvIGlucHV0IGFuZCBvdXRwdXQgcHJvY2Vzc2luZyBtdXN0IHJ1biBpbiBsb2Nrc3RlcCBpbiB0aGlzCi1jYXNlLiAganBlZ19jb25zdW1lX2lucHV0KCkgaXMgZWZmZWN0aXZlbHkgYSBuby1vcCBpbiB0aGlzIHNpdHVhdGlvbi4KLQotVGhlIG1haW4gaW1wYWN0IG9mIGRpdmlkaW5nIHRoZSBkZWNvbXByZXNzb3IgaW4gdGhpcyBmYXNoaW9uIGlzIHRoYXQgd2UgbXVzdAotYmUgdmVyeSBjYXJlZnVsIHdpdGggc2hhcmVkIHZhcmlhYmxlcyBpbiB0aGUgY2luZm8gZGF0YSBzdHJ1Y3R1cmUuICBFYWNoCi12YXJpYWJsZSB0aGF0IGNhbiBjaGFuZ2UgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgZGVjb21wcmVzc2lvbiBtdXN0IGJlCi1jbGFzc2lmaWVkIGFzIGJlbG9uZ2luZyB0byBkYXRhIGlucHV0IG9yIGRhdGEgb3V0cHV0LCBhbmQgZWFjaCBzZWN0aW9uIG11c3QKLWxvb2sgb25seSBhdCBpdHMgb3duIHZhcmlhYmxlcy4gIEZvciBleGFtcGxlLCB0aGUgZGF0YSBvdXRwdXQgc2VjdGlvbiBtYXkgbm90Ci1kZXBlbmQgb24gYW55IG9mIHRoZSB2YXJpYWJsZXMgdGhhdCBkZXNjcmliZSB0aGUgY3VycmVudCBzY2FuIGluIHRoZSBKUEVHCi1maWxlLCBiZWNhdXNlIHRoZXNlIG1heSBjaGFuZ2UgYXMgdGhlIGRhdGEgaW5wdXQgc2VjdGlvbiBhZHZhbmNlcyBpbnRvIGEgbmV3Ci1zY2FuLgotCi1UaGUgcHJvZ3Jlc3MgbW9uaXRvciBpcyAoc29tZXdoYXQgYXJiaXRyYXJpbHkpIGRlZmluZWQgdG8gdHJlYXQgaW5wdXQgb2YgdGhlCi1maWxlIGFzIG9uZSBwYXNzIHdoZW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSBpcyBub3QgdXNlZCwgYW5kIHRvIGlnbm9yZSBkYXRhCi1pbnB1dCB3b3JrIGNvbXBsZXRlbHkgd2hlbiBidWZmZXJlZC1pbWFnZSBtb2RlIGlzIHVzZWQuICBOb3RlIHRoYXQgdGhlCi1saWJyYXJ5IGhhcyBubyByZWxpYWJsZSB3YXkgdG8gcHJlZGljdCB0aGUgbnVtYmVyIG9mIHBhc3NlcyB3aGVuIGRlYWxpbmcKLXdpdGggYSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUsIG5vciBjYW4gaXQgcHJlZGljdCB0aGUgbnVtYmVyIG9mIG91dHB1dCBwYXNzZXMKLWluIGJ1ZmZlcmVkLWltYWdlIG1vZGUuICBTbyB0aGUgd29yayBlc3RpbWF0ZSBpcyBpbmhlcmVudGx5IGJvZ3VzIGFueXdheS4KLQotTm8gY29tcGFyYWJsZSBkaXZpc2lvbiBpcyBjdXJyZW50bHkgbWFkZSBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwgYmVjYXVzZQotdGhlcmUgaXNuJ3QgYW55IHJlYWwgbmVlZCBmb3IgaXQuCi0KLQotKioqIERhdGEgZm9ybWF0cyAqKioKLQotQXJyYXlzIG9mIHBpeGVsIHNhbXBsZSB2YWx1ZXMgdXNlIHRoZSBmb2xsb3dpbmcgZGF0YSBzdHJ1Y3R1cmU6Ci0KLSAgICB0eXBlZGVmIHNvbWV0aGluZyBKU0FNUExFOwkJYSBwaXhlbCBjb21wb25lbnQgdmFsdWUsIDAuLk1BWEpTQU1QTEUKLSAgICB0eXBlZGVmIEpTQU1QTEUgKkpTQU1QUk9XOwkJcHRyIHRvIGEgcm93IG9mIHNhbXBsZXMKLSAgICB0eXBlZGVmIEpTQU1QUk9XICpKU0FNUEFSUkFZOwlwdHIgdG8gYSBsaXN0IG9mIHJvd3MKLSAgICB0eXBlZGVmIEpTQU1QQVJSQVkgKkpTQU1QSU1BR0U7CXB0ciB0byBhIGxpc3Qgb2YgY29sb3ItY29tcG9uZW50IGFycmF5cwotCi1UaGUgYmFzaWMgZWxlbWVudCB0eXBlIEpTQU1QTEUgd2lsbCB0eXBpY2FsbHkgYmUgb25lIG9mIHVuc2lnbmVkIGNoYXIsCi0oc2lnbmVkKSBjaGFyLCBvciBzaG9ydC4gIFNob3J0IHdpbGwgYmUgdXNlZCBpZiBzYW1wbGVzIHdpZGVyIHRoYW4gOCBiaXRzIGFyZQotdG8gYmUgc3VwcG9ydGVkICh0aGlzIGlzIGEgY29tcGlsZS10aW1lIG9wdGlvbikuICBPdGhlcndpc2UsIHVuc2lnbmVkIGNoYXIgaXMKLXVzZWQgaWYgcG9zc2libGUuICBJZiB0aGUgY29tcGlsZXIgb25seSBzdXBwb3J0cyBzaWduZWQgY2hhcnMsIHRoZW4gaXQgaXMKLW5lY2Vzc2FyeSB0byBtYXNrIG9mZiB0aGUgdmFsdWUgd2hlbiByZWFkaW5nLiAgVGh1cywgYWxsIHJlYWRzIG9mIEpTQU1QTEUKLXZhbHVlcyBtdXN0IGJlIGNvZGVkIGFzICJHRVRKU0FNUExFKHZhbHVlKSIsIHdoZXJlIHRoZSBtYWNybyB3aWxsIGJlIGRlZmluZWQKLWFzICIoKHZhbHVlKSAmIDB4RkYpIiBvbiBzaWduZWQtY2hhciBtYWNoaW5lcyBhbmQgIigoaW50KSAodmFsdWUpKSIgZWxzZXdoZXJlLgotCi1XaXRoIHRoZXNlIGNvbnZlbnRpb25zLCBKU0FNUExFIHZhbHVlcyBjYW4gYmUgYXNzdW1lZCB0byBiZSA+PSAwLiAgVGhpcyBoZWxwcwotc2ltcGxpZnkgY29ycmVjdCByb3VuZGluZyBkdXJpbmcgZG93bnNhbXBsaW5nLCBldGMuICBUaGUgSlBFRyBzdGFuZGFyZCdzCi1zcGVjaWZpY2F0aW9uIHRoYXQgc2FtcGxlIHZhbHVlcyBydW4gZnJvbSAtMTI4Li4xMjcgaXMgYWNjb21tb2RhdGVkIGJ5Ci1zdWJ0cmFjdGluZyAxMjgganVzdCBhcyB0aGUgc2FtcGxlIHZhbHVlIGlzIGNvcGllZCBpbnRvIHRoZSBzb3VyY2UgYXJyYXkgZm9yCi10aGUgRENUIHN0ZXAgKHRoaXMgd2lsbCBiZSBhbiBhcnJheSBvZiBzaWduZWQgaW50cykuICBTaW1pbGFybHksIGR1cmluZwotZGVjb21wcmVzc2lvbiB0aGUgb3V0cHV0IG9mIHRoZSBJRENUIHN0ZXAgd2lsbCBiZSBpbW1lZGlhdGVseSBzaGlmdGVkIGJhY2sgdG8KLTAuLjI1NS4gIChOQjogZGlmZmVyZW50IHZhbHVlcyBhcmUgcmVxdWlyZWQgd2hlbiAxMi1iaXQgc2FtcGxlcyBhcmUgaW4gdXNlLgotVGhlIGNvZGUgaXMgd3JpdHRlbiBpbiB0ZXJtcyBvZiBNQVhKU0FNUExFIGFuZCBDRU5URVJKU0FNUExFLCB3aGljaCB3aWxsIGJlCi1kZWZpbmVkIGFzIDI1NSBhbmQgMTI4IHJlc3BlY3RpdmVseSBpbiBhbiA4LWJpdCBpbXBsZW1lbnRhdGlvbiwgYW5kIGFzIDQwOTUKLWFuZCAyMDQ4IGluIGEgMTItYml0IGltcGxlbWVudGF0aW9uLikKLQotV2UgdXNlIGEgcG9pbnRlciBwZXIgcm93LCByYXRoZXIgdGhhbiBhIHR3by1kaW1lbnNpb25hbCBKU0FNUExFIGFycmF5LiAgVGhpcwotY2hvaWNlIGNvc3RzIG9ubHkgYSBzbWFsbCBhbW91bnQgb2YgbWVtb3J5IGFuZCBoYXMgc2V2ZXJhbCBiZW5lZml0czoKLSogQ29kZSB1c2luZyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZG9lc24ndCBuZWVkIHRvIGtub3cgdGhlIGFsbG9jYXRlZCB3aWR0aCBvZgotICB0aGUgcm93cy4gIFRoaXMgc2ltcGxpZmllcyBlZGdlIGV4cGFuc2lvbi9jb21wcmVzc2lvbiwgc2luY2Ugd2UgY2FuIHdvcmsKLSAgaW4gYW4gYXJyYXkgdGhhdCdzIHdpZGVyIHRoYW4gdGhlIGxvZ2ljYWwgcGljdHVyZSB3aWR0aC4KLSogSW5kZXhpbmcgZG9lc24ndCByZXF1aXJlIG11bHRpcGxpY2F0aW9uOyB0aGlzIGlzIGEgcGVyZm9ybWFuY2Ugd2luIG9uIG1hbnkKLSAgbWFjaGluZXMuCi0qIEFycmF5cyB3aXRoIG1vcmUgdGhhbiA2NEsgdG90YWwgZWxlbWVudHMgY2FuIGJlIHN1cHBvcnRlZCBldmVuIG9uIG1hY2hpbmVzCi0gIHdoZXJlIG1hbGxvYygpIGNhbm5vdCBhbGxvY2F0ZSBjaHVua3MgbGFyZ2VyIHRoYW4gNjRLLgotKiBUaGUgcm93cyBmb3JtaW5nIGEgY29tcG9uZW50IGFycmF5IG1heSBiZSBhbGxvY2F0ZWQgYXQgZGlmZmVyZW50IHRpbWVzCi0gIHdpdGhvdXQgZXh0cmEgY29weWluZy4gIFRoaXMgdHJpY2sgYWxsb3dzIHNvbWUgc3BlZWR1cHMgaW4gc21vb3RoaW5nIHN0ZXBzCi0gIHRoYXQgbmVlZCBhY2Nlc3MgdG8gdGhlIHByZXZpb3VzIGFuZCBuZXh0IHJvd3MuCi0KLU5vdGUgdGhhdCBlYWNoIGNvbG9yIGNvbXBvbmVudCBpcyBzdG9yZWQgaW4gYSBzZXBhcmF0ZSBhcnJheTsgd2UgZG9uJ3QgdXNlIHRoZQotdHJhZGl0aW9uYWwgbGF5b3V0IGluIHdoaWNoIHRoZSBjb21wb25lbnRzIG9mIGEgcGl4ZWwgYXJlIHN0b3JlZCB0b2dldGhlci4KLVRoaXMgc2ltcGxpZmllcyBjb2Rpbmcgb2YgbW9kdWxlcyB0aGF0IHdvcmsgb24gZWFjaCBjb21wb25lbnQgaW5kZXBlbmRlbnRseSwKLWJlY2F1c2UgdGhleSBkb24ndCBuZWVkIHRvIGtub3cgaG93IG1hbnkgY29tcG9uZW50cyB0aGVyZSBhcmUuICBGdXJ0aGVybW9yZSwKLXdlIGNhbiByZWFkIG9yIHdyaXRlIGVhY2ggY29tcG9uZW50IHRvIGEgdGVtcG9yYXJ5IGZpbGUgaW5kZXBlbmRlbnRseSwgd2hpY2gKLWlzIGhlbHBmdWwgd2hlbiBkZWFsaW5nIHdpdGggbm9uaW50ZXJsZWF2ZWQgSlBFRyBmaWxlcy4KLQotSW4gZ2VuZXJhbCwgYSBzcGVjaWZpYyBzYW1wbGUgdmFsdWUgaXMgYWNjZXNzZWQgYnkgY29kZSBzdWNoIGFzCi0JR0VUSlNBTVBMRShpbWFnZVtjb2xvcmNvbXBvbmVudF1bcm93XVtjb2xdKQotd2hlcmUgY29sIGlzIG1lYXN1cmVkIGZyb20gdGhlIGltYWdlIGxlZnQgZWRnZSwgYnV0IHJvdyBpcyBtZWFzdXJlZCBmcm9tIHRoZQotZmlyc3Qgc2FtcGxlIHJvdyBjdXJyZW50bHkgaW4gbWVtb3J5LiAgRWl0aGVyIG9mIHRoZSBmaXJzdCB0d28gaW5kZXhpbmdzIGNhbgotYmUgcHJlY29tcHV0ZWQgYnkgY29weWluZyB0aGUgcmVsZXZhbnQgcG9pbnRlci4KLQotCi1TaW5jZSBtb3N0IGltYWdlLXByb2Nlc3NpbmcgYXBwbGljYXRpb25zIHByZWZlciB0byB3b3JrIG9uIGltYWdlcyBpbiB3aGljaAotdGhlIGNvbXBvbmVudHMgb2YgYSBwaXhlbCBhcmUgc3RvcmVkIHRvZ2V0aGVyLCB0aGUgZGF0YSBwYXNzZWQgdG8gb3IgZnJvbSB0aGUKLXN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIHVzZXMgdGhlIHRyYWRpdGlvbmFsIGNvbnZlbnRpb246IGEgc2luZ2xlIHBpeGVsIGlzCi1yZXByZXNlbnRlZCBieSBOIGNvbnNlY3V0aXZlIEpTQU1QTEUgdmFsdWVzLCBhbmQgYW4gaW1hZ2Ugcm93IGlzIGFuIGFycmF5IG9mCi0oIyBvZiBjb2xvciBjb21wb25lbnRzKSooaW1hZ2Ugd2lkdGgpIEpTQU1QTEVzLiAgT25lIG9yIG1vcmUgcm93cyBvZiBkYXRhIGNhbgotYmUgcmVwcmVzZW50ZWQgYnkgYSBwb2ludGVyIG9mIHR5cGUgSlNBTVBBUlJBWSBpbiB0aGlzIHNjaGVtZS4gIFRoaXMgc2NoZW1lIGlzCi1jb252ZXJ0ZWQgdG8gY29tcG9uZW50LXdpc2Ugc3RvcmFnZSBpbnNpZGUgdGhlIEpQRUcgbGlicmFyeS4gIChBcHBsaWNhdGlvbnMKLXRoYXQgd2FudCB0byBza2lwIEpQRUcgcHJlcHJvY2Vzc2luZyBvciBwb3N0cHJvY2Vzc2luZyB3aWxsIGhhdmUgdG8gY29udGVuZAotd2l0aCBjb21wb25lbnQtd2lzZSBzdG9yYWdlLikKLQotCi1BcnJheXMgb2YgRENULWNvZWZmaWNpZW50IHZhbHVlcyB1c2UgdGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZToKLQotICAgIHR5cGVkZWYgc2hvcnQgSkNPRUY7CQlhIDE2LWJpdCBzaWduZWQgaW50ZWdlcgotICAgIHR5cGVkZWYgSkNPRUYgSkJMT0NLW0RDVFNJWkUyXTsJYW4gOHg4IGJsb2NrIG9mIGNvZWZmaWNpZW50cwotICAgIHR5cGVkZWYgSkJMT0NLICpKQkxPQ0tST1c7CQlwdHIgdG8gb25lIGhvcml6b250YWwgcm93IG9mIDh4OCBibG9ja3MKLSAgICB0eXBlZGVmIEpCTE9DS1JPVyAqSkJMT0NLQVJSQVk7CXB0ciB0byBhIGxpc3Qgb2Ygc3VjaCByb3dzCi0gICAgdHlwZWRlZiBKQkxPQ0tBUlJBWSAqSkJMT0NLSU1BR0U7CXB0ciB0byBhIGxpc3Qgb2YgY29sb3IgY29tcG9uZW50IGFycmF5cwotCi1UaGUgdW5kZXJseWluZyB0eXBlIGlzIGF0IGxlYXN0IGEgMTYtYml0IHNpZ25lZCBpbnRlZ2VyOyB3aGlsZSAic2hvcnQiIGlzIGJpZwotZW5vdWdoIG9uIGFsbCBtYWNoaW5lcyBvZiBpbnRlcmVzdCwgb24gc29tZSBtYWNoaW5lcyBpdCBpcyBwcmVmZXJhYmxlIHRvIHVzZQotImludCIgZm9yIHNwZWVkIHJlYXNvbnMsIGRlc3BpdGUgdGhlIHN0b3JhZ2UgY29zdC4gIENvZWZmaWNpZW50cyBhcmUgZ3JvdXBlZAotaW50byA4eDggYmxvY2tzIChidXQgd2UgYWx3YXlzIHVzZSAjZGVmaW5lcyBEQ1RTSVpFIGFuZCBEQ1RTSVpFMiByYXRoZXIgdGhhbgotIjgiIGFuZCAiNjQiKS4KLQotVGhlIGNvbnRlbnRzIG9mIGEgY29lZmZpY2llbnQgYmxvY2sgbWF5IGJlIGluIGVpdGhlciAibmF0dXJhbCIgb3IgemlnemFnZ2VkCi1vcmRlciwgYW5kIG1heSBiZSB0cnVlIHZhbHVlcyBvciBkaXZpZGVkIGJ5IHRoZSBxdWFudGl6YXRpb24gY29lZmZpY2llbnRzLAotZGVwZW5kaW5nIG9uIHdoZXJlIHRoZSBibG9jayBpcyBpbiB0aGUgcHJvY2Vzc2luZyBwaXBlbGluZS4gIEluIHRoZSBjdXJyZW50Ci1saWJyYXJ5LCBjb2VmZmljaWVudCBibG9ja3MgYXJlIGtlcHQgaW4gbmF0dXJhbCBvcmRlciBldmVyeXdoZXJlOyB0aGUgZW50cm9weQotY29kZWNzIHppZ3phZyBvciBkZXppZ3phZyB0aGUgZGF0YSBhcyBpdCBpcyB3cml0dGVuIG9yIHJlYWQuICBUaGUgYmxvY2tzCi1jb250YWluIHF1YW50aXplZCBjb2VmZmljaWVudHMgZXZlcnl3aGVyZSBvdXRzaWRlIHRoZSBEQ1QvSURDVCBzdWJzeXN0ZW1zLgotKFRoaXMgbGF0dGVyIGRlY2lzaW9uIG1heSBuZWVkIHRvIGJlIHJldmlzaXRlZCB0byBzdXBwb3J0IHZhcmlhYmxlCi1xdWFudGl6YXRpb24gYSBsYSBKUEVHIFBhcnQgMy4pCi0KLU5vdGljZSB0aGF0IHRoZSBhbGxvY2F0aW9uIHVuaXQgaXMgbm93IGEgcm93IG9mIDh4OCBibG9ja3MsIGNvcnJlc3BvbmRpbmcgdG8KLWVpZ2h0IHJvd3Mgb2Ygc2FtcGxlcy4gIE90aGVyd2lzZSB0aGUgc3RydWN0dXJlIGlzIG11Y2ggdGhlIHNhbWUgYXMgZm9yCi1zYW1wbGVzLCBhbmQgZm9yIHRoZSBzYW1lIHJlYXNvbnMuCi0KLU9uIG1hY2hpbmVzIHdoZXJlIG1hbGxvYygpIGNhbid0IGhhbmRsZSBhIHJlcXVlc3QgYmlnZ2VyIHRoYW4gNjRLYiwgdGhpcyBkYXRhCi1zdHJ1Y3R1cmUgbGltaXRzIHVzIHRvIHJvd3Mgb2YgbGVzcyB0aGFuIDUxMiBKQkxPQ0tzLCBvciBhIHBpY3R1cmUgd2lkdGggb2YKLTQwMDArIHBpeGVscy4gIFRoaXMgc2VlbXMgYW4gYWNjZXB0YWJsZSByZXN0cmljdGlvbi4KLQotCi1PbiA4MHg4NiBtYWNoaW5lcywgdGhlIGJvdHRvbS1sZXZlbCBwb2ludGVyIHR5cGVzIChKU0FNUFJPVyBhbmQgSkJMT0NLUk9XKQotbXVzdCBiZSBkZWNsYXJlZCBhcyAiZmFyIiBwb2ludGVycywgYnV0IHRoZSB1cHBlciBsZXZlbHMgY2FuIGJlICJuZWFyIgotKGltcGx5aW5nIHRoYXQgdGhlIHBvaW50ZXIgbGlzdHMgYXJlIGFsbG9jYXRlZCBpbiB0aGUgRFMgc2VnbWVudCkuCi1XZSB1c2UgYSAjZGVmaW5lIHN5bWJvbCBGQVIsIHdoaWNoIGV4cGFuZHMgdG8gdGhlICJmYXIiIGtleXdvcmQgd2hlbgotY29tcGlsaW5nIG9uIDgweDg2IG1hY2hpbmVzIGFuZCB0byBub3RoaW5nIGVsc2V3aGVyZS4KLQotCi0qKiogU3VzcGVuZGFibGUgcHJvY2Vzc2luZyAqKioKLQotSW4gc29tZSBhcHBsaWNhdGlvbnMgaXQgaXMgZGVzaXJhYmxlIHRvIHVzZSB0aGUgSlBFRyBsaWJyYXJ5IGFzIGFuCi1pbmNyZW1lbnRhbCwgbWVtb3J5LXRvLW1lbW9yeSBmaWx0ZXIuICBJbiB0aGlzIHNpdHVhdGlvbiB0aGUgZGF0YSBzb3VyY2Ugb3IKLWRlc3RpbmF0aW9uIG1heSBiZSBhIGxpbWl0ZWQtc2l6ZSBidWZmZXIsIGFuZCB3ZSBjYW4ndCByZWx5IG9uIGJlaW5nIGFibGUgdG8KLWVtcHR5IG9yIHJlZmlsbCB0aGUgYnVmZmVyIGF0IGFyYml0cmFyeSB0aW1lcy4gIEluc3RlYWQgdGhlIGFwcGxpY2F0aW9uIHdvdWxkCi1saWtlIHRvIGhhdmUgY29udHJvbCByZXR1cm4gZnJvbSB0aGUgbGlicmFyeSBhdCBidWZmZXIgb3ZlcmZsb3cvdW5kZXJydW4sIGFuZAotdGhlbiByZXN1bWUgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBhdCBhIGxhdGVyIHRpbWUuCi0KLVRoaXMgc2NlbmFyaW8gaXMgc3VwcG9ydGVkIGZvciBzaW1wbGUgY2FzZXMuICAoRm9yIGFueXRoaW5nIG1vcmUgY29tcGxleCwgd2UKLXJlY29tbWVuZCB0aGF0IHRoZSBhcHBsaWNhdGlvbiAiYml0ZSB0aGUgYnVsbGV0IiBhbmQgZGV2ZWxvcCByZWFsIG11bHRpdGFza2luZwotY2FwYWJpbGl0eS4pICBUaGUgbGlianBlZy5kb2MgZmlsZSBnb2VzIGludG8gbW9yZSBkZXRhaWwgYWJvdXQgdGhlIHVzYWdlIGFuZAotbGltaXRhdGlvbnMgb2YgdGhpcyBjYXBhYmlsaXR5OyBoZXJlIHdlIGFkZHJlc3MgdGhlIGltcGxpY2F0aW9ucyBmb3IgbGlicmFyeQotc3RydWN0dXJlLgotCi1UaGUgZXNzZW5jZSBvZiB0aGUgcHJvYmxlbSBpcyB0aGF0IHRoZSBlbnRyb3B5IGNvZGVjIChjb2RlciBvciBkZWNvZGVyKSBtdXN0Ci1iZSBwcmVwYXJlZCB0byBzdG9wIGF0IGFyYml0cmFyeSB0aW1lcy4gIEluIHR1cm4sIHRoZSBjb250cm9sbGVycyB0aGF0IGNhbGwKLXRoZSBlbnRyb3B5IGNvZGVjIG11c3QgYmUgYWJsZSB0byBzdG9wIGJlZm9yZSBoYXZpbmcgcHJvZHVjZWQgb3IgY29uc3VtZWQgYWxsCi10aGUgZGF0YSB0aGF0IHRoZXkgbm9ybWFsbHkgd291bGQgaGFuZGxlIGluIG9uZSBjYWxsLiAgVGhhdCBwYXJ0IGlzIHJlYXNvbmFibHkKLXN0cmFpZ2h0Zm9yd2FyZDogd2UgbWFrZSB0aGUgY29udHJvbGxlciBjYWxsIGludGVyZmFjZXMgaW5jbHVkZSAicHJvZ3Jlc3MKLWNvdW50ZXJzIiB3aGljaCBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIGRhdGEgY2h1bmtzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQsIGFuZAotd2UgcmVxdWlyZSBjYWxsZXJzIHRvIHRlc3QgdGhlIGNvdW50ZXIgcmF0aGVyIHRoYW4ganVzdCBhc3N1bWUgYWxsIG9mIHRoZSBkYXRhCi13YXMgcHJvY2Vzc2VkLgotCi1SYXRoZXIgdGhhbiB0cnlpbmcgdG8gcmVzdGFydCBhdCBhbiBhcmJpdHJhcnkgcG9pbnQsIHRoZSBjdXJyZW50IEh1ZmZtYW4KLWNvZGVjcyBhcmUgZGVzaWduZWQgdG8gcmVzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IE1DVSBhZnRlciBhCi1zdXNwZW5zaW9uIGR1ZSB0byBidWZmZXIgb3ZlcmZsb3cvdW5kZXJydW4uICBBdCB0aGUgc3RhcnQgb2YgZWFjaCBjYWxsLCB0aGUKLWNvZGVjJ3MgaW50ZXJuYWwgc3RhdGUgaXMgbG9hZGVkIGZyb20gcGVybWFuZW50IHN0b3JhZ2UgKGluIHRoZSBKUEVHIG9iamVjdAotc3RydWN0dXJlcykgaW50byBsb2NhbCB2YXJpYWJsZXMuICBPbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIE1DVSwgdGhlCi1wZXJtYW5lbnQgc3RhdGUgaXMgdXBkYXRlZC4gIChUaGlzIGNvcHlpbmcgaXMgbm90IHZlcnkgZXhwZW5zaXZlLCBhbmQgbWF5IGV2ZW4KLWxlYWQgdG8gKmltcHJvdmVkKiBwZXJmb3JtYW5jZSBpZiB0aGUgbG9jYWwgdmFyaWFibGVzIGNhbiBiZSByZWdpc3Rlcml6ZWQuKQotSWYgYSBzdXNwZW5zaW9uIG9jY3VycywgdGhlIGNvZGVjIHNpbXBseSByZXR1cm5zIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHN0YXRlLAotdGh1cyBlZmZlY3RpdmVseSByZXZlcnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSBNQ1UuICBOb3RlIHRoYXQgdGhpcyBpbXBsaWVzCi1sZWF2aW5nIHNvbWUgZGF0YSB1bnByb2Nlc3NlZCBpbiB0aGUgc291cmNlL2Rlc3RpbmF0aW9uIGJ1ZmZlciAoaWUsIHRoZQotY29tcHJlc3NlZCBwYXJ0aWFsIE1DVSkuICBUaGUgZGF0YSBzb3VyY2UvZGVzdGluYXRpb24gbW9kdWxlIGludGVyZmFjZXMgYXJlCi1zcGVjaWZpZWQgc28gYXMgdG8gbWFrZSB0aGlzIHBvc3NpYmxlLiAgVGhpcyBhbHNvIGltcGxpZXMgdGhhdCB0aGUgZGF0YSBidWZmZXIKLW11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYSB3b3JzdC1jYXNlIGNvbXByZXNzZWQgTUNVOyBhIGNvdXBsZSB0aG91c2FuZAotYnl0ZXMgc2hvdWxkIGJlIGVub3VnaC4KLQotSW4gYSBzdWNjZXNzaXZlLWFwcHJveGltYXRpb24gQUMgcmVmaW5lbWVudCBzY2FuLCB0aGUgcHJvZ3Jlc3NpdmUgSHVmZm1hbgotZGVjb2RlciBoYXMgdG8gYmUgYWJsZSB0byB1bmRvIGFzc2lnbm1lbnRzIG9mIG5ld2x5IG5vbnplcm8gY29lZmZpY2llbnRzIGlmIGl0Ci1zdXNwZW5kcyBiZWZvcmUgdGhlIE1DVSBpcyBjb21wbGV0ZSwgc2luY2UgZGVjb2RpbmcgcmVxdWlyZXMgZGlzdGluZ3Vpc2hpbmcKLXByZXZpb3VzbHktemVybyBhbmQgcHJldmlvdXNseS1ub256ZXJvIGNvZWZmaWNpZW50cy4gIFRoaXMgaXMgYSBiaXQgdGVkaW91cwotYnV0IHByb2JhYmx5IHdvbid0IGhhdmUgbXVjaCBlZmZlY3Qgb24gcGVyZm9ybWFuY2UuICBPdGhlciB2YXJpYW50cyBvZiBIdWZmbWFuCi1kZWNvZGluZyBuZWVkIG5vdCB3b3JyeSBhYm91dCB0aGlzLCBzaW5jZSB0aGV5IHdpbGwganVzdCBzdG9yZSB0aGUgc2FtZSB2YWx1ZXMKLWFnYWluIGlmIGZvcmNlZCB0byByZXBlYXQgdGhlIE1DVS4KLQotVGhpcyBhcHByb2FjaCB3b3VsZCBwcm9iYWJseSBub3Qgd29yayBmb3IgYW4gYXJpdGhtZXRpYyBjb2RlYywgc2luY2UgaXRzCi1tb2RpZmlhYmxlIHN0YXRlIGlzIHF1aXRlIGxhcmdlIGFuZCBjb3VsZG4ndCBiZSBjb3BpZWQgY2hlYXBseS4gIEluc3RlYWQgaXQKLXdvdWxkIGhhdmUgdG8gc3VzcGVuZCBhbmQgcmVzdW1lIGV4YWN0bHkgYXQgdGhlIHBvaW50IG9mIHRoZSBidWZmZXIgZW5kLgotCi1UaGUgSlBFRyBtYXJrZXIgcmVhZGVyIGlzIGRlc2lnbmVkIHRvIGNvcGUgd2l0aCBzdXNwZW5zaW9uIGF0IGFuIGFyYml0cmFyeQotcG9pbnQuICBJdCBkb2VzIHNvIGJ5IGJhY2tpbmcgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXJrZXIgcGFyYW1ldGVyIHNlZ21lbnQsCi1zbyB0aGUgZGF0YSBidWZmZXIgbXVzdCBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgdGhlIGxhcmdlc3QgbWFya2VyIG9mIGludGVyZXN0LgotQWdhaW4sIGEgY291cGxlIEtCIHNob3VsZCBiZSBhZGVxdWF0ZS4gIChBIHNwZWNpYWwgInNraXAiIGNvbnZlbnRpb24gaXMgdXNlZAotdG8gYnlwYXNzIENPTSBhbmQgQVBQbiBtYXJrZXJzLCBzbyB0aGVzZSBjYW4gYmUgbGFyZ2VyIHRoYW4gdGhlIGJ1ZmZlciBzaXplCi13aXRob3V0IGNhdXNpbmcgcHJvYmxlbXM7IG90aGVyd2lzZSBhIDY0SyBidWZmZXIgd291bGQgYmUgbmVlZGVkIGluIHRoZSB3b3JzdAotY2FzZS4pCi0KLVRoZSBKUEVHIG1hcmtlciB3cml0ZXIgY3VycmVudGx5IGRvZXMgKm5vdCogY29wZSB3aXRoIHN1c3BlbnNpb24uICBJIGZlZWwgdGhhdAotdGhpcyBpcyBub3QgbmVjZXNzYXJ5OyBpdCBpcyBtdWNoIGVhc2llciBzaW1wbHkgdG8gcmVxdWlyZSB0aGUgYXBwbGljYXRpb24gdG8KLWVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggYnVmZmVyIHNwYWNlIGJlZm9yZSBzdGFydGluZy4gIChBbiBlbXB0eSAySyBidWZmZXIgaXMKLW1vcmUgdGhhbiBzdWZmaWNpZW50IGZvciB0aGUgaGVhZGVyIG1hcmtlcnM7IGFuZCBlbnN1cmluZyB0aGVyZSBhcmUgYSBkb3plbiBvcgotdHdvIGJ5dGVzIGF2YWlsYWJsZSBiZWZvcmUgY2FsbGluZyBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIHdpbGwgc3VmZmljZSBmb3IgdGhlCi10cmFpbGVyLikgIFRoaXMgd291bGQgbm90IHdvcmsgZm9yIHdyaXRpbmcgbXVsdGktc2NhbiBKUEVHIGZpbGVzLCBidXQKLXdlIHNpbXBseSBkbyBub3QgaW50ZW5kIHRvIHN1cHBvcnQgdGhhdCBjYXBhYmlsaXR5IHdpdGggc3VzcGVuc2lvbi4KLQotCi0qKiogTWVtb3J5IG1hbmFnZXIgc2VydmljZXMgKioqCi0KLVRoZSBKUEVHIGxpYnJhcnkncyBtZW1vcnkgbWFuYWdlciBjb250cm9scyBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gb2YKLW1lbW9yeSwgYW5kIGl0IG1hbmFnZXMgbGFyZ2UgInZpcnR1YWwiIGRhdGEgYXJyYXlzIG9uIG1hY2hpbmVzIHdoZXJlIHRoZQotb3BlcmF0aW5nIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHZpcnR1YWwgbWVtb3J5LiAgTm90ZSB0aGF0IHRoZSBzYW1lCi1tZW1vcnkgbWFuYWdlciBzZXJ2ZXMgYm90aCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBvcGVyYXRpb25zLgotCi1JbiBhbGwgY2FzZXMsIGFsbG9jYXRlZCBvYmplY3RzIGFyZSB0aWVkIHRvIGEgcGFydGljdWxhciBjb21wcmVzc2lvbiBvcgotZGVjb21wcmVzc2lvbiBtYXN0ZXIgcmVjb3JkLCBhbmQgdGhleSB3aWxsIGJlIHJlbGVhc2VkIHdoZW4gdGhhdCBtYXN0ZXIKLXJlY29yZCBpcyBkZXN0cm95ZWQuCi0KLVRoZSBtZW1vcnkgbWFuYWdlciBkb2VzIG5vdCBwcm92aWRlIGV4cGxpY2l0IGRlYWxsb2NhdGlvbiBvZiBvYmplY3RzLgotSW5zdGVhZCwgb2JqZWN0cyBhcmUgY3JlYXRlZCBpbiAicG9vbHMiIG9mIGZyZWUgc3RvcmFnZSwgYW5kIGEgd2hvbGUgcG9vbAotY2FuIGJlIGZyZWVkIGF0IG9uY2UuICBUaGlzIGFwcHJvYWNoIGhlbHBzIHByZXZlbnQgc3RvcmFnZS1sZWFrIGJ1Z3MsIGFuZAotaXQgc3BlZWRzIHVwIG9wZXJhdGlvbnMgd2hlbmV2ZXIgbWFsbG9jL2ZyZWUgYXJlIHNsb3cgKGFzIHRoZXkgb2Z0ZW4gYXJlKS4KLVRoZSBwb29scyBjYW4gYmUgcmVnYXJkZWQgYXMgbGlmZXRpbWUgaWRlbnRpZmllcnMgZm9yIG9iamVjdHMuICBUd28KLXBvb2xzL2xpZmV0aW1lcyBhcmUgZGVmaW5lZDoKLSAgKiBKUE9PTF9QRVJNQU5FTlQJbGFzdHMgdW50aWwgbWFzdGVyIHJlY29yZCBpcyBkZXN0cm95ZWQKLSAgKiBKUE9PTF9JTUFHRQkJbGFzdHMgdW50aWwgZG9uZSB3aXRoIGltYWdlIChKUEVHIGRhdGFzdHJlYW0pCi1QZXJtYW5lbnQgbGlmZXRpbWUgaXMgdXNlZCBmb3IgcGFyYW1ldGVycyBhbmQgdGFibGVzIHRoYXQgc2hvdWxkIGJlIGNhcnJpZWQKLWFjcm9zcyBmcm9tIG9uZSBkYXRhc3RyZWFtIHRvIGFub3RoZXI7IHRoaXMgaW5jbHVkZXMgYWxsIGFwcGxpY2F0aW9uLXZpc2libGUKLXBhcmFtZXRlcnMuICBJbWFnZSBsaWZldGltZSBpcyB1c2VkIGZvciBldmVyeXRoaW5nIGVsc2UuICAoQSB0aGlyZCBsaWZldGltZSwKLUpQT09MX1BBU1MgPSBvbmUgcHJvY2Vzc2luZyBwYXNzLCB3YXMgb3JpZ2luYWxseSBwbGFubmVkLiAgSG93ZXZlciBpdCB3YXMKLWRyb3BwZWQgYXMgbm90IGJlaW5nIHdvcnRod2hpbGUuICBUaGUgYWN0dWFsIHVzYWdlIHBhdHRlcm5zIGFyZSBzdWNoIHRoYXQgdGhlCi1wZWFrIG1lbW9yeSB1c2FnZSB3b3VsZCBiZSBhYm91dCB0aGUgc2FtZSBhbnl3YXk7IGFuZCBoYXZpbmcgcGVyLXBhc3Mgc3RvcmFnZQotc3Vic3RhbnRpYWxseSBjb21wbGljYXRlcyB0aGUgdmlydHVhbCBtZW1vcnkgYWxsb2NhdGlvbiBydWxlcyAtLS0gc2VlIGJlbG93LikKLQotVGhlIG1lbW9yeSBtYW5hZ2VyIGRlYWxzIHdpdGggdGhyZWUga2luZHMgb2Ygb2JqZWN0OgotMS4gIlNtYWxsIiBvYmplY3RzLiAgVHlwaWNhbGx5IHRoZXNlIHJlcXVpcmUgbm8gbW9yZSB0aGFuIDEwSy0yMEsgdG90YWwuCi0yLiAiTGFyZ2UiIG9iamVjdHMuICBUaGVzZSBtYXkgcmVxdWlyZSB0ZW5zIHRvIGh1bmRyZWRzIG9mIEsgZGVwZW5kaW5nIG9uCi0gICBpbWFnZSBzaXplLiAgU2VtYW50aWNhbGx5IHRoZXkgYmVoYXZlIHRoZSBzYW1lIGFzIHNtYWxsIG9iamVjdHMsIGJ1dCB3ZQotICAgZGlzdGluZ3Vpc2ggdGhlbSBmb3IgdHdvIHJlYXNvbnM6Ci0gICAgICogT24gTVMtRE9TIG1hY2hpbmVzLCBsYXJnZSBvYmplY3RzIGFyZSByZWZlcmVuY2VkIGJ5IEZBUiBwb2ludGVycywKLSAgICAgICBzbWFsbCBvYmplY3RzIGJ5IE5FQVIgcG9pbnRlcnMuCi0gICAgICogUG9vbCBhbGxvY2F0aW9uIGhldXJpc3RpY3MgbWF5IGRpZmZlciBmb3IgbGFyZ2UgYW5kIHNtYWxsIG9iamVjdHMuCi0gICBOb3RlIHRoYXQgaW5kaXZpZHVhbCAibGFyZ2UiIG9iamVjdHMgY2Fubm90IGV4Y2VlZCB0aGUgc2l6ZSBhbGxvd2VkIGJ5Ci0gICB0eXBlIHNpemVfdCwgd2hpY2ggbWF5IGJlIDY0SyBvciBsZXNzIG9uIHNvbWUgbWFjaGluZXMuCi0zLiAiVmlydHVhbCIgb2JqZWN0cy4gIFRoZXNlIGFyZSBsYXJnZSAyLUQgYXJyYXlzIG9mIEpTQU1QTEVzIG9yIEpCTE9DS3MKLSAgICh0eXBpY2FsbHkgbGFyZ2UgZW5vdWdoIGZvciB0aGUgZW50aXJlIGltYWdlIGJlaW5nIHByb2Nlc3NlZCkuICBUaGUKLSAgIG1lbW9yeSBtYW5hZ2VyIHByb3ZpZGVzIHN0cmlwd2lzZSBhY2Nlc3MgdG8gdGhlc2UgYXJyYXlzLiAgT24gbWFjaGluZXMKLSAgIHdpdGhvdXQgdmlydHVhbCBtZW1vcnksIHRoZSByZXN0IG9mIHRoZSBhcnJheSBtYXkgYmUgc3dhcHBlZCBvdXQgdG8gYQotICAgdGVtcG9yYXJ5IGZpbGUuCi0KLShOb3RlOiBKU0FNUEFSUkFZIGFuZCBKQkxPQ0tBUlJBWSBkYXRhIHN0cnVjdHVyZXMgYXJlIGEgY29tYmluYXRpb24gb2YgbGFyZ2UKLW9iamVjdHMgZm9yIHRoZSBkYXRhIHByb3BlciBhbmQgc21hbGwgb2JqZWN0cyBmb3IgdGhlIHJvdyBwb2ludGVycy4gIEZvcgotY29udmVuaWVuY2UgYW5kIHNwZWVkLCB0aGUgbWVtb3J5IG1hbmFnZXIgcHJvdmlkZXMgc2luZ2xlIHJvdXRpbmVzIHRvIGNyZWF0ZQotdGhlc2Ugc3RydWN0dXJlcy4gIFNpbWlsYXJseSwgdmlydHVhbCBhcnJheXMgaW5jbHVkZSBhIHNtYWxsIGNvbnRyb2wgYmxvY2sKLWFuZCBhIEpTQU1QQVJSQVkgb3IgSkJMT0NLQVJSQVkgd29ya2luZyBidWZmZXIsIGFsbCBjcmVhdGVkIHdpdGggb25lIGNhbGwuKQotCi1JbiB0aGUgcHJlc2VudCBpbXBsZW1lbnRhdGlvbiwgdmlydHVhbCBhcnJheXMgYXJlIG9ubHkgcGVybWl0dGVkIHRvIGhhdmUgaW1hZ2UKLWxpZmVzcGFuLiAgKFBlcm1hbmVudCBsaWZlc3BhbiB3b3VsZCBub3QgYmUgcmVhc29uYWJsZSwgYW5kIHBhc3MgbGlmZXNwYW4gaXMKLW5vdCB2ZXJ5IHVzZWZ1bCBzaW5jZSBhIHZpcnR1YWwgYXJyYXkncyByYWlzb24gZCdldHJlIGlzIHRvIHN0b3JlIGRhdGEgZm9yCi1tdWx0aXBsZSBwYXNzZXMgdGhyb3VnaCB0aGUgaW1hZ2UuKSAgV2UgYWxzbyBleHBlY3QgdGhhdCBvbmx5ICJzbWFsbCIgb2JqZWN0cwotd2lsbCBiZSBnaXZlbiBwZXJtYW5lbnQgbGlmZXNwYW4sIHRob3VnaCB0aGlzIHJlc3RyaWN0aW9uIGlzIG5vdCByZXF1aXJlZCBieQotdGhlIG1lbW9yeSBtYW5hZ2VyLgotCi1JbiBhIG5vbi12aXJ0dWFsLW1lbW9yeSBtYWNoaW5lLCBzb21lIHBlcmZvcm1hbmNlIGJlbmVmaXQgY2FuIGJlIGdhaW5lZCBieQotbWFraW5nIHRoZSBpbi1tZW1vcnkgYnVmZmVycyBmb3IgdmlydHVhbCBhcnJheXMgYmUgYXMgbGFyZ2UgYXMgcG9zc2libGUuCi0oRm9yIHNtYWxsIGltYWdlcywgdGhlIGJ1ZmZlcnMgbWlnaHQgZml0IGVudGlyZWx5IGluIG1lbW9yeSwgc28gYmxpbmQKLXN3YXBwaW5nIHdvdWxkIGJlIHZlcnkgd2FzdGVmdWwuKSAgVGhlIG1lbW9yeSBtYW5hZ2VyIHdpbGwgYWRqdXN0IHRoZSBoZWlnaHQKLW9mIHRoZSBidWZmZXJzIHRvIGZpdCB3aXRoaW4gYSBwcmVzcGVjaWZpZWQgbWF4aW11bSBtZW1vcnkgdXNhZ2UuICBJbiBvcmRlcgotdG8gZG8gdGhpcyBpbiBhIHJlYXNvbmFibHkgb3B0aW1hbCBmYXNoaW9uLCB0aGUgbWFuYWdlciBuZWVkcyB0byBhbGxvY2F0ZSBhbGwKLW9mIHRoZSB2aXJ0dWFsIGFycmF5cyBhdCBvbmNlLiAgVGhlcmVmb3JlLCB0aGVyZSBpc24ndCBhIG9uZS1zdGVwIGFsbG9jYXRpb24KLXJvdXRpbmUgZm9yIHZpcnR1YWwgYXJyYXlzOyBpbnN0ZWFkLCB0aGVyZSBpcyBhICJyZXF1ZXN0IiByb3V0aW5lIHRoYXQgc2ltcGx5Ci1hbGxvY2F0ZXMgdGhlIGNvbnRyb2wgYmxvY2ssIGFuZCBhICJyZWFsaXplIiByb3V0aW5lIChjYWxsZWQganVzdCBvbmNlKSB0aGF0Ci1kZXRlcm1pbmVzIHNwYWNlIGFsbG9jYXRpb24gYW5kIGNyZWF0ZXMgYWxsIG9mIHRoZSBhY3R1YWwgYnVmZmVycy4gIFRoZQotcmVhbGl6ZSByb3V0aW5lIG11c3QgYWxsb3cgZm9yIHNwYWNlIG9jY3VwaWVkIGJ5IG5vbi12aXJ0dWFsIGxhcmdlIG9iamVjdHMuCi0oV2UgZG9uJ3QgYm90aGVyIHRvIGZhY3RvciBpbiB0aGUgc3BhY2UgbmVlZGVkIGZvciBzbWFsbCBvYmplY3RzLCBvbiB0aGUKLWdyb3VuZHMgdGhhdCBpdCBpc24ndCB3b3J0aCB0aGUgdHJvdWJsZS4pCi0KLVRvIHN1cHBvcnQgYWxsIHRoaXMsIHdlIGVzdGFibGlzaCB0aGUgZm9sbG93aW5nIHByb3RvY29sIGZvciBkb2luZyBidXNpbmVzcwotd2l0aCB0aGUgbWVtb3J5IG1hbmFnZXI6Ci0gIDEuIE1vZHVsZXMgbXVzdCByZXF1ZXN0IHZpcnR1YWwgYXJyYXlzICh3aGljaCBtYXkgaGF2ZSBvbmx5IGltYWdlIGxpZmVzcGFuKQotICAgICBkdXJpbmcgdGhlIGluaXRpYWwgc2V0dXAgcGhhc2UsIGkuZS4sIGluIHRoZWlyIGppbml0X3h4eCByb3V0aW5lcy4KLSAgMi4gQWxsICJsYXJnZSIgb2JqZWN0cyAoaW5jbHVkaW5nIEpTQU1QQVJSQVlzIGFuZCBKQkxPQ0tBUlJBWXMpIG11c3QgYWxzbyBiZQotICAgICBhbGxvY2F0ZWQgZHVyaW5nIGluaXRpYWwgc2V0dXAuCi0gIDMuIHJlYWxpemVfdmlydF9hcnJheXMgd2lsbCBiZSBjYWxsZWQgYXQgdGhlIGNvbXBsZXRpb24gb2YgaW5pdGlhbCBzZXR1cC4KLSAgICAgVGhlIGFib3ZlIGNvbnZlbnRpb25zIGVuc3VyZSB0aGF0IHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlCi0gICAgIGZvciBpdCB0byBjaG9vc2UgYSBnb29kIHNpemUgZm9yIHZpcnR1YWwgYXJyYXkgYnVmZmVycy4KLVNtYWxsIG9iamVjdHMgb2YgYW55IGxpZmVzcGFuIG1heSBiZSBhbGxvY2F0ZWQgYXQgYW55IHRpbWUuICBXZSBleHBlY3QgdGhhdAotdGhlIHRvdGFsIHNwYWNlIHVzZWQgZm9yIHNtYWxsIG9iamVjdHMgd2lsbCBiZSBzbWFsbCBlbm91Z2ggdG8gYmUgbmVnbGlnaWJsZQotaW4gdGhlIHJlYWxpemVfdmlydF9hcnJheXMgY29tcHV0YXRpb24uCi0KLUluIGEgdmlydHVhbC1tZW1vcnkgbWFjaGluZSwgd2Ugc2ltcGx5IHByZXRlbmQgdGhhdCB0aGUgYXZhaWxhYmxlIHNwYWNlIGlzCi1pbmZpbml0ZSwgdGh1cyBjYXVzaW5nIHJlYWxpemVfdmlydF9hcnJheXMgdG8gZGVjaWRlIHRoYXQgaXQgY2FuIGFsbG9jYXRlIGFsbAotdGhlIHZpcnR1YWwgYXJyYXlzIGFzIGZ1bGwtc2l6ZSBpbi1tZW1vcnkgYnVmZmVycy4gIFRoZSBvdmVyaGVhZCBvZiB0aGUKLXZpcnR1YWwtYXJyYXkgYWNjZXNzIHByb3RvY29sIGlzIHZlcnkgc21hbGwgd2hlbiBubyBzd2FwcGluZyBvY2N1cnMuCi0KLUEgdmlydHVhbCBhcnJheSBjYW4gYmUgc3BlY2lmaWVkIHRvIGJlICJwcmUtemVyb2VkIjsgd2hlbiB0aGlzIGZsYWcgaXMgc2V0LAotbmV2ZXIteWV0LXdyaXR0ZW4gc2VjdGlvbnMgb2YgdGhlIGFycmF5IGFyZSBzZXQgdG8gemVybyBiZWZvcmUgYmVpbmcgbWFkZQotYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIuICBJZiB0aGlzIGZsYWcgaXMgbm90IHNldCwgbmV2ZXItd3JpdHRlbiBzZWN0aW9ucwotb2YgdGhlIGFycmF5IGNvbnRhaW4gZ2FyYmFnZS4gIChUaGlzIGZlYXR1cmUgZXhpc3RzIHByaW1hcmlseSBiZWNhdXNlIHRoZQotZXF1aXZhbGVudCBsb2dpYyB3b3VsZCBvdGhlcndpc2UgYmUgbmVlZGVkIGluIGpkY29lZmN0LmMgZm9yIHByb2dyZXNzaXZlCi1KUEVHIG1vZGU7IHdlIG1heSBhcyB3ZWxsIG1ha2UgaXQgYXZhaWxhYmxlIGZvciBwb3NzaWJsZSBvdGhlciB1c2VzLikKLQotVGhlIGZpcnN0IHdyaXRlIHBhc3Mgb24gYSB2aXJ0dWFsIGFycmF5IGlzIHJlcXVpcmVkIHRvIG9jY3VyIGluIHRvcC10by1ib3R0b20KLW9yZGVyOyByZWFkIHBhc3NlcywgYXMgd2VsbCBhcyBhbnkgd3JpdGUgcGFzc2VzIGFmdGVyIHRoZSBmaXJzdCBvbmUsIG1heQotYWNjZXNzIHRoZSBhcnJheSBpbiBhbnkgb3JkZXIuICBUaGlzIHJlc3RyaWN0aW9uIGV4aXN0cyBwYXJ0bHkgdG8gc2ltcGxpZnkKLXRoZSB2aXJ0dWFsIGFycmF5IGNvbnRyb2wgbG9naWMsIGFuZCBwYXJ0bHkgYmVjYXVzZSBzb21lIGZpbGUgc3lzdGVtcyBtYXkgbm90Ci1zdXBwb3J0IHNlZWtpbmcgYmV5b25kIHRoZSBjdXJyZW50IGVuZC1vZi1maWxlIGluIGEgdGVtcG9yYXJ5IGZpbGUuICBUaGUgbWFpbgotaW1wbGljYXRpb24gb2YgdGhpcyByZXN0cmljdGlvbiBpcyB0aGF0IHJlYXJyYW5nZW1lbnQgb2Ygcm93cyAoc3VjaCBhcwotY29udmVydGluZyB0b3AtdG8tYm90dG9tIGRhdGEgb3JkZXIgdG8gYm90dG9tLXRvLXRvcCkgbXVzdCBiZSBoYW5kbGVkIHdoaWxlCi1yZWFkaW5nIGRhdGEgb3V0IG9mIHRoZSB2aXJ0dWFsIGFycmF5LCBub3Qgd2hpbGUgcHV0dGluZyBpdCBpbi4KLQotCi0qKiogTWVtb3J5IG1hbmFnZXIgaW50ZXJuYWwgc3RydWN0dXJlICoqKgotCi1UbyBpc29sYXRlIHN5c3RlbSBkZXBlbmRlbmNpZXMgYXMgbXVjaCBhcyBwb3NzaWJsZSwgd2UgaGF2ZSBicm9rZW4gdGhlCi1tZW1vcnkgbWFuYWdlciBpbnRvIHR3byBwYXJ0cy4gIFRoZXJlIGlzIGEgcmVhc29uYWJseSBzeXN0ZW0taW5kZXBlbmRlbnQKLSJmcm9udCBlbmQiIChqbWVtbWdyLmMpIGFuZCBhICJiYWNrIGVuZCIgdGhhdCBjb250YWlucyBvbmx5IHRoZSBjb2RlCi1saWtlbHkgdG8gY2hhbmdlIGFjcm9zcyBzeXN0ZW1zLiAgQWxsIG9mIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBtZXRob2RzCi1vdXRsaW5lZCBhYm92ZSBhcmUgaW1wbGVtZW50ZWQgYnkgdGhlIGZyb250IGVuZC4gIFRoZSBiYWNrIGVuZCBwcm92aWRlcwotdGhlIGZvbGxvd2luZyByb3V0aW5lcyBmb3IgdXNlIGJ5IHRoZSBmcm9udCBlbmQgKG5vbmUgb2YgdGhlc2Ugcm91dGluZXMKLWFyZSBrbm93biB0byB0aGUgcmVzdCBvZiB0aGUgSlBFRyBjb2RlKToKLQotanBlZ19tZW1faW5pdCwganBlZ19tZW1fdGVybQlzeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uL3NodXRkb3duCi0KLWpwZWdfZ2V0X3NtYWxsLCBqcGVnX2ZyZWVfc21hbGwJaW50ZXJmYWNlIHRvIG1hbGxvYyBhbmQgZnJlZSBsaWJyYXJ5IHJvdXRpbmVzCi0JCQkJKG9yIHRoZWlyIGVxdWl2YWxlbnRzKQotCi1qcGVnX2dldF9sYXJnZSwganBlZ19mcmVlX2xhcmdlCWludGVyZmFjZSB0byBGQVIgbWFsbG9jL2ZyZWUgaW4gTVNET1MgbWFjaGluZXM7Ci0JCQkJZWxzZSB1c3VhbGx5IHRoZSBzYW1lIGFzCi0JCQkJanBlZ19nZXRfc21hbGwvanBlZ19mcmVlX3NtYWxsCi0KLWpwZWdfbWVtX2F2YWlsYWJsZQkJZXN0aW1hdGUgYXZhaWxhYmxlIG1lbW9yeQotCi1qcGVnX29wZW5fYmFja2luZ19zdG9yZQkJY3JlYXRlIGEgYmFja2luZy1zdG9yZSBvYmplY3QKLQotcmVhZF9iYWNraW5nX3N0b3JlLAkJbWFuaXB1bGF0ZSBhIGJhY2tpbmctc3RvcmUgb2JqZWN0Ci13cml0ZV9iYWNraW5nX3N0b3JlLAotY2xvc2VfYmFja2luZ19zdG9yZQotCi1PbiBzb21lIHN5c3RlbXMgdGhlcmUgd2lsbCBiZSBtb3JlIHRoYW4gb25lIHR5cGUgb2YgYmFja2luZy1zdG9yZSBvYmplY3QKLShzcGVjaWZpY2FsbHksIGluIE1TLURPUyBhIGJhY2tpbmcgc3RvcmUgZmlsZSBtaWdodCBiZSBhbiBhcmVhIG9mIGV4dGVuZGVkCi1tZW1vcnkgYXMgd2VsbCBhcyBhIGRpc2sgZmlsZSkuICBqcGVnX29wZW5fYmFja2luZ19zdG9yZSBpcyByZXNwb25zaWJsZSBmb3IKLWNob29zaW5nIGhvdyB0byBpbXBsZW1lbnQgYSBnaXZlbiBvYmplY3QuICBUaGUgcmVhZC93cml0ZS9jbG9zZSByb3V0aW5lcwotYXJlIG1ldGhvZCBwb2ludGVycyBpbiB0aGUgc3RydWN0dXJlIHRoYXQgZGVzY3JpYmVzIGEgZ2l2ZW4gb2JqZWN0OyB0aGlzCi1sZXRzIHRoZW0gYmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgb2JqZWN0IHR5cGVzLgotCi1JdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IGJhY2tpbmcgc3RvcmUgb2JqZWN0cyBhcmUgZXhwbGljaXRseQotcmVsZWFzZWQgdXBvbiBhYm5vcm1hbCBwcm9ncmFtIHRlcm1pbmF0aW9uLiAgRm9yIGV4YW1wbGUsIE1TLURPUyB3b24ndCBmcmVlCi1leHRlbmRlZCBtZW1vcnkgYnkgaXRzZWxmLiAgVG8gc3VwcG9ydCB0aGlzLCB3ZSB3aWxsIGV4cGVjdCB0aGUgbWFpbiBwcm9ncmFtCi1vciBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiB0byBhcnJhbmdlIHRvIGNhbGwgc2VsZl9kZXN0cnVjdCAodHlwaWNhbGx5IHZpYQotanBlZ19kZXN0cm95KSB1cG9uIGFibm9ybWFsIHRlcm1pbmF0aW9uLiAgVGhpcyBtYXkgcmVxdWlyZSBhIFNJR0lOVCBzaWduYWwKLWhhbmRsZXIgb3IgZXF1aXZhbGVudC4gIFdlIGRvbid0IHdhbnQgdG8gaGF2ZSB0aGUgYmFjayBlbmQgbW9kdWxlIGluc3RhbGwgaXRzCi1vd24gc2lnbmFsIGhhbmRsZXIsIGJlY2F1c2UgdGhhdCB3b3VsZCBwcmUtZW1wdCB0aGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24ncwotYWJpbGl0eSB0byBjb250cm9sIHNpZ25hbCBoYW5kbGluZy4KLQotVGhlIElKRyBkaXN0cmlidXRpb24gaW5jbHVkZXMgc2V2ZXJhbCBtZW1vcnkgbWFuYWdlciBiYWNrIGVuZCBpbXBsZW1lbnRhdGlvbnMuCi1Vc3VhbGx5IHRoZSBzYW1lIGJhY2sgZW5kIHNob3VsZCBiZSBzdWl0YWJsZSBmb3IgYWxsIGFwcGxpY2F0aW9ucyBvbiBhIGdpdmVuCi1zeXN0ZW0sIGJ1dCBpdCBpcyBwb3NzaWJsZSBmb3IgYW4gYXBwbGljYXRpb24gdG8gc3VwcGx5IGl0cyBvd24gYmFjayBlbmQgYXQKLW5lZWQuCi0KLQotKioqIEltcGxpY2F0aW9ucyBvZiBETkwgbWFya2VyICoqKgotCi1Tb21lIEpQRUcgZmlsZXMgbWF5IHVzZSBhIEROTCBtYXJrZXIgdG8gcG9zdHBvbmUgZGVmaW5pdGlvbiBvZiB0aGUgaW1hZ2UKLWhlaWdodCAodGhpcyB3b3VsZCBiZSB1c2VmdWwgZm9yIGEgZmF4LWxpa2Ugc2Nhbm5lcidzIG91dHB1dCwgZm9yIGluc3RhbmNlKS4KLUluIHRoZXNlIGZpbGVzIHRoZSBTT0YgbWFya2VyIGNsYWltcyB0aGUgaW1hZ2UgaGVpZ2h0IGlzIDAsIGFuZCB5b3Ugb25seQotZmluZCBvdXQgdGhlIHRydWUgaW1hZ2UgaGVpZ2h0IGF0IHRoZSBlbmQgb2YgdGhlIGZpcnN0IHNjYW4uCi0KLVdlIGNvdWxkIHJlYWQgdGhlc2UgZmlsZXMgYXMgZm9sbG93czoKLTEuIFVwb24gc2VlaW5nIHplcm8gaW1hZ2UgaGVpZ2h0LCByZXBsYWNlIGl0IGJ5IDY1NTM1ICh0aGUgbWF4aW11bSBhbGxvd2VkKS4KLTIuIFdoZW4gdGhlIEROTCBpcyBmb3VuZCwgdXBkYXRlIHRoZSBpbWFnZSBoZWlnaHQgaW4gdGhlIGdsb2JhbCBpbWFnZQotICAgZGVzY3JpcHRvci4KLVRoaXMgaW1wbGllcyB0aGF0IGNvbnRyb2wgbW9kdWxlcyBtdXN0IGF2b2lkIG1ha2luZyBjb3BpZXMgb2YgdGhlIGltYWdlCi1oZWlnaHQsIGFuZCBtdXN0IHJlLXRlc3QgZm9yIHRlcm1pbmF0aW9uIGFmdGVyIGVhY2ggTUNVIHJvdy4gIFRoaXMgd291bGQKLWJlIGVhc3kgZW5vdWdoIHRvIGRvLgotCi1JbiBjYXNlcyB3aGVyZSBpbWFnZS1zaXplIGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkLCB0aGlzIGFwcHJvYWNoIHdpbGwKLXJlc3VsdCBpbiB2ZXJ5IGluZWZmaWNpZW50IHVzZSBvZiB2aXJ0dWFsIG1lbW9yeSBvciBtdWNoLWxhcmdlci10aGFuLW5lY2Vzc2FyeQotdGVtcG9yYXJ5IGZpbGVzLiAgVGhpcyBzZWVtcyBhY2NlcHRhYmxlIGZvciBzb21ldGhpbmcgdGhhdCBwcm9iYWJseSB3b24ndCBiZSBhCi1tYWluc3RyZWFtIHVzYWdlLiAgUGVvcGxlIG1pZ2h0IGhhdmUgdG8gZm9yZ28gdXNlIG9mIG1lbW9yeS1ob2dnaW5nIG9wdGlvbnMKLShzdWNoIGFzIHR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiBvciBub25pbnRlcmxlYXZlZCBKUEVHIGZpbGVzKSBpZiB0aGV5Ci13YW50IGVmZmljaWVudCBjb252ZXJzaW9uIG9mIHN1Y2ggZmlsZXMuICAoT25lIGNvdWxkIGltcHJvdmUgZWZmaWNpZW5jeSBieQotZGVtYW5kaW5nIGEgdXNlci1zdXBwbGllZCB1cHBlciBib3VuZCBmb3IgdGhlIGhlaWdodCwgbGVzcyB0aGFuIDY1NTM2OyBpbiBtb3N0Ci1jYXNlcyBpdCBjb3VsZCBiZSBtdWNoIGxlc3MuKQotCi1UaGUgc3RhbmRhcmQgYWxzbyBwZXJtaXRzIHRoZSBTT0YgbWFya2VyIHRvIG92ZXJlc3RpbWF0ZSB0aGUgaW1hZ2UgaGVpZ2h0LAotd2l0aCBhIEROTCB0byBnaXZlIHRoZSB0cnVlLCBzbWFsbGVyIGhlaWdodCBhdCB0aGUgZW5kIG9mIHRoZSBmaXJzdCBzY2FuLgotVGhpcyB3b3VsZCBzb2x2ZSB0aGUgc3BhY2UgcHJvYmxlbXMgaWYgdGhlIG92ZXJlc3RpbWF0ZSB3YXNuJ3QgdG9vIGdyZWF0LgotSG93ZXZlciwgaXQgaW1wbGllcyB0aGF0IHlvdSBkb24ndCBldmVuIGtub3cgd2hldGhlciBETkwgd2lsbCBiZSB1c2VkLgotCi1UaGlzIGxlYWRzIHRvIGEgY291cGxlIG9mIHZlcnkgc2VyaW91cyBvYmplY3Rpb25zOgotMS4gVGVzdGluZyBmb3IgYSBETkwgbWFya2VyIG11c3Qgb2NjdXIgaW4gdGhlIGlubmVyIGxvb3Agb2YgdGhlIGRlY29tcHJlc3NvcidzCi0gICBIdWZmbWFuIGRlY29kZXI7IHRoaXMgaW1wbGllcyBhIHNwZWVkIHBlbmFsdHkgd2hldGhlciB0aGUgZmVhdHVyZSBpcyB1c2VkCi0gICBvciBub3QuCi0yLiBUaGVyZSBpcyBubyB3YXkgdG8gaGlkZSB0aGUgbGFzdC1taW51dGUgY2hhbmdlIGluIGltYWdlIGhlaWdodCBmcm9tIGFuCi0gICBhcHBsaWNhdGlvbiB1c2luZyB0aGUgZGVjb2Rlci4gIFRodXMgKmV2ZXJ5KiBhcHBsaWNhdGlvbiB1c2luZyB0aGUgSUpHCi0gICBsaWJyYXJ5IHdvdWxkIHN1ZmZlciBhIGNvbXBsZXhpdHkgcGVuYWx0eSB3aGV0aGVyIGl0IGNhcmVkIGFib3V0IEROTCBvcgotICAgbm90LgotV2UgY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IEROTCBiZWNhdXNlIG9mIHRoZXNlIHByb2JsZW1zLgotCi1BIGRpZmZlcmVudCBhcHByb2FjaCBpcyB0byBpbnNpc3QgdGhhdCBETkwtdXNpbmcgZmlsZXMgYmUgcHJlcHJvY2Vzc2VkIGJ5IGEKLXNlcGFyYXRlIHByb2dyYW0gdGhhdCByZWFkcyBhaGVhZCB0byB0aGUgRE5MLCB0aGVuIGdvZXMgYmFjayBhbmQgZml4ZXMgdGhlIFNPRgotbWFya2VyLiAgVGhpcyBpcyBhIG11Y2ggc2ltcGxlciBzb2x1dGlvbiBhbmQgaXMgcHJvYmFibHkgZmFyIG1vcmUgZWZmaWNpZW50LgotRXZlbiBpZiBvbmUgd2FudHMgcGlwZWQgaW5wdXQsIGJ1ZmZlcmluZyB0aGUgZmlyc3Qgc2NhbiBvZiB0aGUgSlBFRyBmaWxlIG5lZWRzCi1hIGxvdCBzbWFsbGVyIHRlbXAgZmlsZSB0aGFuIGlzIGltcGxpZWQgYnkgdGhlIG1heGltdW0taGVpZ2h0IG1ldGhvZC4gIEZvcgotdGhpcyBhcHByb2FjaCB3ZSdkIHNpbXBseSB0cmVhdCBETkwgYXMgYSBuby1vcCBpbiB0aGUgZGVjb21wcmVzc29yIChhdCBtb3N0LAotY2hlY2sgdGhhdCBpdCBtYXRjaGVzIHRoZSBTT0YgaW1hZ2UgaGVpZ2h0KS4KLQotV2Ugd2lsbCBub3Qgd29ycnkgYWJvdXQgbWFraW5nIHRoZSBjb21wcmVzc29yIGNhcGFibGUgb2Ygb3V0cHV0dGluZyBETkwuCi1Tb21ldGhpbmcgc2ltaWxhciB0byB0aGUgZmlyc3Qgc2NoZW1lIGFib3ZlIGNvdWxkIGJlIGFwcGxpZWQgaWYgYW55b25lIGV2ZXIKLXdhbnRzIHRvIG1ha2UgdGhhdCB3b3JrLgpkaWZmIC0tZ2l0IGEvdGVzdGltZy5ibXAgYi90ZXN0aW1nLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwM2QxNS4uMDAwMDAwMAotLS0gYS90ZXN0aW1nLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbWcuanBnIGIvdGVzdGltZy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNGNhNWQuLjAwMDAwMDAKLS0tIGEvdGVzdGltZy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW1nLnBwbSBiL3Rlc3RpbWcucHBtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDgxY2UyLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbWcucHBtCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1QNgotMjI3IDE0OQotMjU1Ci0wLy0wLy0xMC4yMS81MS41MS42Mi82Mi84My84My86My06My06My06My06My06My06Mi85MS45MS44MC04MC05MS45MS46Mi84MC04MC04MC04MC04MC04MC04MC04MC02Lis2Lis2Lis1LSo1LSo0LCk0LCk0LCk0LCk0LCk0LCk0LCk0LCk0LCk0LCkyLSkvKiQvLCUvLCUwLSYxLicyLygzMCkzMCk2Myw2Myw3NC04NS44NS45Ni86NzA6Ny5BOjBCPDBEPjJGQDRJQTRKQjVLQzZLQzZNRDVNRDVPQzNOQjJPQzNPQzNQRDRSRTVSPzFZPzJiQDRuQjV9RTaLSDiZRzmjRjevRzq4Rzm+RTrFRzvHRz7KRz/LSEDQRUDnRkztQ0zrREvrRUnuQ0nvQkTxPkL0PUH4O0H3OkD0Oj/wPD/pP0DiQD7XPzzLQTe7PS+1QC61QC60Py20Py2zQC2yPy2vQC2tQCyqQSymQS2iQiyfQCqbQSmYQCqWQSyUPi2SPy+SPy+RPi6RPiyQPSuSPCuSPCuUPyuUPyuUPSqUPSqUPSqVPiuWPyyWQC+WPzaVPjWXPTKfPzGpQjOzRDO8RDS/RDS5PzC1QTKsRjieSDuHSDlvQTJUOCpDMyY9NTI5NTQ5NTQ3MzI3MTE2MDA1MC01MC03Mi83Mi83Mi82MS42MS01MCw1MCw0MSwvLy0uMC0vLy0vLy0wLy0wLy0yLi0yLi01LC00Kyw0KiszKSo3KCs9LjFFNjlQOjxqQkN8SUiNTU2VT0+fV1uqZG6qb4OfdJCUe6OHf66Ahrp+iL1zea1gYZFUS3ZQRGhTSmdPR15NSF5UUWJmZG98fYKNkZCZnpijqZ+iqJqeoJOPkoF7fGxmZ1VYV0VRTkVVUltVUWJVUWIwLy0wLy0xMC4xMC40MC01MS42Mi82Mi84My84My86My06My06My06My06My06My05MS45MS44MC04MC04MC04MC05MS45MS44MC04MC04MC04MC04MC04MC04MC04MC02Lis2Lis1LSo1LSo1LSo0LCk0LCk0LCk1LSo1LSo1LSo1LSo1LSo1LSo1LSozLiowKyUwLSYwLSYxLicyLygzMCk0MSo0MSo2Myw2Myw3NC03NC04NS45Ni86NzA6Ny5AOS9BOy9DPTFFPzNIQDNJQTRKQjVKQjVMQzRMQzRNQTFNQTFNQTFOQjJPQzNRRDRQPjBVPzFeQTNqQzR4RDaERTSSRTWcQzOnQzSvQTS1QTS8QjfARDrERTzFRj3NQ0DhRUnnQknoQ0nqREjtREfvQkTzQEP2P0P4O0H3OkD0Oj/wPD/pP0DgQT7VQDzKQDa5Pi+1QC60Py20Py20Py2yPyywPy2vQC2tQCypQCumQS2hQSufQCqbQSmYQCqWQSyUPi2SPy+RPi6RPi6RPiyQPSuSPCuSPCuUPyuTPiqUPSqUPSqUPSqVPiuWPyyWQC+UQDWVPjWYPjOgPjGrQTO1RDS9QzS/RDW7QTK3QzasRjicSTuFRzpsQDNTOSpCNCk+NjM6NjU5NTQ4NDM4MjI3MTE2MS42MS43Mi83Mi83Mi82MS42MS01MCw1MCw0MSwvLy0uMC0vLy0vLy0wLy0wLy0yLi0yLi0zLS01LC00KiszKSo1KSs8LTBDNDdOODpkPj12RUGGSkmPTkyaVFakYWqlbH2dco6Re6KGgK5/hbl7hLtvdalbW41RSHVPQ2lPRmVPR19QSF9STl9bWWZub3SDh4iUmZWZnpeaoJSZnY+PkYN+f29qa1ldW0xWU0pYU1pWUmFYUWEvLiwvLiwwLy0xMC40MC00MC01MS41MS43Mi43Mi43Mi43Mi45Miw5Miw5Miw5Miw5MS44MC43Ly03Ly03Ly03Ly04MC45MS84MC44MC44MC44MC44MC44MC44MC44MC42Liw1LSs1LSs1LSs0LCo0LCo0LCo0LCo1LSs1LSs1LSs1LSs1LSs1LSs1LSszLioyLScxLicyLygzMCkzMCk0MSo0MSo1Mis2Myw2Myw2Myw3NC04NS45Ni85Ni86Ny4/OC5AOi5CPDBEPjJHPzRIQDVIQDNIQDNJQDFJQDFLPzFLPzFLPy9MQDBNQTFOQjJNQTFRQTFZQjJkQzJxQzN8QzKHQjKSQTCYPC2gOiunOy6vPTK1QDa6RDq/Rj3FRD7ZQ0XhQEbjQkfnQkbqREbwQ0X0QUT4P0T6O0D5Oj/1O0DwPUDoQEDcQT3RQDvGQDW3PS6zQC2zQC2yPyyyPy2wPy2vPiytQCyqPy2nQC2lQCyhQSudQSyaPyqYQCqVQCuUPi2RPi6RPi6RPi6QPSuQPSuQPSuQPSuRPiyRPiySPCuSPCuTPSyTPSyUPyuVPy6VQTaWPzWaPjOjPjKvQTS5QzW/RDXBQzXARDi4RjuuST2ZSj2BRztoQDRROixCNSw/NzQ9Nzc8NjY6NDQ5NDE4MzA3Mi83Mi82Mi82Mi82Mi81MS41Mi00MSw0MSwyMSwuMC0sMS0uMC0uMC0vLy0vLy0wLy0yLi01Ly80Li41LC00Kis0Kis5LS8+MjRJNTZbOTdsPzl8RUCGSUSQT02YW2CbZnaUbYiMd56Dfa19grl1frdmbaRUVolNRXZMQWtNQWVPRmNRSGNNSF5OS1xbW2VxdHmFiYiHjIaKj4iNkIWGinx4emxmaVhaW01WU0xaVVtaVGBbU2AuLSsvLiwvLiwwLy0zLyw0MC00MC00MC02MS02MS02MS02MS04MSs4MSs4MSs4MSs3Ly03Ly02Liw2Liw2Liw2Liw3Ly03Ly04MC44MC44MC44MC44MC44MC44MC44MC41LSs1LSs1LSs0LCo0LCo0LCozKykzKyk2Liw2Liw2Liw2Liw2Liw2Liw2Liw0LywzMCszMCkzMCk0MSo0MSo1Mis1Mis1Mis1Mis1Mis2Myw3NC04NS44NS45Ni85Ni0+Ny0/OS1AOi5CPDBFPTJFPTJGPjFGPjFHPTFHPi9IPC5JPS9JPS9KPi5MQDBKQTBLRDJORTRVRDReRDNpRDJzQjF+QS+GPy2MOSmUOSedOSqjPC2sQDOzRTi4SDzBRj7SREPaQUPeQkPiREPnQ0TsQkPzQEP3P0H6O0D5Oj/1O0DuPkDlQUDaQj3NQDnCQDO1PS2wQCywQCywQCyvPiyuPyyuPyysPyupQC2mPyyjQCugQCqcQCuYQCqWQCmUPyqRPiyRPi6RPi6QPS2QPSuQPSuPPCqPPCqQPSuQPSuPPCqPPCqSPCuRPiyUPi2SPy2VQTaWPzWcPjKmQDSyQja8QzjBQzfCQjfCRjy6Sj+sTECXSz58RjpiQDRMOi5BNy1AODU+OTY9Nzc8NzQ6NTI5NDE4MzA4MzA2Mi82Mi82Mi8zMi41Mi0yMSwyMSwxMi0tMi4tMi4vMS4vMS4wMC4wMC4xMC4xMC41MTA2MDA1Ly81LC00Kyw2LC06MDFEMjJUNzFjOzNxQTd7RTuCSESJUlWNX2yLaYKDc5h9eat4fbVvd7VgZqJRUotMRXlMQHBMQGhQRWdRRmZMQ15HQlZNTFpeXmZqbnF1eXh4fXd6gHZ3em9rb2FgYlRXWUxUVExdV1ldVl1dVl4tLS0tLS0uLSsvLiwwLy0xMC4zLyw0MC0zLywzLyw0Lys0Lys0Lys0Lys2Lyk2Lyk0Lyw0LywzLiszLiszLiszLis0Lyw0Lyw1MC01MC01MC01MC01MC01MC01MC01MC0zLiszLisyLSoyLSoyLSoxLCkxLCkxLCk0Lyw0Lyw0Lyw0Lyw0Lyw0Lyw0Lyw0Lyw0MSw0MSw0MSw0MSw0MSw1Mi01Mi01Mi01Mi01Mi02My42My43NC84NTA5NjE5Ni88NS09Niw/OC5AOS9COi9DOzBDOzBDOy5EOi5EOi5GOi5HOy1IPC5JPS9KPjBJQDFKRzZNSDVSRzVZRjViRTNqRDF1Qi99PiyCOymLOimTOiqaPSyjQjKsRjiySj27ST/MR0LUREPYRELdRULiQkLpQUHwPUD0PD75Oj/4Ojz0PD7tPz7hQj7TQzrFQTW5PzCyPy2uPyyuPyyuPyytPi2sPi2sPi2qPy2oPi6kPy2gPyyePyuaPyyXPyuVPiqTPiqRPiyQPy6PPi2PPi2PPi2OPSyOPSyOPSyOPSyOPSyOPSyOPSyPPCyPPi2RPi6QPy6UQjSXQTSdQDGoQDO2QTe/QznFQjjEQTe+Qzu3SD+mTEOQSkB0RTtaPjJFOS08NStAOTNAODU/NzU+NjM9NTI8NDE5NDA4My82Mi80My80My8yMy4zMi4xMi0xMi0wMi0tMi4sMi4tMi4tMi4vMS4vMS4wMC4xMC4zMjA1MTA1MTA0Li4yLCw0Kyw3Li89Ly5ONS5ZOS5lPTFuQDNzQjt5S0uAWmWDZ4B/cJd6eKp1e7drc7RfZKZUVJRPR4NMQndOQW1OQmhNQWVKQWBHQllHRlhLS1dNUFVdY2NgZmJiaWFgZlxaYFRXW01VWE1YWFBeWVZgV1hgV1osLCwsLCwuLSsuLSsvLiwwLy0zLywzLywyLisyLiszLiozLiozLiozLio1Lig1LSozLiszLisyLSoxLCkxLCkyLSozLiszLiszLiszLiszLiszLiszLiszLiszLiszLisyLSoyLSoyLSoyLSoxLCkxLCkxLCkwKygzLiszLiszLiszLiszLiszLiszLiszLis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw1Mi01Mi02My43NC84NTA4NTA4NS47NCw8NSs9Niw+Ny1ANy5BOS5BOS5BOS5DOS9DOS1FOS1GOi5HOy9IPC5KPjBIQTFKRzZJSDZORzVWRjZcRTNkQzJuQDB2Pi17PCuCOymMOyqUPSycQDGjRjWqSjq0Sj3ESEDMRUHRRkHWRUDeQ0HkQD7sPj/xOjz3Ozz0OjvwPD3pQD3cQz3NQzi+QDKxPiyuPyyrQCyqPyuqPyuqPy2pPiypPiyoPyylPi2iPyygPyybPiyXPyuVPiqTPimRPyqPPiuPPi2PPi2PPi2OPSyOPSyOPSyNPCuOPSyLPCuNPCuLPCuLPC2MPSyNPi+OPy6UQjSXQTKgQDKsQjW5QznCQzrFQjrCQTu6QTmxSUCjTkeNTkVvRz1TPzRBOy85Ni1AOTNBNzU/NzQ+NjM8NDE5NDA4My83NC80My80My8zNC8yMy4yMy4wMi0wMi0uMy0tMy8tMy8uMy8uMy8wMi8wMi8xMS8xMS8yMS8zMjAzMjA0MC8yLi0xLSw0Li44LixHNC1PNClYOCtgPDBlPzZtR0Z5WWSCa4WAdZ98fLJ3fLxudbtkaK9bW6FSTY9MQn5PQXJMQGhJPWNIPmBIQl5FQ1hAQk87QEZCR0pETUpKUUpKUUlJUUZLUUVPVUlWV09eWVNgWVNgWFUrKysrKyssLCwtLS0vLiwvLiwwLy0wLy0xLSoxLSoxLSoxLSoyLSkyLSkyLSkyLSkyLSoyLCwxKysxKysxKysxKysyLCwyLCwxKysxKysxKysxKysxKysxKysxKysxKysyLCwyLCwyLCwxKysxKysxKyswKiowKiozLS0zLS0zLS0zLS0zLS0zLS0zLS0zLis0MSw0MSw0MSwzMCszMCszMCszMCszMCs0MSw0MSw1Mi02My43NC83NC84NTA4NS46Mys7NCw8NS09Ni4/Ni8/Ni0/Ni0/NyxCOC5COC5FOC9FOS1HOy9IPDBKPjJIQDNIRTZHRjRLRTVRRDRYQzJfQjJmPy5uPSx2PSx8OiqFOSmMOyqTPS6bQjKiRjesRji7RjzCRj7JRj7QRT7ZREDiQz/qQEDwPj7yOjrxOzrsPDzkQTzWQzvGRDa1QC+qPSmqPy2pQC2pQC2oPyyoPi6oPi6nPS2lPi2jPS6gPy6ePy2aPy2WPyyTPiqRPyqPPimPPiuNPi2NPi2MPSyMPS6MPS6LPC2LPC2LPC2KPS2KOyyJPCyKPC+LPi6LPTCMPy+SQzKYQjGhQTGuQja8QzrCQzzEQz3AQz25RkGyUUqlWFKPWFFzUklXST5DQzc8PzY+OTNANzI+NzE9NjA6NS85NC44My82My40My40My4zNC8xMy4xMy4uMy0uMy0uMy0tMy8tMy8tMy8tMy8uMy8uMy8wMi8wMi8wMC4xMS8yMjAyMS8wLy0vLiwyLi00Lyw/MCtEMClLMylUOC1aPDRkRkZ1XWqDc42JgKuFhL5+g8d0esZtcL1jZa9WU5pMQ4JLP3FJPGdHO2NFPl9GQl1EQlc/QU47P0g6QkU+SEdETUhHUUlHUUhKUkdOVktVWE1eWk9hWU5hWE8rKysrKyssLCwsLCwuLC0vLiwwLy0wLy0xLSoxLSoxLSoxLSoyLSkyLSkyLSkyLSoyLCwxKysxKyswKiowKioxKysxKysyLCwwKiowKiowKiowKiowKiowKiowKiowKioyLCwyLCwyLCwxKysxKyswKiowKiowKioyLCwyLCwyLCwyLCwyLCwyLCwyLCwyLCwzLywzMCszMCszMCszMCszMCszMCszMCs0MSw0MSw1Mi02My42My43NC84NTA4NTA5Miw6Mys7NCw8NS0+NS4+NS4+NS4+NSxCOC9COC5FOC9FOC9HOjFJPTFKPjJJPzNGQzRGQzRKQjVPQTRUQTJcQDJiPjBqPC1xPC53OSp9OCmFOCiMOiyVPS+bQjSkQjWyRjq6RTvBRj7KRz/UR0DeRkHnQ0HuQkDtOzvrOzvnPjvfQjvRRDq/RDSvQC2kPiimQS2mQS2lQCylQC6lQC6kPy2kPy2kPi+iPi6fQC6cPy6YPy2VPiuRPyqPPimPPiuNPi2NPi2NPi2MPSyMPS6LPC2LPC2KPS2KPS2IPC6IPC6IPC6IPC+HPi+IPjGLPzGRRDKWQzGiQjStQza6QzvBRD7BRD67RUG5UEyyW1SlZVyRZl11X1RbVUlHTUFDST88OTI/ODI+NzE7NjA5NC43NC02My40My40My4zNC4yNC8xMy4vNC4uMy0uMy0uMy0tMy8tMy8tMy8tMy8uMy8uMy8wMi8wMi8vLy0wMC4yMjAyMjAxMC4wLy0wLy0zLyw4LCw7LClDMCpLNzBTPDZeSUh0Ym6HepSQiraMjcaEiM96gMxyeMZpa7ZXV59JRIRFPW5HPGREPGFDPl5DQVlAQ1ZARFA+RUtHUVJLV1VRXldVYFhTX1VSXlRUXlNZX1NeW0xhWkphWkosLS8sLS8sLS8sLi0tLS0tLS0uLSsuLSsvLiwvLiwxLSowLCkwLCkwLCkvKygvKygvKyovKyovKyovKyovKyovKyovKyowLCsvKyovKyovKyovKyovKyovKyovKyovKyovKyovKyovKyowLCswLCsxLSwxLSwyLi0xLSwxLSwxLSwxLSwxLSwxLSwxLSwxLSwwLCkxLSoyLiszLywzLywzLywzLywzLywzLywzLywzLywzLyw0MC01MS42Mi83NC84MC05Miw6My07NC49NC8+NS4+NS4+NS4/NC4/NSxCNS1DNi5ENy9GOTBHOjFGPDJHPzRIQDVKQDZQPzVUPjNYPDFeOTBiNittOS50OC18OCuDOSyNOy+TPTCYPzGePjCnQTOtQTS1Qzi+RTrKRz3URz7eRT/lQ0DoQD/qQkHmREHaRT7IRDi3QjGqQS6iQiyiQS6hQC2iPyyiPi6hPS2hPS2iPi6gPy+cPCyaPSyYPC2VPi2TPSyQPSuOPSqMPiqLPCuLPCuKPS2JPCyJPCyJPCyIOi2HOy2JPS+GPC+GPC+HPTCIPjOIQDKJQTWLQTSRRTWXRDSjRTmxST66R0C7RD67RUG4TUe0WlKvZl+jcWaRc2h+cmRqal5WXlNJUUZMTEJKRj1CPjU8OC85NSw3NCs2MywzMys0My4zNC4xNC0xNC0wMi0vMSwsMSssMSstMi4tMi4tMi4tMi4vMS4vMS4vMS4vMS4wMi8wMi8xMS8xMS8xMS8xMS8xMS80MC80KzA7LzNBMzJDNC9KOzZdT095bXmLhZ+TkLuUls+QldmDidN0esZqbrdfYqdaW5RMSXRIQmRBPl0+Plg/QlVBSVZMVVxVYGJicW5ufXh2hnxyf3VseW9ndWhfa19XX1BdXEhiXEZjXUcsLS8sLS8sLS8sLS8tLS0tLS0uLC0uLSsvLiwuLSswLCkwLCkvKygvKygvKygvKyguKikuKikuKikuKikvKyovKyovKyovKyovKyovKyovKyovKyovKyovKyovKyovKyovKyovKyovKyowLCswLCswLCsxLSwxLSwxLSwxLSwxLSwxLSwxLSwxLSwxLSwxLSwwLCswLCkxLSoyLiszLywzLywyLisyLisyLisyLisyLisyLiszLyw0MC01MS42Mi84MC45MS46Mi87NC49NC8+NTA+NTA9NC0/NC4/NC5BNC5CNS1DNi5FODBHOjJIOzNIPjVIPjVMPTZPPjZRPTRWOzJaOTBfNy9oNzBwNy53Ny2BOS2JOS6QPDGWPDGbPTGiQDOnQTOsQjW0RDi+RTrJRjzURT3bRD3fREDgRUDeRkHURz7ERjiyQzKlQi2eQi2fQy6eQi2fQC6ePy2ePy2ePy2ePi6ePi6aPSyZPiyWPS2UPSyQPSuPPiuMPiqMPSyLPCuKPSuJPCyJPCyJPCyHOyuHOy2FPC2GPC+FPS+FPTGDPTGEPjKGQDaHQTeIQjaTRzmXRTejRzyvSkC4SUK4R0G3TEazVE6xZFyqcWaffm+Qf29/fG1tc2VaZlpOWE1MTkFLST1FQzdAPTQ9OjE4OC40NCwxMSkyMy0yMy0wMywvMisvMSwuMCsuMCsuMCsvMS4tMi4vMS4vMS4vMS4vMS4vMS4vMS4wMi8wMi8xMS8xMS8xMS8xMS8xMS8yMDE1KzQ5LTc8MjM/NTNIPzpeVlR4cnyKiJ6Tk7mUl8qQltSEi895gcJxebhrdK1obp5cX4BYWnFTVWpSV2pUXmhaZ21mdnZygn90iH9+koeDlYl+joF2hnlygHFmdGVaZVRbWkVgWkBiXEQsLS8sLS8sLS8sLS8sLS8sLi0tLS0tLS0uLSsuLSsuLSstLCovKyguKicuKicuKicsKyksKissKissKisrKSorKSorKSorKSotKywtKywtKywtKywtKywtKywtKywtKywsKissKistKywtKywtKywuLC0uLC0uLC0uLC0uLC0uLC0vLS4vLS4vLS4vLS4vLiwwLCswLCsxLSwyLi0yLi0yLi0yLi0xLSwxLSwxLSwxLSwxLSwyLi0zLy40MC81MS44MC45MS46Mi87MzA9MzE9NC89NC89NC8/NDA/NC5BNC5BNC5DNjBENzFGOTNHOjRIOzVKOzZLPDdOPTZQOzZTOjVWNzJbNi5jNjBrNi50NSx9Ny+HOS+NOzCUPDCWPDGdPzOgQDSiQDOoQDOxQza6RDjFRTrNRDrVRkDXSEDUSULMST++RTquQzOhQi6cQS6dQi+cQS6cPy6bPi2bPi2bPi2bPi+bPzCYPC2WPS2UPC6TPS6PPi2MPSyLPCuKPSuJPCqJPCqJPCyHOyuHOy2FPC2EOi2DOy2EPDCCPDCCPDKCPjODPzSFQTiHQzqIRDmUSj2XSDugSD6sS0SyS0azTEeyU02uYFatc2emgXGdjHqRjnuCiXdzgG9jcWJYY1VOUkRNTkBISTtERDhAQDQ5Oy40NisvMSYwMSkwMSkvMCovMCouLyouLyovLy0vLy0vLy0uMC0vLy0vLy0vLy0vLy0vLy0vLy0wMC4wMC4wMC4wMC4wMC4wMC4wMC4xLzI2Kzk3Kzk4LzQ7NjNIRT5fXll6enyLjZqQlLGSl7+PlceEjsN9ibt7ibZ8i7J9jKt9iJp3g49xfodufYJufn5vgn55joWDmY2LoZSRqJiQpZSInYqDloN8jXtqe2lcaFRYWEBdWTxfW0AtLjAtLjAtLjAtLjAtLjAtLjAuLi4uLi4uLSsuLSstLCotLCouKicuKicuKicuKiksKisrKSorKSorKSorKSoqKCkqKCkqKCksKissKissKissKissKissKissKissKissKissKissKissKissKistKywtKywtKywtKywuLC0uLC0uLC0uLC0vLS4vLS4vLS4vKyowLCsxLSwxLSwxLSwxLSwwLCswLCswLCswLCswLCswLCsxLSwyLi0zLy40MC85MS86MjA7MzE8NDE9MzE9MzE9MzE9NC8+My8+My9AMi9AMy1BNC5DNjBENzFFODJGOTNIOTRJOjVKOzZMOjZOOTRRODNUNTBeNzJlNjBvNi94OC+COTCKOi+QPDGUPjGZPzSbPzSbPzKfPzGlQTKuQjW4RDe/RTrHRz7LSEDKSkHDST62RjqqQjWeQTCZQC6ZQS2ZQS2YPy2XPiyXPiyZPiyZPS6XPi6VPCyUPSyTPS6QPS2OPSyKPSuKPS2JPCyIOymIOymHOyuHOyuEOyyEOyyDOy2AOyyBOy+APDGAPDGBPjWDQDeDQzqHRDyIRTyUTECWSDyeRz6nSkOuTEmuUUytXVaqal6ngG+hj3mamoKPm4OGlYB6i3hte2pibV1TWkpRVUZLT0BFSTpARDY7PTA1NywxMygwMSkvMCguLykuLSguLSkuLSkvLiwwLy0vLiwvLiwvLiwvLiwvLiwuLiwvLiwuLiwwLy0vLy0wLy0vLy0vLy0vLy0vLy0yLTE3LDo2KjgzLTE5NjFISj9iZlh7gHqLkJONk6OPlrCMlbaDkLKBkK+FmbKNpLaSqLOTqKuQpKOMoJ6HnpiCmY99mImBnIuIo5CUsJqYsZuUrZeLo42Fm4R/knxrfGlYZk9TVjtaVjleWj0rLzIrLzIrLzIrLzItLjAtLjAuLi4uLi4tLS0tLS0uLSstLCotLCosKyksKyksKyksKissKissKisrKSorKSoqKCkqKCkqKCksKissKissKissKissKissKissKissKissKissKissKissKissKisrKSorKSorKSosKistKywtKywuLC0uLC0vLS4vLS4vLS4vKyowLCswLCswLCswLCswLCsvKyouKikvKyovKyovKyovKyowLCsxLSwzLy40MC85MDE6MjA7MzE8NDI9MzI9MzE8MjA8MjA9MjA9Mi4/MS4/MS5AMi9BMzBCNS9DNjBENjNDODREOTVFOjZHOTZIOTRLODRONTBYNzJfNjBpNzByNy99OjGGPDGMPjKQPjKXQDaXPzWXPzWXPzOcQDOjQzWrQzazRTi6RTu9Rz2+SD65Rz2wRDimQTWbPzCXQC+XQC2XQC2WPy6VPi2UPSyVPCyWPS+WPS+VPC6TOy2SPC+OPC6LPC2JPCyJPCyIPCyHOyuGOiqGOiqGOiqDOiuDOiuCOiyAOi6AOjCAPDGAPTR/PzaCQjmDRD2HRkCISD+RS0GSSD2aRz+jTEWoUEyoWFGpZl2mdmiijHebmYCVpIeMo4eGnYN+kX10gnFqdWVcZVJWX0xOVUNFTDo/RjY8QDI3Oi82OC0wMSkwMCguLSgvLCcvKygvKyoxLSwyLi0xLSwxLSwxLSwxLSwxLSwvLiwxLSwvLiwyLi0wLy0yLi0wLy0wLy0wLy0wLy0yLTE4LDo1KTUxKys2NixHTDhgaFF6g3CIkoeNl5aPmqCNmaWGlqOHm6KQqqmbubGgwLOYt6iatqebt6iYt6WRsZyJq5KJq5CQsZSSs5aVtJWQrY+IooWEm4F7knhnemRUYklRVDlWVTlYVzssMDMsMDMsMDMsMDMuLzEuLzEvLy8vLy8uLi4uLi4vLiwuLSsuLSsuLSstLCotLCotKywtKywtKywsKisrKSoqKCkqKCkqKCkrKSorKSorKSorKSorKSorKSorKSorKSosKissKisrKSorKSorKSoqKCkqKCkqKCksKissKissKistKywuLC0uLC0vLS4vLS4vKyovKyowLCswLCsvKyovKyouKiktKSgwLCswLCsvKyowLCsxLSwyLi0zLy40MC86MTI6MTI7MzE8NDI9MzI8MjE8MjA7MS89MjA8MS8+MC0+MC0/MS5AMi9BNC4/NC5ANTFANzJAOTNBOjRCOTRDODRGNzRINS9RNTFYNS9hNi9sOC11OS6APC+GPjCLPTGTPzWVPjWTPzWTPzSVQjSaQjSgQzSlRDSsQjWwRDi0RTqxRTuqQjehPzSaPjGWPjCVPy6UPyuTPSyTPSyTPCuTPCuUPC6UPC6TOy2SPC2PPC6NOy2KOyyJPCyHOyuHOyuGOiqGOiqFOSmDOimDOiuBOSp/OS1/OS2APDF/PDN/PzaAQTiCQzyFRj+ISUKKSUOOSkGQRz6XSEOfTkqnVlKnYFqpcGWkg3KclH2WoYOPqIqIp4iDoIR+ln55iHVwe2pkcFxdaVNSXkpKU0BCSzo+RTU6QDI5PDEzNCwyMioxLikvLCcvKSkwKioxKysyLCwxKysxKysxKysxKysxKyswLCswLCswLCsxLSwxLSwxLSwxLSwvLiwvLiwvLiwyLC44Kjc1KDEzKyg1NiZFSzFcZ0d1gmSGk3mOm4qRnpSQn5qLnpiNpZeXtJ6ixaWpzq2lya2myrCny7GkyKyXvp+Ls5GIsI2NspCOso6Qso+NrIqEoYKAmXt3jnJkeF1RX0VOUjdRUTVTUjYsMDMsMDMsMDMsMDMuLzEuLzEuLzEuLzEvLy8vLy8vLy8vLy8vLiwvLiwuLSsuLSsvLS4uLC0uLC0tKywsKisrKSorKSoqKCkrKSorKSorKSorKSorKSorKSorKSorKSorKSorKSorKSoqKCkqKCkqKCkpJygpJygrKSorKSosKistKywuLC0uLC0vLS4vLS4vKyovKyovKyovKyovKyouKiktKSgsKCcwLCswLCswLCswLCsxLSwyLi00MC80MC86MTI7MjM7MjM8MzQ9MzI8MjE8MjE7MTA8MS88MS8+MC89Ly4+MC0+MC0/MS4+My89NjA7NjA7ODM8OTQ9OjU+OTNANzJDNjBHNC5PNCtZNCtkNStuOCx4Oi1/Oy6FOy6PPDSRPDWQPjOPQDOQQTKTQjGXQTKZQDCgPjGmQDSqQjeqQjmlQDafPjWXPTKVPzKSPy2SPy2RPiyQPSuROyqROyqSPC2SPC2ROy6ROy6OOy2NOy2KOy6IOi2GOiyEOyyFOSmFOSmDOimCOSiCOSqBOSp+OCx+OCyAPDGAPTSAQDeBQjmERT6FSUGIS0aMTUaMSUGOSECYSkahU0+oXVipaGKpe26kjnmZnIGSp4aJrIuCqoiAoYR/mYB+i3d4gW5qeGFkcltaaFFRXUlJVENDTDs+RDY8PzQ2Ny80NCwzMCswKycxKCkxKCkyKSo0KywyKSoyKSoyKSoyKSoyKSowKiowKiowKioxKysxKyswLCswLCswLCswLCswLCsxKy02KTI1KS00LSU0NiFBSCZXYztxgFeCkm2NnH2QoIaQooyLoYqNqImVuI6gyJSk0J2p06uo0q6n0a2hy6WTvZeFr4eCrISHsIaIroWMsYiLq4aBn3t7lHRxiGtfc1dNXUJJTzNKTTBLSy8uLzEsMDEuLzEuLzEuMC8uMC8uMC8vLy8wMC4wMC4wMC4wLy0wLy0wLysvLiwxLSwyLi0xLSwxLSwwLCsvKywsKisrKSorKSorKSorKSorKSorKSorKSorKSorKSwrKSorKSwrKSotKCwqKCksKCkpJygpJygoJicqKCkrKSosKissKyktKywuLSsvLiwvLiwtLCotLCovKyovKyouKiktKSgsKCcsKCcxLSwyLSoyLSoyLSozLis0Lyw1MC02MS47MzE7MzE8NDI8NDI9MzE8MjA7MS87MS88MS88MS89Ly49Ly49Lyw+MC0/MS49Mi49NC09Ni47ODE5OTE5OjI5OjI7ODE/Ni9DMitKMSxUMileMypnNytvOS11PS56PC+HPTKLPTOLPzKMQDKOQDOPQDGSPzGVPS+YPC+cPjKiQjahQzeeQjeZPzSWPjKUPjGUPi+TPS6QPS2PPCyOPSyMPSyMPS6NPi+OPC6OPC6LPC+KOy6IOi2IOi2GOiyEOyyCOiuCOit/Oip+Oyp+Oyt8Oip9OSx8Oi6APjKBPjWAQDaCQzqDRz2FSkKHTkWLT0eMSUOOSUSTUEqYXFSeZ2CddWmeh3WemICUoYWPqomJrIuDqIeAoYR+m396kHl0iG9pfWJieV1ccFVVZ09PXEhHUkFBSDg9QTM4OC44NS43LywzKykyKCkyKCkzKSo0KiswKiwvKyowKiwwKiowKiwwKiwyKSwyKSwzKi0xKy0xKy0xKy0wLC0wLC0wLC0xKy80KS80Kis0LSU0NiE/RiVUYDhtfFGBkGeJmXSNnnqNoX6IoXqKp3uRtoKbxIify5CfyZmex52dxpqYwZWMt4qCrYCFroKMtYmEq3+JroWJqYJ+nHh2j29sg2ZablNKWj9HTTNGSjFERi4vMCsuMCsvMCswMSwwMSwwMSwxMi0yMS0zMi40My80My82Mi81MS40MSwzLyw0Lyw1MC01MC00LywzLisyLCwxLSwwLCswLCsuLC0uLC0tLS8tLS8sLC4rKy0qKS4pKSsuKS8uKS0vKC8uKS0vKS0uKS0uKisuKisvKyovKyotLCouLSktLSstLikuLyouLyotLS0tLS0uLC0vLS4vLiwwLy0yLisyLisyLSo0LCk1LSo2Lis4Lyo6MSw6MSo7Mis9NC09NC0+NTA+NTA+NTA9NC88My47Mi09Mi48MS08MS87MC49Ly4+MC8+MC9AMS5BMClAMik7NCo3Ny0zOS0yOC41Ni46My0/LSlGKidMKSdTKiZaLyhgNSxkPDBrQDB5QTB/QC+GQTGLQjOPQDOTPTCTOy+SOC2TOy+TPS6UQTGVQjKUQzKSQTCRPi6ROyyXOzCXOjKSOzGMPTCIPzCEPy+CPy6DPi6IQDGIPzCKPjGKPDCJOy+IOi6GOi2DOy17OSt+QDN3PC5xNyl3Pi13Pi12Oy19PzJ7Oy+CQDSHRTmJST+ITEGGTUKEUEOHTkWRS0mXU1CUYlmRcGGMfWqJiXGJlnyKnoKNpIeNpomOp4qNp4yHpIh+n4J1mntvl3VpjWlihF9belhac1VablNXZU5QV0VKSz1DPzZAOTM7MC42KiozJykzJyszJysxJiosKi0pKyoqKiwqKCksJysuKCwxKC0yJy0zKC4zKC4zKDAyKDAwKTEwKTEvKjEvKjAvKS0xKyswLSgvLyM8PypWXEBwelh/i2eNnHWLnXOMoXaMpneKqHaJqnWOtHuZv4afwY+dvo+WuoqPs4OIrn2Fq3yDqnuFqn6DqH2Dpn6Annx5lHVyiW1ofGNZa1VNWkZJUTxDSDQ/Qi8vMCowMSswMSswMSsxMiwxMiwyMSwzMi00My40My43NC83NC82My41Mi01MCw1MCw3Lyw3Lyw2Liw2LiwzLisyLSowLCswLCswLC0vLS4vLTAtLS8tLDErKi8pKi4pKC0uKS8vKC8vKC8vKC8vKS0vKS0uKisuKisvKyovKyouLSkuLSkuLyouLyouLykuLyouLi4uLjAuLi4uLi4vLiwvLiwxLSozLis1LSo1Lig3Lik4Lyg6Lyk7MCo8Mik9Myo+NSw+NSw+NS4+NS4+NS49NC08My48My49Mi48MS07MC47MC49Ly49Ly4+MC9AMS5DMCpDMClBMis+NCs6Ni05NSw6My08MS0/LStEKilJKihOKydULylaNS1fOjFlPi9wQS94QS2AQTCIQDKPPzSRPTOTOjKTOzGNOS6LPC+LPi6MQDCNQTGNQTGOQS+RPzGVOzKVOzKQPDKLPTCGPjCDQC+BPy+CPy6FQDGGPi+JPTCIPC6HOy6EOyyCOiyAOyx4OCx4PDFzOS1uOStzPi5zPi5yOCp1Oix9PTGDQTWJRTqLST2JS0CGTkGEUEOHTkWRSkiXU1KSZl2Md2aEhnCAk3eBnn+EpYaIp4iNp4qQp42Qp42KpImBn4N3nH1vmHZlkmlgi2BZglpZe1hcd1hablNTYUpOVUNGSDtDQDc8NzM3Ly0zKisyKSoxKCsuKCosKisqKiwrKSwrKSwtKCwvKS0yKDAyKDAyKDAyKDAyKDEwKTEvKjEtKjMtKjMtKjEyLTEyLi0wLCktLSU4OixTWEJveF2Ai2mHlm+GmWyGnm6Io3CGpHCEpXCKrXeTtoCZuYeWtoSTs4GMrnuGq3iCqHeCqHmDqHyDpnyCpH9/nXt4knVxiG5oe2VZaldNWkhFTDxARDU7PS8xMiwxMiwxMiwxMiwyMy0yMy00My40My41NC81NC84NTA4NTA4NTA3NC83Mi42MS04MC04MC03Lyw2Lis0LywzLisyLCwxLSwxLS4vLS4wLjEvLTAtLS8sLC4rKi8rKS4vKC8xJy8vKS0vKS0vKS0vKS0uKisuKiswLCswLCsvLiovLiovLikwLyowLyowLysvLy0vLy8wLi8wLi8wLy0vLiwxLSoyLSo2Lis3MCo5MCs6MSo8MSs9Myo+NCs/NSw/Ni0/Ni1ANy5ANy4/Ni8+NS49NC09NC09Mi48MS07MC47MC47MC47MC48MS8/MS5DMitFMCtILytLLS1MLC9LKy5JKi9FKy5BLSxALipBLihFLihNLilYMSpiMy1nNSxqOixvOy13OzCBPTSHPDaMPDWNOjSNOjSKPDKHPTKGPjKFPzOGQTKJQTOMQjWPQzWOPzKPPS+MPjGKPi6HPi+FPiyGPS6IPCyJOy6JPCyIOi2GOiqDOyx/PCl+PSt7PCt9PTF6PDF2Oi91Oy94QDF4QDF2PC52Oy1/PzWCQjiJRj2LSD+JSkGHS0GHTkOKTkaRSkiYVFGWZlyQdmWHhW6CkXR/nXuBpIOFqIeIqomNqoyQqYyOpYmIn4OBmn15mHhplm1hkmVci2FchmBdgmBbfF1VclZQaFBGWUVCUD86RDkzOjIuMywqLykqLCkqKigwJygxJioxJioxJiowJyoxKCswKi4wKy8vKi4tKy4sKzArLDApLTAoLTEoLTEpLTAxLzIzLy4uKicqKiI1NypQVUFtdlt8immAkGt+k2p/mWqDn26AoG5+oG2ApXGHrHiNr3yLrXqIqniEqXaBp3Z/p3V/pnd/pnl/pHmAon19m3l3kXRwh21ofGNZa1VNWkhESDk9PzI5OS0yMy0yMy0zNC4zNC4zNC40NS81NC81NC82NTA3NjE5NjE6NzI6NzI5NjE5NDA5NDA6Mi85MS45MS44MC01MC00Lyw0Li40Li4zLzAzLzAxLzAxLzIwLjEuLjAtLS8tKy4wKTAyKS4wKi4wKi4wKi4wKiwvKywvKyoxLSwxLSwwLyswLysxMCsxMCsxMCsxMCwxMS8xMTExLzAxMC4xMC4yLiszLiszLio5Miw5Miw7Mis8Myw+NCtANi1ANi1BNy5COC9BOC9COTBBOC9BODFANzA+NS4+NS49Mi49Mi48MS87MC47MC48MS89MjA9Mi5CMy5FMi5MLi5SKzBWJy9VJi5QJy9JKS5DLy48MSs7Mik/MilHMChSLylfLipkLylpOS9rOy91PDN9PDaFOziJOzmKOzeIOjaJPjiGQDiGQjmFQjmFQzeGQjeHQTeJQTWIQDGIQS+HQC6HQC6HPi2IPCyIOyuJOiuKOCqIOSqHOiqDOil/PCl7PSh4Pih4PiqCPjF7Ny56Ny56PDF2Oy13PS98QTN7QDKAQjeDRTqGSD2ISj+GSkCHTUKIT0SKUUiMU0qOXFGOaFuLdGKFf2eAi21+lnZ/nnyDp4OEqYeHqomLqoqLpoeHoIKDmn59mHlxlW9plGlmj2dmjGVni2dkhmVffl9ad1tQaFBLXkpCUD84RDYyOi8uNCosLygrKiUyJiY1JSg0JSgyJigxJygvKSsvKywuLC0rKysqKy0qKy0oLC0oLC8nLC8nLC8qKy0uKisxKyswKycuKyI4OCxQVUFpcVl2hGN7jGh5j2h8lml/nGx9n215nmt6oG1/pXKCp3SApXF9o3B9o3B9pXN+pXZ+pXh9pHh8oXh9n3p6mXd1kHFuh2plfGJXa1JOW0dERjk/PTE6OCw0NS80NS80NS81NjA1NjA1NjA3NjE3NjE4NzI4NzI7ODM8OTQ8OTQ8OTQ8NzM8NzM8NDE8NDE7MzA7MzA4MzA3Mi82MS42MS41MTA2MjE2MjEzMTIyMDExLzAwLi8xLS4yLDA0Ky40Ky40Ky4yLC4yLCwyLCwyLCwzLy4zLywzLywzLywyMSwyMSwzMi0zMi4zMjAzMjAzMjAzMjA1MTA1MS42MS42MS07NC48NS89NC0/Ni1BNy5COC9FOC9DOS9EOjFEOjFFOzJEOjFDOTBCOC9ANS9ANS8+My8+My89Mi49Mi49MjA9MjA+MzE+MzFANTFFMzFNMDJULDRYKTNXKDJSKTFLLDFCMzA6Ni03Nys6NipCNClNMilYLyleLylmOjFqOzNzPDd6PTqCPDqGPDuHOzuGOjqCOzeBPjiBQTiBQjmDQzqDQzqFQDmEQDeCQzKCQzGDQjCEPy+GPS6IPC6JOi2LOS2JNyuHOCuFOSuCOit+PSt4Pip2Pyp4PiqBOS18LyeCOC+EPjR3NCtzNSp9QTZ9Qzd/RTqARzyCST6DSj+ES0KGTUSHUUeFV0p8YU56alGAcFmBdV2CfGKDhmmGk3WInXyDo36Bp4KCqoWCrIaBqYR/pYB7nn16mXd6knB6kGx4jWx3jGt1jW1yiWxthGdrf2RgclhbaVJSW0hITD1AQDQ7Nyw3MCY1KiQ2KCc1JyczJycxJyYuKSYrKigrKykrLSonLCgnKyopKyopKyoqKiwrKSwrKSwtKSosIyQyKic1MCo4NipCQzVVWkZmcFdufV50iGVximJ1kGV4mGl3m2tzmWh0mml3n2t6om54oGx3n214oG55o3N7pXV7pXd8o3d5nnV6nHd3lnRzjm9thmhke19Xa1BOW0dDQzc+OjE5NSw1NjA1NjA2NzE2NzE3ODI3ODI4NzI4NzI5ODM6OTQ9OjU+OzY+OzY+OzY+OTU+OTU/NzQ/NzQ+NjM9NTI7NjM6NTI5NDE5NDE4NDE4NDM5NTQ4NDM3MzI0MzE1MTI0MC82LTA2LS42LTA2LS40Li40Li40Li40Lyw0MC00MC00MC01MS4zMi0zMi00My40My40My80MzE1NDI1NDA4NDE4NTA5NDA6NS89NjA+Ny9ANy5BOC9DOTBEOjBHOjFIOzJGPDNGPDNGPDNGPDNFOzJDOTBCNzFBNjBANTFANTE/NDA+My8+MzE/NDJANTM/NTNANzJDNTJJMzVQMTZULzZTLjVQMDVKMjJDNTI9OTA8Oi09OitDNylJNihRMylXMildMitkMyxsNTB2NjR9NzeCODeDNzeCNjZ+NzV9OjR9PDZ9PjWAPzmDQDiGPzmFQTiAQjOAQzGBQjGDQDCFPS+HOy6IOi6HOS2FOSyDOSyCOix/PCx8PSx5Pix4Pyx8PSyHNSqLMiyhTEWnWFGLQTh8OTCCRjuASz15SDp6Sjx7TT58Tj99T0KBUUWHVUqCX0xya09vc1J8dViHd12PeWKYf2mfi3OglHqWlnqPnXyLo3+IqIGFp4KApH57n3l+mXaDkXCFjm+DjnCAj3B/kHB7jnB3jG1zh2tqfmJmdlxfaFNWW0dPTT5HQTNANio9MCc7LCc5Kyg2KyczKygvLCcsLScrLicpLigpLigrLSgtLCovKyozKSo0KCo3Jyo3JygzKCQ8MyxFPjRJRzhRUkBdYktncVZqeVpugl1rhFxsiV1wkWJxlWVvlWRvl2VymmZ1n21ynGpxm2l0nm54onJ6pHZ5onZ5n3Z2mnR3mXZ1lHJvjWtqhWZjfF5VbE9OXEVDQzdAOTE7NCw2NzE3ODI3ODI3ODI4OTM4OTM5ODM6OTQ6OTQ7OjU+OzY/PDc/PDc/PDdAOzdAOzdCOjdCOjdBOTZAODU9ODQ9ODQ8NzM8NzM8NzM8NzQ8NzQ8NzQ7NjM5NTI5MzM4MzA4LzA5Ly44LzA4MC44MC44MC42MS42MS02MS02MS01Mi01Mi02My42My43NC83NC81NDA1NDA4NDE5NTI6NjM8OTQ9ODRAOTNANzBBOC9DOTBEOjBHOjFIPDBJPTFJPTFKPTRKPTRKPTRJPDNGPDNEOjFCOC9BNy5BODFANzBANzI/NjE/NjFANzJANzJBODM/NzRAODVCODZEOTdHOTZIOTZIOTZIOTRFODBFOC9FOS1FOStHOSxJOSpLOStRNypaLyZkLyduMy16NjODOTiJOzmLOzqLPTuLQT6HQDqCPTZ/PDN/OjOCPDSIPTeJQDeDQTWBQjOCQDKDPzKDPTGEPDCBOy+APC9+PC58PS57PS58Pi98Pi99Pi9/PS+GOS+QMSuiPDjNbGbZfnmtWlSMQzyITEF/TkB0SjxxTT1wUT9xUkB0U0B6V0SCW0p+ZU9tc09ve1WEeVuYdV+pb2O2bWa+cWu9d2+7gnexjHqnl36en4CWoYGNoX6FnXmFmXaIkXKLkHKIkXKEk3KAlnJ8lnN4k3B0knBti2lphGVkeFxda1FWXkdNUDtFRDBCOytAMys/Miw7MCo3MCozMCkwMCguLycuLykvMCoyLyo2LCs6Kis+KCtDJitFJCtDJihGNS1MQzRWUT5bWURgYkpnbVFpd1Zqe1dsgltngldmhldsjlxvlGFulGFulmJymmZznWtvm2pvmWlynG53oHR5onh4nnd1m3Zzl3N1l3ZzknJui2xphGNie1tUbU1NXUNHSDpFPDVANzA3ODI3ODI4OTM4OTM4OTM5OjQ6OTQ6OTQ7OjU8OzY/PDdAPThAPThAPThBPDhBPDhDOzhDOzhDOzhCOjc/OjY+OTU+OTU9ODQ+OTU+OTU+OTU+OTU9ODU8NzM6NTE7MzA6MC46MC45MS45MS45MS85MS45MS43Mi42MS02MS02My42My42My43NC83NC83NC81NDA2NTE5NTI7ODM8OTQ/OjRCOzVCOzNBOC9COi9DOS9FOy9IPDBJPTFKPjJKPjJLPjVLPjVKPTRKPTRGPDNFOzJDOTBCOC9COTJCOTJBODNANzJANzJBODNCOTRBOjQ/ODJAOTNCOzVEPTdGPTZHPDZLPDVOOzRNNi5ONixRNitRNitRNypQOStQOSlWNidmNipyNix+OzOJQDmVRECbSESfSkefTEagUUqZTESORDuFOzCENy2FNy2MOTGNPTSIPjWHPjeGPTaFPDWFPDWBPTR9PTN6PjN4QDN2QTN4QDN6PjN/PDODOjOINzORMzGYKCazPTvsfHr9lZLFaGOWR0CJS0B4SDpuTTxqUT1mVD5oVj5sWEB0W0V/YEyAaFB5c1GEd1WedFy0bF7JX1/TVlzZUVvXVFzkb3XZenjMhnzAj361lYCrlX2jknifj3acinKcinSZjXWVj3WRkXWLknOGkXOCkXJ8i255hmp1e2Ftb1dnYk5fVEJVRTVSPC9PNC1NMS1JMCxELyo+Lyg5LyY3Lic2Lyc4MSk6Lyk9LitBLCtGKStIKCtLJytIKSdUQjRZUTxkXkZnZUxpbE9udVZte1hsflhrhFpnhFZnh1Ztj11wlWJxlmJymWR1nWl0m2xvmWtvlmpymW13nXZ5n3h3mnl0lnVzlHV1lHVzkHFvimtphGVhfFtUbU1NXUJNTkBLQjlGPTY5OjQ5OjQ5OjQ5OjQ5OjQ6OzU9PDc9PDc9PDc9PDdAPThAPThBPjlCPzpEPztEPztFQDxFQDxFQDpEPzlEPzlDPjhFPjhEPTdCOzVCOzVCOzVCOzVCOjdCOzVBOjRBOjRBODNBODNBODNANzJANjQ+NzE+NzE+NzE8NzE8NzE7NjA6NS84NS44NS43NC83NC85NjE5NjE5NjE6NzA8NzE9ODJBOjJCOzFDOjFEPDFGPDJKPjJLPzNMQDJOQDNOQDVOQDdOQDdMPzZLPjVJPDNIOzJFOzJFOzJCOTBBOC9AOTE/ODA/ODA/ODBAOTNAOTM8NS9NRD1NQDpLOjNUQDlSNjJPMCthPDZcMy1gNS5gNCteLydeLyVmNixtPTFxPTCJST2PRzuXST+fS0GfRj6bPjeaPTaeRDumTkSkUEWoVkqrWUulT0KZQTWXOzCbPjaTOTiROTiMNjWGNTKGODSEPzh8QDZyPjFyQjRvQTJxPTB2OjCCNzKMNDOSLTGaJyzISEnoYmHFRUTNV1XheXarVk+GRjyEVkZtUj1pW0FpYkZqZUhqYEVuXkR8ZEyNalSSYkyybV3RbmjbWF3gO0znLUXyK0j1MEz2QFnsSVzkW2XlbnLie3zbgH3bg3/YiYLDf3a9gXe6hHi2hniyiHitineoi3mljHiagG+Zfm2YeGmTb2GNYlmEVU17SUJ4QT51OjxpLjJkMDJhMTFQJidHJSNMMC1NNTFHNC5FMixEMS1GMS5GLixHKypLLS1RNi9ZSDRgVzpmX0JnZEVrb051fFp1hF1vgVlsg1dsh1pwjV1ykmFzlWJ1l2R3mWZ2m2hylmpzmG9zl3FxlW9zlXR3mXh6mHx5lnp4lXlzjXJth2prhGZpgmRhelpUbU1PX0ROTz9TS0BQRz45OjQ5OjQ5OjQ5OjQ6OzU7PDY+PTg/Pjk+PTg+PThBPjlBPjlCPzpDQDtEPztEPztGQT1FQDxFQDpFQDpEPzlEPzlFPjhFPjhFPjhFPjhFPjhEPTVDPDZDPDREOzRDOjFCOTJCOTJCOTJCOTJBODNBODNAOTNAOTM+NzE8NzE7NjA7NjA5Ni84NS43NC83NC85NjE5Ni85Ni86NzA8NzE+OjFBOjBCPDBDOzBFOy9JPTFKPjBMQDJMQDJOQDNOQDNOQDVOQDdNPzZKPTRJPDNIOzJFOzJFOzJDOjFCOTBAOTFAOTFAOTFAOTFBOjRCOTJEOTNJODFMLytWLixqNzZ1OTl7OzuFRUODRD+ESECFSUGGRz6OSUKZTkihUEyiT0eTRDeUQjSaQjafQzigPjOcNy2cNy2fPTCjQzWbPzCZQDCgRTOkRzanRjauSDq2TkW0TE2vSEylQESZOTuROTiNPjqDQDh4PjNvPjB6STuFTEGEPziELCuSKS6zOUTSTFfcS07fTU3KPj3AQD/QYFyzWVGEQDWCVER5YUllW0BeXT9paElzbE92Z0p+ZEuWY068ZFjWX1vmVVrrQU7yLEX+JUT/Jkj/J0n/Lk75M07yPFLwSVrrUF7lUV3jU13gWGLbYmnVZmzUam7SbXHPcXLNdXTJeHfHeXfKfHzJeXrIdnjHcXTGa3LFZm7FYWvDX2vFYG6zU1+lS1WaR1GNREuGRUltNjlIHBtUMS1NMCpIMStKNi9LODFLOjJPPjZVRThbTzVjWjlnYUFpZkVuck96gl16iWJ0hl5yiV9wiV9wi2BxjmB1kmR3lGR3lGR3lGZzkml4lnJ6l3h5lnh+mH2DnYSFnYeDm4WBmYN6knpyiW9thGhogWRgeVtUbU1OYUVSU0FWUEJVT0M4OTM4OTM4OTM5OjQ7PDY8PTc/PjlAPzpAPzpAPzpDQDtDQDtDQDtDQDtEPztEPztGQTtGQTtGQTtFQDpFQDpFQDpHQDhGPzdKQTpJQDlIPzhHPjVGPTZFPDNGPDNFOzFEOjFEOjFEOjFEOjFEOzREOzREOzRDPDQ/ODA/ODA8NzE7NjA6NS86NS85NC45NC45Ni85Ni86NS87Ny4+Ny9AOS9COTBDOzBFOzFGPDBJPTFLPzFNPzJNQDBOQTFNQDBQPzVNPzRMPjNLPTJJPDNIOzJFOzFEOjBDOjFDOjFBOjBBOjA/OzJAPDNAPDNEOzRVRDxSMy5qMjOOQUetTFfDVWDLXWbGX2KbQj6XST+WTEGcTkKsUkq+VVLMT1PETEulQDSdQjCgQDClPzGlOy6jNyukOCunPS+rRTahPiuYNySdOielPi2sQS+yQzK2RDqnMDKvOkK5REy9TFK6TVKtS0yWQT6CNzF7OC92Nix4MiqEMS2cMze5PUfVR1foTVviRknPNTPQOjm9MzHITkvGY12USj+MW0p9Y0xqX0NnZEV0b09/cFGBaEqNaE6waFnkYmL1UVr0RFH2N0n9MUr/Mk7/L03/Kkj/Mk/8MEv3MUr1NUzyNE3wMkvzM0zzN1DyQFjvQ1vuRl3tSWHrTmPqUWXoVWjoVmvlU2rkUmnjT2nkTmnnTmzrUG/yU3PzVnX+aIXxYXzlW3TVVWzNWWzJZHKoUl1yLTJeJidZMCxXOjRRPzVCOi06OCk+QjFMTjlWTzNhVjZlXz9oZURxdVR/hmV+jGl3iGR4jGl1i2Vyi2Ryi2N2jGV5j2h6kGl6kGqAlXaEm36KnoWNoIqSo5CXqJaYqZmWppmRopKHmIZ6jXlwg21nfmJed1lUbU1QY0dTWERYVURZVkc3ODI3ODI4OTM5OjQ7PDY9PjhAPzpBQDtCQTxCQTxEQTxEQTxEQTxEQTxFQDxFQDxHQjxHQjxHQjxGQTtGQTtGQjlIQTlIQTlMQzxLQjlKQThJQDdIPjVHPTNGPDJFOzFEOjBEOjBFOzFFOzJEOzJFPDNFPDVFPDVAOTE/ODA9ODI8NzE7NjA6NS86NS86NS85Ni85Ni07Ny47Nyw/OC5AOi5DOzBEPC9GPDBGPS5KPjBLPy9NQDBNQDBNQC9NQDBPPzJPPjRMPjNLPTJKPDNHOjFFOzFEOjBEOzJEOzJCOzFAPDFAPDNBPTRCPjVGPDNTODFbKiaJOj++VGDZVGXmVWbjVWPLSk+fMzCWOi+RPjCZQTOuRj3FSUfVQkjNPkCxQjenRjWpQjOsQDOvPzOwPjOzQjS0RDayRzWpQi+jPCmkOyipPCirOiiuNiatMyi2OTe6OT29Nz68Nzy/PELGSkzEVFO+WFOZPzeMNCqJLCWdNjHDSEvcT1fiQVHbM0DeOjnNLirTODTINzTGRUDIXVWpV0uQV0Z3V0B2ZUl+cFN/cFGEZkqQZEupb1vVdWnuU1f8RFD3O0r4OUn+PU7/QFH/Okz5NEj/P1P+OU36NEv9M0v9MUr/L0n/ME7/NlP/M1T9NFb9Nlf6N1f4OVr4PVz3Pl71QGH4Q2b2QGb1P2X1P2f4P2j8Q23/RXL/SXP/T3X/UXX+VXbyU3HnVG7lYXjWZna3V2J9MTVqMC9YMSpQOCxHPi8+QS47RC8/Ry9QSy5fVDhnYENva058fGCIjnKHkXZ9i3F6jXF8j3N8j3N6jW96im19jG+DknWIl3qVo4qcqZWjrp2msaGstKexua6wt7Crta2hq6KUoJSDkYJzhHFofGNddFhTbE5QZEhSWkNXWURZWkg2NzE2NzE3ODI4OTM6OzU8PTc/PjlAPzpCQTxCQTxEQTxEQTxEQTxFQj1GQT1GQT1GQzxGQzxHQjxIQz1IRDtIRDtKQztKQzlMQzpLQjlLQThKQDZKPTRJPTFIPDBHOy9FOy9FOy9FOy9FOzFFOzFFOzFEOzJEOzJAOS9AOS9AOTE/ODA8NzE7NjA7NjA6NS87Ny47Ny47Ny48OC0/OC5BOy9DOzBEPC9HPTFHPi9LPzFNQDBNQDBOQTBPPy9PPzBPPzJOPTNOPTNKPDFJOzBHOy9EOjBEOjBEPDFEPDFCOzFAPDFBPTJBPzNCPzZLPTRcNS53MzKtTFPbXWnmTV/lQFHXNkW3JiuoMSmdNyiSOiaXPCmsQDPDRD3UPj/NOzuxPzWoQjSqQDKtPzKyQDW4Qzm8SDu7SjysPi+qPy+oPSumOymqOSmwOiy3Oy+8PDHKRkHOREHQPj/QNznWNzzeQkXiTE7dUk/EQz7GS0PNVEzUU03ZS0rbP0LgNT7hMjfbNC7aNy7QMSvPOjS/ODSzQDm1W1CWVUN7TjmCYkmGa1CEYEaSW0atZlTLcmTnbWjqRUvyOkTqOUPnPETnQkjnRkvoR0zqRk30SlPyQk3yOUn2NUj5Mkf9L0b/Mkz/OFL/OVb/OVj/Olj9Olr+O13/PV//QGL/QWX/Q2n+RGv+RG39Qm38Q2/8Q2/8QnH9Qm//R3D/QGj/R23/TXDySWjpT2vlW3LZY3O9WWOOP0RgJiRRKyJWQDNWTz1JTDdARC1SSjNlWUN1alaAe2eOjXmZnIuVnIyIk4OCjoCJl4iPm42MmYiHkoKKk4KXno6kqJmytqe4vK6/wbbAwbnCw73FxsHDw8O+vr6wtbGiqaKNl4x5h3Zpe2Vcc1lUbU9SZkpRW0JVWkNXXEY1NjA1NjA2NzE3ODI4OTM6OzU9PDc+PThAPzpAPzpDQDtEQTxFQj1FQj1HQj5HQj5HRD1HRD1IQz1JRD5JRTxJRTxLRDpMRTtMQzpLQzhMQjhLQTVMQDRLPzNKPjJJPTFHPTFHPTFGPDBGPDBFOzFFOzFEOzJDOjFBOjBBOjBAOTFAOTE9ODI8NzE7NjA7NjA7Ny47Ny47Nyw8OC0/OS1BOy9EPC9FPTBIPzBKPjBMPy9NQDBOQTBOQTBPPy9PPy9PPzJOPTNNPDJMOzFJOzBHOy9GOTBDOS9DOzBCPDBCOzFAPDFAPjJBPzNCPzZOOzRtODSXRkXEWV/bV2LfQ1HeOEbUMzu9KyutMSehOCWYOiGXOSCkOya2Pi7DOjK+NzGnNyyiOi2lOS2nNyyvOjG4Qji6RTu3RTquPjKtPzCnPCykNieqNim2PjDDRDvKRz2+OC3OQDbhRD/sQkL0PUHzOT7rMjfeLjDbNzXiR0LoU0zlTkfcPTnZMTDjLzLqNjfZMSjePC/NLCLQNzG+MyywNy/JZ1y4bFyOV0OHWkODVj+JUj2pXEzObGHhZ2LkVFTwRUvxPUbkO0DZPT7SQT7SR0LdT03rV1ftTlLvRE3wOkf2NUb3Mkb4LkT7MUf+N07+OFP9OFT9OFb+OVf/O1z/PmH/QWX/Q2v+O2X9PGj9Pmr9P236Pm74Pm/0PW32Omr/SHL/O2H/P2T/S27/S273Tm3vVW/jWm7ocoLCYWqYSUx0OjhcNi1QOStQQzJVTTpeUUFyZVWIfG6VjYKfnZGmp5+hpp+WnJiVnpuep6Smr6ymrKiip6OmqKO1tLDCwbzMycDRzsXV0MzV0M3Uzs7Vz9HRy8/Lxsq/vcCwsq+Yn5iAjH5tfmtgdFtXblJWak5TYEZWYEVYYEg1NjA1NjA1NjA1NjA2NzE4OTM6OTQ7OjU9PDc+PThBPjlDQDtEQTxGQz5IQz9IQz9HRD1IRT5JRD5JRD5KRj1KRj1NRjxNRjxNRTpMRDlNQzlNQzdOQjZNQTNOQDNNQTNKQTJKQTJJQDFIPzBHPTFGPDBEPDFEPDFDOjFDOjFBOjJAOTE/ODI/ODI8NzE8NzE8OC88OC08OC08OC1AOi5BOy9EPC9FPTBIPzBLPzFNQDBOQTBQQDBQQDBPQC1PPy9PPTFPPTFNPTBMPC9JOzBGOi5FOC9DOS9COi9BOy9BOjA/OzA/PTFAPjJAQDRQOTFyMS+oSkvBU1a7PkS9MDbCMDPBLy+6MSmpMSGjOSOcPSGZOx+bPCChPSOlOyWkNiWeNimgOC2iNiylNCytODG3QDq4QzyyQDaxQjetQTSoPC+mOCuvOjC8QzjDRD3FQDfDPi3PPi3ZNSvhKibtIiX6JSv/KjH/LjTtKSrnLivhMyzfNCzgMyzjMizpMC3nMivaMiXWNibQMibPNyzFNi69PjfIYFXSf3GmZVOPVkKKTTqjV0nIZlvfZF/nUlToQ0n1Rk3tQETfPz/UQDzJQDjGQDfRRkHjTUzvSk70QEv5OUj9N0j8NUj4M0X3Nkf6O036OFD8N1L7NlL9NlX/Nlj/OV3/O2H/PGf/Pmv/P23/QHH/QnT/QnX+QnX8QnT5QnD/Rm36QWH+RWX/S2r+S2v/VnT/X3r1XXTyan7mcH7Tb3euXmGDQ0FnNi9oQjdzVUp5ZVyMfXajlpCto6Gyrqu2traytrmqr7Owt722vcW9wcrAw8rDwsrJxs3Vztbd19vi2tjn3dvp3d3m2tzl2N/k1+Dg1N7Zz9jKxcu6urqip6OIkod0gnFleGJcc1dbb1Nbak1caUtdZ0w1NjE1NjE1NjE1NjA1NjE2NzE4NzI5ODM8OzY9PDdAPThCPzpEQTxGQzxHRD1IRT5IRT5IRT5IRTxKRj1KRjtLRztLRztOSDpNRztNRztNRTpNRDtNRDtNRD1OQz9OQz1NQzdNRDVLQjNKQTJIPjJHPTFFPTJEOzJDOjFDOjNBOjJBOjRAOTM/NzQ8NzM8NzE+Ny8+Ny88OC89OTA+OjFBOjJDPDJEPTNIQDVJPzNMQDJNQTFOQTBQQDBPQC1PQC1MPy9MPjFNPTBMOzFKOTFJODFFODBDOTBAOS8+Oi87Oy88PDA9PjA+PzFBPzBTOC2HPDfEXFvKWlmuODarLiqyMSuuLiWtMiOsOSasQiqqRiymRCejQSajQSaiPCOfOSOgOSqjOzCmOjCmNy6tPDS2Qzy3RTuwQDWrPTCoPC+pOy6sPDC7RTnGTEHFRTy8OCy/NiTNOijdOy7mMyzxKyr5KCv9Jiv7JSf4Kir1LivvMizrNCzoMyrlMynkMijgMyXgOirRMh/cPzDONinIOC3CPzWzQTbRbGC/Z1mlUkKoT0HLY1rnaGLmUlLqQUbzQkrrPkThOz3WPDzNQDnBPjS2OCy5Ni7EOTTiSEjpQEXwO0T2Okj6Okn4OEf3O0n7P07+QVX/P1b+PFT+OVT/OFX/OVr/Ol7/O2P/Pmn/Pmz/Pm//PnD9PnH6QHL4QHT3QXH3Q2r/TW3/U3P3SmjrQGD9VHP/Z4X/ZYL3XXfvX3jnaHvccH3GcXinZ2eNXlh7WlGXfneqmZK+sK3EvLrGwsPIx8zHx8/Dw8/LytjMytjRytrXzt/f1OTm2+nq4Ovt4+vv5eby6Ob06Ojw5Obu4ejt4Onq3efk2OLRytHBv8Krq6mRlo96hnhse2hidV9gclhicFZib1NjbVQyMS8zMjA0MzE2NTE4NzU5ODQ5ODQ5ODQ7OjU8OzY9PTU/PzdBQTlDQzlFRTtFRTtISEBISD5ISDxKSDtLSjhMSzdNTDhOSzhNSjlKRjpHRDtKRkNOSU1OSVBHRE9EP0VORT5MQzRKQDRLQTVNQzlMQjhGPTRCOTBFPDVDOjVAOTM/NzRAODU/NzU8NzQ8NDJDOjVCOTRBOTY+OTU/Ojc+Ojc/OzhAPDlCPzpEQDdHQDZKQDRMQDBPQC1PQCtMPyxHQC5GPy9JOzBLODFNNTNLNjVKODhGOzlCPzo2OTA0PC85RDQ6QS82OSQ/PShiQzG8al65SkGmNyylNSmnNyulNSelNyaoPSujOCSlPCaqQCqtQCmsPSmsOSauNiWrNiWkNiehNymiOCqmPC6qQDKsQjSsQjKsQTGpPiyrPSytPCyzPS+9QzTERjjAPjG6MibHOSvMOCrQOCvWOC3bNy3iNS7pMy/uMS3xLiz0Li3zMCzxMSzqNSrjNyndOinbOijcOSbUMx/QMyDPOCfGNye+NijCQjXPU0nITkPPU0vhXFfuXVrwUFLtPkPyOT/3P0fqQUbfQ0TVQUHIPzm7PDOxOy+wPC+yPDDKTEDUS0PcR0PhPj/rPEH3P0f9P0n5O0f+RFH8Q1H+RFL/RFX9QFb8PFX/PFr/QmT/Rmv/QWr6O2f1Omf2PG35Q3P9SXn/S3r/TXn/TXT4UHPwT3DnTWnqTWr8WXj/Z4j/X4P1R2z2V3foX3nDXm69e3+HYV6PeHCnkYS7p5zRxLvd1tDd3Nrc2+De3Ofi2+vm1+zr2O7x2fH23fP34vP35/T16/T07vL59PH59PD58e/27e7z6Ozu4+np3uTm3eLW0NTNycq7urijpaCLkIl5g3hyfW9we2t9hnN4gWx2fWswLi8xLzAzMjA1NDI2NTM3NjI4NzM4NzI6OTQ7OjU9PTU/PzdBQTdDQzlERDhFRTtISD5ISD5ISDxKSDlLSjZMSzZNTTVOTThLSjhLST1LSkVQUFJXVWBZWGpWVGpST2BPSUtNRD9IPzpGPThHPjlIPzpGPThCOzVEOjhBOTY/NzQ/NzRAODVAODU9ODU7NjI9NC89NC89NTI8NzQ9OTY+Ojk9PDo+PTlCPzpEPzlHQDZKQDRNQDBPQC1QPytMQCpCPyxCPy5GPDBIOjFKNjVJNTZGMzVANjVAPDk6PTY7PjVAQDRFPC1KOSleQjSATD6uUUKrOy2gMiOhNiajOieeNySeOSWjPiqhOyWnPCiuPyuzQC22PSy3OSq4Nii1NymqOSmlOiqkOSmlOyuoPi6rQTGrQi+rQC6uPyyrOiixPCu/RTbGSDnBPzG8OCvANinLNyvPNyzQOS7ROy3UPC/YOi7gOC/nNC3uMS30Liv0LivxMCvqNCnhNyjXOifVOiTePCfZNiPVOCXUPSrMOyrBNSbEOi/PRjzRRj/aSUTpT03zUFH0R0nwO0D1OkH4Q0jlQkXaREPSQkHFPji3OzGuOi2qPC2rPS62RTXGTD/UTkXcR0PjPz7vP0L6P0b+QEr4Q0r3Q0z6RFD/RlT9QlP5PlP8Plj/QmH/Rmj/Q2n8P2n5QGr5QnD8Rnb+Snr/S3v/Snr/SHT1S3DxUXP1XHr5X3v7WHf8TnH9RWv6RGzvRWnaS2fIX3CxbnVrTEmQfnSwlonMsqXk08ns49zr5+bq6e7q5/Lt4vP24/n74fr/4v3/5///7P//8v7/9v7/+fv++vf9+vX89/T69fL47/D06+7x6O3v5uvm3eDc1tjKxsWzsq6eoZqOk4yJj4WIkIOPlYeJkICGjH4vLiwwLy0xMC4yMS80My81NDA3NjI3NjE6OTQ6OjI8PDQ+PjZAQDZCQjhDQzlERDpJRj1JRztKSDtMSThNSjdOTDdOTDdPTDlLSTpOS0JUUlNfXmZpaHhtbYVsa4praINgWWlZUVxPR1JIQEtIPkdHPUVFPEFAOjxDOjs/Ojc8NzQ8NzM9ODI+OTM+OjE9OTA4My05NC47NjA8OTI9OjM+OzQ/PDVAPDNFPjRHPzRJPzNMQDBPPzBQPy9QPy1MPyw8OyY6PSg/PCtBOy1CNzFBNjI+NDI7MzA9ODRCOzVIOTROMi5ZLClsLy6HOz2gRkWjOzCiMiSfMSCkOSelPCmeNySeOCKiPCakOyaqPSmxQS22QS+5Pi67PC2+Oi2+PC+yPC6sPC6pOSupOSurPCutPi2tPi2tPCyyPy2wOCi5Pi7LTD3LRzq8Niq6MibJOS7QNizUNivUOCzWOi7YOi/cOC7jNi/oMyzwMC30Liv0LivwMSnnMifdNibUOCLSNyHdOCTcNSPaOSfaPi/TPS7INinFOSzLQTfJPDXNPjjZRUHlS0nqSkrpQ0PsP0HrQ0PeQ0HVRD/NQj3CPTS2Oi6uOCqrOiqsOyusOCnARDjUTkXdSUXgQEDoPkH3Qkn/SFD0QUf0QEn5Q0/9R1T+RVX6QFX7P1j+QV//RGb/Q2n/Q2v/RnD/SXf/S3v/THz/Snr/Rnj/SHf/S3T6TnT/Wnz/YYD9VXbxQ2T7SWv/VHbcP1zNSWDYe4W4fHxhQzuPfG6ujoHVs6fz29H77OX68vD59/r39P307Pv66///6v//7P//7v//8///9///+////fz//vv//fn/+vj/+Pb/9fb98/T78PT58PPw5+rl3+HTz86+vbmtrqiipZ6do5mdo5ejq56eppebo5YvLiwvLiwwLy0xMCwyMS0zMi41NC82NTA4ODA5OTE7OzM9PTU/PzVBQTdCQjhDQzlIRTxKRjtLSDlNSjlQSzhPTThRTDhPTDtMSj5RUExeXWJtbHp6epKBgqGAgqiAgKZ7dZdya4plX3tZU21UTGRNRVpHQFBCPEhEP0ZAOz88ODc7NjM7NjA8OC89OS47OC86NzA5OTE7OzM+OzI/PTFAPDE/Oy9BOy1GPy9IPy5LPy9NQC9PPzBPPy9QPjBMPy9APSo/PixAPS4/Oy8/OzI+OTM9OjU6OTQ8OTREOTVNNTFWLStqKS2EMjieOEOrPkOmNy6lNyilOiiqPy2oPyygOSahOCOkOyalOiarPCmzPiy5QC+9Pi/BPTDFPTHEPjK9PzO2PTKyOS6uOCqvOSuwOiyyOiyzOSq2Oyy5Oy3EQjTLRTnIPjO+MSfAMijNOS/WNSvYNCraNi3bNy3eNy7hNizmMyzsMSrzMCz0Liv0LynvMCjkMibbNCTSNiDQNR/XMh7aMB/aNCTcPC7WPS/QOS7NPTLSRDrENS3FNjDKOzXYREDiTUnlS0neQz/WPTjTQDnOQTjHPjS+PC+1OiuwOCqvOSuxOy2sNCa9PzPRSEDZSEPdQkDlQETzRkz9TlXwP0XwP0X2Qk3+SFX+SFf8Qlf6QFj8QV7/QWP/Q2b/Rm3/SXL/TXn/T3z/THv/SXn/RHb/Tn7/Un3+S3L4TW//VnX/VXX3TWrwRmPvS2bSPlbhZHT+n6fTj45kOTJsSj6leW7QpZz11Mv/6eP/9PL//f///P/58//87///7///8P//8v//9P//9///+/3//Pv//fr//Pj/+vj/+ff/9vf/9fb/9Pj+8/f26+/s4+Ta1dLJxsG6ubSztKyxtKmwtqq2vrOwuK2stKkxMCwxMCwwLyswLysxMCwyMSw0My41NC83Ny84ODA5OTE7OzM9PTM/PzVBQTdEQThJRTpMRjpOSDpQSjpSSzlSTTpTTDpRSz1PSkRWVFVmZHF3eI2GhqiNkLmPk8OPkMaOi8CHg7Z7d6lwbZppZI1fW35VUG5OSmFLR1hFQk0/PUI7Nzg5NTI5Ni84NSw4NSw2NzE3ODM4OTE7OzE+PC8/PCtCPSpDPClHPyxKPytLQCxMQS9NQDBNPzJMQDRLPjVMPzZLPjVGPDNCOTI9ODI6OTQ2OzQ3PDU5PDU+OjFINC1ZMi13NziUP0SmPkWnOTyqOzCqPCurQC6sQS+pQC2lPCmmOyerPiqnOCStOie1PCu8PS7BPC3FOy7KPDDKPTPFPza+PjO6Oi+3Nyy3Nyy4OCu6OCu6OCu7NyvHQTXNQzjFOC7BMSbGMynLNy3PNSvbNCvfMynhNC3iNizjNSznNSvsMSrwLyr1Lyz2LyryLynsMCfiMiPZNCHQNR/PNB7WMR7ZLx7YMiLYNinXOS3UOjDWPzbYRT3WRj7NQDfJPDXLQDnWS0TZTkfSRT7FOzHFPTHCPDDAPC+6Oyy3OSq0Oiu2PC25PzC1OS2/PDLJQDrSQz/bQ0LjREjtSk/2T1bsP0XtPkPyQkz7SVX/Sln9Rlj6Q1n7Q137QF/7QmT/RWz/SnP/Tnr/T3z/THn+SXb/Snf/VIH/VH39SnH5SW3/U3T/VnT4TmnrRF7kRl3qWGv/lqL/tbzznZ6OSEZrLimma2PNlo/zyMH/497/8fD//P3//f/89/7+9v//9v//9///+P//+v///P///f3//fr//Pj/+/j/+fj/+Pf/9vj/9ff/9Pj/9Pj98fPz6erk3NrW0c3NysPJyb/KysDKzcLJ0Mi+yL+3wbg2NTE0My4zMi4xMCsxMCsyMSwzMi00My42Ni43Ny84ODA6OjI8PDI+PjRAQDZCQDRKRDhNRThPSDhSSztUSzpUTTtTTDxSS0FRTElaV15saXx/fp2Mj7iWmcyZntiant6ZmNqUkdSMismGhb+BfrV4dqdua5ZmZYddWndWVGlNS1lEQUo+PD87Ojg7NzQ3NjI1NTU0NTc2NjQ4NzI8Oi4/PCtDPipGQCpHPypIQCtJQSxJQjBJQTRIQjZIQTlHQDpLPTxJOztDOTo9Nzc4NzUzODQvODMvOTE3PDU3NCtDMSddODB+Qz2WR0OePj+eNTGnOy+qPCuqPy2qPy2pPiypPiqsPyuwPy2rOCWyOSi5Oiu/OS3DOSzIOi7NOjDPPDTLPjXGOzTCOTHBOC7BOC7COS/COC7DNizFNy3RQznQQDfDMCbDLCPQNy/WPDTTMirgMyzkMijnMivoMyrqMyvtMivwLyrzLSr2Lyr1LinxMCnsMSjhNCTaNSLRNiDQNR/YNyPZMyPWMyTVMybVNSnUOCzUPDHWPzbsWVHhUkrTSEHMQzvKRTzMST/IRTvAPjG8Oiq8Oyi8Oiq5Oim3Oii4Oiu8PjC/QTPBQTbBPDPFPDbPQT3XRUXdR0jkSU3rTFDoQkbqQEPwQ0n5S1T+Tln8Slr8Rlz8Rl/4QV/5QmH9RWn/SnD/Tnf/T3r/Tnj/THb/UXv/Unn+T3b9T3T/Vnn/XXv/U2/uRF76VGzuUWT3ZHT/kp7/i5X0g4nHYGSnTU21amfOj4rvvLj/3tn/7+7/+vn//P79+//9+v/++///+///+////P//+/3/+/v/+/j/+/j//Pn/+/r/+/r/+Pr/9vj/8/f98fP57e/y5ubn3dvf2NLb187d28/g3tLf4dbc49vP2NPFzsk8OTQ7ODE4NTA1Mis0MSo0MSo1Mis2Myw3NC04NS45Ni87ODE9OjE/PDNBPjVDPzRKQjdNQzdQRzhTSjtXSztVTD1VSz9TSkNTSktdV2NubIKCgqaRlcWaoNqfpuqiqfGhpe+eoOuZm+WVmN2UldaQkcqJib2Cg7F6eaFycZFmY35YVmtQTlxJR1JGQ0xDQko/P0s9PUc7OkA7OTo8OTQ/Oy9DPS1FQCxGQCpGQStFQi9FQzRDQzdCQztBQz5AQUNCPEZEPkxDQU5FRU9DSE5BSUw+SEk+R0RDSEFBPTJMOi5nRjeDT0GNSTyOPzKUOCmlPi+pPiyrPiqsPyutQCyvQC2wPy2xPCqxOCe2OCm9OSrDOSzIOC3MOC7SOTHUOzXPOjTNOjPLODHLODHMOTLNOjLMNzDLNi/TPDXVPjXSOTHMMijONCrYOzLaPDPXMyrkMSrpMSfsMSruMinwMSnyLyn0LSj2LCj3LSn0LynwMSnpMyjiNSfZNiXSNyHPNyDUOSXVOCXTNiXRNCXSNCjTNyvSOC7QNy/jTkfoWFDnWlPaUUnMRz7ERDm/QDe5Pi+5PCq5PCa5PCi5Oie4OSi6OyrAPjDDQTTJRDvGQDfJQDrRRkPVSUjWSEfYR0rfSUvmRkjoQkTtREn1TFP8UVr7T137TF37S2D2RF73RGH5Rmb9SWz/TnX/T3j/T3j/UHf3VnjzVXb0VHb8WXj/XXv/Wnf7UWvySWD9V2v2VWfqTV72Xm3iS1rmVGHlVGHXWGHBZWbIg37lq6f/1NH/6+j/8/L/+Pn//v/7/P/7/P/7/P/8/P78+v39+fr99/f89/T/+vf/+/j//Pv/+/r/+Pj/8/P97vH66+7w4eTp3d3k2dXi2dLm39Xr59vx7eHx8eXs8+zb5uLO2dVAPTY9OjM6NzA3NC01Mis1Mis1Mis2Myw3NC03NC05Ni87ODE9OjE/PDNAPTRCPjNKQjdNQzdSRjhWSjpXSztYTDxXSz9USUNTSk1eWGZwbYiChKuRl8ucpOOjrfWnsP2qsf+mrPqhp/OgpO6fo+qdoeGZm9aVlsySksSJiLR5eZ9qaYtgXXxYVXBSUGhPTWVOSmNLR15GQlNAPUg/Oj4/OjZAPDFBPi9DQC9DQjBCQzNCRDc/RD0+REA8RUQ7Qko+Q1ZDSWFMUmhVXG9cYnJgZG9iYmpkYGFmWFdhSkRsRz6DU0WVWEaTSjeRQCuZPiuoQS6uQC+uQS2vQC2wQS60QS+yPSuwNya1Nyi8OCvCOCvIOC3NNi3RNy/VODHYOzTSNzLQNzLQNzLRODLUOTTUOTTTODPTNi/eQTrVOC/RMyrWOC/ePTXePTXaOTHcNSznMinrMCfvMCjxMCn0Lyn3LSn3LCj3LCj3LSn0LynuMinpNCnhNSfaNybUNyTPOCPONyLPOCXONyTPNibQNynSOSvRNyvONCrLNCvjTkfzZFzrYFnVT0bEQTe6OzK1OS24Pim4Pie5PCa5OyW6OSa9OSrAPC/EPjLKRDnKQTnORT/VS0jTTEnOR0TNRUXWSEfjSUnmQ0ToRUjyTVP4U1r5Ulz3T176T2H0SF71R2D4R2T7SWn/TnL/UXj/Unn/VHrwVXXvWnf5Xn39Xnz5VXD1TWf5T2n/WW7/W23/Y3TwTV73VGX0T2D8VWf1TF/kUl/AXl+7dnHXnJj6ycX/5eP/7ev/9PT///38///7///7///7//79/f39/Pr++fb9+PX/+PX/+fb/+vn/+vn/9vb88PD46ez05ubr3d3o2tnk2dPo3tXw6N358+X/+uz+/vL0+vbh6+rT3dxCPjVBPTRAPDM+OjE8OC86Ni04NCs3Myo2Mik2Mik3Myo4NCs7NjA+OTNBPDZFPjZJQDdNQzdSRjhVSTlXSjpYSztaTEFbTkhUSU1YUmBnZIF8fqeNksqXoOOeqvalsP+qs/+rsv+stP+ssvyqsfmqr/OorOypq+ifodqZmtKNjcGBf7F0cqFoZZJdWodYUn5YUXpZUXZWT25NSF9DP00/OkA/OzpCPzg+PjRAQjVCRTo/RD08Qj46Q0I+Rkg/TFVEVm5RZoNhco5pc450do+BeI2Eb4CAXmyKW2OSV1meV1WmVk2mTT+fQC6cOSSgOiSnPCisPSquPyyxQC6zQC20Py22PSy5Oyy6Nie+NijENirLNy3RNy3WOC/aOTHaODPXODTYOTXZOjbYOTPYNjHYNjHaODPdOjPmQzzgPTbaNzDjQDf+W1L/bGP/XVTnPzblMyntMinxMir0Lyn0Kib1KCX4KCb4Kyj3LSvzMCztMivjMSfaMCPUMSLUNCTTOijMOybKPCjNPCnPPCrSOizSOSvSOCzRNy3aQDjPODHcR0H0Y17lWFHLQjzFQDu3NCq3Oia2PCS5PCa6PCa9Oii/OivEPDDGPjLHPjTMQzvZUErfWFLUT0rDPzrAPzrPSETeSEfiR0XmSkvvUFTxUlfvTlbtS1jxTFz5Umb4T2b3S2X3Smb8TWz/UXP/Unb9Unb0V3buWHX1WHX7W3f/XHj/WnP/V27/Vmv/YnX9Vmf/XG3/W2zxRlj0RFj/UWXuVmXGZmeqaWXKj4vntrL40s//6+f97+78+Pf5/fz5///5///6//78/v3//vz/+/j+9vT++fX/+/f/+fb/9vT/9vb/9fX26Ojm2Njj1dTe0M3h1tDx59789Of++Oj//On///P6//no8fDY4eBDPzZCPjNBPTQ/OzI9OTA7Ny46Ni05NSw3Myo3Myo3Myo4NCs6NS89ODJAOzVEPTVIPzZMQjZRRTdUSDhWSThXSjlZSz5aTUVVSk5XUV9lYn95e6SKj8mUneKbpvWjrv6rtP+stf+utv+vt/+wt/+vtvyvtPivsvWpquuio+OYmNiMismAf7t1ca5pZaBjXphgV45gVohdVH9WUHRNSWJGQ1RCQUlBQUM8PDpBQj1GRUFDRD9BP0BEQkVPTVJXVmRjaIZxdZp/faKHfZ+SfZyge5qlcIqkYHWsWWm2VmG6UVW4SEawQDSsOymsPCatPSeoOCSoNyWrOCauOSiwOCeyOSi1Nyi4Nii7MyXCNCjKNy3TOjLZPDPePTXfPDXfPDXhPjnfPDffPDfhPjnlQj3oQz3nQjzmQTvlQDrmQjnkQDfcOC/VMSjYNivrST7/W0/xQDbuNizqKyPuKSP4LSn/Ly3+LCv2KCj6MC71NC/vNjHnNi7eMynWMibUMiXPNibLOifIOyfKPCjNOijPOSrQNynRNSnQNCjTOS/PNS3UPTblUErlVFHbTEjNQj+3MSi8Oyi7PSa9PCe+Oye+OSjAOCjCOizEOi/IPjTLQjjVT0bcV1DSUknDRD2/QzvMSEPbTEjfSkblTUzrU1LtVFfrUFbpTlbsT1r3Vmb4VWj5U2n6Umv8Um3/U3H/U3T/UnXyTW34VXT/XHr/X3v/XHb/VW/7Umn7UmX8VWb3UmL/Wmj/WmjzTl74U2P+WWnfU162YF+XXle2gX3ZqaXuyMX94d756en9+PX6/Pn5///4///3//36/v3///3/+/v/9/X9+PT++fX++fX+9vP/9/b/9fX26urq3Nvk1tPd0Mrf1czv5dv89eX/+ef//en//+/6//jo8e7b4d9FQTZFQTVDPzRBPTI/OzA9OS48OC07Nyw4NCs4NCs3Myo4NCs6NS89ODI/OjRDPDRHPjVKQjdORDhSRjZURzZXRzdZSTxZSkNXS0tYUF1iXnlzdZyFisKQmdyYpPCgq/qqs/6ttf6vt/+xuf+zuv+0u/+1uf+1uf+vsvmsrPSjo+uZl+COjdODgMd4dbxzbbNrYKJpXZtjWpFdV4VWUndOS2hFRFZAQEw4NTxBPEBLQUJMQEJRPkJaRUpwV12CY3OYcpeleqeuf6uye6O4dpzAcJPCY4PAVG7CR1zQS1zRSFDEPDy6NS64OSq1PCewPCWwOyewOymyOim0Oyq3PCy7PC3APC3EPC7ENirLOC7TPDHZPzXfQTjhPjfgPDPfOjTcNzHZNC7YMy3eOTPmQTvsRT/pQjzkPTXjPDTbNCzYNCvbNy3UMifMLCDWNirpRzr1Sz7yQDbvNC3wLSn2LCr6LCz8LCz4KizwKinsLyvoMi7jNS7cNCvYMSjVMSfRMyfNNyjLOinNOijQOinSOyrTOirUOCvUOCzRNCvWPDTVOjXVPDflT07tWVfZRUXCMy/AOyy/PCjAOyq/OinBOSnAOCjAOCrAOCzGPTPHQTbPSkHYVUvSUkfGRz7ARDrHRz7WS0TYSUPdTEnkU1DlU1TiUFPiTVPlTlfyWGT2Wmj9W3D+WnL8Vm76Umz7UWz/UXD9R23/UHb/Wn3/W3v/VnL9VGv+V2v/XG37WWj4Wmj7YW32YGvtXWfvZm7sZm3JXF+gXVd7T0aYbWbBmJTdurbw1NH04N//9fT5+ff5//35///3//36/v3//////f//+Pn8+fT8+fL8+fT9+PT/+fb/+Pb57uzv5OLl2tbb0Mrc0sju5Nj99uT/++j//ef//+36/fTq8Oze499JRTlIRDhGQjZEQDRCPjNAPDE/OzA+Oi86Ni05NSw5NSw5NSw6NS88NzE+OTNAOzVFPjZJQDdMRDdPRjVSRTRVRTVXRzhXST5YTUtYTldeWnFwcJaAhrqMltSVoemdqfWosPmpsfmts/2wt/+xt/+yuf+0uP+0uP+vsfyrrfilp/KfnuqXluKMi9eCgc19ecV1bbZwZ6pmYJ5fWpBZWIRRUXVHR2NBPlE9NURIOEJUPUNgQEVuQ0qAT1WWXWSrZni/a4/JbprLb5jJaY/IYIPJV3jGSWfEO1XGMkjZQVDgRU3ROzzGNzHEPzC9QCyxOiStNiKtNSSuNSSzNSa2Nyi8OCvDOy3IPC/TQDbXQDfaQDbcPzbePTXeOTPdNi7bNCzTLijSLSfTLijYMy3hOjTjPDThODHcNS3cNS3QLCLNKR/ZNyziQjbcPzDQNCXLLh/pRjfzSTz9SD/8PDf0LSrxIyX1Jyn7LzLxLS7rLy7kMi7eMyzaMSrXMCrWLynTMCfTNyrSOSvWOivYPC3aPi/bPzDcQDPcQDPSNirmTELlSkXONTDfR0bzWlzfSUvVQT/IPC/EOyvDOirDOirCOirCOirBOSu+OSrCPDDCPjLIRjnPT0LOUETGSDy/QzfBQzfOSD/RRj/VSkXbUEvdUk/ZTUzaS03cS1DrWGDzW2f8YXH/YXX6WG31T2f1TWf/Tmv/T3X/Unn/VXf/VHH8VG39W3D/Y3X/anj/Z3X6Ym/1YW3tZGzjZmzZaGrOZ2i1ZmGNXlRlRzx/XlWpiIHNq6nlx8Xv2tn/8/P5+Pb5/fz4///3///7/////v///P//+fr++/b7+/P7+vX++/b//fn/+/j+9PL47enq39ne1Mvd08nt5tb/+OX//uj//+b//+v4+u/q7+jj5t9OSDpNRzlMRjhKRDZIQjZGQDREPTNDPDI/ODA+Ny89Ni49Ni49NjA+NzFAOTM/OjRDPjhFQThLQzhORTZRRDNSRTJWRjZWSDtaTUdWTVJbV2hsa4t+grGKk86Sn+Oapu6mrvepr/mtsP2vs/2ws/+wtP6ws/+vs/2rrvuoq/ikp/Sgou+anOmTleKKjNmGhdGDf8l7dbtta6xkZZ5fYZJZW4RSUXNOSGJXRllfQ1FtQkyBRU2YTVSsVV28W2LKWmjZUnDiUnXfVHXZUGzSSmLNQlfHOErFLj/UOEXjQ0vmR0vYPj7NPjbMRjrDSDa2Pyu3Pi24PS26PC29Pi/DPzDKQjTQRDfVRTrZRTnaQjfbPjXZOzLZNi3ZNSzaMyvXMyrUMSrXNC3aNy7dOTDfODDeNy/dNi7cNSzWLybZNSvXNyvPMiPNMSLSOSnVPi3UOynYPC3mRDf4SkH9RD/5NjT1Ki32Ki33LzL3NjftNTXiMzDaMSzXMCrXLyzZMC3ZMCvjODHkOTHiOjHiOzLgPDDfPTDcPzDaPjHRNyvvV0z4YVrTOzbROzrmUFHcRkjmUFHPPDTKOi/GOCzFOSzEOi3EPC7DOy3AOyy+Oi2+PC7DQTPHSDnHSTvCRDa+QDK8PjDJRjzKRTzOSULVUEnXUk3VTkvTS0vXTE/pWmDwXmj8ZnL/aHj8XXHyUGXzTWX9Tmv/Vnr/VHj/UnL4VG32XXH7aHj7anf3ZXL8ZXTzX23sYGvqa3LfcnXDamaqZFyebGF9ZlZYSDlrWEqUfHK9oJzewsHu1tb+7u/79fX7+/v7///5///9/v///v//+///+v3//vn7/vX7/Pb//vn///r//vr/+/X/9/Lx6OHk3NHh2czw6df/+uT//+b//uX//+r3+evt8Ofo6eFRSz1QSjxPSTtNRzlLRTlJQzdHQDZHQDZCOzNBOjJAOTE/ODA/ODI/ODJBOjRAOzVCPzhFQjlLRTlNRjZQRTNSRTJVRjNVSDdZTENVS0xaU2NpaYV8gauJk8iTnt6apOumrPiprPusrf2tsP+usf+usf6tsP2tsP2prPmnqvekqPKipvCfo+2anuiVmeOSlN6SktqJis18gMBzeLJvdaltcJ1pZ45qX315X3iCV2qOUF+jT1y7U1zNVF3WUFfbSFLlQFHoP1LkQ1LcRFDWQ0vPQETKOTzJNDbkSkznSUrhQUHVNzTOOTXOQTjIRDi+PjHDRTbDRTbFRjfJRTjORjjRRzrXRzzaRz3WPjPVOzHWOC/VNCzWMyrYNCvbNCzaNi3bODHdPDTgPTTfPDPdOTDcNS3cNSzbNy3SLiTdOzDaPS7NMSLGLR3ONybSPSnNOibMOSfUOCniOi/zPTn/QED/PD7+MzfzLC/qLC7hKyrYKinUKyjXLyzeNDTkODjpOTnvNzXwNzTuNzPoNzHjNy3cNirXNSjRNSbNNSjnUEX/bWPbSEHINDLXQ0PTPkLqVlbZQTzSPjTLOC7GNivGOi3GPC/DPi/BPS67OSu7PC2+PzDAQTK/QTK9QC68PS67PC3DQzbERDnISD/QUEfTUkzQT0nSTkzVT07pXmPuYWf7aXT/bnr/ZHX1Vmr1UWn/VW//V3b/VnT6WHDxXnD0bnn2d4Dta3PeWGHxYG3xYG3sYm/vc33siIrMgXyqdGiZeWpza1hPTjpfVkeDcWevlpLcwL/v1dj86ev+9PX9+/z9/v/6/v/+/f///f//+///+f7///v5//X6/fb///r///r///j//ff//vb58Oft5drp4dT079z/++X//uX//+P//+j5+ury9Ofu8OVTTT1STDxRSz1PSTtNRzlLRTdKRDhJQzdFPjREPTNCOzNBOjJAOTNBOjRBOTZAOzdBQDtDQztJRTlNRzdPRzJSRjBVRjFVSDVXSz9SSEZYUl5qZ4J9gaeJk8SSntqYouekp/amp/qrqfyrrP6srf+trv6srvusrvuorPamqvSkqPGjp/ChqO6gp+2dpOibouaZnuKSmtuLk9KGj8qDjcKEiLeDgaiIeZqPbYiaY3qpWGm7UV/PTVngSVLoQUnqPUHpPTvjPjjdQznWSDrOSTjFRjPCQzDFQDHkVEngRz/aOzfYNjTYODjYOjvROTjINzTAOi++PC6/Oy7AOi7COCvDNyrGNCfGMibONCrQMyrRMyjUMynWMyrZNSzdNi7cOC/ePTPbPTLcOzHbOC/bNy3aNizYNCrXMynVMybTMyXQNCXPNibSPSnRPirKOSTAMhzIOibKNCXVMSfnNTH6PDz/PUD/Nz33MzfqLTHhLS7ZLS3XLy7cNDPjOTrpOz3wOT32Mjb4MDP0MDHtMS/kMSreMijVMSXPMyTJMSTRPTH6al/kVEzIOTXQQD/LOj3kUlPkSkjcQz3ROjPJNi7GOC7FOzDCPDC/PS+6Oyq8Py29QC68Py26Oyq6Oyi9Oyu+PCy8PjC8PjLARDjITELMUEjKTkbMTEnQTkzoYWXsYWb4aHL/b3v/aHj3Wmv3VWr+WnL/WXP7XXTuYXLmanTrfYDxh4nod3naX2TxZ3T+bXzzZXXrbHf2kZXsop/ElIqijXxoalVIUTxXVUZ0aFykjIjbv77y1dn54+b/8/b/+vz+/v/8/f/++////P//+v//+P3///v5//X3/fP9//f///j//fb//ff///b/+e/17+Hy7Nz69eH//ef//eT//uL//+f9/uz5+uz39+tWTz9UTj5TSz5QSjxPRzpMRjhMRDdKRDhIQDVGQDRFPDNCOzFCOTJBOjJDOjNBPDZDQDlERDpKRjpNRzdPRzJRRjBUSDJVSDVVST1RR0VXUV1qaIB+gqiMlMWTndiZouefoPKjoPemo/qnp/2oqv+pq/6prP2nrfulq/WjqvKjp+6ip+ukqe2mqe6lqO2jp+6YoOiUoeWUn9+Un9eVm82alb6gjK+qg6ClZX+0XXDCUWPQSVfcQk7lPkbrPEHsPDzqPzjjQTTcRTTUSTTKSTPCRi6/QizCPy3iU0XeRDzdOTfmPj7qREblQETZOD3ONjXNQjvIRDjJQzjHQTXGPjLDOSzCNinCMifGMijLMyjONCrTNSzYNS7ZNC7bNC7bNCzkQjfdPTHZNyzaNizfOS3fOS3bNSnVMSXYOCjNMiDKMSHPOSjOOCfHNCLKNyXUQzDINybOOCrXNizeNS7mMy/uNTP2Ojn7Pz7/TEv6SEbyQkLsPj3qPD3nNzrlMjbmLDH0KzH4KS/0LC7vLy7oMSvgNCrZNSnTNyjGMCHALh/0ZFnrXVPPQDrUREPLOzvfTU3qUlHgSEXTOzbJNi/GOC7GOS/DOy2+Oiu+PCzBQC3AQS67PCm3OCW4OSa9PCm+Py61NymzNyu4PjHBRzrFS0DFSUHISULLSkXlYV/mXmDxZGr+bnf+a3XzXWnwWGX4XW36XnP1YnToZG/jbHLsfn/5jYv2hoXpcXP4cnn/eYb1YXHgWGb2iJH/tLTQrqKgm4ddalBEUjlRVD9qYlWbiIHawL/y2Nn24OP/9Pf/+v3//v/9/P/+/P///f//+//++f37//r0//Ly/vL5//T8//b7/fL//fT///T///P79ef38eH++eX//ef+/OP+/eH//+r///H9/fP8/PJYT0BXUEBXTj9VTj5USzxSSztSSTpQSDtNQzdLQzZLQTVIQDNIPjJHPzJIPjJGQDRHQzpHRTlKRzhOSTZSSjVVSjRVSjRWSzlYTkRVTE1aVGJraIN7fqeJj8ORmdeYn+ejpPalovmiovyhovygpP+iqP+jq/+krfyhqvWhqfGhqOylqO2qqe+tqfOxqfasqfigqfiXp/KSoeKWn9amo862nr65hZy4Z3q/TF3RRVLfPk3nO0fnPETmPULgQEDgQEDiPj/fPD3dRULJOjTKRDnKRjq6MSnbSkXoSknpQ0XrPkLoOz/mPD/hPT7aPD3UPDvPQjvIPzfKRDvRTUHNSz6/PTC4Nim9OSy/NyvDNizINS3LMirRLyrULyvbMi/eNS7nQTXfOSvZMSTdMyblOSvnOy3fOCbVMh/PMh/MNB/KNSHHNCLHNCLKNCXNNSfPNSnKMCbPMinRNSnSNirSNCjVMybXMyfcNCngMinmMy7rNTLrMzPpLzLnLTLoLTTtLjX2LTP2Ky/vKyzsLy3qNS7jOSzZNyjQNCXDLRzEMyLnWEjpWU7LOzPfTknFNDHaSEjhT1DcSkrUQ0DMOzbIODDGOCzHOSvIPCvFPCrCOyi+OSa8Oyi7PCm6PSm6PSu3PCy0OCy1OzC5PTG7PzO7PzO+QDTAQDXEQTfvamH1cGnqY1/0bWr7cXHsYWT0Z23/cHn/bHr7aHjwZG/pYmnrZGrubG7ucW/ucW/7eXv/fYX5Wmz8Y3ffYnD7rK+2qpp9kXVdclFKWTpMUjhzblqllYjLt7Dt1dP/7vD/9vf/9/v9+Pz8/P7+///+/////v/7//7w//Tl/unm++rv/+74//b8//T+//P//vH//fH/++7/+ur/+eb/+eP/+eH/+eH8+uX///X///v///tZUEFYT0BYT0BWTT5VTD1USzxTSjtSSTpORTZNRDVMQzRLQjNKQTJKQTJKQTJJQTRHQzhIRDlMRjhPSDZSSjVTSzRWSzdUSzpYTkVVTE1ZVWNraIN7faaGjMCNldOWmuGfnuyfnfGenvSen/mdov2fpv+gqv+hrPugrPSgq+2fp+iipeilpOqpo+2roO6kn++gp/eapvCcoeGjnNCxmMC/jarCcYTEVGLRQ0/iPEbsOEHvNz/qOj3lPD/cQEHbQUPgPEPaOT/aQUTLOzvMQj/KQD3BMzHlT1DmQ0boP0TqO0LnOD/iODvbODnVOjjPOzfURT/GPTXFPDTMRz7MTEHBQzW4Oiy3OSu5Nyq/NyvGNi3LNC3RMi7YMy/hNTPkODTkPjLhOy3eNinfNSbhNSfhNSfaNSLTNB/ROSTLOSLHOSXHOibJPCvLPCzMOCzONCrVMy7WNS3TNyvPNynJNibHNCLLNCHPNCLYMiTeMibjMCvmLizmLC3mLC/mLTLoLjPsKy7tLC3sMC7oMi7gNCrbNSfVOCfSOSfVPy67KhnWRDXQPjHZRj7rVlDaQj/YQkHnVVbiUlLcS0jUQz7NPTXJOS7IOSvHOCjIOyrEOyi/Oie9PCm9Piu6Py25QC+2Pi6yOiy0OzC3PTC4PjG6PzC9PzHBQjPFQzXraVzybWTnYlvwa2b1b2zoYmHxa2z8dHj/cX7/b3z2aXLtXWbqWWDxYmb3cXD+enj7dnf/eH75UmT+W3DkXW72pqmpppNqjGtadE9OXztTWjt1c1ypnY3WxLj24dz/9fH/+vr/+vv/+/z8/Pz6/v37//76/v/1//rt//Ph/+nh/ebp/+vz//H4//L9//L///H//e///e3/+un/9uX78+D68t389N/89+T9+vP8/Pr///1cUEJbT0FbT0FZTT9YTD5XSz1WSjxWSjxTRzlSRjhRRTdPQzVPQzVPQzVPQzVNQzdKQzlKRjtNRzlQSTdTSzZWSzVWSzdUSzpXTUNWTU5aV2JraYF5e6GFibmLkcuRltaYmN6ZmeOYmemane6boPSdo/efp/igqfSgqu+dqOicpOOcouCen+CeneGdmeObmeKWm9+amtqkldCxjMC/gqzHcpPJWXHHQlPXQUzfPkTjPT/lPT3lPD/jPT/hPkHhPkPgPEPXOD3VP0HPQUDKQz/DPDjEOTbpV1fgQkPkPkLoOz/jOTzcNjjWNjbROTbMOzbVSEHEOzG+NSvFQTXNSz7GSDq7PS+3OCm6Nim/NynHNyzPNi7XNTDeNzHmOTXpPTnXMyrXNSraNircNirdNSrdNynaOirXPizFNCG/NB+5NCG5NiK8OCm9OCm9MyjALSXjQDvlPjjePTPVPC7MOSnINyTINyLMNyPSNyXVMyTXLybZLifbLircLi3bLy/cLi/bLCnfMCvgNS3cNSzVMybQNCXQOSbRPirUQS/CMSDnU0XSOzDaQTveQz/oSknwVFXtVVTnU1HjT03dSkPWQzvPPDLKOCvFNibENybANyW8Nya5Oie5PCq3Pi21PSyyPSywOiyxOy+0PC61PS+3PS65PzC+QzTDRTfcXFHqZ13kYVnwbGf2cG3nYWDsZmfzanHgUl7vXmv1aHHyZW3xYGf0ZWn5cXH+eHf6dHX/bnXzSl34UmjkW23xnKGjnIphgGBVb0hPZD1XYEF3d12tpZLh0cL/7ub/+PH//Pj//vr+//r7//z7//37//35//vz//bo/+7c/uPa+N7h+eHo++Xv/Oj2/ev9/uz9+un/+ur/9+b68eD06Njy59X269n48eH++vH9/Pj//vtcUEJcUEJbT0FaTkBZTT9ZTT9YTD5YTD5VSTtUSDpTRzlSRjhSRjhSRjhSRjhQRjpMRTtLRzxPSTtSSzlUTDdXTDZXTDhXSztWTEJVTUtcVmBqaH55eZuChbKKjcKPlM6TldKVlNaVlduWmOOYm+iYnuyaou2bo+ucpeiYot+Wn9qVm9WUmNWTl9aSk9aRkNKFhL2Rg7alfbG3c6LIZo/SVnrVR2HUPEveQUrgQkPeQ0HgQj/hQUHkP0PnPkXnPUbjP0bWOj7RP0DRRUTGQTy6NjHFPjrqWlndQULjQEPmPUDjOj3bODnTOTfQPDjOQTjPRTvCOi67MijAPC/HRTfERTa9Pi+4OSi9OCnCOSnLOC7SOi/ZODDgOTHoOzfrPjjYMSvZMircMyzdNSzgNS3fNy7bOS7WPS/JNyjGOinBPCu+PCy/Oy7BOzDFPDbOOTXrQ0DtQDzkQDfZPTHPOSrHOSXIOibJOyXPPCjQNyfPMSXRMSXUMSjWMyzUMSzRLyrTMirTNSzTNyvQNynNNSfKNyXMOyjMPirMOyjPPCz0XlDgRjzSMy/SLizmQED7V1j/dXP/cm//amf2XlnnUEfVQTfHNSi9LiDEOCfAOCi7OCa4Oym3PCy1PS2yPSywPC2vOy6tPC6wPC+wPC2xOy22Pi68QjPARjfLTUHfYFfiYVv0cGz4dHLmYGHkXWHmXWTWSFTnWWXzZ3L0Z2/2ZWz8a3D+c3b+dnb7cHP7ZW7xRFj0S2LlWGvrkpaglYNfellRbENTaD9cZ0V5fF+wqpTn3Mr/9ej/+fD/+/H+/vT9//f7//r5//r2//jy/PPq++va+N7O89LK68zP7M7X7tLg8Nbp89vy9+H29eH79uP89eP17Nvt4dHp3c3t4dHx6Nn89e389/H++fNcUEJcUEJbT0FbT0FaTkBZTT9ZTT9ZTT9XSz1WSjxVSTtVSTtUSDpVSTtVSTtTST1PRzxPST1RSTxTTDpVTThYTTdZTDlYTDxVS0FVS0lcVV1oZXh1dJN8fqWFh7eMj8KOkMOPkMiQks+QlNSSldyTl+CUmN+Vmt6VndySm9aOlM6JkMeFi8WBh8N9g8F+f7h9dJ+OcJSoZ4/BXITWTnbiQWPoOlXqOUvmQUfgRUPcR0HbR0PfRUXmQUfuPErtPUrmQknXPkDQQD/QSUW/PjizMizIQzzgVVDcREPhQUPjP0DhPj/aPz3UQDzRRDvPRjzHPTLAOCq9NSm9OSq/PS2/PS29Oyu9PCnCOirHOyrPOy/VOy/bOC/gOC/nODPpOjXmOTXkNTLkMjDmMjHnMzLmNDDdMivUMCfLMSfLNy3IOjDENy7BNC3DNDDMOjvdP0DrODvtNzbkNzHYNSzMNCbGNSLENyPFOiXLPSnLOCbMNCbONSfUOCzUOjDTOS/QOC3QPjHKOy3FOCfENyXGOSfHPCnHPCnHOijNPi3NOirYPjLhQzrULy3kOjrgMjTfNTbXNTPWOzbeQz7lS0PqUUnqU0joVEjkVUfLPzDEPy6+PCy4PS23Pi20Py6wPy+uPjCsPC6sPC6sPC6sPSytPCyxPS63QTO6RDbGTEHeYljiY13wbmz0cnLlYGPlYGXnYGf3a3b7b3r3a3btYGjwX2b9bHH/eHv/eXz6bXP4XmrzQVf0Q13oVWjmh42jk4Nnf11ZdEledUlod1CBiGazspbo4sz/+un//e3//u/9//L7//T4//T0//Ht++rk8uHY7tfF6Me75Ly63rq/3rzH4MDN4sPY5szj69Ps7tj08d738t/z6tns4NLo2s3q3M/v4dby6N/x6OHy6eJbT0FbT0FbT0FaTkBaTkBZTT9ZTT9ZTT9YTD5YTD5XSz1WSjxWSjxXSz1XSz1YTD5RST5RST5TSz5VTDtYTTlYTTdZTDlYTTtXSz9VTEdZU1dlXm5uaoN1dJZ+faWEhbGGibSHibmKi8GLjciNjs+OjtSPj9WPkNOQlNOLkMqDiMB8gbh1fLJvdq1pb6tsapyAbIiTY3muWXbLUG/jQmTwN1b2NEz3OEjvQEXlRkLdSkPbSkXhR0foQ0ryPU7wPkzkQ0nXQ0PMQT7OSUS6OzSwNCzJSUDVTEbYQkHaPz3bOzvaPDvYQD3URT/NRzzLRzrAOCrBOCjAOCq+OSi8OSe7OCa9OijAOyjEOynKPSzSPC7XOy7cOC7hNi7kNi/oNTDpMzLoLi/pLDDuMDL1NDf1NzfuNDXmMjHaLirXNC/VNjLRMzLPLzHSLzTbNj3qOkTtMDbuMDLmMy/cMyzRNSnKNyfIOSjJPCjGOCTJNiTONijTOizaPjLdQTXdQTXYQTbTRzjJQTHCOyjAOSbDPCnGPSrFPCrFOCbMOivNNynNMCfmQzzbMi/vP0HjLzLaKizVMS/SNS7VODHWOTDSOC7MNSrGMibAMSPORTXGQTK8PS61OiqxOSmvOSurOiyqOiyrOy+rPTCsPi+sPC6rPCutPCyyPi+1QTLJU0fgZ17gY1/qamnubm/mY2jwanH1b3j6cXv9dH72bXXuYmv2ZG7/cnr/eH7/cXX6aXD4V2b5QVn0QFvqUWbhfoOsl4Z5j2ttiF1viVp5imCNl3K2t5jf3sL59N78+uX//+/7/+/1/+/v/+vn+uTc79nQ483F3sGw1q2o06aq0Kew06u21K681rHH2rrS38Hg5szo6tTy7dry6dju4tTs29Hq2c/s29Pp2tPm2dHl2NBbTj5bTj5bTj5bTj5aTT1aTT1aTT1aTT1ZTDxZTDxYSztYSztYSztZTDxZTDxZTT9TST9USj5VTD1YTDxZTjpaTTpaTTpZTjxZTT9VTEVYT1JfV2JkX3NqZoFzb5B5eZ18fqR+gKmBgrKDhLyGhsaIh8uJiMyJiMqIiMiDg798fbV2d61wcadrbKRmZ6BsYI6CYHGVVl6zTl7SSl7sQFj3Nkv+M0b+OUPzP0LpREDhSELeSUPiRknpQkryPU7vPk7dQUXURkTIQT3JSEK0Oi+xNyzOT0bJQjzOPTjQNjTPMTDQNTHTPjjPRTvIRjnDRDW+OSjDOijCOiq/Oie9OCW+OSa/OifBOibEOSbLOinTOizZOSvdNyvhNSvkMyvqMy3rKivxKi34LTP8LzT/MTf/Mzf/Mzj9NTj5ODv1ODzyOT7yOUH0OUT3N0b7Nkj+NUX0KzX0LTLtMTLjNC/ZNi3QOCrOOyvOPSzLNSbROCrZOy/fPTLiPjTkPTTlPjXfQTbZSjzPRzfJQTHEPCzCOSnCOSfGOCrIOSnJMifTOS/hQDjrRD7eMC/gLi7rNDboNjbYMy3VNy7XOTDXOjHVOzHSOzDNOjDJOy/WTD/MRjq/QDG0OSqwNimsNiirNyqpOCqsOy2tPS+uPjCtPS+rPCurPCutPC6xPTDAS0HaZFreY17oa2nwb3PqaW71cnr8dn/uZnD3b3n5cnn2anP+bHb/d3//dn35aG/5Y273UmL+Qlv3PFnqS2HddHu1momNnnp9mGt7l2aClWiRnXWsso7LzK3g4MTp7NHu9t7l89nZ7dHP5snF3sC81be0y66qyKSawZSWwo+Zw5OhyJmny52sy6G1zqfB0rDO2bvZ3cTl487s5dXv4dbr2tLn0s3j0Mrgz8jazMPVx75bTj5aTT1aTT1aTT1aTT1aTT1ZTDxZTDxaTT1ZTDxZTDxYSztYSztZTDxaTT1aTD9WSj5WSj5YTD5ZTjxaTTxaTTpaTTpaTTxbT0FXTURXTUxcUlpeWGZiXXFqZn9zcI13dpZ4eJx8e6eBfrWEf7+FgsWIgsiJhMeCfb9/ebd6da14cad2b6V0a6JwZ6B6YYuEUVqZSEWzRUjTSE/uQk74Okb+NkH+OUD1PT3uQT3mRD/jRULkQ0joQUvuPU3rP03YP0LRR0TFQTzDRz+yOS6zOi/RVUvDPjXJODPHLyzFKibILyrNOjPMQznDQza8Pi/AOyrEOynDPCnBOifCOyjDPCnCOyfDOCXENSTKNyXUOCnZNyrdNSrhMyrlMynqMir1MzP/NTj/ODz/NDr/LTL/KC3/KC3+KzH8LTP2KTDyJjH3KTb/LD//KkH8IDnzGi/2IjDzKC7tLDHmMC/aMSzUMyvRNSnQNirUNivdOTDmPTbrPjfrOjToNzHoNTDiOTLfSD3XSzzTRTfLPS/ENijCMyXINinPOC3ONCrUNi3mQzzfODLgMjHSICDsODnlNjPVMSjSNCnSNCnPNSnONivKNirINSvFNyvjWU7YUkbKSDu+QDK3Oy+1Oy61PDG1PDGvOS2xOy+xPTCxPS6vOyytOSqtOSyuOi2xPDLQWVHcYl3scHD0dnnubXL1cXz2cn3/eoP/f4n/eYD0aHH3ZXD/cXz/dX//a3T4Xmr2T2H/QV73OFfpR17bbnS6nYuZqYSCnm5+mmeBl2iNnHGhqYK0upbIza3V3L3M2bvB1LSyzKmnwp+evJiatpCWsoyQsYaJs4GGtX6NuYSVwIucwo+fxJGoxZmyyKG+zqrJ0rXa2cTm383q3tLp1s/hzMnbxsPUwbvOvbXIt7BaTT1aTT1aTT1aTT1aTT1aTT1aTT1aTT1YSztYSztYSztZTDxZTDxaTT1aTT1aTT1aTD9aTD9aTT1bTj1dTT1eTzxcTzxcTz5ZTT1XTUNXTEhYTk9aUFhdVWJgWWlhXHJqZoFva45zcJt2cad7dbODfsGKg8mKg8eIf8CKfryIebKDcqiGcqeNdKuHbKOGXISQSEykQjm2QTrNQ0DeQD/oOjv0PD7/REX3PjzzPTzsPj3qQEHrQknqQ03rQU7jQUzQPj7FQDm+Pza3PjOwPC+yPDDARDjSTUTHNjHUOzbNMi7MMy7WQzvHPzO1Nie7Piy6NyXBOifDPCnCOyjAOSXCOSbFOifHOijLOifQOSjWNijYMiTaLiLgLyXsNy71PTX1ODL3NDD3MC34Kir7Jij7JSf7JSf7JSf7Jir3ISn4Ii7/Jzf/KD7/ITv/GDb9FzH/JzjvIyzmIyvjKy3dLS3UKyjSLSncNDHiNjLoNjTuNjbyNjXyMTLvLi/uLCzlLyzcOTLROjHSOTHsU0u7IhrEKyPfRj7ILibNLijePDfoRUDiOjfYLyraLiriNTHlPDffPjTVPC7PNSnLMybMNSrNOy7LOzDFOC7sYljgWk/IQzq5Niy6Oi+4OC2xMye0NiqwMCWwMiauMiavNCWwNieyOiq0PC6zPTGwOjC6QzvWXFfscHDxc3b2eHz7eYP1cXz/fIT9d4D6dH38c3v/cn7/cn3/bXj/Z3P8YG70SVz/Plz/PlvkQVbUZWu0lYCSoXqDnW19mWZ+lGOHl2qUn3eepoGgqIOcqISSo3+Ko3yAn3Z6mnF5mm98nXKBoHaDpHWCrXeDs3mLuH+RvISTvoaXvoecvoyivZCnvJOvvZq+wqfPzLnf08fj0srcx8TUv7zMurbBsqu5qqVaTT1aTT1aTT1aTT1aTT1aTT1aTT1aTT1YSztYSztYSztZTDxZTDxaTT1aTT1aTT1aTD9aTT1cTD1dTT1dTjteTzxcTzxcTz5dUEBbT0NbTkZZTkpaUFFcU1hfVV5fV2ZkXHRpYoNuZ5Fxap14cKyAebyHgMSKgcSPgMGQfrqNdKuMbqKXcaShdaiaap6ZV3udPUGqNSuxNSvCPDPTQDjdPjjoPzrzQT31PTv1Ozz0O0DxPkLuQEnoQUniQEvaQUbHPDm9PTS2PDGxOy+rOiyuOiu9QTXQSkHaR0DcQT3UNjPQNTHVQDnNQzi7OSuyNSO9OCfCOyjEPSrEPSrEOyjGOyjHOijKOSjPOSjPNibUMiXaMiXjNSrqOC7vODDwOTHnMSbnLyXqLiXvLCb2Kyf7Kyn+LCv/LS78Ki36JSv6JC7/Jzf/JDv/HDf/FDP8EzD1HjD2Ljn1MzzlKjHbKCzcLjDeMDLbKy7xOj70Nz33NDr2Mjb2LzT4MDP5MjX0ODfbMi3aOzXXODLkRT/kRT/OLyvRMi7BIh7UNTHhPzroRUDgPTjYMy3ZMizdNjDdOjHUOi7POSrJNSfHNSjIOSvKPDDKPDLGOS/tY1nhWE7JQDi6NCvCOTHDOjC/NizCOS+/NSu+NCq9NCq7NSm4Nim1NSi0NiiwNim0OzC7QjnTWVTobGrvcXT2eHz+fIT4doD+fIT8eYH5dn7+dX//c3//cH3/a3f8ZHH9X272SV3/Plz/PlzpQ1nTZWiujneJmG96lWJ1klx4jl1/kGOKlWuNmHCLlXCFlG1wh11siV1oiVxnjV5rj19xlWV5m2l6n2uBrHSEsXaKt3yNu32QvH+TvIKWvYabu4mbtYahs4uttpe+vajPxrfYx7/WwbzPvLjGt7S6rKmypKNcTDxcTDxcTDxcTDxcTDxcTDxcTDxcTDxaSjpaSjpaSjpbSztbSztcTDxcTDxcTDxcTD1cTD1dSz1dTT1dTjteTzxeTzxcTzxfUkFdUUFcUERbTkZaT0tbUE5dUVNdUlpfU2djWHZoXYVrYpFza6R/drWGfb6Jfb2XhcGZgLebdqmecJ6udaK6dqW1aZixUnS4PES+NS26NCvAPDDLQzfTRTnbQzjkPznxPTz3Oj75OkH2PUXvQEfmQUjZQEXPQELAOza4OTCxOSutOSqpOCitOSq7PzPPRjzZRD7XOTbZNzTaOzfcQz3dT0XOSDy1MyO+OSjBOifEOynGPSvJPSzIPCvJOinMOSnPNynPMiPTLyPfNCruPTP0PzbxOTHpNCvgNCbfNSbiMiXlLyTrLCTuKyXxKyjyKyjzKy3wKCvyJi/4KDb+JTr9HTf8FjP4GDP0JTfyMDvzNUHyOEPwO0TwPEXpNT7kLDbwMjzzLzv2Ljn2LTf1LjP1LjHzLzHtNDLcMCziPTnaNjTfOzn/bWrlQ0HRLy3OLyzZOjffQDzgQTvbPDbVNy7WNS3WNSvSNirINifDNiXCNifEOCnFOy7GPDHGPDHFOzHrYFnhVE3JPDO/MCjLOzPRPjbOOzPSPTbYPTjXPDfUPTbPPDLJOzHDOS68Niq2Nim5Oy+8QDbPVE3jZ2Xtb3L4en7/gYj7fIP7fIP7eYH7eID/d4H/c4H/bn3/Z3b7YHD8W231R17/PFr/PlzsRlrOYGGefmV2hVpphFFohU9tg1J0hVh7iF19iF54hFxxglhgek1ff1BhhVVljVlulWB1nGd9oGp+o22DrHKEsnSItniLuXmLuXmNuXqRun6UuoGTsX+VrICbqYaprZK6taLHua7LuLLItrS4rKyqoaKgl5pbSztbSztbSztbSztbSztbSztbSztbSztaSjpaSjpaSjpbSztbSztcTDxcTDxcTDxdSz1dSz1dTDxeTT1eTTteTzxeTzxeTzxeUUBeUUBdT0JbT0NcTkVbTkZcT0ldT09eUF9iVG1kWXtpXolwZ5x8dK2Fe7eIe7OZhbqlhbSvgKq4eqHGeJ/RdZzMY4zITWzcRlLfQUDVQT3PRTvMSDvNRzvTRTneQTruQEH1PEH6PUT4P0fwQUjiQUbSQEHGPzy/Pza2PDGvOSurOiqqOSmuOCq8PjDORDrVPDfVMzHgOznlQT/hRD/oU0zfVUq/OivBOSm+NyTANyXEOynJPSzKPSzLOSrOOCnNNCbSMibZMinlOS/xPjf1PjbwNS7kLybgNineNingNCrjMSfnLinqLSnsKijsKirqKSzoJyzrJzHyKTn2Jjz3ITv7Hj37JUH7NkjkKDbnLjz/UFz/YGz/UFzyPEnzOUfoKTjtKjjxLTn0MDrxMjfqMDHhKyrXKCXYMC3aNzLUMi/lQ0D/c3D1VlPdPjvlR0TbPTraPDnVOjXSODDRNy3QNirNNCbGMyO+NSO5NiS7OCa/OyzAPC+/OS3AOi/FPDLlWFHcTUfKNzDHMCnXPDfeQTraOzXfPDXnPjnpPTnmPznhQDjZPzXQPDLIOi7BOS27OSy7PTHLTkjgY1/sbm/6fH//hIj9foX4eYD4eYD8eYH/eIL/dIL/bn39ZXT5Xm73VmjzRVz9OFb/PFruSFzHWVqKbFJjckdcdEJceUNkeklsfVB0gVZ2g1hygVhvgVdth1psjlxvlWJ1nWh7pGyBqG+EqnGFq3CFrXGFsXSItHWJt3aJt3aJt3aLuHePuXqRtHyPq3uSpHybpIWtq5a+sqTIt6/HuLW0q66hnqWXkplbSztbSztbSztbSztbSztbSztbSztbSztaSjpaSjpaSjpbSztbSztcTDxcTDxcTDxdTDxeSzxeSzxeTT1eTTtfTjxeTzxeTzxeTzxeTj5eTj5cTz9eTkFdT0JeUEVeT0piTlliUWRjVHFkWn1sZZF4cqJ/d6iDdqSUfaeshqvCianOgp7ad5ThbInbWHfaRF/zQlT6RFDvSlDhSUjQRT7LRTzQRjzZRD7oQkLwQEP1QEf1QkjtREffQ0TPQT3CPze/QDe1PS+uOiurOiqqOSmuOCq7Oy7MPzbhRkHiPTvuQkLrQUHeOzbjSkLmWEzVSz7IQDLAOCi8MyPBOCjIPC3JOirLNynQOCvOMCXXMyngOC/pOzTtOjXtNjDrMCvlLCfjMCzjMS3nMTDsMzHzMjX2Mzf3NDj3NjvsLTXqLDbtLj3xMEPzLUb2KUf9K07/M1L0OUzlMz/wQE3/X2z/bHr/V2b1Q1P1PlDuM0TtM0HtMz7pNjzjOTnbODPONCrHLyTLMirHLijQNzLyWVT2XFryWFbbQT/iSEbcQkDUPDfONzDNNi3POC3POSvKNyfCNSO5OCOzOSS1Oii4PS25Oyy2Nim8Ny7GPTXbTkfZRUHONTDQMS3hPjnnQDrjODHnNTHrMjDuMjHrNTLnODPhOjLYOi/QOS7IOi6+Niq6OCvISULcX1nrbmz7fYD/hYn9f4P1dn32d378eYH/eIL/c4P/a339ZHb5XnD0U2X0Rl39OFb+PVrvTF3AVFJ6X0JXaDxZcT9bdkNmeUtuflF0gVZ4hVp5iF93jGF5lWV4mmh6oG18p3GBqnKEq3KFq3CGqW+HrXKIsHSJs3SItXSHtXSFt3KJuHSLuHeQtnuOrHiOo3iZpIKtrZXAuafOwLXSxMG8ucCoqracnKhaSjpaSjpaSjpaSjpaSjpaSjpaSjpaSjpaSjpaSjpaSjpbSztbSztcTDxcTDxdTDxeSzxeSzxeSzxfTD1eTTtfTjxeTzxeTzxdTjtdTjteTzxfTz9fTz9gUEBhUUFiUEZiTlBjTl1fUGVgVXNnYYV0b5d7dJ19cZePdpaug5/Mi6HbgpbmcoXrZHXpUGTpO1L5M0z/PFH7RVLpREvVP0DOQD7RQz/WRULjRUboQkTuQUXtQ0bnREXaRUHLQjq/PzS7PzOxOy2pOCioOSiqOSmwOCq8Oi3KOzPoSUXpPz/rPT7lNzjaMi/eQTruWlD0aFvaUEPJQTO+NSXCNifHOSvIOSvLNyvSOCzRMCbaNi3mOzTpOzTqNDDoLyzqLSvrLS3zNDn1Mzv4Mz38Mz3/MT7+MD39MT35MT71MEHyMUL0NEv1NU71ME72LU//MVj/Pl/mM0j5T1z/YW7/X27/V2b7UGD0RFjpOErzQVHqOkfdMjrSLzLKMi3COC29Oyu8OirEOi/AMijZSkL6a2PdTEfhUEvPOznPOzngTErUQDzKNzDKNy3OPC/NPCvLOinEOyi0OyatOiWvPCmzPi2xOSmvMye6Oi/KRDvWR0HYQz3UNzLXMi7nOzfsOjboMi7tMi3yLC30LCzyLi/vMzHoNzHiOjHaPDHSPjLCNim6NCnFQjrXWFLnamj6fH3/hon+gIT1dn33eH/9eoL/eIL/cYH/aXv7YnT4XW/yUWP3SWD/Olj9P1vwT1+6UU5xWDpTZjhddUVhfElugVN2hll7iF1+i2CBkGeCl2yAnGx9n218pG99qHCAqW+Cqm6DqWyFqWyIq3GIrnGIsHKGs3KEs2+DtXCFt3KJuHSLtXaJrHSOpXeaqISwtJnIw6/YzL7a0czCwsyrscGbobFaSzhaSzhaSzhaSzhaSzhaSzhaSzhaSzhaSzhaSzhaSzhbTDlbTDlcTTpcTTpdTDpeSzxgSjxeSzxfTD1eTTtfTjxeTzxeTzxeTzpfUDtgTzthUD5hUD5hUD5hUDxiT0FlTU1kTVdgT19hVW1nYoB1cZJ8dpiAc5GPdY6tgJTNhpTffofucXn5Y2z6UFv6O03/Kkb/MlH/PFPxPE3gPEXXQEXVQ0TUQkPcQ0XgQkPkQUTiQkTeRELUQz7JQDi+PjO4PjGvOSuoNyepOimtPCq0PCzBPTHPPzffPTrlOTnjMDPiLzLgNDLbOTTmTUX8bGHyaFvZUUPGPC/GOi3IOi7JNyrNNivVOC/VNCzeNy/mOTPoNjLpMS/oLyzuMS/1MTX/MkP/MEX/LUb/KkL/JUD/Iz38IDn2IDj3J0H1K0X1Lk31L1DzK1D0KVT/MmD/QWjzQ1j/YG3/aHX4VmXtS1rxTFzrQlXaMkPrQFLdN0PJLTG6KCixLiSrOCalPyaoQCe4Py68OizdWU3hXVHNRz7NRD7BNjPJOzfkVVHVRkDJOTHIOC3JOizIOSjIOSjEPSmxPyemPCaoOyasPSqrNyisMyi8PTTTTEbWR0HdRUDbOTbcMzDpNzPsNTHrMCv0MS39LC//Ky36Li/0MS/tNC/mODHfOzHYPjLJOS69MyjAOzLPTkjhYV73eXr/iIr/g4f5eoH7fIP/e4b/eIT/bn7+ZXf3XnD1WmzrTGD1SWH8OVf7PVnuTV2ySkdoUTFRZDZcdERmfk51iFt/jmOEkGiGkmqIl26JnnOIpHSEpnR/p3J9qHB/qG6BqW2DqWyFqWyFqG6Hq26FrW+Fr2+BsGyAsmuCtm6Ft3KHs3SHrXSNp3ecrIWyuZrIxq/Xzr3Z0sy7v8qkrL+Smq1bSjhaSzhbSjhaSzhbSjhaSzhbSjhaSzhbSjhaSzhbSjhbTDlcSzlcTTpdTDpdTDpeSzxeSzxeSzxeTT1eTT1eTzxeTzxcTzxgUT5hUj1hUj9iUT9iUT9hUD5hTztiTD5oT0tnTlJiUFxjV2tqZn91dpR9fJx/eJeRepargZXGhJLafYXwdXr+bG3/WVv9REz+L0n/NVL/PFXzPE7pP0zjQ0vdQkjWPUDbQUPcQEHeQEHbQT/YQz/QQTnHPjS9PTC1PzGsOyupOCitPCy0Py67QDHKQTfYQz3ZNzThODXeLi7iMzDmOjbTMCfPNSnrVUf/d2rrW1DRQzfKPDDLOzDJNyrNNivUOjDaNzDfODLlNjPnMzLqMDHtMTL0Mzb9NDz+JTb/Izn/Ijn/Ijn/ITj/Hzb9HTX4HjbvGzLuHznwJULvKEfuJkrxJ03/M1z/RWj/YnX/YGz3V2PxUV3yUF3vTVriQE3UMj3aPUbMNzu7Ly6uLyimNSeiOyibPyacPiWqOSeyOCvSVkq7OzLEPzi+NDG9Mi/OQ0DlV1PVSEHIOTHENirFNijENSXGNSTDOiixPCinOiaoNyWtOSqsNCavMSXCPzXbUkrZSUHhSELeOzbeMi7qNDHtMS/vLSv8MjL+LC/9Ky75Ky3zKyvtLSrmMSrfNCzWOCzRPTG/Mii8Ny7ISULZXFjzd3f/iYv/h4r7gIX+f4b/fYj/doT/anz+X3P3WGz2VGnqRFz1RF71NlXxOlbgTFqlSENeSy1NYzVVbz9ifUp0jFyAlmeHmGyIm26KoHKLpXaMrHqGq3eBqnJ+p218pWl9pWeBpWeCpmmCpWuCqG2Dq22CrGx/rmh+sGmBs2qEtm+JtnOJr3KOrHiZsIStu5i/xanLyrXLzcK2vcWeqrqLl6ddSzdcSzddSzdcSzddSzdcSzddSzdcSzdeTDhdTDheTDhdTDheTDhdTDheTDhdTDpdSjxdSz1eTD5cTDxcTDxbTj1dUD9eU0FgU0JfUj9gUEBiUUFjUkJkUUJkTkFkTEJqTUloS01kUFlmW2xua4Z3e56Aha2JiLKPg6mlh6m+iKDQgpLieX7wc3H6amL/YV75SlfxPlHrOkzuP07vQ1HqQEvmPEflPkbhPELfPD/aPD3WPDrPPjnKPTTBOzC4OiynNiavQTCtPCysNii/QTXMRj3MPTXQNzLaODXcNzHeNS7eNi3eOCrdPCrXOifTNiXZOzDwU0zyWk/ZRTnHOCrNPi7UQjPSOi3UMyvwR0LhLy/uNTrzNj3uLDf/Qk3xJzP6JjL/KTL/KDL5HSf9Iir/Jy/+Jy/wHSbwHin5KzfqIC7sJjfxLUHnIzv/WHLnLUT/XWz/X2n+WmP5VVz1UFfrSE3dP0DNODTLPjfEQTe3PzGmNyaZMiGZNiOaOyefPCmnOC2uNy/CRT+/Oze9MzHENjTFNTTUREPbTEjaS0XRRDvIOjDENCnHNSjLNCnFNSq8PC+zOSytLyOrKB6zLSTDOS/SQzvYSD/kUEbfRT3aNzDdMCrnMCzyMjH5MTP9MTT3LzH2MDH2MDHzMC7yMC7tMi3mNS3dOS/VPTC+MiXAPjG5PTPWX1npc3H/j4/7hIb7h4r/hIz/eIj/aH3/X3f/W3X/VW/4TGb4RWPxOln0O1vmP1nbXWmLQDtWRi1MXjZZdUJnhk13ll19nGN/nWeAoWqDpm6CqG+Ap25/pm1+pWx9pWl8pGh9o2Z/o2V/o2Z/pWx/pm2Bq2x/rGt+rWd/rmaBsWeDs2mHtW2LtHKNsHaOrnyZtImnvZmxwaSywa6msrCNmJ56hYtdSzddSzddSzddSzddSzddSzddSzddSzdeTDheTDheTDheTDheTDheTDheTDheSzpcSzteTD5fTT9eTj5bTj1bTj1cUT9eUkJfU0NdUUFdT0JfT0JgTkRiUEZjT0hlTkhpTUpnTlFlU19nX3RubpB5fqiAh7uHisGelcqji7urf6O5eJDTeYPqfHv0dmr2aWD4XWHzT1rsRlLySFP4SVb1RVDvP0rrO0XkOT/gOjzaOjrVPTjOPzfHPjTAPC+3PCyrPCuqPy2pOCiyOizBQTbFPDTHNjHUPDfSNTDWNS3XNSrYNCjZOCbbOibbOyXaOSfdNi7mQTvrTUThSTzQPi/HOCjKOCnTOy7eOzT2SkbkMDHwNjv2NkHxLjz/QE7vJzTzJCz3JSj7KSz9Kyz8Kiv4KCj2KCj3KyzvJCftJSjqJSz9O0TZGyfwNEP8QVLYJjb/anX/Ymr+WmH8V130T1PlQkPXPDjRPja+OCy/RDW5SDapPiyZLx+QKRqPKBmSKBueLSWwOjbRVFDOSEfDNTTGNDXRPT3rV1XYR0LWRz/QQTnHOS/GMynKNizQNy/ONzDHPTPCOTHCNS7DMi3JNC7RODPYPzneRT3kSkDeQTjaNi3dMCrnMCzyMjH7MDP7MDP0MDLzMTL0MDHzLzDzMC7uMS3nNC3fOS3XPTG/MyS+PC+3PTLTXlfpdnP/kJD5hYj4hYr/gor/dIX/Znz/XHb/WHT/UW/+SWj8QGHzOlrxP1/hSWDBU1x7PzdSRi5NXzladkNlh0tzlVl4nF93nWJ7oWZ9pWl9pmp8pWl8pWl8pGh7o2V7oWR7oWR9oWN+omV8o2p9pmx9qWx9qml8q2V9rWN/r2OCsWOFsGiHsmuIr3CIq3OLq3yQrISQqoeMoot4h4BkcHBSXl5dTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDheSzpfTj5hUEBgUEBdUD9cTz5bTz9bUkNbUUVbUUdcT0dcT0lfUE1jUU9mVFRnVVVnVVVnVlxoXW5saYZzdqN8g7qCisuKjdSYkdegisqqgrS5fZ/PgJPkhIbuf3bzc2r7ZWf3U1ztR1HwRk/2SFL3RVHyQUvuPUXkNz3gNzrZOTnUPDfNQDfFQTS+PzC2Pi2tPi2qPCurOiy4QjbHSD/AOzK7MCnKOjLNNi/QNi7VNyzYOCzZNyjZOCbcOSbgOirdNC3bNC7iQTnpT0PeSDrINSXIMiPZQDLiPjX1SEToMTPyNTv5N0D4NED/RVP4Mj/wKTDrIybsJCf5MTP1LS/vJyfsJiX1MTLrKSr2ODroKzHiKTHrMz3/Ul7vPUv/W2f+XmbxVlzuT1TwTVLqRUndOjvVNzTUPznANizBPzK8QjWzPTGsNy2lMymhLCOcJyCaJR6pLyrHRUPCOjq8LCzIMzXXQUL0Xl3QPzrSQzvQQTnLPTPMOS/UPTTaQDjbQDvbQDzYPTvdPjvjQT/kPj7gOjrjPz3rSUTgQjndPDTZNSzdMivnMS3wMzH1MTL4MDL0MDL0MDL0MDHzLzDzMC7uMS3nNC3fOS3YPjLANCW6OCu1OzDQW1Ttenf/k5L7h4r6g4n9fon/coL/ZHn/W3T/VHH/Tm3/Rmf7PV/0PVzuRWLfVGeiQUhwOzNTSDJRYTxdeEVmh05yk1p1mF50ml94nmN7o2d7o2d5omZ5omZ5oWN4oGJ5n2J5oGF8oGJ6oGN6omZ7pGh7p2h7qGV7qWF7qWB9q2B/rmCHsmqKtW6LsnOJrHSGpneCnnV5k25vhmxTZVlBUE0yQT5eTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTDhgTjphUDxgUT5dUD9aTj5ZT0NYUEVYT0hbUU9fVVRiWFllWF9pWWNsXGZrXmdsYWlsZHFva4JydJp5frV/hsqFjNqMjuGOh9efi9OtisSzgKm9eY7Me4HegXrygnf/c3L/Y2f5VVz0TVT1R1D0Q03yPkfvPELlNjvgODjbOTfUPDfNQDbFQTS8QTG3Py6rOiqtPi2xPTC8RjrMUkfHSD+6NS66MSnIOTHNODHTOzDZPTHbOy3ZNifcNibgOCvgNS3bMivgPTTsTkLjSz3SOizROCrgQjbfNy7wPjrpLzDwMTb3NDz8OEL/Tlr/TFX9PkXyMzjiJCbtLzHqLCzwMjLoKirrLy7yOjrRGhzmMzfdLDLoOUDwRU3/WGPzTVfYPUPaQUThQkbhPkHeOT3cODnYODjTOTfJODPCOTG9OjLAQTrNTkjWVlPQTk7DQ0CyNzK2OTXPS0nZTUzjUVLvWVrqUlHxWVbJNTHOPjbSQjnQQDfTPzXZQjngQzziQDvpP0DnOD3sOT3yP0PvOj/oNTjsPj32TUreOTPbNjDaMyveMyzlNC7sMzDyMjH0MDH0MDL2LzL2MDH1LzD1Ly7wMC3pNC3gOC3ZPzPCNie3NSizOS7LVk/vfHn/k5L8iIv9gYn+eof9b3/8Y3f/WHH/T2z/Rmj/QGP7OVz0P17pS2TYWmiFMzVnOzBXTzhXZ0Nhe0tqiVBzkll0lVx1mF53nWJ5oWV6omZ3oGR2oGF3n2F2nmB4n2B4n2B7n2F6oGN6omZ6o2d6p2Z6p2J6qGB6qF18q11+rV+GsmeLtG6Ms3SKrXOGpnWAnXF0jmlpgGRRY1VEU0w4R0BeTTteTTteTTteTTteTTteTTteTTteTTteTTteTTteTTteTTteTTteTTteTTteTTldSzVfTTVgUDlfUDtcTz5aTkBYT0ZYUUtZUFFgV1xnYGhuZnNzaHlzZ3tzZ31xaH1vbH1wcYZyd5d2fat6gsF/h9KEiuCKi+WTjeOdjNqghL+edZ+gbIKsbnG8dmzSdmnyc23/bGz/Z2n+XmD7Ulf1Rk3vPELqNz3mNTvhNzjdOTjWPTfOQTfGQjW9QjC4QC+tNym0QDOvOjCwOzHIUkjVXFHJTUO7OzC+OTDBNy3MOS/WPjPbPTHaNircNCfiNirgMyziNzDkPTXlRTniRjneQjPeQTLiPjLbMCbqNzLsMC/vLjHxLjT6Nz//UFj/XWT/Wl//T1PhLjHjMDPgLC33RUXoNjbcLCzbLS7rPkDcMjXZMzf/YmjgPULLKjLKLTTBJirVOz3hQEXbNjrZMzffOT3cNzvNLzDMNDPNOzvVR0beUlPsYGP1aWz0ZWvqXmHEQD7GRUDlXlv4aGf/b3D/amrlS0vXPTvJNDDRPjfXRDzWQzvVPjXVPDTYOjHcNDHuNTvxLTfwLDbyLjjvLDTrLDPzOTz+SkvfMy/cMy7aMyvcMyzjNS7qNDDvNC/yMjH0MDL2LzL3LzH2LjD1Ly7wMC3qMy3iNy3ZPzPGOCq0MiWyOC3DTkfvfHn/kpH/iIz/f4n/d4X6bHz4YXT7VG79SGf/PmL/Ol/6NlzzQWHgTmXCV2FwLytfPzBbVz5ebEllfU1riVN0klx1ll92mV94nmN5oWN4oGJ1n2B1n2B1nV92nl93nl94n2B7n2F6oWJ6omR7pWV8pmR8p2B5p155qFp7qlx9rF6ArGGFr2eHrm2HqnCFpXODoHJ7lW5yimpleGVba15SYlVfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjpeTDRfTjRgTjheTzpbTj5ZT0VaU01aVFRfWmFoYnBybYF6dYx7dZF7cZN6cJN2cJJxdJNyeJp0fah3gbZ6g8R+hs+EidqLjN6Wj9yZis2bhbaig6OqhJGrfnmfbFuaUT68TULUUUniV1LrV1XxU1LxS03tPkPlNDrpOTzmOTvgOznYPTjTQDjKQjbAQTC6Py+zOSy6QTarNSujLiS+ST/ZZ1zZZFrLVUm4PDK4NinAMynOOjDZOzDaNizeMynkNi3fMSrkNzHjOzLdOS/ePjDjRjXkQjPfOSvfMSjpNC3wMzHvLS7tKi70MTf/RUr/Vlv/XWL/XGHiOTzjOTzVKyz0SkviODnXLy/bNTfMKCnMJyv4WFrdPkLVOT3RNjq6HyPEKCvcPD7mQUXdNDnZLDLeMTfZMDXNKC7SMzfkS072YWX7aG75Y2z3YGn6YGz4YmvWTEzVTkrqXFrqVlTnTU3jSEbPNDLOMy/ZQTzgS0TkT0jfSkPZQDjXOjPXNi7cLi31Mjr7LTr4Kjf1JzT1KTT4MDr/PkP/SkrgMS7eMyzcMyzdNSzhNC3nNC/tNC/wMy/0MDL3LzL5LjH4LTD2Li7xLy3rMi3iNy3ZPTHJOy2zMSSxNyy6Qz3seXb/jY3/iI3/fIj/cYH2aHj2X3L5Umz7RGP/OV7/Nl36NlzwRmPRTmCiSU1lNStWRDBbWUBebEllfE5riFJ0kVt3lV94mWB7nmR6oGN2nmBzm11ynFxzm1x0nF12nV53nl97n2F6oWJ5oWJ6pGJ8p2J7pl94plt4p1l6qVl7qlp+ql+DrWWFrGuHqW2Jp3OJpXWEnXN8lHJ1iXBuf2xmd2VfUD1fUD1fUD1fUD1fUD1fUD1fUD1fUD1eTzxeTzxeTzxeTzxeTzxeTzxeTzxfTjphUDZhUDZhTzleTzxbT0FbUktcVlZfWmFrZ3Zzb4Z9epeCfqGBfKV9d6N7daV4dqdzealzfbB4gbh7hL9+hsSEicmNjs6Uk82ak8eglb2rm7W8prLJranFppSqiG2cZkqcRTKvQTS2QDTCQjnWSEToTk7uSkvsP0PrPT/pOz3kPDvfPTrZQDjQQDXIPjHBPTC9OjC+PzavNCynMSe7ST/RY1bWaFvVZVfDT0K6PjK6NCnHNyzWOTDZNSzfMivnNjDiMCzjNC/iNy/eNy7gPjHlQzTkPjDeNCXmNCrpMCvwMy/wLi7vLS7yMTTzNzj2QkX2TVL8WV7pRkv2UVfYMzfrRkrdODzmQUXaNzrOLjDRMDXkSEvSNzvQNzq5IyXVOz3bODvlOz7rPEHnNjziLTbdKTLhMTvnPETwTFP9XWX/a3P/anP6YGr2Wmf5WGj3W2b0ZGToWlboV1TYQD3PMTDUNDTTMzPhQ0DjSkXpUkvqU0zhSkHZPzfYOTPbODHjMzPzLjf/MD7/MD36Kjf8Ljr/O0X/Q0j7QULjMS/fNC3dNC3dNSziNC3mMyztNC/xNDD0MDL3LzL5LjH4LTD2Li7xLy3rMi3jNy3YOi/NPjC1MSWxNyyyOzXpc3H/ior/h43/dob+aX3zYXTzW3D3UGr6Q2L/N2D/N2H5O1/sTGa/T1t+ODZdPTBORjFWWEBaZUVjeE1qhVJyjlt2lF55mmF7nmR4nmFzm11wmFlwmVdxmlhxmlh0m1x1nF15nV94n2B4oV95ol56pV55pFx4pFl4pFd5pVZ7p1h/qV+CrGSEq2iGqGyHpW+GonGAmm14kWpxhWlqfmNidl1fUD1fUD1fUD1fUD1fUD1fUD1fUD1fUD1eTzxeTzxeTzxeTzxeTzxeTzxeTzxfTjpjUTljUTlhUDxdUEBaUEdcVFJfWmFhX210cop5eJiBgKiDgbB+frB5ea95dbB3d7V3fL54gMF9hcSCiMSFisGNj7+Xlr6gnbysp7u2rLW+s7HIuKvQvqbWwaLRu5bQrIivb1SuXEekRzWoPjDCRz/gV1HvV1bxTk/pQEPqPT/mPD3iPTvfPTrXPTXROjHJOTDBODDBPDW5OjO4PTXBT0XHWE3HXU/RZVjTY1XCTD68Oi3FOC7SOTHXNC3fMiznNjDmNDDhMi3gNS7jPDPnQzfmQzTiOi3fMyXqNSzmLibwMC3vLyzwMzHxNTTnLS7iMjTnQkb3WF32V1z/b3XlRErrSE3gPEP+W2D/b3XePUL/fYL/bXHqUVTUPkDGMDLWOj3ySEvuOT7wNz/4PUbyN0LoLTj0Pkr/XWf/bXf/anL/Y273XWf6Xmv/YW//XW75WWXyXF3jUEniSkfVNzTSLzDZNTTSMC7YOTXfRD/jSkTiSUHZQDjTNi/WNC/cNzHoNjbqJy/8MDz+Mj33Kzb5MDr/PkX9P0HsNDTiMy7gNS7eNi3fNCzhMyroMyzvNC/0NDH2MDH3LzL5LjH4LTD4Li7yLy3rMi3jNy3XOS7RPzK2MCWyNiywNjHocG//h4j/ho7/cIL8Y3jxXHD0WG73T2n7QmL/OWH/PGT2QWLkUmewUVdkLydXRDNHRy9SVDxVXj9idExpgVFxi1t2kl96mGJ8nWR4nF9ymVpul1Vul1Vul1VvmFZymVp0m1x3m113nl13nlt4oVt5o1t3o1h2old2olV3o1R5pVh6pFp+pl+BpmN/oWR+nGZ7l2ZyjF1pglhgdlJab1BSZ0hcTDxeTj5gUEBgUEBfTz9fTz9fTz9hUUFiUkJfTz9dTT1dTT1hUUFjU0NiUkJgUT5kUz9hUD5dUEBeUUlbUVBaU1plYXBzcYl5eJp6fKV+gLGAgbl9f7p4erdyc7Rsb7Z0d8h2e8yAg8qLjcaWl8OkpL6ysLu8ubTLxrPTzLDZz6zbz6fcz6Pd0KPZy5zZwpjRqIi4gGegXkbLemfWdWW9SD/XUU73Y2PpS0zlP0HiODnkOjriOjncNzXZNjHWOzbLODHANS7HQju7PDO/ST/GWEu5T0HOZFbRY1TMWEnFRznEOi/NNi3YNy/hNi/jNC/fMC3fMizgNzDkPTTgPDDdNynfNSjlNyzkLyTqLybsLynuMS3uMjDrNDDoNTHiNjTXNznmSk71WV3tTlPXOD3XNjz5WGD/foT/fob/b3X/Z2//aXD/Zmz1XGHxWFv7Wl//VVr/REv8OEL7N0H2Mj7uKznsMD7xPUj/U1//YGn/Z3L/ZXD+Ym3/Y27/YG/9XWftU1PfRkDWODXWNDHXMTHXLy7YMzHbOTThRD3cQjrZPzfWPDTXOTDbODHgOTPmNjbwNzzzNDvzNDv2NDz1NjvyNTnrMzPjMS/eMyzeNS7fNy7gNSvkMyvpMizvMiz1MjD3MTL4MDP6LzL5LjH5Ly/zMC7sMy7lNy7gPzXMOCy/NiyvLya4OzfSWFf/mJr+e4P/bYD/ZXz4XHLwUGj0R2X8Q2X/O2T5OWD1TmzTUmSJPT9QLCBDOyZDRy5LTTVZX0NaakVjeE1xiFp4kmJ4lmB0lVxylllxmFlslVNtllJul1NvmFRymVh0m1p1nF11nFt0m1h0nVd2oFh3oVd2old2olV1oVR0oFN7pVt7o116nl51l1tti1Vifk1YckNTaj5BVzA/VS88UixbSzteTj5gUEBgUEBgUEBfTz9gUEBhUUFiUkJgUEBfTz9gUEBiUkJjU0NiUkJgUEBmVkdfUUZcT0deVFNhWmFkYG9ta4N2d5Z3eaJ7fa59f7h4fLlxdbVrcLRsb7Zucb51dtB8ftWJidOYmM6op8e4tsHJxbrTzrHb16ri26Xn3qXm3aLk26Ti2KPb0aDUx5vTvJq7nICpfWTFi3fKfW20VkrSYVv2cnDsWlvnS0zjP0DnPT7rPkDnOzviNjbbNjTWPTjJODPKPzi5Ni64PjO9S0C2SDvIXU3db2DUYFHGSDq9NSnEMCbUNi3cNS3bMCniNTHlOTXkPTfgPDPcOC7bNSnfNCrjNSrsNy7tNSvtMivrMCvnMCzjMizhNC7dNTLWODfYPkDkSkzzV1v6XmL8XGT+XWX/YWn0U1vvTlbxUVn/X2f/anH/Zmz1WmDzTlTtNDrxLDX0Kjb3LTnxJzXlIS3mJzbtN0P+UFr/WmT/Ymz/ZG3/ZW7/Y239W2j1UVrlRUXePDfbNjTeNjPfNTXcMzDaMi/bNjLgPjnbPjfYOzTXOjPbODHfODLlOTXnOjbpOTvqNzrrNzruNznuNznsNjXlMzHfMizcMyzdNi3fNyziNizlMivqMSzyMSz1MjD3MTL3MDP6LzL5LjH3Ly/zMC7sMy7lNy7fPDPUPTLCOC62MSq3NzTYWlv/kJP7c33/Znr/Xnb5V2/3T2n5Rmb7P2L8PGP0QGPlT2i5S1Z4OzhMMiM8OiM8QihFRy9PUzhWZEFgckpug1h1j192k110k1hxk1ZwlFRrkk9rlFBslVFtllJwl1ZymVhzmltzmll0m1h1nVd1n1d1n1d0nlRynlFxnVJwnFFumFBslE5ojExigUZYdT9OaTZGXS9AVytAVy1AVy1BWC5ZTDxbTj5eUUFeUUFeUUFeUUFfUkJgU0NhVERgU0NfUkJgU0NhVERhVERgU0NeUENiVU1cUU1bUVJjWWJrZHRxbYR2dZV5e6R5e6x5frZ4fLtuc7VlabBgZ69qbrhydcZ9fdeHhN2XlNupp9i7uc/Lysjc2L/l4bTp5Krt6Kbw6aXt5aTn4afi26fXz6HLw5y4r5Cpm4Gbg2uog3Cnb2CcUke6XVXdbWn3dXXvX1/kSkzlQETrQUTsPkDoODriNjbfPTrUOzbUQTrCNzC3Nyy3PjOuPS+2RjjbalzfaVvZW03KQjbFMijRNCvZNi3ZMizeNTLpQT7sR0PgPTbVMinVMSfaMifeMCXmNCroMSnnLinmLynjMiziNy/hPTTgQjnGLSjKNDPcREPwVlj6XmL3WmHzU1vxUVvoRlHqSFPvT1n8XGb/bXb/bnT0WV/jPkTpLjX0LTT7Mjz8Mj71KzntJzT2NkX/S1f3SVP1UFf4V1/+Xmb/Y2v/YGn3UlnpQkneOTfeNzHjNzXpPDjrOzvmOTXhNTHdNjDdOjPZOzLXOTDXOTDcNzHhODPnOjbpPDjjOTnjOTnlOTfnOTjoODjmNzThNDDbMivaNi3bNy3eOCziNiznMinrMCnzMCz3MTD1MTL1MTP4MDL3LzH3Ly/yMC7uMy7nNi7dOTDcRDnHODC7NC61Ly7kX2L/g4j4bHf+Ynj+V3P6UG3+TGz/Q2b2Ol3zO1/sSWbUU2edREpsOzRPPiw9PCc6PyhFRC9GSDBRXDxZa0VnfFFyiVt0j1pxkFVtj1Jrj09pkE1pkUtpkkxrlFBtllRul1Vwl1hxmFd1nFl1nVd0nFVynFRwmlJtl01rlU1qlExljUdhiEVbf0FVdDtMaTNFYC1BWCo+VSdCXC9FXzJJYzZXSjpaTT1cTz9eUUFdUEBeUUFfUkJhVERgU0NgU0NgU0NhVERhVERgU0NfUkJcUERaT01aUVZiWGNqY3NxbYZ2dZV4eqN6fK13fLRzebdtcrRiaa9dZKxhZ7Fscr54e8qJid+VkeWkoeS2teHHxNnV0c7h3cTn5Lnr5q/u6q3u6Kzp4qvj26ra06nLwqG7tpmlpY2bmYSTiHaYgXGZcmObYlezaWDPcm37i4n1dXTqW13mTE7oQ0ftQETsPD/pOzzfOjjbPDjeRT/TQzvDOjC6Oi+wNimnMSO/STvbYVLqa1zbU0XJOizMNCfUNivXNC3ZNDLxTUv+WljtS0bZODDWMyrbNCveMijfLibhLCXhLCXeLSXcMSnaNizZOzDXPzTCLyfENCzOOjbZQ0LfRkjgRUnkR07qTVbxUV32VmL4WGL5XGX/Z3D/bXX0WWHeO0DqMTfxLjTyLTbwKzTrJTLsKDT7PUn/U1/tP0noQUnqR0z0UVb/WWD/WF30R03kNjjhNTPkNzPqOzjyQD70QD/vPTvmOTXgNzLdODLaOTHZODDZODDcNzHjNzPoOTbpOjfiOjfgOznjOjfmOjjnOjblODTgNS7aMyvaNizbNy3eOCziNiznMinrMCnyLyv2MC/0MjL0MjP3MTL2MDH2MC/yMC7uMy7nNi7cOC/gRjzJOTG+My62LCzuZmr/eYD4Z3T/Ynn9VHH+S2v/R2r/PmPyNlnrPV7jUWjEWGWIQkJnQzdbTjtHRjFBQy1KSDNFRS1MVTZTYz5idExsg1Vwi1hujVJrjVBpjktnj0lokEpokUtqk01rlFBtllRvlldwl1Z0m1hzm1VxmVNvl1Bqk01nkEpljkhkjUdgh0RdgUFXeT1ScThNaTZMZjZOZTdPZjhMZjdPaTlTbT5VSDhXSjpbTj5cTz9dUEBdUEBfUkJhVERfUkJgU0NhVERhVERgU0NfUkJfUkJeUUlWTVJfWGhuZnt0cIl4dJd4d6F4eqt5e7RzebdqcrNgZ61bY6tfZ7Bqcrt2fMaAhM6TleCenuStrue7vebLyd/U09jd287h38bl4b7m4rzk37ng17ba0LXOxrG+taatp5uYmoyMjoCJhXmKfHGRdmubc2mobWW6b2nmiYTugX7zc3LxZWTxV1nwTU7uREXsQEDjOjfgOzfkQj3eRT/MPDPGPTPEQjWvMSOuMCLHSTvcWEvWTkDMPS/OOCrQNirRMyrWNDL1VVX/a2j6XVjjRD7cOzPfOzLjODDiNC3jMiziMSvdMCnUMCfNLyTGLyTCMCPFOSzANCfBMynLOjXXQ0HbRUfbQkfaQEjgRE/rT1ryVmHyVmH6Xmn/Z2/zWWHhQkfqOjztNTftMzjvMjjxMz33OUP/SFP/Vl/kNj/dNDvfNjvrQUT5Sk/8SU30O0HpMTPoNTHrOTXvPDjyPDnzOznwOjfpNzPiNzDfOzLcOzHbOjDcOTDfODLkNzPoNjTpNzXmOjjkOzjmOjjoOjnoOzfmOTXhNi/cMyzbNy3cOC7fOS3hNyrlMynpMSnxMCn0MS3zMzLxMzP0MjL0MDH0MS/yMC7uMy7nNi7eNy/gQzrKNzDAMS3AMTP3anD/cXr6ZnT7XXT6UG3/Q2b/PWT/OWP1OF7mRWTZWm2rVlt3RT5kSj1hWUZUTztLSTRQSTZHRS5HUDNMXDhabEZmfE5thVNtilJsjE1ojUpmjkhnj0hnkUlpkkxqk09slVNulVZvllV0mVZzmFVulVJqkkxmj0tjjEhhikZfiEZagUJYfD9TdDtQbjhPazpSbD1XbkBacUNVbz9WcT5XcUFSRTVVSDhYSztaTT1bTj5cTz9eUUFgU0NgU0NhVERhVERhVERgU0NgU0NiVUVhVlBeVmNqZXx5dZB9eZp6eaF4eal2ebBzd7RqcrNjarBbY6tdZa5ocLl2fseBh9GIjNOZnd2jpeCvs+O7v+XGx+PPzt7U09jX1tHZ18vZ1sfX0cXSycDMw77Fubm0qKyjmp2Ki4Z4e3R5dnF1bGV/bGWNb2eOYVudYFvAc23YeXXwf3v8fHn/cnD9Y2P2U1TwSEfvQz/qPjrhPDbgQTvROjHTQzrdVErCPjK4Nim9OSzCPS7IPy/PQjHXQzXWQDHRNy3QMi/qTE36X13yV1PfRD/ZOjTbODHgNzDmOTPnOTLnOTLiOjHaOS/ROSzKOCvEOCmwKBi4MyLIQDLTST7SREDLOzrMNzvPOkDRN0HiSFLtVl/wWWL1Xmf3YGnqVVvcQUXlQD7sPzvxQUP6R0r/TFT/UVn/VF3/Vl7hNDraLzXcLzPnNzr0PUH4Oz/3NDjzMTLtNDLvOTXwODbtNDLrMjDqMjDnNDDhNC7jPDTgPTTfPDPeOzLhODPkNzPoNDPoNDPoODjnOTjoODjrOTnrOTfpNzXiNS/eMyzbNy3cOCzdOivfNyrjMijnMCjvMCjyMSzxNDLwNDPzMzLzMTHzMS/xMS7sMy7nNi7gOTHZPDPMNzHBMC3RQEP/bnX9a3X5YnHwUmn1SGb/O2H/NF7/NmL7PmTkTmnKXGmLR0ZqRjpdTDxdVkNYUT5SSjdPRzRJRC5ESi5HVTJTYz5ec0hnf01qh09qiktnjEdnjEZmjkdmkEhnkEppkk5rlFJtlFVtlFVxlVVvlFFqkU5njktjjEhgiUVfiEZehkdcgkVbfkRXeEFWcj9Vb0BZcEJdckdedUdbc0NZdEFYc0BOQjJRRTVVSTlXSztYTDxaTj5cUEBeUkJhVUViVkZiVkZhVUVfU0NhVUVmWkpoXVluZ3d1cI58eJl7eaB3eKZ2d61wda9qb69haKxeZq5fZ7BlbbZweMB9hc2JkNiPl9iZoNahqNaqsdu0ud+6v9/Awd3Dw9vHxtjGw9TFwdDBu8m8s8S7sMG1qLymmK+Wi5yIhYxxcXF0cG9wZmV3aGWGbmqEX1mVZF+bWlS5ZmDZc27wenb/e3f/d3P/aGb8Wlf+Uk71SELmPTbnRD3YOzTbRz3qXFLFOzDEPDC9Nyu+NijHPi7RRDPUQjPUQTHXQTPSODbYPj7dQ0PcQkDWPTfVODHYNy/eNy/lOjPmOTPlOjPiOzPbPjXVQTXRRTjMRzauLRi8OyXNSjjRTD3GPTW7MCvAMDDKOT7XQUrhS1TrVWDwWmXwXWXsWWHfTFLUPkDPNC/YNy/gOznqQEDyQ0j1RErxQknuP0biNTvfMjbjMzbvODz1Nzn4MTT7LzL8MTTvMjDwOTXwNzTsMC7oLCrnMCzmMy7gMyzkPTXgPTTgPTTgPDPjOjXmOTXqNjXsNjXsNTfsNTftNTfuNjjuNjbrNTTkMi7eMSveNy7dOS3dOivfNyrhNCbmMSbtMSjxMSzwNDLuNTPxNDLyMjHzMS/xMS7sMy7nNi7iOzPSNCvSOjXGMjDnVVj/cHj5Y27yWmnnSWDzRWb/OGL/L13/NWL/QmjcTGWxUFlqNS9eRzdYSzpVTjtbUD5WSThNQDBKQzBARixBTy5LWzZYakBieEdmgUpoiElmi0ZlikRji0JjjUVljkhnkExokU9pkVJrklNuklJskFBoj05ki0phikhfiEZfh0hfh0hfhUhfgkhdfkddeUZdd0hgd0tjeE9jek5ddUNbdkFadUBKQzNNRjZRSDlUSzxXSz1ZTT9cTz9eUUFkV0ZlWEdkWEhiVkZfVUlhV01nXlVsY2Z3col5dZp4dp50c59ycqR0da1scK9iZ6laYalfZa9mbLhtc792fMiBh9OPk92XnN6bodWgp9Oprdqus92xtN2ytNu0tNq2tNu1sdazrdGup8mrocSqnsKkmLyZi6+Ifpl8eIZkYmdpZWZjWVpqW1h7Y195VlCSY12KTkaiVU29YFjWa2Pxd3L/f3r/enf/bmr+YVz3VE/pR0LuT0ndQj3eR0DqV0+6LCK+MSe+NCfHPi7RRTbLPi3BMiLKNyfbRTfeRT/TOTfMMy7NNTDUOzXXPTXdPDThPTTkOzTkOTLeNS7XNCvPNSnKOCvFPCzCPy3UUz7IRzK9PCm+Oi3DPTLEOzXCNzTCNDPcS07eTVLhUFXlVFnoWV3lVljcTU/TREDJNSvRNyvYNy/dNTLiMjTlMjbmMTjmLjbsND7sMzvzNT/7OUL9ND76KzX/KDP/Lzn4LTP5NTf5NTnwLi/rKivpMC7oNTHiNS/jPDTgPTTgPTThPTTkOzbnOjbrNzbuNjbsNDbrMzXsMjXtMzTtNTXqNDHjMS3bMCjeOCzdOivdOiveOCjgNCbjMyTpMybsNCruNTDuNTLwNDLwMy/yMi/vMizsNCznNi7kPTTNLybXPjnMMzX5Ymf/b3n3W2nwTmPqQ135RWj/OmX/MF3/NmH2R2jJSl2TQ0ZSLCNWSThTTDpPSDZbTz9VSTlGPy1IRjE+QidASihJVTFTZDpfckVlfUlnhEpliEhjiENhiUJiikNjjUVljkhmj01oj1BpkFFskFBrkE1mjUpjiklhiEdgh0Zgh0hghklegUdef0ZffUdgfElhe0tke01mfE5mfk5deENdekBee0NEQjZGRDhKRjtQRz5SSD5XST5dTT5fTz9gUT5hUj9gU0JfVkdiWVJnYl9vam5zb353cZN6dKB8eah5d6lwcKZnZ6NgYaJcX6RgYq1maLVvcMB5esyEgtaNi9+Wkuecmeagnt2hodejo9mkpNqmo9ilotelodSkoNOlntGjnc2imsmimciflsOZjbuOgrCDfJ5ybn1pZ2xkXmBmWlprWVVyV1B9V06MV0+VUkmoWlC1WFDBWlPYa2TseXL5gnz/i4b5dXH/dXPtX13fUEzZRUHvWlTMNzHFMirENirDNyjANyfDNybGOSjKOyvQPC7VPzHSOC7WPDLXPzTTOzDNNSjNMyfYOi/iQDXgOTDhOTDeNy7XNyvPNynJOirGPyzEQS/CPS7GQDTLRTrNRzzMQzvFPDS7Miy2KybHPDfQRULZT0zgVlPjWVbhWFLYT0nQQzrMOyrTOijcOCziNS7oLi/sKjLwKDP0Jzb6LT76Kz/7Kj/9KT//KD//Jj//JDz/JDz/JDj/Jzn/Kzz+LDnzKzXtLjXoNDXnOzndODTdOjPeOzTgOzXjOjXmOTXpNzPrNTTrMzXsNDbrNTTpNTTnNTPiNS/dNSzbNSncOCzbOSrcOSjeOSbfOCbiNyXjNiXmNCbsNS3tNC/wNTDxNC7xNSztNSvqNSrlNyzgOTDYNy/VOjbbP0L/bXf/YnP7U2r1SWP/S2r2Nlv/Nl//PGf4PmPnTmqvSVZeJCJELCA/OidIRTRQTTxQSTlFQjE+Qy8/Ry9CSCZFSyVLUy5TXThba0Rhdktkfk5kg0pihkZgiEJhiUBji0JljUZokEpskFBtkVFskUxpjkhnjEdmi0hmikpliUljhUhhg0dkg0pkgUlif0djfkdkf0pkf0hlfkdhfUNbezxcfz1fgkI9PzQ/QTZGQzxKRT9QRT9URz5bSz5dTT1gTztgUTxeU0FeVkljW1hoY2lubHlzb4Z0cJV2cJ50cKJwbaJnZp9hYZ9dXqFcXKRlZLBrarp0csV9e8+GgtmNieCUjuaYk+WbltmcmNWdmdaemteemNadl9WcltSbldGeltGclM2ck8qbkseakMSTibuIf66CeJ10a3xtZGlmXV5mW1lpWlNvV017VUqKVkuaVkuwXFK6WVLBWFLTZmHgcWrjdm/tfnf9h4X/h4X3dXPuZ2TjVVPrWlXHMizCLyXFNynDNybANyXBOCbEOCfIOyrPOy3TPS/VOSzVOSzTOizSOizROSvROSvUOCvYOCzfOzHgOTDcOC7WOCzPOSrIOSjBOia+OSa+NirBODDGPTXJQDjKQTnIPzfFPDTCOTG/NC3HPjbRSEDYT0faUUnXTkbMQzvDNyrKNyXTOCTdNynlNCztLy/0KzP5KTf9KDr/K0D/KkH/KUH/JkH/I0D/ITz/Hj3/HTr/Hzr/IDn/JTv/KTv3LTnwMTnqNzrlOzvcOTTcOjXeOzTgOzXjOjXmOTXpNzPrNTLrMzXsNDbrNTToNjTkNzHfNi/cNSzZNSnbOSrbOSrcOSjcOSbeOSbfOCXhOCXjNiXnNSvqMyvrNCzrNSrrNSrqNijkNynhNyrfOzHVNCzTNTTzVFn/ZXP/W3D1R2L/SWj/QWT/O2D9M1v5O2HyTW3NTGKJOD9TKiRBNSc2OSg7PCxCQDFEQTBAPy09Qi4+Ryw9Qx1LUCdcYjxlb0podlJlelFkfk9kgkxhg0ZhhkFhiUBjjEBnjURpjkhrkE1skU5skUtqkEdojUhmi0ZnikpmiUlmhUpkg0hmg0tkgUlkf0hkgEZlgUdlgUdmf0VifkFdgD5fhD9ih0I2OS46PDE/PzdEQTpLQjtPRTxWSD1ZTDxeTzxcTzxcU0JeV01jXV1oZWxvbXtzcYlzb5Rxa5lqZphjYJVcW5RaWphcXaBcX6ZoarVub793eMp/gNKGhNiKiNyPi+CRjt2TkNOTkdCTkdCTkdKUj9GTjtGTjNCSi86VjM2Ti8eUi8SUi8CTi76MhLODeqWAcpV8ZXd1XmZpW1tkW1ZkW1JmWEtyVkiEVEijWlG9YFnJXFnPWVfbY2Lha2nfb2vjdnH7ioT/iob/hYH/fXn3bmjuYVjENCvAMibEOCnBOifAOSbAOSXCOSbGOyjMOivQOizWOi3TNSnONSfQOCrUPi/UPi/ONijLLyLaOi7aOC3ZNyzWOCzQOivJOinCOSa+NyS9NSnANizCOC7EOjDHPTPKQDbLQTfMQjjHOjHKQDbPRTvQRjzSSD7RRz3KQDbFNyvMNiXWNibfNyznNC/xMDP2LTX7Kzn/Kjz8Jzv8Jz37JT35Izv7ITr6Hjf8HDf+Gzb/Hjj/Hzb/JDj9Kjv3MjzxNj3rODvkOjrcOTTcOjXeOzTgOzXlOTXnODXpNzPrNTLtMzbuNDftNTXqNjXlNjHhNi/cNSzYNCjaOCnZOSnaOSfbOCXdOCXeNyTgNyThNiXhNSfiNCnjNSrjNijjNijhNyjeNinbNyvdPDLQMSvYODj/a3L/XW7+UGnxPFv/SGz/N13/PmX5NVvuPmLmVnGqP1FhIyhMLyk7NyswNyczNyY5PClAPSpBPChAPilCQiY/Rh1YYTRzflSAjGR3h2Bof1NhfUxhgEdgg0NghT9hiUBjjEBojkVqj0prkE1skU5uk01rkUhojUhnjEdoi0toi0tmiExkhkplhEtkg0pjgEZkgUdmgkhmgkdlgUZigEJjhkRlikVojUgyNSo1OC07PDRBPjdHQDpLQjtSRTxWSjxYTDxZTT1ZUUReV09jXmJpZ3JvboByb4xybZVqZ5RgXo9XV4tUVY5XWJhcX6JhY61sbrtyc8N7fM6Cg9WIhtmKiNuMiNyNitePjtKPjc6PjM+Oi9CPidGOiNCOhs+Nhc6PhcqOhcaPhcGQh7yPh7aJgqyAeJ1/b4yAX3B8WWBsWFlkW1ReX1FfXElqV0Z9U0WeVUy+XFnQWVvZWFzkY2fna2vhcGzleHPsfXbtenP+g37/hoH/gXv1a2HJPDLEOCnCOyi/Oie/Oya+OiXBOibFOifIOSnOOCrYOi7UNirONSfOOCnRPi7RPi7LOCjHLyHSNinTNSnSNCjSNinROSvNPCvIPSrEOynEOi3EOi/GOTDGOS/HOjHIOzHJPDPLPTPTRDzTRTvQQTnLPTPLPDTPQTfPQDjOOzHONSfZNSniNS7rMzHyLzX3Kzb5KTf8KTr5Jjn3Jjv3Jjv4Jzz7Jjz9JTr/JDr/Izr/Ijf+Izf6JTf5LDv3NT7yOT/oODrgODfcOTTcOjXeOzTgOzXlOTXnODXpNzPrNTTuNDfuNDfuNjbqNjXmNzLhNi/cNSzXNSrYOCrYOCjYOCjZOCbaNybcNyTdNiTdNiTbNSXcNijdNyfcOSjcOSjbOijZOSnXOivXOjHQMy7rSEv/b3n/Vmr4RF/4PF//QWf/M1z/OGL4PmPoTWzFT2WAMD1KHSBDMS0xMScuNic0PSw9Qi5CQCtCPCRFPiRIRSRVXDBwfk2Pn3KXqHyDmG1qhFdfe0pdfkVfg0NhhkBiikFmj0NrkEpskUxtkk9tkk9vlE5skklpjklojUhpjExpjExoik5niU1mhUxkg0pkgUdlgkhng0hohElmgkdkgkRnikhpjklskUwtMyczNis4OTE8OzZCPTlHQDpNRD1RRz1TST1TSz5VTkRaVVFhXmVpZ3Vta4Fsa4pqaJBiYI9YVohQUIZRUY1YWZpgY6pmarRvcsF1eMl8f9CChdaGh9mHiNiKidmLitaLjM+LisyKic2Jh9CJhdGIhNGKg9GJgtCMhM+LhMiNhcGNhrqNhrCHgaV+d5Z/bYWEWWqAU1puVlRjXFJaYU9aX0hlWkR4VUKSTES4VFLQU1fbUlnlXmToZWrja2zmdXHkdW7ib2j3fnb/gnv/h370bGDJPzLBOCjAOyi/PSe/PSfAPCfCOyfFOifHOCjNNynYOi/ZOC7SOCzPOSvMOivJOirIOSnJNyjPOSvRNyvSOCzRNyvPNyrMOCrLPCzLPi3KPDDJPTDKPDLJOy/IOjDGOCzFNy3FNSrQQDfQQDXNPTTJOS7LODDOOzHNOjLMNSzQLyXZMCnkMjDsMjX0Lzj5LTn7Kzv8LDz8LT/7Lj/8L0D8L0D+L0H/Lz//LT//LkD/KTn8KTj3Kzf1MDrxNj3tOD3jNzfcNDPcOTTcOjXeOzbiOjflOTXnODXqNjXsNDTxNDjxNDjvNTbtNzbmNzLhNi/aNizXNSrYOCrWOSjWOSjYOSbYOSbZOCbaNybZOCbVOCXVOibWOyfVPSjUPSjUPSrUPSzUPC7RNy/aOzj/XmX/YXH/UGn3PFv/QWn/NF//NGD7MVn0S2zbWXGVPk5aJS1DKSw6Mi8tMCkwOCs3QC86Qis8PCJBPB5VSChgWzV7hVOQo2yqvouovo2OpXdvi1thf0tef0ZghERjiEJljURqk0dvlE5wlVBvk1Nvk1NvlE5skklpjklnjEdpjExpjExpi09oik5mhUplhElkg0hlhElnhUlohkhnhUdlhURpjklpkUtslE4rMSUuNCo0NzA4OTM+OjdCPTpIQTtLRDxOSDxORz1PSkRXU1JfXmZmZXVnZ39nZoZiYYlbWYpRUYVOT4dSU5NbXqNlabNsb751d8p6fNF/gdaDhdiGh9mGh9eIh9WJidOHiMuGh8iGhcuFg86FgNCFgNKHf9KHgNCNhdKMhcuNhcGMhbiLhauEf517do18anqEVmOBUFZuVVFkXlBbZU1YYkliXkVzWEOPT0W0V1LQVVraU1rnXGPoYWflZ2rocG/seXLmcWj3fHTzc2r+eG3mXFHEOyu+NSPCOyfBPSjBPSjDPCjEOyjIOynLOSrPNyrWNSvYNy3UOi7OOizHOinEOCfGOinKPSzPPS7WQDLZQTTWPjHOOCrINCbKOCnLPCzJOizIOizJOy/JOy3KOi/IOSvINSvHNSjKNizPOy/SPjTTPzPWPzbVPjPONy7JLCPSKyXcLSrnMDLwMzn2MTv6MDz9MD/9MD/5MED3MUD3MUD2MD33Lzz3LTn6LDn6Kjf9Lzz5Lzv1MDrwMzrtNjvmNjnfNTXZNDLcOTTdOjXfOjbiOjflOTXnODXqNjXsNDTyNTnyNTnwNjftNzbmNzTfNi/aNi3WNirVNyvUOCnUOCnUOSfVOCfVOCXXNyfUOSXQOSTOPCXPPSbPPyfOQCjOQCrQPy7SOzDRNjHrSEn/ZnL/T2T/SGb7N1v/QW39L13/N2HyNFjjUGq8VWZtMTlFKCpFNjk3MzI1NDA2OTA2PS0zOyMzOBhDQx1qYTqFgVSfrnepwYe1zpevx5OSrn12lGJlhlFggkZghUJjiEJnj0ZtlkpymE9yl1JxlVVwlFRvlE5skUtojUhmi0Zoi0tpjExpi05pi09nhktmhUplhElmhUloiElpiUhph0dmhkNqj0prk01ullAoMCMrMScvNC0zNTA3NjQ8ODVAPThDPjhJRTxIRTxLSENSUFFbW2VhYnRiYnxgYIJfXohaWIpUVIpUVJBcXaBnabNwc8R2eM17f9h+gtuDhN6Eht2EhdiDhNaFhNSGhdGDhsuChciDg8uCgc2DgNGFgNSIgNWIgNONhdKLhMiLg76Lg7KJgqSBfJN3cIB2ZW9+VVt8UFFuVU5mX09dZU1aZElhYUdxXUWJVEatXVTIWlvUVlriW2HmXWTpYWXubGz1enPtcmr3eG/eWVDlW1DSRDjDNSfHOinFOifEPCbFPSfIPSjKOyrNOirQOCrUNirTMCfUMynSOCzNOyzHOyrCOyjAOyjDPCnIOyrVQzThSz3eSDrTPS/KNCbJNSfNOyzIOSnIOSnIOSvIOSnKOCvKOCnLNyvLNynNNivSPC7XPzTYQDPaQDbbQTXXOjHSMSncMC7lMTTuNDn1Nj75ND75MT76MED4Lz/yLjzvLzztLzntMDfvLTXvLDLyKzLxKjH1Mjr1MzvyNTvsNTnlNTfhNTXeNjXcNzXcODbdOTffOjbjOjfmODfpNzfqNjfsNDb0NTr0NTrxNzruODfmNzTgNzDaNi3UNirTNyrROCrQOCrQOSjQOSjQOSbROCjQOSbLOSLIOiLIPiTHPyXIQCjIQCrMPS3POzHXOTb8VVz/XnH/R2P/P2H/OmH/N2f+M2L7OGDtRmTFTmGJQElTMTJBNjRAOjw6NDY/NTY8NzE3OSs0PSI5Qx5TWi6CglCip3GxxYqvy46wzJKmw42Srn17mWVniFFfgUVeg0BjiUBpj0RvlUpzmVBzmFNxlVVvk1Nuk05rkEpnjEdlikVnikpoi0tpi05pi05miEtkhklkhklliEhnikpoi0lpiUhmiUVqkkxslk5vmVEmLiEoMCUtMisxMy4zMzE3NjQ6OTU8OzZHRD1ERDxHRkJPT1FaWmRfYXBeYHlcXH5gX4lcWoxZWJFcXJpnZ61xc8B6fNF/gNyBhOGCheSFhuOEheGDg9uBgtWDgtKDgs6Eh8yDhsmEhMyDgs6FgtOHgtaKgteMg9SNhdCMg8SLgreKgquFf5t/eIhzbnVxYmV2V1V0U0xqVktmX01iZk1fZUljYkZwXkZ6UT+dW023WlPFU1LXVlriV1zqWWDyY2X3cm3xbmb3cWjRRDvUQTfFMSXINCbUQzLHOSXHOibJOyfNPCnQOivTOizYOCzZNyzPLCPOMCXONinLPCzHQC3BPiq+Oye8NyTANCPRQjLjT0HkTkDYQjTLNynLNynQPi/KOyvJOirHOCjGNyfINifKNijOOCrQOCvTOy7VOy/VOS3SNirVNyzaPDHdPDLcNzHoODjxOD33OkH7OUL6NEH1LzzyLDvvLDrtLzvqMTnqMzjrNDjtNTfxNTb0MzbzNTfwMzfvNjvtOTzpNjniNDXdMzPfNzbgOzndODbeOTfhOTbjOjfmODfpNzfqNjfsNDb0NTr0NTrxNzrsODnmOTXfODLYNy/TNyvQOCvNOirNOSvMOyrNOirNOijNOirMOyjFOSLCOiLDPSTCPiXDPyjGPyvKPC7PODHfPD//XGb/UWj/SWb/OV3/PWj5Ll39PGjpO1zlXHCmTFZeLi5HODNCQz48ODk/NDhFMjZDNDE9Oik+RSZGVSpicz+Qm2GtvX+xy4yryYumw4uduoSOrHp7mWVmh1BafEBegT9hhz5ojkNvlUpymE9yl1JwlFRuklJuk05qj0lmi0ZkiURmiUloi0tpi05pi05miEtlh0pkh0dliEZnikhoi0doi0dlikRrk0xtl09wmlIoMCEnLyIoLSYpLiguMC0zMzE3ODM5OjQ9PTU/QDhERUBKTEtPUllWWGVaXHNdXn1ZWIJbWYteXZZlZaNubrZ3eMh/gdiEheKMjO6MjPCKiuyGh+SCgtyAgNaCgNODgs6Ag8iBhMeDg8uEhM6Gg9CIg9OLhNKMhM+KgMWKgLyJgK+HfZ+AeI13b3prZWdmXVhtW1FtW01pXExmXktkX0llYUhoYUdvX0ZvUDuFVUGlXU+/YVnRWVjdUVTuU1v4XGD5aGXmWVDURDzONzDRNy/XOjHWPS/UOyvPOSjNOibPOSjROinUOCnYOCrcNSzcNSzQLyXNMynMOCzKPi/FQC/BQC2+PSq8OSfCOSm+MCLpV0rfSz/DLyPRPTHOPC/HOCjKOyvJOinIOSjHOCfINybJNibLNSbMNCbQNynXOy7cPjLcPDDZNyzaOC3iPjTsQzz1QkXyOT/wMjz2ND/2MkDxLTvtLTrtMj3sNz7mNTvkNjjlNzjrOTnwOjnxNzjvNzfyOz3uPDzqOjrmODfhODXfNzTcNzXcNzXeOTfhOTjjOTnmOjrpOTvsOTztOTzvODz0NzvzNjrwODrtOTrnOzngOzXXOTDPNyzKOCvIOSnHOSvGOinHOinHOijIOyrHPCnBOSPEPSe+OiO2NB68OSXJRDPPPzbKMSz/XmX/Vmf/SWL/PFz4MVj3MFn7NmP1QmnnWW+sRlFvMzNOMyxCPzY+QzxANzhALTFMLzNLMi5BOSZESihabj1+ml+euHeoxYKsyoyfvoKYtoCUsn6CoG5mhFJYdkJZez9dgD5jh0Fpj0RulEltlUxslE5rkk9skU5pjklmikRjhkJjhkJmiUloi0tmikxkiEpni01ojE5ni0tmi0hlikVmi0Vqj0lrk0pxm1FynlN0oFUqMCIpLyMpLicpLigtLywxMzA1NjE3ODI7PDQ+PzdBRD1ISkdPUFRTVWFYWWtaXHVcWn9eXYlkYpRraqR1dLp/fs6Hh9+LjOmNje+MjPCJieuFhOKAgNiAftKAf8+CgsyFhsmGh8iHiMuJiM6LiM+Mhs6NhsyOhciKgLyJf7GGfKGCeJF7c4B0a25sYmBlXVJlYE1lXktmXktoXUtpXElqXkhrX0duXkV3X0d/W0OSWUatWkzHVlDeUlP1UVj/WF/wVVPjTEXZPjnVNjDZNi/cOTDbOSzWOSjTOCbROCbROCjUOCnXNyncNirfNCzdNSzOMCfJNSnIOSvGPS3EQS/BQC2/PCq+OSjEOCnLPC7kUkXcSDzINCjMOi3IOizCNCbKPSzLPCvKOyrKOyrLOinMOSnOOCnPNijTNyrWOCzZNyzXMynVMSfYMSjeNy7nPDX4REfxOD7tLznvLzrwMD3uLjvrMTzrNj/kNTrcMzbYMjLfOjjuRUL4SUb4REPzPz7pOjfnOTjlOTfiOTbhODXgODXhOTjhOTjgODfiODjlOTnnOTrpOTvsOTztOTzuNzvzNjryNTnuNjjqODjkOzjcOjXTOS/LNyvGOCrDOirCOirAOyrAOyrBPCnBPCvBPCm9OSTBPym7OiWzNR+5OifBOy/KOjLYPD3/Xmf/UGT/QVv5OFf2Nlv1O2D0PmTjSWWrP0yDPz5fOjJHOy86PjA4PjJGPDpSPj1OMC5TOC9WSzVjaUV4j1uNsHCdwn2hxoGauX2auYCatoONqXhyjl5ZdUVUcD1ce0Jff0BihkBpjUNtk0hslEtrk0xpkE1pkE1njEdliUNjhkJjhkRnikppjExojE5ni01pjU9pjU1pjktnjEdnjEZmjkVskkltlUxwnFFvnVJ0oFUtMSItMSMsLyYsLikvLy0xMS8zNC80NS05OzA8PjFAQjdFSEFLTUxRUldVVWFWV2lcWXReXX9mZIxwbqB6eLeFg86Ni9+QkOqQju+OjO2KieeHhN+Bf9N/fMt/fciAf8OGhceIiMaKisqMismMismMiMWMhL+LgreJgK2GfKGAdo97cIB1anBuZGJpX1ZjXU1fYUxfYUtjXkpnXEpsW0luXEhvXUdxXUV3YUl4WD+HUz2jVkTHWE/jVVP4T1T+TVPiPjzePDfdODTeNzHhNi/hNi7dNyvaNyjUNybTOCTTOCbVOCfYNindNSrgMyzdNSzLMyjENijCOSnBPCvCPy3CPy3BPCvAOCjDNSfcSj3aRjrVQTXOPC/ENijEOyu+NibGOinHOinHOinJOirKOCnLNynMNijNMyfVOS3VNyzWMyrXMyraMyvfNi/lOjPpPDjwPD3tNDnrMDfsMTjuMzztNDzrN0DqPUPdNzvhQUHsTkv4WVX9WlX6UUzvQj7lODTiNjLgNzLgNzLgNzLhODXiOTbkOzjkOzjhNzfkODjmODroODvrODzrODzrODzsODvvNTjuNDfsNTfnNzfiOjfZOjTPOC/HNyzCOCu/Oiu9Oyu7PCu7PCu7PCm7PCu7PCm4OSa9QCqzOSSxNiS2Oyu1MCfDNDDsUFT/W2n/SmD1OlXwN1bxQF3vSGbnSGTNTmGCODllPzZSQDJEQTA5PSw1Nyk+NitLOS9FLSNSPSxnXUKBiF+Sq3SXu3uWwXqWv3uUs3icuIWatIWAmm1cdUtIYjVOaDhbeEJffT9jg0BojERskkdqkklokkpnkExmj0tkiURkh0NjhkRliEZoi0trjk5rj09qjk5pkE9pkE9pkE1okEpnj0hokkhslEtvmU1zoVZzo1d2pFkyNCYwNCYwMSkwMSsxMi0yMy4zNC40Nis5Oy07Pi0/QTNERjlJSkRNT05SUVdTU11YVmRcWm9kYX5ubJR6d6yEgsOMidaRj+OUkeqTkOuOi+KJhdmCf8x/fMN/fL+Afr2EgsGGhcGJiMKNisOLiL+JhbiHf66FfaSFe52Ado55bn5yZ21tYWFrXlZpW1BjXEpdYEtdYUpjXkpoW0ptWktxWkp0Wkl2W0ZzV0F4UjuKUT2qWUbNW1DjVFDwRknxPkHbMi/cNS/hNTHjNjDjNS7hNSvgNinbOCnWNyTTOCTROCbUOSfYNincNirgMyzaNi3INim9OCe8Nya9Oii/PivCPy3DOyvEOCnGNCfpVUnTPDHMOCzRQjS+NSXAPSvAPSvAOCjEOCfFOSjHOinIOSnLNynMNijNMyfSNirUMynVMinbNCzjOjPpPjfsPznsPTroNDXsNTnvNjvuNTvqMjrmMznkNz3iPEDzVVb8YmL/bWr/aWTzVlHkQTzfNjPdNC/fNjHeNzHeNzHfODLhODXiOTblOTfmOjjlNzjmODnoODvpOTzrODzrODzrODzsNzzuNTruNjjqNjflOTffPDfWPDTMOS/FOSy+OSq6Oyq2Oym1PCm1PCu0PSmzOyqzPCizOie3QCytOCatOCezOy2rKyLDNTT9YGf/VGT6R1zwPFXrPVjnR1/hT2TST1+0U1p2R0FYSDlLRDJGRTFCRTA9Pyo6OCM7Mx4/Mx1QRypua0iKk2aVrHSRtHSOt3ORunieu4WhuIqQp31sgltLXzpBVzBMYzdXcj9fe0Bkg0BpikNrkUZpkUhnkUdkj0hljkpih0JjhkJkh0VnikhqjU1sj09tkVFuklJqkVBqkU5qkkxokkpnkUdpk0dtl0twnE92pVd2plp4qFw3OCg2OCo2Niw1Ni41NjA1NjA2Ny82OCs7Pi09QC1AQy5ERzRJSz5NTkZRUE5SUlJWVVNZWF1hX2xraYF1c5uAfbKIhseMitOVkuGUkeKQjdyLh9OEgcSBfbp/fLV/fLOBfreEgbqHhLmJhbeKhLKGf6iBepuAeJB/c4d6bnpyZmptX15qW1RpW1BqWktmWkpiX0xiX0xlXkxpXEtuW0xyW0t3XEt7Wkd+VUGGUj2bUkG2VkbOUkjaR0DiODjlMzPdMS3fMy/iNS/jNS7hMyzfMyndNSjcOSjTOCTQOSTPOibROifUOCnZNyrdNSzYNy3EOyu5Oim1NiW3OCe9OyvCPS7HOy7HNyzQOTD1XFTWPTXJNSvPQTW4MyS3Oii8Pyu/OinDOirGOivIOizKOy3MOi3POC3RNy3QMyrSMSnWMSveNzHlPDfqPjroOzfmNzTpNzXvOzzwPD/qNjnkMTXkNTroQkbtTU//eHf/cW7xYFvdSkPRODPRMi7cNzPnQDrgOTPgOTHgNzLgNzLiNjLjNzPlNzblNzbmNjjnNznqNzvrODzrOD7rOD7oNz3qNzvuNzvuNznqNzrkOjrfPTrWPTfLOzLDOy+6OCq1OiqzOyqvPCmvPCqsPCisOymsOymqOyisPSqmOCenOSqqOC2sLynLQEP/aHL0TV7zSFvtRFnlSFvZT17JVF23VFecWFVkTT9PTDlMRzRKRTFGRC0/Qic9RCM+SCNLVi5cZzx4gVSLmWaRpG2NqW6PsnKXuX2ftoiSp4B1hmRSY0M/UDBCUzFPYTlWbD1ie0JlgkJpikNqkEVpkkZlkUZikEhjjkdih0JmhkNnikhpjEprjk5tkFBuklJvk1NqkU5rkk9qk01pk0tpk0lqlklumktynk92pVd2p1h3qFk/PS49Pi49PTE9PTM9PTU7PDQ7PTI7PS8/Qi9ARC1DRy5GSjNLTDpOT0FRUUlSUkhZV0paWk5fXlxnZXJxbol7eaGDgLeHhcSPjNGPjNONis+KhceDf7p+ea96d6Z5dqV7dqx8ea6AfK6DfamDfaN/eJd8dIt6coF2a3NyZmZtX1xqXFNrW05sWkxsW0trW0tpXU1nXk1pXU1qXU1uXU1zXk16XU2BWkmTYE+bVkenTkC4Sj3FQDfPNi7YMSveMSvhNTHhNi/iNS7iNC3gMineNCfcNibaOyjROSTNOyTMOybOOyfROinVOSrZNyzTOS3BPiy0OyiwNSOyNSO7OSnEPC7JOy/LNy3ZPzf4W1TjSUHOOjDMQDO4NiasMyC1PCm8OSe/NyfANyfDNyjFNynJNyrONyzRNy3ZPDPbOjLeOTPlPDfqPjrqPTnnODXjNDHoOTbrPDnsOjroODrsPkD4UFD/YmP/cHD5aGXiVFDKPTbAMSvJNDDWOzffPTrgOzfiOzXhOjLiOTThODPjNzPkNzPlNTXmNjbpNjnpNjnqNzvrODzrOD7qNz3oNz3pNjrvODzsODnoODrjOzrdPjrTPjfJPDLAPC+2OCmyOimuOymqOyipPCioOyelOialOiilPCmgOSigOymgOSqiNiq1PjjbVFj7ZXDuS1zvSV3pSlzbTVvJUVq0VlagWlKKYFJQSTdITTlOSTVIQCs7NRs2Nxc+TyVMZjZsilR3lFyEm2WJmmSNm2aQo2uUrXSYsHyDlW1ufVxRYEM8SjA5RixBUDFPXztXaj1jekRlgkJqi0RrkUZpkkZlkUZhj0ZjjkdjiENpiUZqjUtsj01sj09sj09tkVFuklJtlFFtlU9tllBslkxrl0ptmUpyn05zolF7rF17rF16q1xEQTBEQjNEQjZDQzlDQztDQztCQjZCQzNERjBFSC1HSi1KTTJPTjlSUT9UUkVVU0RcWkNcXERcXU9hYWFpaHhycZB7eqaBfrWGgr+Ig8OIhMGEgbp/e655c6F0b5dvbZVwbJ5ybqF2cJ53cpp3cpJ0b4Vza3pyaW5tYmBsX1dqXFFrW0xtXExvXE1vXEtxW01xW05vXE5tXU5sX09tYE9zYE96X06GWk2fX1OkUEWuQji6OzLGNi3OMSjWMindNSziNzDhNi/hNC3gMyzgNCrdNSjYNyXUOSXPOiLKPSLJPSTKPifNPCnSOyrVOSzPOy2/QC2xPCisNSGuMyG6OCjEPC7KOi/ONS3YOTPwTknxVE3ZQjnMQjW+Py6mMR2zPCi+PCzBOSvBNyrCNinFNyvJOS7POzHUOzPhRD3jQTzkPzvnPjvpPTvpOzroODjnODXnODXmOTXmNzTpOzr0Skr/XFv/ZGP4Y1/MPTnBODK9NC7DODHVQT3eRUDfPTvZNDLiOzXiOzPiOTTiOTTkODTlODTnNzfpNzfqNjnrNzrrNjvrODzrOD7oNz3oNz3pNjrrNzrpNjnmODngOznbPjnRPjbGPDG+PC6zOCmuOymqOyimOyekOyijOiejOiegOSahPiuWNyWcPSuaOSmaMifDUEvta23uXGbsUF7pSlzfSFfNS1O5UlOkW1KSY1GAalVKTThETDdKQi9IOSRCNxtGSCNVcD1nk1Z+s2+Cs3GDpWh9klmDjVmOlmOJl2R8jF9YZkNHVDg5RS02Qio6RCw9SjBKWDdXaD5lfEZogkNsi0VskEZpk0djkUZhkUdhj0dmi0ZsjEltkE5ukU9sj09rjk5rj09tkVFwl1RxmVNwmVNwmlBvm05xnU50o1J3plV8rV56rV55rF1JQzNKRDZJRTlJRTpJRztJRztIRjlIRzVJSDNKSjJMTDJOTjRSUDtUUT5YUkRZVEFdWT5bWj5cWUheW1RkYWhua354c5N9eKCBe6eDfauFf62DfKZ9d511bo9vaYVrZ4JpZYhqZottaIhtaYJtaHxsZnJrYmdqYF5nXVRoXE5oW0trXEluXUtxX0txX0twXUxwXU5wXU9wXU5zXU93XU5+XU6HXEySWEyhVUikRjyrOS+6Ny3KNy/TNi3aNi3eNi3fNi/fNC3fNCzfNCzfNyzdNynYNifRNiTPOiTMPCTKPCbLPSfOOynROyrTOizOPC2+QS+vPCeoMyGsMyC2OSfBPS7JOy/MOC7MMirgQTv4W1TgSUDQRDfKRjerMh+5PizKRjfMQjXKQDPLPzLNPzPUQTfcRTzjRj/iQDviPTnjOjfiNjTjNTTkNjXlOTflPDnkPzngPTbcOjXfQDrqTUjqUUzTQDm4KSO4LSa+NS3JPjfRQDvWPjnaOzjjOzvnPT3iOTbiOTbiOTbkODblOTXnOjbpOTnqOjrqODjqODjrODvrODvpOTzoODvnNzrnNzrpNjrmNjjiODjeOjjWPTjMPTXCPDG5Oy2uOSiqOyqmOymiOyigOyeeOyafOiibOieYPy2MNSKZPS6YOCqXLybNXFj3eXzfWF/mWGTaUVvKS1K5TE+pVlCeYFWQZ1WAblZQVzg/Sio8OxxDPRtVUStsdkSDomaUwX6HvHaGuHN8nmFugk11flGCh151fVZbYkA7RCk0PCU1PSg9RDI8RTI5QytDUDJVZT5ne0hpg0Zsi0dtkUdqk0dmkkdikEdjjkdojUpsj01vklBuk1Bsj01pjktqj0pqkkxzm1RznVVznVNynlFynk9zolJ3plV6q1p2plp1pVtzo1lSSztSSztSSj1SSj1SSj1SSj1SSj1SSztVTjxWTz1XUD5YUT9ZUkBbVERcVUVcVUViW0hhWkhhWUxiWVJlXVtrYWlxZnR1ant6boR8cIh/c4t/c4l8cIR1anttYnJlXWpjYGtgX2dfXGNfWl5eWlleWVVhWlJiWk9lW09nW0tpXEtrXElrXEdtXUZtXUZqXkhpY01xZlRxWkp1T0KLV0qcXFCjWUysWkylTj2mRTSnPCyxNyjCOC3RODDcNDHdMS3fNi/eNy7eNy7eNy7eNy7bNyvYNinXNynVOCnUOCnSOSnSOSnSOSvSOSvUOCvNOyy9Oyu2Pi2uOSipMSCrMiG3OSrAPC/DOS7INSvONS3UOjDbQzjdSz7USDnCPSy3MiPdUEbYSkDURjzURDvaRz/eR0DgQz7gPDrgNzTmODfsOjrsOjrnNzfiNjTgOTPcPTfZRj7PQjnEOi+8NCi3MSa5NSm/Oy/DPzPDOjDJPDPSPzfaPzriPTvnOznsODntOTrnNzrlODrlODrlOTnlOTflOTflOTXlOTXgNDDhNTHkNjXlNzbmODnnOTrnOTrnOTvrOz7mOTvfOTncPTrWQT3NQjvBQTa3PzGpOimjPCugPSqbPCiZOiaWOiWXOCaROCaQQTCLPC2HLyORLya8TErkbW/nbG/NVlq9TE61Tk+qUU2iVU+bWE+XXVKVYVSKalNXWi86TRY3Rg9UYSl+jlCbsG+fvHmcvXiStXN+nWFogExcbUNZZEJUXUJIUDk/RDA6PSxAQzI8QDE6PjA8QzM6QzBBTjJSZD5dc0Jng0hwj0tvk0tskkdqkklpk0tnkEpskFBtkVNvk1Nsk1Btkk1rk0ptlkptmElxnExxnk1yn05yoVB0o1J2p1V5qll6ql55pmNtmVpijk9XTj9XTj9XTj9XTj9XTj9XTj9XTj9XTj9YT0BZUEFZUEFbUkNcU0RdVEVeVUZfVkdkW0pjWkljWU1jWU9mW1VqX11uYmRwZGhyZWx0Z3B2aXJ2aXJzZm1tYGdnW19iWFleW1ZaWlJZVk9XVEtYVElYVEhcVkheV0djWktjWklmW0lnXEhpXUdqXkZrX0doYEljYk1uZ1R2XE2BU0aaVk2rVk+wUkq3UUWvSDmsQzCsPSyxOSm+OCzLODDVNjLZNDDdNi7cOC7cOC7cOC7bNy3aOC3ZNyzXNyvXNyvVNyvVNyvVNyvUOCvUOCvUOCvOOiy+PC62Pi6uOSimMSCnMiCyOim5Pi6+PC7GOi3HNCrLNCnSOzDcRTrhT0LfUUPdT0PbRj/YQDvTPDXSOzTWPTfaPTjcODbdMzPnNzfrNzjuNznrNzjnNzflOTfiPTnbQjrKQTe/PzS4OiyxNievNSayOCm4PS2/QDHFQTTNQDbXQDffPTjjOjfpNzfvNTbxNzrpNjrnNjznNzrmODnmODflOTXlOTXjOjXiOTLjOjPjOjXkOzbkOzjkOzjlOTnlOTnkOjvjOzvfPD3ZPz3QQTvEPza3PTKsOy2lOyugPSqcPSuXPCmWOyiSOiaTOCWMOiWAOSeAOCmJNSqdPDW/UVDXZWXRXmG3TU2sTkykVE2dWVCYXFGXXlOXXlOYX1aMZlFgXy9TZypecjN6kE+Zr26lvnyZsnCIoGJqgkhhdUJUZTtKWDdGUDc/SDU5PzE1OC06PC9BQjQ9PzQ6PTI9QTM6QzBATTNSZD5edEVng0hxkE1wlExukkhrlEhrk0xokUttkVFuklRtlFNtlFFrk0xrlEhsl0htmEhwnUpwnUpwoExzolF1plR4qVh4qVh4qF5tl1hii1FZgkhdVEVdVEVdVEVdVEVdVEVdVEVdVEVdVEVbUkNcU0RdVEVeVUZfVkdgV0hhWElhWEdlXUplXUhkW0pkW0xlW1FmW1VoXVloXVtpXV1qXl5rX19rX19pXlxmW1liV1NfVlFaVk1XVEtVUUhSTkNRTUJTT0NXUUNYUkJeV0deV0VhWUZjW0ZnXEhpXkhrYEpoYkxiYU1uZ1V5X1CIWE6iW1WxVlGySUW4RUC5QDe4PjG3Oy+4OCu8OCvDOSzJOy/ROi/ZOC7bNy3bNy3bOS7aOC3ZNyzZNyzXNyvXNyvVNyvVNyvUOCvUOCvUOCvSOSvNOyzAPjC2Pi6tOiijMiCjMx+qOiazPiy5Pi7EPzDEOCvFMijINCrQPDDYRjncTT/iTkTZOjbYNDPUMjDWNDLbOTfhPTzmPDzpOzztOTzuNTrrMjfpMjboNTjlOTnhPDrZQDq+OC21OiuxNieuNCWtNSWwOCi1PCu7PS7IRDXPQzbWQjjcPTfiOTToNjTtNTXvNznqNjnpNjnpNjnnNzfnNzfmOTXlOTXlOjPjOjPkOzTkOzbjPDbjOzjiOjnhOTneODjdOTrcPDzaQD7TQj3IPzm5OjGtNyulNyihOyydPCuZPCuUOymTOiiQOSaQNyWKOSZ6NiN5NiWIOSygRj25U0/AV1S4UE+rSUaiTUicU0yZWVCXXlOXYVeXYVeYX1aLZVBzckZ6jVaTpm6kuYCrwIees3t8kFtbbzw/UiRBUytBUC8/TDI6QzA2PC42OTA1OC85Oy5AQTM9PzQ5PDE9QTM5Qi9ATTNRYz1gdkdphUpzkk9ylk5wlEptlkptlU5rlE5wlFRxlVVvllNullBslEtslUlsl0humUlwnUxwnUxwn051pFN4qVh5qlt1pldxoFhfiUpWf0VPeD5hWElhWElhWElhWElhWElhWElhWElhWElfVkdgV0hgV0hhWEliWUpjWktkW0xkW0plXUhmXkdmXklnX0xnXk9mXFBmXFJmXFNoXVdoXVdoXVdoXlVnXVRlW1FkWlBjW05dWU1aVkpWUkZSTkJQTEBQTT5UTkBVTz9XUUFZVEFbVkNdWERhWkdkXUpmX0xmYU1kY1FsZVV2XE+KW1GpYly4Wli2RkS5PDrDPDjGOzbEOjDCOC29OCm8Oiq+Py7HPy/TOS3ZNyzaOC3ZOS3aOC3YOCzYOCzVNyvVNyvUOCvUOCvUOCvUOCvUOCvSOSvNOyzBPzG2Pi6sOSeiMyCdMx2iOCKsPSm1QC68Py2/OivDNyrFNSrLNyvOOi7OPC/TOjLeNjXgMjTbMTLdMzTgODjlOzzqPT/sPD7uNzzsMzjpMDbmMjXlNTjhNzfaNjXONjG3NSivNyeuNiasNyasNyauOSiyOim1OirDQTHKQjTUQTfcPzjiOzXmOTXrNzbuODftNjjrNzjrNzjqODbqODboOTTnOjTmOzTiOTLhOjLfOjTgOzfeOjjcOjjbOTfZOTnWPDrVQDzSQz3KQTu7OzKvNiukNieeNyicOyqYOymUOymSOyiPOiaNOCSMNyOHOSWAPSp2NSOBNSeZRTqqUEisTUepTEemUUydUEqYVUyUWk+UXlKVYVaVYVaXYVeNZ1SJhV+ZqXitvY6muIiQoXRzhllOYDgvQRstPhwzQiU6Ri49RjM7QTM6PTI6PTQ8PTU5OS0/QDI8PjM5PDE8QDI5Qi8/TDJQYjxhd0hqhkt0k1Bzl09ylkxvmExvl1Btl09wl1RzmFVwmFJvl1BtlkptlkhumUpwm0txnk1yn050o1N5qFh7rF13p1ttnVNlkk1bhUZTfEJOdz1jWktjWktjWktjWktjWktjWktjWktjWktjWktjWktkW0xkW0xlXE1mXU5mXU5mXUxmXkdnX0hoYElpYUxpYU5pYE9oX1BnXk9qYFRpYFFpYFFoX05oX05oYE1oYE1oYU5kXk5gWkxbVUdWUEJQTT5OSzpOSzpOSzpQTTxSTz5UUUBWU0BYV0NbWkZdXEheXUtiYFFmXlFtV0qGW1KsaWO+Y2DBTU3IQkPQOz3UODnTODTMNzDBOSu6PSm1Qyu8QivOOyvXNynYOCrXOivZOSvWOSrWOSrUOCnUOCnUOCnUOCnSOSnSOSnSOSnSOSnNOyzBPzG2PjCrOiihNiKaNB6bNyCjPSavQi2zOyq6OyzCOizHOS3LOC7OOjDQPDDZOjTpOTzsNDzmMznjMjjiMzjhNDjiMzjiMjXpNjzpNDnnNDrnNzrjOTzbNzbQMjHAMCi0NiitOiitOiirOiirOiirOiisOSavNya4OivBOy/OPjPYPzfgPTjkOzjoOTbsODfuNjbuNjbuNjbtNzTqODToOjPnOjPkPDPhOjLfOzLfPDXcPTfbPTrZPjzXPTvUPj3PQDzLQjzFQjq5PTWtNy2jNSieNyiaOiqWOymTPCmROyqNOiiKOSaJOCWINySDOCWDQC11NCJ7MyWTRzqkUUmhTkaeTkehV06YVUySWEyQWk6NXE6PXVKUYFWXYVePaFeNiWaYpXqdqYGAjmpda0hEUzQyQCYkMhktOiYwOyo1PS45PzM8PzQ9PzQ6OzM6OjA5OS0+PzE7PTI4OzA7PzE4QS4+SzFQYjxieElrh0x1lFF0mFBzl01xmk5xmVJvmVFymlNymlNymlFwmU1tl0ttmElwm0xznk90oFF2olN4p1l7qV56qF9xn1ZkkkpZhkNdhkpXfkdSeUJlXE1lXE1lXE1lXE1lXE1lXE1lXE1lXE1lXE1mXU5mXU5mXU5nXk9nXk9oX1BoX05nX0poYElpYUxqYk1qYk9qYk9qYVBqYVBqYVBpYU5oYE1oYEtoYEtoYElpYUpqYktmX01iXUpeWEhYUkJTTT1NSjlLSDdJSDZLSjhMSzlMTTtOTz1QUT9RVEFTVkVTVkVbWUxeVkljUUV6WE6haGG2ZWHEVlXWUVLZQEPfOj7cODfUNzDHOy68PyuxQyq1QSjKOyrUNyjVOCnVOSrWOSrVOSrVOSrUOCnUOCnSOSnSOSnSOSnSOSnSOSnSOSnNOyzBPzG1PS+rPCmiOSSZNh+VNR2bOyKnQSqyQi65QC+/OyzDNyrFMijLNCvSOzDfPTjqNTruMzzrNj3pOD7nOj7kOz7jOj3iOTzfNTjhNzriOT7hPT7bPT7ROTbDMi+2MCevOSurPiqrPiqpPiqqPSmpPCipOierOCWvNiW5NynFOzDQPTPZPDXfPDfkOzjoOzfuODfvNzXvNzXuODXrOjTpOzTnPDTkPTTiPjXgPzfeQTraQTvZQT7VQT/RQD3NQj/DPzq7QDizPTOqOC2hNSibNSeYOCiVPCqRPCiNPCmKPCiIOiaGOSeENyWDNiR/NiV9Oil0MyF+OSqXT0GjWU6cUkeVT0WYVkqVWU6QW02OWk2MW02OXFGTX1SZYFeRZ1d+eFh5g15yfFpVYEI7RSwvOyUwOyowPC4zPTI0PDE2PDI8PzZAQTk/QTY8PDA3Nys4OSs+PzE6PDE3Oi86PjA3QC09SjBPYTtieElrh0x1lFF1mVF0mE5xmk5ymlNwmlJymlFznFBym09wmUtumUpwm0xznk92oVJ5pVh7p1p6qF14pl1xn1dnlE9dikVYgkJgh05ZgElTekNnXk9nXk9nXk9nXk9nXk9nXk9nXk9nXk9nXk9nXk9nXk9oX1BoX1BoX1BoX1BpYE9qYVBqYk9qYk9qYk9pYE9pYE9pYU5pYU5pYU5oYEtoYEtoYEloYEloYUdoYUdoYUdmX0xlXktiW0lcV0RXUj9QTTpMSThJSDZJSDZHSDZHSjlHSzpITDtJTTxITz9KTj9QUUNYUkZbT0NpUkSDWU2WVkywU0zUWlnbSUriP0LhOTnaNzLPOzHCPy20QiqzPCTJOinTNyjUOCnTOirVOSrTOirTOirTOirSOSnROinROinROinROinROinROinNOyzBPTC1PS+sPSyjPCmYOCCQNBuVOSChQSmtQy22QS+/PS/ANivCLyXHMCfQNi7eOjjoNTnuNj7sO0HqQEPmQUXgQkPcQEHZPz/NMTLQNjbTOjzRPTvJOzm+NzG1NC6tNCmqPC2lPiulPiulQCylPiukPiimOyepOieqNyWyNye8OCvFOC7MNzDUOTTcPTnmPjvpOjfsOTXsOTXrOjTpOzToOzTlPTTiPjTgQjfdQznaQzzVQjvPQT3KPzzHPTu/PjmxPDOpOi+iOCucNiiYNyeUOCmROimNOiiLPSmJPCqHPCmDOieCOSiANyZ/NiV9NiR4MyN4NSWFQjKYVUWdV0uUUEOQUESVWkyTWU2QWk6QXFGQXFGSW1SVXFWYW1aOYlVrYkVWYD1KUzQ9Ryw2PyoyPSw0PjM1PzY2PTY4Pzg9QjtDRj1FRzxDRDZAPi87OSo3OCo9PjA6PDE3Oi86PjA2Pyw9SjBOYDphd0hrh0x1lFF1mVF0mE5ym09ymlNwmlBxm09ynU5xnE1wm0xvmktynU51oVR5pVh/q2B+qWF6pV1xnFVmkUxfiUddh0VeiEliiVBZgElTekNoX1BoX1BoX1BoX1BoX1BoX1BoX1BoX1BnXk9oX1BoX1BoX1BoX1BoX1BpYFFpYFFtZFVsY1RqYVJpYFFoX1BnXk9nXk1oYE1pYU5pYUxpYUxpYUxoYEloYEloYUdoYElnYUtmX0xlXktiW0hcV0RVUj9QTTxNTDpFRjRERzRESDdESDdCSTlCSzpCSzpDSjpJSz5TUURTUEFYTDxlSzp0RTWVSD7CWVPZUk/gREXgOjrcNzXVOzPKPi+6PSm1OCLJOinPOCfQOSjSOyrSOyrSOyrSOyrSOyrROinROinROinROinROinROinROinNOyzBOzC2Oi6tPCynPiuZOSOPMxqTNx6fPyejOSOwOynAPjDGPDHMOC7QNy/ZPDXjPz3sPULuP0TpQ0XiREPYQD/KOzfANTC7MS65Lyy8NTG+Oja7PDazOjKqOC6kOCyhOiuhPS2fPiugPyyhQC2hQC2hQSujPiqmPSqpOyqtOiiyNyi5NSm/NSvJOTDUPzngQz7kPTfoOzXoOzXnPDTlPDXkPTThPjXeQDXcRDnYRDrSQzvKQTnEPzq8Oza4ODWwOTOiNy2ZOCiVNSeTNieROimPPCqLOimFOCaIPSqFPCuDPCqAPCl+Oid8OCV7NiZ7NiZ5MSOAOCqMRziWU0OSUEKLTD2QUkWZX1ORV0ySWU6UW1KWXVSWXVaXXFaWWVSMXlFhWDtFTSg2QB44QSY+RzI8RTQzPTItNy4xODE3PjZCRTxHSj9ISTtCQzE/Pio7OiY3OCg9PjA5OzA2OS46PjA2Pyw8SS9OYDphd0hqhkt1lFF0mFB0mE5ym09ymlNwmlBxnE1xnExxnExwm0twm0xznk93o1Z7p1yCrWWAq2R4o1xqlVBdh0VZg0FeiEhlj1BjilFagUpTekNpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpX1NqYFdqYFdqYFdqYFdqYFZqYFZqYFRqYVJqYVJqYVBqYVBqYk9qYk9qYk9qYk1qYk1nX0pnX0pmXkllX0liXUlaWENTUD1NTDpISTdFSDdBRTZARDU/RTc/Rzg/Rzg+RjdHSz1JSz1BRTRLSjZcUTthRS+DSjnAal3cZ2DjVVPkRkXlQUDgQT3VPjXJPTDGPS3GNCXLNSbMNifNNyjNNyjOOCnROyzTPS7SPC3SPC3SPC3SPC3ROyzROyzROyzOPC27Mii2Ny6xOy+oOimaNyKUNR+VNx6cOSKuQS2zOyu6NinBNCrNNi/XPDfiQz/qSEXoREXoRUjdQ0PJOja7NjG0ODCuOC6pNCurOS+pOS6kOC6gOC2bOSyWOiuTPCuSPCuWPSuYPSqZPiuaPyybQC2dQSygQS2jQC2iOyqlOiirNyiwNim2Niu+OC3EOzPMPDTaPTbgPTbiPzjiQTfiQTneQjbaQDbXQDXYSD3SRTvHQTi7OzKyNS+qMy2mMSqfMiuZOS2SOyqROSuNOiqLOimIOymHOyuFPCuAOSd9OCh8OSh8OSh8OSh7OCd5NiZ4MyR3LSCLQTSXT0OTTUGOTECRUUWTVUqOUkeYXFKYXFKRVU2QVEyXWlWVWFOUV1STZ1pdVDVJUSpBSyhCSyw+SC83QCsyPS00PzE0PDFIUENaXlBXW0pNTzpERi5BQSc9PSU6Oyk+PzE7PTI6PTI7PzE0PSo7SC5QYjxjeUpsiE11lFFzl09ylkxwmU1ymlNxm1FwnUxxnktyn05yn05zn1B2olV7p1x/qmKCrWZ4o15qk09giUdeh0VhiUpmjlBokFRkiVNbgExUeUVpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpX1NqX1lqX1tqX1tqX1lqX1lqYFdqYFZqYFRqYFRqYVJqYVJqYVJqYVJqYVJqYVBqYVBoYE1oYEtnX0pnX0pkXUpeWUVVUj9PTjpJSjpFSDdCRDZARDU/RTc+Rjc+Rjc9RTZARjg+RTU+RjFITDVNSTBVPyd/UTq8c2LLY1jgX1rrVVTnR0fiQD7gQT3YPznOOjDNOSvOPSzPPS7PPi3POy3OOyvNOSvNOirOOizQOivQOizQOivQOizQOivQOizNOy7JPzXFQjq8QjeuPS+fNiOWMR2WMR2bMh2oNSO0NijDOy/RQTjeRT/mSUTpSkbqS0jeQ0HbRUTQQj68PDOvOS+pPTClPzGfPTCfPzGcPjKXPjCUPi+PPS+KPi6HQC6IPyyOPSqROyqSPCuTPSyUPyuVPiuXPiyZPiyfQC6hPS2kOiyoOCysOCuxOC22OjC8OS/KPDLQPDLTPzXVQTfXQznWQznURDnRRTjKQjbDQTS5PTOwOjCpNi+kNS6fNCyZNyySOi6MPSyKOyyIOyuGOiqEOyqDPCqBPCx+Oyp8Oyl7OSl5Oil4OSh3OCd1Nid3NCSANCeQRDeYTkORSz+MSj6PUUSSVEmQUkeTU0qYWE+YVU+XVlCcXViUV1KOU0+KY1RdVzVYYzlfakJaZkJJVDY2Qyk0QCo8SDRPWEdZYlFfZlRXXEZKTjdCRSo/PyM8PCI5Oig9PjA6PDE5PDE8QDI1Pis7SC5QYjxkektsiE11lFF0mFBylkxxmk5ymlNxm1FzoE9yn0xwnUxxnk10oFF4pFd8p19/qmN7pmFvmlVjjEpdhkRhiUpljU5ljU5ji09kiVNbgExUeUVpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpX1VqX1tqXl5qXl5qX11qX1lqYFdqYFZqYFRqYFRqYFRqYFRqYFRqYFRqYFRqYFZqYFRsYU9rYExpYU5pYU5mX0xhXEhZVkNTUj5NSzxISTlERjhBRTZBRTY/RjY+RDY8RDU9RjU3QC1ASDFJSzNGPyVXPyeHWkO3c2C2VkrZYlrwZWLsVFPmRkjrR0jmQ0TYOzbLNyvJOirJOizJOirLOSzKOCnINinINifKOCvLNynLNyvLNynLNyvMOCrMOCzLOC7CMy2+NS+2Ni2tMyihMCKeLx6gMSCnMyS8QTLHQzfWRz/hTEbnTEfpSkblRkLfREDXQ0HPREHBQDqxOzGkPC+hQTGcRTSYRTOTRDORRDSPQjKKQTCFQDCCQS9+QS5/QC6GOiqLOSuLOimKOyqLPCuNPCuOPSqPPCqWPy6WPS2bOyudOSqgOCulOS2pOy6uOS+4Oi6+OTDBOzDEPjPFPzPFQTTDQTPBQTS2OyyyOiyqOC2jNyueNiubNiyYNy6UOi+NOy+IPCyHOy2EOyyCOiuAOyuAOyt/PCx9Oyt6Oyp6Oyx3OSp2OCl1Nyh0Nil2NCaIOzGURjyWTkKOSj2ISDyNT0KRU0iSUkmST0mZVE+ZU1GaVlOaXVqTWVWNW1SNbFuBfVh+iV6Ai2FseFJMWDQ2RCM9Si5MWkBlcVllb1ddZU1QVT5FSTA/Qyg9QCM6PCQ4OSc7PC44Oi85PDE9QTM2Pyw8SS9QYjxkekttiU52lVJ0mFBzl01xmk5ymlNwmlB1olFwoExunUxwn091pFZ5p1x9qGB8p2BwmVVmj01chEVchEVljE1pkFFmjU5fhUhjiFJaf0xTeEVpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFqYVJqYVJqYVJqYVJqYVJqYVJqYVJqYFZrYFxrX19rYF5rYFxrYFprYVhrYVdrYVVrYVVrYVVrYVVrYVVrYVdrYVdrYVhrYVduYlJtYlBqYk9qYk9oYU5lXktfWkdZVkVSTz5NSzxHSDpERjhDRTdCRDZARDU8QzM8SDQ5Qi1GSjNMRjBPOiVxTDmaY0+qXk6hQTXGU0znY1/wXl7tU1XrSk/pREjhQUHMOTHHOS3FNyvFNyvIOC3KOi/LOzDNOjDRPjTRPjTSPjTSPjTTPzXTPzXTPzXTPjfTPzvRQj7LRD7GRj3CRjzDST7HTUDOUETZU0jdUEfiTUfkSUXkR0LiQz/gQT3bQj3VRkLJRD+6PzerPTCfPi6aQzCVRzOUSTaNRjSMRTOIQzOFQjGAQTB9QC56QS58Py2COiyGOCyFOSuGOiyGOiyHOy2HOyuIOyuJOiuLOimOOCmQOCqVOSyZOy+dPS+iPDCqOi+tOC6vOS+wOi6wOi6wOiyvOSuuOCqoNymlNyieNimbNiqVNyuSOC2ROS+OPDCIPC6FPC2DOyyBOSp/Oip+OSp9Oip9Oyt8Oix6Oyx5Oyx3OSpzOCpxNihyNyl1NSmMRDiSSD2RSz+KSDqHSTyLT0STVEuXVEyWUUybVFCYUU+UU0+WXFiQX1iQaF6XfmqUlHCFkmZ1gldZaD9DUis/TypQYDxjclFldFVcaUtOWD1DTDE/RSs+Qik9QSg7PSc3OCg6Oy03OS45PDE9QTM3QC08SS9PYTtieElsiE12lVJ1mVF0mE5ym09ymlNvm1BxoE9vnk1vnk1zolJ6qF18qmF6pV51oFtjjEpeh0Vbg0Rfh0hnjk9qkVBmjUxgh0hih1FZfktSd0RpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFqYVJqYVJqYVJqYVJqYVJqYVJqYVJqYFRrYFprYFxrYFprYVhrYVdrYVVrYlNrYlNrYlNrYlNrYlNrYVVrYVdrYVdrYVhrYVdvY1VuYlJrYlFrYlFrYlFoYU9kXU1gWkpYUkJSTz5OSzxJRzhHRTZERTVCQzM+QjE9STE/Ry9MRzFTPitnPS2VWkytX1OcPjSeMyu2PznYWFXzaWf2ZGXrUlXmSk7oTlDZSUHTRjzNQDbLPjTOQDbSRDrVRz3XRz7aSkHaSkHdSkLdSkLeS0PeS0PgS0TgS0XrU1LoVFTjU1LcUk/YU0zYU0zbVUzgVU7gTEjhSUbjRULiQ0DkQkDiQ0DkRULgRkTZSkbKRUC5PjesPTKhPzKYQjGSRTOQRzSMRTOIQzOHQjODQDCBPzF+PzB6Py98Pi+AOi6DOS6DOS6DOS6DOy2DOy2DOy2DOy2BOSqCOSqFOSuHOiqJOiuNOy2PPC6TOy+bOy+eOS2fOS2gOiyhOSyiOCuiOCqiOCqfOCmcOCmYOCiUOCmPOSqMOiyJOi2HOy2EOi2COiyBOSuAOCp9OCl9Nyt8OCt7OSt6OCx5OS14Oi12OCtxNSpvNSlxNyt0OSuMSDuNSTyJST2ESTuFSz+MUkaTV02YWE+YUU2cVVGYUlCTVlGSYFmIYleDZ1uGemRuclFaaUBKWTBBUihJWjBXaT9kdk5qfFZYaUVMWzo/TC46RCk8RCw+Qy08QS06PSw4OSs6Oy02OC04OzA+QjQ3QC07SC5MXjhfdUZphUp0k1B0mFB0mE5ym09zm1RwnFFunU1tnkxwoVB3qFl8qmF6qGBynVhpk1Fag0FchEVhiElljE1njk1njktojUpmikxjhlBZe0lSdEJpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYVVsYllsYllsYllsYlZsYlZsY1JsY1JsZFFsZFFsZFFsY1JsY1RsYlZsYlhsYlhsYlhvY1VuYlJrYlFsY1JsY1JrYlFnYFBkXU1eV0dZU0NTTT9NSjtLSDlHRTZFQjM/Qi87SC4/SC1PQy1hPS2DRTqrWFK0TkqeLCuyOjm5PTvTU1LycG7+dnbxZWjrWF7wXl/jVVHaUEbUR0DQQzrRRD3URz7WR0HWRz/ZSEPaSkLcSETdSkPeSkbeS0TgS0fgS0fiSEjhR0ncSEjZR0fWSETXSETYR0LbRkLgQkHkQULmQkHoQkLnQ0LkQkDfQT7bQT/bSkfKQz+5PDauPjOiQDOYQTCQQTCPQzOKQTKIQDGHPzGFPTGCPDCAPDF/PTF/PTGBOzGBOzGDOjOBOzGBOzGAPC+APDF/PS+APC+APS2BPC2AOyyCOiyBOSqCOCuDNymMOi6POC6ROS2UOi+XOy6aPS6ePC+fPi6ZOSmWOSiTOiqQOiuKOyyHOyuEOyyCOiuCOiyBOSt/Nyl+Nih7NSl7NSl7NSl6Nil4Nip4OCx3OSxzOCpwNClvNSlyOi12PDCLTUCJSzyESjyCTT2FUUOLVkiSWE2XV06TTkmZVE+XVlKVXFWQZVx7XlBmVkZgXkdFTy0+Tik/TyhKXDJfckVrflFleEtYakBNXzdAUS02RSY3RCo9RjE9RDQ6PjA3Oy04Oiw6Oy02OC04OzA+QjQ3QC05RixJWzVbcUJlgUZykU5zl09zl01ym09zm1RwnFFtnExvoE9zpFV4qFx6qGBzoFtpk1FgikhZgUJehkdljE1njk1mjUpljUdnjEdojExhhE5YekhRc0FpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsYlhsYlZsYlZsY1JsY1JsZE9sZE9sZE1sZE1sZE1sZE9sZFFsY1JsY1RsYlZsYlZvY1VtYVNrYlNsY1RtZFVsY1RpYFFmX09iW0teV0dYUUFSTDxPSTlKRzZJQzNBQy46RytARipVQCt4RzmjUEy0SEi2ODy6MznIQUXEP0DKSknfYmDxcXDwbnDnYmXiWlzbUU7VTETPRD/NQjvPRD/QRT7QQj7NQDnSQz/SQz3UQ0DVRD/XQ0HYREDZRUPaREPdQUTdQUTeREbdR0jfSUjgSknjSUnlR0jnQUPqQUTsQkXsQkXnQUHiQD7bPTrVPTraRkbJPTy5ODOwOzKmQDSYPzGRPjCPQDGKPC+KPDCJOzGIOjCHODGGOTOFOjSEOzSBOzOAPDOBOjSAPDN/PDN9PTF9PTN8PDB8PDB8PS58PS57PC18Oix7OSl6OCp7NyqCOi6DOS6HOS2JOS6NOS6ROy6VPC6WPS2SOSmROimNOiqKOyqHOyuDPCqAOyt+OyqAOCqAOCx+Nip9NSl8NCh6NCh6NCp5NSp1Mil2Nix2OC1yNitvMylvNSpzOi94QDOKUEKGTj+BTj2CUUCFVkaJWEmOVUqRUkmST0mXVE6TVE+RXFaKZlpuW0pQSzdFSzFBTjBLWjlXZ0NgckpneU9kekxWbD5HXS9BVi03SCQxQCE2Qio9RjU8RDk4PTY3OjM5Oy47PC42OC05PDE/QzU3QC03RCpGWDJWbD1hfUJvjktxlU1zl01ym090nFVxnVJvnlBxolF1pld2plpzoVlql1JijEpbhUVehkhgiEljiktljEtmjUpmjkhmi0ZliUlgg01XeUdQckBpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsYlZsY1RsY1RsY1JsZFFsZE9sZE9sZE1sZE1sZE9sZE9sZFFsY1JsY1RsY1RsY1RuYlRtYVNtYVNtYVNtZFVsY1RqYVJnYFBkXU1gWUlaU0NVTj5QSzhNSDVJRDFEQy5ARipERChbQiyIVEevXFirPkGsLzPOSU7GP0XAOz67OzzERkfYWlvjZWbbWVvMR0jRSkfQRULNQj/QQj7URkLURkLQQj7JPjfPRD3PRD3SREDURUHWRULZRUPaREXdREbeP0PfQETeQkXfRUXhR0fgRkbgQkPhPj/oQkTpQEPoPkHnPT7kPj7jQT/hQ0DfRUPWQkLFOTi2NTCwOzSmPzaaPjOQPS+NPzKIPC+HOjCHOjCHODGHODOHODOIOTSIOzWCOTKAOjKAOjJ/OzJ+PDB+PDB8PDB8PDB4OCx5OS16Oi56Oi57PC17PC16Oyx6Oyx9Oy9/OS+ANy6BNyyENiqFNSqGNyqGNyiKOCqIOSqIOyuFPC2EPC2APSx+PCx9Oyt9OSx9Ny18Nix5NSp6NCp4NCl4NCl4NSxyMih1NSt2OC1yNituNCluNSp0OzB4QjaKVUeEUEKAT0CEU0SIV0mMVkqMUkeNTkeVVE6UVU6LUkuEWE1/ZFNlWkRHSzI9SixJWDlaa0lneFRjeFFZbkVTaD1OYzhKXzQ6TCYwPx4sOR01Pik9QzU8Qjg6PDc5PDU7PTI7PTA3OS45PDE/QzU4Py04QilFVTFVaDthekNuik1yk05ylk5ymlFznVNxnVJyoFV1o1h2pFt0olpvmlVmkE5eiEhbg0RkjE5hiUtgh0hjiklmjUpnjktlikVhhUVgg01XeUdQckBpYFFpYFFpYFFqYVJqYVJrYlNrYlNrYlNqYVJqYVJqYVJqYVJqYVJqYVJqYVJqYVJrYlNrYlNrYlNrYlNrYlFrYlFrYlFrYlFsY1JsY1JsY1JsY1JsY1RsY1RsY1RuYlRrXVBwYFF0ZFdyZFduYlZqYFRoYFNoYlRnYVNnYVFjXU1bVkNWUT1TTjhOSDJHQSlLRyxJPyRiSTORZ1e2eG27bGW4WVe5T0+2QkW9QkXCREfIRkjNSEvQSkvSTE3TS03PRUXQREXTRUTWRkXVRkLSQz3OQzzPRjzIRDjJRTnKRTzMRT/SREDXQ0PaQUTbP0PhQkbiQkThQ0TgREXgREXhRkTjRUTkRETjQ0PkQkDkQD/jPz7jPz7iQD3iQD3eQz/TQj/FPjq2OTOqNzCfOjCXPTKOPjOGPjKDPzKBPzOBPTKBOzOEOTOGOTOIODGIOTKFOzCEPC6EPC6DOy2BOy+AOi6AOi6AOi5+Oi1+Oi1+Oi1+Oi19Oy99Oy99Oy99Oy99OTB9OTB+ODB+OC6ANy6ANy6ANy5+OCyAOCx+OCx9OSx8OC17OS16OCx4OCx4OCx4OC54OC53Ny12OC12Nix0NitzNSpxNSttMSdyNixuNCltMyhvNittNClxOC1/ST2FU0iFU0qGUkeIUkiLUEiQUUqUUUuVUkyTVE2NVEuJW06CY1FvX0hZVTpNVjdPXztqfllieFFZb0hVakNSZ0BNYjtJWTVDUjE3RCY0PiMyOiM2Oyc8PjBAQjVAQDY8PjM1OC0zOS00Oi43Oi85PS87Py49Qiw8RShTXzthckZuhlJzkVVylVFymlNznVNynVV1nlp+p2V+p2VwmFliiktehkdehkhehEdghkliiEtkik1mjU5ljE1jiktgh0hehEdfgkxUdkRLbTtpYFFpYFFpYFFqYVJqYVJrYlNrYlNrYlNqYVJqYVJqYVJqYVJqYVJqYVJqYVJqYVJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RuYlRyYlNxYVJyYlVxY1ZyZlpvZ1ptZVhqZFZnY1draFlvaVlsZ1RoY09jXkhbVT1STDRQSjBIPiVRPylrUD1/WEeETkKIRT2TRD+xV1a4VFS7UVHAUE/ATk3BTU3CTErDS0rQVFTISEfCPT7EPTrQQkDTRUHPQjvHPjTKRDnJRTnLRj3NRz7URkLYRETcQUXdQUXhQkbhQ0ThQ0TiREXiREPhRkThRkThRkTgRUHfREDgQj/fQT7gQT3gQT3gQT3eQz/URT/IQzy6PjasOjCgOTCUOi+KPDCCPDCAQTJ+QDN+PjR/PDODOjOGOTGIODGJOTCHOy6FPC2EOyyEOyyDOy2COiyCOiyCOix/OS1/OS1/OS1/OS1+Oi9+Oi9+Oi9+Oi99OTB9OTB9OTB9OTB9OTB9OTB8OTB8OTB8OTB6OjB6OjB5OS95OS95OS93OS53OS53OC93OC90OC5zNy1yNixyNixwNitwNitrMSZxNyxtNClsMyhvNitsMyhwNyx+SD6EUkmFU0yIUUqLUEqQUUyUUE2VUU6UU0+KT0eFU0iAW0t7ZVBzaVBoa0xmcVFneFRedE1YbkdQZj9MYTpLXzpLXDpHVjdDUDQ8Ri04QCk2Oyc3Oik8PS8/QDI+PjI7PTA0OjAzOzA1OzE2PDA6PC88Py4+QSw+RCpRWzlebURrgVJwjFJwk1NxmVJznVNznlZ4n158omV4nmFrkVRghkldg0Zdg0ZcgkVghklhh0pjiUxli05kik1iiEtghklehEldf0xSdEJJazlpYFFpYFFpYFFqYVJqYVJrYlNrYlNrYlNqYVJqYVJqYVJqYVJqYVJqYVJqYVJqYVJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RuYlRxZFRvX1BtXVBtX1JxZVlvZ1xsZFloYlZmYldwbGB7eGl+e2p/eWl6dWJwaVZlYEpUVDxGRi5DPihNQi5TQC9VOChdNypsPTNuNzB1OTF+OzWHQDqSSUKbUEqlWFCtWlK7Xlm6U063R0W8Qj/IRELRRkPTREDPQDrQQTvQQzzSRT7UR0DWR0PaRkbbRUbeREbfQ0TfQ0TfQ0TfQ0TgREXfRUXfRUPfRUPeRELeRELcRD/bQz7cQz3cQz3cQz3bQz7WRUDORT/DQjyzPjWiOjGUOC2IOSyDOy2CQDJ/QDF+PjJ/PTGDOjGGOTGHODGIOjCHOy6EOyyEOyyEOyyCOiyCOiyAOi6AOi5/OS1/OS1+Oi9+Oi9+Oi9+Oi9+Oi9+Oi99OTB9OTB9OTB9OTB8OTB7OC97OC97OC97OzF7OzF6OjB5OzB4Oi94Oi94Oi94Oi90OC50OC5zNy1zNy1yNixxNStvNSpvNSpqMSZvNittNClrMidsNippMydtNyt9Rz2HUEmHUEmLUEqOUUyRUk2SU06UVVCRVlCMV0+HW1B+Xk90Yk5vaVFvclVsd1lmd1VRZUJLXzpFWTZEVTNFVjZHVjlHVDhFUjg/STA8RC05Pio3Oyo6PC48PjA7PS85Oy42PDI1PTI2PDI2PDA6PC88PjA9QC09QylNVzVaaUBmfE1siE5ukVFxmVJ1n1V0n1d6oWB3nWBulFdjiUxcgkVcgkVcgkVagENfhUhhh0piiEtkik1jiUxhh0pfhUhdg0hbfUpQckBHaTdpYFFpYFFpYFFqYVJqYVJrYlNrYlNrYlNqYVJqYVJqYVJqYVJqYVJqYVJqYVJqYVJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RuYlRyZFdvYVRtX1JrX1NrYVdsY1psZVtqZl1qZl14dGmIhHiRjYGVj4GSjH6JgnJ9emdgY05PVD5ERzJGRTFIQzBGPSxMPCxWQzRQOStSNipWNCpZNSlcNithOS9lPTFtPTGKS0KdU0quVU+2Tku8RkTGQULSREPYRkbUQD7VQT/WQj7WRUDZRUPaRkTbRUTdRUTeRETfQ0TfQ0TeRETeRETdRUTdRULeRkPbRkLaRUHZRD7YRT7XRDzXRDzZRD3YRT7URDzTRj/JRj66QTinOzGYOCyMOSuFPC2DQDB/QDF+PzB/PS+DOjGEOi+HOS+IOi6EOi2EOyyEOyyDOiuCOiyCOix/OS1/OS1/OS1/OS1+Oi9+Oi9+Oi9+Oi9+Oi9+Oi99OTB8OTB9OTB7OC97OC97OC97OC94OC57OzF5OzB5OzB5OzB4Oi94Oi94Oi92Oi9zNy1zNy1zNy1yNixxNStvNSpvNSptNClqMSZvNitsMyhoMiZrNSloMiZsNip8RjyKT0eMT0qNUEuPUk2QU06RVlCQV1CMWlGJXVKFYVV5X1BpWkdkX0lkaE9cZktOXUBFVThBUTQ9TTA8Sy4/TTNDUTdGUjpHUztCTDQ+RzI6QS85PSw5PS45PS44PC03Oy03PTM2PTU2OzQ2PDI6PDE7PS88Pyw8QSpKUzRWZT5ieElqhkxukVFzm1R3oVd4olp7omFymFtli05cgkVagENcgkVcgkVagENfhUhghklhh0piiEthh0pghklehEddg0hZe0hOcD5FZzVoYVFoYVFoYVFpYlJpYlJqY1NqY1NqY1NpYlJpYlJpYlJpYlJpYlJpYlJpYlJpYlJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RsY1RyZlh0aFxzZ1ttY1lqYVhsZV1zbmh6d3CBfneQjYagnZSopZyrp5yopJmjnZGZlod6e2tjZlNPUj9HSjdFSDVCRTJCRTJFSDVLTDxKSDlHRDVEPjBBOSxBNytANipGNChTNSpxQjiMUEifUEuvSUe/R0nMRUnTQkXWQELZQELaQkHbQ0LaRUHaRUHcREHcREHeRETeREbeREbeREbeRETdRUTdRUTaREPaRkLXRkHWRj7URT3URT3TRj3URT3VRj7UQTrTQzvORT3BQjmuPjOeOS2ROy6KPC+EPzCBPy+APi6APS2BOy+EOi2GOi2HOy6EOi2DOy2COiyCOiyCOiyBOSt/OS1/OS1+Oi9+Oi9+Oi9+Oi99OjF9OjF9OjF9OjF8OTF6OjF8OTF5OTB5OTB4OC94OC92Ny55OjF5OjF4OTB2OjB2OjB1OS91OS90Oi9yNy9xNi5xNi5wNS1vNCxuMytuMyttNCtqMShtNy1qNCpoMihqNCpmMidqNit9RDuNTkePTkiQUUqQVEyQVU+OV1CKWVKDW1F7WU12XE9rWkpdVUJZWERZXkhPWUE/SzM6SC83RS40Qis1QSs4RC49STNDTDdFTjlCSzY/SDU8RTI6QS84Py83Pi41PCw0Oiw1PDQ1PDU2OzU2OzQ5OzA6PC87Pi07QClHUDFSYTpgdkdphUtvklJ1nVZ5o1l5o1t4n2BukVdgg0lafUNbfkRegUdegUddgEZgg0lhhEpihUtihUthhEpgg0lfgkhegUlXfElMcEBCZjZoYVFoYVFoYVFpYlJpYlJqY1NqY1NqY1NpYlJpYlJpYlJpYlJpYlJpYlJpYlJpYlJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RsY1RrYVVuZFpwZlxsY1prZFxybWeEgXyRkIyno6C1sa7EwbzJxsHJxL7FwLrAubG5sqiknI+IgnJmY1RQUT9GSTg+RTM7RDE6RjI4RTM4RTM4QzI6QjM8QjRAQzhDRTpHRTk+NChQOi9lPzaARUGhUE+/WFvKUVbKQ0nVRkrXRUbaRkbbRUTdRULeRELdRD/eQ0HeRETeREbeREbeREbcREPcREPcREPaREPZRUHXRkHVRkDTRj3SRTzQRjzRRz3URT3UPzjVQDnQQzrGQzm2QTelPTCWPS+MPS6GPi+CPy+BPi6APS2BPC2DOy2EOi2FOy6COiyCOiyCOiyCOiyBOSt/Oit/OS1+OCx+Oi9+Oi9+Oi9+Oi99OjF9OjF9OjF9OjF6OjF6OjF5OTB5OTB4OC92Ny52Ny50OC53OC91OS91OS9zOS50OC5zOS5yOC1yOC1xNi5xNi5wNS1vNCxuMyttNCtsMypqNCpoMihsNixpMylmMidoNCllMSZpNSp7QjmOTUeSTUiRUEqPVEyNVk+HWE6BWU98XFFzXE5rW0xgV0ZWU0JQU0JKUT9ASTY0QCwzPCsyOyowOSgwOSgyOyo1Pi05QjE8RTQ/SDc/SDU+RzQ6RjI6QzI1QC8zPi0xPCwzOjMzOTU0OTU0OTI4OTE5Oy47Pi07QCpDTC9PXjddc0RphE1wk1N3n1l5o1l3oVlxmFlmiU9afUNYe0Fcf0VdgEZdgEZegUdgg0lgg0lgg0lgg0lgg0lfgkhegUddgEpWe0hKbkBBZTdoYVFoYVFoYVFpYlJpYlJqY1NqY1NqY1NpYlJpYlJpYlJpYlJpYlJpYlJpYlJpYlJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RsYlZqYFZqYVhrZFprZ151cGqIhYCfnpqwsK7DwsDT0tDi4d/n5uTn4+Dj3tre1tPZzsjOvLK4pZeXh3p5bV1fWUlLTDpARTE7RC8+SjY9SDc9RjU7QzQ7PjU6OzM5ODM4ODA9PTNDPDJONzFhODSISEivXV/FYGTKV1rNUVPTTk/XTUvbS0reSEfhRkTjREHiQkLfQ0TeREbeREbdQ0XdQ0XcQkTcQkLbQ0LaREPYREDVRD/TRj/SRTzQRjzQRz3URT3ZQDrZQDrRQjrIQzq8QzqsQDSZOy+MOSuJPS+DPi6BPi2APSyBPCyDOyyDOyyEPC2COiyCOiyCOiyBOSt/OS1/OS1+OC59OS5+Oi9+Oi99OjF9OjF9OjF9OjF9OjF9OjF6OjF5OjF4OTB4OTB3OC90OC5zNy1yOC10OC5zOS5yOC1xOC1yOC1wNyxwNyxwNyxvNi1vNi1uNSxuNSxtNCtsMyprMilpMylnMSdrNyxoNCllMSZoNCliMCVmNCl6QTiQTUeSTUiRUEqOVUyIWE6BWU94Wk9yXE5rXk5eV0dSUEFLTj1DSjo5QjEyOiswOCkxNysxNy0wNiwvNSsvNSkwOCsyOis0PC05RDQ7RjU9SDc8STc7RjU2QzEzQCwxPi0uODAwNjIxNjIyNzE3ODI5OzA6PC46Pyk/SCtLWTVbcUNog0xxk1Z3nlt3oVlznFZnjVBegUlVeEBXekJbfkZbfkZbfkZdgEhfgkpfgkpfgkpfgkpegUlegUldgEhdgEpVdklKa0BAYTZoYVFoYVFoYVFpYlJpYlJqY1NqY1NqY1NpYlJpYlJpYlJpYlJpYlJpYlJpYlJpYlJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RsYlZwZ15uZ19sZ2F0cWqHhH+hoJy8vLrO0M/Pz8/g4ODy8vL6+Pn79/b38/Dx7Onw4t/o0MbdwbXBq52ikYF9dWJeXEdLTTdDSDJBSTJBSTRARzVCRDdBQTdCPTlDOTc/OjY5PDU+PzdCNzFKLitkNjaPUVKzZ2nGbm3AXFzHWlfQVlPXUU7cTEviSEjmQ0TlQkPfQ0bdREbdREbdQ0XdQ0XcQkTcQkLcQkLcREPZQ0LXQz/TRD7SRT7QRjzQRjzURT3cQz3bQTnSQjrKRDu/RTqwQTacOi2LNSaKPC+FPS6CPS2APSyBPCyBPCyDPCqEPC2COiyCOiyCOix/Oit/OS1+OCx9OS59OS5+Oi9+Oi99OjF9OjF9OjF9OjF9OjF7OzF5OjF3OzF4OTB1OS90OC5zOS5yOC1xNyxyOC1xOC1wNyxuOCxwNyxtNytvNitvNitvNi1vNi1uNSxtNCtsMypqNCppMyloNClmMidrNyxoNCljMSZlMyhiMCVlMyh4QjiOTUeST0mOUkqKVU2DWE96Wk9xW01oXExaVERJSjo/QzQ+RDY5QTIwOCsvNyo2PDI0NzA1ODE1NzI0NzAyNS4wNiwwOC0xOSw2QTM6RTU9Sjk+Szk8STc3RjMyQSwxPi0sNi4uNDAwNTExNjA2NzE4Oi86PC46Pys8RSpJVzRZb0Fngk1wklZ2nVx1nlhwmVVghklYe0NTdj5XekJbfkZZfERZfERcf0dfgkpfgkpegUlegUlegUldgEhdgEhdf0xTdElIaEE/XTdpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NqY1NrYlNrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVsZFdpYlpnZF12c26Tko6vr63ExsXa3Nvq7u/z9Pb29/n8/P7///////3/+/r89/T98uz34dTy2MfgyrXGtp+qoIeIhGliYkZFSC1ESC9DRzBGRTFHRDVGPDNDNjBGNDJIOjk+PTk+PzpCOjdJNzVjR0aSamrFk5LoranSi4fHdG7AXVjGU1DVT07fSkznRkvpRkvfRUffSUvaREbUOz7YPkDhR0ngREfWOj3aQEDaQEDZQUDWQj7UQz7RQjzQQTvRQTneQz7bQTnTQDnKQTm+QjiwQDWfOi6QOCqMPTCHPi+DPi6BPi2APSx/PCuBPSqBPCx/Oit/OS1/OS1+OCx+OC58OC18OC18OC18OTB8OTB8OTB8OTB6OjF6OjF6OjF6OjF5PTV3PDR3OzN1OjJ0OTFxOC9wNy5wNy5vNi1tNy1tNy1sOC1tNy1sOC1tNy1tNy1pMittNi9wOTJvODFrNC1nMipnMipoMytlMChpNy5kMildLSNgMCZfLyViMihzPjaMT0qPUEuIUUqBUkp9WU12X1FmWUlUTj5ERTU+RTU6QzI1QDA0PC8zOzA0OjA0OjA2ODM3ODM2NjQ0NjEzNTAxNi8vNi4uNisuOSsyPS02QzI6RzY6STY4RzQ0Qy4xPy4qNCssMi4tMi4uMy00NS83OS46PC86Pys2PiZEUjFXbENoglJzlF13nl9ym1drlFJbfkRYeURUdUBUdUBXeENae0ZbfEdae0Zef0pig05ig05ef0pcfUhfgEtggUxefk1Uc0pGZEA8VzRpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NrYlNrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVsZFlnZF1vbmqGhYOkpKLBw8LW2tvq7u/3+/z3+/74/P/8/f/+/v7///3//vr//Pn/+vP/8OD769Tt38XXzbLAu52ko4SCg2NnaktMUTNHSi9FQy5HQi9IPjJJOjNMOTVLPDk/OjdCQT9NSEVdUlB5amejjovOsq7oxb//19Hss6rNgnzAY17KVlbYUlPfSE3aQUTWREXVRUXYSEjcSkvbRUbVPD7WPD7bQUPZPz/ZPz/ZQUDXQUDWQj7TQj3SQTzTQDncQTzbQDvTQDnLQjq/QzuxQTagOzGSOC2MPTCHPi+DPi6BPi2APSx/PCuBPCyBPCx/Oit/OS1/OS1+OCx9OS58OC18OC18OC18OTB8OTB8OTB8OTB6OjF7OzJ7OzJ6OzJ3PDR1PDN1OjJzOjFyOTBuOC5vNi1tNy1tNy1sOC1sOC1sOC1sOC1qOC1sOC1sOC1rNi5uNzBvODFuOTFsNy9pNCxnMiplMypjMShkNCpfLyVeLiRiMiheLiRgMCZwPjWBSkWHUkyHWFJ+WE9yVktkUkRRSjo+Py86QTE2QTA1QDAzPjA0PDE0PDE1OzE3OjM3OTQ3NzU3NzU1NzI0NjExNi8vNi4vNywuOSsxPC40QTA4RTQ5SDU4RzQ0RTI0QjEuOC8uNS4uMy0tMisyMys0Nis4Oi05PSw3PyhEUTNXbEVoglV0lWB3nWJwmFlnj1BZfERXeENUdUBUdUBWd0JZekVZekVZekVbfEdfgEtfgEtcfUhbfEdef0pef0pee01TbktGX0E5UjRpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NrYlNrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVuZVZuZVZsZlplZF95e3iXmZiytrfN0dLk6ez0+fz6///7///8///9/v/+/v7//vz///v///r///T+/Of6+d3v8NHh5cTS2LS8xJ+gqIOHkWxgZ0VRWDdERyxEQy5KRDRMRDdLQThJPjpDOzlTSktpYV+Bd3ackpC+s6/Zzsjq3NP+6N3/8+n/5NvwqaPDZWO1QkXHREnaUlbbVVTRTUvKREHNQ0HURkXXRUbYRETZQ0TWPT/XPkDYQD/WQD/WQkDTQj/TQj3UQTrZQDrZQDrSQjrLRTzARDyyQjehPDKTOS6OPDCJPTCDPi+BPi5/PS1+PCyAPS2APS1/OS1/OS1+Oi99OS59OS58OC17OC97OC99OjF9OjF7OzJ7OzJ7OzJ7OzJ6OzR4PDR0OzJxOzFyOTBvOS9uOC5sOC1sNixrNyxsOC1qOC1qOC1qOC1qOC1pOS1qOC1qOC1uOTFtODBtODBtODBtODBpNy5mNCtjMShkMilhMSddLSNfMCZjNCpcLSNfMCZzRDx9UEqBVlB+WVFwVEleSj9PQzc/PC00NigyOyowOysxPC4yPS80PDE0PDE1OzE3OjM3OTQ3OTY2ODM1NzI1NzIyNzAwNy8wOC0uOSswOy0yPy42QzI3RTQ4RzQ4RzQ5RjU0PjMzOjIvNC0sMigvMCgxMyg1Nyo2Oik2PidEUTVZbUprhFp3l2Z3nGZsk1pfh0tXeENXdUNUckBUckBWdEJYdkRZd0VZd0VaeEZde0lffUtde0lde0lffUtefEpad0tQZ0pBV0AzSTJpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NqY1NrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVtZFVuZVZuZVZuZVZuZVZtZ1tqa2aDh4ijp6i5vsHQ1djl7e/z+/31/f/7///7///8///8/vv9/vn+/fj//vf///P4/eb0/d7u99jm8s7d6cPO2rS2wZmhq4aAh2VmbUxNUTZGSDBISjVLSTpIRDlEQDdPR0RqYF+LgYCkmpm3r6zLxsLe29Tq5t368ej/+/H/9+3/3dX7trHlj47KY2SwQD/DUEvJVE3JUEjDRkDIR0LUTUrWS0jQQD/SPj7TPz/VPz7VQT/VQT/TQj/TQj3TQj3WPjnVQDrSQz3MRT/ART6yQTmiPTWVOzKOPDGJPTCDPi+BPi5/PS9+PCyAPS2APS1/OS1/OS1+Oi99OS59OS58OC17OC97OC9+OzJ+OzJ8PDN7OzJ7OzJ7OzJ6OzR4PDRyOTBvOS9vOS9tOS5sOC1rNyxqNitoNitpNyxpNyxpNyxoOCxoOCxoOCxoOCxoOCxtOzJsNy9qNS1pNy5qOC9qOC9mNCthMSdlNSthMihdLiRhMihiMylZKiBhMih5TkWBXFZ2V1JpTkdXQzpJPDNAOi46Oy04PC4wOCkvOiozOy40PC81PTI1OzE2OTA2OTA3OTQ2ODM2ODM0OTIzODEzOS8xOS4xOS4uOSsvOiwwPSwyPy41QjE3RTQ7SDY8STg5Qzg3PzQyOC4tMycuMCUvMSQyNCY0OCc0PCdFUjhdcFByi2R7mm53nGlmjVhVfEVTc0FUckBTcT9TcT9UckBVc0FWdEJWdEJXdUNbeUdde0lcekhefEpffUtcekhXcklKXkU8TTsuPy1nZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNpY1NqY1NrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVtZFVuZVZuZVZvZldvZlduZ11xcW+HjI+kqay3v8LN1djj7e/y/P70/v/4///6///7//z9//r8/fX6/PH5+e32+Or2/+jz/+Tw/eHu+dnp9NLe6MXK0q22vpmdo4F9gmJZXUJHTDVGSzdGSjlDRzlBQzhjXliFfXqroZ/Bt7XMwsHXz83m4d3x7un69/D89ev/8eb/8un/9Oz/5d/pqKS3aGOmTEG1UETBWU7HW1HGUUi/RD3CQTzLREHLQD3OQD7QQD/RQUDSQz/RQz/RQz/SQz3TPzvSQTzQRUDJRUC9Qz6vQDmgPjWVPTOOPDGJPDKDPTGBPTB/PTF+PC5/PS9/PS9+Oi9+Oi9+Oi99OS58OTB7OC97OC97OC98PDN8PDN8PDN7OzJ6OzR5OjN5OjN3OzNuNzBtODBsNy9sNy9rNi5oNi1oNi1oNi1pNy5oOC5oOC5nOC5nOC5nOC5nOC5oOC5rOTJoNi9mNC1nNS5pNzBoNzBlNC1iMSpjMitiMytfMChdMShdMShWKiFiNi17VUx0WVJhTkhOPzhBNy49Niw7OS05Oy45PDEzOS0zOy41Oy82PDA2PDA3Oi81OC00Ny42OTA0OTIzODEzOS8zOS8yOi8xOS4xOSwuOSsuOSsvOiwwOy0zPi42QzI6RTU8Rzc9RTg6QjU1Oy8wNigwMiUvMSQxMyUxNSQyOiVHUztidVd3j2t8m3JxlWdcglFKcD1Pbz5Rbj5Rbj5Rbj5Rbj5Rbj5TcEBTcEBXdERbeEhdekpdekpffExffExad0dSbEVDVT82RDcoNilnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNpY1NqY1NrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVuZVZuZVZvZldwZ1hwZ1huZ11sbm16goWTmqCrtbfEztDc5ujt9/n0/v/1/v32//z6//r7//n7/vP4+u319ujx9OP0/er0/ej0/OXz+d/y9tvp7M3Y17nFxKWxsJKPjnJlZ09NUDtHSzpGTT1HT0JLUUd7e3OfmpTFvrjYzszf09Pn29vz6+n89/Tw7+r8/PT///b//fP/+e//8+r/597/18vYk4O4ZVOjSjq0VEa9V0m1Rju3QDjIS0XHQz7KQz/MQj/OQ0DOQz7OQz7NRD7NQj3RQjzSQz/OREHFRD+4QT2qPTieOzWVPDSOOzOJPDKDPTOBPTJ/PTF+PDB/PTF/PS9+Oi9+Oi9+Oi99OS58OTB7OC97OC97OC98PDN7OzJ7OzJ6OjF5OjN4OTJ3ODF1OTFuNzBsNy9sNy9qOC9pNy5pNy5oNi1nNy1nNy1nNy1mNy1mNy1mNy1mNy1mNy1mNy1oNzBoNi9nNS5nNS5nNi9oNzBnNi9mNS5hMiplNi5eMilcMCdgNCthNSxpPTR1U0pYR0BFPjY8NS85NSw7OC84Oi81NywzNis2OS41Oy83Oi82OS42OS41OC01NywzNisyOCwxOSwyOC4xOSwxOS4xOSwxOSwxOSwuOSsuOSsuOSsvOiwwOyszPi42QTE3QjI8RDU6QzI4Py81Oy00NikyNCcxMyUwNCUwNyVIVD5leFx1jW10kmxmiV9Sd0tCaDlLazxOaztQbT1QbT1OaztOaztPbDxRbj5Wc0Nad0ddekpee0tffExffExWc0NOZ0A8SjkvOjIkLiZnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNpY1NqY1NrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVuZVZuZVZvZldwZ1hxaFlvaF5oaWttdHqFjJSjrLG/yM3T3uLl8PLw/Pzy/Pv1/vn4//f6//b8//L6/ez4+ef29+f29ur39+v69+j89ub99eL37Nbn2MPVxq/AsZqek311bltaV0ZQUUNTVktbYlplbGSVmI2ysqjVzsbo3dnz4+P66uv/8fT/9/n//vv+/fn5+vT4+u/8/PD///P///H/++r/5tHxqpS8b1upVkSuUkO1UES7TEG/SkHCRz/GRT/JRUDKRUDKRT7JRD3IQzzJQjzRQz/QRUDMRUHCQz2zPTmmOzWcOzWVPDaMPDOHPTSFPDWBPTR/PDN+PDB/PTF/PTF+Oi9+Oi9+Oi99OS58OTB7OC97OC97OC97OzJ7OzJ5OjN4OTJ3ODF2NzB2NzBzNy9uNzBqOC9qOC9qOC9qOC9oOC5oOC5oOC5nNy1mNy1mNy1mNy1kOC1kOC1kOC1mNy1nNi9oNzBpODFpODFoNzBpODFqOzNsPTVnODBrPDRiNi1hNSxvQzp4TEN0SUBuTURDOTA1Ni40NS84OTE4OzI0Ny4xNCsyNSw1OC01OC01Nyw0Nis0Nis0Nis0NikzNykvNyguOSkwOCsuOSkuOSsuOSkwOCkwOCkxOSowOCkwOCsvNyowOCsxOSwzOy40PC05QjE6QzA7QjA6QTE6PC42OCoyNCYvMyQyOSdJVT9jdVtthGdmhGJXeVRJbkU/ZDhIZztMaTtOaz1Oaz1MaTtMaTtNajxPbD5VckRZdkhbeEpdekxee01ceUtRbkBHXzs2QjQrNC8jKSVnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNpY1NqY1NqY1NqYlVsYlZsYlZtY1dtZFVtZFVtZFVsZVVtZlZuZ1dvZ1puaFxvaF5tamVrb3JtdHqDipClrrPDzNHV3+Hm7vH0/P70/fr3/fn5/vf6//T8//L8//H8/+79/vD7+O/++vH/+e//+u3/+en/8t/v4MvdzrfBspuil4F8dWJiX05YWkxdY1dtd258hn2mrKK+wLXa1c/u5OL87u7/9PT/9Pf+9PX/+fn7+vj7/fj8//r4//X0/PH3/fH///H/+ej/9OP/zLu9f3CbUUSpU0a1U0iyQzrASkDESEDHRz7JRj7IRT3HRDzGQzvGQzvNRz7MRz7HRz68QzutPjWfOjKXOjORPjaKPTWGPTSDPTWBPTSAPDN/OzCBOzGBOzF+Oi9+Oi9+OjF9OTB8OTB7OC97OC97OC96OjF6OjF4OTJ3ODF2NzB1Ni91Ni9xNi5tODBrOTBqOC9qOC9pOS9pOS9pOS9oOC5nNy1mNy1nNy1mNy1mNy1mNy1mNy1mNy1mNS5qODFtOzRrOjNqOTJqOjBtPjRvQzhsQDVvRDtkPDJjPTJ6VkqGZFp5V01iTEE+OjEzODE0OTI3PDU0OjAvNSsyNSw5PDMzNisyNSoyNCkwMygxMygyNSo0Nis0NywuNiksNykvNyotOCovNyovNyovNyovNyoxOSwwOCswOC0vNywvNywvNywwOC0wOCs3PzA5QjE8RTQ9RDQ7QTM4PC4yNictNCQyOypKVkJjcltofGFddlhPbUtGZkFBYTpIZDtLaDxOaz9Oaz9LaDxKZzlMaT1Oaz1UcUVXdEhad0tbeExdek5adk1OakFDWzsyPjQqMDAhJydoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqZFZqZFZqZFhsZFlsY1ptZVptZVhtZlZnYE5qZVJua1hvbF1oZVxmZWFzcXKBgoaKj5OWnqGrs7bDyMvY3eDq7u/29/n5+/r8/v3+/vz///r9/vb6/fL5/PH6/fL7/vP5+vL6+vL5+e38+uv+/Of5997p5crV1La6uZuYmHxxdFlfZE1ia1hyfWyEkIKRm5C0ubLLzMfj4t7y7uv38/L79/b9+fj8+Pf//vz+/vz+/vz9//r9//r9//r9//r9//r6/Pf///r/+/b/6uXYp6CjYFibRD21TkW/TUPCRjzERDnKRTzOSUDOS0HLSEDHRzzGRzjDSDi9SjizSDimRTWaQjSRQjWLQzWGQjWEQjaCQDSCPjOCPDKEOjGGOTGGOTF/OTF+OjF8OTF7ODB6Ny96Ny93Ny52Ni13Ny53Ny53OC93OC92Ny51Ni1xNStuMytsNy9pODFpODFoNzBoNzBnNi9nNi9nNi9mNS5nNi9pNzBpODFoNzBnNi9lNC1lMyxoMy1qNS9tODBrOTBqOjBpOy5pPTBrQTNnQjJqSTpkSDp2X09+a1yKeGqMf29SSj03OS40OjA0OjAzOS8zOS8zOS8yOC4yOC4xNy0xNy0zNi0wNiwyNSwvNSsxNCsvNSsvNC0uNS0vNC0uNS0vNC0vNC0vNC0vNC0wNS4vNC0vNC0uMywuMywvNC0vNC0vNi4xOzIzPTI2QDU4Qjc5RDY3QjQ1QDAzPi00Py5EUT1XZU5ba1FQYkhFWDxAVDhCVzZJYz5LZT5LZj1LZj1KZTxKZTpMZz5Paj9VcEdZdEtcdk9dd1Bdd1JXcU5IYj87TzYmMSsmKy4kKSxoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqY1lrZFpsY1xtZFttZVptZlZpZFFqaFNtaldqa1tnZ19sbGx+f4SQk5qor7W4wsTR1tni5+ry8/X7/P7//v///v/+/fv//vr///r+//n7/PT4+/L2/PL3/fP3+vH4+u/4+u33+un5++Xy9drf4sPM0K+0uJeRlnZrcVVZYUlfa1V0gW+MmIqdp5y/wbzT09Hn5+Xz8/H39/X7+/n8/Pr7+/n+/vz+/vz+/vz+/vz+/vz+/vz+/vz7//71///1///+////+/r/7erwv7rCfnWfS0GvTUC5Sz7CTEDFSz7DRTm8PTS+PzbDRTnERjfDSje9TDqzSjemRjaZQzKRQzaNRTeFQzeCQjiBQTeBPjWCPDSDOjOGOTGEOTN+OTJ9OjJ6OjF6OjF5OTB4OC92Ny52Ny51Ni12Ny50OC50OC50OC5yNixvNSptNCtsNy9pODFqODFoNzBpNzBoNzBnNi9nNi9lMyxlMyxnNS5oNi9qODFqODFqODFrOTJrNjBsNzFrOTBrOzFrOy9qPjFqQDBpRDJnSDZrUD1nUkF1ZlOBdWWMhXOGg3JLTDw2OS4zOS8zOS8zOS8yOC4yOC4yOC4xNy0xNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSsvNC4vNC4vNC4vNC4vNC4vNC4vNC4vNC4wNS8vNC4uMy0uMy0uMy0uMy0vNC4vNi8uODAvOjIxPTM0QDY2QjY2QjY2QjQ1QjE2QzFDUD5QXUlSYElJV0BBTzZCUDdFVTpKYkBKZD9LZUBLZT5JYzxIYzpJZDtKZTxTbkVYcktcdlFdd1RbdFRUbU9DXD42STUmMS0nLDAkKS1oZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqY1lrZFpsY1xtZFttZVptZlZtaFVraVRtaldqa1tra2N3d3eRkpenrLK/xszS3N7s8fT3/P/+///+/////v///v/+/fv//vr///r9/vj6+/P1+O/x9+vx9+v09+z1+ev2+Or1+OX19+Hu7tTb27/JyquwsZKTlnl1eWBrcFp0e2mIkIGfp5yuta3Nz8re3tzv7+34+Pb7+/n+/vz+/vz9/fv+/vz+/vz+/vz+/vz+/vz+/vz+/vz9//77///7////////+/n/+vT/9+390cbYnpCUTD2lUkKpTDunQDG3RzvPWU3PVUq8QDTERDfGSDrDSz25STuqQjedPzOXQDeTRTuJQDmEQTmBQTh/PzZ+PjV9PTR/PDR9PTR6OzR4PDR3OzN3OzN1OjJ0OTF0OTF0OTFyOTByOTByOTByOTBvOS9uOC5sNixrNStsNy9qODFsNzFqODFrNjBpNzBpNzBoNi9nNS5nNS5mNS5nNi9oNzBpODFrOjNrOjNsOzRqOzNpOjBoPDFrPzJqQzRpRDJmRTJmSTdsVkFqWUd1alaGf22RjnuAf21FRjY1OC0yOC4yOC4yOC4xNy0xNy0xNy0wNiwxNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSsvNC4vNC4vNC4vNC4vNC4vNC4vNC4vNC4vNC4vNC4uMy0tMiwtMiwuMy0vNC4uNS4rNS0rNi4tOS8vOzEyPjI0QDQ2QjQ3RDM4RTM/TDpFUj5DUTo7STI4Ri0+TDNEVDlKX0BKYkBMZEJLYz9JYT1HYDlGXzhHYDlSa0RYcExddVNedlZacVRQZ0s9VDguQS4mMS0nLDAlKi5oZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqY1lrZFpsY1xtZFttZVptZlZuaVZsalVsa1dsbV1wcWmAgoGeoaa5vsTEy9Hb5ef1+v37///8/f/8/f/+/P38+/n//vz///v//vn7/PT19u7u8ebp7+Pn7d/t8eLw9OXx9OPx9N/y8dzq6tDY2LzHx6uysZWhoYmRk32Qk4CcnpGqraK2u7TAxb/c3Nrp6ef29vT7+/n9/fv///3///39/fv+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/v77+/3//v///v/38u/88+z//PP/++3/9OTsw7G5gXCVUECiTz+4WEq3TT+1RTnARzzBQTbIRTvFST+9Rz2vQDmhPDSaPTaWQTyNPzuHQDyBQDp9QDt6Pzl5QDl4Pzh4Pzh2PTR2PTR2PTR1PDNzPTNyPDJyPDJxOzFvOzBvOzBvOzBuOi9rOS5qOC1qOC1pNy5tODJuNzJtNjFsNzFsNzFrNjBpNzBpNzBsOjNqOTJoNzBmNy9mNy9mNy9oOTFmOjFqPzZmPjRlPTFmPjJoQzNpRTVmRzNjRzJjSjZoVkBpXElza1aFgm+PjnpwcV85PSw0NywyOC4xNy0xNy0xNy0wNiwwNiwwNiwxNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSsuMy0uMy0uMy0uMy0uMy0uMy0uMy0uMy0uMy0uMy0tMiwtMiwtMiwtMiwuMy0tNC0qNCwpNCwqNiwrNy0uOi4xPTE0QDI1QTM2QzI6RzU8STc4RTEyPysyQCk4Ri8+TjREWDxFXT1LYEFKYkBLYD9HXztIXjpGXjpTaUVYcE5gdVZedVhablNMY0k5TTQpOiglLislKi4kKS1oZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqY1lrZFpsY1xtZFttZVptZlZsZ1RraVRubVlvcGB0dW2Fh4akp6y/xMrO1dvm8PL7///7///7/P79/v///v/+/fv///3///v+/fj3+PDv8Ojn6t/g5tre5dXn69rq79vt8Nvs8Nnu7tbo6NDa2L/MyrHCvae3taCxrp22tKfBvrXJyMPS087Z2dfo6Oby8vD6+vj8/Pr9/fv///3///38/Pr+/vz+/vz+/vz+/vz+/vz+/vz+/vz//vz//P///P//+/r8+/f9//n+//j+//T//+3//uz438vFnIqdYlCWSjqlTDy0UEC8TD6/QDfGQzvFRj+/RD2xPjumOjeeOjiZPjuRPTuKPzyEQD19QD14QTx0QjtyQztyQztxPzZzPjZzPjZyPTVyPTVyPTVwPjVvPTRuPjRtPTNsPDJrOzFqOzFpOjBpOjBqOjBuNzJwNjJwNjJtNjFtNjFsNzFpNzBpNzBsOzRrOjNoOTFlOTBlOTBlOTBlOjFkPDJmQjZjQTVjQzRkRDVkRzVkSTZiSTNfSTJeTDZlVj9qYk1ybVeEg2+Eh3JbYEwzOigyOCwyOC4xNy0xNy0xNy0wNiwwNiwwNiwxNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSsuMy0uMy0uMy0uMy0uMy0uMy0uMy0uMy0tMiwtMiwsMSssMSssMSssMSstMiwsMywsNi4rNS0qNCsqNCsrNSwuOC0wOy0yPS8yPS01QC82QTA1QS0xPSkxPSk1QS04Ri89TzVAVDhGWT1IXEBKXT9JXj1LXj5LYD9UZ0dbcFFjdlphdVpZa1NKXUc2RzQmNCUkLSokKSwiJypoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqY1lrZFpsY1xtZFttZVpsZlZqZ1RralVsbllvcmFzdm2BhYSfpKi4v8fW3+Tt9/n7///7///7/P/+/////v/+/fv///v///r8/PTz9err7eLj59nd49Xc49Hk6dPn7NXp7dbq7NTr69Po5s/f2sTTzrjTzrrMxrbLw7jQycHX0s7g29jq5uXw7+3z8vD5+ff9/fv9/fv9/fv///3+/vz8/Pr+/vz+/vz+/vz+/vz+/vz+/vz+/vz//fz/+/z/+Pn//v3+//35//30//jv//X3//bw9+f//+3/7tvNp5Ska1iiW0eqV0WtTDu5RDrARDzART68RT+0QT6qPTqiOjmaOzmVPTyNPz2FPz19QDt3QjxyQztvRDtvRDtwPzhxPzZxPzZxPzZxPzZwPjVvPzVvPzVvQDZuPzVtPjRrPDJoPDFoPDFoPDFsPDJvODNxNjJwNjJwNjJtNjFsNzFqODFpODFoNzBnODBlOTBlOjFkPDJlPzRmQDVkQjZeQjRhRzhjTDpkTTtjTThgSzZdSzNdTTRdUTliWD9taFJzc1uAg252e2VGTzo0PSozOS0yOC4yOC4yOC4xNy0xNy0xNy0wNiwxNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSstMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwsMSsrMCorMCorMCorMCosMSssMywuNS4sNi4qNCsqNCsqNCsrNSwtNywuOSstOCowOys0Py81QC80Py4zPyszPi0zQCw3Ri85SzNATzhCVDpHVzxIWz9NXUJNYERVZUpcb1NkdFpgclpYZ1JHWEU0QjEkMiUkLSokKSwiJypoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqZFZqZFZqY1lrZFpsY1xtZFtsZlpsZlZsaVZsa1ZrbVhrbl1scmh5f32VnaCut77S2+Dq8/j7///5/v/5+v7+/////v/6+ff///v+/fj5+fHx8+jp697j59jf5tbg6NPk6dLn7dPo7NPn6dHo6NDn5c7g28fX0L7a08PZ0cbe1Mvm3dju5OPz6er68fT/+fv6+ff+/vz///39/fv9/fv///3///38/Pr+/vz+/vz+/vz+/vz+/vz+/vz+/vz//fz/+fj/+vn//v38//33//7u//nx///y//31//rz+ev//e3/+uj0zrurd2KPUTqqXEiyTj64Sj25ST64SUC0R0CvRD6lPTqcOjeWPTmPPjqIPzmAQTp4QTp0RDpwRjpwRTxwPzhxPzhxPzhxPzhxPzhxPzhwPzhwPzhxQjpwQTluPzdsPTVpPTRqPjVqPjVuPTZvODNyNzNwNjJwNjJuNzJsNzFqODFpODFkOC9kOTBjOzFkPjNkQDRjQTVjQTVfQzVaRTRfTjxnVkJoV0NjUzxeTzhbTzVcUjddVjxdWT5ubFV0dl58gWtjbVUyPig2Qi4zOy4zOS8zOS8zOS8yOC4yOC4yOC4xNy0xNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSstMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwsMSssMSsrMCoqLykqLykrMCosMSsrMistNC0rNS0qNCwqNCwrNSwrNSwsNistNywsNisvOiwyPS82QTE3QjI3QjE1QDA0Py4yPy00Qy46RzM9TDVBTzhEVDpKWD9MXEJUYklca1RjcVpebVhVYlBEUkEyPjAjLyUmLywmLCwkKipoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqZFZqZFZqY1lrZFpsY1xtZFtsZlpsZlZvbFltbFdqbFdna1pmbGJye3iOmJqosbjK09jj7PH4/f/3/P/6+//+/////v/6+fX///r9/fX4+O7w8uXp693l6djj6tjl7dbm7NLp7dLq7dLo6M7o5s/o48/h2sjY0MPYzsTd0szq39v47ev/9Pb/9fn/9fv/+fz+/P3///3///3+/vz+/vz///3///39/fv+/vz+/vz+/vz+/vz+/vz+/vz+/vz//vr//fv//fv9/Pr5/fz4///1///z///t/frz//v7//r///T/9ub/89//483XrZWpb1moV0SuUUCsTz6vT0GxT0KtS0CkQzyZPDWVPjePPzaIPziBQTd7Qjd1RDZxRThxRThwPzhxPzhzPjhxPzhxPzhxPzhxPzhwPzhzQjtxQjpvQDhtPjZsPTVqPjVtPjZvPjdvODNxNzNvODNtODJtODJpODFoOTFmOjFmOzJkPjNkQDRiQjVgQzVdQTNcQDJXQjFURzRbUz5mXkdpXkhiWD9aUzlaUzdcVzpaVjtYVztrbVVzd151fWZVYUkmMhw4RDAzOy40OjA0OjAzOS8zOS8zOS8yOC4yOC4xNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSstMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwsMSsrMCorMCoqLykqLykrMCorMCosMSsrMispMysqNCwrNS0rNSwsNi0tNy4tNywsNisuOC0yPDE2QTM5RDY5RDQ3QjQ2QTEwOysyPy01QjA5RjI8STVATjdGVD1KWD9SYElbaFRhblpcaVdRXk1CTkAvOy8iLCMrMS0oLiwmLCxoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZpZldpZldpZldpZldpZldpZldpZldpZldrZVdrZVdrZFpsZVttZF1uZVxtZ1ttZ1dxbltrbVdrbllrcmBqcmdweXaHkZOfqrC7xMnQ2d7q7/P2+/78/f/+/////v/+/fn///r+/vb6+vD2+Ov09ujw9OPq8d/n79jw9trt8tTr7tHs7NLo5tHh3Mnd1cje1Mrh1M7o2tny5OT66+7+8vT/9/v/+f///P///f7+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+//r//vr//vr+/vz9//77///6///6///7///+//////3/+/X/+/H//Oz/++X/89v/6tG6gmmmYkuXTzmfVD+oWkajUkGdSjqgTT+OPDCLPTCGPjJ/PS94PS90Py9zQjN0RDZyPTVyPTd0PThzPjh1QDp1QDp0PzlxPzhzQTpxQDlxQDlxQDlwPzhuPzdvPjdvPjdrOTJtODJsOjNsOzRsOzRoPDNnPDNjPTJjPzNePjFkRzljRzlUPS1OOShNOCdAMR5XUTtQTjdLSTBPSzJdWT5pZUplYURWVTdYWDxdYENvc1p6gGZkbFU9STEtOSMyPio0PC81OzE0OjA0OjA0OjAzOS8zOS8zOS8zOS8zOS8zOS8yOC4xNy0xNy0xNy0wNiwxNjAxNjAwNS8wNS8vNC4vNC4vNC4vNC4sMSssMSssMSssMSssMSssMSsrMCorMCouNS4tNC0tNC0sMywtNC0tNCwuNS0uNS0rMiotNCwwNy81PTI5QTY9RTg/Rzw/Sjw3QjI1QC8zPi0xPSkyPio5RS9CTjhJVT9PW0dWYk5daFdZZFRMV0k8RjsvOS4pMyopLysoLionLStoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZpZldpZldpZldpZldpZldpZldpZldpZldrZVdrZVdrZFpsZVttZF1uZVxtZ1traFdvblpqbFZrbllrcmBqdGlxfHiJlJajrrS+x8zS2+Dr8PT3/P/9/v/+/////vz+/fn///r+/vT7++/3+ev09+bw9eHq8t3o7dbq79Hm68vk58rm5szj4czf2cne1Mrf1M7n2djt39/25+r77/P/9Pj/9/v/+v7//P///vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz9//z7//r7//r9//z9/v/+/f///P///P//+////P///P//+/n//PX//vH//+3/++X/8tn/69HgsZendVyRW0OWWkKaWUOaVkOZUkCORzWLRjaIRTSDRDN8QzJ3QjBzQC9vPi91QDhzPjh1Pjl1QDp0PzlvPTZwPjdzQTpxPzhwPzhwPzhuPzdvPjdtPjZuPTZtPjZrPDRsPTVtPjZrPzZqPzZnQTZlQTViQjVkRzlbQTJeRzdeSThOPStGNyRHOCU+NiFMTDRHSzJERyxERCpNTTFcWz9iYUNgYUJZWT1kZ0pzd15zeV9YYEk6RCwvOyU3Qy82PjE2PDI2PDI2PDI1OzE1OzE1OzE1OzE1OzE1OzE1OzE0OjA0OjAzOS8zOS8zOS8yNzEyNzEyNzExNjAxNjAxNjAwNS8wNS8uMy0uMy0tMiwtMiwsMSssMSsrMCorMCoqMSoqMSopMCkpMCkpMCkqMSorMiosMysuNS0tNCwuNS0wNy80OzM5QTY/Rj5CSj87Rjg6RTU3QjE0Py4zPys2Qi48SDJATDZMWERTX0tZZFRXYlJMVks9RzwxOzIrNSwrMisqMCwpLytoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZpZldpZldpZldpZldpZldpZldpZldpZldrZVdrZVdsY1ptZFttZF1uZVxtZ1traFdtbFhpbVZqb1lrdGFpdWlxfXmKmJmlsri/ytDU3eLt8vb3/P/8/f/9//7//vz+/fj///f9/fP6++33+un09+Tv9N7n79jl69Hi58ne4cLd3cHe3sbe28jd18vg1c/k2dfu4uLz5+v67vL/9Pj/9/v/+fz/+v3//f3//vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz9//z4//z4//z7//7+/v7//P//+v//+f//+P//+f//+v//+vr//fj///b///P9/+//+ub/9Nz/+OD/7NPjv6esgmqHWUKFUTuSW0aXXUmNUz9/RjJ1PilyPilzQCt0RDB2RTRxPzRuPDNxPDR0QjlzQThvPzVxQTd4SD5uPjRtPjRtPjRrPzRsPTNqPjNsPTNqPjNnPzVnQTZnQTZnQzdlQzdjQzZgQzVeRDViSztVQjFaSTdgU0BSRzNDOyZFPShGQStBRSxCSC5BRSo8QCU/QiVOTjJfYEFpakthYUVucVR2emFnbVNKTzk0PCU0PSg9RjM4PjI4PjQ4PjQ4PjQ3PTM3PTM3PTM2PDI4PjQ4PjQ3PTM3PTM3PTM2PDI2PDI2PDI1OjQ0OTM0OTM0OTMzODIzODIzODIyNzEwNS8wNS8vNC4uMy0tMiwsMSsrMCorMCopLigpLigpLigpLigpLigqLykrMCosMSsxNjAvNC4sMSssMSsvNC42OzQ9QjxBSEBASz0+Szo8STc4RTM0QS0yPyszQSo1QyxEUT1LWERRXk1RXk1IVEg8SDwyPjQuOC8tNC0tNC0sMyxnZFVnZFVoZVZoZVZoZVZoZVZpZldpZldpZldpZldpZldpZldpZldpZldpZldpZldrZVdrZVdsY1ptZFttZF1tZlxtZ1tqaVdrbVhpbVZqb1lqc2BodGhtfHeImJims7m/ytDT3OPr8Pb2+//8/f/9//7///3//vn+/vb9/fH6++33+uf09+Lu89zl7dXi6M7b4MDX2rvW1rzZ18Ld18fe183l29ns4OD47PD78Pb/9fv/+f7/+v3/+/v/+/v//fz//vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz9//z4//74//77//7+/v7//P7/+v//+f//+P7/+v3/+fz/+fn//fr///j///j7//X8/vD//+3//On/8d//8N3/79rx0r20kHp7Uj50SjR1SDN2STR6TTh9UDt5TDduQS5lNyd7TUBzRDpxQjhzRDpvQzhnOzBkOC1nPTFpPzNpPzNpPzNnPzNmPjJmPjJmPjJlPzJiQDRiQjVgQzVfQzVfQzVbRDRaRTRXRDNYSTZPQi9cVD9vaVNjXkhNSzRJRzBJSzM+RCo/SC1ARio8QiY8QSNGSSxYWTpkZUZtbVF4eFx0dl5bX0ZAQy42OyU4QCs8QzE5PzM5PzU5PzU4PjQ4PjQ3PTM3PTM3PTM5PzU4PjQ4PjQ4PjQ4PjQ4PjQ4PjQ4PjQ3PDY3PDY3PDY2OzU2OzU2OzU1OjQ1OjQzODIzODIxNjAwNS8vNC4tMiwsMSssMSsrMCorMCoqLykqLykrMCosMSstMiwtMiwwNS8uMy0rMCorMCotMi4yNzE4PTk7QjpASz1ATTtATTs9SjY4RTEzQCwxPygwPic8STVCTztIVUNJVkVEUEI7RzsyPjQuOjAsNi4uNS4tNC1nZFVnZFVnZFVoZVZoZVZpZldpZldpZldpZldpZldpZldpZldpZldpZldpZldpZldrZVdsZFdsY1ptZFttZF1tZlxtZ1tqaVdrbVhpbldpcVpnc19kcmVqeXSFlZWjsre9yM7S2+Lq7/X0+f37/P/9//7///3///r///j///P+//H7/uv3+uXw9d7m7tbi6MzZ3L/V1bnS0LnU0b7a1Mjg2dHq4N/06e3+8/n/9/z/+////f///v///vz//vr//vr+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz9//76///6///7///+/v7//f7//Pz/+/z/+/r/+vj/+ff/+vf//fj///v///v9//r9/vn59O7//vb//fT//PP/++7/9+f75tXp0sDPtKG2moWUdWF3VkNqSTZsSTZyTTt1UD5tRjdpQjNnQjJqRTVuSTluSjpvSztvSztlQTFjQjFjQjFjQjFjQjFjQjFiQzFgQzNdRjZcRzZcRzZaRzZaRzZXSDVURzRSRzNQSDNOSDJmZE1+fmZyclpWWEBKTDRHTTM8RSo8Ris/SCtBRytBRihERypNTi9UVTZ4d1t7el5ublZVVT1DQi4/QSw+QS46Pi07PjM5PzU5PzU4PjQ4PjQ3PTM3PTM3PTM4PjQ4PjQ4PjQ4PjQ4PjQ4PjQ4PjQ4PjQ5Pjg5Pjg5Pjg4PTc4PTc4PTc3PDY3PDY2OzU1OjQ0OTMzODIyNzEwNS8vNC4vNC4tMi4tMi4sMS0rMCwrMCwsMS0tMi4tMi4sMS0sMS0sMS0sMS0uMjEwNTEzNzY0OzQ7Rzk9TDlATzxATzo8SzY3Ri80QywyQSo2RS46STRATzxCUD8/TT44RjcxPzItOS0sNi0tNCwsMytmY1RmY1RnZFVoZVZoZVZpZldqZ1hqZ1hpZldpZldpZldpZldpZldpZldpZldpZldsZFdsZFdsY1ptZFttZF1tZlxtZ1tqaVdrbVhpbldpcVpnc19icGNneHKClJSjsrfAy9HU3eTr8Pb1+v77/P/9//7///3///r///j///T///P//+/6/ejy9+Dn8NXi6MzX2r3R0bXNy7TOy7rWz8Xe19Hs4uP37vP/9v7/+v///f///v////3+//r+//n+//r+//r+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/v79/v/9/v/9/v/9//79//z+//r+//n///f9/fP9/fX+/fj+/fn//vz+/v7//f///v/++f///P//+/z79vP/+PL//fT//vH//e3/+un/8uD35NPn0r/Su6m5n46fhHOPcmJ8XUt9Xkx0VUNhRDJXOihZPCpbPixYPSpgRTJgRTJgRTJfRjJgRzNgRzNgRzNdSDNcSzdcTTpcTTpZTDlYTTlVTThSTDZRTDZOTDVRUTlpa1N8gGdtcVhTWT9GTDI+Ryw8Ris8Ris/SCtESi5FSixERypISSpMTS55eFx0c1dmZE1UUjtMSTZLSjZGRTM8PS08PzQ5PzU5PzU5PzU4PjQ4PjQ4PjQ4PjQ3PTM3PTM4PjQ4PjQ4PjQ4PjQ5PzU5PzU6Pzk6Pzk6Pzk6Pzk5Pjg5Pjg5Pjg4PTc4PTc4PTc3PDY2OzU1OjQ0OTMzODIzODIvNDAuMy8tMi4sMS0rMCwrMCwrMCwrMCwrMCwsMS0tMTAuMjEvMzIvMzIvMzItNC0zPzE3RjM9TDdATzo/Tjc8SzQ5SDE4RzA1RC04RzA8SzY+TTo8Sjk3RTYxPzItOS0rNSwtNCwsMytmY1RmY1RnZFVoZVZoZVZpZldqZ1hqZ1hpZldpZldpZldpZldpZldpZldpZldpZldsZFdsZFdsY1ptZFttZF1tZlxtZ1tqaVdqbFdobVZoclpmc19jcWRoeXOFl5elt7vH0tja4+rw9fv4/f/8/f/9//7///3//vn///X///L///D8/+z4++bv9N3i69Dd48fV1bnOzLPJxLDKxLTQyb/a0s/p4OP27fL/9///+v///f///v////39//r8//j8//j9//r+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/v7//P///P/+/f/9//76//r4//n4//X4//P4//P4//X8//j9//r//f7//P///P//+//99///+v///P///f///v/+/fv7+/P6+Oz///H//+///+3//u3//e3/9uf/7uD96tv649H/5tDjyrSlj3h0XkdlTzhiTDVcSDBeSjJcSjJcSjJdSzNdSzNeTDReTDRcTTZZTjhXTzpXTzpWUDpVTzlTTjhQTjdOTjZNTzdQVDtgZkxmb1RVXkNFTzRBSzA8Ris/SS4/SS5DTC9ITjJITS9GSSxPUDFZWDpxbVJqZkthXEZbVkBZVEFUUT5NSjlCQzM9QDU7QTc7QTc7QTc6QDY6QDY6QDY5PzU4PjQ4PjQ4PjQ5PzU5PzU6QDY6QDY6QDY7QDo7QDo7QDo6Pzk6Pzk5Pjg5Pjg5Pjg6Pzk6Pzk5Pjg5Pjg4PTc4PTc3PDY3PDY0OTUyNzMxNjIvNDAtMi4sMS0rLy4rLy4sMC8sMC8tMTAuMjEuMjMuMjMtMTIrMS0rOSovQC02SDI7TTc9Tzc8TjQ6TDI6TDI1Ry83STE6TDY8TTo6Szk2RzcwQDMtOy4sNi0tNCwsMytjZFJjZFJkZVNlZlRnZVZoZldpZ1hpZ1hoZldpZldpZldpZldpZldpZldpZldrZVdrZVdrZVdsZFlsZVttZF1tZlxrZ1tqaVdpa1ZobVdoclpndGBkcWdqe3WJm52qvMDN2N7g5+30+f/6///7///9//z+//r+/vb6+u76++36++n4+uXz9uHq7tff48rZ3MHT0bjMx7HFvqzGvrHMw7zWzsvm3eD06vL+9///+v///v/////+/v79//r8//r8//r9//z+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz//vz//vz//vz//f7//P///P///f/9//77//z4//n3//f3//X4//b5//b8//j///v//v3//P//+///+v//+v//+////P///v/+/f/7/fz8/vv+//r5+vL6/PH9++/++u7/+ez/++z//e///ez/8Nv/++Ls3MOejnVgUDdSQilYSC9YSC5bTTNbTTNaTjRaTjRbTzVbTzVcUDZbUThVTzdUTzlUTzlRTzhQTjdOTjZLTTVJTTRKTjVMUjhTXEFQWTxASSw7RihBTC4/SixETTBFTjFKUTJNUjRKTTBMTDBZWT1rak5oZEliXkVeWkFfWkRgW0daVUFRTzpLSjhBQjRAQjVAQjU+QTY+QTY+QTY9QDc9QDc5PzU5PzU5PzU6QDY6QDY6Qjc6Qjc6Qjc7QDk7QDk7QDo6Pzg6Pzk5Pjc5Pjg5Pjc7QDo7QDk7QDo7QDk6Pzk6Pzg6Pzk6Pzk4Pzg3PTk0OzQzODIxNjAvNC4uMy8uMy8uMjEuMjEsMi4sMi4rMisrMiosNCkpNiUkNh4pPSEyRis4TDE7TzY7TTU7TTU7TTU4SjI5SzM7TTU8TjY8Tjg3SDUxQjAuPC0tNywuNS0tNCxdZU5eZk9fZ1BgaFFkaVVmaVZnaldpalhmZ1VoZ1VoZVZoZVZqZFZrZVdrZVlsZlhsZlhraFltZ1trZ1xtZl5qZltpZVlnZVZnaFZma1Vlbllib11kcWhzg4CWqKy5yM/S2+Li6e/y9/v3/P/5/fz8/vn8//b8/vH3+Or5+ur49+Xy8d3u7dnr6tbg38rX0r7Xz7zLwK69tKW9s6nCt7HMwsHb0tfq4Oj68/v89v/++////v/+/f/8/f/8/v38/v3+/v7+/v7+/v7+/v7+/v7+/v7//vz//vz//vz//vz+/fn+/fn//Pn//fr//vv//vv//v///f7//P3//f7////+//39//z7/fj///v8/ff//fj//vr//fj/+vb/9/T/+fn/+v///P///f/////////9//z9//78/v3+/////////vz//vn//vP//u7//er//eb69Nz/+uDn4MaPiGxVTjJXTjFUSy5TSitXTjFXTjFVTjFVTjFUTzJUTzJUTjRTTzRRTTJSTjVRTzZQUDZNTzdLTzZITTZHTDVKUDZGTzRBSi09Ric+SCZESypGTStFTCpQVjRQVDNLTi9ISyxUVDhiYkZjY0laWkBbWUBcWkFdW0JdW0JbWUBYVj1VUzpTUThIRjFHRDFEQTBBPzBAPjE+PjI/PzU+QDU7PjU5PzU5PzU5QTY5QTQ4QzU4QzU4QzU6Qjc5QTY5QDg4QDU4Pzc5QTY5QDg6Qjc6QTk6Qjc5QDg6Qjc7Qjo8RDk9RDw+RT04Qjo4Qjo3QTg4QDU2PjE0PC8zOS8yNzEuNDAvNTEtNy8tOS0uOykwQCY2Ryc3TSc7Vis6Vys7VTA7VDQ7Ujg9UDo+Tzw+UDo6TDZAUjhFVz1GWT1EWD1AVDs1SDIrPCksNissMysrMipaZ01baE5caFBdaVFialNja1RnbFhoa1hnaFZnaFZpZldpZldrZVdsZlhtZVptZ1ltZ1lraFlrZ1trZ1xqZl1qZltoZlplZlZoaVdnbFZmb1xlcmFqd256iomcq7K6yNHQ2eDh6ezy9/v4/v75/vr6//j7/vP5/e/4+ev3+Ob19OLt7Njp5tPl4s/c18TSy7nKv63BtKS5raG8r6bBtrLLwcDb0Nbm3+b78/799//++////v/+/f/8/f/8/f/8/f/+/v7+/v7+/v7+/v7+/v7+/v7//vz//vz//vz//vz//fr//Pn//Pn//fr//fn//vr//v3//fz//P3//f7//v///v///f79+/z//v3//vv//Pr/+PP47efy5d326N/78Or/+v3//P///f7///3///v9//z9//78/f/9/v/9/v///f///vz//vX//+7//uj//+T69t39++Lk4MeLh2xSTTBTTjBRSytRSytVTy9VTy9UTzFUTzFTTzJTTzJRUDRRUDRRTTJQTzNQTjVOUTZNTzdKUDZITTZFTTVIUTZFTjFCSy4/SSdCSShGTStKUCxLUS1OUi9QVDFWWjdeYkFfYkNZXD9UVzxVVT1WVj5XVT5YVj1ZVz5YVj1YVztXVjpYVDlRSzNPSTNMRzRJRDFEQTJCQDNBPzM+QDU8PTU5PzU5PzU5QTY3QjQ4QzU3RDM3RDM6Qjc5QTY5QTY4QDU4QDU5QTY5QTY6Qjc6Qjc6Qjc6Qjc6Qjc7Qzg8RDk9RTo8Rjs9Rz88SD48Rjs7RjY8RDU6QjM5PzM4PTY3Pjc0PjYzPTQwPi0zQyk5TSpCWS9HYTFPcDtMbjtMaT1GYT5CWT88Uj07TDo6Szg9TzlEVjxLXkJNYEJMYERIXEA6UTcxRC4rNSorMiopMChaZ01baE5caFBealJialNkbFVnbFhpbFlpalhpalhraFlraFlsZlhtZ1luZltuaFptZ1lraFlrZ1tqZltqZl1pZVpoZlpmZ1doaVdlalRkbVpndGNvfHN/j46drLO2xM3N1t3e5unx9vr4/v76/v35/vj4+/L0+Orz9Obw8d/q6dfh4Mzc2cbX1MHQy7jHwK6/s6O9sKC8sKTDtq7LwLzVy8rj2N7r5Ov89P/99//++////v/+/f/8/f/8/f/9//7+/v7+/v7+/v7+/v7+/v7+/v7//vz//vz//vz//vz//fr//fr//Pn//Pn//Pj//Pj//fz//Pv/+/z//P3//v///v///f7+/P3//v3//vv//fv88+7q39ni1c3r3dT37Ob/+v3//P///f7///3///v9//z9//78/f/9/v/9/v///v////3//vX//u3//ef//uP7997+/OPj38aJhWpQSy5RTC5RSytRSytUTi5VTy9UTzFVUDJUUDNTTzJRUDRQTzNRTTJPTjJQTjVNUDVNTzdKUDZJTjdGTjZIUTZGTzJDTC9DTStGTSxKUS9PVTFTWTVRWTJXXzhqcEp5f1txdlZZXkBLTzRNUDVRUTlRUTlSUDlTUThUUjlVVDhZVTpaVjtYUjpWUDpSTTpOSTZIRTZEQjVDQTU/QTY8PTU5PzU6QDY5QTY3QjQ3QjQ3RDM3RDM6Qjc6Qjc5QTY5QTY5QTY5QTY6Qjc6Qjc6Qjc6Qjc6Qjc6Qjc7Qzg8RDk+Rjs8Rjs/SUE+SkA/ST4+STk/Rzg+Rjc+RDg9Qjs+RT45Qzs2QDc0QjE5SS9CVjNQZz1YckJef0pbfUpYdUlNaEVDWkA5Tzo2RzU0RTI8TjhFVz1OYUVTZkhTZ0tOYkZAVz02STMvOS4vNi4tNCxaZ01baE5caFBealJibFRlbVZobVlpblprbFprbFpsaltsaVpuaFpuaFpvZ1xvaVtsaVpraFlqZlpqZltpZVxpZVpoZlpmZ1dmZ1ViZ1FhaldlcmFvfHN+jo2WpayrucLH0Nfa4efu8/f2/Pz4/Pv1+vTz9u3u8uTp6tzj5NLc28nT0r7Oy7jJxrPDvqu9tqTDt6fHuazNwbXWycHf1NDp397z6O748fj99f/++P///P/+/f/9/P/8/f/8/v39//7+/v7+/v7+/v7+/v7+/v7+/v7//vz//vz+/fv//vz//fr//fr//fr//Pn/+/f/+/f//fz//Pv++vv/+/z//f7//v///f7+/P3//Pv//vv//fv99O/t4tzm2dHw4tn88ev/+v3//P///f7///3///v9//r9//78/f/9/v/9/v///v////3//vX//u3//Ob//OH++eP//ufk38mKhm1QSjBSTTBTTC9TTS1UTi5VTy9VUDJVUDJUUDNTTzJQTzNPTjJQTDFOTTFPTTRMTzRMTjZKUDZKTzhIUDhKUzhHUDNHUDNJUzFNVDNPVjRWXDhcZD1nckh0gVWIk2mQm3OFj2xudVRaYUJSVjtMTjZOTjZNTTVOTDVPTTZSUDdXUzpZVTxaVD5YUjxUTzxRTDlLSDlHRThFQzdAQjc9PjY6QDY6QDY5QTY3QjQ3QjQ2QzI2QzI7Qzg6Qjc5QTY5QTY5QTY5QTY6Qjc7Qzg7Qzg6Qjc6Qjc7Qzg7Qzg9RTo+Rjs9Rzw9Rz88SD4+SD0+STk/Rzg+Rjc+RDg9Qjs9RD05Qzs2QDc0QjE5SS9EWDVSaT9bdUVae0ZXeUZUcUVJZEE9VDoySDMvQC4tPis2SDJAUjhMX0NSZUdTZ0tPY0dAVz02STMwOi8wNy8tNCxZZ01aaE5caFBealJibFRlbVZpblpqb1ttblxsbVtta1xtaltuaFpuaFpvaV1vaVtsaVpraFlqZlppZVppZVxpZVppZ1tnaFhnaFZjaFJhaldlcmFvfHN7i4qQn6aisLnBy9TU3eTp8fTy+vz0+vjx9vDt8Ofo7N7i49Xa28nS0b/MybbJxLHDvqu/uKa8s6LKvq7Txbjc0MTm2dHt4uD27O3/9Pr/+f//9///+v///P/+/f/9/P/7/P78/v3+///+/v7+/v7+/v7+/v7+/v7+/v7//vz//vz+/fv+/fv//fr//fr//fr/+/j/+vb++fX//fz/+/r9+fr++vv+/P3//f7//v///f7//Pv//fr//Pr/+PP37Oby5d346uH/9O7/+v3//P///f7///3///v9//r9//78/f/8/f/9/v///v////3//vX//ez/++P++t///Ob//+nn4syMiG9STDJUTzJUTTBVTjFUTi5VTy9WUTNWUTNVUTRTTzJPTjJOTTFQTDFOTTFOTDNLTjNMTjZLUTdLUDlKUjpMVTpJUjVKUzZPWTdTWjlUWzldYz9mbkeCkmOSpnOfsYGbqn+SoXqIlHBye1xcYkZMUDdLTTVMSzZLSTRMSjVQSzVUTjhWUDpXUTtWUDpTTjtRTDlMSTpJRzpHRTlDRTo9PjY6QDY6QDY5QTY3QjQ3QjQ2QzI2QzI7Qzg7Qzg6Qjc5QTY5QTY6Qjc7Qzg7Qzg7Qzg7Qzg7Qzg7Qzg8RDk9RTo+Rjs9Rzw9Rz88SD49Rzw9SDg+Rjc9RTY9Qzc9Qjs6QTo3QTk1PzY0QjE5SS9CVjNOZTtVbz9UdUBSdEFQbUFFYD05UDYtQy4rPCorPCkxQy08TjRIWz9QY0VSZkpOYkZAVz01SDIsNisrMionLiYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0aW1ncC5qcGcgYi90ZXN0aW1ncC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYmI2NTguLjAwMDAwMDAKLS0tIGEvdGVzdGltZ3AuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdG9yaWcuanBnIGIvdGVzdG9yaWcuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODE2YTBjLi4wMDAwMDAwCi0tLSBhL3Rlc3RvcmlnLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3Rwcm9nLmpwZyBiL3Rlc3Rwcm9nLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIwZmVlMi4uMDAwMDAwMAotLS0gYS90ZXN0cHJvZy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cmFuc3VwcC5jIGIvdHJhbnN1cHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVlYzU2NC4uMDAwMDAwMAotLS0gYS90cmFuc3VwcC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTI4ICswLDAgQEAKLS8qCi0gKiB0cmFuc3VwcC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGltYWdlIHRyYW5zZm9ybWF0aW9uIHJvdXRpbmVzIGFuZCBvdGhlciB1dGlsaXR5IGNvZGUKLSAqIHVzZWQgYnkgdGhlIGpwZWd0cmFuIHNhbXBsZSBhcHBsaWNhdGlvbi4gIFRoZXNlIGFyZSBOT1QgcGFydCBvZiB0aGUgY29yZQotICogSlBFRyBsaWJyYXJ5LiAgQnV0IHdlIGtlZXAgdGhlc2Ugcm91dGluZXMgc2VwYXJhdGUgZnJvbSBqcGVndHJhbi5jIHRvCi0gKiBlYXNlIHRoZSB0YXNrIG9mIG1haW50YWluaW5nIGpwZWd0cmFuLWxpa2UgcHJvZ3JhbXMgdGhhdCBoYXZlIG90aGVyIHVzZXIKLSAqIGludGVyZmFjZXMuCi0gKi8KLQotLyogQWx0aG91Z2ggdGhpcyBmaWxlIHJlYWxseSBzaG91bGRuJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGxpYnJhcnkgaW50ZXJuYWxzLAotICogaXQncyBoZWxwZnVsIHRvIGxldCBpdCBjYWxsIGpyb3VuZF91cCgpIGFuZCBqY29weV9ibG9ja19yb3coKS4KLSAqLwotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAidHJhbnN1cHAuaCIJCS8qIE15IG93biBleHRlcm5hbCBpbnRlcmZhY2UgKi8KLQotCi0jaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKLQotLyoKLSAqIExvc3NsZXNzIGltYWdlIHRyYW5zZm9ybWF0aW9uIHJvdXRpbmVzLiAgVGhlc2Ugcm91dGluZXMgd29yayBvbiBEQ1QKLSAqIGNvZWZmaWNpZW50IGFycmF5cyBhbmQgdGh1cyBkbyBub3QgcmVxdWlyZSBhbnkgbG9zc3kgZGVjb21wcmVzc2lvbgotICogb3IgcmVjb21wcmVzc2lvbiBvZiB0aGUgaW1hZ2UuCi0gKiBUaGFua3MgdG8gR3VpZG8gVm9sbGJlZGluZyBmb3IgdGhlIGluaXRpYWwgZGVzaWduIGFuZCBjb2RlIG9mIHRoaXMgZmVhdHVyZS4KLSAqCi0gKiBIb3Jpem9udGFsIGZsaXBwaW5nIGlzIGRvbmUgaW4tcGxhY2UsIHVzaW5nIGEgc2luZ2xlIHRvcC10by1ib3R0b20KLSAqIHBhc3MgdGhyb3VnaCB0aGUgdmlydHVhbCBzb3VyY2UgYXJyYXkuICBJdCB3aWxsIHRodXMgYmUgbXVjaCB0aGUKLSAqIGZhc3Rlc3Qgb3B0aW9uIGZvciBpbWFnZXMgbGFyZ2VyIHRoYW4gbWFpbiBtZW1vcnkuCi0gKgotICogVGhlIG90aGVyIHJvdXRpbmVzIHJlcXVpcmUgYSBzZXQgb2YgZGVzdGluYXRpb24gdmlydHVhbCBhcnJheXMsIHNvIHRoZXkKLSAqIG5lZWQgdHdpY2UgYXMgbXVjaCBtZW1vcnkgYXMganBlZ3RyYW4gbm9ybWFsbHkgZG9lcy4gIFRoZSBkZXN0aW5hdGlvbgotICogYXJyYXlzIGFyZSBhbHdheXMgd3JpdHRlbiBpbiBub3JtYWwgc2NhbiBvcmRlciAodG9wIHRvIGJvdHRvbSkgYmVjYXVzZQotICogdGhlIHZpcnR1YWwgYXJyYXkgbWFuYWdlciBleHBlY3RzIHRoaXMuICBUaGUgc291cmNlIGFycmF5cyB3aWxsIGJlIHNjYW5uZWQKLSAqIGluIHRoZSBjb3JyZXNwb25kaW5nIG9yZGVyLCB3aGljaCBtZWFucyBtdWx0aXBsZSBwYXNzZXMgdGhyb3VnaCB0aGUgc291cmNlCi0gKiBhcnJheXMgZm9yIG1vc3Qgb2YgdGhlIHRyYW5zZm9ybXMuICBUaGF0IGNvdWxkIHJlc3VsdCBpbiBtdWNoIHRocmFzaGluZwotICogaWYgdGhlIGltYWdlIGlzIGxhcmdlciB0aGFuIG1haW4gbWVtb3J5LgotICoKLSAqIFNvbWUgbm90ZXMgYWJvdXQgdGhlIG9wZXJhdGluZyBlbnZpcm9ubWVudCBvZiB0aGUgaW5kaXZpZHVhbCB0cmFuc2Zvcm0KLSAqIHJvdXRpbmVzOgotICogMS4gQm90aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiB2aXJ0dWFsIGFycmF5cyBhcmUgYWxsb2NhdGVkIGZyb20gdGhlCi0gKiAgICBzb3VyY2UgSlBFRyBvYmplY3QsIGFuZCB0aGVyZWZvcmUgc2hvdWxkIGJlIG1hbmlwdWxhdGVkIGJ5IGNhbGxpbmcgdGhlCi0gKiAgICBzb3VyY2UncyBtZW1vcnkgbWFuYWdlci4KLSAqIDIuIFRoZSBkZXN0aW5hdGlvbidzIGNvbXBvbmVudCBjb3VudCBzaG91bGQgYmUgdXNlZC4gIEl0IG1heSBiZSBzbWFsbGVyCi0gKiAgICB0aGFuIHRoZSBzb3VyY2UncyB3aGVuIGZvcmNpbmcgdG8gZ3JheXNjYWxlLgotICogMy4gTGlrZXdpc2UgdGhlIGRlc3RpbmF0aW9uJ3Mgc2FtcGxpbmcgZmFjdG9ycyBzaG91bGQgYmUgdXNlZC4gIFdoZW4KLSAqICAgIGZvcmNpbmcgdG8gZ3JheXNjYWxlIHRoZSBkZXN0aW5hdGlvbidzIHNhbXBsaW5nIGZhY3RvcnMgd2lsbCBiZSBhbGwgMSwKLSAqICAgIGFuZCB3ZSBtYXkgYXMgd2VsbCB0YWtlIHRoYXQgYXMgdGhlIGVmZmVjdGl2ZSBpTUNVIHNpemUuCi0gKiA0LiBXaGVuICJ0cmltIiBpcyBpbiBlZmZlY3QsIHRoZSBkZXN0aW5hdGlvbidzIGRpbWVuc2lvbnMgd2lsbCBiZSB0aGUKLSAqICAgIHRyaW1tZWQgdmFsdWVzIGJ1dCB0aGUgc291cmNlJ3Mgd2lsbCBiZSB1bnRyaW1tZWQuCi0gKiA1LiBBbGwgdGhlIHJvdXRpbmVzIGFzc3VtZSB0aGF0IHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlcnMgYXJlCi0gKiAgICBwYWRkZWQgb3V0IHRvIGEgZnVsbCBpTUNVIGJvdW5kYXJ5LiAgVGhpcyBpcyB0cnVlLCBhbHRob3VnaCBmb3IgdGhlCi0gKiAgICBzb3VyY2UgYnVmZmVyIGl0IGlzIGFuIHVuZG9jdW1lbnRlZCBwcm9wZXJ0eSBvZiBqZGNvZWZjdC5jLgotICogTm90ZXMgMiwzLDQgYm9pbCBkb3duIHRvIHRoaXM6IGdlbmVyYWxseSB3ZSBzaG91bGQgdXNlIHRoZSBkZXN0aW5hdGlvbidzCi0gKiBkaW1lbnNpb25zIGFuZCBpZ25vcmUgdGhlIHNvdXJjZSdzLgotICovCi0KLQotTE9DQUwodm9pZCkKLWRvX2ZsaXBfaCAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAotCSAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cykKLS8qIEhvcml6b250YWwgZmxpcDsgZG9uZSBpbi1wbGFjZSwgc28gbm8gc2VwYXJhdGUgZGVzdCBhcnJheSBpcyByZXF1aXJlZCAqLwotewotICBKRElNRU5TSU9OIE1DVV9jb2xzLCBjb21wX3dpZHRoLCBibGtfeCwgYmxrX3k7Ci0gIGludCBjaSwgaywgb2Zmc2V0X3k7Ci0gIEpCTE9DS0FSUkFZIGJ1ZmZlcjsKLSAgSkNPRUZQVFIgcHRyMSwgcHRyMjsKLSAgSkNPRUYgdGVtcDEsIHRlbXAyOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gIC8qIEhvcml6b250YWwgbWlycm9yaW5nIG9mIERDVCBibG9ja3MgaXMgYWNjb21wbGlzaGVkIGJ5IHN3YXBwaW5nCi0gICAqIHBhaXJzIG9mIGJsb2NrcyBpbi1wbGFjZS4gIFdpdGhpbiBhIERDVCBibG9jaywgd2UgcGVyZm9ybSBob3Jpem9udGFsCi0gICAqIG1pcnJvcmluZyBieSBjaGFuZ2luZyB0aGUgc2lnbnMgb2Ygb2RkLW51bWJlcmVkIGNvbHVtbnMuCi0gICAqIFBhcnRpYWwgaU1DVXMgYXQgdGhlIHJpZ2h0IGVkZ2UgYXJlIGxlZnQgdW50b3VjaGVkLgotICAgKi8KLSAgTUNVX2NvbHMgPSBkc3RpbmZvLT5pbWFnZV93aWR0aCAvIChkc3RpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOwotCi0gIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOwotICAgIGNvbXBfd2lkdGggPSBNQ1VfY29scyAqIGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7Ci0gICAgZm9yIChibGtfeSA9IDA7IGJsa195IDwgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKLQkgYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgewotICAgICAgYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwgYmxrX3ksCi0JIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKLSAgICAgIGZvciAob2Zmc2V0X3kgPSAwOyBvZmZzZXRfeSA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG9mZnNldF95KyspIHsKLQlmb3IgKGJsa194ID0gMDsgYmxrX3ggKiAyIDwgY29tcF93aWR0aDsgYmxrX3grKykgewotCSAgcHRyMSA9IGJ1ZmZlcltvZmZzZXRfeV1bYmxrX3hdOwotCSAgcHRyMiA9IGJ1ZmZlcltvZmZzZXRfeV1bY29tcF93aWR0aCAtIGJsa194IC0gMV07Ci0JICAvKiB0aGlzIHVucm9sbGVkIGxvb3AgZG9lc24ndCBuZWVkIHRvIGtub3cgd2hpY2ggcm93IGl0J3Mgb24uLi4gKi8KLQkgIGZvciAoayA9IDA7IGsgPCBEQ1RTSVpFMjsgayArPSAyKSB7Ci0JICAgIHRlbXAxID0gKnB0cjE7CS8qIHN3YXAgZXZlbiBjb2x1bW4gKi8KLQkgICAgdGVtcDIgPSAqcHRyMjsKLQkgICAgKnB0cjErKyA9IHRlbXAyOwotCSAgICAqcHRyMisrID0gdGVtcDE7Ci0JICAgIHRlbXAxID0gKnB0cjE7CS8qIHN3YXAgb2RkIGNvbHVtbiB3aXRoIHNpZ24gY2hhbmdlICovCi0JICAgIHRlbXAyID0gKnB0cjI7Ci0JICAgICpwdHIxKysgPSAtdGVtcDI7Ci0JICAgICpwdHIyKysgPSAtdGVtcDE7Ci0JICB9Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1kb19mbGlwX3YgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKLQkgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCi0JICAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzKQotLyogVmVydGljYWwgZmxpcCAqLwotewotICBKRElNRU5TSU9OIE1DVV9yb3dzLCBjb21wX2hlaWdodCwgZHN0X2Jsa194LCBkc3RfYmxrX3k7Ci0gIGludCBjaSwgaSwgaiwgb2Zmc2V0X3k7Ci0gIEpCTE9DS0FSUkFZIHNyY19idWZmZXIsIGRzdF9idWZmZXI7Ci0gIEpCTE9DS1JPVyBzcmNfcm93X3B0ciwgZHN0X3Jvd19wdHI7Ci0gIEpDT0VGUFRSIHNyY19wdHIsIGRzdF9wdHI7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgLyogV2Ugb3V0cHV0IGludG8gYSBzZXBhcmF0ZSBhcnJheSBiZWNhdXNlIHdlIGNhbid0IHRvdWNoIGRpZmZlcmVudAotICAgKiByb3dzIG9mIHRoZSBzb3VyY2UgdmlydHVhbCBhcnJheSBzaW11bHRhbmVvdXNseS4gIE90aGVyd2lzZSwgdGhpcwotICAgKiBpcyBhIHByZXR0eSBzdHJhaWdodGZvcndhcmQgYW5hbG9nIG9mIGhvcml6b250YWwgZmxpcC4KLSAgICogV2l0aGluIGEgRENUIGJsb2NrLCB2ZXJ0aWNhbCBtaXJyb3JpbmcgaXMgZG9uZSBieSBjaGFuZ2luZyB0aGUgc2lnbnMKLSAgICogb2Ygb2RkLW51bWJlcmVkIHJvd3MuCi0gICAqIFBhcnRpYWwgaU1DVXMgYXQgdGhlIGJvdHRvbSBlZGdlIGFyZSBjb3BpZWQgdmVyYmF0aW0uCi0gICAqLwotICBNQ1Vfcm93cyA9IGRzdGluZm8tPmltYWdlX2hlaWdodCAvIChkc3RpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOwotCi0gIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOwotICAgIGNvbXBfaGVpZ2h0ID0gTUNVX3Jvd3MgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotICAgIGZvciAoZHN0X2Jsa195ID0gMDsgZHN0X2Jsa195IDwgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKLQkgZHN0X2Jsa195ICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpIHsKLSAgICAgIGRzdF9idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBkc3RfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3ksCi0JIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKLSAgICAgIGlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgewotCS8qIFJvdyBpcyB3aXRoaW4gdGhlIG1pcnJvcmFibGUgYXJlYS4gKi8KLQlzcmNfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLQkgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLAotCSAgIGNvbXBfaGVpZ2h0IC0gZHN0X2Jsa195IC0gKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCi0JICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIEZBTFNFKTsKLSAgICAgIH0gZWxzZSB7Ci0JLyogQm90dG9tLWVkZ2UgYmxvY2tzIHdpbGwgYmUgY29waWVkIHZlcmJhdGltLiAqLwotCXNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKLQkgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgRkFMU0UpOwotICAgICAgfQotICAgICAgZm9yIChvZmZzZXRfeSA9IDA7IG9mZnNldF95IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3krKykgewotCWlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgewotCSAgLyogUm93IGlzIHdpdGhpbiB0aGUgbWlycm9yYWJsZSBhcmVhLiAqLwotCSAgZHN0X3Jvd19wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XTsKLQkgIHNyY19yb3dfcHRyID0gc3JjX2J1ZmZlcltjb21wcHRyLT52X3NhbXBfZmFjdG9yIC0gb2Zmc2V0X3kgLSAxXTsKLQkgIGZvciAoZHN0X2Jsa194ID0gMDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOwotCSAgICAgICBkc3RfYmxrX3grKykgewotCSAgICBkc3RfcHRyID0gZHN0X3Jvd19wdHJbZHN0X2Jsa194XTsKLQkgICAgc3JjX3B0ciA9IHNyY19yb3dfcHRyW2RzdF9ibGtfeF07Ci0JICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpICs9IDIpIHsKLQkgICAgICAvKiBjb3B5IGV2ZW4gcm93ICovCi0JICAgICAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKLQkJKmRzdF9wdHIrKyA9ICpzcmNfcHRyKys7Ci0JICAgICAgLyogY29weSBvZGQgcm93IHdpdGggc2lnbiBjaGFuZ2UgKi8KLQkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQkqZHN0X3B0cisrID0gLSAqc3JjX3B0cisrOwotCSAgICB9Ci0JICB9Ci0JfSBlbHNlIHsKLQkgIC8qIEp1c3QgY29weSByb3cgdmVyYmF0aW0uICovCi0JICBqY29weV9ibG9ja19yb3coc3JjX2J1ZmZlcltvZmZzZXRfeV0sIGRzdF9idWZmZXJbb2Zmc2V0X3ldLAotCQkJICBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MpOwotCX0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotZG9fdHJhbnNwb3NlIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCi0JICAgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAotCSAgICAgIGp2aXJ0X2JhcnJheV9wdHIgKmRzdF9jb2VmX2FycmF5cykKLS8qIFRyYW5zcG9zZSBzb3VyY2UgaW50byBkZXN0aW5hdGlvbiAqLwotewotICBKRElNRU5TSU9OIGRzdF9ibGtfeCwgZHN0X2Jsa195OwotICBpbnQgY2ksIGksIGosIG9mZnNldF94LCBvZmZzZXRfeTsKLSAgSkJMT0NLQVJSQVkgc3JjX2J1ZmZlciwgZHN0X2J1ZmZlcjsKLSAgSkNPRUZQVFIgc3JjX3B0ciwgZHN0X3B0cjsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICAvKiBUcmFuc3Bvc2luZyBwaXhlbHMgd2l0aGluIGEgYmxvY2sganVzdCByZXF1aXJlcyB0cmFuc3Bvc2luZyB0aGUKLSAgICogRENUIGNvZWZmaWNpZW50cy4KLSAgICogUGFydGlhbCBpTUNVcyBhdCB0aGUgZWRnZXMgcmVxdWlyZSBubyBzcGVjaWFsIHRyZWF0bWVudDsgd2Ugc2ltcGx5Ci0gICAqIHByb2Nlc3MgYWxsIHRoZSBhdmFpbGFibGUgRENUIGJsb2NrcyBmb3IgZXZlcnkgY29tcG9uZW50LgotICAgKi8KLSAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7Ci0gICAgZm9yIChkc3RfYmxrX3kgPSAwOyBkc3RfYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOwotCSBkc3RfYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgewotICAgICAgZHN0X2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIGRzdF9jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKLQkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOwotICAgICAgZm9yIChvZmZzZXRfeSA9IDA7IG9mZnNldF95IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3krKykgewotCWZvciAoZHN0X2Jsa194ID0gMDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOwotCSAgICAgZHN0X2Jsa194ICs9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpIHsKLQkgIHNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSAgICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa194LAotCSAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsIEZBTFNFKTsKLQkgIGZvciAob2Zmc2V0X3ggPSAwOyBvZmZzZXRfeCA8IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7IG9mZnNldF94KyspIHsKLQkgICAgc3JjX3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3hdW2RzdF9ibGtfeSArIG9mZnNldF95XTsKLQkgICAgZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldW2RzdF9ibGtfeCArIG9mZnNldF94XTsKLQkgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykKLQkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQlkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOwotCSAgfQotCX0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotZG9fcm90XzkwIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCi0JICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAotCSAgIGp2aXJ0X2JhcnJheV9wdHIgKmRzdF9jb2VmX2FycmF5cykKLS8qIDkwIGRlZ3JlZSByb3RhdGlvbiBpcyBlcXVpdmFsZW50IHRvCi0gKiAgIDEuIFRyYW5zcG9zaW5nIHRoZSBpbWFnZTsKLSAqICAgMi4gSG9yaXpvbnRhbCBtaXJyb3JpbmcuCi0gKiBUaGVzZSB0d28gc3RlcHMgYXJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIHByb2Nlc3Npbmcgcm91dGluZS4KLSAqLwotewotICBKRElNRU5TSU9OIE1DVV9jb2xzLCBjb21wX3dpZHRoLCBkc3RfYmxrX3gsIGRzdF9ibGtfeTsKLSAgaW50IGNpLCBpLCBqLCBvZmZzZXRfeCwgb2Zmc2V0X3k7Ci0gIEpCTE9DS0FSUkFZIHNyY19idWZmZXIsIGRzdF9idWZmZXI7Ci0gIEpDT0VGUFRSIHNyY19wdHIsIGRzdF9wdHI7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgLyogQmVjYXVzZSBvZiB0aGUgaG9yaXpvbnRhbCBtaXJyb3Igc3RlcCwgd2UgY2FuJ3QgcHJvY2VzcyBwYXJ0aWFsIGlNQ1VzCi0gICAqIGF0IHRoZSAob3V0cHV0KSByaWdodCBlZGdlIHByb3Blcmx5LiAgVGhleSBqdXN0IGdldCB0cmFuc3Bvc2VkIGFuZAotICAgKiBub3QgbWlycm9yZWQuCi0gICAqLwotICBNQ1VfY29scyA9IGRzdGluZm8tPmltYWdlX3dpZHRoIC8gKGRzdGluZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSk7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7Ci0gICAgY29tcF93aWR0aCA9IE1DVV9jb2xzICogY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKLSAgICBmb3IgKGRzdF9ibGtfeSA9IDA7IGRzdF9ibGtfeSA8IGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3M7Ci0JIGRzdF9ibGtfeSArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSB7Ci0gICAgICBkc3RfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgZHN0X2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa195LAotCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7Ci0gICAgICBmb3IgKG9mZnNldF95ID0gMDsgb2Zmc2V0X3kgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvZmZzZXRfeSsrKSB7Ci0JZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7Ci0JICAgICBkc3RfYmxrX3ggKz0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcikgewotCSAgc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JICAgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3gsCi0JICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwgRkFMU0UpOwotCSAgZm9yIChvZmZzZXRfeCA9IDA7IG9mZnNldF94IDwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3grKykgewotCSAgICBzcmNfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeF1bZHN0X2Jsa195ICsgb2Zmc2V0X3ldOwotCSAgICBpZiAoZHN0X2Jsa194IDwgY29tcF93aWR0aCkgewotCSAgICAgIC8qIEJsb2NrIGlzIHdpdGhpbiB0aGUgbWlycm9yYWJsZSBhcmVhLiAqLwotCSAgICAgIGRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XQotCQlbY29tcF93aWR0aCAtIGRzdF9ibGtfeCAtIG9mZnNldF94IC0gMV07Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykgewotCQlmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQkgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07Ci0JCWkrKzsKLQkJZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKLQkJICBkc3RfcHRyW2oqRENUU0laRStpXSA9IC1zcmNfcHRyW2kqRENUU0laRStqXTsKLQkgICAgICB9Ci0JICAgIH0gZWxzZSB7Ci0JICAgICAgLyogRWRnZSBibG9ja3MgYXJlIHRyYW5zcG9zZWQgYnV0IG5vdCBtaXJyb3JlZC4gKi8KLQkgICAgICBkc3RfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV1bZHN0X2Jsa194ICsgb2Zmc2V0X3hdOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspCi0JCWZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCi0JCSAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKLQkgICAgfQotCSAgfQotCX0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotZG9fcm90XzI3MCAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAotCSAgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCi0JICAgIGp2aXJ0X2JhcnJheV9wdHIgKmRzdF9jb2VmX2FycmF5cykKLS8qIDI3MCBkZWdyZWUgcm90YXRpb24gaXMgZXF1aXZhbGVudCB0bwotICogICAxLiBIb3Jpem9udGFsIG1pcnJvcmluZzsKLSAqICAgMi4gVHJhbnNwb3NpbmcgdGhlIGltYWdlLgotICogVGhlc2UgdHdvIHN0ZXBzIGFyZSBtZXJnZWQgaW50byBhIHNpbmdsZSBwcm9jZXNzaW5nIHJvdXRpbmUuCi0gKi8KLXsKLSAgSkRJTUVOU0lPTiBNQ1Vfcm93cywgY29tcF9oZWlnaHQsIGRzdF9ibGtfeCwgZHN0X2Jsa195OwotICBpbnQgY2ksIGksIGosIG9mZnNldF94LCBvZmZzZXRfeTsKLSAgSkJMT0NLQVJSQVkgc3JjX2J1ZmZlciwgZHN0X2J1ZmZlcjsKLSAgSkNPRUZQVFIgc3JjX3B0ciwgZHN0X3B0cjsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICAvKiBCZWNhdXNlIG9mIHRoZSBob3Jpem9udGFsIG1pcnJvciBzdGVwLCB3ZSBjYW4ndCBwcm9jZXNzIHBhcnRpYWwgaU1DVXMKLSAgICogYXQgdGhlIChvdXRwdXQpIGJvdHRvbSBlZGdlIHByb3Blcmx5LiAgVGhleSBqdXN0IGdldCB0cmFuc3Bvc2VkIGFuZAotICAgKiBub3QgbWlycm9yZWQuCi0gICAqLwotICBNQ1Vfcm93cyA9IGRzdGluZm8tPmltYWdlX2hlaWdodCAvIChkc3RpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOwotCi0gIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOwotICAgIGNvbXBfaGVpZ2h0ID0gTUNVX3Jvd3MgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotICAgIGZvciAoZHN0X2Jsa195ID0gMDsgZHN0X2Jsa195IDwgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKLQkgZHN0X2Jsa195ICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpIHsKLSAgICAgIGRzdF9idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBkc3RfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3ksCi0JIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKLSAgICAgIGZvciAob2Zmc2V0X3kgPSAwOyBvZmZzZXRfeSA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG9mZnNldF95KyspIHsKLQlmb3IgKGRzdF9ibGtfeCA9IDA7IGRzdF9ibGtfeCA8IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKLQkgICAgIGRzdF9ibGtfeCArPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSB7Ci0JICBzcmNfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLQkgICAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeCwKLQkgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLCBGQUxTRSk7Ci0JICBmb3IgKG9mZnNldF94ID0gMDsgb2Zmc2V0X3ggPCBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOyBvZmZzZXRfeCsrKSB7Ci0JICAgIGRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XVtkc3RfYmxrX3ggKyBvZmZzZXRfeF07Ci0JICAgIGlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgewotCSAgICAgIC8qIEJsb2NrIGlzIHdpdGhpbiB0aGUgbWlycm9yYWJsZSBhcmVhLiAqLwotCSAgICAgIHNyY19wdHIgPSBzcmNfYnVmZmVyW29mZnNldF94XQotCQlbY29tcF9oZWlnaHQgLSBkc3RfYmxrX3kgLSBvZmZzZXRfeSAtIDFdOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspIHsKLQkJZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykgewotCQkgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07Ci0JCSAgaisrOwotCQkgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gLXNyY19wdHJbaSpEQ1RTSVpFK2pdOwotCQl9Ci0JICAgICAgfQotCSAgICB9IGVsc2UgewotCSAgICAgIC8qIEVkZ2UgYmxvY2tzIGFyZSB0cmFuc3Bvc2VkIGJ1dCBub3QgbWlycm9yZWQuICovCi0JICAgICAgc3JjX3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3hdW2RzdF9ibGtfeSArIG9mZnNldF95XTsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQkgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07Ci0JICAgIH0KLQkgIH0KLQl9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLWRvX3JvdF8xODAgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKLQkgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAotCSAgICBqdmlydF9iYXJyYXlfcHRyICpkc3RfY29lZl9hcnJheXMpCi0vKiAxODAgZGVncmVlIHJvdGF0aW9uIGlzIGVxdWl2YWxlbnQgdG8KLSAqICAgMS4gVmVydGljYWwgbWlycm9yaW5nOwotICogICAyLiBIb3Jpem9udGFsIG1pcnJvcmluZy4KLSAqIFRoZXNlIHR3byBzdGVwcyBhcmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgcHJvY2Vzc2luZyByb3V0aW5lLgotICovCi17Ci0gIEpESU1FTlNJT04gTUNVX2NvbHMsIE1DVV9yb3dzLCBjb21wX3dpZHRoLCBjb21wX2hlaWdodCwgZHN0X2Jsa194LCBkc3RfYmxrX3k7Ci0gIGludCBjaSwgaSwgaiwgb2Zmc2V0X3k7Ci0gIEpCTE9DS0FSUkFZIHNyY19idWZmZXIsIGRzdF9idWZmZXI7Ci0gIEpCTE9DS1JPVyBzcmNfcm93X3B0ciwgZHN0X3Jvd19wdHI7Ci0gIEpDT0VGUFRSIHNyY19wdHIsIGRzdF9wdHI7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgTUNVX2NvbHMgPSBkc3RpbmZvLT5pbWFnZV93aWR0aCAvIChkc3RpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOwotICBNQ1Vfcm93cyA9IGRzdGluZm8tPmltYWdlX2hlaWdodCAvIChkc3RpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOwotCi0gIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOwotICAgIGNvbXBfd2lkdGggPSBNQ1VfY29scyAqIGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7Ci0gICAgY29tcF9oZWlnaHQgPSBNQ1Vfcm93cyAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgZm9yIChkc3RfYmxrX3kgPSAwOyBkc3RfYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOwotCSBkc3RfYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgewotICAgICAgZHN0X2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIGRzdF9jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKLQkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOwotICAgICAgaWYgKGRzdF9ibGtfeSA8IGNvbXBfaGVpZ2h0KSB7Ci0JLyogUm93IGlzIHdpdGhpbiB0aGUgdmVydGljYWxseSBtaXJyb3JhYmxlIGFyZWEuICovCi0Jc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwKLQkgICBjb21wX2hlaWdodCAtIGRzdF9ibGtfeSAtIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotCSAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7Ci0gICAgICB9IGVsc2UgewotCS8qIEJvdHRvbS1lZGdlIHJvd3MgYXJlIG9ubHkgbWlycm9yZWQgaG9yaXpvbnRhbGx5LiAqLwotCXNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKLQkgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgRkFMU0UpOwotICAgICAgfQotICAgICAgZm9yIChvZmZzZXRfeSA9IDA7IG9mZnNldF95IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3krKykgewotCWlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgewotCSAgLyogUm93IGlzIHdpdGhpbiB0aGUgbWlycm9yYWJsZSBhcmVhLiAqLwotCSAgZHN0X3Jvd19wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XTsKLQkgIHNyY19yb3dfcHRyID0gc3JjX2J1ZmZlcltjb21wcHRyLT52X3NhbXBfZmFjdG9yIC0gb2Zmc2V0X3kgLSAxXTsKLQkgIC8qIFByb2Nlc3MgdGhlIGJsb2NrcyB0aGF0IGNhbiBiZSBtaXJyb3JlZCBib3RoIHdheXMuICovCi0JICBmb3IgKGRzdF9ibGtfeCA9IDA7IGRzdF9ibGtfeCA8IGNvbXBfd2lkdGg7IGRzdF9ibGtfeCsrKSB7Ci0JICAgIGRzdF9wdHIgPSBkc3Rfcm93X3B0cltkc3RfYmxrX3hdOwotCSAgICBzcmNfcHRyID0gc3JjX3Jvd19wdHJbY29tcF93aWR0aCAtIGRzdF9ibGtfeCAtIDFdOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSArPSAyKSB7Ci0JICAgICAgLyogRm9yIGV2ZW4gcm93LCBuZWdhdGUgZXZlcnkgb2RkIGNvbHVtbi4gKi8KLQkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaiArPSAyKSB7Ci0JCSpkc3RfcHRyKysgPSAqc3JjX3B0cisrOwotCQkqZHN0X3B0cisrID0gLSAqc3JjX3B0cisrOwotCSAgICAgIH0KLQkgICAgICAvKiBGb3Igb2RkIHJvdywgbmVnYXRlIGV2ZXJ5IGV2ZW4gY29sdW1uLiAqLwotCSAgICAgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqICs9IDIpIHsKLQkJKmRzdF9wdHIrKyA9IC0gKnNyY19wdHIrKzsKLQkJKmRzdF9wdHIrKyA9ICpzcmNfcHRyKys7Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci0JICAvKiBBbnkgcmVtYWluaW5nIHJpZ2h0LWVkZ2UgYmxvY2tzIGFyZSBvbmx5IG1pcnJvcmVkIHZlcnRpY2FsbHkuICovCi0JICBmb3IgKDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOyBkc3RfYmxrX3grKykgewotCSAgICBkc3RfcHRyID0gZHN0X3Jvd19wdHJbZHN0X2Jsa194XTsKLQkgICAgc3JjX3B0ciA9IHNyY19yb3dfcHRyW2RzdF9ibGtfeF07Ci0JICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpICs9IDIpIHsKLQkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQkqZHN0X3B0cisrID0gKnNyY19wdHIrKzsKLQkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQkqZHN0X3B0cisrID0gLSAqc3JjX3B0cisrOwotCSAgICB9Ci0JICB9Ci0JfSBlbHNlIHsKLQkgIC8qIFJlbWFpbmluZyByb3dzIGFyZSBqdXN0IG1pcnJvcmVkIGhvcml6b250YWxseS4gKi8KLQkgIGRzdF9yb3dfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV07Ci0JICBzcmNfcm93X3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3ldOwotCSAgLyogUHJvY2VzcyB0aGUgYmxvY2tzIHRoYXQgY2FuIGJlIG1pcnJvcmVkLiAqLwotCSAgZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wX3dpZHRoOyBkc3RfYmxrX3grKykgewotCSAgICBkc3RfcHRyID0gZHN0X3Jvd19wdHJbZHN0X2Jsa194XTsKLQkgICAgc3JjX3B0ciA9IHNyY19yb3dfcHRyW2NvbXBfd2lkdGggLSBkc3RfYmxrX3ggLSAxXTsKLQkgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpICs9IDIpIHsKLQkgICAgICAqZHN0X3B0cisrID0gKnNyY19wdHIrKzsKLQkgICAgICAqZHN0X3B0cisrID0gLSAqc3JjX3B0cisrOwotCSAgICB9Ci0JICB9Ci0JICAvKiBBbnkgcmVtYWluaW5nIHJpZ2h0LWVkZ2UgYmxvY2tzIGFyZSBvbmx5IGNvcGllZC4gKi8KLQkgIGZvciAoOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7IGRzdF9ibGtfeCsrKSB7Ci0JICAgIGRzdF9wdHIgPSBkc3Rfcm93X3B0cltkc3RfYmxrX3hdOwotCSAgICBzcmNfcHRyID0gc3JjX3Jvd19wdHJbZHN0X2Jsa194XTsKLQkgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspCi0JICAgICAgKmRzdF9wdHIrKyA9ICpzcmNfcHRyKys7Ci0JICB9Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1kb190cmFuc3ZlcnNlIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCi0JICAgICAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKLQkgICAgICAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzKQotLyogVHJhbnN2ZXJzZSB0cmFuc3Bvc2UgaXMgZXF1aXZhbGVudCB0bwotICogICAxLiAxODAgZGVncmVlIHJvdGF0aW9uOwotICogICAyLiBUcmFuc3Bvc2l0aW9uOwotICogb3IKLSAqICAgMS4gSG9yaXpvbnRhbCBtaXJyb3Jpbmc7Ci0gKiAgIDIuIFRyYW5zcG9zaXRpb247Ci0gKiAgIDMuIEhvcml6b250YWwgbWlycm9yaW5nLgotICogVGhlc2Ugc3RlcHMgYXJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIHByb2Nlc3Npbmcgcm91dGluZS4KLSAqLwotewotICBKRElNRU5TSU9OIE1DVV9jb2xzLCBNQ1Vfcm93cywgY29tcF93aWR0aCwgY29tcF9oZWlnaHQsIGRzdF9ibGtfeCwgZHN0X2Jsa195OwotICBpbnQgY2ksIGksIGosIG9mZnNldF94LCBvZmZzZXRfeTsKLSAgSkJMT0NLQVJSQVkgc3JjX2J1ZmZlciwgZHN0X2J1ZmZlcjsKLSAgSkNPRUZQVFIgc3JjX3B0ciwgZHN0X3B0cjsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICBNQ1VfY29scyA9IGRzdGluZm8tPmltYWdlX3dpZHRoIC8gKGRzdGluZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSk7Ci0gIE1DVV9yb3dzID0gZHN0aW5mby0+aW1hZ2VfaGVpZ2h0IC8gKGRzdGluZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSk7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7Ci0gICAgY29tcF93aWR0aCA9IE1DVV9jb2xzICogY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKLSAgICBjb21wX2hlaWdodCA9IE1DVV9yb3dzICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgICBmb3IgKGRzdF9ibGtfeSA9IDA7IGRzdF9ibGtfeSA8IGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3M7Ci0JIGRzdF9ibGtfeSArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSB7Ci0gICAgICBkc3RfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgZHN0X2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa195LAotCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7Ci0gICAgICBmb3IgKG9mZnNldF95ID0gMDsgb2Zmc2V0X3kgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvZmZzZXRfeSsrKSB7Ci0JZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7Ci0JICAgICBkc3RfYmxrX3ggKz0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcikgewotCSAgc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JICAgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3gsCi0JICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwgRkFMU0UpOwotCSAgZm9yIChvZmZzZXRfeCA9IDA7IG9mZnNldF94IDwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3grKykgewotCSAgICBpZiAoZHN0X2Jsa195IDwgY29tcF9oZWlnaHQpIHsKLQkgICAgICBzcmNfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeF0KLQkJW2NvbXBfaGVpZ2h0IC0gZHN0X2Jsa195IC0gb2Zmc2V0X3kgLSAxXTsKLQkgICAgICBpZiAoZHN0X2Jsa194IDwgY29tcF93aWR0aCkgewotCQkvKiBCbG9jayBpcyB3aXRoaW4gdGhlIG1pcnJvcmFibGUgYXJlYS4gKi8KLQkJZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldCi0JCSAgW2NvbXBfd2lkdGggLSBkc3RfYmxrX3ggLSBvZmZzZXRfeCAtIDFdOwotCQlmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKSB7Ci0JCSAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykgewotCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKLQkJICAgIGorKzsKLQkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gLXNyY19wdHJbaSpEQ1RTSVpFK2pdOwotCQkgIH0KLQkJICBpKys7Ci0JCSAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykgewotCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSAtc3JjX3B0cltpKkRDVFNJWkUral07Ci0JCSAgICBqKys7Ci0JCSAgICBkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOwotCQkgIH0KLQkJfQotCSAgICAgIH0gZWxzZSB7Ci0JCS8qIFJpZ2h0LWVkZ2UgYmxvY2tzIGFyZSBtaXJyb3JlZCBpbiB5IG9ubHkgKi8KLQkJZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldW2RzdF9ibGtfeCArIG9mZnNldF94XTsKLQkJZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykgewotCQkgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspIHsKLQkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07Ci0JCSAgICBqKys7Ci0JCSAgICBkc3RfcHRyW2oqRENUU0laRStpXSA9IC1zcmNfcHRyW2kqRENUU0laRStqXTsKLQkJICB9Ci0JCX0KLQkgICAgICB9Ci0JICAgIH0gZWxzZSB7Ci0JICAgICAgc3JjX3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3hdW2RzdF9ibGtfeSArIG9mZnNldF95XTsKLQkgICAgICBpZiAoZHN0X2Jsa194IDwgY29tcF93aWR0aCkgewotCQkvKiBCb3R0b20tZWRnZSBibG9ja3MgYXJlIG1pcnJvcmVkIGluIHggb25seSAqLwotCQlkc3RfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV0KLQkJICBbY29tcF93aWR0aCAtIGRzdF9ibGtfeCAtIG9mZnNldF94IC0gMV07Ci0JCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspIHsKLQkJICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKLQkJICBpKys7Ci0JCSAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKLQkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gLXNyY19wdHJbaSpEQ1RTSVpFK2pdOwotCQl9Ci0JICAgICAgfSBlbHNlIHsKLQkJLyogQXQgbG93ZXIgcmlnaHQgY29ybmVyLCBqdXN0IHRyYW5zcG9zZSwgbm8gbWlycm9yaW5nICovCi0JCWRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XVtkc3RfYmxrX3ggKyBvZmZzZXRfeF07Ci0JCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspCi0JCSAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKLQkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLS8qIFJlcXVlc3QgYW55IHJlcXVpcmVkIHdvcmtzcGFjZS4KLSAqCi0gKiBXZSBhbGxvY2F0ZSB0aGUgd29ya3NwYWNlIHZpcnR1YWwgYXJyYXlzIGZyb20gdGhlIHNvdXJjZSBkZWNvbXByZXNzaW9uCi0gKiBvYmplY3QsIHNvIHRoYXQgYWxsIHRoZSBhcnJheXMgKGJvdGggdGhlIG9yaWdpbmFsIGRhdGEgYW5kIHRoZSB3b3Jrc3BhY2UpCi0gKiB3aWxsIGJlIHRha2VuIGludG8gYWNjb3VudCB3aGlsZSBtYWtpbmcgbWVtb3J5IG1hbmFnZW1lbnQgZGVjaXNpb25zLgotICogSGVuY2UsIHRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBqcGVnX3JlYWRfaGVhZGVyICh3aGljaCByZWFkcwotICogdGhlIGltYWdlIGRpbWVuc2lvbnMpIGFuZCBiZWZvcmUganBlZ19yZWFkX2NvZWZmaWNpZW50cyAod2hpY2ggcmVhbGl6ZXMKLSAqIHRoZSBzb3VyY2UncyB2aXJ0dWFsIGFycmF5cykuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qdHJhbnNmb3JtX3JlcXVlc3Rfd29ya3NwYWNlIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sCi0JCQkgICAgICBqcGVnX3RyYW5zZm9ybV9pbmZvICppbmZvKQotewotICBqdmlydF9iYXJyYXlfcHRyICpjb2VmX2FycmF5cyA9IE5VTEw7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIGludCBjaTsKLQotICBpZiAoaW5mby0+Zm9yY2VfZ3JheXNjYWxlICYmCi0gICAgICBzcmNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDciAmJgotICAgICAgc3JjaW5mby0+bnVtX2NvbXBvbmVudHMgPT0gMykgewotICAgIC8qIFdlJ2xsIG9ubHkgcHJvY2VzcyB0aGUgZmlyc3QgY29tcG9uZW50ICovCi0gICAgaW5mby0+bnVtX2NvbXBvbmVudHMgPSAxOwotICB9IGVsc2UgewotICAgIC8qIFByb2Nlc3MgYWxsIHRoZSBjb21wb25lbnRzICovCi0gICAgaW5mby0+bnVtX2NvbXBvbmVudHMgPSBzcmNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgfQotCi0gIHN3aXRjaCAoaW5mby0+dHJhbnNmb3JtKSB7Ci0gIGNhc2UgSlhGT1JNX05PTkU6Ci0gIGNhc2UgSlhGT1JNX0ZMSVBfSDoKLSAgICAvKiBEb24ndCBuZWVkIGEgd29ya3NwYWNlIGFycmF5ICovCi0gICAgYnJlYWs7Ci0gIGNhc2UgSlhGT1JNX0ZMSVBfVjoKLSAgY2FzZSBKWEZPUk1fUk9UXzE4MDoKLSAgICAvKiBOZWVkIHdvcmtzcGFjZSBhcnJheXMgaGF2aW5nIHNhbWUgZGltZW5zaW9ucyBhcyBzb3VyY2UgaW1hZ2UuCi0gICAgICogTm90ZSB0aGF0IHdlIGFsbG9jYXRlIGFycmF5cyBwYWRkZWQgb3V0IHRvIHRoZSBuZXh0IGlNQ1UgYm91bmRhcnksCi0gICAgICogc28gdGhhdCB0cmFuc2Zvcm0gcm91dGluZXMgbmVlZCBub3Qgd29ycnkgYWJvdXQgbWlzc2luZyBlZGdlIGJsb2Nrcy4KLSAgICAgKi8KLSAgICBjb2VmX2FycmF5cyA9IChqdmlydF9iYXJyYXlfcHRyICopCi0gICAgICAoKnNyY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBKUE9PTF9JTUFHRSwKLQlTSVpFT0YoanZpcnRfYmFycmF5X3B0cikgKiBpbmZvLT5udW1fY29tcG9uZW50cyk7Ci0gICAgZm9yIChjaSA9IDA7IGNpIDwgaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICAgIGNvbXBwdHIgPSBzcmNpbmZvLT5jb21wX2luZm8gKyBjaTsKLSAgICAgIGNvZWZfYXJyYXlzW2NpXSA9ICgqc3JjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfYmFycmF5KQotCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCi0JIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcywKLQkJCQkobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCi0JIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MsCi0JCQkJKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpLAotCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9UUkFOU1BPU0U6Ci0gIGNhc2UgSlhGT1JNX1RSQU5TVkVSU0U6Ci0gIGNhc2UgSlhGT1JNX1JPVF85MDoKLSAgY2FzZSBKWEZPUk1fUk9UXzI3MDoKLSAgICAvKiBOZWVkIHdvcmtzcGFjZSBhcnJheXMgaGF2aW5nIHRyYW5zcG9zZWQgZGltZW5zaW9ucy4KLSAgICAgKiBOb3RlIHRoYXQgd2UgYWxsb2NhdGUgYXJyYXlzIHBhZGRlZCBvdXQgdG8gdGhlIG5leHQgaU1DVSBib3VuZGFyeSwKLSAgICAgKiBzbyB0aGF0IHRyYW5zZm9ybSByb3V0aW5lcyBuZWVkIG5vdCB3b3JyeSBhYm91dCBtaXNzaW5nIGVkZ2UgYmxvY2tzLgotICAgICAqLwotICAgIGNvZWZfYXJyYXlzID0gKGp2aXJ0X2JhcnJheV9wdHIgKikKLSAgICAgICgqc3JjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIEpQT09MX0lNQUdFLAotCVNJWkVPRihqdmlydF9iYXJyYXlfcHRyKSAqIGluZm8tPm51bV9jb21wb25lbnRzKTsKLSAgICBmb3IgKGNpID0gMDsgY2kgPCBpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotICAgICAgY29tcHB0ciA9IHNyY2luZm8tPmNvbXBfaW5mbyArIGNpOwotICAgICAgY29lZl9hcnJheXNbY2ldID0gKCpzcmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9iYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKLQkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcywKLQkJCQkobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCi0JIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcywKLQkJCQkobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCi0JIChKRElNRU5TSU9OKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLSAgaW5mby0+d29ya3NwYWNlX2NvZWZfYXJyYXlzID0gY29lZl9hcnJheXM7Ci19Ci0KLQotLyogVHJhbnNwb3NlIGRlc3RpbmF0aW9uIGltYWdlIHBhcmFtZXRlcnMgKi8KLQotTE9DQUwodm9pZCkKLXRyYW5zcG9zZV9jcml0aWNhbF9wYXJhbWV0ZXJzIChqX2NvbXByZXNzX3B0ciBkc3RpbmZvKQotewotICBpbnQgdGJsbm8sIGksIGosIGNpLCBpdGVtcDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgSlFVQU5UX1RCTCAqcXRibHB0cjsKLSAgSkRJTUVOU0lPTiBkdGVtcDsKLSAgVUlOVDE2IHF0ZW1wOwotCi0gIC8qIFRyYW5zcG9zZSBiYXNpYyBpbWFnZSBkaW1lbnNpb25zICovCi0gIGR0ZW1wID0gZHN0aW5mby0+aW1hZ2Vfd2lkdGg7Ci0gIGRzdGluZm8tPmltYWdlX3dpZHRoID0gZHN0aW5mby0+aW1hZ2VfaGVpZ2h0OwotICBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgPSBkdGVtcDsKLQotICAvKiBUcmFuc3Bvc2Ugc2FtcGxpbmcgZmFjdG9ycyAqLwotICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotICAgIGNvbXBwdHIgPSBkc3RpbmZvLT5jb21wX2luZm8gKyBjaTsKLSAgICBpdGVtcCA9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7Ci0gICAgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9IGl0ZW1wOwotICB9Ci0KLSAgLyogVHJhbnNwb3NlIHF1YW50aXphdGlvbiB0YWJsZXMgKi8KLSAgZm9yICh0YmxubyA9IDA7IHRibG5vIDwgTlVNX1FVQU5UX1RCTFM7IHRibG5vKyspIHsKLSAgICBxdGJscHRyID0gZHN0aW5mby0+cXVhbnRfdGJsX3B0cnNbdGJsbm9dOwotICAgIGlmIChxdGJscHRyICE9IE5VTEwpIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspIHsKLQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7Ci0JICBxdGVtcCA9IHF0YmxwdHItPnF1YW50dmFsW2kqRENUU0laRStqXTsKLQkgIHF0YmxwdHItPnF1YW50dmFsW2kqRENUU0laRStqXSA9IHF0YmxwdHItPnF1YW50dmFsW2oqRENUU0laRStpXTsKLQkgIHF0YmxwdHItPnF1YW50dmFsW2oqRENUU0laRStpXSA9IHF0ZW1wOwotCX0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi0vKiBUcmltIG9mZiBhbnkgcGFydGlhbCBpTUNVcyBvbiB0aGUgaW5kaWNhdGVkIGRlc3RpbmF0aW9uIGVkZ2UgKi8KLQotTE9DQUwodm9pZCkKLXRyaW1fcmlnaHRfZWRnZSAoal9jb21wcmVzc19wdHIgZHN0aW5mbykKLXsKLSAgaW50IGNpLCBtYXhfaF9zYW1wX2ZhY3RvcjsKLSAgSkRJTUVOU0lPTiBNQ1VfY29sczsKLQotICAvKiBXZSBoYXZlIHRvIGNvbXB1dGUgbWF4X2hfc2FtcF9mYWN0b3Igb3Vyc2VsdmVzLAotICAgKiBiZWNhdXNlIGl0IGhhc24ndCBiZWVuIHNldCB5ZXQgaW4gdGhlIGRlc3RpbmF0aW9uCi0gICAqIChhbmQgd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIHNvdXJjZSdzIHZhbHVlKS4KLSAgICovCi0gIG1heF9oX3NhbXBfZmFjdG9yID0gMTsKLSAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICBpbnQgaF9zYW1wX2ZhY3RvciA9IGRzdGluZm8tPmNvbXBfaW5mb1tjaV0uaF9zYW1wX2ZhY3RvcjsKLSAgICBtYXhfaF9zYW1wX2ZhY3RvciA9IE1BWChtYXhfaF9zYW1wX2ZhY3RvciwgaF9zYW1wX2ZhY3Rvcik7Ci0gIH0KLSAgTUNVX2NvbHMgPSBkc3RpbmZvLT5pbWFnZV93aWR0aCAvIChtYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOwotICBpZiAoTUNVX2NvbHMgPiAwKQkJLyogY2FuJ3QgdHJpbSB0byAwIHBpeGVscyAqLwotICAgIGRzdGluZm8tPmltYWdlX3dpZHRoID0gTUNVX2NvbHMgKiAobWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKLX0KLQotTE9DQUwodm9pZCkKLXRyaW1fYm90dG9tX2VkZ2UgKGpfY29tcHJlc3NfcHRyIGRzdGluZm8pCi17Ci0gIGludCBjaSwgbWF4X3Zfc2FtcF9mYWN0b3I7Ci0gIEpESU1FTlNJT04gTUNVX3Jvd3M7Ci0KLSAgLyogV2UgaGF2ZSB0byBjb21wdXRlIG1heF92X3NhbXBfZmFjdG9yIG91cnNlbHZlcywKLSAgICogYmVjYXVzZSBpdCBoYXNuJ3QgYmVlbiBzZXQgeWV0IGluIHRoZSBkZXN0aW5hdGlvbgotICAgKiAoYW5kIHdlIGRvbid0IHdhbnQgdG8gdXNlIHRoZSBzb3VyY2UncyB2YWx1ZSkuCi0gICAqLwotICBtYXhfdl9zYW1wX2ZhY3RvciA9IDE7Ci0gIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgaW50IHZfc2FtcF9mYWN0b3IgPSBkc3RpbmZvLT5jb21wX2luZm9bY2ldLnZfc2FtcF9mYWN0b3I7Ci0gICAgbWF4X3Zfc2FtcF9mYWN0b3IgPSBNQVgobWF4X3Zfc2FtcF9mYWN0b3IsIHZfc2FtcF9mYWN0b3IpOwotICB9Ci0gIE1DVV9yb3dzID0gZHN0aW5mby0+aW1hZ2VfaGVpZ2h0IC8gKG1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSk7Ci0gIGlmIChNQ1Vfcm93cyA+IDApCQkvKiBjYW4ndCB0cmltIHRvIDAgcGl4ZWxzICovCi0gICAgZHN0aW5mby0+aW1hZ2VfaGVpZ2h0ID0gTUNVX3Jvd3MgKiAobWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKLX0KLQotCi0vKiBBZGp1c3Qgb3V0cHV0IGltYWdlIHBhcmFtZXRlcnMgYXMgbmVlZGVkLgotICoKLSAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIganBlZ19jb3B5X2NyaXRpY2FsX3BhcmFtZXRlcnMoKQotICogYW5kIGJlZm9yZSBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpLgotICoKLSAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNldCBvZiB2aXJ0dWFsIGNvZWZmaWNpZW50IGFycmF5cyB0byBiZSB3cml0dGVuCi0gKiAoZWl0aGVyIHRoZSBvbmVzIGFsbG9jYXRlZCBieSBqdHJhbnNmb3JtX3JlcXVlc3Rfd29ya3NwYWNlLCBvciB0aGUKLSAqIG9yaWdpbmFsIHNvdXJjZSBkYXRhIGFycmF5cykuICBUaGUgY2FsbGVyIHdpbGwgbmVlZCB0byBwYXNzIHRoaXMgdmFsdWUKLSAqIHRvIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkuCi0gKi8KLQotR0xPQkFMKGp2aXJ0X2JhcnJheV9wdHIgKikKLWp0cmFuc2Zvcm1fYWRqdXN0X3BhcmFtZXRlcnMgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywKLQkJCSAgICAgIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCi0JCQkgICAgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCi0JCQkgICAgICBqcGVnX3RyYW5zZm9ybV9pbmZvICppbmZvKQotewotICAvKiBJZiBmb3JjZS10by1ncmF5c2NhbGUgaXMgcmVxdWVzdGVkLCBhZGp1c3QgZGVzdGluYXRpb24gcGFyYW1ldGVycyAqLwotICBpZiAoaW5mby0+Zm9yY2VfZ3JheXNjYWxlKSB7Ci0gICAgLyogV2UgdXNlIGpwZWdfc2V0X2NvbG9yc3BhY2UgdG8gbWFrZSBzdXJlIHN1YnNpZGlhcnkgc2V0dGluZ3MgZ2V0IGZpeGVkCi0gICAgICogcHJvcGVybHkuICBBbW9uZyBvdGhlciB0aGluZ3MsIHRoZSB0YXJnZXQgaF9zYW1wX2ZhY3RvciAmIHZfc2FtcF9mYWN0b3IKLSAgICAgKiB3aWxsIGdldCBzZXQgdG8gMSwgd2hpY2ggdHlwaWNhbGx5IHdvbid0IG1hdGNoIHRoZSBzb3VyY2UuCi0gICAgICogSW4gZmFjdCB3ZSBkbyB0aGlzIGV2ZW4gaWYgdGhlIHNvdXJjZSBpcyBhbHJlYWR5IGdyYXlzY2FsZTsgdGhhdAotICAgICAqIHByb3ZpZGVzIGFuIGVhc3kgd2F5IG9mIGNvZXJjaW5nIGEgZ3JheXNjYWxlIEpQRUcgd2l0aCBmdW5ueSBzYW1wbGluZwotICAgICAqIGZhY3RvcnMgdG8gdGhlIGN1c3RvbWFyeSAxLDEuICAoU29tZSBkZWNvZGVycyBmYWlsIG9uIG90aGVyIGZhY3RvcnMuKQotICAgICAqLwotICAgIGlmICgoZHN0aW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IgJiYKLQkgZHN0aW5mby0+bnVtX2NvbXBvbmVudHMgPT0gMykgfHwKLQkoZHN0aW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFICYmCi0JIGRzdGluZm8tPm51bV9jb21wb25lbnRzID09IDEpKSB7Ci0gICAgICAvKiBXZSBoYXZlIHRvIHByZXNlcnZlIHRoZSBzb3VyY2UncyBxdWFudGl6YXRpb24gdGFibGUgbnVtYmVyLiAqLwotICAgICAgaW50IHN2X3F1YW50X3RibF9ubyA9IGRzdGluZm8tPmNvbXBfaW5mb1swXS5xdWFudF90Ymxfbm87Ci0gICAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGRzdGluZm8sIEpDU19HUkFZU0NBTEUpOwotICAgICAgZHN0aW5mby0+Y29tcF9pbmZvWzBdLnF1YW50X3RibF9ubyA9IHN2X3F1YW50X3RibF9ubzsKLSAgICB9IGVsc2UgewotICAgICAgLyogU29ycnksIGNhbid0IGRvIGl0ICovCi0gICAgICBFUlJFWElUKGRzdGluZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKLSAgICB9Ci0gIH0KLQotICAvKiBDb3JyZWN0IHRoZSBkZXN0aW5hdGlvbidzIGltYWdlIGRpbWVuc2lvbnMgZXRjIGlmIG5lY2Vzc2FyeSAqLwotICBzd2l0Y2ggKGluZm8tPnRyYW5zZm9ybSkgewotICBjYXNlIEpYRk9STV9OT05FOgotICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KLSAgICBicmVhazsKLSAgY2FzZSBKWEZPUk1fRkxJUF9IOgotICAgIGlmIChpbmZvLT50cmltKQotICAgICAgdHJpbV9yaWdodF9lZGdlKGRzdGluZm8pOwotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9GTElQX1Y6Ci0gICAgaWYgKGluZm8tPnRyaW0pCi0gICAgICB0cmltX2JvdHRvbV9lZGdlKGRzdGluZm8pOwotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9UUkFOU1BPU0U6Ci0gICAgdHJhbnNwb3NlX2NyaXRpY2FsX3BhcmFtZXRlcnMoZHN0aW5mbyk7Ci0gICAgLyogdHJhbnNwb3NlIGRvZXMgTk9UIGhhdmUgdG8gdHJpbSBhbnl0aGluZyAqLwotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9UUkFOU1ZFUlNFOgotICAgIHRyYW5zcG9zZV9jcml0aWNhbF9wYXJhbWV0ZXJzKGRzdGluZm8pOwotICAgIGlmIChpbmZvLT50cmltKSB7Ci0gICAgICB0cmltX3JpZ2h0X2VkZ2UoZHN0aW5mbyk7Ci0gICAgICB0cmltX2JvdHRvbV9lZGdlKGRzdGluZm8pOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBKWEZPUk1fUk9UXzkwOgotICAgIHRyYW5zcG9zZV9jcml0aWNhbF9wYXJhbWV0ZXJzKGRzdGluZm8pOwotICAgIGlmIChpbmZvLT50cmltKQotICAgICAgdHJpbV9yaWdodF9lZGdlKGRzdGluZm8pOwotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9ST1RfMTgwOgotICAgIGlmIChpbmZvLT50cmltKSB7Ci0gICAgICB0cmltX3JpZ2h0X2VkZ2UoZHN0aW5mbyk7Ci0gICAgICB0cmltX2JvdHRvbV9lZGdlKGRzdGluZm8pOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBKWEZPUk1fUk9UXzI3MDoKLSAgICB0cmFuc3Bvc2VfY3JpdGljYWxfcGFyYW1ldGVycyhkc3RpbmZvKTsKLSAgICBpZiAoaW5mby0+dHJpbSkKLSAgICAgIHRyaW1fYm90dG9tX2VkZ2UoZHN0aW5mbyk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvKiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBkYXRhIHNldCAqLwotICBpZiAoaW5mby0+d29ya3NwYWNlX2NvZWZfYXJyYXlzICE9IE5VTEwpCi0gICAgcmV0dXJuIGluZm8tPndvcmtzcGFjZV9jb2VmX2FycmF5czsKLSAgcmV0dXJuIHNyY19jb2VmX2FycmF5czsKLX0KLQotCi0vKiBFeGVjdXRlIHRoZSBhY3R1YWwgdHJhbnNmb3JtYXRpb24sIGlmIGFueS4KLSAqCi0gKiBUaGlzIG11c3QgYmUgY2FsbGVkICphZnRlcioganBlZ193cml0ZV9jb2VmZmljaWVudHMsIGJlY2F1c2UgaXQgZGVwZW5kcwotICogb24ganBlZ193cml0ZV9jb2VmZmljaWVudHMgdG8gaGF2ZSBjb21wdXRlZCBzdWJzaWRpYXJ5IHZhbHVlcyBzdWNoIGFzCi0gKiB0aGUgcGVyLWNvbXBvbmVudCB3aWR0aCBhbmQgaGVpZ2h0IGZpZWxkcyBpbiB0aGUgZGVzdGluYXRpb24gb2JqZWN0LgotICoKLSAqIE5vdGUgdGhhdCBzb21lIHRyYW5zZm9ybWF0aW9ucyB3aWxsIG1vZGlmeSB0aGUgc291cmNlIGRhdGEgYXJyYXlzIQotICovCi0KLUdMT0JBTCh2b2lkKQotanRyYW5zZm9ybV9leGVjdXRlX3RyYW5zZm9ybWF0aW9uIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sCi0JCQkJICAgal9jb21wcmVzc19wdHIgZHN0aW5mbywKLQkJCQkgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCi0JCQkJICAganBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbykKLXsKLSAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzID0gaW5mby0+d29ya3NwYWNlX2NvZWZfYXJyYXlzOwotCi0gIHN3aXRjaCAoaW5mby0+dHJhbnNmb3JtKSB7Ci0gIGNhc2UgSlhGT1JNX05PTkU6Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlhGT1JNX0ZMSVBfSDoKLSAgICBkb19mbGlwX2goc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzKTsKLSAgICBicmVhazsKLSAgY2FzZSBKWEZPUk1fRkxJUF9WOgotICAgIGRvX2ZsaXBfdihzcmNpbmZvLCBkc3RpbmZvLCBzcmNfY29lZl9hcnJheXMsIGRzdF9jb2VmX2FycmF5cyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlhGT1JNX1RSQU5TUE9TRToKLSAgICBkb190cmFuc3Bvc2Uoc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOwotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9UUkFOU1ZFUlNFOgotICAgIGRvX3RyYW5zdmVyc2Uoc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOwotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9ST1RfOTA6Ci0gICAgZG9fcm90XzkwKHNyY2luZm8sIGRzdGluZm8sIHNyY19jb2VmX2FycmF5cywgZHN0X2NvZWZfYXJyYXlzKTsKLSAgICBicmVhazsKLSAgY2FzZSBKWEZPUk1fUk9UXzE4MDoKLSAgICBkb19yb3RfMTgwKHNyY2luZm8sIGRzdGluZm8sIHNyY19jb2VmX2FycmF5cywgZHN0X2NvZWZfYXJyYXlzKTsKLSAgICBicmVhazsKLSAgY2FzZSBKWEZPUk1fUk9UXzI3MDoKLSAgICBkb19yb3RfMjcwKHNyY2luZm8sIGRzdGluZm8sIHNyY19jb2VmX2FycmF5cywgZHN0X2NvZWZfYXJyYXlzKTsKLSAgICBicmVhazsKLSAgfQotfQotCi0jZW5kaWYgLyogVFJBTlNGT1JNU19TVVBQT1JURUQgKi8KLQotCi0vKiBTZXR1cCBkZWNvbXByZXNzaW9uIG9iamVjdCB0byBzYXZlIGRlc2lyZWQgbWFya2VycyBpbiBtZW1vcnkuCi0gKiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBqcGVnX3JlYWRfaGVhZGVyKCkgdG8gaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qY29weV9tYXJrZXJzX3NldHVwIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIEpDT1BZX09QVElPTiBvcHRpb24pCi17Ci0jaWZkZWYgU0FWRV9NQVJLRVJTX1NVUFBPUlRFRAotICBpbnQgbTsKLQotICAvKiBTYXZlIGNvbW1lbnRzIGV4Y2VwdCB1bmRlciBOT05FIG9wdGlvbiAqLwotICBpZiAob3B0aW9uICE9IEpDT1BZT1BUX05PTkUpIHsKLSAgICBqcGVnX3NhdmVfbWFya2VycyhzcmNpbmZvLCBKUEVHX0NPTSwgMHhGRkZGKTsKLSAgfQotICAvKiBTYXZlIGFsbCB0eXBlcyBvZiBBUFBuIG1hcmtlcnMgaWZmIEFMTCBvcHRpb24gKi8KLSAgaWYgKG9wdGlvbiA9PSBKQ09QWU9QVF9BTEwpIHsKLSAgICBmb3IgKG0gPSAwOyBtIDwgMTY7IG0rKykKLSAgICAgIGpwZWdfc2F2ZV9tYXJrZXJzKHNyY2luZm8sIEpQRUdfQVBQMCArIG0sIDB4RkZGRik7Ci0gIH0KLSNlbmRpZiAvKiBTQVZFX01BUktFUlNfU1VQUE9SVEVEICovCi19Ci0KLS8qIENvcHkgbWFya2VycyBzYXZlZCBpbiB0aGUgZ2l2ZW4gc291cmNlIG9iamVjdCB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0LgotICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGp1c3QgYWZ0ZXIganBlZ19zdGFydF9jb21wcmVzcygpIG9yCi0gKiBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpLgotICogTm90ZSB0aGF0IHRob3NlIHJvdXRpbmVzIHdpbGwgaGF2ZSB3cml0dGVuIHRoZSBTT0ksIGFuZCBhbHNvIHRoZQotICogSkZJRiBBUFAwIG9yIEFkb2JlIEFQUDE0IG1hcmtlcnMgaWYgc2VsZWN0ZWQuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qY29weV9tYXJrZXJzX2V4ZWN1dGUgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKLQkJICAgICAgIEpDT1BZX09QVElPTiBvcHRpb24pCi17Ci0gIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBtYXJrZXI7Ci0KLSAgLyogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gZXhhbWluZSB0aGUKLSAgICogb3B0aW9uIGZsYWcgaGVyZTsgd2UganVzdCBjb3B5IGV2ZXJ5dGhpbmcgdGhhdCBnb3Qgc2F2ZWQuCi0gICAqIEJ1dCB0byBhdm9pZCBjb25mdXNpb24sIHdlIGRvIG5vdCBvdXRwdXQgSkZJRiBhbmQgQWRvYmUgQVBQMTQgbWFya2VycwotICAgKiBpZiB0aGUgZW5jb2RlciBsaWJyYXJ5IGFscmVhZHkgd3JvdGUgb25lLgotICAgKi8KLSAgZm9yIChtYXJrZXIgPSBzcmNpbmZvLT5tYXJrZXJfbGlzdDsgbWFya2VyICE9IE5VTEw7IG1hcmtlciA9IG1hcmtlci0+bmV4dCkgewotICAgIGlmIChkc3RpbmZvLT53cml0ZV9KRklGX2hlYWRlciAmJgotCW1hcmtlci0+bWFya2VyID09IEpQRUdfQVBQMCAmJgotCW1hcmtlci0+ZGF0YV9sZW5ndGggPj0gNSAmJgotCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbMF0pID09IDB4NEEgJiYKLQlHRVRKT0NURVQobWFya2VyLT5kYXRhWzFdKSA9PSAweDQ2ICYmCi0JR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVsyXSkgPT0gMHg0OSAmJgotCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbM10pID09IDB4NDYgJiYKLQlHRVRKT0NURVQobWFya2VyLT5kYXRhWzRdKSA9PSAwKQotICAgICAgY29udGludWU7CQkJLyogcmVqZWN0IGR1cGxpY2F0ZSBKRklGICovCi0gICAgaWYgKGRzdGluZm8tPndyaXRlX0Fkb2JlX21hcmtlciAmJgotCW1hcmtlci0+bWFya2VyID09IEpQRUdfQVBQMCsxNCAmJgotCW1hcmtlci0+ZGF0YV9sZW5ndGggPj0gNSAmJgotCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbMF0pID09IDB4NDEgJiYKLQlHRVRKT0NURVQobWFya2VyLT5kYXRhWzFdKSA9PSAweDY0ICYmCi0JR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVsyXSkgPT0gMHg2RiAmJgotCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbM10pID09IDB4NjIgJiYKLQlHRVRKT0NURVQobWFya2VyLT5kYXRhWzRdKSA9PSAweDY1KQotICAgICAgY29udGludWU7CQkJLyogcmVqZWN0IGR1cGxpY2F0ZSBBZG9iZSAqLwotI2lmZGVmIE5FRURfRkFSX1BPSU5URVJTCi0gICAgLyogV2UgY291bGQgdXNlIGpwZWdfd3JpdGVfbWFya2VyIGlmIHRoZSBkYXRhIHdlcmVuJ3QgRkFSLi4uICovCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBqcGVnX3dyaXRlX21faGVhZGVyKGRzdGluZm8sIG1hcmtlci0+bWFya2VyLCBtYXJrZXItPmRhdGFfbGVuZ3RoKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXJrZXItPmRhdGFfbGVuZ3RoOyBpKyspCi0JanBlZ193cml0ZV9tX2J5dGUoZHN0aW5mbywgbWFya2VyLT5kYXRhW2ldKTsKLSAgICB9Ci0jZWxzZQotICAgIGpwZWdfd3JpdGVfbWFya2VyKGRzdGluZm8sIG1hcmtlci0+bWFya2VyLAotCQkgICAgICBtYXJrZXItPmRhdGEsIG1hcmtlci0+ZGF0YV9sZW5ndGgpOwotI2VuZGlmCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3RyYW5zdXBwLmggYi90cmFuc3VwcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzJkMzJhLi4wMDAwMDAwCi0tLSBhL3RyYW5zdXBwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIHRyYW5zdXBwLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZGVjbGFyYXRpb25zIGZvciBpbWFnZSB0cmFuc2Zvcm1hdGlvbiByb3V0aW5lcyBhbmQKLSAqIG90aGVyIHV0aWxpdHkgY29kZSB1c2VkIGJ5IHRoZSBqcGVndHJhbiBzYW1wbGUgYXBwbGljYXRpb24uICBUaGVzZSBhcmUKLSAqIE5PVCBwYXJ0IG9mIHRoZSBjb3JlIEpQRUcgbGlicmFyeS4gIEJ1dCB3ZSBrZWVwIHRoZXNlIHJvdXRpbmVzIHNlcGFyYXRlCi0gKiBmcm9tIGpwZWd0cmFuLmMgdG8gZWFzZSB0aGUgdGFzayBvZiBtYWludGFpbmluZyBqcGVndHJhbi1saWtlIHByb2dyYW1zCi0gKiB0aGF0IGhhdmUgb3RoZXIgdXNlciBpbnRlcmZhY2VzLgotICoKLSAqIE5PVEU6IGFsbCB0aGUgcm91dGluZXMgZGVjbGFyZWQgaGVyZSBoYXZlIHZlcnkgc3BlY2lmaWMgcmVxdWlyZW1lbnRzCi0gKiBhYm91dCB3aGVuIHRoZXkgYXJlIHRvIGJlIGV4ZWN1dGVkIGR1cmluZyB0aGUgcmVhZGluZyBhbmQgd3JpdGluZyBvZiB0aGUKLSAqIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZmlsZXMuICBTZWUgdGhlIGNvbW1lbnRzIGluIHRyYW5zdXBwLmMsIG9yIHNlZQotICoganBlZ3RyYW4uYyBmb3IgYW4gZXhhbXBsZSBvZiBjb3JyZWN0IHVzYWdlLgotICovCi0KLS8qIElmIHlvdSBoYXBwZW4gbm90IHRvIHdhbnQgdGhlIGltYWdlIHRyYW5zZm9ybSBzdXBwb3J0LCBkaXNhYmxlIGl0IGhlcmUgKi8KLSNpZm5kZWYgVFJBTlNGT1JNU19TVVBQT1JURUQKLSNkZWZpbmUgVFJBTlNGT1JNU19TVVBQT1JURUQgMQkJLyogMCBkaXNhYmxlcyB0cmFuc2Zvcm0gY29kZSAqLwotI2VuZGlmCi0KLS8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLiAqLwotCi0jaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI2RlZmluZSBqdHJhbnNmb3JtX3JlcXVlc3Rfd29ya3NwYWNlCQlqVHJSZXF1ZXN0Ci0jZGVmaW5lIGp0cmFuc2Zvcm1fYWRqdXN0X3BhcmFtZXRlcnMJCWpUckFkanVzdAotI2RlZmluZSBqdHJhbnNmb3JtX2V4ZWN1dGVfdHJhbnNmb3JtYXRpb24JalRyRXhlYwotI2RlZmluZSBqY29weV9tYXJrZXJzX3NldHVwCQkJakNNcmtTZXR1cAotI2RlZmluZSBqY29weV9tYXJrZXJzX2V4ZWN1dGUJCQlqQ01ya0V4ZWMKLSNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCi0KLQotLyoKLSAqIENvZGVzIGZvciBzdXBwb3J0ZWQgdHlwZXMgb2YgaW1hZ2UgdHJhbnNmb3JtYXRpb25zLgotICovCi0KLXR5cGVkZWYgZW51bSB7Ci0JSlhGT1JNX05PTkUsCQkvKiBubyB0cmFuc2Zvcm1hdGlvbiAqLwotCUpYRk9STV9GTElQX0gsCQkvKiBob3Jpem9udGFsIGZsaXAgKi8KLQlKWEZPUk1fRkxJUF9WLAkJLyogdmVydGljYWwgZmxpcCAqLwotCUpYRk9STV9UUkFOU1BPU0UsCS8qIHRyYW5zcG9zZSBhY3Jvc3MgVUwtdG8tTFIgYXhpcyAqLwotCUpYRk9STV9UUkFOU1ZFUlNFLAkvKiB0cmFuc3Bvc2UgYWNyb3NzIFVSLXRvLUxMIGF4aXMgKi8KLQlKWEZPUk1fUk9UXzkwLAkJLyogOTAtZGVncmVlIGNsb2Nrd2lzZSByb3RhdGlvbiAqLwotCUpYRk9STV9ST1RfMTgwLAkJLyogMTgwLWRlZ3JlZSByb3RhdGlvbiAqLwotCUpYRk9STV9ST1RfMjcwCQkvKiAyNzAtZGVncmVlIGNsb2Nrd2lzZSAob3IgOTAgY2N3KSAqLwotfSBKWEZPUk1fQ09ERTsKLQotLyoKLSAqIEFsdGhvdWdoIHJvdGF0aW5nIGFuZCBmbGlwcGluZyBkYXRhIGV4cHJlc3NlZCBhcyBEQ1QgY29lZmZpY2llbnRzIGlzIG5vdAotICogaGFyZCwgdGhlcmUgaXMgYW4gYXN5bW1ldHJ5IGluIHRoZSBKUEVHIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGZvciBpbWFnZXMKLSAqIHdob3NlIGRpbWVuc2lvbnMgYXJlbid0IG11bHRpcGxlcyBvZiB0aGUgaU1DVSBzaXplLiAgVGhlIHJpZ2h0IGFuZCBib3R0b20KLSAqIGltYWdlIGVkZ2VzIGFyZSBwYWRkZWQgb3V0IHRvIHRoZSBuZXh0IGlNQ1UgYm91bmRhcnkgd2l0aCBqdW5rIGRhdGE7IGJ1dAotICogbm8gcGFkZGluZyBpcyBwb3NzaWJsZSBhdCB0aGUgdG9wIGFuZCBsZWZ0IGVkZ2VzLiAgSWYgd2Ugd2VyZSB0byBmbGlwCi0gKiB0aGUgd2hvbGUgaW1hZ2UgaW5jbHVkaW5nIHRoZSBwYWQgZGF0YSwgdGhlbiBwYWQgZ2FyYmFnZSB3b3VsZCBiZWNvbWUKLSAqIHZpc2libGUgYXQgdGhlIHRvcCBhbmQvb3IgbGVmdCwgYW5kIHJlYWwgcGl4ZWxzIHdvdWxkIGRpc2FwcGVhciBpbnRvIHRoZQotICogcGFkIG1hcmdpbnMgLS0tIHBlcmhhcHMgcGVybWFuZW50bHksIHNpbmNlIGVuY29kZXJzICYgZGVjb2RlcnMgbWF5IG5vdAotICogYm90aGVyIHRvIHByZXNlcnZlIERDVCBibG9ja3MgdGhhdCBhcHBlYXIgdG8gYmUgY29tcGxldGVseSBvdXRzaWRlIHRoZQotICogbm9taW5hbCBpbWFnZSBhcmVhLiAgU28sIHdlIGhhdmUgdG8gZXhjbHVkZSBhbnkgcGFydGlhbCBpTUNVcyBmcm9tIHRoZQotICogYmFzaWMgdHJhbnNmb3JtYXRpb24uCi0gKgotICogVHJhbnNwb3NlIGlzIHRoZSBvbmx5IHRyYW5zZm9ybWF0aW9uIHRoYXQgY2FuIGhhbmRsZSBwYXJ0aWFsIGlNQ1VzIGF0IHRoZQotICogcmlnaHQgYW5kIGJvdHRvbSBlZGdlcyBjb21wbGV0ZWx5IGNsZWFubHkuICBmbGlwX2ggY2FuIGZsaXAgcGFydGlhbCBpTUNVcwotICogYXQgdGhlIGJvdHRvbSwgYnV0IGxlYXZlcyBhbnkgcGFydGlhbCBpTUNVcyBhdCB0aGUgcmlnaHQgZWRnZSB1bnRvdWNoZWQuCi0gKiBTaW1pbGFybHkgZmxpcF92IGxlYXZlcyBhbnkgcGFydGlhbCBpTUNVcyBhdCB0aGUgYm90dG9tIGVkZ2UgdW50b3VjaGVkLgotICogVGhlIG90aGVyIHRyYW5zZm9ybXMgYXJlIGRlZmluZWQgYXMgY29tYmluYXRpb25zIG9mIHRoZXNlIGJhc2ljIHRyYW5zZm9ybXMKLSAqIGFuZCBwcm9jZXNzIGVkZ2UgYmxvY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIHRoZSBlcXVpdmFsZW5jZS4KLSAqCi0gKiBUaGUgInRyaW0iIG9wdGlvbiBjYXVzZXMgdW50cmFuc2Zvcm1hYmxlIHBhcnRpYWwgaU1DVXMgdG8gYmUgZHJvcHBlZDsKLSAqIHRoaXMgaXMgbm90IHN0cmljdGx5IGxvc3NsZXNzLCBidXQgaXQgdXN1YWxseSBnaXZlcyB0aGUgYmVzdC1sb29raW5nCi0gKiByZXN1bHQgZm9yIG9kZC1zaXplIGltYWdlcy4gIE5vdGUgdGhhdCB3aGVuIHRoaXMgb3B0aW9uIGlzIGFjdGl2ZSwKLSAqIHRoZSBleHBlY3RlZCBtYXRoZW1hdGljYWwgZXF1aXZhbGVuY2VzIGJldHdlZW4gdGhlIHRyYW5zZm9ybXMgbWF5IG5vdCBob2xkLgotICogKEZvciBleGFtcGxlLCAtcm90IDI3MCAtdHJpbSB0cmltcyBvbmx5IHRoZSBib3R0b20gZWRnZSwgYnV0IC1yb3QgOTAgLXRyaW0KLSAqIGZvbGxvd2VkIGJ5IC1yb3QgMTgwIC10cmltIHRyaW1zIGJvdGggZWRnZXMuKQotICoKLSAqIFdlIGFsc28gb2ZmZXIgYSAiZm9yY2UgdG8gZ3JheXNjYWxlIiBvcHRpb24sIHdoaWNoIHNpbXBseSBkaXNjYXJkcyB0aGUKLSAqIGNocm9taW5hbmNlIGNoYW5uZWxzIG9mIGEgWUNiQ3IgaW1hZ2UuICBUaGlzIGlzIGxvc3NsZXNzIGluIHRoZSBzZW5zZSB0aGF0Ci0gKiB0aGUgbHVtaW5hbmNlIGNoYW5uZWwgaXMgcHJlc2VydmVkIGV4YWN0bHkuICBJdCdzIG5vdCB0aGUgc2FtZSBraW5kIG9mCi0gKiB0aGluZyBhcyB0aGUgcm90YXRlL2ZsaXAgdHJhbnNmb3JtYXRpb25zLCBidXQgaXQncyBjb252ZW5pZW50IHRvIGhhbmRsZSBpdAotICogYXMgcGFydCBvZiB0aGlzIHBhY2thZ2UsIG1haW5seSBiZWNhdXNlIHRoZSB0cmFuc2Zvcm1hdGlvbiByb3V0aW5lcyBoYXZlIHRvCi0gKiBiZSBhd2FyZSBvZiB0aGUgb3B0aW9uIHRvIGtub3cgaG93IG1hbnkgY29tcG9uZW50cyB0byB3b3JrIG9uLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogT3B0aW9uczogc2V0IGJ5IGNhbGxlciAqLwotICBKWEZPUk1fQ09ERSB0cmFuc2Zvcm07CS8qIGltYWdlIHRyYW5zZm9ybSBvcGVyYXRvciAqLwotICBib29sZWFuIHRyaW07CQkJLyogaWYgVFJVRSwgdHJpbSBwYXJ0aWFsIE1DVXMgYXMgbmVlZGVkICovCi0gIGJvb2xlYW4gZm9yY2VfZ3JheXNjYWxlOwkvKiBpZiBUUlVFLCBjb252ZXJ0IGNvbG9yIGltYWdlIHRvIGdyYXlzY2FsZSAqLwotCi0gIC8qIEludGVybmFsIHdvcmtzcGFjZTogY2FsbGVyIHNob3VsZCBub3QgdG91Y2ggdGhlc2UgKi8KLSAgaW50IG51bV9jb21wb25lbnRzOwkJLyogIyBvZiBjb21wb25lbnRzIGluIHdvcmtzcGFjZSAqLwotICBqdmlydF9iYXJyYXlfcHRyICogd29ya3NwYWNlX2NvZWZfYXJyYXlzOyAvKiB3b3Jrc3BhY2UgZm9yIHRyYW5zZm9ybWF0aW9ucyAqLwotfSBqcGVnX3RyYW5zZm9ybV9pbmZvOwotCi0KLSNpZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAotCi0vKiBSZXF1ZXN0IGFueSByZXF1aXJlZCB3b3Jrc3BhY2UgKi8KLUVYVEVSTih2b2lkKSBqdHJhbnNmb3JtX3JlcXVlc3Rfd29ya3NwYWNlCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpwZWdfdHJhbnNmb3JtX2luZm8gKmluZm8pKTsKLS8qIEFkanVzdCBvdXRwdXQgaW1hZ2UgcGFyYW1ldGVycyAqLwotRVhURVJOKGp2aXJ0X2JhcnJheV9wdHIgKikganRyYW5zZm9ybV9hZGp1c3RfcGFyYW1ldGVycwotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAotCSAgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAotCSAgICAganBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbykpOwotLyogRXhlY3V0ZSB0aGUgYWN0dWFsIHRyYW5zZm9ybWF0aW9uLCBpZiBhbnkgKi8KLUVYVEVSTih2b2lkKSBqdHJhbnNmb3JtX2V4ZWN1dGVfdHJhbnNmb3JtYXRpb24KLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKLQkgICAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKLQkgICAgIGpwZWdfdHJhbnNmb3JtX2luZm8gKmluZm8pKTsKLQotI2VuZGlmIC8qIFRSQU5TRk9STVNfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIFN1cHBvcnQgZm9yIGNvcHlpbmcgb3B0aW9uYWwgbWFya2VycyBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiBmaWxlLgotICovCi0KLXR5cGVkZWYgZW51bSB7Ci0JSkNPUFlPUFRfTk9ORSwJCS8qIGNvcHkgbm8gb3B0aW9uYWwgbWFya2VycyAqLwotCUpDT1BZT1BUX0NPTU1FTlRTLAkvKiBjb3B5IG9ubHkgY29tbWVudCAoQ09NKSBtYXJrZXJzICovCi0JSkNPUFlPUFRfQUxMCQkvKiBjb3B5IGFsbCBvcHRpb25hbCBtYXJrZXJzICovCi19IEpDT1BZX09QVElPTjsKLQotI2RlZmluZSBKQ09QWU9QVF9ERUZBVUxUICBKQ09QWU9QVF9DT01NRU5UUwkvKiByZWNvbW1lbmRlZCBkZWZhdWx0ICovCi0KLS8qIFNldHVwIGRlY29tcHJlc3Npb24gb2JqZWN0IHRvIHNhdmUgZGVzaXJlZCBtYXJrZXJzIGluIG1lbW9yeSAqLwotRVhURVJOKHZvaWQpIGpjb3B5X21hcmtlcnNfc2V0dXAKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgSkNPUFlfT1BUSU9OIG9wdGlvbikpOwotLyogQ29weSBtYXJrZXJzIHNhdmVkIGluIHRoZSBnaXZlbiBzb3VyY2Ugb2JqZWN0IHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgKi8KLUVYVEVSTih2b2lkKSBqY29weV9tYXJrZXJzX2V4ZWN1dGUKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKLQkgICAgIEpDT1BZX09QVElPTiBvcHRpb24pKTsKZGlmZiAtLWdpdCBhL3VudXNlZC9qY29uZmlnLmJjYyBiL3VudXNlZC9qY29uZmlnLmJjYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjNTNmZi4uMDAwMDAwMAotLS0gYS91bnVzZWQvamNvbmZpZy5iY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKiBqY29uZmlnLmJjYyAtLS0gamNvbmZpZy5oIGZvciBCb3JsYW5kIEMgKFR1cmJvIEMpIG9uIE1TLURPUyBvciBPUy8yLiAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KLQotI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKLS8qICNkZWZpbmUgdm9pZCBjaGFyICovCi0vKiAjZGVmaW5lIGNvbnN0ICovCi0jdW5kZWYgQ0hBUl9JU19VTlNJR05FRAotI2RlZmluZSBIQVZFX1NURERFRl9ICi0jZGVmaW5lIEhBVkVfU1RETElCX0gKLSN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCi0jdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAotI2lmZGVmIF9fTVNET1NfXwotI2RlZmluZSBORUVEX0ZBUl9QT0lOVEVSUwkvKiBmb3Igc21hbGwgb3IgbWVkaXVtIG1lbW9yeSBtb2RlbCAqLwotI2VuZGlmCi0jdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCS8qIHRoaXMgYXNzdW1lcyB5b3UgaGF2ZSAtdy1zdHUgaW4gQ0ZMQUdTICovCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMUwotCi0jdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLQotI2lmZGVmIF9fTVNET1NfXwotI2RlZmluZSBVU0VfTVNET1NfTUVNTUdSCS8qIERlZmluZSB0aGlzIGlmIHlvdSB1c2Ugam1lbWRvcy5jICovCi0jZGVmaW5lIE1BWF9BTExPQ19DSFVOSyA2NTUyMEwJLyogTWF4aW11bSByZXF1ZXN0IHRvIG1hbGxvYygpICovCi0jZGVmaW5lIFVTRV9GTUVNCQkvKiBCb3JsYW5kIGhhcyBfZm1lbWNweSgpIGFuZCBfZm1lbXNldCgpICovCi0jZW5kaWYKLQotI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCi0KLSNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCi0KLSNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCi0KLSNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUKLSNkZWZpbmUgVVNFX1NFVE1PREUJCS8qIEJvcmxhbmQgaGFzIHNldG1vZGUoKSAqLwotI2lmZGVmIF9fTVNET1NfXwotI2RlZmluZSBORUVEX1NJR05BTF9DQVRDSEVSCS8qIERlZmluZSB0aGlzIGlmIHlvdSB1c2Ugam1lbWRvcy5jICovCi0jZW5kaWYKLSN1bmRlZiBET05UX1VTRV9CX01PREUKLSN1bmRlZiBQUk9HUkVTU19SRVBPUlQJCS8qIG9wdGlvbmFsICovCi0KLSNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS91bnVzZWQvamNvbmZpZy5tYWMgYi91bnVzZWQvamNvbmZpZy5tYWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZTNlZmUuLjAwMDAwMDAKLS0tIGEvdW51c2VkL2pjb25maWcubWFjCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogamNvbmZpZy5tYWMgLS0tIGpjb25maWcuaCBmb3IgQ29kZVdhcnJpb3Igb24gQXBwbGUgTWFjaW50b3NoICovCi0vKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLwotCi0jZGVmaW5lIEhBVkVfUFJPVE9UWVBFUwotI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAotLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KLS8qICNkZWZpbmUgY29uc3QgKi8KLSN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECi0jZGVmaW5lIEhBVkVfU1REREVGX0gKLSNkZWZpbmUgSEFWRV9TVERMSUJfSAotI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKLSN1bmRlZiBORUVEX1NZU19UWVBFU19ICi0jdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKLSN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLQotI2lmZGVmIEpQRUdfSU5URVJOQUxTCi0KLSN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotCi0jZGVmaW5lIFVTRV9NQUNfTUVNTUdSCQkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1tYWMuYyAqLwotCi0jZGVmaW5lIEFMSUdOX1RZUEUgbG9uZwkJLyogTmVlZGVkIGZvciA2ODB4MCBNYWNzICovCi0KLSNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLwotCi0jaWZkZWYgSlBFR19DSlBFR19ESlBFRwotCi0jZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotCi0jZGVmaW5lIFVTRV9DQ09NTUFORAkJLyogQ29tbWFuZCBsaW5lIHJlYWRlciBmb3IgTWFjaW50b3NoICovCi0jZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCS8qIEJpbmFyeSBJL08gdGhydSBzdGRpbi9zdGRvdXQgZG9lc24ndCB3b3JrICovCi0KLSN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCi0jdW5kZWYgRE9OVF9VU0VfQl9NT0RFCi0jdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLwotCi0jZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvdW51c2VkL2pjb25maWcubWFueCBiL3VudXNlZC9qY29uZmlnLm1hbngKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZDBkMDAuLjAwMDAwMDAKLS0tIGEvdW51c2VkL2pjb25maWcubWFueAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIGpjb25maWcubWFueCAtLS0gamNvbmZpZy5oIGZvciBBbWlnYSBzeXN0ZW1zIHVzaW5nIE1hbnggQXp0ZWMgQyB2ZXIgNS54LiAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KLQotI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKLS8qICNkZWZpbmUgdm9pZCBjaGFyICovCi0vKiAjZGVmaW5lIGNvbnN0ICovCi0jdW5kZWYgQ0hBUl9JU19VTlNJR05FRAotI2RlZmluZSBIQVZFX1NURERFRl9ICi0jZGVmaW5lIEhBVkVfU1RETElCX0gKLSN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCi0jdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAotI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCi0jdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMUwotCi0jdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLQotI2RlZmluZSBURU1QX0RJUkVDVE9SWSAiSlBFR1RNUDoiCS8qIHJlY29tbWVuZGVkIHNldHRpbmcgZm9yIEFtaWdhICovCi0KLSNkZWZpbmUgU0hPUlR4U0hPUlRfMzIJCS8qIHByb2R1Y2VzIGJldHRlciBEQ1QgY29kZSB3aXRoIEF6dGVjIEMgKi8KLQotI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCi0KLSNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCi0KLSNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCi0KLSNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUKLSNkZWZpbmUgTkVFRF9TSUdOQUxfQ0FUQ0hFUgotI3VuZGVmIERPTlRfVVNFX0JfTU9ERQotI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KLQotI2RlZmluZSBzaWduYWxfY2F0Y2hlciBfYWJvcnQJLyogaGFjayBmb3IgQXp0ZWMgQyBuYW1pbmcgcmVxdWlyZW1lbnRzICovCi0KLSNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS91bnVzZWQvamNvbmZpZy5tYzYgYi91bnVzZWQvamNvbmZpZy5tYzYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NTA4MmQuLjAwMDAwMDAKLS0tIGEvdW51c2VkL2pjb25maWcubWM2CisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyogamNvbmZpZy5tYzYgLS0tIGpjb25maWcuaCBmb3IgTWljcm9zb2Z0IEMgb24gTVMtRE9TLCB2ZXJzaW9uIDYuMDBBICYgdXAuICovCi0vKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLwotCi0jZGVmaW5lIEhBVkVfUFJPVE9UWVBFUwotI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAotLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KLS8qICNkZWZpbmUgY29uc3QgKi8KLSN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECi0jZGVmaW5lIEhBVkVfU1REREVGX0gKLSNkZWZpbmUgSEFWRV9TVERMSUJfSAotI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKLSN1bmRlZiBORUVEX1NZU19UWVBFU19ICi0jZGVmaW5lIE5FRURfRkFSX1BPSU5URVJTCS8qIGZvciBzbWFsbCBvciBtZWRpdW0gbWVtb3J5IG1vZGVsICovCi0jdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMUwotCi0jdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLQotI2RlZmluZSBVU0VfTVNET1NfTUVNTUdSCS8qIERlZmluZSB0aGlzIGlmIHlvdSB1c2Ugam1lbWRvcy5jICovCi0KLSNkZWZpbmUgTUFYX0FMTE9DX0NIVU5LIDY1NTIwTAkvKiBNYXhpbXVtIHJlcXVlc3QgdG8gbWFsbG9jKCkgKi8KLQotI2RlZmluZSBVU0VfRk1FTQkJLyogTWljcm9zb2Z0IGhhcyBfZm1lbWNweSgpIGFuZCBfZm1lbXNldCgpICovCi0KLSNkZWZpbmUgTkVFRF9GSEVBUE1JTgkJLyogZmFyIGhlYXAgbWFuYWdlbWVudCByb3V0aW5lcyBhcmUgYnJva2VuICovCi0KLSNkZWZpbmUgU0hPUlR4TENPTlNUXzMyCQkvKiBlbmFibGUgY29tcGlsZXItc3BlY2lmaWMgRENUIG9wdGltaXphdGlvbiAqLwotLyogTm90ZTogdGhlIGFib3ZlIGRlZmluZSBpcyBrbm93biB0byBpbXByb3ZlIHRoZSBjb2RlIHdpdGggTWljcm9zb2Z0IEMgNi4wMEEuCi0gKiBJIGRvIG5vdCBrbm93IHdoZXRoZXIgaXQgaXMgZ29vZCBmb3IgbGF0ZXIgY29tcGlsZXIgdmVyc2lvbnMuCi0gKiBQbGVhc2UgcmVwb3J0IGFueSBpbmZvIG9uIHRoaXMgcG9pbnQgdG8ganBlZy1pbmZvQHV1bmV0LnV1Lm5ldC4KLSAqLwotCi0jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KLQotI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKLQotI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLQotI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORQotI2RlZmluZSBVU0VfU0VUTU9ERQkJLyogTWljcm9zb2Z0IGhhcyBzZXRtb2RlKCkgKi8KLSNkZWZpbmUgTkVFRF9TSUdOQUxfQ0FUQ0hFUgkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1kb3MuYyAqLwotI3VuZGVmIERPTlRfVVNFX0JfTU9ERQotI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KLQotI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL3VudXNlZC9qY29uZmlnLnNhcyBiL3VudXNlZC9qY29uZmlnLnNhcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZkYWMyMi4uMDAwMDAwMAotLS0gYS91bnVzZWQvamNvbmZpZy5zYXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBqY29uZmlnLnNhcyAtLS0gamNvbmZpZy5oIGZvciBBbWlnYSBzeXN0ZW1zIHVzaW5nIFNBUyBDIDYuMCBhbmQgdXAuICovCi0vKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLwotCi0jZGVmaW5lIEhBVkVfUFJPVE9UWVBFUwotI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAotLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KLS8qICNkZWZpbmUgY29uc3QgKi8KLSN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECi0jZGVmaW5lIEhBVkVfU1REREVGX0gKLSNkZWZpbmUgSEFWRV9TVERMSUJfSAotI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKLSN1bmRlZiBORUVEX1NZU19UWVBFU19ICi0jdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKLSN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLQotI2lmZGVmIEpQRUdfSU5URVJOQUxTCi0KLSN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotCi0jZGVmaW5lIFRFTVBfRElSRUNUT1JZICJKUEVHVE1QOiIJLyogcmVjb21tZW5kZWQgc2V0dGluZyBmb3IgQW1pZ2EgKi8KLQotI2RlZmluZSBOT19NS1RFTVAJCS8qIFNBUyBDIGRvZXNuJ3QgaGF2ZSBta3RlbXAoKSAqLwotCi0jZGVmaW5lIFNIT1JUeFNIT1JUXzMyCQkvKiBwcm9kdWNlcyBiZXR0ZXIgRENUIGNvZGUgd2l0aCBTQVMgQyAqLwotCi0jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KLQotI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKLQotI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLQotI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORQotI2RlZmluZSBORUVEX1NJR05BTF9DQVRDSEVSCi0jdW5kZWYgRE9OVF9VU0VfQl9NT0RFCi0jdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLwotCi0jZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvdW51c2VkL2pjb25maWcuc3QgYi91bnVzZWQvamNvbmZpZy5zdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyMWI3YS4uMDAwMDAwMAotLS0gYS91bnVzZWQvamNvbmZpZy5zdAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIGpjb25maWcuc3QgLS0tIGpjb25maWcuaCBmb3IgQXRhcmkgU1QvU1RFL1RUIHVzaW5nIFB1cmUgQyBvciBUdXJibyBDLiAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KLQotI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKLS8qICNkZWZpbmUgdm9pZCBjaGFyICovCi0vKiAjZGVmaW5lIGNvbnN0ICovCi0jdW5kZWYgQ0hBUl9JU19VTlNJR05FRAotI2RlZmluZSBIQVZFX1NURERFRl9ICi0jZGVmaW5lIEhBVkVfU1RETElCX0gKLSN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCi0jdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAotI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCi0jdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI2RlZmluZSBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgkvKiBzdXBwcmVzcyB1bmRlZmluZWQtc3RydWN0dXJlIHdhcm5pbmdzICovCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMUwotCi0jdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLQotI2RlZmluZSBBTElHTl9UWVBFICBsb25nCS8qIGFwcGFyZW50bHkgZG91YmxlIGlzIGEgd2VpcmQgc2l6ZT8gKi8KLQotI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCi0KLSNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCi0KLSNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCi0KLSNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUJLyogb3B0aW9uYWwgLS0gdW5kZWYgaWYgeW91IGxpa2UgVW5peCBzdHlsZSAqLwotLyogTm90ZTogaWYgeW91IHVuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FLCB5b3UgbWF5IG5lZWQgdG8gZGVmaW5lCi0gKiBVU0VfU0VUTU9ERS4gIFNvbWUgQXRhcmkgY29tcGlsZXJzIHJlcXVpcmUgaXQsIHNvbWUgZG8gbm90LgotICovCi0jZGVmaW5lIE5FRURfU0lHTkFMX0NBVENIRVIJLyogbmVlZGVkIGlmIHlvdSB1c2Ugam1lbW5hbWUuYyAqLwotI3VuZGVmIERPTlRfVVNFX0JfTU9ERQotI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KLQotI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL3VudXNlZC9qY29uZmlnLnZtcyBiL3VudXNlZC9qY29uZmlnLnZtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhNmZmYi4uMDAwMDAwMAotLS0gYS91bnVzZWQvamNvbmZpZy52bXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiBqY29uZmlnLnZtcyAtLS0gamNvbmZpZy5oIGZvciB1c2Ugb24gRGlnaXRhbCBWTVMuICovCi0vKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLwotCi0jZGVmaW5lIEhBVkVfUFJPVE9UWVBFUwotI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAotLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KLS8qICNkZWZpbmUgY29uc3QgKi8KLSN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECi0jZGVmaW5lIEhBVkVfU1REREVGX0gKLSNkZWZpbmUgSEFWRV9TVERMSUJfSAotI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKLSN1bmRlZiBORUVEX1NZU19UWVBFU19ICi0jdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKLSN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLQotI2lmZGVmIEpQRUdfSU5URVJOQUxTCi0KLSN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotCi0jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KLQotI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKLQotI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLQotI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORQkvKiBOZWVkZWQgb24gVk1TICovCi0jdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgotI3VuZGVmIERPTlRfVVNFX0JfTU9ERQotI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KLQotI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL3VudXNlZC9qY29uZmlnLndhdCBiL3VudXNlZC9qY29uZmlnLndhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjNTQ1Yi4uMDAwMDAwMAotLS0gYS91bnVzZWQvamNvbmZpZy53YXQKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBqY29uZmlnLndhdCAtLS0gamNvbmZpZy5oIGZvciBXYXRjb20gQy9DKysgb24gTVMtRE9TIG9yIE9TLzIuICovCi0vKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLwotCi0jZGVmaW5lIEhBVkVfUFJPVE9UWVBFUwotI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAotLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KLS8qICNkZWZpbmUgY29uc3QgKi8KLSNkZWZpbmUgQ0hBUl9JU19VTlNJR05FRAotI2RlZmluZSBIQVZFX1NURERFRl9ICi0jZGVmaW5lIEhBVkVfU1RETElCX0gKLSN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCi0jdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAotI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCS8qIFdhdGNvbSB1c2VzIGZsYXQgMzItYml0IGFkZHJlc3NpbmcgKi8KLSN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLQotI2lmZGVmIEpQRUdfSU5URVJOQUxTCi0KLSN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotCi0jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KLQotI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKLQotI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLQotI3VuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCS8qIG9wdGlvbmFsICovCi0jZGVmaW5lIFVTRV9TRVRNT0RFCQkvKiBOZWVkZWQgdG8gbWFrZSBvbmUtZmlsZSBzdHlsZSB3b3JrIGluIFdhdGNvbSAqLwotI3VuZGVmIE5FRURfU0lHTkFMX0NBVENIRVIJLyogRGVmaW5lIHRoaXMgaWYgeW91IHVzZSBqbWVtbmFtZS5jICovCi0jdW5kZWYgRE9OVF9VU0VfQl9NT0RFCi0jdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLwotCi0jZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvdW51c2VkL2ptZW1kb3MuYyBiL3VudXNlZC9qbWVtZG9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYjQ1YzYuLjAwMDAwMDAKLS0tIGEvdW51c2VkL2ptZW1kb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDYzOCArMCwwIEBACi0vKgotICogam1lbWRvcy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgcHJvdmlkZXMgYW4gTVMtRE9TLWNvbXBhdGlibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN5c3RlbS0KLSAqIGRlcGVuZGVudCBwb3J0aW9uIG9mIHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyLiAgVGVtcG9yYXJ5IGRhdGEgY2FuIGJlCi0gKiBzdG9yZWQgaW4gZXh0ZW5kZWQgb3IgZXhwYW5kZWQgbWVtb3J5IGFzIHdlbGwgYXMgaW4gcmVndWxhciBET1MgZmlsZXMuCi0gKgotICogSWYgeW91IHVzZSB0aGlzIGZpbGUsIHlvdSBtdXN0IGJlIHN1cmUgdGhhdCBORUVEX0ZBUl9QT0lOVEVSUyBpcyBkZWZpbmVkCi0gKiBpZiB5b3UgY29tcGlsZSBpbiBhIHNtYWxsLWRhdGEgbWVtb3J5IG1vZGVsOyBpdCBzaG91bGQgTk9UIGJlIGRlZmluZWQgaWYKLSAqIHlvdSB1c2UgYSBsYXJnZS1kYXRhIG1lbW9yeSBtb2RlbC4gIFRoaXMgZmlsZSBpcyBub3QgcmVjb21tZW5kZWQgaWYgeW91Ci0gKiBhcmUgdXNpbmcgYSBmbGF0LW1lbW9yeS1zcGFjZSAzODYgZW52aXJvbm1lbnQgc3VjaCBhcyBESkdDQyBvciBXYXRjb20gQy4KLSAqIEFsc28sIHRoaXMgY29kZSB3aWxsIE5PVCB3b3JrIGlmIHN0cnVjdCBmaWVsZHMgYXJlIGFsaWduZWQgb24gZ3JlYXRlciB0aGFuCi0gKiAyLWJ5dGUgYm91bmRhcmllcy4KLSAqCi0gKiBCYXNlZCBvbiBjb2RlIGNvbnRyaWJ1dGVkIGJ5IEdlJyBXZWlqZXJzLgotICovCi0KLS8qCi0gKiBJZiB5b3UgaGF2ZSBib3RoIGV4dGVuZGVkIGFuZCBleHBhbmRlZCBtZW1vcnksIHlvdSBtYXkgd2FudCB0byBjaGFuZ2UgdGhlCi0gKiBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSB0cmllZCBpbiBqb3Blbl9iYWNraW5nX3N0b3JlLiAgT24gYSAyODYgbWFjaGluZQotICogZXhwYW5kZWQgbWVtb3J5IGlzIHVzdWFsbHkgZmFzdGVyLCBzaW5jZSBleHRlbmRlZCBtZW1vcnkgYWNjZXNzIGludm9sdmVzCi0gKiBhbiBleHBlbnNpdmUgcHJvdGVjdGVkLW1vZGUtYW5kLWJhY2sgc3dpdGNoLiAgT24gMzg2IGFuZCBiZXR0ZXIsIGV4dGVuZGVkCi0gKiBtZW1vcnkgaXMgdXN1YWxseSBmYXN0ZXIuICBBcyBkaXN0cmlidXRlZCwgdGhlIGNvZGUgdHJpZXMgZXh0ZW5kZWQgbWVtb3J5Ci0gKiBmaXJzdCAod2hhdD8gbm90IGV2ZXJ5b25lIGhhcyBhIDM4Nj8gOi0pLgotICoKLSAqIFlvdSBjYW4gZGlzYWJsZSB1c2Ugb2YgZXh0ZW5kZWQvZXhwYW5kZWQgbWVtb3J5IGVudGlyZWx5IGJ5IGFsdGVyaW5nIHRoZXNlCi0gKiBkZWZpbml0aW9ucyBvciBvdmVycmlkaW5nIHRoZW0gZnJvbSB0aGUgTWFrZWZpbGUgKGVnLCAtREVNU19TVVBQT1JURUQ9MCkuCi0gKi8KLQotI2lmbmRlZiBYTVNfU1VQUE9SVEVECi0jZGVmaW5lIFhNU19TVVBQT1JURUQgIDEKLSNlbmRpZgotI2lmbmRlZiBFTVNfU1VQUE9SVEVECi0jZGVmaW5lIEVNU19TVVBQT1JURUQgIDEKLSNlbmRpZgotCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqbWVtc3lzLmgiCQkvKiBpbXBvcnQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zICovCi0KLSNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSB0aGVzZSAqLwotZXh0ZXJuIHZvaWQgKiBtYWxsb2MgSlBQKChzaXplX3Qgc2l6ZSkpOwotZXh0ZXJuIHZvaWQgZnJlZSBKUFAoKHZvaWQgKnB0cikpOwotZXh0ZXJuIGNoYXIgKiBnZXRlbnYgSlBQKChjb25zdCBjaGFyICogbmFtZSkpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0ZBUl9QT0lOVEVSUwotCi0jaWZkZWYgX19UVVJCT0NfXwotLyogVGhlc2UgZGVmaW5pdGlvbnMgd29yayBmb3IgQm9ybGFuZCBDIChUdXJibyBDKSAqLwotI2luY2x1ZGUgPGFsbG9jLmg+CQkvKiBuZWVkIGZhcm1hbGxvYygpLCBmYXJmcmVlKCkgKi8KLSNkZWZpbmUgZmFyX21hbGxvYyh4KQlmYXJtYWxsb2MoeCkKLSNkZWZpbmUgZmFyX2ZyZWUoeCkJZmFyZnJlZSh4KQotI2Vsc2UKLS8qIFRoZXNlIGRlZmluaXRpb25zIHdvcmsgZm9yIE1pY3Jvc29mdCBDIGFuZCBjb21wYXRpYmxlIGNvbXBpbGVycyAqLwotI2luY2x1ZGUgPG1hbGxvYy5oPgkJLyogbmVlZCBfZm1hbGxvYygpLCBfZmZyZWUoKSAqLwotI2RlZmluZSBmYXJfbWFsbG9jKHgpCV9mbWFsbG9jKHgpCi0jZGVmaW5lIGZhcl9mcmVlKHgpCV9mZnJlZSh4KQotI2VuZGlmCi0KLSNlbHNlIC8qIG5vdCBORUVEX0ZBUl9QT0lOVEVSUyAqLwotCi0jZGVmaW5lIGZhcl9tYWxsb2MoeCkJbWFsbG9jKHgpCi0jZGVmaW5lIGZhcl9mcmVlKHgpCWZyZWUoeCkKLQotI2VuZGlmIC8qIE5FRURfRkFSX1BPSU5URVJTICovCi0KLSNpZmRlZiBET05UX1VTRV9CX01PREUJCS8qIGRlZmluZSBtb2RlIHBhcmFtZXRlcnMgZm9yIGZvcGVuKCkgKi8KLSNkZWZpbmUgUkVBRF9CSU5BUlkJInIiCi0jZWxzZQotI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiCi0jZW5kaWYKLQotI2lmbmRlZiBVU0VfTVNET1NfTUVNTUdSCS8qIG1ha2Ugc3VyZSB1c2VyIGdvdCBjb25maWd1cmF0aW9uIHJpZ2h0ICovCi0gIFlvdSBmb3Jnb3QgdG8gZGVmaW5lIFVTRV9NU0RPU19NRU1NR1IgaW4gamNvbmZpZy5oLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnJvciAqLwotI2VuZGlmCi0KLSNpZiBNQVhfQUxMT0NfQ0hVTksgPj0gNjU1MzVMCS8qIG1ha2Ugc3VyZSBqY29uZmlnLmggZ290IHRoaXMgcmlnaHQgKi8KLSAgTUFYX0FMTE9DX0NIVU5LIHNob3VsZCBiZSBsZXNzIHRoYW4gNjRLLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnJvciAqLwotI2VuZGlmCi0KLQotLyoKLSAqIERlY2xhcmF0aW9ucyBmb3IgYXNzZW1ibHktbGFuZ3VhZ2Ugc3VwcG9ydCByb3V0aW5lcyAoc2VlIGptZW1kb3NhLmFzbSkuCi0gKgotICogVGhlIGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgImZhciIgYXMgYXJlIGFsbCB0aGVpciBwb2ludGVyIGFyZ3VtZW50czsKLSAqIHRoaXMgZW5zdXJlcyB0aGUgYXNzZW1ibHkgc291cmNlIGNvZGUgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhlCi0gKiBjb21waWxlciBtZW1vcnkgbW9kZWwuICBXZSBhc3N1bWUgInNob3J0IiBpcyAxNiBiaXRzLCAibG9uZyIgaXMgMzIuCi0gKi8KLQotdHlwZWRlZiB2b2lkIGZhciAqIFhNU0RSSVZFUjsJLyogYWN0dWFsbHkgYSBwb2ludGVyIHRvIGNvZGUgKi8KLXR5cGVkZWYgc3RydWN0IHsJCS8qIHJlZ2lzdGVycyBmb3IgY2FsbGluZyBYTVMgZHJpdmVyICovCi0JdW5zaWduZWQgc2hvcnQgYXgsIGR4LCBieDsKLQl2b2lkIGZhciAqIGRzX3NpOwotICAgICAgfSBYTVNjb250ZXh0OwotdHlwZWRlZiBzdHJ1Y3QgewkJLyogcmVnaXN0ZXJzIGZvciBjYWxsaW5nIEVNUyBkcml2ZXIgKi8KLQl1bnNpZ25lZCBzaG9ydCBheCwgZHgsIGJ4OwotCXZvaWQgZmFyICogZHNfc2k7Ci0gICAgICB9IEVNU2NvbnRleHQ7Ci0KLWV4dGVybiBzaG9ydCBmYXIgamRvc19vcGVuIEpQUCgoc2hvcnQgZmFyICogaGFuZGxlLCBjaGFyIGZhciAqIGZpbGVuYW1lKSk7Ci1leHRlcm4gc2hvcnQgZmFyIGpkb3NfY2xvc2UgSlBQKChzaG9ydCBoYW5kbGUpKTsKLWV4dGVybiBzaG9ydCBmYXIgamRvc19zZWVrIEpQUCgoc2hvcnQgaGFuZGxlLCBsb25nIG9mZnNldCkpOwotZXh0ZXJuIHNob3J0IGZhciBqZG9zX3JlYWQgSlBQKChzaG9ydCBoYW5kbGUsIHZvaWQgZmFyICogYnVmZmVyLAotCQkJCXVuc2lnbmVkIHNob3J0IGNvdW50KSk7Ci1leHRlcm4gc2hvcnQgZmFyIGpkb3Nfd3JpdGUgSlBQKChzaG9ydCBoYW5kbGUsIHZvaWQgZmFyICogYnVmZmVyLAotCQkJCSB1bnNpZ25lZCBzaG9ydCBjb3VudCkpOwotZXh0ZXJuIHZvaWQgZmFyIGp4bXNfZ2V0ZHJpdmVyIEpQUCgoWE1TRFJJVkVSIGZhciAqKSk7Ci1leHRlcm4gdm9pZCBmYXIganhtc19jYWxsZHJpdmVyIEpQUCgoWE1TRFJJVkVSLCBYTVNjb250ZXh0IGZhciAqKSk7Ci1leHRlcm4gc2hvcnQgZmFyIGplbXNfYXZhaWxhYmxlIEpQUCgodm9pZCkpOwotZXh0ZXJuIHZvaWQgZmFyIGplbXNfY2FsbGRyaXZlciBKUFAoKEVNU2NvbnRleHQgZmFyICopKTsKLQotCi0vKgotICogU2VsZWN0aW9uIG9mIGEgZmlsZSBuYW1lIGZvciBhIHRlbXBvcmFyeSBmaWxlLgotICogVGhpcyBpcyBoaWdobHkgc3lzdGVtLWRlcGVuZGVudCwgYW5kIHlvdSBtYXkgd2FudCB0byBjdXN0b21pemUgaXQuCi0gKi8KLQotc3RhdGljIGludCBuZXh0X2ZpbGVfbnVtOwkvKiB0byBkaXN0aW5ndWlzaCBhbW9uZyBzZXZlcmFsIHRlbXAgZmlsZXMgKi8KLQotTE9DQUwodm9pZCkKLXNlbGVjdF9maWxlX25hbWUgKGNoYXIgKiBmbmFtZSkKLXsKLSAgY29uc3QgY2hhciAqIGVudjsKLSAgY2hhciAqIHB0cjsKLSAgRklMRSAqIHRmaWxlOwotCi0gIC8qIEtlZXAgZ2VuZXJhdGluZyBmaWxlIG5hbWVzIHRpbGwgd2UgZmluZCBvbmUgdGhhdCdzIG5vdCBpbiB1c2UgKi8KLSAgZm9yICg7OykgewotICAgIC8qIEdldCB0ZW1wIGRpcmVjdG9yeSBuYW1lIGZyb20gZW52aXJvbm1lbnQgVE1QIG9yIFRFTVAgdmFyaWFibGU7Ci0gICAgICogaWYgbm9uZSwgdXNlICIuIgotICAgICAqLwotICAgIGlmICgoZW52ID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52KCJUTVAiKSkgPT0gTlVMTCkKLSAgICAgIGlmICgoZW52ID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52KCJURU1QIikpID09IE5VTEwpCi0JZW52ID0gIi4iOwotICAgIGlmICgqZW52ID09ICdcMCcpCQkvKiBudWxsIHN0cmluZyBtZWFucyAiLiIgKi8KLSAgICAgIGVudiA9ICIuIjsKLSAgICBwdHIgPSBmbmFtZTsJCS8qIGNvcHkgbmFtZSB0byBmbmFtZSAqLwotICAgIHdoaWxlICgqZW52ICE9ICdcMCcpCi0gICAgICAqcHRyKysgPSAqZW52Kys7Ci0gICAgaWYgKHB0clstMV0gIT0gJ1xcJyAmJiBwdHJbLTFdICE9ICcvJykKLSAgICAgICpwdHIrKyA9ICdcXCc7CQkvKiBhcHBlbmQgYmFja3NsYXNoIGlmIG5vdCBpbiBlbnYgdmFyaWFibGUgKi8KLSAgICAvKiBBcHBlbmQgYSBzdWl0YWJsZSBmaWxlIG5hbWUgKi8KLSAgICBuZXh0X2ZpbGVfbnVtKys7CQkvKiBhZHZhbmNlIGNvdW50ZXIgKi8KLSAgICBzcHJpbnRmKHB0ciwgIkpQRyUwM2QuVE1QIiwgbmV4dF9maWxlX251bSk7Ci0gICAgLyogUHJvYmUgdG8gc2VlIGlmIGZpbGUgbmFtZSBpcyBhbHJlYWR5IGluIHVzZSAqLwotICAgIGlmICgodGZpbGUgPSBmb3BlbihmbmFtZSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKQotICAgICAgYnJlYWs7Ci0gICAgZmNsb3NlKHRmaWxlKTsJCS8qIG9vcHMsIGl0J3MgdGhlcmU7IGNsb3NlIHRmaWxlICYgdHJ5IGFnYWluICovCi0gIH0KLX0KLQotCi0vKgotICogTmVhci1tZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBhcmUgY29udHJvbGxlZCBieSB0aGUgcmVndWxhciBsaWJyYXJ5Ci0gKiByb3V0aW5lcyBtYWxsb2MoKSBhbmQgZnJlZSgpLgotICovCi0KLUdMT0JBTCh2b2lkICopCi1qcGVnX2dldF9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICByZXR1cm4gKHZvaWQgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19mcmVlX3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIGZyZWUob2JqZWN0KTsKLX0KLQotCi0vKgotICogIkxhcmdlIiBvYmplY3RzIGFyZSBhbGxvY2F0ZWQgaW4gZmFyIG1lbW9yeSwgaWYgcG9zc2libGUKLSAqLwotCi1HTE9CQUwodm9pZCBGQVIgKikKLWpwZWdfZ2V0X2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIHJldHVybiAodm9pZCBGQVIgKikgZmFyX21hbGxvYyhzaXplb2ZvYmplY3QpOwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfZnJlZV9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgZmFyX2ZyZWUob2JqZWN0KTsKLX0KLQotCi0vKgotICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBtZW1vcnkgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgotICogSXQncyBpbXBvc3NpYmxlIHRvIGRvIHRoaXMgaW4gYSBwb3J0YWJsZSB3YXk7IG91ciBjdXJyZW50IHNvbHV0aW9uIGlzCi0gKiB0byBtYWtlIHRoZSB1c2VyIHRlbGwgdXMgKHdpdGggYSBkZWZhdWx0IHZhbHVlIHNldCBhdCBjb21waWxlIHRpbWUpLgotICogSWYgeW91IGNhbiBhY3R1YWxseSBnZXQgdGhlIGF2YWlsYWJsZSBzcGFjZSwgaXQncyBhIGdvb2QgaWRlYSB0byBzdWJ0cmFjdAotICogYSBzbG9wIGZhY3RvciBvZiA1JSBvciBzby4KLSAqLwotCi0jaWZuZGVmIERFRkFVTFRfTUFYX01FTQkJLyogc28gY2FuIG92ZXJyaWRlIGZyb20gbWFrZWZpbGUgKi8KLSNkZWZpbmUgREVGQVVMVF9NQVhfTUVNCQkzMDAwMDBMIC8qIGZvciB0b3RhbCB1c2FnZSBhYm91dCA0NTBLICovCi0jZW5kaWYKLQotR0xPQkFMKGxvbmcpCi1qcGVnX21lbV9hdmFpbGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbywgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAotCQkgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLCBsb25nIGFscmVhZHlfYWxsb2NhdGVkKQotewotICByZXR1cm4gY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UgLSBhbHJlYWR5X2FsbG9jYXRlZDsKLX0KLQotCi0vKgotICogQmFja2luZyBzdG9yZSAodGVtcG9yYXJ5IGZpbGUpIG1hbmFnZW1lbnQuCi0gKiBCYWNraW5nIHN0b3JlIG9iamVjdHMgYXJlIG9ubHkgdXNlZCB3aGVuIHRoZSB2YWx1ZSByZXR1cm5lZCBieQotICoganBlZ19tZW1fYXZhaWxhYmxlIGlzIGxlc3MgdGhhbiB0aGUgdG90YWwgc3BhY2UgbmVlZGVkLiAgWW91IGNhbiBkaXNwZW5zZQotICogd2l0aCB0aGVzZSByb3V0aW5lcyBpZiB5b3UgaGF2ZSBwbGVudHkgb2YgdmlydHVhbCBtZW1vcnk7IHNlZSBqbWVtbm9icy5jLgotICovCi0KLS8qCi0gKiBGb3IgTVMtRE9TIHdlIHN1cHBvcnQgdGhyZWUgdHlwZXMgb2YgYmFja2luZyBzdG9yYWdlOgotICogICAxLiBDb252ZW50aW9uYWwgRE9TIGZpbGVzLiAgV2UgYWNjZXNzIHRoZXNlIGJ5IGRpcmVjdCBET1MgY2FsbHMgcmF0aGVyCi0gKiAgICAgIHRoYW4gdmlhIHRoZSBzdGRpbyBwYWNrYWdlLiAgVGhpcyBwcm92aWRlcyBhIGJpdCBiZXR0ZXIgcGVyZm9ybWFuY2UsCi0gKiAgICAgIGJ1dCB0aGUgcmVhbCByZWFzb24gaXMgdGhhdCB0aGUgYnVmZmVycyB0byBiZSByZWFkIG9yIHdyaXR0ZW4gYXJlIEZBUi4KLSAqICAgICAgVGhlIHN0ZGlvIGxpYnJhcnkgZm9yIHNtYWxsLWRhdGEgbWVtb3J5IG1vZGVscyBjYW4ndCBjb3BlIHdpdGggdGhhdC4KLSAqICAgMi4gRXh0ZW5kZWQgbWVtb3J5LCBhY2Nlc3NlZCBwZXIgdGhlIFhNUyBWMi4wIHNwZWNpZmljYXRpb24uCi0gKiAgIDMuIEV4cGFuZGVkIG1lbW9yeSwgYWNjZXNzZWQgcGVyIHRoZSBMSU0vRU1TIDQuMCBzcGVjaWZpY2F0aW9uLgotICogWW91J2xsIG5lZWQgY29waWVzIG9mIHRob3NlIHNwZWNzIHRvIG1ha2Ugc2Vuc2Ugb2YgdGhlIHJlbGF0ZWQgY29kZS4KLSAqIFRoZSBzcGVjcyBhcmUgYXZhaWxhYmxlIGJ5IEludGVybmV0IEZUUCBmcm9tIHRoZSBTSU1URUwgYXJjaGl2ZXMgCi0gKiAob2FrLm9ha2xhbmQuZWR1IGFuZCBpdHMgdmFyaW91cyBtaXJyb3Igc2l0ZXMpLiAgU2VlIGZpbGVzCi0gKiBwdWIvbXNkb3MvbWljcm9zb2Z0L3htczIwLmFyYyBhbmQgcHViL21zZG9zL2luZm8vbGltZW1zNDEuemlwLgotICovCi0KLQotLyoKLSAqIEFjY2VzcyBtZXRob2RzIGZvciBhIERPUyBmaWxlLgotICovCi0KLQotTUVUSE9EREVGKHZvaWQpCi1yZWFkX2ZpbGVfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCi0JCSBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCi17Ci0gIGlmIChqZG9zX3NlZWsoaW5mby0+aGFuZGxlLmZpbGVfaGFuZGxlLCBmaWxlX29mZnNldCkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKLSAgLyogU2luY2UgTUFYX0FMTE9DX0NIVU5LIGlzIGxlc3MgdGhhbiA2NEssIGJ5dGVfY291bnQgd2lsbCBiZSB0b28uICovCi0gIGlmIChieXRlX2NvdW50ID4gNjU1MzVMKQkvKiBzYWZldHkgY2hlY2sgKi8KLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9BTExPQ19DSFVOSyk7Ci0gIGlmIChqZG9zX3JlYWQoaW5mby0+aGFuZGxlLmZpbGVfaGFuZGxlLCBidWZmZXJfYWRkcmVzcywKLQkJKHVuc2lnbmVkIHNob3J0KSBieXRlX2NvdW50KSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1JFQUQpOwotfQotCi0KLU1FVEhPRERFRih2b2lkKQotd3JpdGVfZmlsZV9zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCi0JCSAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQotewotICBpZiAoamRvc19zZWVrKGluZm8tPmhhbmRsZS5maWxlX2hhbmRsZSwgZmlsZV9vZmZzZXQpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfU0VFSyk7Ci0gIC8qIFNpbmNlIE1BWF9BTExPQ19DSFVOSyBpcyBsZXNzIHRoYW4gNjRLLCBieXRlX2NvdW50IHdpbGwgYmUgdG9vLiAqLwotICBpZiAoYnl0ZV9jb3VudCA+IDY1NTM1TCkJLyogc2FmZXR5IGNoZWNrICovCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQUxMT0NfQ0hVTkspOwotICBpZiAoamRvc193cml0ZShpbmZvLT5oYW5kbGUuZmlsZV9oYW5kbGUsIGJ1ZmZlcl9hZGRyZXNzLAotCQkgKHVuc2lnbmVkIHNob3J0KSBieXRlX2NvdW50KSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1dSSVRFKTsKLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLWNsb3NlX2ZpbGVfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKLXsKLSAgamRvc19jbG9zZShpbmZvLT5oYW5kbGUuZmlsZV9oYW5kbGUpOwkvKiBjbG9zZSB0aGUgZmlsZSAqLwotICByZW1vdmUoaW5mby0+dGVtcF9uYW1lKTsJLyogZGVsZXRlIHRoZSBmaWxlICovCi0vKiBJZiB5b3VyIHN5c3RlbSBkb2Vzbid0IGhhdmUgcmVtb3ZlKCksIHRyeSB1bmxpbmsoKSBpbnN0ZWFkLgotICogcmVtb3ZlKCkgaXMgdGhlIEFOU0ktc3RhbmRhcmQgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbiwgYnV0Ci0gKiB1bmxpbmsoKSB3YXMgbW9yZSBjb21tb24gaW4gcHJlLUFOU0kgc3lzdGVtcy4KLSAqLwotICBUUkFDRU1TUyhjaW5mbywgMSwgSlRSQ19URklMRV9DTE9TRSwgaW5mby0+dGVtcF9uYW1lKTsKLX0KLQotCi1MT0NBTChib29sZWFuKQotb3Blbl9maWxlX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCSBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKLXsKLSAgc2hvcnQgaGFuZGxlOwotCi0gIHNlbGVjdF9maWxlX25hbWUoaW5mby0+dGVtcF9uYW1lKTsKLSAgaWYgKGpkb3Nfb3Blbigoc2hvcnQgZmFyICopICYgaGFuZGxlLCAoY2hhciBmYXIgKikgaW5mby0+dGVtcF9uYW1lKSkgewotICAgIC8qIG1pZ2h0IGFzIHdlbGwgZXhpdCBzaW5jZSBqcGVnX29wZW5fYmFja2luZ19zdG9yZSB3aWxsIGZhaWwgYW55d2F5ICovCi0gICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCBpbmZvLT50ZW1wX25hbWUpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotICBpbmZvLT5oYW5kbGUuZmlsZV9oYW5kbGUgPSBoYW5kbGU7Ci0gIGluZm8tPnJlYWRfYmFja2luZ19zdG9yZSA9IHJlYWRfZmlsZV9zdG9yZTsKLSAgaW5mby0+d3JpdGVfYmFja2luZ19zdG9yZSA9IHdyaXRlX2ZpbGVfc3RvcmU7Ci0gIGluZm8tPmNsb3NlX2JhY2tpbmdfc3RvcmUgPSBjbG9zZV9maWxlX3N0b3JlOwotICBUUkFDRU1TUyhjaW5mbywgMSwgSlRSQ19URklMRV9PUEVOLCBpbmZvLT50ZW1wX25hbWUpOwotICByZXR1cm4gVFJVRTsJCQkvKiBzdWNjZWVkZWQgKi8KLX0KLQotCi0vKgotICogQWNjZXNzIG1ldGhvZHMgZm9yIGV4dGVuZGVkIG1lbW9yeS4KLSAqLwotCi0jaWYgWE1TX1NVUFBPUlRFRAotCi1zdGF0aWMgWE1TRFJJVkVSIHhtc19kcml2ZXI7CS8qIHNhdmVkIGFkZHJlc3Mgb2YgWE1TIGRyaXZlciAqLwotCi10eXBlZGVmIHVuaW9uIHsJCQkvKiBlaXRoZXIgbG9uZyBvZmZzZXQgb3IgcmVhbC1tb2RlIHBvaW50ZXIgKi8KLQlsb25nIG9mZnNldDsKLQl2b2lkIGZhciAqIHB0cjsKLSAgICAgIH0gWE1TUFRSOwotCi10eXBlZGVmIHN0cnVjdCB7CQkvKiBYTVMgbW92ZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqLwotCWxvbmcgbGVuZ3RoOwotCVhNU0ggc3JjX2hhbmRsZTsKLQlYTVNQVFIgc3JjOwotCVhNU0ggZHN0X2hhbmRsZTsKLQlYTVNQVFIgZHN0OwotICAgICAgfSBYTVNzcGVjOwotCi0jZGVmaW5lIE9ERChYKQkoKChYKSAmIDFMKSAhPSAwKQotCi0KLU1FVEhPRERFRih2b2lkKQotcmVhZF94bXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQotewotICBYTVNjb250ZXh0IGN0eDsKLSAgWE1Tc3BlYyBzcGVjOwotICBjaGFyIGVuZGJ1ZmZlclsyXTsKLQotICAvKiBUaGUgWE1TIGRyaXZlciBjYW4ndCBjb3BlIHdpdGggYW4gb2RkIGxlbmd0aCwgc28gaGFuZGxlIHRoZSBsYXN0IGJ5dGUKLSAgICogc3BlY2lhbGx5IGlmIGJ5dGVfY291bnQgaXMgb2RkLiAgV2UgZG9uJ3QgZXhwZWN0IHRoaXMgdG8gYmUgY29tbW9uLgotICAgKi8KLQotICBzcGVjLmxlbmd0aCA9IGJ5dGVfY291bnQgJiAofiAxTCk7Ci0gIHNwZWMuc3JjX2hhbmRsZSA9IGluZm8tPmhhbmRsZS54bXNfaGFuZGxlOwotICBzcGVjLnNyYy5vZmZzZXQgPSBmaWxlX29mZnNldDsKLSAgc3BlYy5kc3RfaGFuZGxlID0gMDsKLSAgc3BlYy5kc3QucHRyID0gYnVmZmVyX2FkZHJlc3M7Ci0gIAotICBjdHguZHNfc2kgPSAodm9pZCBmYXIgKikgJiBzcGVjOwotICBjdHguYXggPSAweDBiMDA7CQkvKiBFTUIgbW92ZSAqLwotICBqeG1zX2NhbGxkcml2ZXIoeG1zX2RyaXZlciwgKFhNU2NvbnRleHQgZmFyICopICYgY3R4KTsKLSAgaWYgKGN0eC5heCAhPSAxKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfWE1TX1JFQUQpOwotCi0gIGlmIChPREQoYnl0ZV9jb3VudCkpIHsKLSAgICByZWFkX3htc19zdG9yZShjaW5mbywgaW5mbywgKHZvaWQgRkFSICopIGVuZGJ1ZmZlciwKLQkJICAgZmlsZV9vZmZzZXQgKyBieXRlX2NvdW50IC0gMUwsIDJMKTsKLSAgICAoKGNoYXIgRkFSICopIGJ1ZmZlcl9hZGRyZXNzKVtieXRlX2NvdW50IC0gMUxdID0gZW5kYnVmZmVyWzBdOwotICB9Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV94bXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCi0JCSBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCi17Ci0gIFhNU2NvbnRleHQgY3R4OwotICBYTVNzcGVjIHNwZWM7Ci0gIGNoYXIgZW5kYnVmZmVyWzJdOwotCi0gIC8qIFRoZSBYTVMgZHJpdmVyIGNhbid0IGNvcGUgd2l0aCBhbiBvZGQgbGVuZ3RoLCBzbyBoYW5kbGUgdGhlIGxhc3QgYnl0ZQotICAgKiBzcGVjaWFsbHkgaWYgYnl0ZV9jb3VudCBpcyBvZGQuICBXZSBkb24ndCBleHBlY3QgdGhpcyB0byBiZSBjb21tb24uCi0gICAqLwotCi0gIHNwZWMubGVuZ3RoID0gYnl0ZV9jb3VudCAmICh+IDFMKTsKLSAgc3BlYy5zcmNfaGFuZGxlID0gMDsKLSAgc3BlYy5zcmMucHRyID0gYnVmZmVyX2FkZHJlc3M7Ci0gIHNwZWMuZHN0X2hhbmRsZSA9IGluZm8tPmhhbmRsZS54bXNfaGFuZGxlOwotICBzcGVjLmRzdC5vZmZzZXQgPSBmaWxlX29mZnNldDsKLQotICBjdHguZHNfc2kgPSAodm9pZCBmYXIgKikgJiBzcGVjOwotICBjdHguYXggPSAweDBiMDA7CQkvKiBFTUIgbW92ZSAqLwotICBqeG1zX2NhbGxkcml2ZXIoeG1zX2RyaXZlciwgKFhNU2NvbnRleHQgZmFyICopICYgY3R4KTsKLSAgaWYgKGN0eC5heCAhPSAxKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfWE1TX1dSSVRFKTsKLQotICBpZiAoT0REKGJ5dGVfY291bnQpKSB7Ci0gICAgcmVhZF94bXNfc3RvcmUoY2luZm8sIGluZm8sICh2b2lkIEZBUiAqKSBlbmRidWZmZXIsCi0JCSAgIGZpbGVfb2Zmc2V0ICsgYnl0ZV9jb3VudCAtIDFMLCAyTCk7Ci0gICAgZW5kYnVmZmVyWzBdID0gKChjaGFyIEZBUiAqKSBidWZmZXJfYWRkcmVzcylbYnl0ZV9jb3VudCAtIDFMXTsKLSAgICB3cml0ZV94bXNfc3RvcmUoY2luZm8sIGluZm8sICh2b2lkIEZBUiAqKSBlbmRidWZmZXIsCi0JCSAgICBmaWxlX29mZnNldCArIGJ5dGVfY291bnQgLSAxTCwgMkwpOwotICB9Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi1jbG9zZV94bXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKLXsKLSAgWE1TY29udGV4dCBjdHg7Ci0KLSAgY3R4LmR4ID0gaW5mby0+aGFuZGxlLnhtc19oYW5kbGU7Ci0gIGN0eC5heCA9IDB4MGEwMDsKLSAganhtc19jYWxsZHJpdmVyKHhtc19kcml2ZXIsIChYTVNjb250ZXh0IGZhciAqKSAmIGN0eCk7Ci0gIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1hNU19DTE9TRSwgaW5mby0+aGFuZGxlLnhtc19oYW5kbGUpOwotICAvKiB3ZSBpZ25vcmUgYW55IGVycm9yIHJldHVybiBmcm9tIHRoZSBkcml2ZXIgKi8KLX0KLQotCi1MT0NBTChib29sZWFuKQotb3Blbl94bXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCi17Ci0gIFhNU2NvbnRleHQgY3R4OwotCi0gIC8qIEdldCBhZGRyZXNzIG9mIFhNUyBkcml2ZXIgKi8KLSAganhtc19nZXRkcml2ZXIoKFhNU0RSSVZFUiBmYXIgKikgJiB4bXNfZHJpdmVyKTsKLSAgaWYgKHhtc19kcml2ZXIgPT0gTlVMTCkKLSAgICByZXR1cm4gRkFMU0U7CQkvKiBubyBkcml2ZXIgdG8gYmUgaGFkICovCi0KLSAgLyogR2V0IHZlcnNpb24gbnVtYmVyLCBtdXN0IGJlID49IDIuMDAgKi8KLSAgY3R4LmF4ID0gMHgwMDAwOwotICBqeG1zX2NhbGxkcml2ZXIoeG1zX2RyaXZlciwgKFhNU2NvbnRleHQgZmFyICopICYgY3R4KTsKLSAgaWYgKGN0eC5heCA8ICh1bnNpZ25lZCBzaG9ydCkgMHgwMjAwKQotICAgIHJldHVybiBGQUxTRTsKLQotICAvKiBUcnkgdG8gZ2V0IHNwYWNlIChleHByZXNzZWQgaW4ga2lsb2J5dGVzKSAqLwotICBjdHguZHggPSAodW5zaWduZWQgc2hvcnQpICgodG90YWxfYnl0ZXNfbmVlZGVkICsgMTAyM0wpID4+IDEwKTsKLSAgY3R4LmF4ID0gMHgwOTAwOwotICBqeG1zX2NhbGxkcml2ZXIoeG1zX2RyaXZlciwgKFhNU2NvbnRleHQgZmFyICopICYgY3R4KTsKLSAgaWYgKGN0eC5heCAhPSAxKQotICAgIHJldHVybiBGQUxTRTsKLQotICAvKiBTdWNjZWVkZWQsIHNhdmUgdGhlIGhhbmRsZSBhbmQgYXdheSB3ZSBnbyAqLwotICBpbmZvLT5oYW5kbGUueG1zX2hhbmRsZSA9IGN0eC5keDsKLSAgaW5mby0+cmVhZF9iYWNraW5nX3N0b3JlID0gcmVhZF94bXNfc3RvcmU7Ci0gIGluZm8tPndyaXRlX2JhY2tpbmdfc3RvcmUgPSB3cml0ZV94bXNfc3RvcmU7Ci0gIGluZm8tPmNsb3NlX2JhY2tpbmdfc3RvcmUgPSBjbG9zZV94bXNfc3RvcmU7Ci0gIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1hNU19PUEVOLCBjdHguZHgpOwotICByZXR1cm4gVFJVRTsJCQkvKiBzdWNjZWVkZWQgKi8KLX0KLQotI2VuZGlmIC8qIFhNU19TVVBQT1JURUQgKi8KLQotCi0vKgotICogQWNjZXNzIG1ldGhvZHMgZm9yIGV4cGFuZGVkIG1lbW9yeS4KLSAqLwotCi0jaWYgRU1TX1NVUFBPUlRFRAotCi0vKiBUaGUgRU1TIG1vdmUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZXMgd29yZCBhbmQgbG9uZyBmaWVsZHMgYWxpZ25lZAotICogYXQgb2RkIGJ5dGUgYm91bmRhcmllcy4gIFNvbWUgY29tcGlsZXJzIHdpbGwgYWxpZ24gc3RydWN0IGZpZWxkcyBhdCBldmVuCi0gKiBieXRlIGJvdW5kYXJpZXMuICBXaGlsZSBpdCdzIHVzdWFsbHkgcG9zc2libGUgdG8gZm9yY2UgYnl0ZSBhbGlnbm1lbnQsCi0gKiB0aGF0IGNhdXNlcyBhbiBvdmVyYWxsIHBlcmZvcm1hbmNlIHBlbmFsdHkgYW5kIG1heSBwb3NlIHByb2JsZW1zIGluIG1lcmdpbmcKLSAqIEpQRUcgaW50byBhIGxhcmdlciBhcHBsaWNhdGlvbi4gIEluc3RlYWQgd2UgYWNjZXB0IHNvbWUgcmF0aGVyIGRpcnR5IGNvZGUKLSAqIGhlcmUuICBOb3RlIHRoaXMgY29kZSB3b3VsZCBmYWlsIGlmIHRoZSBoYXJkd2FyZSBkaWQgbm90IGFsbG93IG9kZC1ieXRlCi0gKiB3b3JkICYgbG9uZyBhY2Nlc3NlcywgYnV0IGFsbCA4MHg4NiBDUFVzIGRvLgotICovCi0KLXR5cGVkZWYgdm9pZCBmYXIgKiBFTVNQVFI7Ci0KLXR5cGVkZWYgdW5pb24gewkJCS8qIEVNUyBtb3ZlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICovCi0JbG9uZyBsZW5ndGg7CQkvKiBJdCdzIGVhc3kgdG8gYWNjZXNzIGZpcnN0IDQgYnl0ZXMgKi8KLQljaGFyIGJ5dGVzWzE4XTsJCS8qIE1pc2FsaWduZWQgZmllbGRzIGluIGhlcmUhICovCi0gICAgICB9IEVNU3NwZWM7Ci0KLS8qIE1hY3JvcyBmb3IgYWNjZXNzaW5nIG1pc2FsaWduZWQgZmllbGRzICovCi0jZGVmaW5lIEZJRUxEX0FUKHNwZWMsb2Zmc2V0LHR5cGUpICAoKigodHlwZSAqKSAmKHNwZWMuYnl0ZXNbb2Zmc2V0XSkpKQotI2RlZmluZSBTUkNfVFlQRShzcGVjKQkJRklFTERfQVQoc3BlYyw0LGNoYXIpCi0jZGVmaW5lIFNSQ19IQU5ETEUoc3BlYykJRklFTERfQVQoc3BlYyw1LEVNU0gpCi0jZGVmaW5lIFNSQ19PRkZTRVQoc3BlYykJRklFTERfQVQoc3BlYyw3LHVuc2lnbmVkIHNob3J0KQotI2RlZmluZSBTUkNfUEFHRShzcGVjKQkJRklFTERfQVQoc3BlYyw5LHVuc2lnbmVkIHNob3J0KQotI2RlZmluZSBTUkNfUFRSKHNwZWMpCQlGSUVMRF9BVChzcGVjLDcsRU1TUFRSKQotI2RlZmluZSBEU1RfVFlQRShzcGVjKQkJRklFTERfQVQoc3BlYywxMSxjaGFyKQotI2RlZmluZSBEU1RfSEFORExFKHNwZWMpCUZJRUxEX0FUKHNwZWMsMTIsRU1TSCkKLSNkZWZpbmUgRFNUX09GRlNFVChzcGVjKQlGSUVMRF9BVChzcGVjLDE0LHVuc2lnbmVkIHNob3J0KQotI2RlZmluZSBEU1RfUEFHRShzcGVjKQkJRklFTERfQVQoc3BlYywxNix1bnNpZ25lZCBzaG9ydCkKLSNkZWZpbmUgRFNUX1BUUihzcGVjKQkJRklFTERfQVQoc3BlYywxNCxFTVNQVFIpCi0KLSNkZWZpbmUgRU1TUEFHRVNJWkUJMTYzODRMCS8qIGdvc3BlbCwgc2VlIHRoZSBFTVMgc3BlY3MgKi8KLQotI2RlZmluZSBISUJZVEUoVykgICgoKFcpID4+IDgpICYgMHhGRikKLSNkZWZpbmUgTE9CWVRFKFcpICAoKFcpICYgMHhGRikKLQotCi1NRVRIT0RERUYodm9pZCkKLXJlYWRfZW1zX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCXZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCi0JCWxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKLXsKLSAgRU1TY29udGV4dCBjdHg7Ci0gIEVNU3NwZWMgc3BlYzsKLQotICBzcGVjLmxlbmd0aCA9IGJ5dGVfY291bnQ7Ci0gIFNSQ19UWVBFKHNwZWMpID0gMTsKLSAgU1JDX0hBTkRMRShzcGVjKSA9IGluZm8tPmhhbmRsZS5lbXNfaGFuZGxlOwotICBTUkNfUEFHRShzcGVjKSAgID0gKHVuc2lnbmVkIHNob3J0KSAoZmlsZV9vZmZzZXQgLyBFTVNQQUdFU0laRSk7Ci0gIFNSQ19PRkZTRVQoc3BlYykgPSAodW5zaWduZWQgc2hvcnQpIChmaWxlX29mZnNldCAlIEVNU1BBR0VTSVpFKTsKLSAgRFNUX1RZUEUoc3BlYykgPSAwOwotICBEU1RfSEFORExFKHNwZWMpID0gMDsKLSAgRFNUX1BUUihzcGVjKSAgICA9IGJ1ZmZlcl9hZGRyZXNzOwotICAKLSAgY3R4LmRzX3NpID0gKHZvaWQgZmFyICopICYgc3BlYzsKLSAgY3R4LmF4ID0gMHg1NzAwOwkJLyogbW92ZSBtZW1vcnkgcmVnaW9uICovCi0gIGplbXNfY2FsbGRyaXZlcigoRU1TY29udGV4dCBmYXIgKikgJiBjdHgpOwotICBpZiAoSElCWVRFKGN0eC5heCkgIT0gMCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0VNU19SRUFEKTsKLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLXdyaXRlX2Vtc19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKLXsKLSAgRU1TY29udGV4dCBjdHg7Ci0gIEVNU3NwZWMgc3BlYzsKLQotICBzcGVjLmxlbmd0aCA9IGJ5dGVfY291bnQ7Ci0gIFNSQ19UWVBFKHNwZWMpID0gMDsKLSAgU1JDX0hBTkRMRShzcGVjKSA9IDA7Ci0gIFNSQ19QVFIoc3BlYykgICAgPSBidWZmZXJfYWRkcmVzczsKLSAgRFNUX1RZUEUoc3BlYykgPSAxOwotICBEU1RfSEFORExFKHNwZWMpID0gaW5mby0+aGFuZGxlLmVtc19oYW5kbGU7Ci0gIERTVF9QQUdFKHNwZWMpICAgPSAodW5zaWduZWQgc2hvcnQpIChmaWxlX29mZnNldCAvIEVNU1BBR0VTSVpFKTsKLSAgRFNUX09GRlNFVChzcGVjKSA9ICh1bnNpZ25lZCBzaG9ydCkgKGZpbGVfb2Zmc2V0ICUgRU1TUEFHRVNJWkUpOwotICAKLSAgY3R4LmRzX3NpID0gKHZvaWQgZmFyICopICYgc3BlYzsKLSAgY3R4LmF4ID0gMHg1NzAwOwkJLyogbW92ZSBtZW1vcnkgcmVnaW9uICovCi0gIGplbXNfY2FsbGRyaXZlcigoRU1TY29udGV4dCBmYXIgKikgJiBjdHgpOwotICBpZiAoSElCWVRFKGN0eC5heCkgIT0gMCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0VNU19XUklURSk7Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi1jbG9zZV9lbXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKLXsKLSAgRU1TY29udGV4dCBjdHg7Ci0KLSAgY3R4LmF4ID0gMHg0NTAwOwotICBjdHguZHggPSBpbmZvLT5oYW5kbGUuZW1zX2hhbmRsZTsKLSAgamVtc19jYWxsZHJpdmVyKChFTVNjb250ZXh0IGZhciAqKSAmIGN0eCk7Ci0gIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX0VNU19DTE9TRSwgaW5mby0+aGFuZGxlLmVtc19oYW5kbGUpOwotICAvKiB3ZSBpZ25vcmUgYW55IGVycm9yIHJldHVybiBmcm9tIHRoZSBkcml2ZXIgKi8KLX0KLQotCi1MT0NBTChib29sZWFuKQotb3Blbl9lbXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCi17Ci0gIEVNU2NvbnRleHQgY3R4OwotCi0gIC8qIElzIEVNUyBkcml2ZXIgdGhlcmU/ICovCi0gIGlmICghIGplbXNfYXZhaWxhYmxlKCkpCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIEdldCBzdGF0dXMsIG1ha2Ugc3VyZSBFTVMgaXMgT0sgKi8KLSAgY3R4LmF4ID0gMHg0MDAwOwotICBqZW1zX2NhbGxkcml2ZXIoKEVNU2NvbnRleHQgZmFyICopICYgY3R4KTsKLSAgaWYgKEhJQllURShjdHguYXgpICE9IDApCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIEdldCB2ZXJzaW9uLCBtdXN0IGJlID49IDQuMCAqLwotICBjdHguYXggPSAweDQ2MDA7Ci0gIGplbXNfY2FsbGRyaXZlcigoRU1TY29udGV4dCBmYXIgKikgJiBjdHgpOwotICBpZiAoSElCWVRFKGN0eC5heCkgIT0gMCB8fCBMT0JZVEUoY3R4LmF4KSA8IDB4NDApCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIFRyeSB0byBhbGxvY2F0ZSByZXF1ZXN0ZWQgc3BhY2UgKi8KLSAgY3R4LmF4ID0gMHg0MzAwOwotICBjdHguYnggPSAodW5zaWduZWQgc2hvcnQpICgodG90YWxfYnl0ZXNfbmVlZGVkICsgRU1TUEFHRVNJWkUtMUwpIC8gRU1TUEFHRVNJWkUpOwotICBqZW1zX2NhbGxkcml2ZXIoKEVNU2NvbnRleHQgZmFyICopICYgY3R4KTsKLSAgaWYgKEhJQllURShjdHguYXgpICE9IDApCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIFN1Y2NlZWRlZCwgc2F2ZSB0aGUgaGFuZGxlIGFuZCBhd2F5IHdlIGdvICovCi0gIGluZm8tPmhhbmRsZS5lbXNfaGFuZGxlID0gY3R4LmR4OwotICBpbmZvLT5yZWFkX2JhY2tpbmdfc3RvcmUgPSByZWFkX2Vtc19zdG9yZTsKLSAgaW5mby0+d3JpdGVfYmFja2luZ19zdG9yZSA9IHdyaXRlX2Vtc19zdG9yZTsKLSAgaW5mby0+Y2xvc2VfYmFja2luZ19zdG9yZSA9IGNsb3NlX2Vtc19zdG9yZTsKLSAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfRU1TX09QRU4sIGN0eC5keCk7Ci0gIHJldHVybiBUUlVFOwkJCS8qIHN1Y2NlZWRlZCAqLwotfQotCi0jZW5kaWYgLyogRU1TX1NVUFBPUlRFRCAqLwotCi0KLS8qCi0gKiBJbml0aWFsIG9wZW5pbmcgb2YgYSBiYWNraW5nLXN0b3JlIG9iamVjdC4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfb3Blbl9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCQkgbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCi17Ci0gIC8qIFRyeSBleHRlbmRlZCBtZW1vcnksIHRoZW4gZXhwYW5kZWQgbWVtb3J5LCB0aGVuIHJlZ3VsYXIgZmlsZS4gKi8KLSNpZiBYTVNfU1VQUE9SVEVECi0gIGlmIChvcGVuX3htc19zdG9yZShjaW5mbywgaW5mbywgdG90YWxfYnl0ZXNfbmVlZGVkKSkKLSAgICByZXR1cm47Ci0jZW5kaWYKLSNpZiBFTVNfU1VQUE9SVEVECi0gIGlmIChvcGVuX2Vtc19zdG9yZShjaW5mbywgaW5mbywgdG90YWxfYnl0ZXNfbmVlZGVkKSkKLSAgICByZXR1cm47Ci0jZW5kaWYKLSAgaWYgKG9wZW5fZmlsZV9zdG9yZShjaW5mbywgaW5mbywgdG90YWxfYnl0ZXNfbmVlZGVkKSkKLSAgICByZXR1cm47Ci0gIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgIiIpOwotfQotCi0KLS8qCi0gKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCi0gKiBjbGVhbnVwIHJlcXVpcmVkLgotICovCi0KLUdMT0JBTChsb25nKQotanBlZ19tZW1faW5pdCAoal9jb21tb25fcHRyIGNpbmZvKQotewotICBuZXh0X2ZpbGVfbnVtID0gMDsJCS8qIGluaXRpYWxpemUgdGVtcCBmaWxlIG5hbWUgZ2VuZXJhdG9yICovCi0gIHJldHVybiBERUZBVUxUX01BWF9NRU07CS8qIGRlZmF1bHQgZm9yIG1heF9tZW1vcnlfdG9fdXNlICovCi19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19tZW1fdGVybSAoal9jb21tb25fcHRyIGNpbmZvKQotewotICAvKiBNaWNyb3NvZnQgQywgYXQgbGVhc3QgaW4gdjYuMDBBLCB3aWxsIG5vdCBzdWNjZXNzZnVsbHkgcmVjbGFpbSBmcmVlZAotICAgKiBibG9ja3Mgb2Ygc2l6ZSA+IDMyS2J5dGVzIHVubGVzcyB3ZSBnaXZlIGl0IGEga2ljayBpbiB0aGUgcmVhciwgbGlrZSBzbzoKLSAgICovCi0jaWZkZWYgTkVFRF9GSEVBUE1JTgotICBfZmhlYXBtaW4oKTsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvdW51c2VkL2ptZW1kb3NhLmFzbSBiL3VudXNlZC9qbWVtZG9zYS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDQzNzIuLjAwMDAwMDAKLS0tIGEvdW51c2VkL2ptZW1kb3NhLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDM3OSArMCwwIEBACi07Ci07IGptZW1kb3NhLmFzbQotOwotOyBDb3B5cmlnaHQgKEMpIDE5OTIsIFRob21hcyBHLiBMYW5lLgotOyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotOyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi07Ci07IFRoaXMgZmlsZSBjb250YWlucyBsb3ctbGV2ZWwgaW50ZXJmYWNlIHJvdXRpbmVzIHRvIHN1cHBvcnQgdGhlIE1TLURPUwotOyBiYWNraW5nIHN0b3JlIG1hbmFnZXIgKGptZW1kb3MuYykuICBSb3V0aW5lcyBhcmUgcHJvdmlkZWQgdG8gYWNjZXNzIGRpc2sKLTsgZmlsZXMgdGhyb3VnaCBkaXJlY3QgRE9TIGNhbGxzLCBhbmQgdG8gYWNjZXNzIFhNUyBhbmQgRU1TIGRyaXZlcnMuCi07Ci07IFRoaXMgZmlsZSBzaG91bGQgYXNzZW1ibGUgd2l0aCBNaWNyb3NvZnQncyBNQVNNIG9yIGFueSBjb21wYXRpYmxlCi07IGFzc2VtYmxlciAoaW5jbHVkaW5nIEJvcmxhbmQncyBUdXJibyBBc3NlbWJsZXIpLiAgSWYgeW91IGhhdmVuJ3QgZ290Ci07IGEgY29tcGF0aWJsZSBhc3NlbWJsZXIsIGJldHRlciBmYWxsIGJhY2sgdG8gam1lbWFuc2kuYyBvciBqbWVtbmFtZS5jLgotOwotOyBUbyBtaW5pbWl6ZSBkZXBlbmRlbmNlIG9uIHRoZSBDIGNvbXBpbGVyJ3MgcmVnaXN0ZXIgdXNhZ2UgY29udmVudGlvbnMsCi07IHdlIHNhdmUgYW5kIHJlc3RvcmUgYWxsIDgwODYgcmVnaXN0ZXJzLCBldmVuIHRob3VnaCBtb3N0IGNvbXBpbGVycyBvbmx5Ci07IHJlcXVpcmUgU0ksREksRFMgdG8gYmUgcHJlc2VydmVkLiAgQWxzbywgd2UgdXNlIG9ubHkgMTYtYml0LXdpZGUgcmV0dXJuCi07IHZhbHVlcywgd2hpY2ggZXZlcnlib2R5IHJldHVybnMgaW4gQVguCi07Ci07IEJhc2VkIG9uIGNvZGUgY29udHJpYnV0ZWQgYnkgR2UnIFdlaWplcnMuCi07Ci0KLUpNRU1ET1NBX1RYVAlzZWdtZW50IGJ5dGUgcHVibGljICdDT0RFJwotCi0JCWFzc3VtZQljczpKTUVNRE9TQV9UWFQKLQotCQlwdWJsaWMJX2pkb3Nfb3BlbgotCQlwdWJsaWMJX2pkb3NfY2xvc2UKLQkJcHVibGljCV9qZG9zX3NlZWsKLQkJcHVibGljCV9qZG9zX3JlYWQKLQkJcHVibGljCV9qZG9zX3dyaXRlCi0JCXB1YmxpYwlfanhtc19nZXRkcml2ZXIKLQkJcHVibGljCV9qeG1zX2NhbGxkcml2ZXIKLQkJcHVibGljCV9qZW1zX2F2YWlsYWJsZQotCQlwdWJsaWMJX2plbXNfY2FsbGRyaXZlcgotCi07Ci07IHNob3J0IGZhciBqZG9zX29wZW4gKHNob3J0IGZhciAqIGhhbmRsZSwgY2hhciBmYXIgKiBmaWxlbmFtZSkKLTsKLTsgQ3JlYXRlIGFuZCBvcGVuIGEgdGVtcG9yYXJ5IGZpbGUKLTsKLV9qZG9zX29wZW4JcHJvYwlmYXIKLQkJcHVzaAlicAkJCTsgbGlua2FnZQotCQltb3YgCWJwLHNwCi0JCXB1c2gJc2kJCQk7IHNhdmUgYWxsIHJlZ2lzdGVycyBmb3Igc2FmZXR5Ci0JCXB1c2gJZGkKLQkJcHVzaAlieAotCQlwdXNoCWN4Ci0JCXB1c2gJZHgKLQkJcHVzaAllcwotCQlwdXNoCWRzCi0JCW1vdgljeCwwCQkJOyBub3JtYWwgZmlsZSBhdHRyaWJ1dGVzCi0JCWxkcwlkeCxkd29yZCBwdHIgW2JwKzEwXQk7IGdldCBmaWxlbmFtZSBwb2ludGVyCi0JCW1vdglhaCwzY2gJCQk7IGNyZWF0ZSBmaWxlCi0JCWludAkyMWgKLQkJamMJb3Blbl9lcnIJCTsgaWYgZmFpbGVkLCByZXR1cm4gZXJyb3IgY29kZQotCQlsZHMJYngsZHdvcmQgcHRyIFticCs2XQk7IGdldCBoYW5kbGUgcG9pbnRlcgotCQltb3YJd29yZCBwdHIgW2J4XSxheAk7IHNhdmUgdGhlIGhhbmRsZQotCQl4b3IJYXgsYXgJCQk7IHJldHVybiB6ZXJvIGZvciBPSwotb3Blbl9lcnI6CXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKLQkJcG9wCWVzCi0JCXBvcAlkeAotCQlwb3AJY3gKLQkJcG9wCWJ4Ci0JCXBvcAlkaQotCQlwb3AJc2kKLQkJcG9wIAlicAotCQlyZXQKLV9qZG9zX29wZW4JZW5kcAotCi0KLTsKLTsgc2hvcnQgZmFyIGpkb3NfY2xvc2UgKHNob3J0IGhhbmRsZSkKLTsKLTsgQ2xvc2UgdGhlIGZpbGUgaGFuZGxlCi07Ci1famRvc19jbG9zZQlwcm9jCWZhcgotCQlwdXNoCWJwCQkJOyBsaW5rYWdlCi0JCW1vdiAJYnAsc3AKLQkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKLQkJcHVzaAlkaQotCQlwdXNoCWJ4Ci0JCXB1c2gJY3gKLQkJcHVzaAlkeAotCQlwdXNoCWVzCi0JCXB1c2gJZHMKLQkJbW92CWJ4LHdvcmQgcHRyIFticCs2XQk7IGZpbGUgaGFuZGxlCi0JCW1vdglhaCwzZWgJCQk7IGNsb3NlIGZpbGUKLQkJaW50CTIxaAotCQlqYwljbG9zZV9lcnIJCTsgaWYgZmFpbGVkLCByZXR1cm4gZXJyb3IgY29kZQotCQl4b3IJYXgsYXgJCQk7IHJldHVybiB6ZXJvIGZvciBPSwotY2xvc2VfZXJyOglwb3AJZHMJCQk7IHJlc3RvcmUgcmVnaXN0ZXJzIGFuZCBleGl0Ci0JCXBvcAllcwotCQlwb3AJZHgKLQkJcG9wCWN4Ci0JCXBvcAlieAotCQlwb3AJZGkKLQkJcG9wCXNpCi0JCXBvcCAJYnAKLQkJcmV0Ci1famRvc19jbG9zZQllbmRwCi0KLQotOwotOyBzaG9ydCBmYXIgamRvc19zZWVrIChzaG9ydCBoYW5kbGUsIGxvbmcgb2Zmc2V0KQotOwotOyBTZXQgZmlsZSBwb3NpdGlvbgotOwotX2pkb3Nfc2Vlawlwcm9jCWZhcgotCQlwdXNoCWJwCQkJOyBsaW5rYWdlCi0JCW1vdiAJYnAsc3AKLQkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKLQkJcHVzaAlkaQotCQlwdXNoCWJ4Ci0JCXB1c2gJY3gKLQkJcHVzaAlkeAotCQlwdXNoCWVzCi0JCXB1c2gJZHMKLQkJbW92CWJ4LHdvcmQgcHRyIFticCs2XQk7IGZpbGUgaGFuZGxlCi0JCW1vdglkeCx3b3JkIHB0ciBbYnArOF0JOyBMUyBvZmZzZXQKLQkJbW92CWN4LHdvcmQgcHRyIFticCsxMF0JOyBNUyBvZmZzZXQKLQkJbW92CWF4LDQyMDBoCQk7IGFic29sdXRlIHNlZWsKLQkJaW50CTIxaAotCQlqYwlzZWVrX2VycgkJOyBpZiBmYWlsZWQsIHJldHVybiBlcnJvciBjb2RlCi0JCXhvcglheCxheAkJCTsgcmV0dXJuIHplcm8gZm9yIE9LCi1zZWVrX2VycjoJcG9wCWRzCQkJOyByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZXhpdAotCQlwb3AJZXMKLQkJcG9wCWR4Ci0JCXBvcAljeAotCQlwb3AJYngKLQkJcG9wCWRpCi0JCXBvcAlzaQotCQlwb3AgCWJwCi0JCXJldAotX2pkb3Nfc2VlawllbmRwCi0KLQotOwotOyBzaG9ydCBmYXIgamRvc19yZWFkIChzaG9ydCBoYW5kbGUsIHZvaWQgZmFyICogYnVmZmVyLCB1bnNpZ25lZCBzaG9ydCBjb3VudCkKLTsKLTsgUmVhZCBmcm9tIGZpbGUKLTsKLV9qZG9zX3JlYWQJcHJvYwlmYXIKLQkJcHVzaAlicAkJCTsgbGlua2FnZQotCQltb3YgCWJwLHNwCi0JCXB1c2gJc2kJCQk7IHNhdmUgYWxsIHJlZ2lzdGVycyBmb3Igc2FmZXR5Ci0JCXB1c2gJZGkKLQkJcHVzaAlieAotCQlwdXNoCWN4Ci0JCXB1c2gJZHgKLQkJcHVzaAllcwotCQlwdXNoCWRzCi0JCW1vdglieCx3b3JkIHB0ciBbYnArNl0JOyBmaWxlIGhhbmRsZQotCQlsZHMJZHgsZHdvcmQgcHRyIFticCs4XQk7IGJ1ZmZlciBhZGRyZXNzCi0JCW1vdgljeCx3b3JkIHB0ciBbYnArMTJdCTsgbnVtYmVyIG9mIGJ5dGVzCi0JCW1vdglhaCwzZmgJCQk7IHJlYWQgZmlsZQotCQlpbnQJMjFoCi0JCWpjCXJlYWRfZXJyCQk7IGlmIGZhaWxlZCwgcmV0dXJuIGVycm9yIGNvZGUKLQkJY21wCWF4LHdvcmQgcHRyIFticCsxMl0JOyBtYWtlIHN1cmUgYWxsIGJ5dGVzIHdlcmUgcmVhZAotCQlqZQlyZWFkX29rCi0JCW1vdglheCwxCQkJOyBlbHNlIHJldHVybiAxIGZvciBub3QgT0sKLQkJam1wCXNob3J0IHJlYWRfZXJyCi1yZWFkX29rOgl4b3IJYXgsYXgJCQk7IHJldHVybiB6ZXJvIGZvciBPSwotcmVhZF9lcnI6CXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKLQkJcG9wCWVzCi0JCXBvcAlkeAotCQlwb3AJY3gKLQkJcG9wCWJ4Ci0JCXBvcAlkaQotCQlwb3AJc2kKLQkJcG9wIAlicAotCQlyZXQKLV9qZG9zX3JlYWQJZW5kcAotCi0KLTsKLTsgc2hvcnQgZmFyIGpkb3Nfd3JpdGUgKHNob3J0IGhhbmRsZSwgdm9pZCBmYXIgKiBidWZmZXIsIHVuc2lnbmVkIHNob3J0IGNvdW50KQotOwotOyBXcml0ZSB0byBmaWxlCi07Ci1famRvc193cml0ZQlwcm9jCWZhcgotCQlwdXNoCWJwCQkJOyBsaW5rYWdlCi0JCW1vdiAJYnAsc3AKLQkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKLQkJcHVzaAlkaQotCQlwdXNoCWJ4Ci0JCXB1c2gJY3gKLQkJcHVzaAlkeAotCQlwdXNoCWVzCi0JCXB1c2gJZHMKLQkJbW92CWJ4LHdvcmQgcHRyIFticCs2XQk7IGZpbGUgaGFuZGxlCi0JCWxkcwlkeCxkd29yZCBwdHIgW2JwKzhdCTsgYnVmZmVyIGFkZHJlc3MKLQkJbW92CWN4LHdvcmQgcHRyIFticCsxMl0JOyBudW1iZXIgb2YgYnl0ZXMKLQkJbW92CWFoLDQwaAkJCTsgd3JpdGUgZmlsZQotCQlpbnQJMjFoCi0JCWpjCXdyaXRlX2VycgkJOyBpZiBmYWlsZWQsIHJldHVybiBlcnJvciBjb2RlCi0JCWNtcAlheCx3b3JkIHB0ciBbYnArMTJdCTsgbWFrZSBzdXJlIGFsbCBieXRlcyB3cml0dGVuCi0JCWplCXdyaXRlX29rCi0JCW1vdglheCwxCQkJOyBlbHNlIHJldHVybiAxIGZvciBub3QgT0sKLQkJam1wCXNob3J0IHdyaXRlX2Vycgotd3JpdGVfb2s6CXhvcglheCxheAkJCTsgcmV0dXJuIHplcm8gZm9yIE9LCi13cml0ZV9lcnI6CXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKLQkJcG9wCWVzCi0JCXBvcAlkeAotCQlwb3AJY3gKLQkJcG9wCWJ4Ci0JCXBvcAlkaQotCQlwb3AJc2kKLQkJcG9wIAlicAotCQlyZXQKLV9qZG9zX3dyaXRlCWVuZHAKLQotCi07Ci07IHZvaWQgZmFyIGp4bXNfZ2V0ZHJpdmVyIChYTVNEUklWRVIgZmFyICopCi07Ci07IEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgWE1TIGRyaXZlciwgb3IgTlVMTCBpZiBub3QgYXZhaWxhYmxlCi07Ci1fanhtc19nZXRkcml2ZXIJcHJvYwlmYXIKLQkJcHVzaAlicAkJCTsgbGlua2FnZQotCQltb3YgCWJwLHNwCi0JCXB1c2gJc2kJCQk7IHNhdmUgYWxsIHJlZ2lzdGVycyBmb3Igc2FmZXR5Ci0JCXB1c2gJZGkKLQkJcHVzaAlieAotCQlwdXNoCWN4Ci0JCXB1c2gJZHgKLQkJcHVzaAllcwotCQlwdXNoCWRzCi0JCW1vdiAJYXgsNDMwMGgJCTsgY2FsbCBtdWx0aXBsZXggaW50ZXJydXB0IHdpdGgKLQkJaW50CTJmaAkJCTsgYSBtYWdpYyBjb29raWUsIGhleCA0MzAwCi0JCWNtcCAJYWwsODBoCQkJOyBBTCBzaG91bGQgY29udGFpbiBoZXggODAKLQkJamUJeG1zYXZhaWwKLQkJeG9yIAlkeCxkeAkJCTsgbm8gWE1TIGRyaXZlciBhdmFpbGFibGUKLQkJeG9yIAlheCxheAkJCTsgcmV0dXJuIGEgbmlsIHBvaW50ZXIKLQkJam1wCXNob3J0IHhtc2F2YWlsX2RvbmUKLXhtc2F2YWlsOgltb3YgCWF4LDQzMTBoCQk7IGZldGNoIGRyaXZlciBhZGRyZXNzIHdpdGgKLQkJaW50CTJmaAkJCTsgYW5vdGhlciBtYWdpYyBjb29raWUKLQkJbW92IAlkeCxlcwkJCTsgY29weSBhZGRyZXNzIHRvIGR4OmF4Ci0JCW1vdiAJYXgsYngKLXhtc2F2YWlsX2RvbmU6CWxlcyAJYngsZHdvcmQgcHRyIFticCs2XQk7IGdldCBwb2ludGVyIHRvIHJldHVybiB2YWx1ZQotCQltb3YJd29yZCBwdHIgZXM6W2J4XSxheAotCQltb3YJd29yZCBwdHIgZXM6W2J4KzJdLGR4Ci0JCXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKLQkJcG9wCWVzCi0JCXBvcAlkeAotCQlwb3AJY3gKLQkJcG9wCWJ4Ci0JCXBvcAlkaQotCQlwb3AJc2kKLQkJcG9wCWJwCi0JCXJldAotX2p4bXNfZ2V0ZHJpdmVyCWVuZHAKLQotCi07Ci07IHZvaWQgZmFyIGp4bXNfY2FsbGRyaXZlciAoWE1TRFJJVkVSLCBYTVNjb250ZXh0IGZhciAqKQotOwotOyBUaGUgWE1TY29udGV4dCBzdHJ1Y3R1cmUgY29udGFpbnMgdmFsdWVzIGZvciB0aGUgQVgsRFgsQlgsU0ksRFMgcmVnaXN0ZXJzLgotOyBUaGVzZSBhcmUgbG9hZGVkLCB0aGUgWE1TIGNhbGwgaXMgcGVyZm9ybWVkLCBhbmQgdGhlIG5ldyB2YWx1ZXMgb2YgdGhlCi07IEFYLERYLEJYIHJlZ2lzdGVycyBhcmUgd3JpdHRlbiBiYWNrIHRvIHRoZSBjb250ZXh0IHN0cnVjdHVyZS4KLTsKLV9qeG1zX2NhbGxkcml2ZXIgCXByb2MJZmFyCi0JCXB1c2gJYnAJCQk7IGxpbmthZ2UKLQkJbW92IAlicCxzcAotCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQotCQlwdXNoCWRpCi0JCXB1c2gJYngKLQkJcHVzaAljeAotCQlwdXNoCWR4Ci0JCXB1c2gJZXMKLQkJcHVzaAlkcwotCQlsZXMgCWJ4LGR3b3JkIHB0ciBbYnArMTBdCTsgZ2V0IFhNU2NvbnRleHQgcG9pbnRlcgotCQltb3YgCWF4LHdvcmQgcHRyIGVzOltieF0JOyBsb2FkIHJlZ2lzdGVycwotCQltb3YgCWR4LHdvcmQgcHRyIGVzOltieCsyXQotCQltb3YgCXNpLHdvcmQgcHRyIGVzOltieCs2XQotCQltb3YgCWRzLHdvcmQgcHRyIGVzOltieCs4XQotCQltb3YgCWJ4LHdvcmQgcHRyIGVzOltieCs0XQotCQljYWxsCWR3b3JkIHB0ciBbYnArNl0JOyBjYWxsIHRoZSBkcml2ZXIKLQkJbW92CWN4LGJ4CQkJOyBzYXZlIHJldHVybmVkIEJYIGZvciBhIHNlYwotCQlsZXMgCWJ4LGR3b3JkIHB0ciBbYnArMTBdCTsgZ2V0IFhNU2NvbnRleHQgcG9pbnRlcgotCQltb3YgCXdvcmQgcHRyIGVzOltieF0sYXgJOyBwdXQgYmFjayBheCxkeCxieAotCQltb3YgCXdvcmQgcHRyIGVzOltieCsyXSxkeAotCQltb3YgCXdvcmQgcHRyIGVzOltieCs0XSxjeAotCQlwb3AJZHMJCQk7IHJlc3RvcmUgcmVnaXN0ZXJzIGFuZCBleGl0Ci0JCXBvcAllcwotCQlwb3AJZHgKLQkJcG9wCWN4Ci0JCXBvcAlieAotCQlwb3AJZGkKLQkJcG9wCXNpCi0JCXBvcCAJYnAKLQkJcmV0Ci1fanhtc19jYWxsZHJpdmVyIAllbmRwCi0KLQotOwotOyBzaG9ydCBmYXIgamVtc19hdmFpbGFibGUgKHZvaWQpCi07Ci07IEhhdmUgd2UgZ290IGFuIEVNUyBkcml2ZXI/ICh0aGlzIGNvbWVzIHN0cmFpZ2h0IGZyb20gdGhlIEVNUyA0LjAgc3BlY3MpCi07Ci1famVtc19hdmFpbGFibGUJcHJvYwlmYXIKLQkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKLQkJcHVzaAlkaQotCQlwdXNoCWJ4Ci0JCXB1c2gJY3gKLQkJcHVzaAlkeAotCQlwdXNoCWVzCi0JCXB1c2gJZHMKLQkJbW92CWF4LDM1NjdoCQk7IGdldCBpbnRlcnJ1cHQgdmVjdG9yIDY3aAotCQlpbnQJMjFoCi0JCXB1c2gJY3MKLQkJcG9wCWRzCi0JCW1vdglkaSwwMDBhaAkJOyBjaGVjayBvZmZzIDEwIGluIHJldHVybmVkIHNlZwotCQlsZWEJc2ksQVNDSUlfZGV2aWNlX25hbWUJOyBhZ2FpbnN0IGxpdGVyYWwgc3RyaW5nCi0JCW1vdgljeCw4Ci0JCWNsZAotCQlyZXBlIGNtcHNiCi0JCWpuZQlub19lbXMKLQkJbW92CWF4LDEJCQk7IG1hdGNoLCBpdCdzIHRoZXJlCi0JCWptcAlzaG9ydCBhdmFpbF9kb25lCi1ub19lbXM6CQl4b3IJYXgsYXgJCQk7IGl0J3Mgbm90IHRoZXJlCi1hdmFpbF9kb25lOglwb3AJZHMJCQk7IHJlc3RvcmUgcmVnaXN0ZXJzIGFuZCBleGl0Ci0JCXBvcAllcwotCQlwb3AJZHgKLQkJcG9wCWN4Ci0JCXBvcAlieAotCQlwb3AJZGkKLQkJcG9wCXNpCi0JCXJldAotCi1BU0NJSV9kZXZpY2VfbmFtZQlkYgkiRU1NWFhYWDAiCi0KLV9qZW1zX2F2YWlsYWJsZQllbmRwCi0KLQotOwotOyB2b2lkIGZhciBqZW1zX2NhbGxkcml2ZXIgKEVNU2NvbnRleHQgZmFyICopCi07Ci07IFRoZSBFTVNjb250ZXh0IHN0cnVjdHVyZSBjb250YWlucyB2YWx1ZXMgZm9yIHRoZSBBWCxEWCxCWCxTSSxEUyByZWdpc3RlcnMuCi07IFRoZXNlIGFyZSBsb2FkZWQsIHRoZSBFTVMgdHJhcCBpcyBwZXJmb3JtZWQsIGFuZCB0aGUgbmV3IHZhbHVlcyBvZiB0aGUKLTsgQVgsRFgsQlggcmVnaXN0ZXJzIGFyZSB3cml0dGVuIGJhY2sgdG8gdGhlIGNvbnRleHQgc3RydWN0dXJlLgotOwotX2plbXNfY2FsbGRyaXZlcglwcm9jIGZhcgotCQlwdXNoCWJwCQkJOyBsaW5rYWdlCi0JCW1vdiAJYnAsc3AKLQkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKLQkJcHVzaAlkaQotCQlwdXNoCWJ4Ci0JCXB1c2gJY3gKLQkJcHVzaAlkeAotCQlwdXNoCWVzCi0JCXB1c2gJZHMKLQkJbGVzIAlieCxkd29yZCBwdHIgW2JwKzZdCTsgZ2V0IEVNU2NvbnRleHQgcG9pbnRlcgotCQltb3YgCWF4LHdvcmQgcHRyIGVzOltieF0JOyBsb2FkIHJlZ2lzdGVycwotCQltb3YgCWR4LHdvcmQgcHRyIGVzOltieCsyXQotCQltb3YgCXNpLHdvcmQgcHRyIGVzOltieCs2XQotCQltb3YgCWRzLHdvcmQgcHRyIGVzOltieCs4XQotCQltb3YgCWJ4LHdvcmQgcHRyIGVzOltieCs0XQotCQlpbnQJNjdoCQkJOyBjYWxsIHRoZSBFTVMgZHJpdmVyCi0JCW1vdgljeCxieAkJCTsgc2F2ZSByZXR1cm5lZCBCWCBmb3IgYSBzZWMKLQkJbGVzIAlieCxkd29yZCBwdHIgW2JwKzZdCTsgZ2V0IEVNU2NvbnRleHQgcG9pbnRlcgotCQltb3YgCXdvcmQgcHRyIGVzOltieF0sYXgJOyBwdXQgYmFjayBheCxkeCxieAotCQltb3YgCXdvcmQgcHRyIGVzOltieCsyXSxkeAotCQltb3YgCXdvcmQgcHRyIGVzOltieCs0XSxjeAotCQlwb3AJZHMJCQk7IHJlc3RvcmUgcmVnaXN0ZXJzIGFuZCBleGl0Ci0JCXBvcAllcwotCQlwb3AJZHgKLQkJcG9wCWN4Ci0JCXBvcAlieAotCQlwb3AJZGkKLQkJcG9wCXNpCi0JCXBvcCAJYnAKLQkJcmV0Ci1famVtc19jYWxsZHJpdmVyCWVuZHAKLQotSk1FTURPU0FfVFhUCWVuZHMKLQotCQllbmQKZGlmZiAtLWdpdCBhL3VudXNlZC9qbWVtbWFjLmMgYi91bnVzZWQvam1lbW1hYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDZmOWJlLi4wMDAwMDAwCi0tLSBhL3VudXNlZC9qbWVtbWFjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoKLSAqIGptZW1tYWMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogam1lbW1hYy5jIHByb3ZpZGVzIGFuIEFwcGxlIE1hY2ludG9zaCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3lzdGVtLQotICogZGVwZW5kZW50IHBvcnRpb24gb2YgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuCi0gKgotICogSWYgeW91IHVzZSBqbWVtbWFjLmMsIHRoZW4geW91IG11c3QgZGVmaW5lIFVTRV9NQUNfTUVNTUdSIGluIHRoZQotICogSlBFR19JTlRFUk5BTFMgcGFydCBvZiBqY29uZmlnLmguCi0gKgotICogam1lbW1hYy5jIHVzZXMgdGhlIE1hY2ludG9zaCB0b29sYm94IHJvdXRpbmVzIE5ld1B0ciBhbmQgRGlzcG9zZVB0cgotICogaW5zdGVhZCBvZiBtYWxsb2MgYW5kIGZyZWUuICBJdCBhY2N1cmF0ZWx5IGRldGVybWluZXMgdGhlIGFtb3VudCBvZgotICogbWVtb3J5IGF2YWlsYWJsZSBieSB1c2luZyBDb21wYWN0TWVtLiAgTm90aWNlIHRoYXQgaWYgbGVmdCB0byBpdHMKLSAqIG93biBkZXZpY2VzLCB0aGlzIGNvZGUgY2FuIGNoZXcgdXAgYWxsIGF2YWlsYWJsZSBzcGFjZSBpbiB0aGUKLSAqIGFwcGxpY2F0aW9uJ3Mgem9uZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSByYXRoZXIgc21hbGwgInNsb3AiCi0gKiBmYWN0b3IgY29tcHV0ZWQgaW4ganBlZ19tZW1fYXZhaWxhYmxlKCkuICBUaGUgYXBwbGljYXRpb24gY2FuIGVuc3VyZQotICogdGhhdCBtb3JlIHNwYWNlIGlzIGxlZnQgb3ZlciBieSByZWR1Y2luZyBtYXhfbWVtb3J5X3RvX3VzZS4KLSAqCi0gKiBMYXJnZSBpbWFnZXMgYXJlIHN3YXBwZWQgdG8gZGlzayB1c2luZyB0ZW1wb3JhcnkgZmlsZXMgYW5kIFN5c3RlbSA3LjArJ3MKLSAqIHRlbXBvcmFyeSBmb2xkZXIgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBOb3RlIHRoYXQgam1lbW1hYy5jIGRlcGVuZHMgb24gdHdvIGZlYXR1cmVzIG9mIE1hY09TIHRoYXQgd2VyZSBmaXJzdAotICogaW50cm9kdWNlZCBpbiBTeXN0ZW0gNzogRmluZEZvbGRlciBhbmQgdGhlIEZTU3BlYy1iYXNlZCBjYWxscy4KLSAqIElmIHlvdXIgYXBwbGljYXRpb24gdXNlcyBqbWVtbWFjLmMgYW5kIGlzIHJ1biB1bmRlciBTeXN0ZW0gNiBvciBlYXJsaWVyLAotICogYW5kIHRoZSBqcGVnIGxpYnJhcnkgZGVjaWRlcyBpdCBuZWVkcyBhIHRlbXBvcmFyeSBmaWxlLCBpdCB3aWxsIGFib3J0LAotICogcHJpbnRpbmcgZXJyb3IgbWVzc2FnZXMgYWJvdXQgcmVxdWlyaW5nIFN5c3RlbSA3LiAgKElmIG5vIHRlbXBvcmFyeSBmaWxlcwotICogYXJlIGNyZWF0ZWQsIGl0IHdpbGwgcnVuIGZpbmUuKQotICoKLSAqIElmIHlvdSB3YW50IHRvIHVzZSBqbWVtbWFjLmMgaW4gYW4gYXBwbGljYXRpb24gdGhhdCBtaWdodCBiZSB1c2VkIHdpdGgKLSAqIFN5c3RlbSA2IG9yIGVhcmxpZXIsIHRoZW4geW91IHNob3VsZCByZW1vdmUgZGVwZW5kZW5jaWVzIG9uIEZpbmRGb2xkZXIKLSAqIGFuZCB0aGUgRlNTcGVjIGNhbGxzLiAgWW91IHdpbGwgbmVlZCB0byByZXBsYWNlIEZpbmRGb2xkZXIgd2l0aCBzb21lCi0gKiBvdGhlciBtZWNoYW5pc20gZm9yIGZpbmRpbmcgYSBwbGFjZSB0byBwdXQgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgeW91Ci0gKiBzaG91bGQgcmVwbGFjZSB0aGUgRlNTcGVjIGNhbGxzIHdpdGggdGhlaXIgSEZTIGVxdWl2YWxlbnRzOgotICoKLSAqICAgICBGU3BEZWxldGUgICAgIC0+ICBIRGVsZXRlCi0gKiAgICAgRlNwR2V0RkluZm8gICAtPiAgSEdldEZJbmZvCi0gKiAgICAgRlNwQ3JlYXRlICAgICAtPiAgSENyZWF0ZQotICogICAgIEZTcE9wZW5ERiAgICAgLT4gIEhPcGVuICAgICAgKioqIE5vdGU6IG5vdCBIT3BlbkRGICoqKgotICogICAgIEZTTWFrZUZTU3BlYyAgLT4gIChmaWxsIGluIHNwZWMgYnkgaGFuZC4pCi0gKgotICogKFVzZSBIT3BlbiBpbnN0ZWFkIG9mIEhPcGVuREYuICBIT3BlbiBpcyBqdXN0IGEgZ2x1ZS1pbnRlcmZhY2UgdG8gUEJIT3BlbiwKLSAqIHdoaWNoIGlzIG9uIGFsbCBIRlMgbWFjcy4gIEhPcGVuREYgaXMgYSBTeXN0ZW0gNyBhZGRpdGlvbiB3aGljaCBhdm9pZHMgdGhlCi0gKiBhZ2VzLW9sZCBwcm9ibGVtIG9mIG5hbWVzIHN0YXJ0aW5nIHdpdGggYSBwZXJpb2QuKQotICoKLSAqIENvbnRyaWJ1dGVkIGJ5IFNhbSBCdXNoZWxsIChqc2FtQGlhZ3Uub24ubmV0KSBhbmQKLSAqIERhbiBHaWxkb3IgKGd5bGRAaW4tdG91Y2guY29tKS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiam1lbXN5cy5oIiAgICAvKiBpbXBvcnQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zICovCi0KLSNpZm5kZWYgVVNFX01BQ19NRU1NR1IJLyogbWFrZSBzdXJlIHVzZXIgZ290IGNvbmZpZ3VyYXRpb24gcmlnaHQgKi8KLSAgWW91IGZvcmdvdCB0byBkZWZpbmUgVVNFX01BQ19NRU1NR1IgaW4gamNvbmZpZy5oLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnJvciAqLwotI2VuZGlmCi0KLSNpbmNsdWRlIDxNZW1vcnkuaD4gICAgIC8qIHdlIHVzZSB0aGUgTWFjT1MgbWVtb3J5IG1hbmFnZXIgKi8KLSNpbmNsdWRlIDxGaWxlcy5oPiAgICAgIC8qIHdlIHVzZSB0aGUgTWFjT1MgRmlsZSBzdHVmZiAqLwotI2luY2x1ZGUgPEZvbGRlcnMuaD4gICAgLyogd2UgdXNlIHRoZSBNYWNPUyBIRlMgc3R1ZmYgKi8KLSNpbmNsdWRlIDxTY3JpcHQuaD4gICAgIC8qIGZvciBzbVN5c3RlbVNjcmlwdCAqLwotI2luY2x1ZGUgPEdlc3RhbHQuaD4gICAgLyogd2UgdXNlIEdlc3RhbHQgdG8gdGVzdCBmb3Igc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSAqLwotCi0jaWZuZGVmIFRFTVBfRklMRV9OQU1FCQkvKiBjYW4gb3ZlcnJpZGUgZnJvbSBqY29uZmlnLmggb3IgTWFrZWZpbGUgKi8KLSNkZWZpbmUgVEVNUF9GSUxFX05BTUUgICJKUEclMDNkLlRNUCIKLSNlbmRpZgotCi1zdGF0aWMgaW50IG5leHRfZmlsZV9udW07CS8qIHRvIGRpc3Rpbmd1aXNoIGFtb25nIHNldmVyYWwgdGVtcCBmaWxlcyAqLwotCi0KLS8qCi0gKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBhcmUgY29udHJvbGxlZCBieSB0aGUgTWFjT1MgbGlicmFyeQotICogcm91dGluZXMgTmV3UHRyKCkgYW5kIERpc3Bvc2VQdHIoKSwgd2hpY2ggYWxsb2NhdGUgZml4ZWQtYWRkcmVzcwotICogc3RvcmFnZS4gIFVuZm9ydHVuYXRlbHksIHRoZSBJSkcgbGlicmFyeSBpc24ndCBzbWFydCBlbm91Z2ggdG8gY29wZQotICogd2l0aCByZWxvY2F0YWJsZSBzdG9yYWdlLgotICovCi0KLUdMT0JBTCh2b2lkICopCi1qcGVnX2dldF9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICByZXR1cm4gKHZvaWQgKikgTmV3UHRyKHNpemVvZm9iamVjdCk7Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19mcmVlX3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIERpc3Bvc2VQdHIoKFB0cikgb2JqZWN0KTsKLX0KLQotCi0vKgotICogIkxhcmdlIiBvYmplY3RzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzICJzbWFsbCIgb25lcy4KLSAqIE5COiB3ZSBpbmNsdWRlIEZBUiBrZXl3b3JkcyBpbiB0aGUgcm91dGluZSBkZWNsYXJhdGlvbnMgc2ltcGx5IGZvcgotICogY29uc2lzdGVuY3kgd2l0aCB0aGUgcmVzdCBvZiB0aGUgSUpHIGNvZGU7IEZBUiBzaG91bGQgZXhwYW5kIHRvIGVtcHR5Ci0gKiBvbiByYXRpb25hbCBhcmNoaXRlY3R1cmVzIGxpa2UgdGhlIE1hYy4KLSAqLwotCi1HTE9CQUwodm9pZCBGQVIgKikKLWpwZWdfZ2V0X2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIHJldHVybiAodm9pZCBGQVIgKikgTmV3UHRyKHNpemVvZm9iamVjdCk7Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19mcmVlX2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgRkFSICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICBEaXNwb3NlUHRyKChQdHIpIG9iamVjdCk7Ci19Ci0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBjb21wdXRlcyB0aGUgdG90YWwgbWVtb3J5IHNwYWNlIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi4KLSAqLwotCi1HTE9CQUwobG9uZykKLWpwZWdfbWVtX2F2YWlsYWJsZSAoal9jb21tb25fcHRyIGNpbmZvLCBsb25nIG1pbl9ieXRlc19uZWVkZWQsCi0JCSAgICBsb25nIG1heF9ieXRlc19uZWVkZWQsIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpCi17Ci0gIGxvbmcgbGltaXQgPSBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSAtIGFscmVhZHlfYWxsb2NhdGVkOwotICBsb25nIHNsb3AsIG1lbTsKLQotICAvKiBEb24ndCBhc2sgZm9yIG1vcmUgdGhhbiB3aGF0IGFwcGxpY2F0aW9uIGhhcyB0b2xkIHVzIHdlIG1heSB1c2UgKi8KLSAgaWYgKG1heF9ieXRlc19uZWVkZWQgPiBsaW1pdCAmJiBsaW1pdCA+IDApCi0gICAgbWF4X2J5dGVzX25lZWRlZCA9IGxpbWl0OwotICAvKiBGaW5kIHdoZXRoZXIgdGhlcmUncyBhIGJpZyBlbm91Z2ggZnJlZSBibG9jayBpbiB0aGUgaGVhcC4KLSAgICogQ29tcGFjdE1lbSB0cmllcyB0byBjcmVhdGUgYSBjb250aWd1b3VzIGJsb2NrIG9mIHRoZSByZXF1ZXN0ZWQgc2l6ZSwKLSAgICogYW5kIHRoZW4gcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBmcmVlIGJsb2NrICh3aGljaCBjb3VsZCBiZQotICAgKiBtdWNoIG1vcmUgb3IgbXVjaCBsZXNzIHRoYW4gd2UgYXNrZWQgZm9yKS4KLSAgICogV2UgYWRkIHNvbWUgc2xvcCB0byBlbnN1cmUgd2UgZG9uJ3QgdXNlIHVwIGFsbCBhdmFpbGFibGUgbWVtb3J5LgotICAgKi8KLSAgc2xvcCA9IG1heF9ieXRlc19uZWVkZWQgLyAxNiArIDMyNzY4TDsKLSAgbWVtID0gQ29tcGFjdE1lbShtYXhfYnl0ZXNfbmVlZGVkICsgc2xvcCkgLSBzbG9wOwotICBpZiAobWVtIDwgMCkKLSAgICBtZW0gPSAwOwkJCS8qIHNpZ2gsIGNvdWxkbid0IGV2ZW4gZ2V0IHRoZSBzbG9wICovCi0gIC8qIERvbid0IHRha2UgbW9yZSB0aGFuIHRoZSBhcHBsaWNhdGlvbiBzYXlzIHdlIGNhbiBoYXZlICovCi0gIGlmIChtZW0gPiBsaW1pdCAmJiBsaW1pdCA+IDApCi0gICAgbWVtID0gbGltaXQ7Ci0gIHJldHVybiBtZW07Ci19Ci0KLQotLyoKLSAqIEJhY2tpbmcgc3RvcmUgKHRlbXBvcmFyeSBmaWxlKSBtYW5hZ2VtZW50LgotICogQmFja2luZyBzdG9yZSBvYmplY3RzIGFyZSBvbmx5IHVzZWQgd2hlbiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKLSAqIGpwZWdfbWVtX2F2YWlsYWJsZSBpcyBsZXNzIHRoYW4gdGhlIHRvdGFsIHNwYWNlIG5lZWRlZC4gIFlvdSBjYW4gZGlzcGVuc2UKLSAqIHdpdGggdGhlc2Ugcm91dGluZXMgaWYgeW91IGhhdmUgcGxlbnR5IG9mIHZpcnR1YWwgbWVtb3J5OyBzZWUgam1lbW5vYnMuYy4KLSAqLwotCi0KLU1FVEhPRERFRih2b2lkKQotcmVhZF9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCSAgICB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAotCQkgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQotewotICBsb25nIGJ5dGVzID0gYnl0ZV9jb3VudDsKLSAgbG9uZyByZXRWYWw7Ci0KLSAgaWYgKCBTZXRGUG9zICggaW5mby0+dGVtcF9maWxlLCBmc0Zyb21TdGFydCwgZmlsZV9vZmZzZXQgKSAhPSBub0VyciApCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKLQotICByZXRWYWwgPSBGU1JlYWQgKCBpbmZvLT50ZW1wX2ZpbGUsICZieXRlcywKLQkJICAgICh1bnNpZ25lZCBjaGFyICopIGJ1ZmZlcl9hZGRyZXNzICk7Ci0gIGlmICggcmV0VmFsICE9IG5vRXJyIHx8IGJ5dGVzICE9IGJ5dGVfY291bnQgKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfUkVBRCk7Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCSAgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCi17Ci0gIGxvbmcgYnl0ZXMgPSBieXRlX2NvdW50OwotICBsb25nIHJldFZhbDsKLQotICBpZiAoIFNldEZQb3MgKCBpbmZvLT50ZW1wX2ZpbGUsIGZzRnJvbVN0YXJ0LCBmaWxlX29mZnNldCApICE9IG5vRXJyICkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1NFRUspOwotCi0gIHJldFZhbCA9IEZTV3JpdGUgKCBpbmZvLT50ZW1wX2ZpbGUsICZieXRlcywKLQkJICAgICAodW5zaWduZWQgY2hhciAqKSBidWZmZXJfYWRkcmVzcyApOwotICBpZiAoIHJldFZhbCAhPSBub0VyciB8fCBieXRlcyAhPSBieXRlX2NvdW50ICkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1dSSVRFKTsKLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLWNsb3NlX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKLXsKLSAgRlNDbG9zZSAoIGluZm8tPnRlbXBfZmlsZSApOwotICBGU3BEZWxldGUgKCAmKGluZm8tPnRlbXBTcGVjKSApOwotfQotCi0KLS8qCi0gKiBJbml0aWFsIG9wZW5pbmcgb2YgYSBiYWNraW5nLXN0b3JlIG9iamVjdC4KLSAqCi0gKiBUaGlzIHZlcnNpb24gdXNlcyBGaW5kRm9sZGVyIHRvIGZpbmQgdGhlIFRlbXBvcmFyeSBJdGVtcyBmb2xkZXIsCi0gKiBhbmQgcHV0cyB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlcmUuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX29wZW5fYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkJIGxvbmcgdG90YWxfYnl0ZXNfbmVlZGVkKQotewotICBzaG9ydCAgICAgICAgIHRtcFJlZiwgdlJlZk51bTsKLSAgbG9uZyAgICAgICAgICBkaXJJRDsKLSAgRkluZm8gICAgICAgICBmaW5kZXJJbmZvOwotICBGU1NwZWMgICAgICAgIHRoZVNwZWM7Ci0gIFN0cjI1NSAgICAgICAgZk5hbWU7Ci0gIE9TRXJyICAgICAgICAgb3NFcnI7Ci0gIGxvbmcgICAgICAgICAgZ2VzdGFsdFJlc3BvbnNlID0gMDsKLQotICAvKiBDaGVjayB0aGF0IEZTU3BlYyBjYWxscyBhcmUgYXZhaWxhYmxlLiAqLwotICBvc0VyciA9IEdlc3RhbHQoIGdlc3RhbHRGU0F0dHIsICZnZXN0YWx0UmVzcG9uc2UgKTsKLSAgaWYgKCAoIG9zRXJyICE9IG5vRXJyICkKLSAgICAgICB8fCAhKCBnZXN0YWx0UmVzcG9uc2UgJiAoMTw8Z2VzdGFsdEhhc0ZTU3BlY0NhbGxzKSApICkKLSAgICBFUlJFWElUUyhjaW5mbywgSkVSUl9URklMRV9DUkVBVEUsICItIFN5c3RlbSA3LjAgb3IgbGF0ZXIgcmVxdWlyZWQiKTsKLSAgLyogVE8gRE86IGFkZCBhIHByb3BlciBlcnJvciBtZXNzYWdlIHRvIGplcnJvci5oLiAqLwotCi0gIC8qIENoZWNrIHRoYXQgRmluZEZvbGRlciBpcyBhdmFpbGFibGUuICovCi0gIG9zRXJyID0gR2VzdGFsdCggZ2VzdGFsdEZpbmRGb2xkZXJBdHRyLCAmZ2VzdGFsdFJlc3BvbnNlICk7Ci0gIGlmICggKCBvc0VyciAhPSBub0VyciApCi0gICAgICAgfHwgISggZ2VzdGFsdFJlc3BvbnNlICYgKDE8PGdlc3RhbHRGaW5kRm9sZGVyUHJlc2VudCkgKSApCi0gICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCAiLSBTeXN0ZW0gNy4wIG9yIGxhdGVyIHJlcXVpcmVkLiIpOwotICAvKiBUTyBETzogYWRkIGEgcHJvcGVyIGVycm9yIG1lc3NhZ2UgdG8gamVycm9yLmguICovCi0KLSAgb3NFcnIgPSBGaW5kRm9sZGVyICgga09uU3lzdGVtRGlzaywga1RlbXBvcmFyeUZvbGRlclR5cGUsIGtDcmVhdGVGb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLCAmZGlySUQgKTsKLSAgaWYgKCBvc0VyciAhPSBub0VyciApCi0gICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCAiLSB0ZW1wb3JhcnkgaXRlbXMgZm9sZGVyIHVuYXZhaWxhYmxlIik7Ci0gIC8qIFRPIERPOiBUcnkgcHV0dGluZyB0aGUgdGVtcCBmaWxlcyBzb21ld2hlcmUgZWxzZS4gKi8KLQotICAvKiBLZWVwIGdlbmVyYXRpbmcgZmlsZSBuYW1lcyB0aWxsIHdlIGZpbmQgb25lIHRoYXQncyBub3QgaW4gdXNlICovCi0gIGZvciAoOzspIHsKLSAgICBuZXh0X2ZpbGVfbnVtKys7CQkvKiBhZHZhbmNlIGNvdW50ZXIgKi8KLQotICAgIHNwcmludGYoaW5mby0+dGVtcF9uYW1lLCBURU1QX0ZJTEVfTkFNRSwgbmV4dF9maWxlX251bSk7Ci0gICAgc3RyY3B5ICggKFB0cilmTmFtZSsxLCBpbmZvLT50ZW1wX25hbWUgKTsKLSAgICAqZk5hbWUgPSBzdHJsZW4gKGluZm8tPnRlbXBfbmFtZSk7Ci0gICAgb3NFcnIgPSBGU01ha2VGU1NwZWMgKCB2UmVmTnVtLCBkaXJJRCwgZk5hbWUsICZ0aGVTcGVjICk7Ci0KLSAgICBpZiAoIChvc0VyciA9IEZTcEdldEZJbmZvICggJnRoZVNwZWMsICZmaW5kZXJJbmZvICkgKSAhPSBub0VyciApCi0gICAgICBicmVhazsKLSAgfQotCi0gIG9zRXJyID0gRlNwQ3JlYXRlICggJnRoZVNwZWMsICc/Pz8/JywgJz8/Pz8nLCBzbVN5c3RlbVNjcmlwdCApOwotICBpZiAoIG9zRXJyICE9IG5vRXJyICkKLSAgICBFUlJFWElUUyhjaW5mbywgSkVSUl9URklMRV9DUkVBVEUsIGluZm8tPnRlbXBfbmFtZSk7Ci0KLSAgb3NFcnIgPSBGU3BPcGVuREYgKCAmdGhlU3BlYywgZnNSZFdyUGVybSwgJihpbmZvLT50ZW1wX2ZpbGUpICk7Ci0gIGlmICggb3NFcnIgIT0gbm9FcnIgKQotICAgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgaW5mby0+dGVtcF9uYW1lKTsKLQotICBpbmZvLT50ZW1wU3BlYyA9IHRoZVNwZWM7Ci0KLSAgaW5mby0+cmVhZF9iYWNraW5nX3N0b3JlID0gcmVhZF9iYWNraW5nX3N0b3JlOwotICBpbmZvLT53cml0ZV9iYWNraW5nX3N0b3JlID0gd3JpdGVfYmFja2luZ19zdG9yZTsKLSAgaW5mby0+Y2xvc2VfYmFja2luZ19zdG9yZSA9IGNsb3NlX2JhY2tpbmdfc3RvcmU7Ci0gIFRSQUNFTVNTKGNpbmZvLCAxLCBKVFJDX1RGSUxFX09QRU4sIGluZm8tPnRlbXBfbmFtZSk7Ci19Ci0KLQotLyoKLSAqIFRoZXNlIHJvdXRpbmVzIHRha2UgY2FyZSBvZiBhbnkgc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiBhbmQKLSAqIGNsZWFudXAgcmVxdWlyZWQuCi0gKi8KLQotR0xPQkFMKGxvbmcpCi1qcGVnX21lbV9pbml0IChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIG5leHRfZmlsZV9udW0gPSAwOwotCi0gIC8qIG1heF9tZW1vcnlfdG9fdXNlIHdpbGwgYmUgaW5pdGlhbGl6ZWQgdG8gRnJlZU1lbSgpJ3MgcmVzdWx0OwotICAgKiB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbiBtaWdodCBsYXRlciByZWR1Y2UgaXQsIGZvciBleGFtcGxlCi0gICAqIHRvIGxlYXZlIHJvb20gdG8gaW52b2tlIG11bHRpcGxlIEpQRUcgb2JqZWN0cy4KLSAgICogTm90ZSB0aGF0IEZyZWVNZW0gcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGZyZWUgYnl0ZXM7Ci0gICAqIGl0IG1heSBub3QgYmUgcG9zc2libGUgdG8gYWxsb2NhdGUgYSBzaW5nbGUgYmxvY2sgb2YgdGhpcyBzaXplLgotICAgKi8KLSAgcmV0dXJuIEZyZWVNZW0oKTsKLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX21lbV90ZXJtIChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgKi8KLX0KZGlmZiAtLWdpdCBhL3VudXNlZC9tYWtjanBlZy5zdCBiL3VudXNlZC9tYWtjanBlZy5zdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM3MmM4OS4uMDAwMDAwMAotLS0gYS91bnVzZWQvbWFrY2pwZWcuc3QKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi07IFByb2plY3QgZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCi07Ci07IFRoaXMgcHJvamVjdCBmaWxlIGlzIGZvciBBdGFyaSBTVC9TVEUvVFQgc3lzdGVtcyB1c2luZyBQdXJlIEMgb3IgVHVyYm8gQy4KLTsgVGhhbmtzIHRvIEZyYW5rIE1vZWhsZSAoRnJhbmsuTW9laGxlQGFyYmkuaW5mb3JtYXRpay51bmktb2xkZW5idXJnLmRlKSwKLTsgRHIuIEIuIFNldHplcGZhbmR0IChiZXJuZEBnaW5hLnVuaS1tdWVuc3Rlci5kZSksCi07IGFuZCBHdWlkbyBWb2xsYmVkaW5nIChndWl2b2xAZXNjLmRlKS4KLTsKLTsgVG8gdXNlIHRoaXMgZmlsZSwgcmVuYW1lIGl0IHRvIGNqcGVnLnByai4KLTsgSWYgeW91IGFyZSB1c2luZyBUdXJibyBDLCBjaGFuZ2UgZmlsZW5hbWVzIGJlZ2lubmluZyB3aXRoICJwYy4uLiIgdG8gInRjLi4uIgotOyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHRyeWluZyB0byBtYWtlIHRoZSBwcm9ncmFtIQotOwotOwotOyAgICAgICogKiAqIE91dHB1dCBmaWxlICogKiAqCi1janBlZy50dHAKLTsKLTsgKiAqICogQ09NUElMRVIgT1BUSU9OUyAqICogKiAgCi0uQ1stUF0gICAgICAgIDsgYWJzb2x1dGUgY2FsbHMKLS5DWy1NXSAgICAgICAgOyBhbmQgbm8gc3RyaW5nIG1lcmdpbmcsIGZvbGtzCi0uQ1stdy1jbG5dICAgIDsgbm8gImNvbnN0YW50IGlzIGxvbmciIHdhcm5pbmdzCi0uQ1stdy1wYXJdICAgIDsgbm8gInBhcmFtZXRlciB4eHh4IHVudXNlZCIKLS5DWy13LXJjaF0gICAgOyBubyAidW5yZWFjaGFibGUgY29kZSIKLS5DWy13c2lnXSAgICAgOyB3YXJuIGlmIHNpZ25pZmljYW50IGRpZ2l0cyBtYXkgYmUgbG9zdAotPQotOyAqICogKiAqIExpc3Qgb2YgbW9kdWxlcyAqICogKiAqIAotcGNzdGFydC5vCi1janBlZy5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgsanZlcnNpb24uaCkKLWNkanBlZy5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi1yZHN3aXRjaC5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi1yZHBwbS5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi1yZGdpZi5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi1yZHRhcmdhLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKLXJkYm1wLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKLXJkcmxlLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKLWxpYmpwZWcubGliICAgICAgICA7IGJ1aWx0IGJ5IGxpYmpwZWcucHJqCi1wY2ZsdGxpYi5saWIgICAgICAgOyBmbG9hdGluZyBwb2ludCBsaWJyYXJ5Ci07IHRoZSBmbG9hdCBsaWJyYXJ5IGNhbiBiZSBvbWl0dGVkIGlmIHlvdSd2ZSB0dXJuZWQgb2ZmIERDVF9GTE9BVF9TVVBQT1JURUQKLXBjc3RkbGliLmxpYiAgICAgICA7IHN0YW5kYXJkIGxpYnJhcnkKLXBjZXh0bGliLmxpYiAgICAgICA7IGV4dGVuZGVkIGxpYnJhcnkKZGlmZiAtLWdpdCBhL3VudXNlZC9tYWtkanBlZy5zdCBiL3VudXNlZC9tYWtkanBlZy5zdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyNjcyNi4uMDAwMDAwMAotLS0gYS91bnVzZWQvbWFrZGpwZWcuc3QKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi07IFByb2plY3QgZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCi07Ci07IFRoaXMgcHJvamVjdCBmaWxlIGlzIGZvciBBdGFyaSBTVC9TVEUvVFQgc3lzdGVtcyB1c2luZyBQdXJlIEMgb3IgVHVyYm8gQy4KLTsgVGhhbmtzIHRvIEZyYW5rIE1vZWhsZSAoRnJhbmsuTW9laGxlQGFyYmkuaW5mb3JtYXRpay51bmktb2xkZW5idXJnLmRlKSwKLTsgRHIuIEIuIFNldHplcGZhbmR0IChiZXJuZEBnaW5hLnVuaS1tdWVuc3Rlci5kZSksCi07IGFuZCBHdWlkbyBWb2xsYmVkaW5nIChndWl2b2xAZXNjLmRlKS4KLTsKLTsgVG8gdXNlIHRoaXMgZmlsZSwgcmVuYW1lIGl0IHRvIGRqcGVnLnByai4KLTsgSWYgeW91IGFyZSB1c2luZyBUdXJibyBDLCBjaGFuZ2UgZmlsZW5hbWVzIGJlZ2lubmluZyB3aXRoICJwYy4uLiIgdG8gInRjLi4uIgotOyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHRyeWluZyB0byBtYWtlIHRoZSBwcm9ncmFtIQotOwotOwotOyAgICAgICogKiAqIE91dHB1dCBmaWxlICogKiAqCi1kanBlZy50dHAKLTsKLTsgKiAqICogQ09NUElMRVIgT1BUSU9OUyAqICogKiAgCi0uQ1stUF0gICAgICAgIDsgYWJzb2x1dGUgY2FsbHMKLS5DWy1NXSAgICAgICAgOyBhbmQgbm8gc3RyaW5nIG1lcmdpbmcsIGZvbGtzCi0uQ1stdy1jbG5dICAgIDsgbm8gImNvbnN0YW50IGlzIGxvbmciIHdhcm5pbmdzCi0uQ1stdy1wYXJdICAgIDsgbm8gInBhcmFtZXRlciB4eHh4IHVudXNlZCIKLS5DWy13LXJjaF0gICAgOyBubyAidW5yZWFjaGFibGUgY29kZSIKLS5DWy13c2lnXSAgICAgOyB3YXJuIGlmIHNpZ25pZmljYW50IGRpZ2l0cyBtYXkgYmUgbG9zdAotPQotOyAqICogKiAqIExpc3Qgb2YgbW9kdWxlcyAqICogKiAqIAotcGNzdGFydC5vCi1kanBlZy5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgsanZlcnNpb24uaCkKLWNkanBlZy5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi1yZGNvbG1hcC5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi13cnBwbS5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi13cmdpZi5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi13cnRhcmdhLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKLXdyYm1wLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKLXdycmxlLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKLWxpYmpwZWcubGliICAgICAgICA7IGJ1aWx0IGJ5IGxpYmpwZWcucHJqCi1wY2ZsdGxpYi5saWIgICAgICAgOyBmbG9hdGluZyBwb2ludCBsaWJyYXJ5Ci07IHRoZSBmbG9hdCBsaWJyYXJ5IGNhbiBiZSBvbWl0dGVkIGlmIHlvdSd2ZSB0dXJuZWQgb2ZmIERDVF9GTE9BVF9TVVBQT1JURUQKLXBjc3RkbGliLmxpYiAgICAgICA7IHN0YW5kYXJkIGxpYnJhcnkKLXBjZXh0bGliLmxpYiAgICAgICA7IGV4dGVuZGVkIGxpYnJhcnkKZGlmZiAtLWdpdCBhL3VudXNlZC9tYWtlYXBwcy5kcyBiL3VudXNlZC9tYWtlYXBwcy5kcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkZDAzOC4uMDAwMDAwMAotLS0gYS91bnVzZWQvbWFrZWFwcHMuZHMKKysrIC9kZXYvbnVsbApAQCAtMSw4MjggKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgTk1BS0UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNC4yMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMKLQotIUlGICIkKENGRykiID09ICIiCi1DRkc9Y2pwZWcgLSBXaW4zMgotIU1FU1NBR0UgTm8gY29uZmlndXJhdGlvbiBzcGVjaWZpZWQuICBEZWZhdWx0aW5nIHRvIGNqcGVnIC0gV2luMzIuCi0hRU5ESUYgCi0KLSFJRiAiJChDRkcpIiAhPSAiY2pwZWcgLSBXaW4zMiIgJiYgIiQoQ0ZHKSIgIT0gImRqcGVnIC0gV2luMzIiICYmXAotICIkKENGRykiICE9ICJqcGVndHJhbiAtIFdpbjMyIiAmJiAiJChDRkcpIiAhPSAicmRqcGdjb20gLSBXaW4zMiIgJiZcCi0gIiQoQ0ZHKSIgIT0gIndyanBnY29tIC0gV2luMzIiCi0hTUVTU0FHRSBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gIiQoQ0ZHKSIgc3BlY2lmaWVkLgotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0Ugb24gdGhpcyBtYWtlZmlsZQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiAgRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJhcHBzLm1hayIgQ0ZHPSJjanBlZyAtIFdpbjMyIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgImNqcGVnIC0gV2luMzIiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAiZGpwZWcgLSBXaW4zMiIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFICJqcGVndHJhbiAtIFdpbjMyIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgInJkanBnY29tIC0gV2luMzIiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAid3JqcGdjb20gLSBXaW4zMiIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFIAotIUVSUk9SIEFuIGludmFsaWQgY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpZWQuCi0hRU5ESUYgCi0KLSFJRiAiJChPUykiID09ICJXaW5kb3dzX05UIgotTlVMTD0KLSFFTFNFIAotTlVMTD1udWwKLSFFTkRJRiAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBUYXJnZXRfTGFzdF9TY2FubmVkICJjanBlZyAtIFdpbjMyIgotQ1BQPWNsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJjanBlZyAtIFdpbjMyIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiY2pwZWdcUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImNqcGVnXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICJjanBlZyIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJjanBlZ1xSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgImNqcGVnXFJlbGVhc2UiCi0jIFBST1AgVGFyZ2V0X0RpciAiY2pwZWciCi1PVVRESVI9LlxjanBlZ1xSZWxlYXNlCi1JTlRESVI9LlxjanBlZ1xSZWxlYXNlCi0KLUFMTCA6ICIkKE9VVERJUilcY2pwZWcuZXhlIgotCi1DTEVBTiA6IAotCS1AZXJhc2UgIiQoSU5URElSKVxjanBlZy5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHJkcHBtLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilccmRnaWYub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxyZHRhcmdhLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilccmRybGUub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxyZGJtcC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHJkc3dpdGNoLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcY2RqcGVnLm9iaiIKLQktQGVyYXNlICIkKE9VVERJUilcY2pwZWcuZXhlIgotCi0iJChPVVRESVIpIiA6Ci0gICAgaWYgbm90IGV4aXN0ICIkKE9VVERJUikvJChOVUxMKSIgbWtkaXIgIiQoT1VURElSKSIKLQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCi1DUFBfUFJPSj0vbm9sb2dvIC9NTCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSJcCi0gL0ZwIiQoSU5URElSKS9janBlZy5wY2giIC9ZWCAvRm8iJChJTlRESVIpLyIgL2MgCi1DUFBfT0JKUz0uXGNqcGVnXFJlbGVhc2UvCi1DUFBfU0JSUz0uXC4KLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUJTQzMyX0ZMQUdTPS9ub2xvZ28gL28iJChPVVRESVIpL2NqcGVnLmJzYyIgCi1CU0MzMl9TQlJTPSBcCi0JCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiBSZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLUxJTkszMl9GTEFHUz1SZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWJcCi0gY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliXAotIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9pbmNyZW1lbnRhbDpub1wKLSAvcGRiOiIkKE9VVERJUikvY2pwZWcucGRiIiAvbWFjaGluZTpJMzg2IC9vdXQ6IiQoT1VURElSKS9janBlZy5leGUiIAotTElOSzMyX09CSlM9IFwKLQkiJChJTlRESVIpXGNqcGVnLm9iaiIgXAotCSIkKElOVERJUilccmRwcG0ub2JqIiBcCi0JIiQoSU5URElSKVxyZGdpZi5vYmoiIFwKLQkiJChJTlRESVIpXHJkdGFyZ2Eub2JqIiBcCi0JIiQoSU5URElSKVxyZHJsZS5vYmoiIFwKLQkiJChJTlRESVIpXHJkYm1wLm9iaiIgXAotCSIkKElOVERJUilccmRzd2l0Y2gub2JqIiBcCi0JIiQoSU5URElSKVxjZGpwZWcub2JqIiBcCi0KLQotIiQoT1VURElSKVxjanBlZy5leGUiIDogIiQoT1VURElSKSIgJChERUZfRklMRSkgJChMSU5LMzJfT0JKUykKLSAgICAkKExJTkszMikgQDw8Ci0gICQoTElOSzMyX0ZMQUdTKSAkKExJTkszMl9PQkpTKQotPDwKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImRqcGVnIC0gV2luMzIiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJkanBlZ1xSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZGpwZWdcUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgImRqcGVnIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgImRqcGVnXFJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiZGpwZWdcUmVsZWFzZSIKLSMgUFJPUCBUYXJnZXRfRGlyICJkanBlZyIKLU9VVERJUj0uXGRqcGVnXFJlbGVhc2UKLUlOVERJUj0uXGRqcGVnXFJlbGVhc2UKLQotQUxMIDogIiQoT1VURElSKVxkanBlZy5leGUiCi0KLUNMRUFOIDogCi0JLUBlcmFzZSAiJChJTlRESVIpXGRqcGVnLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcd3JwcG0ub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVx3cmdpZi5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHdydGFyZ2Eub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVx3cnJsZS5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHdyYm1wLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilccmRjb2xtYXAub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxjZGpwZWcub2JqIgotCS1AZXJhc2UgIiQoT1VURElSKVxkanBlZy5leGUiCi0KLSIkKE9VVERJUikiIDoKLSAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgotCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLUNQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIlwKLSAvRnAiJChJTlRESVIpL2RqcGVnLnBjaCIgL1lYIC9GbyIkKElOVERJUikvIiAvYyAKLUNQUF9PQkpTPS5cZGpwZWdcUmVsZWFzZS8KLUNQUF9TQlJTPS5cLgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvZGpwZWcuYnNjIiAKLUJTQzMyX1NCUlM9IFwKLQkKLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIFJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotTElOSzMyX0ZMQUdTPVJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYlwKLSBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWJcCi0gb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vXAotIC9wZGI6IiQoT1VURElSKS9kanBlZy5wZGIiIC9tYWNoaW5lOkkzODYgL291dDoiJChPVVRESVIpL2RqcGVnLmV4ZSIgCi1MSU5LMzJfT0JKUz0gXAotCSIkKElOVERJUilcZGpwZWcub2JqIiBcCi0JIiQoSU5URElSKVx3cnBwbS5vYmoiIFwKLQkiJChJTlRESVIpXHdyZ2lmLm9iaiIgXAotCSIkKElOVERJUilcd3J0YXJnYS5vYmoiIFwKLQkiJChJTlRESVIpXHdycmxlLm9iaiIgXAotCSIkKElOVERJUilcd3JibXAub2JqIiBcCi0JIiQoSU5URElSKVxyZGNvbG1hcC5vYmoiIFwKLQkiJChJTlRESVIpXGNkanBlZy5vYmoiIFwKLQotCi0iJChPVVRESVIpXGRqcGVnLmV4ZSIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQotICAgICQoTElOSzMyKSBAPDwKLSAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCi08PAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAianBlZ3RyYW4gLSBXaW4zMiIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImpwZWd0cmFuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJqcGVndHJhblxSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAianBlZ3RyYW4iCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAianBlZ3RyYW5cUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJqcGVndHJhblxSZWxlYXNlIgotIyBQUk9QIFRhcmdldF9EaXIgImpwZWd0cmFuIgotT1VURElSPS5canBlZ3RyYW5cUmVsZWFzZQotSU5URElSPS5canBlZ3RyYW5cUmVsZWFzZQotCi1BTEwgOiAiJChPVVRESVIpXGpwZWd0cmFuLmV4ZSIKLQotQ0xFQU4gOiAKLQktQGVyYXNlICIkKElOVERJUilcanBlZ3RyYW4ub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxyZHN3aXRjaC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGNkanBlZy5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHRyYW5zdXBwLm9iaiIKLQktQGVyYXNlICIkKE9VVERJUilcanBlZ3RyYW4uZXhlIgotCi0iJChPVVRESVIpIiA6Ci0gICAgaWYgbm90IGV4aXN0ICIkKE9VVERJUikvJChOVUxMKSIgbWtkaXIgIiQoT1VURElSKSIKLQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCi1DUFBfUFJPSj0vbm9sb2dvIC9NTCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSJcCi0gL0ZwIiQoSU5URElSKS9qcGVndHJhbi5wY2giIC9ZWCAvRm8iJChJTlRESVIpLyIgL2MgCi1DUFBfT0JKUz0uXGpwZWd0cmFuXFJlbGVhc2UvCi1DUFBfU0JSUz0uXC4KLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUJTQzMyX0ZMQUdTPS9ub2xvZ28gL28iJChPVVRESVIpL2pwZWd0cmFuLmJzYyIgCi1CU0MzMl9TQlJTPSBcCi0JCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiBSZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLUxJTkszMl9GTEFHUz1SZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWJcCi0gY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliXAotIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9pbmNyZW1lbnRhbDpub1wKLSAvcGRiOiIkKE9VVERJUikvanBlZ3RyYW4ucGRiIiAvbWFjaGluZTpJMzg2IC9vdXQ6IiQoT1VURElSKS9qcGVndHJhbi5leGUiIAotTElOSzMyX09CSlM9IFwKLQkiJChJTlRESVIpXGpwZWd0cmFuLm9iaiIgXAotCSIkKElOVERJUilccmRzd2l0Y2gub2JqIiBcCi0JIiQoSU5URElSKVxjZGpwZWcub2JqIiBcCi0JIiQoSU5URElSKVx0cmFuc3VwcC5vYmoiIFwKLQotCi0iJChPVVRESVIpXGpwZWd0cmFuLmV4ZSIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQotICAgICQoTElOSzMyKSBAPDwKLSAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCi08PAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAicmRqcGdjb20gLSBXaW4zMiIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgInJkanBnY29tXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJyZGpwZ2NvbVxSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAicmRqcGdjb20iCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAicmRqcGdjb21cUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJyZGpwZ2NvbVxSZWxlYXNlIgotIyBQUk9QIFRhcmdldF9EaXIgInJkanBnY29tIgotT1VURElSPS5ccmRqcGdjb21cUmVsZWFzZQotSU5URElSPS5ccmRqcGdjb21cUmVsZWFzZQotCi1BTEwgOiAiJChPVVRESVIpXHJkanBnY29tLmV4ZSIKLQotQ0xFQU4gOiAKLQktQGVyYXNlICIkKElOVERJUilccmRqcGdjb20ub2JqIgotCS1AZXJhc2UgIiQoT1VURElSKVxyZGpwZ2NvbS5leGUiCi0KLSIkKE9VVERJUikiIDoKLSAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgotCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLUNQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIlwKLSAvRnAiJChJTlRESVIpL3JkanBnY29tLnBjaCIgL1lYIC9GbyIkKElOVERJUikvIiAvYyAKLUNQUF9PQkpTPS5ccmRqcGdjb21cUmVsZWFzZS8KLUNQUF9TQlJTPS5cLgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvcmRqcGdjb20uYnNjIiAKLUJTQzMyX1NCUlM9IFwKLQkKLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIFJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotTElOSzMyX0ZMQUdTPVJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYlwKLSBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWJcCi0gb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vXAotIC9wZGI6IiQoT1VURElSKS9yZGpwZ2NvbS5wZGIiIC9tYWNoaW5lOkkzODYgL291dDoiJChPVVRESVIpL3JkanBnY29tLmV4ZSIgCi1MSU5LMzJfT0JKUz0gXAotCSIkKElOVERJUilccmRqcGdjb20ub2JqIgotCi0iJChPVVRESVIpXHJkanBnY29tLmV4ZSIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQotICAgICQoTElOSzMyKSBAPDwKLSAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCi08PAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAid3JqcGdjb20gLSBXaW4zMiIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIndyanBnY29tXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ3cmpwZ2NvbVxSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAid3JqcGdjb20iCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAid3JqcGdjb21cUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ3cmpwZ2NvbVxSZWxlYXNlIgotIyBQUk9QIFRhcmdldF9EaXIgIndyanBnY29tIgotT1VURElSPS5cd3JqcGdjb21cUmVsZWFzZQotSU5URElSPS5cd3JqcGdjb21cUmVsZWFzZQotCi1BTEwgOiAiJChPVVRESVIpXHdyanBnY29tLmV4ZSIKLQotQ0xFQU4gOiAKLQktQGVyYXNlICIkKElOVERJUilcd3JqcGdjb20ub2JqIgotCS1AZXJhc2UgIiQoT1VURElSKVx3cmpwZ2NvbS5leGUiCi0KLSIkKE9VVERJUikiIDoKLSAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgotCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLUNQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIlwKLSAvRnAiJChJTlRESVIpL3dyanBnY29tLnBjaCIgL1lYIC9GbyIkKElOVERJUikvIiAvYyAKLUNQUF9PQkpTPS5cd3JqcGdjb21cUmVsZWFzZS8KLUNQUF9TQlJTPS5cLgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvd3JqcGdjb20uYnNjIiAKLUJTQzMyX1NCUlM9IFwKLQkKLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIFJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotTElOSzMyX0ZMQUdTPVJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYlwKLSBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWJcCi0gb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vXAotIC9wZGI6IiQoT1VURElSKS93cmpwZ2NvbS5wZGIiIC9tYWNoaW5lOkkzODYgL291dDoiJChPVVRESVIpL3dyanBnY29tLmV4ZSIgCi1MSU5LMzJfT0JKUz0gXAotCSIkKElOVERJUilcd3JqcGdjb20ub2JqIgotCi0iJChPVVRESVIpXHdyanBnY29tLmV4ZSIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQotICAgICQoTElOSzMyKSBAPDwKLSAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCi08PAotCi0hRU5ESUYgCi0KLS5jeyQoQ1BQX09CSlMpfS5vYmo6Ci0gICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAotCi0uY3BweyQoQ1BQX09CSlMpfS5vYmo6Ci0gICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAotCi0uY3h4eyQoQ1BQX09CSlMpfS5vYmo6Ci0gICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAotCi0uY3skKENQUF9TQlJTKX0uc2JyOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmNwcHskKENQUF9TQlJTKX0uc2JyOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmN4eHskKENQUF9TQlJTKX0uc2JyOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiY2pwZWcgLSBXaW4zMiIKLQotIUlGICAiJChDRkcpIiA9PSAiY2pwZWcgLSBXaW4zMiIKLQotIUVORElGIAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImNqcGVnLmMiCi1ERVBfQ1BQX0NKUEVHPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkianZlcnNpb24uaCJcCi0JCi0KLSIkKElOVERJUilcY2pwZWcub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfQ0pQRUcpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iY2RqcGVnLmMiCi1ERVBfQ1BQX0NESlBFPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxjZGpwZWcub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfQ0RKUEUpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0icmRzd2l0Y2guYyIKLURFUF9DUFBfUkRTV0k9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHJkc3dpdGNoLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEU1dJKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9InJkcHBtLmMiCi1ERVBfQ1BQX1JEUFBNPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxyZHBwbS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SRFBQTSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJyZGdpZi5jIgotREVQX0NQUF9SREdJRj1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilccmRnaWYub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRHSUYpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0icmR0YXJnYS5jIgotREVQX0NQUF9SRFRBUj1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilccmR0YXJnYS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SRFRBUikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJyZGJtcC5jIgotREVQX0NQUF9SREJNUD1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilccmRibXAub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRCTVApICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0icmRybGUuYyIKLURFUF9DUFBfUkRSTEU9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHJkcmxlLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEUkxFKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgImRqcGVnIC0gV2luMzIiCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImRqcGVnIC0gV2luMzIiCi0KLSFFTkRJRiAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJkanBlZy5jIgotREVQX0NQUF9ESlBFRz1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JImp2ZXJzaW9uLmgiXAotCQotCi0iJChJTlRESVIpXGRqcGVnLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0RKUEVHKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImNkanBlZy5jIgotREVQX0NQUF9DREpQRT1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcY2RqcGVnLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0NESlBFKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9InJkY29sbWFwLmMiCi1ERVBfQ1BQX1JEQ09MPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxyZGNvbG1hcC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SRENPTCkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJ3cnBwbS5jIgotREVQX0NQUF9XUlBQTT1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcd3JwcG0ub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfV1JQUE0pICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0id3JnaWYuYyIKLURFUF9DUFBfV1JHSUY9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHdyZ2lmLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1dSR0lGKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9IndydGFyZ2EuYyIKLURFUF9DUFBfV1JUQVI9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHdydGFyZ2Eub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfV1JUQVIpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0id3JibXAuYyIKLURFUF9DUFBfV1JCTVA9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHdyYm1wLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1dSQk1QKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9IndycmxlLmMiCi1ERVBfQ1BQX1dSUkxFPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVx3cnJsZS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9XUlJMRSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJqcGVndHJhbiAtIFdpbjMyIgotCi0hSUYgICIkKENGRykiID09ICJqcGVndHJhbiAtIFdpbjMyIgotCi0hRU5ESUYgCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0ianBlZ3RyYW4uYyIKLURFUF9DUFBfSlBFR1Q9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCSJ0cmFuc3VwcC5oIlwKLQkianZlcnNpb24uaCJcCi0JCi0KLSIkKElOVERJUilcanBlZ3RyYW4ub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSlBFR1QpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iY2RqcGVnLmMiCi1ERVBfQ1BQX0NESlBFPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxjZGpwZWcub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfQ0RKUEUpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0icmRzd2l0Y2guYyIKLURFUF9DUFBfUkRTV0k9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHJkc3dpdGNoLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEU1dJKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9InRyYW5zdXBwLmMiCi1ERVBfQ1BQX1RSQU5TPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JInRyYW5zdXBwLmgiXAotCQotCi0iJChJTlRESVIpXHRyYW5zdXBwLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1RSQU5TKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgInJkanBnY29tIC0gV2luMzIiCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gInJkanBnY29tIC0gV2luMzIiCi0KLSFFTkRJRiAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJyZGpwZ2NvbS5jIgotREVQX0NQUF9SREpQRz1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCQotCi0iJChJTlRESVIpXHJkanBnY29tLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JESlBHKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIndyanBnY29tIC0gV2luMzIiCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIndyanBnY29tIC0gV2luMzIiCi0KLSFFTkRJRiAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJ3cmpwZ2NvbS5jIgotREVQX0NQUF9XUkpQRz1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCQotCi0iJChJTlRESVIpXHdyanBnY29tLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1dSSlBHKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KZGlmZiAtLWdpdCBhL3VudXNlZC9tYWtlZmlsZS5iY2MgYi91bnVzZWQvbWFrZWZpbGUuYmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWNmY2RlLi4wMDAwMDAwCi0tLSBhL3VudXNlZC9tYWtlZmlsZS5iY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCi0KLSMgVGhpcyBtYWtlZmlsZSBpcyBzdWl0YWJsZSBmb3IgQm9ybGFuZCBDIG9uIE1TLURPUyBvciBPUy8yLgotIyBJdCB3b3JrcyB3aXRoIEJvcmxhbmQgQysrIGZvciBET1MsIHJldmlzaW9uIDMuMCBvciBsYXRlciwKLSMgYW5kIGhhcyBiZWVuIHRlc3RlZCB3aXRoIEJvcmxhbmQgQysrIGZvciBPUy8yLgotIyBXYXRjaCBvdXQgZm9yIG9wdGltaXphdGlvbiBidWdzIGluIHRoZSBPUy8yIGNvbXBpbGVycyAtLS0gc2VlIG5vdGVzIGJlbG93IQotIyBUaGFua3MgdG8gVG9tIFdyaWdodCBhbmQgR2UnIFdlaWplcnMgKG9yaWdpbmFsIERPUykgYW5kCi0jIEtlbiBQb3J0ZXIgKE9TLzIpIGZvciB0aGlzIGZpbGUuCi0KLSMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIm1ha2UiICEhCi0KLSMgQXJlIHdlIHVuZGVyIERPUyBvciBPUy8yPwotIWlmICEkZChET1MpICYmICEkZChPUzIpCi0haWYgJGQoX19PUzJfXykKLU9TMj0xCi0hZWxzZQotRE9TPTEKLSFlbmRpZgotIWVuZGlmCi0KLSMgVGhlIG5hbWUgb2YgeW91ciBDIGNvbXBpbGVyOgotQ0M9IGJjYwotCi0jIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY2Mgb3B0aW9uczoKLSFpZiAkZChET1MpCi1DRkxBR1M9IC1PMiAtbW0gLXctcGFyIC13LXN0dSAtdy1jY2MgLXctcmNoCi0hZWxzZQotQ0ZMQUdTPSAtTzEgLXctcGFyIC13LXN0dSAtdy1jY2MgLXctcmNoCi0hZW5kaWYKLSMgLU8yIGVuYWJsZXMgZnVsbCBjb2RlIG9wdGltaXphdGlvbiAoZm9yIHByZS0zLjAgQm9ybGFuZCBDKyssIHVzZSAtTyAtRyAtWikuCi0jIC1PMiBpcyBidWdneSBpbiBCb3JsYW5kIE9TLzIgQysrIHJldmlzaW9uIDIuMCwgc28gdXNlIC1PMSB0aGVyZSBmb3Igbm93LgotIyBJZiB5b3UgaGF2ZSBCb3JsYW5kIE9TLzIgQysrIHJldmlzaW9uIDEuMCwgdXNlIC1PIG9yIG5vIG9wdGltaXphdGlvbiBhdCBhbGwuCi0jIC1tbSBzZWxlY3RzIG1lZGl1bSBtZW1vcnkgbW9kZWwgKG5lYXIgZGF0YSwgZmFyIGNvZGUgcG9pbnRlcnM7IERPUyBvbmx5ISkKLSMgLXctcGFyIHN1cHByZXNzZXMgd2FybmluZ3MgYWJvdXQgdW51c2VkIGZ1bmN0aW9uIHBhcmFtZXRlcnMKLSMgLXctc3R1IHN1cHByZXNzZXMgd2FybmluZ3MgYWJvdXQgaW5jb21wbGV0ZSBzdHJ1Y3R1cmVzCi0jIC13LWNjYyBzdXBwcmVzc2VzIHdhcm5pbmdzIGFib3V0IGNvbXBpbGUtdGltZS1jb25zdGFudCBjb25kaXRpb25zCi0jIC13LXJjaCBzdXBwcmVzc2VzIHdhcm5pbmdzIGFib3V0IHVucmVhY2hhYmxlIGNvZGUKLSMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCi0jIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KLQotIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKLSFpZiAkZChET1MpCi1MREZMQUdTPSAtbW0KLSMgbWVtb3J5IG1vZGVsIG9wdGlvbiBoZXJlIG11c3QgbWF0Y2ggQ0ZMQUdTIQotIWVsc2UKLUxERkxBR1M9Ci0jIC1sYWkgZnVsbC1zY3JlZW4gYXBwCi0jIC1sYyBjYXNlLXNpZ25pZmljYW50IGxpbmsKLSFlbmRpZgotCi0jIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQotIyBtYW5hZ2VyIGZpbGUuCi0jIEZvciBET1MsIHdlIHJlY29tbWVuZCBqbWVtZG9zLmMgYW5kIGptZW1kb3NhLmFzbS4KLSMgRm9yIE9TLzIsIHdlIHJlY29tbWVuZCBqbWVtbm9icy5jIChmbGF0IG1lbW9yeSEpCi0jIFNZU0RFUE1FTUxJQiBtdXN0IGxpc3QgdGhlIHNhbWUgZmlsZXMgd2l0aCAiKyIgc2lnbnMgZm9yIHRoZSBsaWJyYXJpYW4uCi0haWYgJGQoRE9TKQotU1lTREVQTUVNPSBqbWVtZG9zLm9iaiBqbWVtZG9zYS5vYmoKLVNZU0RFUE1FTUxJQj0gK2ptZW1kb3Mub2JqICtqbWVtZG9zYS5vYmoKLSFlbHNlCi1TWVNERVBNRU09IGptZW1ub2JzLm9iagotU1lTREVQTUVNTElCPSAram1lbW5vYnMub2JqCi0hZW5kaWYKLQotIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCi0KLQotIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAotICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCi0jIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQotU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYwotIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQotQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKLSAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCi0gICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYwotU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKLSMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCi1JTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAotICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKLSMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0Ci1DT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCi0gICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAotICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KLVRFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCi0gICAgICAgIHRlc3RpbWdwLmpwZwotRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCi0gICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCi0jIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotQ09NT0JKRUNUUz0gamNvbWFwaS5vYmoganV0aWxzLm9iaiBqZXJyb3Iub2JqIGptZW1tZ3Iub2JqICQoU1lTREVQTUVNKQotIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm9iaiBqY2FwaXN0ZC5vYmogamN0cmFucy5vYmogamNwYXJhbS5vYmogamRhdGFkc3Qub2JqIFwKLSAgICAgICAgamNpbml0Lm9iaiBqY21hc3Rlci5vYmogamNtYXJrZXIub2JqIGpjbWFpbmN0Lm9iaiBqY3ByZXBjdC5vYmogXAotICAgICAgICBqY2NvZWZjdC5vYmogamNjb2xvci5vYmogamNzYW1wbGUub2JqIGpjaHVmZi5vYmogamNwaHVmZi5vYmogXAotICAgICAgICBqY2RjdG1nci5vYmogamZkY3Rmc3Qub2JqIGpmZGN0Zmx0Lm9iaiBqZmRjdGludC5vYmoKLSMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotRExJQk9CSkVDVFM9IGpkYXBpbWluLm9iaiBqZGFwaXN0ZC5vYmogamR0cmFucy5vYmogamRhdGFzcmMub2JqIFwKLSAgICAgICAgamRtYXN0ZXIub2JqIGpkaW5wdXQub2JqIGpkbWFya2VyLm9iaiBqZGh1ZmYub2JqIGpkcGh1ZmYub2JqIFwKLSAgICAgICAgamRtYWluY3Qub2JqIGpkY29lZmN0Lm9iaiBqZHBvc3RjdC5vYmogamRkY3RtZ3Iub2JqIGppZGN0ZnN0Lm9iaiBcCi0gICAgICAgIGppZGN0Zmx0Lm9iaiBqaWRjdGludC5vYmogamlkY3RyZWQub2JqIGpkc2FtcGxlLm9iaiBqZGNvbG9yLm9iaiBcCi0gICAgICAgIGpxdWFudDEub2JqIGpxdWFudDIub2JqIGpkbWVyZ2Uub2JqCi0jIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmxpYgotTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQotIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQotQ09CSkVDVFM9IGNqcGVnLm9iaiByZHBwbS5vYmogcmRnaWYub2JqIHJkdGFyZ2Eub2JqIHJkcmxlLm9iaiByZGJtcC5vYmogXAotICAgICAgICByZHN3aXRjaC5vYmogY2RqcGVnLm9iagotRE9CSkVDVFM9IGRqcGVnLm9iaiB3cnBwbS5vYmogd3JnaWYub2JqIHdydGFyZ2Eub2JqIHdycmxlLm9iaiB3cmJtcC5vYmogXAotICAgICAgICByZGNvbG1hcC5vYmogY2RqcGVnLm9iagotVFJPQkpFQ1RTPSBqcGVndHJhbi5vYmogcmRzd2l0Y2gub2JqIGNkanBlZy5vYmogdHJhbnN1cHAub2JqCi0KLQotYWxsOiBsaWJqcGVnLmxpYiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZSByZGpwZ2NvbS5leGUgd3JqcGdjb20uZXhlCi0KLWxpYmpwZWcubGliOiAkKExJQk9CSkVDVFMpCi0JLSBkZWwgbGlianBlZy5saWIKLQl0bGliIGxpYmpwZWcubGliIC9FIC9DIEAmJnwKLStqY2FwaW1pbi5vYmogK2pjYXBpc3RkLm9iaiAramN0cmFucy5vYmogK2pjcGFyYW0ub2JqICtqZGF0YWRzdC5vYmogJgotK2pjaW5pdC5vYmogK2pjbWFzdGVyLm9iaiAramNtYXJrZXIub2JqICtqY21haW5jdC5vYmogK2pjcHJlcGN0Lm9iaiAmCi0ramNjb2VmY3Qub2JqICtqY2NvbG9yLm9iaiAramNzYW1wbGUub2JqICtqY2h1ZmYub2JqICtqY3BodWZmLm9iaiAmCi0ramNkY3RtZ3Iub2JqICtqZmRjdGZzdC5vYmogK2pmZGN0Zmx0Lm9iaiAramZkY3RpbnQub2JqICtqZGFwaW1pbi5vYmogJgotK2pkYXBpc3RkLm9iaiAramR0cmFucy5vYmogK2pkYXRhc3JjLm9iaiAramRtYXN0ZXIub2JqICtqZGlucHV0Lm9iaiAmCi0ramRtYXJrZXIub2JqICtqZGh1ZmYub2JqICtqZHBodWZmLm9iaiAramRtYWluY3Qub2JqICtqZGNvZWZjdC5vYmogJgotK2pkcG9zdGN0Lm9iaiAramRkY3RtZ3Iub2JqICtqaWRjdGZzdC5vYmogK2ppZGN0Zmx0Lm9iaiAramlkY3RpbnQub2JqICYKLStqaWRjdHJlZC5vYmogK2pkc2FtcGxlLm9iaiAramRjb2xvci5vYmogK2pxdWFudDEub2JqICtqcXVhbnQyLm9iaiAmCi0ramRtZXJnZS5vYmogK2pjb21hcGkub2JqICtqdXRpbHMub2JqICtqZXJyb3Iub2JqICtqbWVtbWdyLm9iaiAmCi0kKFNZU0RFUE1FTUxJQikKLXwKLQotY2pwZWcuZXhlOiAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCSQoQ0MpICQoTERGTEFHUykgLWVjanBlZy5leGUgJChDT0JKRUNUUykgbGlianBlZy5saWIKLQotZGpwZWcuZXhlOiAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCSQoQ0MpICQoTERGTEFHUykgLWVkanBlZy5leGUgJChET0JKRUNUUykgbGlianBlZy5saWIKLQotanBlZ3RyYW4uZXhlOiAkKFRST0JKRUNUUykgbGlianBlZy5saWIKLQkkKENDKSAkKExERkxBR1MpIC1lanBlZ3RyYW4uZXhlICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCi1yZGpwZ2NvbS5leGU6IHJkanBnY29tLmMKLSFpZiAkZChET1MpCi0JJChDQykgLW1zIC1PIHJkanBnY29tLmMKLSFlbHNlCi0JJChDQykgJChDRkxBR1MpIHJkanBnY29tLmMKLSFlbmRpZgotCi0jIE9uIERPUywgd3JqcGdjb20gbmVlZHMgbGFyZ2UgbW9kZWwgc28gaXQgY2FuIG1hbGxvYyBhIDY0SyBjaHVuawotd3JqcGdjb20uZXhlOiB3cmpwZ2NvbS5jCi0haWYgJGQoRE9TKQotCSQoQ0MpIC1tbCAtTyB3cmpwZ2NvbS5jCi0hZWxzZQotCSQoQ0MpICQoQ0ZMQUdTKSB3cmpwZ2NvbS5jCi0hZW5kaWYKLQotIyBUaGlzICJ7fSIgc3ludGF4IGFsbG93cyBCb3JsYW5kIE1ha2UgdG8gImJhdGNoIiBzb3VyY2UgZmlsZXMuCi0jIEluIHRoaXMgd2F5LCBlYWNoIHJ1biBvZiB0aGUgY29tcGlsZXIgY2FuIGJ1aWxkIG1hbnkgbW9kdWxlcy4KLS5jLm9iajoKLQkkKENDKSAkKENGTEFHUykgLWN7ICQ8fQotCi1qY29uZmlnLmg6IGpjb25maWcuZG9jCi0JZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KLQllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KLQlleGl0IDEKLQotY2xlYW46Ci0JLSBkZWwgKi5vYmoKLQktIGRlbCBsaWJqcGVnLmxpYgotCS0gZGVsIGNqcGVnLmV4ZQotCS0gZGVsIGRqcGVnLmV4ZQotCS0gZGVsIGpwZWd0cmFuLmV4ZQotCS0gZGVsIHJkanBnY29tLmV4ZQotCS0gZGVsIHdyanBnY29tLmV4ZQotCS0gZGVsIHRlc3RvdXQqLioKLQotdGVzdDogY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUKLQktIGRlbCB0ZXN0b3V0Ki4qCi0JZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgdGVzdG9yaWcuanBnCi0JZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCi0JY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCi0JZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCi0JY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCi0JanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZwotIWlmICRkKERPUykKLQlmYyAvYiB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQotCWZjIC9iIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCi0JZmMgL2IgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKLQlmYyAvYiB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KLQlmYyAvYiB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCi0JZmMgL2IgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwotIWVsc2UKLQllY2hvIG4gPiBuLnRtcAotCWNvbXAgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0gPCBuLnRtcAotCWNvbXAgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAgPCBuLnRtcAotCWNvbXAgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcgPCBuLnRtcAotCWNvbXAgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtIDwgbi50bXAKLQljb21wIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcgPCBuLnRtcAotCWNvbXAgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZyA8IG4udG1wCi0JZGVsIG4udG1wCi0hZW5kaWYKLQotCi1qY2FwaW1pbi5vYmo6IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2FwaXN0ZC5vYmo6IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvZWZjdC5vYmo6IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvbG9yLm9iajogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNkY3RtZ3Iub2JqOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpjaHVmZi5vYmo6IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNpbml0Lm9iajogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21haW5jdC5vYmo6IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hcmtlci5vYmo6IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hc3Rlci5vYmo6IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY29tYXBpLm9iajogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwYXJhbS5vYmo6IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYub2JqOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY3ByZXBjdC5vYmo6IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3NhbXBsZS5vYmo6IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3RyYW5zLm9iajogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGltaW4ub2JqOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGlzdGQub2JqOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhdGFkc3Qub2JqOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGF0YXNyYy5vYmo6IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkY29lZmN0Lm9iajogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkY29sb3Iub2JqOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGRjdG1nci5vYmo6IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamRodWZmLm9iajogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZGlucHV0Lm9iajogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYWluY3Qub2JqOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXJrZXIub2JqOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXN0ZXIub2JqOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtZXJnZS5vYmo6IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkcGh1ZmYub2JqOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZHBvc3RjdC5vYmo6IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHNhbXBsZS5vYmo6IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHRyYW5zLm9iajogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamVycm9yLm9iajogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAotamZkY3RmbHQub2JqOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0ZnN0Lm9iajogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGludC5vYmo6IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RmbHQub2JqOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0ZnN0Lm9iajogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGludC5vYmo6IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RyZWQub2JqOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpxdWFudDEub2JqOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qcXVhbnQyLm9iajoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanV0aWxzLm9iajoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qbWVtbWdyLm9iajogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1hbnNpLm9iajogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbmFtZS5vYmo6IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5vYnMub2JqOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1kb3Mub2JqOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW1hYy5vYmo6IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1janBlZy5vYmo6IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWRqcGVnLm9iajogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotanBlZ3RyYW4ub2JqOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKLXJkanBnY29tLm9iajogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotd3JqcGdjb20ub2JqOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi1jZGpwZWcub2JqOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkY29sbWFwLm9iajogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkc3dpdGNoLm9iajogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXRyYW5zdXBwLm9iajogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAotcmRwcG0ub2JqOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JwcG0ub2JqOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRnaWYub2JqOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JnaWYub2JqOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmR0YXJnYS5vYmo6IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdydGFyZ2Eub2JqOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGJtcC5vYmo6IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmJtcC5vYmo6IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHJsZS5vYmo6IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnJsZS5vYmo6IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1qbWVtZG9zYS5vYmo6IGptZW1kb3NhLmFzbQotCXRhc20gL214IGptZW1kb3NhLmFzbQpkaWZmIC0tZ2l0IGEvdW51c2VkL21ha2VmaWxlLm1hbnggYi91bnVzZWQvbWFrZWZpbGUubWFueApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNiNDJkMS4uMDAwMDAwMAotLS0gYS91bnVzZWQvbWFrZWZpbGUubWFueAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKLQotIyBUaGlzIG1ha2VmaWxlIGlzIGZvciBBbWlnYSBzeXN0ZW1zIHVzaW5nIE1hbnggQXp0ZWMgQyB2ZXIgNS54LgotIyBUaGFua3MgdG8gRC5KLiBKYW1lcyAoZGpqYW1lc0BjdXAucG9ydGFsLmNvbSkgZm9yIHRoaXMgdmVyc2lvbi4KLQotIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibWFrZSIgISEKLQotIyBUaGUgbmFtZSBvZiB5b3VyIEMgY29tcGlsZXI6Ci1DQz0gY2MKLQotIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6Ci0jIFVuY29tbWVudCBmb3IgZ2VuZXJpYyA2ODAwMCBjb2RlICh3aWxsIHdvcmsgb24gYW55IEFtaWdhKQotQVJDSEZMQUdTPSAtc24KLQotIyBVbmNvbW1lbnQgZm9yIDY4MDIwLzY4MDMwIGNvZGUgKGZhc3RlciwgYnV0IHdvbid0IHJ1biBvbiA2ODAwMCBDUFUpCi0jQVJDSEZMQUdTPSAtYzIKLQotQ0ZMQUdTPSAtTUMgLU1EICQoQVJDSEZMQUdTKSAtc3BmYW0gLXI0Ci0KLSMgTGluay10aW1lIGNjIG9wdGlvbnM6Ci1MREZMQUdTPSAtZwotCi0jIFRvIGxpbmsgYW55IHNwZWNpYWwgbGlicmFyaWVzLCBhZGQgdGhlIG5lY2Vzc2FyeSAtbCBjb21tYW5kcyBoZXJlLgotTERMSUJTPSAtbG1sIC1sY2wKLQotIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKLSMgbWFuYWdlciBmaWxlLiAgRm9yIEFtaWdhIHdlIHJlY29tbWVuZCBqbWVtbmFtZS5vLgotU1lTREVQTUVNPSBqbWVtbmFtZS5vCi0KLSMgbWlzY2VsbGFuZW91cyBPUy1kZXBlbmRlbnQgc3R1ZmYKLSMgbGlua2VyCi1MTj0gbG4KLSMgZmlsZSBkZWxldGlvbiBjb21tYW5kCi1STT0gZGVsZXRlIHF1aWV0Ci0jIGxpYnJhcnkgKC5saWIpIGZpbGUgY3JlYXRpb24gY29tbWFuZAotQVI9IGxiCi0KLSMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgotCi0KLSMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCi1MSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCi0gICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAotICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAotICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCi0gICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKLSAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAotICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKLSAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYwotIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKLVNZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKLSMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KLUFQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyBcCi0gICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgXAotICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKLVNPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCi0jIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcwotSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKLSAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCi0jIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCi1ET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAotICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAotICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCi1NS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAotICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAotICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAotICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKLSAgICAgICAgbWFrdm1zLm9wdAotQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAotICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKLSAgICAgICAgamNvbmZpZy52bXMKLUNPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAotT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCi1URVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAotICAgICAgICB0ZXN0aW1ncC5qcGcKLURJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAotICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQotIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLUNPTU9CSkVDVFM9IGpjb21hcGkubyBqdXRpbHMubyBqZXJyb3IubyBqbWVtbWdyLm8gJChTWVNERVBNRU0pCi0jIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1DTElCT0JKRUNUUz0gamNhcGltaW4ubyBqY2FwaXN0ZC5vIGpjdHJhbnMubyBqY3BhcmFtLm8gamRhdGFkc3QubyBqY2luaXQubyBcCi0gICAgICAgIGpjbWFzdGVyLm8gamNtYXJrZXIubyBqY21haW5jdC5vIGpjcHJlcGN0Lm8gamNjb2VmY3QubyBqY2NvbG9yLm8gXAotICAgICAgICBqY3NhbXBsZS5vIGpjaHVmZi5vIGpjcGh1ZmYubyBqY2RjdG1nci5vIGpmZGN0ZnN0Lm8gamZkY3RmbHQubyBcCi0gICAgICAgIGpmZGN0aW50Lm8KLSMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotRExJQk9CSkVDVFM9IGpkYXBpbWluLm8gamRhcGlzdGQubyBqZHRyYW5zLm8gamRhdGFzcmMubyBqZG1hc3Rlci5vIFwKLSAgICAgICAgamRpbnB1dC5vIGpkbWFya2VyLm8gamRodWZmLm8gamRwaHVmZi5vIGpkbWFpbmN0Lm8gamRjb2VmY3QubyBcCi0gICAgICAgIGpkcG9zdGN0Lm8gamRkY3RtZ3IubyBqaWRjdGZzdC5vIGppZGN0Zmx0Lm8gamlkY3RpbnQubyBqaWRjdHJlZC5vIFwKLSAgICAgICAgamRzYW1wbGUubyBqZGNvbG9yLm8ganF1YW50MS5vIGpxdWFudDIubyBqZG1lcmdlLm8KLSMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcubGliCi1MSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCi0jIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCi1DT0JKRUNUUz0gY2pwZWcubyByZHBwbS5vIHJkZ2lmLm8gcmR0YXJnYS5vIHJkcmxlLm8gcmRibXAubyByZHN3aXRjaC5vIFwKLSAgICAgICAgY2RqcGVnLm8KLURPQkpFQ1RTPSBkanBlZy5vIHdycHBtLm8gd3JnaWYubyB3cnRhcmdhLm8gd3JybGUubyB3cmJtcC5vIHJkY29sbWFwLm8gXAotICAgICAgICBjZGpwZWcubwotVFJPQkpFQ1RTPSBqcGVndHJhbi5vIHJkc3dpdGNoLm8gY2RqcGVnLm8gdHJhbnN1cHAubwotCi0KLWFsbDogbGlianBlZy5saWIgY2pwZWcgZGpwZWcganBlZ3RyYW4gcmRqcGdjb20gd3JqcGdjb20KLQotbGlianBlZy5saWI6ICQoTElCT0JKRUNUUykKLQktJChSTSkgbGlianBlZy5saWIKLQkkKEFSKSBsaWJqcGVnLmxpYiAgJChMSUJPQkpFQ1RTKQotCi1janBlZzogJChDT0JKRUNUUykgbGlianBlZy5saWIKLQkkKExOKSAkKExERkxBR1MpIC1vIGNqcGVnICQoQ09CSkVDVFMpIGxpYmpwZWcubGliICQoTERMSUJTKQotCi1kanBlZzogJChET0JKRUNUUykgbGlianBlZy5saWIKLQkkKExOKSAkKExERkxBR1MpIC1vIGRqcGVnICQoRE9CSkVDVFMpIGxpYmpwZWcubGliICQoTERMSUJTKQotCi1qcGVndHJhbjogJChUUk9CSkVDVFMpIGxpYmpwZWcubGliCi0JJChMTikgJChMREZMQUdTKSAtbyBqcGVndHJhbiAkKFRST0JKRUNUUykgbGlianBlZy5saWIgJChMRExJQlMpCi0KLXJkanBnY29tOiByZGpwZ2NvbS5vCi0JJChMTikgJChMREZMQUdTKSAtbyByZGpwZ2NvbSByZGpwZ2NvbS5vICQoTERMSUJTKQotCi13cmpwZ2NvbTogd3JqcGdjb20ubwotCSQoTE4pICQoTERGTEFHUykgLW8gd3JqcGdjb20gd3JqcGdjb20ubyAkKExETElCUykKLQotamNvbmZpZy5oOiBqY29uZmlnLmRvYwotCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCi0JZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCi0JZXhpdCAxCi0KLWNsZWFuOgotCS0kKFJNKSAqLm8gY2pwZWcgZGpwZWcganBlZ3RyYW4gbGlianBlZy5saWIgcmRqcGdjb20gd3JqcGdjb20KLQktJChSTSkgY29yZSB0ZXN0b3V0Ki4qCi0KLXRlc3Q6IGNqcGVnIGRqcGVnIGpwZWd0cmFuCi0JLSQoUk0pIHRlc3RvdXQqLioKLQlkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtICB0ZXN0b3JpZy5qcGcKLQlkanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlIHRlc3RvdXQuYm1wICB0ZXN0b3JpZy5qcGcKLQljanBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAgdGVzdGltZy5wcG0KLQlkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKLQljanBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSB0ZXN0b3V0cC5qcGcgdGVzdGltZy5wcG0KLQlqcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCi0JY21wIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtCi0JY21wIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCi0JY21wIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCi0JY21wIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQotCWNtcCB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCi0JY21wIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKLQotCi1qY2FwaW1pbi5vOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNhcGlzdGQubzogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29lZmN0Lm86IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvbG9yLm86IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjZGN0bWdyLm86IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNpbml0Lm86IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYWluY3QubzogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFya2VyLm86IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hc3Rlci5vOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNvbWFwaS5vOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BhcmFtLm86IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYubzogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNwcmVwY3QubzogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjc2FtcGxlLm86IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3RyYW5zLm86IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpbWluLm86IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaXN0ZC5vOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhdGFkc3QubzogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRhdGFzcmMubzogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRjb2VmY3QubzogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkY29sb3IubzogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRkY3RtZ3IubzogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZGh1ZmYubzogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZGlucHV0Lm86IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFpbmN0Lm86IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hcmtlci5vOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXN0ZXIubzogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWVyZ2UubzogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRwaHVmZi5vOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZHBvc3RjdC5vOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRzYW1wbGUubzogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkdHJhbnMubzogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamVycm9yLm86IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKLWpmZGN0Zmx0Lm86IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3Rmc3QubzogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGludC5vOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0Zmx0Lm86IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3Rmc3QubzogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGludC5vOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0cmVkLm86IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotanF1YW50MS5vOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qcXVhbnQyLm86IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWp1dGlscy5vOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWptZW1tZ3Iubzogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1hbnNpLm86IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5hbWUubzogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbm9icy5vOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1kb3Mubzogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1tYWMubzogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWNqcGVnLm86IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWRqcGVnLm86IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWpwZWd0cmFuLm86IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAotcmRqcGdjb20ubzogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotd3JqcGdjb20ubzogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotY2RqcGVnLm86IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRjb2xtYXAubzogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkc3dpdGNoLm86IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi10cmFuc3VwcC5vOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCi1yZHBwbS5vOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JwcG0ubzogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkZ2lmLm86IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmdpZi5vOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmR0YXJnYS5vOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnRhcmdhLm86IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkYm1wLm86IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmJtcC5vOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRybGUubzogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycmxlLm86IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS91bnVzZWQvbWFrZWZpbGUubWM2IGIvdW51c2VkL21ha2VmaWxlLm1jNgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFmZjA1NC4uMDAwMDAwMAotLS0gYS91bnVzZWQvbWFrZWZpbGUubWM2CisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotCi0jIFRoaXMgbWFrZWZpbGUgaXMgZm9yIE1pY3Jvc29mdCBDIGZvciBNUy1ET1MsIHZlcnNpb24gNi4wMEEgYW5kIHVwLgotIyBVc2UgTk1BS0UsIG5vdCBNaWNyb3NvZnQncyBicmFpbi1kYW1hZ2VkIE1BS0UuCi0jIFRoYW5rcyB0byBBbGFuIFdyaWdodCBhbmQgQ2hyaXMgVHVybmVyIG9mIE9saXZldHRpIFJlc2VhcmNoIEx0ZC4KLQotIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibm1ha2UiICEhCi0KLSMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjb21waWxlciBvcHRpb25zOgotQ0ZMQUdTID0gLUFNIC1PZWNpZ3QgLUdzIC1XMwotIyAtQU0gbWVkaXVtIG1lbW9yeSBtb2RlbCAob3IgdXNlIC1BUyBmb3Igc21hbGwgbW9kZWwsIGlmIHlvdSByZW1vdmUgZmVhdHVyZXMpCi0jIC1PZWNpZ3QgLUdzICBtYXhpbXVtIHNhZmUgb3B0aW1pc2F0aW9uICgtT2wgaGFzIGJ1Z3MgaW4gTVNDIDYuMDBBKQotIyAtVzMgd2FybmluZyBsZXZlbCAzCi0jIFlvdSBtaWdodCBhbHNvIHdhbnQgdG8gYWRkIC1HMiBpZiB5b3UgaGF2ZSBhbiA4MDI4NiwgZXRjLgotIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKLSMgTk9UIHZpYSAtRCBzd2l0Y2hlcyBoZXJlLgotCi0jIEphbi1IZXJtYW4gQnVpbmluZyBzdWdnZXN0cyB0aGUgZm9sbG93aW5nIHN3aXRjaGVzIGZvciBNUyBDIDguMCBhbmQgYSA0ODY6Ci0jIENGTEFHUyA9IC9BTSAvZi0gL0ZQaTg3IC9HMyAvR3MgL0d5IC9PYjEgL09jIC9PZSAvT2cgL09pIC9PbCAvT24gL09vIC9PdCBcCi0jICAgICAgICAgIC9PVjQgL1czCi0jIGV4Y2VwdCBmb3IganF1YW50MS5jLCB3aGljaCBtdXN0IGJlIGNvbXBpbGVkIHdpdGggL09vLSB0byBhdm9pZCBhIGNvbXBpbGVyCi0jIGNyYXNoLgotCi0jIEluZ2FyIFN0ZWluc2xhbmQgc3VnZ2VzdHMgdGhlIGZvbGxvd2luZyBzd2l0Y2hlcyB3aGVuIGJ1aWxkaW5nCi0jIGEgMTYtYml0IFdpbmRvd3MgRExMOgotIyBDRkxBR1MgPSAtQUx3IC1Hc3cgLVpwZSAtVzMgLU8yIC1aaSAtWmQKLQotIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKLSMgbWFuYWdlciBmaWxlLiAgRm9yIERPUywgd2UgcmVjb21tZW5kIGptZW1kb3MuYyBhbmQgam1lbWRvc2EuYXNtLgotIyAoQnV0IG5vdCBmb3IgV2luZG93czsgc2VlIGluc3RhbGwuZG9jIGlmIHlvdSB1c2UgdGhpcyBtYWtlZmlsZSBmb3IgV2luZG93cy4pCi1TWVNERVBNRU09IGptZW1kb3Mub2JqIGptZW1kb3NhLm9iagotIyBTWVNERVBNRU1MSUIgbXVzdCBsaXN0IHRoZSBzYW1lIGZpbGVzIHdpdGggIisiIHNpZ25zIGZvciB0aGUgbGlicmFyaWFuLgotU1lTREVQTUVNTElCPSAram1lbWRvcy5vYmogK2ptZW1kb3NhLm9iagotCi0jIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KLQotCi0jIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgotTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAotICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKLSAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKLSAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAotICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCi0gICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKLSAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCi0gICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKLSMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5Ci1TWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCi0jIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCi1BUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAotICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKLSAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCi1TT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQotIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKLUlOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCi0gICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAotIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcwotRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKLSAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKLSAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZwotTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKLSAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKLSAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKLSAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCi0gICAgICAgIG1ha3Ztcy5vcHQKLUNPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKLSAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCi0gICAgICAgIGpjb25maWcudm1zCi1DT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKLU9USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQotVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKLSAgICAgICAgdGVzdGltZ3AuanBnCi1ESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKLSAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKLSMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1DT01PQkpFQ1RTPSBqY29tYXBpLm9iaiBqdXRpbHMub2JqIGplcnJvci5vYmogam1lbW1nci5vYmogJChTWVNERVBNRU0pCi0jIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1DTElCT0JKRUNUUz0gamNhcGltaW4ub2JqIGpjYXBpc3RkLm9iaiBqY3RyYW5zLm9iaiBqY3BhcmFtLm9iaiBqZGF0YWRzdC5vYmogXAotICAgICAgICBqY2luaXQub2JqIGpjbWFzdGVyLm9iaiBqY21hcmtlci5vYmogamNtYWluY3Qub2JqIGpjcHJlcGN0Lm9iaiBcCi0gICAgICAgIGpjY29lZmN0Lm9iaiBqY2NvbG9yLm9iaiBqY3NhbXBsZS5vYmogamNodWZmLm9iaiBqY3BodWZmLm9iaiBcCi0gICAgICAgIGpjZGN0bWdyLm9iaiBqZmRjdGZzdC5vYmogamZkY3RmbHQub2JqIGpmZGN0aW50Lm9iagotIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1ETElCT0JKRUNUUz0gamRhcGltaW4ub2JqIGpkYXBpc3RkLm9iaiBqZHRyYW5zLm9iaiBqZGF0YXNyYy5vYmogXAotICAgICAgICBqZG1hc3Rlci5vYmogamRpbnB1dC5vYmogamRtYXJrZXIub2JqIGpkaHVmZi5vYmogamRwaHVmZi5vYmogXAotICAgICAgICBqZG1haW5jdC5vYmogamRjb2VmY3Qub2JqIGpkcG9zdGN0Lm9iaiBqZGRjdG1nci5vYmogamlkY3Rmc3Qub2JqIFwKLSAgICAgICAgamlkY3RmbHQub2JqIGppZGN0aW50Lm9iaiBqaWRjdHJlZC5vYmogamRzYW1wbGUub2JqIGpkY29sb3Iub2JqIFwKLSAgICAgICAganF1YW50MS5vYmoganF1YW50Mi5vYmogamRtZXJnZS5vYmoKLSMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcubGliCi1MSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCi0jIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCi1DT0JKRUNUUz0gY2pwZWcub2JqIHJkcHBtLm9iaiByZGdpZi5vYmogcmR0YXJnYS5vYmogcmRybGUub2JqIHJkYm1wLm9iaiBcCi0gICAgICAgIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqCi1ET0JKRUNUUz0gZGpwZWcub2JqIHdycHBtLm9iaiB3cmdpZi5vYmogd3J0YXJnYS5vYmogd3JybGUub2JqIHdyYm1wLm9iaiBcCi0gICAgICAgIHJkY29sbWFwLm9iaiBjZGpwZWcub2JqCi1UUk9CSkVDVFM9IGpwZWd0cmFuLm9iaiByZHN3aXRjaC5vYmogY2RqcGVnLm9iaiB0cmFuc3VwcC5vYmoKLQotIyBuZWVkIGxpbmtlciByZXNwb25zZSBmaWxlIGJlY2F1c2UgZmlsZSBsaXN0ID4gMTI4IGNoYXJzCi1SRklMRSA9IGxpYmpwZWcuYW5zCi0KLQotYWxsOiBsaWJqcGVnLmxpYiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZSByZGpwZ2NvbS5leGUgd3JqcGdjb20uZXhlCi0KLWxpYmpwZWcubGliOiAkKExJQk9CSkVDVFMpICQoUkZJTEUpCi0JZGVsIGxpYmpwZWcubGliCi0JbGliIEAkKFJGSUxFKQotCi0jIGxpbmtlciByZXNwb25zZSBmaWxlIGZvciBidWlsZGluZyBsaWJqcGVnLmxpYgotJChSRklMRSkgOiBtYWtlZmlsZQotCWRlbCAkKFJGSUxFKQotCWVjaG8gbGlianBlZy5saWIgPiQoUkZJTEUpCi0jIHNpbGx5IHdhbnQtdG8tY3JlYXRlLWl0IHByb21wdDoKLQllY2hvIHkgPj4kKFJGSUxFKQotCWVjaG8gK2pjYXBpbWluLm9iaiAramNhcGlzdGQub2JqICtqY3RyYW5zLm9iaiAramNwYXJhbS5vYmogJiA+PiQoUkZJTEUpCi0JZWNobyAramRhdGFkc3Qub2JqICtqY2luaXQub2JqICtqY21hc3Rlci5vYmogK2pjbWFya2VyLm9iaiAmID4+JChSRklMRSkKLQllY2hvICtqY21haW5jdC5vYmogK2pjcHJlcGN0Lm9iaiAramNjb2VmY3Qub2JqICYgPj4kKFJGSUxFKQotCWVjaG8gK2pjY29sb3Iub2JqICtqY3NhbXBsZS5vYmogK2pjaHVmZi5vYmogK2pjcGh1ZmYub2JqICYgPj4kKFJGSUxFKQotCWVjaG8gK2pjZGN0bWdyLm9iaiAramZkY3Rmc3Qub2JqICtqZmRjdGZsdC5vYmogJiA+PiQoUkZJTEUpCi0JZWNobyAramZkY3RpbnQub2JqICtqZGFwaW1pbi5vYmogK2pkYXBpc3RkLm9iaiAmID4+JChSRklMRSkKLQllY2hvICtqZHRyYW5zLm9iaiAramRhdGFzcmMub2JqICtqZG1hc3Rlci5vYmogK2pkaW5wdXQub2JqICYgPj4kKFJGSUxFKQotCWVjaG8gK2pkbWFya2VyLm9iaiAramRodWZmLm9iaiAramRwaHVmZi5vYmogK2pkbWFpbmN0Lm9iaiAmID4+JChSRklMRSkKLQllY2hvICtqZGNvZWZjdC5vYmogK2pkcG9zdGN0Lm9iaiAramRkY3RtZ3Iub2JqICYgPj4kKFJGSUxFKQotCWVjaG8gK2ppZGN0ZnN0Lm9iaiAramlkY3RmbHQub2JqICtqaWRjdGludC5vYmogJiA+PiQoUkZJTEUpCi0JZWNobyAramlkY3RyZWQub2JqICtqZHNhbXBsZS5vYmogK2pkY29sb3Iub2JqICtqcXVhbnQxLm9iaiAmID4+JChSRklMRSkKLQllY2hvICtqcXVhbnQyLm9iaiAramRtZXJnZS5vYmogK2pjb21hcGkub2JqICtqdXRpbHMub2JqICYgPj4kKFJGSUxFKQotCWVjaG8gK2plcnJvci5vYmogK2ptZW1tZ3Iub2JqICYgPj4kKFJGSUxFKQotCWVjaG8gJChTWVNERVBNRU1MSUIpIDsgPj4kKFJGSUxFKQotCi1janBlZy5leGU6ICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCi0JZWNobyAkKENPQkpFQ1RTKSA+Y2pwZWcubHN0Ci0JbGluayAvU1RBQ0s6NDA5NiAvRVhFUEFDSyBAY2pwZWcubHN0LCBjanBlZy5leGUsICwgbGlianBlZy5saWIsIDsKLQlkZWwgY2pwZWcubHN0Ci0KLWRqcGVnLmV4ZTogJChET0JKRUNUUykgbGlianBlZy5saWIKLQllY2hvICQoRE9CSkVDVFMpID5kanBlZy5sc3QKLQlsaW5rIC9TVEFDSzo0MDk2IC9FWEVQQUNLIEBkanBlZy5sc3QsIGRqcGVnLmV4ZSwgLCBsaWJqcGVnLmxpYiwgOwotCWRlbCBkanBlZy5sc3QKLQotanBlZ3RyYW4uZXhlOiAkKFRST0JKRUNUUykgbGlianBlZy5saWIKLQlsaW5rIC9TVEFDSzo0MDk2IC9FWEVQQUNLICQoVFJPQkpFQ1RTKSwganBlZ3RyYW4uZXhlLCAsIGxpYmpwZWcubGliLCA7Ci0KLXJkanBnY29tLmV4ZTogcmRqcGdjb20uYwotCSQoQ0MpIC1BUyAtTyAtVzMgcmRqcGdjb20uYwotCi0jIHdyanBnY29tIG5lZWRzIGxhcmdlIG1vZGVsIHNvIGl0IGNhbiBtYWxsb2MgYSA2NEsgY2h1bmsKLXdyanBnY29tLmV4ZTogd3JqcGdjb20uYwotCSQoQ0MpIC1BTCAtTyAtVzMgd3JqcGdjb20uYwotCi1qY29uZmlnLmg6IGpjb25maWcuZG9jCi0JZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KLQllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KLQlleGl0IDEKLQotY2xlYW46Ci0JZGVsICoub2JqCi0JZGVsIGxpYmpwZWcubGliCi0JZGVsIGNqcGVnLmV4ZQotCWRlbCBkanBlZy5leGUKLQlkZWwganBlZ3RyYW4uZXhlCi0JZGVsIHJkanBnY29tLmV4ZQotCWRlbCB3cmpwZ2NvbS5leGUKLQlkZWwgdGVzdG91dCouKgotCi10ZXN0OiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZQotCWRlbCB0ZXN0b3V0Ki4qCi0JZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgdGVzdG9yaWcuanBnCi0JZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCi0JY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCi0JZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCi0JY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCi0JanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZwotCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtCi0JZmMgL2IgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKLQlmYyAvYiB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZwotCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQotCWZjIC9iIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKLQlmYyAvYiB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCi0KLQotamNhcGltaW4ub2JqOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNhcGlzdGQub2JqOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2VmY3Qub2JqOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2xvci5vYmo6IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjZGN0bWdyLm9iajogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qY2h1ZmYub2JqOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjaW5pdC5vYmo6IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYWluY3Qub2JqOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXJrZXIub2JqOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXN0ZXIub2JqOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNvbWFwaS5vYmo6IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGFyYW0ub2JqOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BodWZmLm9iajogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNwcmVwY3Qub2JqOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNzYW1wbGUub2JqOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamN0cmFucy5vYmo6IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpbWluLm9iajogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpc3RkLm9iajogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXRhZHN0Lm9iajogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRhdGFzcmMub2JqOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGNvZWZjdC5vYmo6IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGNvbG9yLm9iajogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRkY3RtZ3Iub2JqOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpkaHVmZi5vYmo6IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRpbnB1dC5vYmo6IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFpbmN0Lm9iajogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFya2VyLm9iajogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFzdGVyLm9iajogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWVyZ2Uub2JqOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHBodWZmLm9iajogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRwb3N0Y3Qub2JqOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRzYW1wbGUub2JqOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamR0cmFucy5vYmo6IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWplcnJvci5vYmo6IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKLWpmZGN0Zmx0Lm9iajogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGZzdC5vYmo6IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3RpbnQub2JqOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0Zmx0Lm9iajogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGZzdC5vYmo6IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RpbnQub2JqOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0cmVkLm9iajogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qcXVhbnQxLm9iajoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanF1YW50Mi5vYmo6IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWp1dGlscy5vYmo6IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotam1lbW1nci5vYmo6IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtYW5zaS5vYmo6IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5hbWUub2JqOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1ub2JzLm9iajogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtZG9zLm9iajogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1tYWMub2JqOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotY2pwZWcub2JqOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1kanBlZy5vYmo6IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWpwZWd0cmFuLm9iajoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCi1yZGpwZ2NvbS5vYmo6IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLXdyanBnY29tLm9iajogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotY2RqcGVnLm9iajogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGNvbG1hcC5vYmo6IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHN3aXRjaC5vYmo6IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi10cmFuc3VwcC5vYmo6IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKLXJkcHBtLm9iajogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycHBtLm9iajogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkZ2lmLm9iajogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyZ2lmLm9iajogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkdGFyZ2Eub2JqOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnRhcmdhLm9iajogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRibXAub2JqOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JibXAub2JqOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRybGUub2JqOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JybGUub2JqOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotam1lbWRvc2Eub2JqIDogam1lbWRvc2EuYXNtCi0JbWFzbSAvbXggJCo7CmRpZmYgLS1naXQgYS91bnVzZWQvbWFrZWZpbGUubW1zIGIvdW51c2VkL21ha2VmaWxlLm1tcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxMzBlNS4uMDAwMDAwMAotLS0gYS91bnVzZWQvbWFrZWZpbGUubW1zCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotCi0jIFRoaXMgbWFrZWZpbGUgaXMgZm9yIHVzZSB3aXRoIE1NUyBvbiBEaWdpdGFsIFZNUyBzeXN0ZW1zLgotIyBUaGFua3MgdG8gUmljayBEeXNvbiAoZHlzb25AaW93YXNwLnBoeXNpY3MudWlvd2EuZWR1KQotIyBhbmQgVGltIEJlbGwgKHRiZWxsQG5ldGNvbS5jb20pIGZvciB0aGVpciBoZWxwLgotCi0jIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJNTVMiICEhCi0KLSMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgotQ0ZMQUdTPSAkKENGTEFHUykgL05vRGVidWcgL09wdGltaXplCi0jIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAotIyBOT1QgdmlhIC9EZWZpbmUgc3dpdGNoZXMgaGVyZS4KLS5pZmRlZiBBTFBIQQotT1BUPQotLmVsc2UKLU9QVD0gLFN5cyREaXNrOltdTUFLVk1TLk9QVC9PcHRpb24KLS5lbmRpZgotCi0jIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQotIyBtYW5hZ2VyIGZpbGUuICBGb3IgVW5peCB0aGlzIGlzIHVzdWFsbHkgam1lbW5vYnMubywgYnV0IHlvdSBtYXkgd2FudAotIyB0byB1c2Ugam1lbWFuc2kubyBvciBqbWVtbmFtZS5vIGlmIHlvdSBoYXZlIGxpbWl0ZWQgc3dhcCBzcGFjZS4KLVNZU0RFUE1FTT0gam1lbW5vYnMub2JqCi0KLSMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgotCi0KLSMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCi1MSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCi0gICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAotICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAotICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCi0gICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKLSAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAotICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKLSAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYwotIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKLVNZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKLSMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KLUFQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyBcCi0gICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgXAotICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKLVNPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCi0jIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcwotSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKLSAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCi0jIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCi1ET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAotICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAotICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCi1NS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAotICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAotICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAotICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKLSAgICAgICAgbWFrdm1zLm9wdAotQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAotICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKLSAgICAgICAgamNvbmZpZy52bXMKLUNPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAotT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCi1URVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAotICAgICAgICB0ZXN0aW1ncC5qcGcKLURJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAotICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQotIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLUNPTU9CSkVDVFM9IGpjb21hcGkub2JqIGp1dGlscy5vYmogamVycm9yLm9iaiBqbWVtbWdyLm9iaiAkKFNZU0RFUE1FTSkKLSMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLUNMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vYmogamNhcGlzdGQub2JqIGpjdHJhbnMub2JqIGpjcGFyYW0ub2JqIGpkYXRhZHN0Lm9iaiBcCi0gICAgICAgIGpjaW5pdC5vYmogamNtYXN0ZXIub2JqIGpjbWFya2VyLm9iaiBqY21haW5jdC5vYmogamNwcmVwY3Qub2JqIFwKLSAgICAgICAgamNjb2VmY3Qub2JqIGpjY29sb3Iub2JqIGpjc2FtcGxlLm9iaiBqY2h1ZmYub2JqIGpjcGh1ZmYub2JqIFwKLSAgICAgICAgamNkY3RtZ3Iub2JqIGpmZGN0ZnN0Lm9iaiBqZmRjdGZsdC5vYmogamZkY3RpbnQub2JqCi0jIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLURMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vYmogamRhcGlzdGQub2JqIGpkdHJhbnMub2JqIGpkYXRhc3JjLm9iaiBcCi0gICAgICAgIGpkbWFzdGVyLm9iaiBqZGlucHV0Lm9iaiBqZG1hcmtlci5vYmogamRodWZmLm9iaiBqZHBodWZmLm9iaiBcCi0gICAgICAgIGpkbWFpbmN0Lm9iaiBqZGNvZWZjdC5vYmogamRwb3N0Y3Qub2JqIGpkZGN0bWdyLm9iaiBqaWRjdGZzdC5vYmogXAotICAgICAgICBqaWRjdGZsdC5vYmogamlkY3RpbnQub2JqIGppZGN0cmVkLm9iaiBqZHNhbXBsZS5vYmogamRjb2xvci5vYmogXAotICAgICAgICBqcXVhbnQxLm9iaiBqcXVhbnQyLm9iaiBqZG1lcmdlLm9iagotIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5vbGIKLUxJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKLSMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKLUNPQkpFQ1RTPSBjanBlZy5vYmogcmRwcG0ub2JqIHJkZ2lmLm9iaiByZHRhcmdhLm9iaiByZHJsZS5vYmogcmRibXAub2JqIFwKLSAgICAgICAgcmRzd2l0Y2gub2JqIGNkanBlZy5vYmoKLURPQkpFQ1RTPSBkanBlZy5vYmogd3JwcG0ub2JqIHdyZ2lmLm9iaiB3cnRhcmdhLm9iaiB3cnJsZS5vYmogd3JibXAub2JqIFwKLSAgICAgICAgcmRjb2xtYXAub2JqIGNkanBlZy5vYmoKLVRST0JKRUNUUz0ganBlZ3RyYW4ub2JqIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqIHRyYW5zdXBwLm9iagotIyBvYmplY3RmaWxlIGxpc3RzIHdpdGggY29tbWFzIC0tLSB3aGF0IGEgY3JvY2sKLUNPQkpMSVNUPSBjanBlZy5vYmoscmRwcG0ub2JqLHJkZ2lmLm9iaixyZHRhcmdhLm9iaixyZHJsZS5vYmoscmRibXAub2JqLFwKLSAgICAgICAgICByZHN3aXRjaC5vYmosY2RqcGVnLm9iagotRE9CSkxJU1Q9IGRqcGVnLm9iaix3cnBwbS5vYmosd3JnaWYub2JqLHdydGFyZ2Eub2JqLHdycmxlLm9iaix3cmJtcC5vYmosXAotICAgICAgICAgIHJkY29sbWFwLm9iaixjZGpwZWcub2JqCi1UUk9CSkxJU1Q9IGpwZWd0cmFuLm9iaixyZHN3aXRjaC5vYmosY2RqcGVnLm9iaix0cmFuc3VwcC5vYmoKLUxJQk9CSkxJU1Q9IGpjYXBpbWluLm9iaixqY2FwaXN0ZC5vYmosamN0cmFucy5vYmosamNwYXJhbS5vYmosamRhdGFkc3Qub2JqLFwKLSAgICAgICAgICBqY2luaXQub2JqLGpjbWFzdGVyLm9iaixqY21hcmtlci5vYmosamNtYWluY3Qub2JqLGpjcHJlcGN0Lm9iaixcCi0gICAgICAgICAgamNjb2VmY3Qub2JqLGpjY29sb3Iub2JqLGpjc2FtcGxlLm9iaixqY2h1ZmYub2JqLGpjcGh1ZmYub2JqLFwKLSAgICAgICAgICBqY2RjdG1nci5vYmosamZkY3Rmc3Qub2JqLGpmZGN0Zmx0Lm9iaixqZmRjdGludC5vYmosamRhcGltaW4ub2JqLFwKLSAgICAgICAgICBqZGFwaXN0ZC5vYmosamR0cmFucy5vYmosamRhdGFzcmMub2JqLGpkbWFzdGVyLm9iaixqZGlucHV0Lm9iaixcCi0gICAgICAgICAgamRtYXJrZXIub2JqLGpkaHVmZi5vYmosamRwaHVmZi5vYmosamRtYWluY3Qub2JqLGpkY29lZmN0Lm9iaixcCi0gICAgICAgICAgamRwb3N0Y3Qub2JqLGpkZGN0bWdyLm9iaixqaWRjdGZzdC5vYmosamlkY3RmbHQub2JqLGppZGN0aW50Lm9iaixcCi0gICAgICAgICAgamlkY3RyZWQub2JqLGpkc2FtcGxlLm9iaixqZGNvbG9yLm9iaixqcXVhbnQxLm9iaixqcXVhbnQyLm9iaixcCi0gICAgICAgICAgamRtZXJnZS5vYmosamNvbWFwaS5vYmosanV0aWxzLm9iaixqZXJyb3Iub2JqLGptZW1tZ3Iub2JqLCQoU1lTREVQTUVNKQotCi0KLS5maXJzdAotCUAtIERlZmluZSAvTm9Mb2cgU3lzIFN5cyRMaWJyYXJ5Ci0KLUFMTCA6IGxpYmpwZWcub2xiIGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlIHJkanBnY29tLmV4ZSB3cmpwZ2NvbS5leGUKLQlAIENvbnRpbnVlCi0KLWxpYmpwZWcub2xiIDogJChMSUJPQkpFQ1RTKQotCUxpYnJhcnkgL0NyZWF0ZSBsaWJqcGVnLm9sYiAkKExJQk9CSkxJU1QpCi0KLWNqcGVnLmV4ZSA6ICQoQ09CSkVDVFMpIGxpYmpwZWcub2xiCi0JJChMSU5LKSAkKExGTEFHUykgL0V4ZWN1dGFibGUgPSBjanBlZy5leGUgJChDT0JKTElTVCksbGlianBlZy5vbGIvTGlicmFyeSQoT1BUKQotCi1kanBlZy5leGUgOiAkKERPQkpFQ1RTKSBsaWJqcGVnLm9sYgotCSQoTElOSykgJChMRkxBR1MpIC9FeGVjdXRhYmxlID0gZGpwZWcuZXhlICQoRE9CSkxJU1QpLGxpYmpwZWcub2xiL0xpYnJhcnkkKE9QVCkKLQotanBlZ3RyYW4uZXhlIDogJChUUk9CSkVDVFMpIGxpYmpwZWcub2xiCi0JJChMSU5LKSAkKExGTEFHUykgL0V4ZWN1dGFibGUgPSBqcGVndHJhbi5leGUgJChUUk9CSkxJU1QpLGxpYmpwZWcub2xiL0xpYnJhcnkkKE9QVCkKLQotcmRqcGdjb20uZXhlIDogcmRqcGdjb20ub2JqCi0JJChMSU5LKSAkKExGTEFHUykgL0V4ZWN1dGFibGUgPSByZGpwZ2NvbS5leGUgcmRqcGdjb20ub2JqJChPUFQpCi0KLXdyanBnY29tLmV4ZSA6IHdyanBnY29tLm9iagotCSQoTElOSykgJChMRkxBR1MpIC9FeGVjdXRhYmxlID0gd3JqcGdjb20uZXhlIHdyanBnY29tLm9iaiQoT1BUKQotCi1qY29uZmlnLmggOiBqY29uZmlnLnZtcwotCUAtIENvcHkgamNvbmZpZy52bXMgamNvbmZpZy5oCi0KLWNsZWFuIDoKLQlALSBTZXQgUHJvdGVjdGlvbiA9IE93bmVyOlJXRUQgKi4qOy0xCi0JQC0gU2V0IFByb3RlY3Rpb24gPSBPd25lcjpSV0VEICouT0JKCi0JLSBQdXJnZSAvTm9Mb2cgL05vQ29uZmlybSAqLioKLQktIERlbGV0ZSAvTm9Mb2cgL05vQ29uZmlybSAqLk9CSjsKLQotdGVzdCA6IGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlCi0JbWNyIHN5cyRkaXNrOltdZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSB0ZXN0b3JpZy5qcGcKLQltY3Igc3lzJGRpc2s6W11kanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlIHRlc3RvdXQuYm1wIHRlc3RvcmlnLmpwZwotCW1jciBzeXMkZGlzazpbXWNqcGVnIC1kY3QgaW50ICAgICAgLW91dGZpbGUgdGVzdG91dC5qcGcgdGVzdGltZy5wcG0KLQltY3Igc3lzJGRpc2s6W11kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKLQltY3Igc3lzJGRpc2s6W11janBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSB0ZXN0b3V0cC5qcGcgdGVzdGltZy5wcG0KLQltY3Igc3lzJGRpc2s6W11qcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCi0JLSBCYWNrdXAgL0NvbXBhcmUvTG9nCSAgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KLQktIEJhY2t1cCAvQ29tcGFyZS9Mb2cJICB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAotCS0gQmFja3VwIC9Db21wYXJlL0xvZwkgIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCi0JLSBCYWNrdXAgL0NvbXBhcmUvTG9nCSAgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCi0JLSBCYWNrdXAgL0NvbXBhcmUvTG9nCSAgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZwotCS0gQmFja3VwIC9Db21wYXJlL0xvZwkgIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKLQotCi1qY2FwaW1pbi5vYmogOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNhcGlzdGQub2JqIDogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29lZmN0Lm9iaiA6IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvbG9yLm9iaiA6IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjZGN0bWdyLm9iaiA6IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm9iaiA6IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNpbml0Lm9iaiA6IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYWluY3Qub2JqIDogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFya2VyLm9iaiA6IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hc3Rlci5vYmogOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNvbWFwaS5vYmogOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BhcmFtLm9iaiA6IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYub2JqIDogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNwcmVwY3Qub2JqIDogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjc2FtcGxlLm9iaiA6IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3RyYW5zLm9iaiA6IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpbWluLm9iaiA6IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaXN0ZC5vYmogOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhdGFkc3Qub2JqIDogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRhdGFzcmMub2JqIDogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRjb2VmY3Qub2JqIDogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkY29sb3Iub2JqIDogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRkY3RtZ3Iub2JqIDogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZGh1ZmYub2JqIDogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZGlucHV0Lm9iaiA6IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFpbmN0Lm9iaiA6IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hcmtlci5vYmogOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXN0ZXIub2JqIDogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWVyZ2Uub2JqIDogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRwaHVmZi5vYmogOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZHBvc3RjdC5vYmogOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRzYW1wbGUub2JqIDogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkdHJhbnMub2JqIDogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamVycm9yLm9iaiA6IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKLWpmZGN0Zmx0Lm9iaiA6IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3Rmc3Qub2JqIDogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGludC5vYmogOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0Zmx0Lm9iaiA6IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3Rmc3Qub2JqIDogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGludC5vYmogOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0cmVkLm9iaiA6IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotanF1YW50MS5vYmogOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qcXVhbnQyLm9iaiA6IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWp1dGlscy5vYmogOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWptZW1tZ3Iub2JqIDogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1hbnNpLm9iaiA6IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5hbWUub2JqIDogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbm9icy5vYmogOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1kb3Mub2JqIDogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1tYWMub2JqIDogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWNqcGVnLm9iaiA6IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWRqcGVnLm9iaiA6IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWpwZWd0cmFuLm9iaiA6IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAotcmRqcGdjb20ub2JqIDogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotd3JqcGdjb20ub2JqIDogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotY2RqcGVnLm9iaiA6IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRjb2xtYXAub2JqIDogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkc3dpdGNoLm9iaiA6IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi10cmFuc3VwcC5vYmogOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCi1yZHBwbS5vYmogOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JwcG0ub2JqIDogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkZ2lmLm9iaiA6IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmdpZi5vYmogOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmR0YXJnYS5vYmogOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnRhcmdhLm9iaiA6IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkYm1wLm9iaiA6IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmJtcC5vYmogOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRybGUub2JqIDogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycmxlLm9iaiA6IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS91bnVzZWQvbWFrZWZpbGUuc2FzIGIvdW51c2VkL21ha2VmaWxlLnNhcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5NmZhZi4uMDAwMDAwMAotLS0gYS91bnVzZWQvbWFrZWZpbGUuc2FzCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotCi0jIFRoaXMgbWFrZWZpbGUgaXMgZm9yIEFtaWdhIHN5c3RlbXMgdXNpbmcgU0FTIEMgNi4wIGFuZCB1cC4KLSMgVGhhbmtzIHRvIEVkIEhhbndheSwgTWFyayBSaW5mcmV0LCBhbmQgSmltIFplcGVkYS4KLQotIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibWFrZSIgISEKLQotIyBUaGUgbmFtZSBvZiB5b3VyIEMgY29tcGlsZXI6Ci1DQz0gc2MKLQotIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6Ci0jIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmVzIGZvciBnZW5lcmljIDY4MHgwIHZlcnNpb24KLUFSQ0hGTEFHUz0gY3B1PWFueQotU1VGRklYPQotCi0jIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmVzIGZvciA2ODAzMC1vbmx5IHZlcnNpb24KLSNBUkNIRkxBR1M9IGNwdT02ODAzMAotI1NVRkZJWD0uMDMwCi0KLUNGTEFHUz0gbm9zdGFja2NoZWNrIGRhdGE9bmVhciBwYXJtcz1yZWdpc3RlciBvcHRpbWl6ZSAkKEFSQ0hGTEFHUykgXAotCWlnbm9yZT0xMDQgaWdub3JlPTMwNCBpZ25vcmU9MzA2Ci0jIGlnbm9yZT0xMDQgZGlzYWJsZXMgd2FybmluZ3MgZm9yIG1pc21hdGNoZWQgY29uc3QgcXVhbGlmaWVycwotIyBpZ25vcmU9MzA0IGRpc2FibGVzIHdhcm5pbmdzIGZvciB2YXJpYWJsZXMgYmVpbmcgb3B0aW1pemVkIG91dAotIyBpZ25vcmU9MzA2IGRpc2FibGVzIHdhcm5pbmdzIGZvciB0aGUgaW5saW5pbmcgb2YgZnVuY3Rpb25zCi0jIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAotIyBOT1QgdmlhIGRlZmluZSBzd2l0Y2hlcyBoZXJlLgotCi0jIExpbmstdGltZSBjYyBvcHRpb25zOgotTERGTEFHUz0gU0MgU0QgTkQgQkFUQ0gKLQotIyBUbyBsaW5rIGFueSBzcGVjaWFsIGxpYnJhcmllcywgYWRkIHRoZSBuZWNlc3NhcnkgY29tbWFuZHMgaGVyZS4KLUxETElCUz0gTElCOnNjbS5saWIgTElCOnNjLmxpYgotCi0jIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQotIyBtYW5hZ2VyIGZpbGUuICBGb3IgQW1pZ2Egd2UgcmVjb21tZW5kIGptZW1uYW1lLm8uCi1TWVNERVBNRU09IGptZW1uYW1lLm8KLQotIyBtaXNjZWxsYW5lb3VzIE9TLWRlcGVuZGVudCBzdHVmZgotIyBsaW5rZXIKLUxOPSBzbGluawotIyBmaWxlIGRlbGV0aW9uIGNvbW1hbmQKLVJNPSBkZWxldGUgcXVpZXQKLSMgbGlicmFyeSAoLmxpYikgZmlsZSBjcmVhdGlvbiBjb21tYW5kCi1BUj0gb21sCi0KLSMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgotCi0KLSMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCi1MSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCi0gICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAotICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAotICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCi0gICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKLSAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAotICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKLSAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYwotIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKLVNZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKLSMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KLUFQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyBcCi0gICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgXAotICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKLVNPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCi0jIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcwotSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKLSAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCi0jIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCi1ET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAotICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAotICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCi1NS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAotICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAotICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAotICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKLSAgICAgICAgbWFrdm1zLm9wdAotQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAotICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKLSAgICAgICAgamNvbmZpZy52bXMKLUNPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAotT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCi1URVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAotICAgICAgICB0ZXN0aW1ncC5qcGcKLURJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAotICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQotIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLUNPTU9CSkVDVFM9IGpjb21hcGkubyBqdXRpbHMubyBqZXJyb3IubyBqbWVtbWdyLm8gJChTWVNERVBNRU0pCi0jIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1DTElCT0JKRUNUUz0gamNhcGltaW4ubyBqY2FwaXN0ZC5vIGpjdHJhbnMubyBqY3BhcmFtLm8gamRhdGFkc3QubyBqY2luaXQubyBcCi0gICAgICAgIGpjbWFzdGVyLm8gamNtYXJrZXIubyBqY21haW5jdC5vIGpjcHJlcGN0Lm8gamNjb2VmY3QubyBqY2NvbG9yLm8gXAotICAgICAgICBqY3NhbXBsZS5vIGpjaHVmZi5vIGpjcGh1ZmYubyBqY2RjdG1nci5vIGpmZGN0ZnN0Lm8gamZkY3RmbHQubyBcCi0gICAgICAgIGpmZGN0aW50Lm8KLSMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotRExJQk9CSkVDVFM9IGpkYXBpbWluLm8gamRhcGlzdGQubyBqZHRyYW5zLm8gamRhdGFzcmMubyBqZG1hc3Rlci5vIFwKLSAgICAgICAgamRpbnB1dC5vIGpkbWFya2VyLm8gamRodWZmLm8gamRwaHVmZi5vIGpkbWFpbmN0Lm8gamRjb2VmY3QubyBcCi0gICAgICAgIGpkcG9zdGN0Lm8gamRkY3RtZ3IubyBqaWRjdGZzdC5vIGppZGN0Zmx0Lm8gamlkY3RpbnQubyBqaWRjdHJlZC5vIFwKLSAgICAgICAgamRzYW1wbGUubyBqZGNvbG9yLm8ganF1YW50MS5vIGpxdWFudDIubyBqZG1lcmdlLm8KLSMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcubGliCi1MSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCi0jIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCi1DT0JKRUNUUz0gY2pwZWcubyByZHBwbS5vIHJkZ2lmLm8gcmR0YXJnYS5vIHJkcmxlLm8gcmRibXAubyByZHN3aXRjaC5vIFwKLSAgICAgICAgY2RqcGVnLm8KLURPQkpFQ1RTPSBkanBlZy5vIHdycHBtLm8gd3JnaWYubyB3cnRhcmdhLm8gd3JybGUubyB3cmJtcC5vIHJkY29sbWFwLm8gXAotICAgICAgICBjZGpwZWcubwotVFJPQkpFQ1RTPSBqcGVndHJhbi5vIHJkc3dpdGNoLm8gY2RqcGVnLm8gdHJhbnN1cHAubwotCi0KLWFsbDogbGlianBlZy5saWIgY2pwZWckKFNVRkZJWCkgZGpwZWckKFNVRkZJWCkganBlZ3RyYW4kKFNVRkZJWCkgcmRqcGdjb20kKFNVRkZJWCkgd3JqcGdjb20kKFNVRkZJWCkKLQotIyBub3RlOiBkbyBzZXZlcmFsIEFSIHN0ZXBzIHRvIGF2b2lkIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRhdGlvbnMKLQotbGlianBlZy5saWI6ICQoTElCT0JKRUNUUykKLQktJChSTSkgbGlianBlZy5saWIKLQkkKEFSKSBsaWJqcGVnLmxpYiByICQoQ0xJQk9CSkVDVFMpCi0JJChBUikgbGlianBlZy5saWIgciAkKERMSUJPQkpFQ1RTKQotCSQoQVIpIGxpYmpwZWcubGliIHIgJChDT01PQkpFQ1RTKQotCi1janBlZyQoU1VGRklYKTogJChDT0JKRUNUUykgbGlianBlZy5saWIKLQkkKExOKSA8V0lUSCA8Ci0kKExERkxBR1MpCi1UTyBjanBlZyQoU1VGRklYKQotRlJPTSBMSUI6Yy5vICQoQ09CSkVDVFMpCi1MSUIgbGlianBlZy5saWIgJChMRExJQlMpCi08Ci0KLWRqcGVnJChTVUZGSVgpOiAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCSQoTE4pIDxXSVRIIDwKLSQoTERGTEFHUykKLVRPIGRqcGVnJChTVUZGSVgpCi1GUk9NIExJQjpjLm8gJChET0JKRUNUUykKLUxJQiBsaWJqcGVnLmxpYiAkKExETElCUykKLTwKLQotanBlZ3RyYW4kKFNVRkZJWCk6ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCSQoTE4pIDxXSVRIIDwKLSQoTERGTEFHUykKLVRPIGpwZWd0cmFuJChTVUZGSVgpCi1GUk9NIExJQjpjLm8gJChUUk9CSkVDVFMpCi1MSUIgbGlianBlZy5saWIgJChMRExJQlMpCi08Ci0KLXJkanBnY29tJChTVUZGSVgpOiByZGpwZ2NvbS5vCi0JJChMTikgPFdJVEggPAotJChMREZMQUdTKQotVE8gcmRqcGdjb20kKFNVRkZJWCkKLUZST00gTElCOmMubyByZGpwZ2NvbS5vCi1MSUIgJChMRExJQlMpCi08Ci0KLXdyanBnY29tJChTVUZGSVgpOiB3cmpwZ2NvbS5vCi0JJChMTikgPFdJVEggPAotJChMREZMQUdTKQotVE8gd3JqcGdjb20kKFNVRkZJWCkKLUZST00gTElCOmMubyB3cmpwZ2NvbS5vCi1MSUIgJChMRExJQlMpCi08Ci0KLWpjb25maWcuaDogamNvbmZpZy5kb2MKLQllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgotCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgotCWV4aXQgMQotCi1jbGVhbjoKLQktJChSTSkgKi5vIGNqcGVnIGRqcGVnIGpwZWd0cmFuIGNqcGVnLjAzMCBkanBlZy4wMzAganBlZ3RyYW4uMDMwCi0JLSQoUk0pIHJkanBnY29tIHdyanBnY29tIHJkanBnY29tLjAzMCB3cmpwZ2NvbS4wMzAKLQktJChSTSkgbGlianBlZy5saWIgY29yZSB0ZXN0b3V0Ki4qCi0KLXRlc3Q6IGNqcGVnIGRqcGVnIGpwZWd0cmFuCi0JLSQoUk0pIHRlc3RvdXQqLioKLQlkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtICB0ZXN0b3JpZy5qcGcKLQlkanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlIHRlc3RvdXQuYm1wICB0ZXN0b3JpZy5qcGcKLQljanBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAgdGVzdGltZy5wcG0KLQlkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKLQljanBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSB0ZXN0b3V0cC5qcGcgdGVzdGltZy5wcG0KLQlqcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCi0JY21wIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtCi0JY21wIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCi0JY21wIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCi0JY21wIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQotCWNtcCB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCi0JY21wIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKLQotCi1qY2FwaW1pbi5vOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNhcGlzdGQubzogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29lZmN0Lm86IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvbG9yLm86IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjZGN0bWdyLm86IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNpbml0Lm86IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYWluY3QubzogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFya2VyLm86IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hc3Rlci5vOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNvbWFwaS5vOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BhcmFtLm86IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYubzogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNwcmVwY3QubzogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjc2FtcGxlLm86IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3RyYW5zLm86IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpbWluLm86IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaXN0ZC5vOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhdGFkc3QubzogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRhdGFzcmMubzogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRjb2VmY3QubzogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkY29sb3IubzogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRkY3RtZ3IubzogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZGh1ZmYubzogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZGlucHV0Lm86IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFpbmN0Lm86IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hcmtlci5vOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXN0ZXIubzogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWVyZ2UubzogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRwaHVmZi5vOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZHBvc3RjdC5vOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRzYW1wbGUubzogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkdHJhbnMubzogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamVycm9yLm86IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKLWpmZGN0Zmx0Lm86IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3Rmc3QubzogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGludC5vOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0Zmx0Lm86IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3Rmc3QubzogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGludC5vOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0cmVkLm86IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotanF1YW50MS5vOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qcXVhbnQyLm86IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWp1dGlscy5vOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWptZW1tZ3Iubzogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1hbnNpLm86IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5hbWUubzogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbm9icy5vOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1kb3Mubzogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1tYWMubzogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWNqcGVnLm86IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWRqcGVnLm86IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWpwZWd0cmFuLm86IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAotcmRqcGdjb20ubzogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotd3JqcGdjb20ubzogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotY2RqcGVnLm86IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRjb2xtYXAubzogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkc3dpdGNoLm86IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi10cmFuc3VwcC5vOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCi1yZHBwbS5vOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JwcG0ubzogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkZ2lmLm86IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmdpZi5vOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmR0YXJnYS5vOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnRhcmdhLm86IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkYm1wLm86IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmJtcC5vOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRybGUubzogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycmxlLm86IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS91bnVzZWQvbWFrZWZpbGUudm1zIGIvdW51c2VkL21ha2VmaWxlLnZtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyMzU4ZC4uMDAwMDAwMAotLS0gYS91bnVzZWQvbWFrZWZpbGUudm1zCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLSQhIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKLSQhCi0kISBUaGlzIGlzIGEgY29tbWFuZCBwcm9jZWR1cmUgZm9yIERpZ2l0YWwgVk1TIHN5c3RlbXMgdGhhdCBkbyBub3QgaGF2ZSBNTVMuCi0kISBJdCBidWlsZHMgdGhlIEpQRUcgc29mdHdhcmUgYnkgYnJ1dGUgZm9yY2UsIHJlY29tcGlsaW5nIGV2ZXJ5dGhpbmcgd2hldGhlcgotJCEgb3Igbm90IGl0IGlzIG5lY2Vzc2FyeS4gIEl0IHRoZW4gcnVucyB0aGUgYmFzaWMgc2VsZi10ZXN0LgotJCEgVGhhbmtzIHRvIFJpY2sgRHlzb24gKGR5c29uQGlvd2FzcC5waHlzaWNzLnVpb3dhLmVkdSkKLSQhIGFuZCBUaW0gQmVsbCAodGJlbGxAbmV0Y29tLmNvbSkgZm9yIHRoZWlyIGhlbHAuCi0kIQotJCEgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBydW5uaW5nIHRoaXMhIQotJCEKLSQgSWYgRiRNb2RlICgpIC5lcXMuICJJTlRFUkFDVElWRSIKLSQgICBUaGVuCi0kICAgICAgIFZFUklGWSA9IEYkVmVyaWZ5ICgwKQotJCAgIEVsc2UKLSQgICAgICAgVkVSSUZZID0gRiRWZXJpZnkgKDEpCi0kIEVuZElmCi0kIE9uIENvbnRyb2xfWSBUaGVuIEdvVG8gRW5kCi0kIE9uIEVycm9yICAgICBUaGVuIEdvVG8gRW5kCi0kCi0kIElmIEYkR2V0U3lpICgiSFdfTU9ERUwiKSAuZ3QuIDEwMjMgCi0kICAgVGhlbgotJCAgICAgICBPUFQgPSAiIgotJCAgIEVsc2UKLSQgICAgICAgT1BUID0gIixTeXMkRGlzazpbXW1ha3Ztcy5vcHQvT3B0aW9uIgotJCBFbmRJZgotJCAKLSQgRG9Db21waWxlIDo9IENDIC9Ob0RlYnVnIC9PcHRpbWl6ZSAvTm9MaXN0Ci0kIQotJCBEb0NvbXBpbGUgamNhcGltaW4uYwotJCBEb0NvbXBpbGUgamNhcGlzdGQuYwotJCBEb0NvbXBpbGUgamN0cmFucy5jCi0kIERvQ29tcGlsZSBqY3BhcmFtLmMKLSQgRG9Db21waWxlIGpkYXRhZHN0LmMKLSQgRG9Db21waWxlIGpjaW5pdC5jCi0kIERvQ29tcGlsZSBqY21hc3Rlci5jCi0kIERvQ29tcGlsZSBqY21hcmtlci5jCi0kIERvQ29tcGlsZSBqY21haW5jdC5jCi0kIERvQ29tcGlsZSBqY3ByZXBjdC5jCi0kIERvQ29tcGlsZSBqY2NvZWZjdC5jCi0kIERvQ29tcGlsZSBqY2NvbG9yLmMKLSQgRG9Db21waWxlIGpjc2FtcGxlLmMKLSQgRG9Db21waWxlIGpjaHVmZi5jCi0kIERvQ29tcGlsZSBqY3BodWZmLmMKLSQgRG9Db21waWxlIGpjZGN0bWdyLmMKLSQgRG9Db21waWxlIGpmZGN0ZnN0LmMKLSQgRG9Db21waWxlIGpmZGN0Zmx0LmMKLSQgRG9Db21waWxlIGpmZGN0aW50LmMKLSQgRG9Db21waWxlIGpkYXBpbWluLmMKLSQgRG9Db21waWxlIGpkYXBpc3RkLmMKLSQgRG9Db21waWxlIGpkdHJhbnMuYwotJCBEb0NvbXBpbGUgamRhdGFzcmMuYwotJCBEb0NvbXBpbGUgamRtYXN0ZXIuYwotJCBEb0NvbXBpbGUgamRpbnB1dC5jCi0kIERvQ29tcGlsZSBqZG1hcmtlci5jCi0kIERvQ29tcGlsZSBqZGh1ZmYuYwotJCBEb0NvbXBpbGUgamRwaHVmZi5jCi0kIERvQ29tcGlsZSBqZG1haW5jdC5jCi0kIERvQ29tcGlsZSBqZGNvZWZjdC5jCi0kIERvQ29tcGlsZSBqZHBvc3RjdC5jCi0kIERvQ29tcGlsZSBqZGRjdG1nci5jCi0kIERvQ29tcGlsZSBqaWRjdGZzdC5jCi0kIERvQ29tcGlsZSBqaWRjdGZsdC5jCi0kIERvQ29tcGlsZSBqaWRjdGludC5jCi0kIERvQ29tcGlsZSBqaWRjdHJlZC5jCi0kIERvQ29tcGlsZSBqZHNhbXBsZS5jCi0kIERvQ29tcGlsZSBqZGNvbG9yLmMKLSQgRG9Db21waWxlIGpxdWFudDEuYwotJCBEb0NvbXBpbGUganF1YW50Mi5jCi0kIERvQ29tcGlsZSBqZG1lcmdlLmMKLSQgRG9Db21waWxlIGpjb21hcGkuYwotJCBEb0NvbXBpbGUganV0aWxzLmMKLSQgRG9Db21waWxlIGplcnJvci5jCi0kIERvQ29tcGlsZSBqbWVtbWdyLmMKLSQgRG9Db21waWxlIGptZW1ub2JzLmMKLSQhCi0kIExpYnJhcnkgL0NyZWF0ZSBsaWJqcGVnLm9sYiAgamNhcGltaW4ub2JqLGpjYXBpc3RkLm9iaixqY3RyYW5zLm9iaiwgLQotICAgICAgICAgIGpjcGFyYW0ub2JqLGpkYXRhZHN0Lm9iaixqY2luaXQub2JqLGpjbWFzdGVyLm9iaixqY21hcmtlci5vYmosIC0KLSAgICAgICAgICBqY21haW5jdC5vYmosamNwcmVwY3Qub2JqLGpjY29lZmN0Lm9iaixqY2NvbG9yLm9iaixqY3NhbXBsZS5vYmosIC0KLSAgICAgICAgICBqY2h1ZmYub2JqLGpjcGh1ZmYub2JqLGpjZGN0bWdyLm9iaixqZmRjdGZzdC5vYmosamZkY3RmbHQub2JqLCAtCi0gICAgICAgICAgamZkY3RpbnQub2JqLGpkYXBpbWluLm9iaixqZGFwaXN0ZC5vYmosamR0cmFucy5vYmosamRhdGFzcmMub2JqLCAtCi0gICAgICAgICAgamRtYXN0ZXIub2JqLGpkaW5wdXQub2JqLGpkbWFya2VyLm9iaixqZGh1ZmYub2JqLGpkcGh1ZmYub2JqLCAtCi0gICAgICAgICAgamRtYWluY3Qub2JqLGpkY29lZmN0Lm9iaixqZHBvc3RjdC5vYmosamRkY3RtZ3Iub2JqLGppZGN0ZnN0Lm9iaiwgLQotICAgICAgICAgIGppZGN0Zmx0Lm9iaixqaWRjdGludC5vYmosamlkY3RyZWQub2JqLGpkc2FtcGxlLm9iaixqZGNvbG9yLm9iaiwgLQotICAgICAgICAgIGpxdWFudDEub2JqLGpxdWFudDIub2JqLGpkbWVyZ2Uub2JqLGpjb21hcGkub2JqLGp1dGlscy5vYmosIC0KLSAgICAgICAgICBqZXJyb3Iub2JqLGptZW1tZ3Iub2JqLGptZW1ub2JzLm9iagotJCEKLSQgRG9Db21waWxlIGNqcGVnLmMKLSQgRG9Db21waWxlIHJkcHBtLmMKLSQgRG9Db21waWxlIHJkZ2lmLmMKLSQgRG9Db21waWxlIHJkdGFyZ2EuYwotJCBEb0NvbXBpbGUgcmRybGUuYwotJCBEb0NvbXBpbGUgcmRibXAuYwotJCBEb0NvbXBpbGUgcmRzd2l0Y2guYwotJCBEb0NvbXBpbGUgY2RqcGVnLmMKLSQhCi0kIExpbmsgL05vTWFwIC9FeGVjdXRhYmxlID0gY2pwZWcuZXhlICBjanBlZy5vYmoscmRwcG0ub2JqLHJkZ2lmLm9iaiwgLQotICAgICAgICAgIHJkdGFyZ2Eub2JqLHJkcmxlLm9iaixyZGJtcC5vYmoscmRzd2l0Y2gub2JqLGNkanBlZy5vYmosbGlianBlZy5vbGIvTGlicmFyeSdPUFQnCi0kIQotJCBEb0NvbXBpbGUgZGpwZWcuYwotJCBEb0NvbXBpbGUgd3JwcG0uYwotJCBEb0NvbXBpbGUgd3JnaWYuYwotJCBEb0NvbXBpbGUgd3J0YXJnYS5jCi0kIERvQ29tcGlsZSB3cnJsZS5jCi0kIERvQ29tcGlsZSB3cmJtcC5jCi0kIERvQ29tcGlsZSByZGNvbG1hcC5jCi0kIERvQ29tcGlsZSBjZGpwZWcuYwotJCEKLSQgTGluayAvTm9NYXAgL0V4ZWN1dGFibGUgPSBkanBlZy5leGUgIGRqcGVnLm9iaix3cnBwbS5vYmosd3JnaWYub2JqLCAtCi0gICAgICAgICAgd3J0YXJnYS5vYmosd3JybGUub2JqLHdyYm1wLm9iaixyZGNvbG1hcC5vYmosY2RqcGVnLm9iaixsaWJqcGVnLm9sYi9MaWJyYXJ5J09QVCcKLSQhCi0kIERvQ29tcGlsZSBqcGVndHJhbi5jCi0kIERvQ29tcGlsZSByZHN3aXRjaC5jCi0kIERvQ29tcGlsZSBjZGpwZWcuYwotJCBEb0NvbXBpbGUgdHJhbnN1cHAuYwotJCEKLSQgTGluayAvTm9NYXAgL0V4ZWN1dGFibGUgPSBqcGVndHJhbi5leGUgIGpwZWd0cmFuLm9iaixyZHN3aXRjaC5vYmosIC0KLSAgICAgICAgICBjZGpwZWcub2JqLHRyYW5zdXBwLm9iaixsaWJqcGVnLm9sYi9MaWJyYXJ5J09QVCcKLSQhCi0kIERvQ29tcGlsZSByZGpwZ2NvbS5jCi0kIExpbmsgL05vTWFwIC9FeGVjdXRhYmxlID0gcmRqcGdjb20uZXhlICByZGpwZ2NvbS5vYmonT1BUJwotJCEKLSQgRG9Db21waWxlIHdyanBnY29tLmMKLSQgTGluayAvTm9NYXAgL0V4ZWN1dGFibGUgPSB3cmpwZ2NvbS5leGUgIHdyanBnY29tLm9iaidPUFQnCi0kIQotJCEgUnVuIHRoZSBzZWxmLXRlc3QKLSQhCi0kIG1jciBzeXMkZGlzazpbXWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gdGVzdG9yaWcuanBnCi0kIG1jciBzeXMkZGlzazpbXWRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgdGVzdG9yaWcuanBnCi0kIG1jciBzeXMkZGlzazpbXWNqcGVnIC1kY3QgaW50ICAgICAgLW91dGZpbGUgdGVzdG91dC5qcGcgdGVzdGltZy5wcG0KLSQgbWNyIHN5cyRkaXNrOltdZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCi0kIG1jciBzeXMkZGlzazpbXWNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQotJCBtY3Igc3lzJGRpc2s6W11qcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCi0kIEJhY2t1cCAvQ29tcGFyZS9Mb2cgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KLSQgQmFja3VwIC9Db21wYXJlL0xvZyB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAotJCBCYWNrdXAgL0NvbXBhcmUvTG9nIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCi0kIEJhY2t1cCAvQ29tcGFyZS9Mb2cgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCi0kIEJhY2t1cCAvQ29tcGFyZS9Mb2cgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZwotJCBCYWNrdXAgL0NvbXBhcmUvTG9nIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKLSQhCi0kRW5kOgotJCAgIElmIFZlcmlmeSBUaGVuIFNldCBWZXJpZnkKLSQgRXhpdApkaWZmIC0tZ2l0IGEvdW51c2VkL21ha2VmaWxlLndhdCBiL3VudXNlZC9tYWtlZmlsZS53YXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NTNlNDYuLjAwMDAwMDAKLS0tIGEvdW51c2VkL21ha2VmaWxlLndhdAorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKLQotIyBUaGlzIG1ha2VmaWxlIGlzIHN1aXRhYmxlIGZvciBXYXRjb20gQy9DKysgMTAuMCBvbiBNUy1ET1MgKHVzaW5nCi0jIGRvczRnIGV4dGVuZGVyKSwgT1MvMiwgYW5kIFdpbmRvd3MgTlQgY29uc29sZSBtb2RlLgotIyBUaGFua3MgdG8gSmFub3MgSGFpZGUsIGpoYWlkZUBidHJ2dGVjaC5jb20uCi0KLSMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIndtYWtlIiAhIQotCi0jIFVuY29tbWVudCBsaW5lIGZvciBkZXNpcmVkIHN5c3RlbQotU1lTVEVNPURPUwotI1NZU1RFTT1PUzIKLSNTWVNURU09TlQKLQotIyBUaGUgbmFtZSBvZiB5b3VyIEMgY29tcGlsZXI6Ci1DQz0gd2NsMzg2Ci0KLSMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgotQ0ZMQUdTPSAtNHIgLW9ydCAtd3ggLXpxIC1idD0kKFNZU1RFTSkKLSMgQ2F1dGlvbjogYXZvaWQgLW9sIG9yIC1veDsgdGhlc2UgZ2VuZXJhdGUgYmFkIGNvZGUgd2l0aCAxMC4wIG9yIDEwLjBhLgotIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKLSMgTk9UIHZpYSAtRCBzd2l0Y2hlcyBoZXJlLgotCi0jIExpbmstdGltZSBjYyBvcHRpb25zOgotIWlmZXEgU1lTVEVNIERPUwotTERGTEFHUz0gLXpxIC1sPWRvczRnCi0hZWxzZSBpZmVxIFNZU1RFTSBPUzIKLUxERkxBR1M9IC16cSAtbD1vczJ2MgotIWVsc2UgaWZlcSBTWVNURU0gTlQKLUxERkxBR1M9IC16cSAtbD1udAotIWVuZGlmCi0KLSMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5Ci0jIG1hbmFnZXIgZmlsZS4gIGptZW1ub2JzIHNob3VsZCB3b3JrIGZpbmUgZm9yIGRvczRnIG9yIE9TLzIgZW52aXJvbm1lbnQuCi1TWVNERVBNRU09IGptZW1ub2JzLm9iagotCi0jIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KLQotCi0jIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgotTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgJgotICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jICYKLSAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jICYKLSAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgJgotICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyAmCi0gICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jICYKLSAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyAmCi0gICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKLSMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5Ci1TWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCi0jIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCi1BUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgJgotICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jICYKLSAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCi1TT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQotIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKLUlOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCAmCi0gICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAotIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcwotRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xICYKLSAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jICYKLSAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZwotTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjICYKLSAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzICYKLSAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0ICYKLSAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyAmCi0gICAgICAgIG1ha3Ztcy5vcHQKLUNPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0ICYKLSAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyAmCi0gICAgICAgIGpjb25maWcudm1zCi1DT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKLU9USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQotVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnICYKLSAgICAgICAgdGVzdGltZ3AuanBnCi1ESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpICYKLSAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKLSMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1DT01PQkpFQ1RTPSBqY29tYXBpLm9iaiBqdXRpbHMub2JqIGplcnJvci5vYmogam1lbW1nci5vYmogJChTWVNERVBNRU0pCi0jIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1DTElCT0JKRUNUUz0gamNhcGltaW4ub2JqIGpjYXBpc3RkLm9iaiBqY3RyYW5zLm9iaiBqY3BhcmFtLm9iaiBqZGF0YWRzdC5vYmogJgotICAgICAgICBqY2luaXQub2JqIGpjbWFzdGVyLm9iaiBqY21hcmtlci5vYmogamNtYWluY3Qub2JqIGpjcHJlcGN0Lm9iaiAmCi0gICAgICAgIGpjY29lZmN0Lm9iaiBqY2NvbG9yLm9iaiBqY3NhbXBsZS5vYmogamNodWZmLm9iaiBqY3BodWZmLm9iaiAmCi0gICAgICAgIGpjZGN0bWdyLm9iaiBqZmRjdGZzdC5vYmogamZkY3RmbHQub2JqIGpmZGN0aW50Lm9iagotIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1ETElCT0JKRUNUUz0gamRhcGltaW4ub2JqIGpkYXBpc3RkLm9iaiBqZHRyYW5zLm9iaiBqZGF0YXNyYy5vYmogJgotICAgICAgICBqZG1hc3Rlci5vYmogamRpbnB1dC5vYmogamRtYXJrZXIub2JqIGpkaHVmZi5vYmogamRwaHVmZi5vYmogJgotICAgICAgICBqZG1haW5jdC5vYmogamRjb2VmY3Qub2JqIGpkcG9zdGN0Lm9iaiBqZGRjdG1nci5vYmogamlkY3Rmc3Qub2JqICYKLSAgICAgICAgamlkY3RmbHQub2JqIGppZGN0aW50Lm9iaiBqaWRjdHJlZC5vYmogamRzYW1wbGUub2JqIGpkY29sb3Iub2JqICYKLSAgICAgICAganF1YW50MS5vYmoganF1YW50Mi5vYmogamRtZXJnZS5vYmoKLSMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcubGliCi1MSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCi0jIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCi1DT0JKRUNUUz0gY2pwZWcub2JqIHJkcHBtLm9iaiByZGdpZi5vYmogcmR0YXJnYS5vYmogcmRybGUub2JqIHJkYm1wLm9iaiAmCi0gICAgICAgIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqCi1ET0JKRUNUUz0gZGpwZWcub2JqIHdycHBtLm9iaiB3cmdpZi5vYmogd3J0YXJnYS5vYmogd3JybGUub2JqIHdyYm1wLm9iaiAmCi0gICAgICAgIHJkY29sbWFwLm9iaiBjZGpwZWcub2JqCi1UUk9CSkVDVFM9IGpwZWd0cmFuLm9iaiByZHN3aXRjaC5vYmogY2RqcGVnLm9iaiB0cmFuc3VwcC5vYmoKLQotCi1hbGw6IGxpYmpwZWcubGliIGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlIHJkanBnY29tLmV4ZSB3cmpwZ2NvbS5leGUKLQotbGlianBlZy5saWI6ICQoTElCT0JKRUNUUykKLQktIGRlbCBsaWJqcGVnLmxpYgotCSogd2xpYiAtbiBsaWJqcGVnLmxpYiAkKExJQk9CSkVDVFMpCi0KLWNqcGVnLmV4ZTogJChDT0JKRUNUUykgbGlianBlZy5saWIKLQkkKENDKSAkKExERkxBR1MpICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCi0KLWRqcGVnLmV4ZTogJChET0JKRUNUUykgbGlianBlZy5saWIKLQkkKENDKSAkKExERkxBR1MpICQoRE9CSkVDVFMpIGxpYmpwZWcubGliCi0KLWpwZWd0cmFuLmV4ZTogJChUUk9CSkVDVFMpIGxpYmpwZWcubGliCi0JJChDQykgJChMREZMQUdTKSAkKFRST0JKRUNUUykgbGlianBlZy5saWIKLQotcmRqcGdjb20uZXhlOiByZGpwZ2NvbS5jCi0JJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgcmRqcGdjb20uYwotCi13cmpwZ2NvbS5leGU6IHdyanBnY29tLmMKLQkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSB3cmpwZ2NvbS5jCi0KLS5jLm9iajoKLQkkKENDKSAkKENGTEFHUykgLWMgJDwKLQotamNvbmZpZy5oOiBqY29uZmlnLmRvYwotCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCi0JZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCi0JZXhpdCAxCi0KLWNsZWFuOiAuU1lNQk9MSUMKLQktIGRlbCAqLm9iagotCS0gZGVsIGxpYmpwZWcubGliCi0JLSBkZWwgY2pwZWcuZXhlCi0JLSBkZWwgZGpwZWcuZXhlCi0JLSBkZWwganBlZ3RyYW4uZXhlCi0JLSBkZWwgcmRqcGdjb20uZXhlCi0JLSBkZWwgd3JqcGdjb20uZXhlCi0JLSBkZWwgdGVzdG91dCouKgotCi10ZXN0OiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZSAgLlNZTUJPTElDCi0JLSBkZWwgdGVzdG91dCouKgotCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZwotCWRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZwotCWNqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICB0ZXN0aW1nLnBwbQotCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZwotCWNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQotCWpwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKLSFpZmVxIFNZU1RFTSBET1MKLQlmYyAvYiB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQotCWZjIC9iIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCi0JZmMgL2IgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKLQlmYyAvYiB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KLQlmYyAvYiB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCi0JZmMgL2IgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwotIWVsc2UKLQllY2hvIG4gPiBuLnRtcAotCWNvbXAgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0gPCBuLnRtcAotCWNvbXAgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAgPCBuLnRtcAotCWNvbXAgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcgPCBuLnRtcAotCWNvbXAgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtIDwgbi50bXAKLQljb21wIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcgPCBuLnRtcAotCWNvbXAgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZyA8IG4udG1wCi0JZGVsIG4udG1wCi0hZW5kaWYKLQotCi1qY2FwaW1pbi5vYmo6IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2FwaXN0ZC5vYmo6IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvZWZjdC5vYmo6IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvbG9yLm9iajogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNkY3RtZ3Iub2JqOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpjaHVmZi5vYmo6IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNpbml0Lm9iajogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21haW5jdC5vYmo6IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hcmtlci5vYmo6IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hc3Rlci5vYmo6IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY29tYXBpLm9iajogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwYXJhbS5vYmo6IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYub2JqOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY3ByZXBjdC5vYmo6IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3NhbXBsZS5vYmo6IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3RyYW5zLm9iajogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGltaW4ub2JqOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGlzdGQub2JqOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhdGFkc3Qub2JqOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGF0YXNyYy5vYmo6IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkY29lZmN0Lm9iajogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkY29sb3Iub2JqOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGRjdG1nci5vYmo6IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamRodWZmLm9iajogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZGlucHV0Lm9iajogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYWluY3Qub2JqOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXJrZXIub2JqOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXN0ZXIub2JqOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtZXJnZS5vYmo6IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkcGh1ZmYub2JqOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZHBvc3RjdC5vYmo6IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHNhbXBsZS5vYmo6IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHRyYW5zLm9iajogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamVycm9yLm9iajogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAotamZkY3RmbHQub2JqOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0ZnN0Lm9iajogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGludC5vYmo6IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RmbHQub2JqOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0ZnN0Lm9iajogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGludC5vYmo6IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RyZWQub2JqOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpxdWFudDEub2JqOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qcXVhbnQyLm9iajoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanV0aWxzLm9iajoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qbWVtbWdyLm9iajogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1hbnNpLm9iajogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbmFtZS5vYmo6IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5vYnMub2JqOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1kb3Mub2JqOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW1hYy5vYmo6IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1janBlZy5vYmo6IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWRqcGVnLm9iajogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotanBlZ3RyYW4ub2JqOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKLXJkanBnY29tLm9iajogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotd3JqcGdjb20ub2JqOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi1jZGpwZWcub2JqOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkY29sbWFwLm9iajogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkc3dpdGNoLm9iajogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXRyYW5zdXBwLm9iajogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAotcmRwcG0ub2JqOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JwcG0ub2JqOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRnaWYub2JqOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JnaWYub2JqOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmR0YXJnYS5vYmo6IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdydGFyZ2Eub2JqOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGJtcC5vYmo6IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmJtcC5vYmo6IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHJsZS5vYmo6IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnJsZS5vYmo6IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS91bnVzZWQvbWFrZWxpYi5kcyBiL3VudXNlZC9tYWtlbGliLmRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2FkMzZkLi4wMDAwMDAwCi0tLSBhL3VudXNlZC9tYWtlbGliLmRzCisrKyAvZGV2L251bGwKQEAgLTEsMTA0NiArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBOTUFLRSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA0LjIwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IiAweDAxMDQKLQotIUlGICIkKENGRykiID09ICIiCi1DRkc9anBlZyAtIFdpbjMyCi0hTUVTU0FHRSBObyBjb25maWd1cmF0aW9uIHNwZWNpZmllZC4gIERlZmF1bHRpbmcgdG8ganBlZyAtIFdpbjMyLgotIUVORElGIAotCi0hSUYgIiQoQ0ZHKSIgIT0gImpwZWcgLSBXaW4zMiIKLSFNRVNTQUdFIEludmFsaWQgY29uZmlndXJhdGlvbiAiJChDRkcpIiBzcGVjaWZpZWQuCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRSBvbiB0aGlzIG1ha2VmaWxlCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgImpwZWcubWFrIiBDRkc9ImpwZWcgLSBXaW4zMiIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJqcGVnIC0gV2luMzIiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQotIU1FU1NBR0UgCi0hRVJST1IgQW4gaW52YWxpZCBjb25maWd1cmF0aW9uIGlzIHNwZWNpZmllZC4KLSFFTkRJRiAKLQotIUlGICIkKE9TKSIgPT0gIldpbmRvd3NfTlQiCi1OVUxMPQotIUVMU0UgCi1OVUxMPW51bAotIUVORElGIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIFRhcmdldF9MYXN0X1NjYW5uZWQgImpwZWcgLSBXaW4zMiIKLUNQUD1jbC5leGUKLQotIUlGICAiJChDRkcpIiA9PSAianBlZyAtIFdpbjMyIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIFRhcmdldF9EaXIgIiIKLU9VVERJUj0uXFJlbGVhc2UKLUlOVERJUj0uXFJlbGVhc2UKLQotQUxMIDogIiQoT1VURElSKVxqcGVnLmxpYiIKLQotQ0xFQU4gOiAKLQktQGVyYXNlICIkKElOVERJUilcamNhcGltaW4ub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY2FwaXN0ZC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjdHJhbnMub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY3BhcmFtLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRhdGFkc3Qub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY2luaXQub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY21hc3Rlci5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjbWFya2VyLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamNtYWluY3Qub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY3ByZXBjdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjY29lZmN0Lm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamNjb2xvci5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjc2FtcGxlLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamNodWZmLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamNwaHVmZi5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjZGN0bWdyLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamZkY3Rmc3Qub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZmRjdGZsdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpmZGN0aW50Lm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRhcGltaW4ub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZGFwaXN0ZC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkdHJhbnMub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZGF0YXNyYy5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkbWFzdGVyLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRpbnB1dC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkbWFya2VyLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRodWZmLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRwaHVmZi5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkbWFpbmN0Lm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRjb2VmY3Qub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZHBvc3RjdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkZGN0bWdyLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamlkY3Rmc3Qub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqaWRjdGZsdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGppZGN0aW50Lm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamlkY3RyZWQub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZHNhbXBsZS5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkY29sb3Iub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqcXVhbnQxLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcanF1YW50Mi5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkbWVyZ2Uub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY29tYXBpLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcanV0aWxzLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamVycm9yLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcam1lbW1nci5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGptZW1ub2JzLm9iaiIKLQktQGVyYXNlICIkKE9VVERJUilcanBlZy5saWIiCi0KLSIkKE9VVERJUikiIDoKLSAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgotCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLUNQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIlwKLSAvRnAiJChJTlRESVIpL2pwZWcucGNoIiAvWVggL0ZvIiQoSU5URElSKS8iIC9jIAotQ1BQX09CSlM9LlxSZWxlYXNlLwotQ1BQX1NCUlM9LlwuCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1CU0MzMl9GTEFHUz0vbm9sb2dvIC9vIiQoT1VURElSKS9qcGVnLmJzYyIgCi1CU0MzMl9TQlJTPSBcCi0JCi1MSUIzMj1saW5rLmV4ZSAtbGliCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KLSMgQUREIExJQjMyIC9ub2xvZ28KLUxJQjMyX0ZMQUdTPS9ub2xvZ28gL291dDoiJChPVVRESVIpL2pwZWcubGliIiAKLUxJQjMyX09CSlM9IFwKLQkiJChJTlRESVIpXGpjYXBpbWluLm9iaiIgXAotCSIkKElOVERJUilcamNhcGlzdGQub2JqIiBcCi0JIiQoSU5URElSKVxqY3RyYW5zLm9iaiIgXAotCSIkKElOVERJUilcamNwYXJhbS5vYmoiIFwKLQkiJChJTlRESVIpXGpkYXRhZHN0Lm9iaiIgXAotCSIkKElOVERJUilcamNpbml0Lm9iaiIgXAotCSIkKElOVERJUilcamNtYXN0ZXIub2JqIiBcCi0JIiQoSU5URElSKVxqY21hcmtlci5vYmoiIFwKLQkiJChJTlRESVIpXGpjbWFpbmN0Lm9iaiIgXAotCSIkKElOVERJUilcamNwcmVwY3Qub2JqIiBcCi0JIiQoSU5URElSKVxqY2NvZWZjdC5vYmoiIFwKLQkiJChJTlRESVIpXGpjY29sb3Iub2JqIiBcCi0JIiQoSU5URElSKVxqY3NhbXBsZS5vYmoiIFwKLQkiJChJTlRESVIpXGpjaHVmZi5vYmoiIFwKLQkiJChJTlRESVIpXGpjcGh1ZmYub2JqIiBcCi0JIiQoSU5URElSKVxqY2RjdG1nci5vYmoiIFwKLQkiJChJTlRESVIpXGpmZGN0ZnN0Lm9iaiIgXAotCSIkKElOVERJUilcamZkY3RmbHQub2JqIiBcCi0JIiQoSU5URElSKVxqZmRjdGludC5vYmoiIFwKLQkiJChJTlRESVIpXGpkYXBpbWluLm9iaiIgXAotCSIkKElOVERJUilcamRhcGlzdGQub2JqIiBcCi0JIiQoSU5URElSKVxqZHRyYW5zLm9iaiIgXAotCSIkKElOVERJUilcamRhdGFzcmMub2JqIiBcCi0JIiQoSU5URElSKVxqZG1hc3Rlci5vYmoiIFwKLQkiJChJTlRESVIpXGpkaW5wdXQub2JqIiBcCi0JIiQoSU5URElSKVxqZG1hcmtlci5vYmoiIFwKLQkiJChJTlRESVIpXGpkaHVmZi5vYmoiIFwKLQkiJChJTlRESVIpXGpkcGh1ZmYub2JqIiBcCi0JIiQoSU5URElSKVxqZG1haW5jdC5vYmoiIFwKLQkiJChJTlRESVIpXGpkY29lZmN0Lm9iaiIgXAotCSIkKElOVERJUilcamRwb3N0Y3Qub2JqIiBcCi0JIiQoSU5URElSKVxqZGRjdG1nci5vYmoiIFwKLQkiJChJTlRESVIpXGppZGN0ZnN0Lm9iaiIgXAotCSIkKElOVERJUilcamlkY3RmbHQub2JqIiBcCi0JIiQoSU5URElSKVxqaWRjdGludC5vYmoiIFwKLQkiJChJTlRESVIpXGppZGN0cmVkLm9iaiIgXAotCSIkKElOVERJUilcamRzYW1wbGUub2JqIiBcCi0JIiQoSU5URElSKVxqZGNvbG9yLm9iaiIgXAotCSIkKElOVERJUilcanF1YW50MS5vYmoiIFwKLQkiJChJTlRESVIpXGpxdWFudDIub2JqIiBcCi0JIiQoSU5URElSKVxqZG1lcmdlLm9iaiIgXAotCSIkKElOVERJUilcamNvbWFwaS5vYmoiIFwKLQkiJChJTlRESVIpXGp1dGlscy5vYmoiIFwKLQkiJChJTlRESVIpXGplcnJvci5vYmoiIFwKLQkiJChJTlRESVIpXGptZW1tZ3Iub2JqIiBcCi0JIiQoSU5URElSKVxqbWVtbm9icy5vYmoiCi0KLSIkKE9VVERJUilcanBlZy5saWIiIDogIiQoT1VURElSKSIgJChERUZfRklMRSkgJChMSUIzMl9PQkpTKQotICAgICQoTElCMzIpIEA8PAotICAkKExJQjMyX0ZMQUdTKSAkKERFRl9GTEFHUykgJChMSUIzMl9PQkpTKQotPDwKLQotIUVORElGIAotCi0uY3skKENQUF9PQkpTKX0ub2JqOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmNwcHskKENQUF9PQkpTKX0ub2JqOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmN4eHskKENQUF9PQkpTKX0ub2JqOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmN7JChDUFBfU0JSUyl9LnNicjoKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCi0KLS5jcHB7JChDUFBfU0JSUyl9LnNicjoKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCi0KLS5jeHh7JChDUFBfU0JSUyl9LnNicjoKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgImpwZWcgLSBXaW4zMiIKLQotIUlGICAiJChDRkcpIiA9PSAianBlZyAtIFdpbjMyIgotCi0hRU5ESUYgCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamNhcGltaW4uYyIKLURFUF9DUFBfSkNBUEk9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY2FwaW1pbi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0FQSSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY2FwaXN0ZC5jIgotREVQX0NQUF9KQ0FQSVM9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY2FwaXN0ZC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0FQSVMpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamNjb2VmY3QuYyIKLURFUF9DUFBfSkNDT0U9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY2NvZWZjdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0NPRSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY2NvbG9yLmMiCi1ERVBfQ1BQX0pDQ09MPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamNjb2xvci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0NPTCkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY2RjdG1nci5jIgotREVQX0NQUF9KQ0RDVD1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqZGN0LmgiXAotCQotCi0iJChJTlRESVIpXGpjZGN0bWdyLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDRENUKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjaHVmZi5jIgotREVQX0NQUF9KQ0hVRj1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqY2h1ZmYuaCJcCi0JCi0KLSIkKElOVERJUilcamNodWZmLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDSFVGKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjaW5pdC5jIgotREVQX0NQUF9KQ0lOST1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpjaW5pdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0lOSSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY21haW5jdC5jIgotREVQX0NQUF9KQ01BST1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpjbWFpbmN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDTUFJKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjbWFya2VyLmMiCi1ERVBfQ1BQX0pDTUFSPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamNtYXJrZXIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNNQVIpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamNtYXN0ZXIuYyIKLURFUF9DUFBfSkNNQVM9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY21hc3Rlci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ01BUykgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY29tYXBpLmMiCi1ERVBfQ1BQX0pDT01BPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamNvbWFwaS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ09NQSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY3BhcmFtLmMiCi1ERVBfQ1BQX0pDUEFSPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamNwYXJhbS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ1BBUikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY3BodWZmLmMiCi1ERVBfQ1BQX0pDUEhVPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpjaHVmZi5oIlwKLQkKLQotIiQoSU5URElSKVxqY3BodWZmLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDUEhVKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjcHJlcGN0LmMiCi1ERVBfQ1BQX0pDUFJFPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamNwcmVwY3Qub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNQUkUpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamNzYW1wbGUuYyIKLURFUF9DUFBfSkNTQU09XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY3NhbXBsZS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ1NBTSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY3RyYW5zLmMiCi1ERVBfQ1BQX0pDVFJBPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamN0cmFucy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ1RSQSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZGFwaW1pbi5jIgotREVQX0NQUF9KREFQST1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkYXBpbWluLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQVBJKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkYXBpc3RkLmMiCi1ERVBfQ1BQX0pEQVBJUz1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkYXBpc3RkLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQVBJUykgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZGF0YWRzdC5jIgotREVQX0NQUF9KREFUQT1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkYXRhZHN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQVRBKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkYXRhc3JjLmMiCi1ERVBfQ1BQX0pEQVRBUz1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkYXRhc3JjLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQVRBUykgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZGNvZWZjdC5jIgotREVQX0NQUF9KRENPRT1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkY29lZmN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQ09FKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkY29sb3IuYyIKLURFUF9DUFBfSkRDT0w9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqZGNvbG9yLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQ09MKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkZGN0bWdyLmMiCi1ERVBfQ1BQX0pERENUPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpkY3QuaCJcCi0JCi0KLSIkKElOVERJUilcamRkY3RtZ3Iub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkREQ1QpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRodWZmLmMiCi1ERVBfQ1BQX0pESFVGPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpkaHVmZi5oIlwKLQkKLQotIiQoSU5URElSKVxqZGh1ZmYub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRIVUYpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRpbnB1dC5jIgotREVQX0NQUF9KRElOUD1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkaW5wdXQub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRJTlApICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRtYWluY3QuYyIKLURFUF9DUFBfSkRNQUk9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqZG1haW5jdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRE1BSSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZG1hcmtlci5jIgotREVQX0NQUF9KRE1BUj1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkbWFya2VyLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pETUFSKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkbWFzdGVyLmMiCi1ERVBfQ1BQX0pETUFTPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRtYXN0ZXIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRNQVMpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRtZXJnZS5jIgotREVQX0NQUF9KRE1FUj1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkbWVyZ2Uub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRNRVIpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRwaHVmZi5jIgotREVQX0NQUF9KRFBIVT1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqZGh1ZmYuaCJcCi0JCi0KLSIkKElOVERJUilcamRwaHVmZi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRFBIVSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZHBvc3RjdC5jIgotREVQX0NQUF9KRFBPUz1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkcG9zdGN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEUE9TKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Impkc2FtcGxlLmMiCi1ERVBfQ1BQX0pEU0FNPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRzYW1wbGUub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRTQU0pICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamR0cmFucy5jIgotREVQX0NQUF9KRFRSQT1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkdHJhbnMub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRUUkEpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamVycm9yLmMiCi1ERVBfQ1BQX0pFUlJPPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqdmVyc2lvbi5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGplcnJvci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRVJSTykgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZmRjdGZsdC5jIgotREVQX0NQUF9KRkRDVD1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqZGN0LmgiXAotCQotCi0iJChJTlRESVIpXGpmZGN0Zmx0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pGRENUKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpmZGN0ZnN0LmMiCi1ERVBfQ1BQX0pGRENURj1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqZGN0LmgiXAotCQotCi0iJChJTlRESVIpXGpmZGN0ZnN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pGRENURikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZmRjdGludC5jIgotREVQX0NQUF9KRkRDVEk9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkiamRjdC5oIlwKLQkKLQotIiQoSU5URElSKVxqZmRjdGludC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRkRDVEkpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamlkY3RmbHQuYyIKLURFUF9DUFBfSklEQ1Q9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkiamRjdC5oIlwKLQkKLQotIiQoSU5URElSKVxqaWRjdGZsdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KSURDVCkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqaWRjdGZzdC5jIgotREVQX0NQUF9KSURDVEY9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkiamRjdC5oIlwKLQkKLQotIiQoSU5URElSKVxqaWRjdGZzdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KSURDVEYpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamlkY3RpbnQuYyIKLURFUF9DUFBfSklEQ1RJPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpkY3QuaCJcCi0JCi0KLSIkKElOVERJUilcamlkY3RpbnQub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSklEQ1RJKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImppZGN0cmVkLmMiCi1ERVBfQ1BQX0pJRENUUj1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqZGN0LmgiXAotCQotCi0iJChJTlRESVIpXGppZGN0cmVkLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pJRENUUikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqcXVhbnQxLmMiCi1ERVBfQ1BQX0pRVUFOPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcanF1YW50MS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KUVVBTikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqcXVhbnQyLmMiCi1ERVBfQ1BQX0pRVUFOVD1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpxdWFudDIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSlFVQU5UKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Imp1dGlscy5jIgotREVQX0NQUF9KVVRJTD1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGp1dGlscy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KVVRJTCkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqbWVtbWdyLmMiCi1ERVBfQ1BQX0pNRU1NPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImptZW1zeXMuaCJcCi0JCi0KLSIkKElOVERJUilcam1lbW1nci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KTUVNTSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqbWVtbm9icy5jIgotREVQX0NQUF9KTUVNTj1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqbWVtc3lzLmgiXAotCQotCi0iJChJTlRESVIpXGptZW1ub2JzLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pNRU1OKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KZGlmZiAtLWdpdCBhL3VudXNlZC9tYWtlcHJvai5tYWMgYi91bnVzZWQvbWFrZXByb2oubWFjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDI3N2M4Li4wMDAwMDAwCi0tLSBhL3VudXNlZC9tYWtlcHJvai5tYWMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLS0KLS0tIG1ha2Vwcm9qLm1hYwotLS0KLS0tIFRoaXMgQXBwbGVTY3JpcHQgYnVpbGRzIENvZGUgV2FycmlvciBQUk8gUmVsZWFzZSAyIHByb2plY3QgZmlsZXMgZm9yIHRoZQotLS0gbGlianBlZyBsaWJyYXJ5IGFzIHdlbGwgYXMgdGhlIHRlc3QgcHJvZ3JhbXMgJ2NqcGVnJywgJ2RqcGVnJywgJ2pwZWd0cmFuJy4KLS0tIChXZSdkIGRpc3RyaWJ1dGUgcmVhbCBwcm9qZWN0IGZpbGVzLCBleGNlcHQgdGhleSdyZSBub3QgdGV4dAotLS0gYW5kIHdvdWxkIGNyZWF0ZSBtYWludGVuYW5jZSBoZWFkYWNoZXMuKQotLS0KLS0tIFRoZSBzY3JpcHQgdGhlbiBjb21waWxlcyBhbmQgbGlua3MgdGhlIGxpYnJhcnkgYW5kIHRoZSB0ZXN0IHByb2dyYW1zLgotLS0gTk9URTogaWYgeW91IGhhdmVuJ3QgYWxyZWFkeSBjcmVhdGVkIGEgJ2pjb25maWcuaCcgZmlsZSwgdGhlIHNjcmlwdAotLS0gYXV0b21hdGljYWxseSBjb3BpZXMgJ2pjb25maWcubWFjJyB0byAnamNvbmZpZy5oJy4KLS0tCi0tLSBUbyB1c2UgdGhpcyBzY3JpcHQsIHlvdSBtdXN0IGhhdmUgQXBwbGVTY3JpcHQgMS4xIG9yIGxhdGVyIGluc3RhbGxlZAotLS0gYW5kIGEgc3VpdGFibGUgQXBwbGVTY3JpcHQgZWRpdG9yIGxpa2UgU2NyaXB0IEVkaXRvciBvciBTY3JpcHQgRGVidWdnZXIKLS0tIChodHRwOi8vd3d3LmxhdGVuaWdodHN3LmNvbSkuIE9wZW4gdGhpcyBmaWxlIHdpdGggeW91ciBBcHBsZVNjcmlwdAotLS0gZWRpdG9yIGFuZCBleGVjdXRlIHRoZSAicnVuIiBjb21tYW5kIHRvIGJ1aWxkIHRoZSBwcm9qZWN0cy4KLS0tCi0tLSBUaGFua3MgdG8gRGFuIFNlYXJzIGFuZCBEb24gQWdybyBmb3IgdGhpcyBzY3JpcHQuCi0tLSBRdWVzdGlvbnMgYWJvdXQgdGhpcyBzY3JpcHQgY2FuIGJlIGFkZHJlc3NlZCB0byBkb2dwYXJrQGludGVybG9nLmNvbQotLS0KLQotb24gcnVuCi0KLQljaG9vc2UgZm9sZGVyIHdpdGggcHJvbXB0ICI+Pj4gU2VsZWN0IElKRyBzb3VyY2UgZm9sZGVyIDw8PCIKLQlzZXQgaWpnX2ZvbGRlciB0byByZXN1bHQKLQotCWNob29zZSBmb2xkZXIgd2l0aCBwcm9tcHQgIj4+PiBTZWxlY3QgTWV0cm9XZXJrcyBmb2xkZXIgPDw8IgotCXNldCBjd19mb2xkZXIgdG8gcmVzdWx0Ci0KLQktLSBpZiBqY29uZmlnLmggZG9lc24ndCBhbHJlYWR5IGV4aXN0LCBjb3B5IGpjb25maWcubWFjCi0KLQl0ZWxsIGFwcGxpY2F0aW9uICJGaW5kZXIiCi0JCWlmIG5vdCAoZXhpc3RzIGZpbGUgImpjb25maWcuaCIgb2YgaWpnX2ZvbGRlcikgdGhlbgotCQkJZHVwbGljYXRlIHtmaWxlICJqY29uZmlnLm1hYyIgb2YgZm9sZGVyIGlqZ19mb2xkZXJ9Ci0JCQlzZWxlY3QgZmlsZSAiamNvbmZpZy5tYWMgY29weSIgb2YgZm9sZGVyIGlqZ19mb2xkZXIKLQkJCXNldCBuYW1lIG9mIHNlbGVjdGlvbiB0byAiamNvbmZpZy5oIgotCQllbmQgaWYKLQllbmQgdGVsbAotCi0JdGVsbCBhcHBsaWNhdGlvbiAiQ29kZVdhcnJpb3IgSURFIDIuMSIKLQkgIHdpdGggdGltZW91dCBvZiAxMDAwMCBzZWNvbmRzCi0KLQkJLS0gY3JlYXRlIGxpYmpwZWcgcHJvamVjdAotCi0JCWFjdGl2YXRlCi0JCUNyZWF0ZSBQcm9qZWN0IChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAibGlianBlZy5wcm9qIgotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlRhcmdldCBTZXR0aW5ncyIgdG8ge1RhcmdldCBOYW1lOiJsaWJqcGVnIn0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgUHJvamVjdCIgdG8ge0ZpbGUgTmFtZToibGlianBlZyJ9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiVGFyZ2V0IFNldHRpbmdzIiB0byB7TGlua2VyOiJNYWNPUyBQUEMgTGlua2VyIn0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgUHJvamVjdCIgdG8ge1Byb2plY3QgVHlwZTpsaWJyYXJ5fQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIkMvQysrIENvbXBpbGVyIiB0byB7QU5TSSBTdHJpY3Q6dHJ1ZX0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJDL0MrKyBDb21waWxlciIgdG8ge0VudW1zIEFsd2F5cyBJbnRzOnRydWV9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIENvZGVnZW4iIHRvIHtTdHJ1Y3QgQWxpZ25tZW50OlBvd2VyUEN9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIExpbmtlciIgdG8ge0dlbmVyYXRlIFNZTSBGaWxlOmZhbHNlfQotCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjYXBpbWluLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY2FwaXN0ZC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamN0cmFucy5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNwYXJhbS5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRhdGFkc3QuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjaW5pdC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNtYXN0ZXIuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjbWFya2VyLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY21haW5jdC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNwcmVwY3QuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjY29lZmN0LmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY2NvbG9yLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY3NhbXBsZS5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNodWZmLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY3BodWZmLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY2RjdG1nci5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamZkY3Rmc3QuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpmZGN0Zmx0LmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZmRjdGludC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRhcGltaW4uYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkYXBpc3RkLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZHRyYW5zLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZGF0YXNyYy5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRtYXN0ZXIuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkaW5wdXQuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkbWFya2VyLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZGh1ZmYuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkcGh1ZmYuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkbWFpbmN0LmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZGNvZWZjdC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRwb3N0Y3QuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkZGN0bWdyLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqaWRjdGZzdC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamlkY3RmbHQuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImppZGN0aW50LmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqaWRjdHJlZC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRzYW1wbGUuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkY29sb3IuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpxdWFudDEuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpxdWFudDIuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkbWVyZ2UuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjb21hcGkuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImp1dGlscy5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamVycm9yLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqbWVtbWdyLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqbWVtbWFjLmMiIFRvIFNlZ21lbnQgMQotCi0JCS0tIGNvbXBpbGUgYW5kIGxpbmsgdGhlIGxpYnJhcnkKLQotCQlNYWtlIFByb2plY3QKLQkJQ2xvc2UgUHJvamVjdAotCi0JCS0tIGNyZWF0ZSBjanBlZyBwcm9qZWN0Ci0KLQkJYWN0aXZhdGUKLQkJQ3JlYXRlIFByb2plY3QgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJjanBlZy5wcm9qIgotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlRhcmdldCBTZXR0aW5ncyIgdG8ge1RhcmdldCBOYW1lOiJjanBlZyJ9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIFByb2plY3QiIHRvIHtGaWxlIE5hbWU6ImNqcGVnIn0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJUYXJnZXQgU2V0dGluZ3MiIHRvIHtMaW5rZXI6Ik1hY09TIFBQQyBMaW5rZXIifQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIkMvQysrIENvbXBpbGVyIiB0byB7QU5TSSBTdHJpY3Q6dHJ1ZX0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJDL0MrKyBDb21waWxlciIgdG8ge0VudW1zIEFsd2F5cyBJbnRzOnRydWV9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIENvZGVnZW4iIHRvIHtTdHJ1Y3QgQWxpZ25tZW50OlBvd2VyUEN9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIExpbmtlciIgdG8ge0dlbmVyYXRlIFNZTSBGaWxlOmZhbHNlfQotCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImNqcGVnLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJyZHBwbS5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAicmRnaWYuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInJkdGFyZ2EuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInJkcmxlLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJyZGJtcC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAicmRzd2l0Y2guYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImNkanBlZy5jIiBUbyBTZWdtZW50IDEKLQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJsaWJqcGVnIiBUbyBTZWdtZW50IDIKLQotCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDOkJpbjpNU0wgQy5QUEMuTGliIiBUbyBTZWdtZW50IDMKLQkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1ldHJvd2Vya3MgU3RhbmRhcmQgTGlicmFyeTpNU0wgQzpCaW46TVNMIFNJT1VYLlBQQy5MaWIiIFRvIFNlZ21lbnQgMwotCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWFjT1MgU3VwcG9ydDpMaWJyYXJpZXM6UnVudGltZTpSdW50aW1lIFBQQzpNU0wgUnVudGltZVBQQy5MaWIiIFRvIFNlZ21lbnQgMwotCi0JCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpNYWNPUyBDb21tb246SW50ZXJmYWNlTGliIiBUbyBTZWdtZW50IDQKLQkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOk1hY09TIENvbW1vbjpNYXRoTGliIiBUbyBTZWdtZW50IDQKLQotCQktLSBjb21waWxlIGFuZCBsaW5rIGNqcGVnCi0KLQkJTWFrZSBQcm9qZWN0Ci0JCUNsb3NlIFByb2plY3QKLQotCQktLSBjcmVhdGUgZGpwZWcgcHJvamVjdAotCi0JCWFjdGl2YXRlCi0JCUNyZWF0ZSBQcm9qZWN0IChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiZGpwZWcucHJvaiIKLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJUYXJnZXQgU2V0dGluZ3MiIHRvIHtUYXJnZXQgTmFtZToiZGpwZWcifQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBQcm9qZWN0IiB0byB7RmlsZSBOYW1lOiJkanBlZyJ9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiVGFyZ2V0IFNldHRpbmdzIiB0byB7TGlua2VyOiJNYWNPUyBQUEMgTGlua2VyIn0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJDL0MrKyBDb21waWxlciIgdG8ge0FOU0kgU3RyaWN0OnRydWV9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiQy9DKysgQ29tcGlsZXIiIHRvIHtFbnVtcyBBbHdheXMgSW50czp0cnVlfQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBDb2RlZ2VuIiB0byB7U3RydWN0IEFsaWdubWVudDpQb3dlclBDfQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBMaW5rZXIiIHRvIHtHZW5lcmF0ZSBTWU0gRmlsZTpmYWxzZX0KLQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJkanBlZy5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAid3JwcG0uYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgIndyZ2lmLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJ3cnRhcmdhLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJ3cnJsZS5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAid3JibXAuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInJkY29sbWFwLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJjZGpwZWcuYyIgVG8gU2VnbWVudCAxCi0KLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAibGlianBlZyIgVG8gU2VnbWVudCAyCi0KLQkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1ldHJvd2Vya3MgU3RhbmRhcmQgTGlicmFyeTpNU0wgQzpCaW46TVNMIEMuUFBDLkxpYiIgVG8gU2VnbWVudCAzCi0JCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEM6QmluOk1TTCBTSU9VWC5QUEMuTGliIiBUbyBTZWdtZW50IDMKLQkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOlJ1bnRpbWU6UnVudGltZSBQUEM6TVNMIFJ1bnRpbWVQUEMuTGliIiBUbyBTZWdtZW50IDMKLQotCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWFjT1MgU3VwcG9ydDpMaWJyYXJpZXM6TWFjT1MgQ29tbW9uOkludGVyZmFjZUxpYiIgVG8gU2VnbWVudCA0Ci0JCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpNYWNPUyBDb21tb246TWF0aExpYiIgVG8gU2VnbWVudCA0Ci0KLQkJLS0gY29tcGlsZSBhbmQgbGluayBkanBlZwotCi0JCU1ha2UgUHJvamVjdAotCQlDbG9zZSBQcm9qZWN0Ci0KLQkJLS0gY3JlYXRlIGpwZWd0cmFuIHByb2plY3QKLQotCQlhY3RpdmF0ZQotCQlDcmVhdGUgUHJvamVjdCAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpwZWd0cmFuLnByb2oiCi0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiVGFyZ2V0IFNldHRpbmdzIiB0byB7VGFyZ2V0IE5hbWU6ImpwZWd0cmFuIn0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgUHJvamVjdCIgdG8ge0ZpbGUgTmFtZToianBlZ3RyYW4ifQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlRhcmdldCBTZXR0aW5ncyIgdG8ge0xpbmtlcjoiTWFjT1MgUFBDIExpbmtlciJ9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiQy9DKysgQ29tcGlsZXIiIHRvIHtBTlNJIFN0cmljdDp0cnVlfQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIkMvQysrIENvbXBpbGVyIiB0byB7RW51bXMgQWx3YXlzIEludHM6dHJ1ZX0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgQ29kZWdlbiIgdG8ge1N0cnVjdCBBbGlnbm1lbnQ6UG93ZXJQQ30KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgTGlua2VyIiB0byB7R2VuZXJhdGUgU1lNIEZpbGU6ZmFsc2V9Ci0KLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAianBlZ3RyYW4uYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInJkc3dpdGNoLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJjZGpwZWcuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInRyYW5zdXBwLmMiIFRvIFNlZ21lbnQgMQotCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImxpYmpwZWciIFRvIFNlZ21lbnQgMgotCi0JCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEM6QmluOk1TTCBDLlBQQy5MaWIiIFRvIFNlZ21lbnQgMwotCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDOkJpbjpNU0wgU0lPVVguUFBDLkxpYiIgVG8gU2VnbWVudCAzCi0JCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpSdW50aW1lOlJ1bnRpbWUgUFBDOk1TTCBSdW50aW1lUFBDLkxpYiIgVG8gU2VnbWVudCAzCi0KLQkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOk1hY09TIENvbW1vbjpJbnRlcmZhY2VMaWIiIFRvIFNlZ21lbnQgNAotCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWFjT1MgU3VwcG9ydDpMaWJyYXJpZXM6TWFjT1MgQ29tbW9uOk1hdGhMaWIiIFRvIFNlZ21lbnQgNAotCi0JCS0tIGNvbXBpbGUgYW5kIGxpbmsganBlZ3RyYW4KLQotCQlNYWtlIFByb2plY3QKLQkJQ2xvc2UgUHJvamVjdAotCi0JCXF1aXQKLQotCSAgZW5kIHRpbWVvdXQKLQllbmQgdGVsbAotZW5kIHJ1bgpkaWZmIC0tZ2l0IGEvdW51c2VkL21ha2xqcGVnLnN0IGIvdW51c2VkL21ha2xqcGVnLnN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTM0OTNlLi4wMDAwMDAwCi0tLSBhL3VudXNlZC9tYWtsanBlZy5zdAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTsgUHJvamVjdCBmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKLTsKLTsgVGhpcyBwcm9qZWN0IGZpbGUgaXMgZm9yIEF0YXJpIFNUL1NURS9UVCBzeXN0ZW1zIHVzaW5nIFB1cmUgQyBvciBUdXJibyBDLgotOyBUaGFua3MgdG8gRnJhbmsgTW9laGxlIChGcmFuay5Nb2VobGVAYXJiaS5pbmZvcm1hdGlrLnVuaS1vbGRlbmJ1cmcuZGUpLAotOyBEci4gQi4gU2V0emVwZmFuZHQgKGJlcm5kQGdpbmEudW5pLW11ZW5zdGVyLmRlKSwKLTsgYW5kIEd1aWRvIFZvbGxiZWRpbmcgKGd1aXZvbEBlc2MuZGUpLgotOwotOyBUbyB1c2UgdGhpcyBmaWxlLCByZW5hbWUgaXQgdG8gbGlianBlZy5wcmouCi07IFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgdHJ5aW5nIHRvIG1ha2UgdGhlIHByb2dyYW0hCi07Ci07Ci07ICAgICAgKiAqICogT3V0cHV0IGZpbGUgKiAqICoKLWxpYmpwZWcubGliCi07Ci07ICogKiAqIENPTVBJTEVSIE9QVElPTlMgKiAqICogIAotLkNbLVBdICAgICAgICA7IGFic29sdXRlIGNhbGxzCi0uQ1stTV0gICAgICAgIDsgYW5kIG5vIHN0cmluZyBtZXJnaW5nLCBmb2xrcwotLkNbLXctY2xuXSAgICA7IG5vICJjb25zdGFudCBpcyBsb25nIiB3YXJuaW5ncwotLkNbLXctcGFyXSAgICA7IG5vICJwYXJhbWV0ZXIgeHh4eCB1bnVzZWQiCi0uQ1stdy1yY2hdICAgIDsgbm8gInVucmVhY2hhYmxlIGNvZGUiCi0uQ1std3NpZ10gICAgIDsgd2FybiBpZiBzaWduaWZpY2FudCBkaWdpdHMgbWF5IGJlIGxvc3QKLS5MWy1KXSAgICAgICAgOyBsaW5rIG5ldyBPYmotZm9ybWF0IChzbyB3ZSBnZXQgYSBsaWJyYXJ5KQotPQotOyAqICogKiAqIExpc3Qgb2YgbW9kdWxlcyAqICogKiAqIAotamNhcGltaW4uYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamNhcGlzdGQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamNjb2VmY3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamNjb2xvci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qY2RjdG1nci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQotamNodWZmLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqY2h1ZmYuaCkKLWpjaW5pdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qY21haW5jdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qY21hcmtlci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qY21hc3Rlci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qY29tYXBpLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpjcGFyYW0uYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamNwaHVmZi5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamNodWZmLmgpCi1qY3ByZXBjdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qY3NhbXBsZS5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qY3RyYW5zLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpkYXBpbWluLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpkYXBpc3RkLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpkYXRhZHN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oKQotamRhdGFzcmMuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgpCi1qZGNvZWZjdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qZGNvbG9yLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpkZGN0bWdyLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCi1qZGh1ZmYuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkaHVmZi5oKQotamRpbnB1dC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qZG1haW5jdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qZG1hcmtlci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qZG1hc3Rlci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qZG1lcmdlLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpkcGh1ZmYuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkaHVmZi5oKQotamRwb3N0Y3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamRzYW1wbGUuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamR0cmFucy5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qZXJyb3IuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanZlcnNpb24uaCxqZXJyb3IuaCkKLWpmZGN0Zmx0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCi1qZmRjdGZzdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQotamZkY3RpbnQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKLWppZGN0Zmx0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCi1qaWRjdGZzdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQotamlkY3RpbnQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKLWppZGN0cmVkLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCi1qcXVhbnQxLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpxdWFudDIuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotanV0aWxzLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWptZW1tZ3IuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGptZW1zeXMuaCkKLWptZW1hbnNpLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqbWVtc3lzLmgpCmRpZmYgLS1naXQgYS91bnVzZWQvbWFrdGpwZWcuc3QgYi91bnVzZWQvbWFrdGpwZWcuc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZjRkMTYuLjAwMDAwMDAKLS0tIGEvdW51c2VkL21ha3RqcGVnLnN0CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotOyBQcm9qZWN0IGZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotOwotOyBUaGlzIHByb2plY3QgZmlsZSBpcyBmb3IgQXRhcmkgU1QvU1RFL1RUIHN5c3RlbXMgdXNpbmcgUHVyZSBDIG9yIFR1cmJvIEMuCi07IFRoYW5rcyB0byBGcmFuayBNb2VobGUgKEZyYW5rLk1vZWhsZUBhcmJpLmluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZSksCi07IERyLiBCLiBTZXR6ZXBmYW5kdCAoYmVybmRAZ2luYS51bmktbXVlbnN0ZXIuZGUpLAotOyBhbmQgR3VpZG8gVm9sbGJlZGluZyAoZ3Vpdm9sQGVzYy5kZSkuCi07Ci07IFRvIHVzZSB0aGlzIGZpbGUsIHJlbmFtZSBpdCB0byBqcGVndHJhbi5wcmouCi07IElmIHlvdSBhcmUgdXNpbmcgVHVyYm8gQywgY2hhbmdlIGZpbGVuYW1lcyBiZWdpbm5pbmcgd2l0aCAicGMuLi4iIHRvICJ0Yy4uLiIKLTsgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSB0cnlpbmcgdG8gbWFrZSB0aGUgcHJvZ3JhbSEKLTsKLTsKLTsgICAgICAqICogKiBPdXRwdXQgZmlsZSAqICogKgotanBlZ3RyYW4udHRwCi07Ci07ICogKiAqIENPTVBJTEVSIE9QVElPTlMgKiAqICogIAotLkNbLVBdICAgICAgICA7IGFic29sdXRlIGNhbGxzCi0uQ1stTV0gICAgICAgIDsgYW5kIG5vIHN0cmluZyBtZXJnaW5nLCBmb2xrcwotLkNbLXctY2xuXSAgICA7IG5vICJjb25zdGFudCBpcyBsb25nIiB3YXJuaW5ncwotLkNbLXctcGFyXSAgICA7IG5vICJwYXJhbWV0ZXIgeHh4eCB1bnVzZWQiCi0uQ1stdy1yY2hdICAgIDsgbm8gInVucmVhY2hhYmxlIGNvZGUiCi0uQ1std3NpZ10gICAgIDsgd2FybiBpZiBzaWduaWZpY2FudCBkaWdpdHMgbWF5IGJlIGxvc3QKLT0KLTsgKiAqICogKiBMaXN0IG9mIG1vZHVsZXMgKiAqICogKiAKLXBjc3RhcnQubwotanBlZ3RyYW4uYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oLHRyYW5zdXBwLmgsanZlcnNpb24uaCkKLWNkanBlZy5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi1yZHN3aXRjaC5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi10cmFuc3VwcC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsdHJhbnN1cHAuaCkKLWxpYmpwZWcubGliICAgICAgICA7IGJ1aWx0IGJ5IGxpYmpwZWcucHJqCi1wY3N0ZGxpYi5saWIgICAgICAgOyBzdGFuZGFyZCBsaWJyYXJ5Ci1wY2V4dGxpYi5saWIgICAgICAgOyBleHRlbmRlZCBsaWJyYXJ5CmRpZmYgLS1naXQgYS91bnVzZWQvbWFrdm1zLm9wdCBiL3VudXNlZC9tYWt2bXMub3B0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzVlOGZlLi4wMDAwMDAwCi0tLSBhL3VudXNlZC9tYWt2bXMub3B0CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0hIEEgcG9pbnRlciB0byB0aGUgVkFYL1ZNUyBDIFJ1bi1UaW1lIFNoYXJlYWJsZSBMaWJyYXJ5LgotISBUaGlzIGZpbGUgaXMgbmVlZGVkIGJ5IG1ha2VmaWxlLm1tcyBhbmQgbWFrZWZpbGUudm1zLAotISBidXQgb25seSBmb3IgdGhlIG9sZGVyIFZBWCBDIGNvbXBpbGVyLiAgREVDIEMgZG9lcyBub3QgbmVlZCBpdC4KLVN5cyRMaWJyYXJ5OlZBWENSVEwuRVhFIC9TaGFyZQpkaWZmIC0tZ2l0IGEvdW51c2VkL3JkZ2lmLmMgYi91bnVzZWQvcmRnaWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI3YzE2Ny4uMDAwMDAwMAotLS0gYS91bnVzZWQvcmRnaWYuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiByZGdpZi5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gcmVhZCBpbnB1dCBpbWFnZXMgaW4gR0lGIGZvcm1hdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE5PVEU6IHRvIGF2b2lkIGVudGFuZ2xlbWVudHMgd2l0aCBVbmlzeXMnIHBhdGVudCBvbiBMWlcgY29tcHJlc3Npb24sICAgICAgKgotICogdGhlIGFiaWxpdHkgdG8gcmVhZCBHSUYgZmlsZXMgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBJSkcgZGlzdHJpYnV0aW9uLiAqCi0gKiBTb3JyeSBhYm91dCB0aGF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFdlIGFyZSByZXF1aXJlZCB0byBzdGF0ZSB0aGF0Ci0gKiAgICAiVGhlIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdChjKSBpcyB0aGUgQ29weXJpZ2h0IHByb3BlcnR5IG9mCi0gKiAgICBDb21wdVNlcnZlIEluY29ycG9yYXRlZC4gR0lGKHNtKSBpcyBhIFNlcnZpY2UgTWFyayBwcm9wZXJ0eSBvZgotICogICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuIgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0KLSNpZmRlZiBHSUZfU1VQUE9SVEVECi0KLS8qCi0gKiBUaGUgbW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lIGZvciBHSUYgZm9ybWF0IGlucHV0LgotICovCi0KLUdMT0JBTChjanBlZ19zb3VyY2VfcHRyKQotamluaXRfcmVhZF9naWYgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBmcHJpbnRmKHN0ZGVyciwgIkdJRiBpbnB1dCBpcyB1bnN1cHBvcnRlZCBmb3IgbGVnYWwgcmVhc29ucy4gIFNvcnJ5LlxuIik7Ci0gIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgcmV0dXJuIE5VTEw7CQkJLyoga2VlcCBjb21waWxlciBoYXBweSAqLwotfQotCi0jZW5kaWYgLyogR0lGX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvdW51c2VkL3dyZ2lmLmMgYi91bnVzZWQvd3JnaWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZlODMyOC4uMDAwMDAwMAotLS0gYS91bnVzZWQvd3JnaWYuYworKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vKgotICogd3JnaWYuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHdyaXRlIG91dHB1dCBpbWFnZXMgaW4gR0lGIGZvcm1hdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE5PVEU6IHRvIGF2b2lkIGVudGFuZ2xlbWVudHMgd2l0aCBVbmlzeXMnIHBhdGVudCBvbiBMWlcgY29tcHJlc3Npb24sICAgKgotICogdGhpcyBjb2RlIGhhcyBiZWVuIG1vZGlmaWVkIHRvIG91dHB1dCAidW5jb21wcmVzc2VkIEdJRiIgZmlsZXMuICAgICAgICAqCi0gKiBUaGVyZSBpcyBubyB0cmFjZSBvZiB0aGUgTFpXIGFsZ29yaXRobSBpbiB0aGlzIGZpbGUuICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCi0gKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBvdXRwdXQgdG8KLSAqIGFuIG9yZGluYXJ5IHN0ZGlvIHN0cmVhbS4KLSAqLwotCi0vKgotICogVGhpcyBjb2RlIGlzIGxvb3NlbHkgYmFzZWQgb24gcHBtdG9naWYgZnJvbSB0aGUgUEJNUExVUyBkaXN0cmlidXRpb24KLSAqIG9mIEZlYi4gMTk5MS4gIFRoYXQgZmlsZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBub3RpY2U6Ci0gKiAgICBCYXNlZCBvbiBHSUZFTkNPREUgYnkgRGF2aWQgUm93bGV5IDxtZ2FyZGlAd2F0ZHNjdS53YXRlcmxvby5lZHU+LgotICogICAgTGVtcGVsLVppdiBjb21wcmVzc2lvbiBiYXNlZCBvbiAiY29tcHJlc3MiIGJ5IFNwZW5jZXIgVy4gVGhvbWFzIGV0IGFsLgotICogICAgQ29weXJpZ2h0IChDKSAxOTg5IGJ5IEplZiBQb3NrYW56ZXIuCi0gKiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqICAgIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQKLSAqICAgIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0gKiAgICBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0gKiAgICBkb2N1bWVudGF0aW9uLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvcgotICogICAgaW1wbGllZCB3YXJyYW50eS4KLSAqCi0gKiBXZSBhcmUgYWxzbyByZXF1aXJlZCB0byBzdGF0ZSB0aGF0Ci0gKiAgICAiVGhlIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdChjKSBpcyB0aGUgQ29weXJpZ2h0IHByb3BlcnR5IG9mCi0gKiAgICBDb21wdVNlcnZlIEluY29ycG9yYXRlZC4gR0lGKHNtKSBpcyBhIFNlcnZpY2UgTWFyayBwcm9wZXJ0eSBvZgotICogICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuIgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0KLSNpZmRlZiBHSUZfU1VQUE9SVEVECi0KLQotLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIGRhdGEgZGVzdGluYXRpb24gb2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLwotCi0gIGpfZGVjb21wcmVzc19wdHIgY2luZm87CS8qIGJhY2sgbGluayBzYXZlcyBwYXNzaW5nIHNlcGFyYXRlIHBhcm0gKi8KLQotICAvKiBTdGF0ZSBmb3IgcGFja2luZyB2YXJpYWJsZS13aWR0aCBjb2RlcyBpbnRvIGEgYml0c3RyZWFtICovCi0gIGludCBuX2JpdHM7CQkJLyogY3VycmVudCBudW1iZXIgb2YgYml0cy9jb2RlICovCi0gIGludCBtYXhjb2RlOwkJCS8qIG1heGltdW0gY29kZSwgZ2l2ZW4gbl9iaXRzICovCi0gIElOVDMyIGN1cl9hY2N1bTsJCS8qIGhvbGRzIGJpdHMgbm90IHlldCBvdXRwdXQgKi8KLSAgaW50IGN1cl9iaXRzOwkJCS8qICMgb2YgYml0cyBpbiBjdXJfYWNjdW0gKi8KLQotICAvKiBTdGF0ZSBmb3IgR0lGIGNvZGUgYXNzaWdubWVudCAqLwotICBpbnQgQ2xlYXJDb2RlOwkJLyogY2xlYXIgY29kZSAoZG9lc24ndCBjaGFuZ2UpICovCi0gIGludCBFT0ZDb2RlOwkJCS8qIEVPRiBjb2RlIChkaXR0bykgKi8KLSAgaW50IGNvZGVfY291bnRlcjsJCS8qIGNvdW50cyBvdXRwdXQgc3ltYm9scyAqLwotCi0gIC8qIEdJRiBkYXRhIHBhY2tldCBjb25zdHJ1Y3Rpb24gYnVmZmVyICovCi0gIGludCBieXRlc2lucGt0OwkJLyogIyBvZiBieXRlcyBpbiBjdXJyZW50IHBhY2tldCAqLwotICBjaGFyIHBhY2tldGJ1ZlsyNTZdOwkJLyogd29ya3NwYWNlIGZvciBhY2N1bXVsYXRpbmcgcGFja2V0ICovCi0KLX0gZ2lmX2Rlc3Rfc3RydWN0OwotCi10eXBlZGVmIGdpZl9kZXN0X3N0cnVjdCAqIGdpZl9kZXN0X3B0cjsKLQotLyogTGFyZ2VzdCB2YWx1ZSB0aGF0IHdpbGwgZml0IGluIE4gYml0cyAqLwotI2RlZmluZSBNQVhDT0RFKG5fYml0cykJKCgxIDw8IChuX2JpdHMpKSAtIDEpCi0KLQotLyoKLSAqIFJvdXRpbmVzIHRvIHBhY2thZ2UgZmluaXNoZWQgZGF0YSBieXRlcyBpbnRvIEdJRiBkYXRhIGJsb2Nrcy4KLSAqIEEgZGF0YSBibG9jayBjb25zaXN0cyBvZiBhIGNvdW50IGJ5dGUgKDEuLjI1NSkgYW5kIHRoYXQgbWFueSBkYXRhIGJ5dGVzLgotICovCi0KLUxPQ0FMKHZvaWQpCi1mbHVzaF9wYWNrZXQgKGdpZl9kZXN0X3B0ciBkaW5mbykKLS8qIGZsdXNoIGFueSBhY2N1bXVsYXRlZCBkYXRhICovCi17Ci0gIGlmIChkaW5mby0+Ynl0ZXNpbnBrdCA+IDApIHsJLyogbmV2ZXIgd3JpdGUgemVyby1sZW5ndGggcGFja2V0ICovCi0gICAgZGluZm8tPnBhY2tldGJ1ZlswXSA9IChjaGFyKSBkaW5mby0+Ynl0ZXNpbnBrdCsrOwotICAgIGlmIChKRldSSVRFKGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUsIGRpbmZvLT5wYWNrZXRidWYsIGRpbmZvLT5ieXRlc2lucGt0KQotCSE9IChzaXplX3QpIGRpbmZvLT5ieXRlc2lucGt0KQotICAgICAgRVJSRVhJVChkaW5mby0+Y2luZm8sIEpFUlJfRklMRV9XUklURSk7Ci0gICAgZGluZm8tPmJ5dGVzaW5wa3QgPSAwOwotICB9Ci19Ci0KLQotLyogQWRkIGEgY2hhcmFjdGVyIHRvIGN1cnJlbnQgcGFja2V0OyBmbHVzaCB0byBkaXNrIGlmIG5lY2Vzc2FyeSAqLwotI2RlZmluZSBDSEFSX09VVChkaW5mbyxjKSAgXAotCXsgKGRpbmZvKS0+cGFja2V0YnVmWysrKGRpbmZvKS0+Ynl0ZXNpbnBrdF0gPSAoY2hhcikgKGMpOyAgXAotCSAgICBpZiAoKGRpbmZvKS0+Ynl0ZXNpbnBrdCA+PSAyNTUpICBcCi0JICAgICAgZmx1c2hfcGFja2V0KGRpbmZvKTsgIFwKLQl9Ci0KLQotLyogUm91dGluZSB0byBjb252ZXJ0IHZhcmlhYmxlLXdpZHRoIGNvZGVzIGludG8gYSBieXRlIHN0cmVhbSAqLwotCi1MT0NBTCh2b2lkKQotb3V0cHV0IChnaWZfZGVzdF9wdHIgZGluZm8sIGludCBjb2RlKQotLyogRW1pdCBhIGNvZGUgb2Ygbl9iaXRzIGJpdHMgKi8KLS8qIFVzZXMgY3VyX2FjY3VtIGFuZCBjdXJfYml0cyB0byByZWJsb2NrIGludG8gOC1iaXQgYnl0ZXMgKi8KLXsKLSAgZGluZm8tPmN1cl9hY2N1bSB8PSAoKElOVDMyKSBjb2RlKSA8PCBkaW5mby0+Y3VyX2JpdHM7Ci0gIGRpbmZvLT5jdXJfYml0cyArPSBkaW5mby0+bl9iaXRzOwotCi0gIHdoaWxlIChkaW5mby0+Y3VyX2JpdHMgPj0gOCkgewotICAgIENIQVJfT1VUKGRpbmZvLCBkaW5mby0+Y3VyX2FjY3VtICYgMHhGRik7Ci0gICAgZGluZm8tPmN1cl9hY2N1bSA+Pj0gODsKLSAgICBkaW5mby0+Y3VyX2JpdHMgLT0gODsKLSAgfQotfQotCi0KLS8qIFRoZSBwc2V1ZG8tY29tcHJlc3Npb24gYWxnb3JpdGhtLgotICoKLSAqIEluIHRoaXMgbW9kdWxlIHdlIHNpbXBseSBvdXRwdXQgZWFjaCBwaXhlbCB2YWx1ZSBhcyBhIHNlcGFyYXRlIHN5bWJvbDsKLSAqIHRodXMsIG5vIGNvbXByZXNzaW9uIG9jY3Vycy4gIEluIGZhY3QsIHRoZXJlIGlzIGV4cGFuc2lvbiBvZiBvbmUgYml0IHBlcgotICogcGl4ZWwsIGJlY2F1c2Ugd2UgdXNlIGEgc3ltYm9sIHdpZHRoIG9uZSBiaXQgd2lkZXIgdGhhbiB0aGUgcGl4ZWwgd2lkdGguCi0gKgotICogR0lGIG9yZGluYXJpbHkgdXNlcyB2YXJpYWJsZS13aWR0aCBzeW1ib2xzLCBhbmQgdGhlIGRlY29kZXIgd2lsbCBleHBlY3QKLSAqIHRvIHJhdGNoZXQgdXAgdGhlIHN5bWJvbCB3aWR0aCBhZnRlciBhIGZpeGVkIG51bWJlciBvZiBzeW1ib2xzLgotICogVG8gc2ltcGxpZnkgdGhlIGxvZ2ljIGFuZCBrZWVwIHRoZSBleHBhbnNpb24gcGVuYWx0eSBkb3duLCB3ZSBlbWl0IGEKLSAqIEdJRiBDbGVhciBjb2RlIHRvIHJlc2V0IHRoZSBkZWNvZGVyIGp1c3QgYmVmb3JlIHRoZSB3aWR0aCB3b3VsZCByYXRjaGV0IHVwLgotICogVGh1cywgYWxsIHRoZSBzeW1ib2xzIGluIHRoZSBvdXRwdXQgZmlsZSB3aWxsIGhhdmUgdGhlIHNhbWUgYml0IHdpZHRoLgotICogTm90ZSB0aGF0IGVtaXR0aW5nIHRoZSBDbGVhciBjb2RlcyBhdCB0aGUgcmlnaHQgdGltZXMgaXMgYSBtZXJlIG1hdHRlciBvZgotICogY291bnRpbmcgb3V0cHV0IHN5bWJvbHMgYW5kIGlzIGluIG5vIHdheSBkZXBlbmRlbnQgb24gdGhlIExaVyBwYXRlbnQuCi0gKgotICogV2l0aCBhIHNtYWxsIGJhc2ljIHBpeGVsIHdpZHRoIChsb3cgY29sb3IgY291bnQpLCBDbGVhciBjb2RlcyB3aWxsIGJlCi0gKiBuZWVkZWQgdmVyeSBmcmVxdWVudGx5LCBjYXVzaW5nIHRoZSBmaWxlIHRvIGV4cGFuZCBldmVuIG1vcmUuICBTbyB0aGlzCi0gKiBzaW1wbGlzdGljIGFwcHJvYWNoIHdvdWxkbid0IHdvcmsgdG9vIHdlbGwgb24gYmlsZXZlbCBpbWFnZXMsIGZvciBleGFtcGxlLgotICogQnV0IGZvciBvdXRwdXQgb2YgSlBFRyBjb252ZXJzaW9ucyB0aGUgcGl4ZWwgd2lkdGggd2lsbCB1c3VhbGx5IGJlIDggYml0cwotICogKDEyOSB0byAyNTYgY29sb3JzKSwgc28gdGhlIG92ZXJoZWFkIGFkZGVkIGJ5IENsZWFyIHN5bWJvbHMgaXMgb25seSBhYm91dAotICogb25lIHN5bWJvbCBpbiBldmVyeSAyNTYuCi0gKi8KLQotTE9DQUwodm9pZCkKLWNvbXByZXNzX2luaXQgKGdpZl9kZXN0X3B0ciBkaW5mbywgaW50IGlfYml0cykKLS8qIEluaXRpYWxpemUgcHNldWRvLWNvbXByZXNzb3IgKi8KLXsKLSAgLyogaW5pdCBhbGwgdGhlIHN0YXRlIHZhcmlhYmxlcyAqLwotICBkaW5mby0+bl9iaXRzID0gaV9iaXRzOwotICBkaW5mby0+bWF4Y29kZSA9IE1BWENPREUoZGluZm8tPm5fYml0cyk7Ci0gIGRpbmZvLT5DbGVhckNvZGUgPSAoMSA8PCAoaV9iaXRzIC0gMSkpOwotICBkaW5mby0+RU9GQ29kZSA9IGRpbmZvLT5DbGVhckNvZGUgKyAxOwotICBkaW5mby0+Y29kZV9jb3VudGVyID0gZGluZm8tPkNsZWFyQ29kZSArIDI7Ci0gIC8qIGluaXQgb3V0cHV0IGJ1ZmZlcmluZyB2YXJzICovCi0gIGRpbmZvLT5ieXRlc2lucGt0ID0gMDsKLSAgZGluZm8tPmN1cl9hY2N1bSA9IDA7Ci0gIGRpbmZvLT5jdXJfYml0cyA9IDA7Ci0gIC8qIEdJRiBzcGVjaWZpZXMgYW4gaW5pdGlhbCBDbGVhciBjb2RlICovCi0gIG91dHB1dChkaW5mbywgZGluZm8tPkNsZWFyQ29kZSk7Ci19Ci0KLQotTE9DQUwodm9pZCkKLWNvbXByZXNzX3BpeGVsIChnaWZfZGVzdF9wdHIgZGluZm8sIGludCBjKQotLyogQWNjZXB0IGFuZCAiY29tcHJlc3MiIG9uZSBwaXhlbCB2YWx1ZS4KLSAqIFRoZSBnaXZlbiB2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBuX2JpdHMgd2lkZS4KLSAqLwotewotICAvKiBPdXRwdXQgdGhlIGdpdmVuIHBpeGVsIHZhbHVlIGFzIGEgc3ltYm9sLiAqLwotICBvdXRwdXQoZGluZm8sIGMpOwotICAvKiBJc3N1ZSBDbGVhciBjb2RlcyBvZnRlbiBlbm91Z2ggdG8ga2VlcCB0aGUgcmVhZGVyIGZyb20gcmF0Y2hldGluZyB1cAotICAgKiBpdHMgc3ltYm9sIHNpemUuCi0gICAqLwotICBpZiAoZGluZm8tPmNvZGVfY291bnRlciA8IGRpbmZvLT5tYXhjb2RlKSB7Ci0gICAgZGluZm8tPmNvZGVfY291bnRlcisrOwotICB9IGVsc2UgewotICAgIG91dHB1dChkaW5mbywgZGluZm8tPkNsZWFyQ29kZSk7Ci0gICAgZGluZm8tPmNvZGVfY291bnRlciA9IGRpbmZvLT5DbGVhckNvZGUgKyAyOwkvKiByZXNldCB0aGUgY291bnRlciAqLwotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLWNvbXByZXNzX3Rlcm0gKGdpZl9kZXN0X3B0ciBkaW5mbykKLS8qIENsZWFuIHVwIGF0IGVuZCAqLwotewotICAvKiBTZW5kIGFuIEVPRiBjb2RlICovCi0gIG91dHB1dChkaW5mbywgZGluZm8tPkVPRkNvZGUpOwotICAvKiBGbHVzaCB0aGUgYml0LXBhY2tpbmcgYnVmZmVyICovCi0gIGlmIChkaW5mby0+Y3VyX2JpdHMgPiAwKSB7Ci0gICAgQ0hBUl9PVVQoZGluZm8sIGRpbmZvLT5jdXJfYWNjdW0gJiAweEZGKTsKLSAgfQotICAvKiBGbHVzaCB0aGUgcGFja2V0IGJ1ZmZlciAqLwotICBmbHVzaF9wYWNrZXQoZGluZm8pOwotfQotCi0KLS8qIEdJRiBoZWFkZXIgY29uc3RydWN0aW9uICovCi0KLQotTE9DQUwodm9pZCkKLXB1dF93b3JkIChnaWZfZGVzdF9wdHIgZGluZm8sIHVuc2lnbmVkIGludCB3KQotLyogRW1pdCBhIDE2LWJpdCB3b3JkLCBMU0IgZmlyc3QgKi8KLXsKLSAgcHV0Yyh3ICYgMHhGRiwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIHB1dGMoKHcgPj4gOCkgJiAweEZGLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLX0KLQotCi1MT0NBTCh2b2lkKQotcHV0XzNieXRlcyAoZ2lmX2Rlc3RfcHRyIGRpbmZvLCBpbnQgdmFsKQotLyogRW1pdCAzIGNvcGllcyBvZiBzYW1lIGJ5dGUgdmFsdWUgLS0tIGhhbmR5IHN1YnIgZm9yIGNvbG9ybWFwIGNvbnN0cnVjdGlvbiAqLwotewotICBwdXRjKHZhbCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIHB1dGModmFsLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLSAgcHV0Yyh2YWwsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X2hlYWRlciAoZ2lmX2Rlc3RfcHRyIGRpbmZvLCBpbnQgbnVtX2NvbG9ycywgSlNBTVBBUlJBWSBjb2xvcm1hcCkKLS8qIE91dHB1dCB0aGUgR0lGIGZpbGUgaGVhZGVyLCBpbmNsdWRpbmcgY29sb3IgbWFwICovCi0vKiBJZiBjb2xvcm1hcD09TlVMTCwgc3ludGhlc2l6ZSBhIGdyYXktc2NhbGUgY29sb3JtYXAgKi8KLXsKLSAgaW50IEJpdHNQZXJQaXhlbCwgQ29sb3JNYXBTaXplLCBJbml0Q29kZVNpemUsIEZsYWdCeXRlOwotICBpbnQgY3NoaWZ0ID0gZGluZm8tPmNpbmZvLT5kYXRhX3ByZWNpc2lvbiAtIDg7Ci0gIGludCBpOwotCi0gIGlmIChudW1fY29sb3JzID4gMjU2KQotICAgIEVSUkVYSVQxKGRpbmZvLT5jaW5mbywgSkVSUl9UT09fTUFOWV9DT0xPUlMsIG51bV9jb2xvcnMpOwotICAvKiBDb21wdXRlIGJpdHMvcGl4ZWwgYW5kIHJlbGF0ZWQgdmFsdWVzICovCi0gIEJpdHNQZXJQaXhlbCA9IDE7Ci0gIHdoaWxlIChudW1fY29sb3JzID4gKDEgPDwgQml0c1BlclBpeGVsKSkKLSAgICBCaXRzUGVyUGl4ZWwrKzsKLSAgQ29sb3JNYXBTaXplID0gMSA8PCBCaXRzUGVyUGl4ZWw7Ci0gIGlmIChCaXRzUGVyUGl4ZWwgPD0gMSkKLSAgICBJbml0Q29kZVNpemUgPSAyOwotICBlbHNlCi0gICAgSW5pdENvZGVTaXplID0gQml0c1BlclBpeGVsOwotICAvKgotICAgKiBXcml0ZSB0aGUgR0lGIGhlYWRlci4KLSAgICogTm90ZSB0aGF0IHdlIGdlbmVyYXRlIGEgcGxhaW4gR0lGODcgaGVhZGVyIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkuCi0gICAqLwotICBwdXRjKCdHJywgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIHB1dGMoJ0knLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLSAgcHV0YygnRicsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotICBwdXRjKCc4JywgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIHB1dGMoJzcnLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLSAgcHV0YygnYScsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotICAvKiBXcml0ZSB0aGUgTG9naWNhbCBTY3JlZW4gRGVzY3JpcHRvciAqLwotICBwdXRfd29yZChkaW5mbywgKHVuc2lnbmVkIGludCkgZGluZm8tPmNpbmZvLT5vdXRwdXRfd2lkdGgpOwotICBwdXRfd29yZChkaW5mbywgKHVuc2lnbmVkIGludCkgZGluZm8tPmNpbmZvLT5vdXRwdXRfaGVpZ2h0KTsKLSAgRmxhZ0J5dGUgPSAweDgwOwkJLyogWWVzLCB0aGVyZSBpcyBhIGdsb2JhbCBjb2xvciB0YWJsZSAqLwotICBGbGFnQnl0ZSB8PSAoQml0c1BlclBpeGVsLTEpIDw8IDQ7IC8qIGNvbG9yIHJlc29sdXRpb24gKi8KLSAgRmxhZ0J5dGUgfD0gKEJpdHNQZXJQaXhlbC0xKTsJLyogc2l6ZSBvZiBnbG9iYWwgY29sb3IgdGFibGUgKi8KLSAgcHV0YyhGbGFnQnl0ZSwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIHB1dGMoMCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7IC8qIEJhY2tncm91bmQgY29sb3IgaW5kZXggKi8KLSAgcHV0YygwLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsgLyogUmVzZXJ2ZWQgKGFzcGVjdCByYXRpbyBpbiBHSUY4OSkgKi8KLSAgLyogV3JpdGUgdGhlIEdsb2JhbCBDb2xvciBNYXAgKi8KLSAgLyogSWYgdGhlIGNvbG9yIG1hcCBpcyBtb3JlIHRoYW4gOCBiaXRzIHByZWNpc2lvbiwgKi8KLSAgLyogd2UgcmVkdWNlIGl0IHRvIDggYml0cyBieSBzaGlmdGluZyAqLwotICBmb3IgKGk9MDsgaSA8IENvbG9yTWFwU2l6ZTsgaSsrKSB7Ci0gICAgaWYgKGkgPCBudW1fY29sb3JzKSB7Ci0gICAgICBpZiAoY29sb3JtYXAgIT0gTlVMTCkgewotCWlmIChkaW5mby0+Y2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7Ci0JICAvKiBOb3JtYWwgY2FzZTogUkdCIGNvbG9yIG1hcCAqLwotCSAgcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzBdW2ldKSA+PiBjc2hpZnQsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotCSAgcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzFdW2ldKSA+PiBjc2hpZnQsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotCSAgcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzJdW2ldKSA+PiBjc2hpZnQsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotCX0gZWxzZSB7Ci0JICAvKiBHcmF5c2NhbGUgImNvbG9yIG1hcCI6IHBvc3NpYmxlIGlmIHF1YW50aXppbmcgZ3JheXNjYWxlIGltYWdlICovCi0JICBwdXRfM2J5dGVzKGRpbmZvLCBHRVRKU0FNUExFKGNvbG9ybWFwWzBdW2ldKSA+PiBjc2hpZnQpOwotCX0KLSAgICAgIH0gZWxzZSB7Ci0JLyogQ3JlYXRlIGEgZ3JheS1zY2FsZSBtYXAgb2YgbnVtX2NvbG9ycyB2YWx1ZXMsIHJhbmdlIDAuLjI1NSAqLwotCXB1dF8zYnl0ZXMoZGluZm8sIChpICogMjU1ICsgKG51bV9jb2xvcnMtMSkvMikgLyAobnVtX2NvbG9ycy0xKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIGZpbGwgb3V0IHRoZSBtYXAgdG8gYSBwb3dlciBvZiAyICovCi0gICAgICBwdXRfM2J5dGVzKGRpbmZvLCAwKTsKLSAgICB9Ci0gIH0KLSAgLyogV3JpdGUgaW1hZ2Ugc2VwYXJhdG9yIGFuZCBJbWFnZSBEZXNjcmlwdG9yICovCi0gIHB1dGMoJywnLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsgLyogc2VwYXJhdG9yICovCi0gIHB1dF93b3JkKGRpbmZvLCAwKTsJCS8qIGxlZnQvdG9wIG9mZnNldCAqLwotICBwdXRfd29yZChkaW5mbywgMCk7Ci0gIHB1dF93b3JkKGRpbmZvLCAodW5zaWduZWQgaW50KSBkaW5mby0+Y2luZm8tPm91dHB1dF93aWR0aCk7IC8qIGltYWdlIHNpemUgKi8KLSAgcHV0X3dvcmQoZGluZm8sICh1bnNpZ25lZCBpbnQpIGRpbmZvLT5jaW5mby0+b3V0cHV0X2hlaWdodCk7Ci0gIC8qIGZsYWcgYnl0ZTogbm90IGludGVybGFjZWQsIG5vIGxvY2FsIGNvbG9yIG1hcCAqLwotICBwdXRjKDB4MDAsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotICAvKiBXcml0ZSBJbml0aWFsIENvZGUgU2l6ZSBieXRlICovCi0gIHB1dGMoSW5pdENvZGVTaXplLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLQotICAvKiBJbml0aWFsaXplIGZvciAiY29tcHJlc3Npb24iIG9mIGltYWdlIGRhdGEgKi8KLSAgY29tcHJlc3NfaW5pdChkaW5mbywgSW5pdENvZGVTaXplKzEpOwotfQotCi0KLS8qCi0gKiBTdGFydHVwOiB3cml0ZSB0aGUgZmlsZSBoZWFkZXIuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9vdXRwdXRfZ2lmIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKLXsKLSAgZ2lmX2Rlc3RfcHRyIGRlc3QgPSAoZ2lmX2Rlc3RfcHRyKSBkaW5mbzsKLQotICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykKLSAgICBlbWl0X2hlYWRlcihkZXN0LCBjaW5mby0+YWN0dWFsX251bWJlcl9vZl9jb2xvcnMsIGNpbmZvLT5jb2xvcm1hcCk7Ci0gIGVsc2UKLSAgICBlbWl0X2hlYWRlcihkZXN0LCAyNTYsIChKU0FNUEFSUkFZKSBOVUxMKTsKLX0KLQotCi0vKgotICogV3JpdGUgc29tZSBwaXhlbCBkYXRhLgotICogSW4gdGhpcyBtb2R1bGUgcm93c19zdXBwbGllZCB3aWxsIGFsd2F5cyBiZSAxLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcHV0X3BpeGVsX3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAotCQlKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCi17Ci0gIGdpZl9kZXN0X3B0ciBkZXN0ID0gKGdpZl9kZXN0X3B0cikgZGluZm87Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgcHRyID0gZGVzdC0+cHViLmJ1ZmZlclswXTsKLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgIGNvbXByZXNzX3BpeGVsKGRlc3QsIEdFVEpTQU1QTEUoKnB0cisrKSk7Ci0gIH0KLX0KLQotCi0vKgotICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfb3V0cHV0X2dpZiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCi17Ci0gIGdpZl9kZXN0X3B0ciBkZXN0ID0gKGdpZl9kZXN0X3B0cikgZGluZm87Ci0KLSAgLyogRmx1c2ggImNvbXByZXNzaW9uIiBtZWNoYW5pc20gKi8KLSAgY29tcHJlc3NfdGVybShkZXN0KTsKLSAgLyogV3JpdGUgYSB6ZXJvLWxlbmd0aCBkYXRhIGJsb2NrIHRvIGVuZCB0aGUgc2VyaWVzICovCi0gIHB1dGMoMCwgZGVzdC0+cHViLm91dHB1dF9maWxlKTsKLSAgLyogV3JpdGUgdGhlIEdJRiB0ZXJtaW5hdG9yIG1hcmsgKi8KLSAgcHV0YygnOycsIGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIC8qIE1ha2Ugc3VyZSB3ZSB3cm90ZSB0aGUgb3V0cHV0IGZpbGUgT0sgKi8KLSAgZmZsdXNoKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIGlmIChmZXJyb3IoZGVzdC0+cHViLm91dHB1dF9maWxlKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOwotfQotCi0KLS8qCi0gKiBUaGUgbW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lIGZvciBHSUYgZm9ybWF0IG91dHB1dC4KLSAqLwotCi1HTE9CQUwoZGpwZWdfZGVzdF9wdHIpCi1qaW5pdF93cml0ZV9naWYgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGdpZl9kZXN0X3B0ciBkZXN0OwotCi0gIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCwgZmlsbCBpbiBtZXRob2QgcG9pbnRlcnMgKi8KLSAgZGVzdCA9IChnaWZfZGVzdF9wdHIpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgU0laRU9GKGdpZl9kZXN0X3N0cnVjdCkpOwotICBkZXN0LT5jaW5mbyA9IGNpbmZvOwkJLyogbWFrZSBiYWNrIGxpbmsgZm9yIHN1YnJvdXRpbmVzICovCi0gIGRlc3QtPnB1Yi5zdGFydF9vdXRwdXQgPSBzdGFydF9vdXRwdXRfZ2lmOwotICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfcGl4ZWxfcm93czsKLSAgZGVzdC0+cHViLmZpbmlzaF9vdXRwdXQgPSBmaW5pc2hfb3V0cHV0X2dpZjsKLQotICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSAhPSBKQ1NfR1JBWVNDQUxFICYmCi0gICAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlICE9IEpDU19SR0IpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9HSUZfQ09MT1JTUEFDRSk7Ci0KLSAgLyogRm9yY2UgcXVhbnRpemF0aW9uIGlmIGNvbG9yIG9yIGlmID4gOCBiaXRzIGlucHV0ICovCi0gIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlICE9IEpDU19HUkFZU0NBTEUgfHwgY2luZm8tPmRhdGFfcHJlY2lzaW9uID4gOCkgewotICAgIC8qIEZvcmNlIHF1YW50aXphdGlvbiB0byBhdCBtb3N0IDI1NiBjb2xvcnMgKi8KLSAgICBjaW5mby0+cXVhbnRpemVfY29sb3JzID0gVFJVRTsKLSAgICBpZiAoY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9ycyA+IDI1NikKLSAgICAgIGNpbmZvLT5kZXNpcmVkX251bWJlcl9vZl9jb2xvcnMgPSAyNTY7Ci0gIH0KLQotICAvKiBDYWxjdWxhdGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgc28gd2UgY2FuIGFsbG9jYXRlIHNwYWNlICovCi0gIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyhjaW5mbyk7Ci0KLSAgaWYgKGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyAhPSAxKSAvKiBzYWZldHkgY2hlY2s6IGp1c3Qgb25lIGNvbXBvbmVudD8gKi8KLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0dJRl9CVUcpOwotCi0gIC8qIENyZWF0ZSBkZWNvbXByZXNzb3Igb3V0cHV0IGJ1ZmZlci4gKi8KLSAgZGVzdC0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIGNpbmZvLT5vdXRwdXRfd2lkdGgsIChKRElNRU5TSU9OKSAxKTsKLSAgZGVzdC0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOwotCi0gIHJldHVybiAoZGpwZWdfZGVzdF9wdHIpIGRlc3Q7Ci19Ci0KLSNlbmRpZiAvKiBHSUZfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS91c2FnZS5kb2MgYi91c2FnZS5kb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDk3MGEuLjAwMDAwMDAKLS0tIGEvdXNhZ2UuZG9jCisrKyAvZGV2L251bGwKQEAgLTEsNTYyICswLDAgQEAKLVVTQUdFIGluc3RydWN0aW9ucyBmb3IgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBKUEVHIHNvZnR3YXJlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIGZpbGUgZGVzY3JpYmVzIHVzYWdlIG9mIHRoZSBKUEVHIGNvbnZlcnNpb24gcHJvZ3JhbXMgY2pwZWcgYW5kIGRqcGVnLAotYXMgd2VsbCBhcyB0aGUgdXRpbGl0eSBwcm9ncmFtcyBqcGVndHJhbiwgcmRqcGdjb20gYW5kIHdyanBnY29tLiAgKFNlZQotdGhlIG90aGVyIGRvY3VtZW50YXRpb24gZmlsZXMgaWYgeW91IHdpc2ggdG8gdXNlIHRoZSBKUEVHIGxpYnJhcnkgd2l0aGluCi15b3VyIG93biBwcm9ncmFtcy4pCi0KLUlmIHlvdSBhcmUgb24gYSBVbml4IG1hY2hpbmUgeW91IG1heSBwcmVmZXIgdG8gcmVhZCB0aGUgVW5peC1zdHlsZSBtYW51YWwKLXBhZ2VzIGluIGZpbGVzIGNqcGVnLjEsIGRqcGVnLjEsIGpwZWd0cmFuLjEsIHJkanBnY29tLjEsIHdyanBnY29tLjEuCi0KLQotSU5UUk9EVUNUSU9OCi0KLVRoZXNlIHByb2dyYW1zIGltcGxlbWVudCBKUEVHIGltYWdlIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLiAgSlBFRwotKHByb25vdW5jZWQgImpheS1wZWciKSBpcyBhIHN0YW5kYXJkaXplZCBjb21wcmVzc2lvbiBtZXRob2QgZm9yIGZ1bGwtY29sb3IKLWFuZCBncmF5LXNjYWxlIGltYWdlcy4gIEpQRUcgaXMgZGVzaWduZWQgdG8gaGFuZGxlICJyZWFsLXdvcmxkIiBzY2VuZXMsCi1mb3IgZXhhbXBsZSBzY2FubmVkIHBob3RvZ3JhcGhzLiAgQ2FydG9vbnMsIGxpbmUgZHJhd2luZ3MsIGFuZCBvdGhlcgotbm9uLXJlYWxpc3RpYyBpbWFnZXMgYXJlIG5vdCBKUEVHJ3Mgc3Ryb25nIHN1aXQ7IG9uIHRoYXQgc29ydCBvZiBtYXRlcmlhbAoteW91IG1heSBnZXQgcG9vciBpbWFnZSBxdWFsaXR5IGFuZC9vciBsaXR0bGUgY29tcHJlc3Npb24uCi0KLUpQRUcgaXMgbG9zc3ksIG1lYW5pbmcgdGhhdCB0aGUgb3V0cHV0IGltYWdlIGlzIG5vdCBuZWNlc3NhcmlseSBpZGVudGljYWwgdG8KLXRoZSBpbnB1dCBpbWFnZS4gIEhlbmNlIHlvdSBzaG91bGQgbm90IHVzZSBKUEVHIGlmIHlvdSBoYXZlIHRvIGhhdmUgaWRlbnRpY2FsCi1vdXRwdXQgYml0cy4gIEhvd2V2ZXIsIG9uIHR5cGljYWwgcmVhbC13b3JsZCBpbWFnZXMsIHZlcnkgZ29vZCBjb21wcmVzc2lvbgotbGV2ZWxzIGNhbiBiZSBvYnRhaW5lZCB3aXRoIG5vIHZpc2libGUgY2hhbmdlLCBhbmQgYW1hemluZ2x5IGhpZ2ggY29tcHJlc3Npb24KLWlzIHBvc3NpYmxlIGlmIHlvdSBjYW4gdG9sZXJhdGUgYSBsb3ctcXVhbGl0eSBpbWFnZS4gIFlvdSBjYW4gdHJhZGUgb2ZmIGltYWdlCi1xdWFsaXR5IGFnYWluc3QgZmlsZSBzaXplIGJ5IGFkanVzdGluZyB0aGUgY29tcHJlc3NvcidzICJxdWFsaXR5IiBzZXR0aW5nLgotCi0KLUdFTkVSQUwgVVNBR0UKLQotV2UgcHJvdmlkZSB0d28gcHJvZ3JhbXMsIGNqcGVnIHRvIGNvbXByZXNzIGFuIGltYWdlIGZpbGUgaW50byBKUEVHIGZvcm1hdCwKLWFuZCBkanBlZyB0byBkZWNvbXByZXNzIGEgSlBFRyBmaWxlIGJhY2sgaW50byBhIGNvbnZlbnRpb25hbCBpbWFnZSBmb3JtYXQuCi0KLU9uIFVuaXgtbGlrZSBzeXN0ZW1zLCB5b3Ugc2F5OgotCWNqcGVnIFtzd2l0Y2hlc10gW2ltYWdlZmlsZV0gPmpwZWdmaWxlCi1vcgotCWRqcGVnIFtzd2l0Y2hlc10gW2pwZWdmaWxlXSAgPmltYWdlZmlsZQotVGhlIHByb2dyYW1zIHJlYWQgdGhlIHNwZWNpZmllZCBpbnB1dCBmaWxlLCBvciBzdGFuZGFyZCBpbnB1dCBpZiBub25lIGlzCi1uYW1lZC4gIFRoZXkgYWx3YXlzIHdyaXRlIHRvIHN0YW5kYXJkIG91dHB1dCAod2l0aCB0cmFjZS9lcnJvciBtZXNzYWdlcyB0bwotc3RhbmRhcmQgZXJyb3IpLiAgVGhlc2UgY29udmVudGlvbnMgYXJlIGhhbmR5IGZvciBwaXBpbmcgaW1hZ2VzIGJldHdlZW4KLXByb2dyYW1zLgotCi1PbiBtb3N0IG5vbi1Vbml4IHN5c3RlbXMsIHlvdSBzYXk6Ci0JY2pwZWcgW3N3aXRjaGVzXSBpbWFnZWZpbGUganBlZ2ZpbGUKLW9yCi0JZGpwZWcgW3N3aXRjaGVzXSBqcGVnZmlsZSAgaW1hZ2VmaWxlCi1pLmUuLCBib3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIGFyZSBuYW1lZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgVGhpcwotc3R5bGUgaXMgYSBsaXR0bGUgbW9yZSBmb29scHJvb2YsIGFuZCBpdCBsb3NlcyBubyBmdW5jdGlvbmFsaXR5IGlmIHlvdSBkb24ndAotaGF2ZSBwaXBlcy4gIChZb3UgY2FuIGdldCB0aGlzIHN0eWxlIG9uIFVuaXggdG9vLCBpZiB5b3UgcHJlZmVyLCBieSBkZWZpbmluZwotVFdPX0ZJTEVfQ09NTUFORExJTkUgd2hlbiB5b3UgY29tcGlsZSB0aGUgcHJvZ3JhbXM7IHNlZSBpbnN0YWxsLmRvYy4pCi0KLVlvdSBjYW4gYWxzbyBzYXk6Ci0JY2pwZWcgW3N3aXRjaGVzXSAtb3V0ZmlsZSBqcGVnZmlsZSAgaW1hZ2VmaWxlCi1vcgotCWRqcGVnIFtzd2l0Y2hlc10gLW91dGZpbGUgaW1hZ2VmaWxlICBqcGVnZmlsZQotVGhpcyBzeW50YXggd29ya3Mgb24gYWxsIHN5c3RlbXMsIHNvIGl0IGlzIHVzZWZ1bCBmb3Igc2NyaXB0cy4KLQotVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgaW1hZ2UgZmlsZSBmb3JtYXRzIGFyZTogUFBNIChQQk1QTFVTIGNvbG9yIGZvcm1hdCksCi1QR00gKFBCTVBMVVMgZ3JheS1zY2FsZSBmb3JtYXQpLCBCTVAsIFRhcmdhLCBhbmQgUkxFIChVdGFoIFJhc3RlciBUb29sa2l0Ci1mb3JtYXQpLiAgKFJMRSBpcyBzdXBwb3J0ZWQgb25seSBpZiB0aGUgVVJUIGxpYnJhcnkgaXMgYXZhaWxhYmxlLikKLWNqcGVnIHJlY29nbml6ZXMgdGhlIGlucHV0IGltYWdlIGZvcm1hdCBhdXRvbWF0aWNhbGx5LCB3aXRoIHRoZSBleGNlcHRpb24KLW9mIHNvbWUgVGFyZ2EtZm9ybWF0IGZpbGVzLiAgWW91IGhhdmUgdG8gdGVsbCBkanBlZyB3aGljaCBmb3JtYXQgdG8gZ2VuZXJhdGUuCi0KLUpQRUcgZmlsZXMgYXJlIGluIHRoZSBkZWZhY3RvIHN0YW5kYXJkIEpGSUYgZmlsZSBmb3JtYXQuICBUaGVyZSBhcmUgb3RoZXIsCi1sZXNzIHdpZGVseSB1c2VkIEpQRUctYmFzZWQgZmlsZSBmb3JtYXRzLCBidXQgd2UgZG9uJ3Qgc3VwcG9ydCB0aGVtLgotCi1BbGwgc3dpdGNoIG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZDsgZm9yIGV4YW1wbGUsIC1ncmF5c2NhbGUgbWF5IGJlIHdyaXR0ZW4KLS1ncmF5IG9yIC1nci4gIE1vc3Qgb2YgdGhlICJiYXNpYyIgc3dpdGNoZXMgY2FuIGJlIGFiYnJldmlhdGVkIHRvIGFzIGxpdHRsZSBhcwotb25lIGxldHRlci4gIFVwcGVyIGFuZCBsb3dlciBjYXNlIGFyZSBlcXVpdmFsZW50ICgtQk1QIGlzIHRoZSBzYW1lIGFzIC1ibXApLgotQnJpdGlzaCBzcGVsbGluZ3MgYXJlIGFsc28gYWNjZXB0ZWQgKGUuZy4sIC1ncmV5c2NhbGUpLCB0aG91Z2ggZm9yIGJyZXZpdHkKLXRoZXNlIGFyZSBub3QgbWVudGlvbmVkIGJlbG93LgotCi0KLUNKUEVHIERFVEFJTFMKLQotVGhlIGJhc2ljIGNvbW1hbmQgbGluZSBzd2l0Y2hlcyBmb3IgY2pwZWcgYXJlOgotCi0JLXF1YWxpdHkgTglTY2FsZSBxdWFudGl6YXRpb24gdGFibGVzIHRvIGFkanVzdCBpbWFnZSBxdWFsaXR5LgotCQkJUXVhbGl0eSBpcyAwICh3b3JzdCkgdG8gMTAwIChiZXN0KTsgZGVmYXVsdCBpcyA3NS4KLQkJCShTZWUgYmVsb3cgZm9yIG1vcmUgaW5mby4pCi0KLQktZ3JheXNjYWxlCUNyZWF0ZSBtb25vY2hyb21lIEpQRUcgZmlsZSBmcm9tIGNvbG9yIGlucHV0LgotCQkJQmUgc3VyZSB0byB1c2UgdGhpcyBzd2l0Y2ggd2hlbiBjb21wcmVzc2luZyBhIGdyYXlzY2FsZQotCQkJQk1QIGZpbGUsIGJlY2F1c2UgY2pwZWcgaXNuJ3QgYnJpZ2h0IGVub3VnaCB0byBub3RpY2UKLQkJCXdoZXRoZXIgYSBCTVAgZmlsZSB1c2VzIG9ubHkgc2hhZGVzIG9mIGdyYXkuICBCeQotCQkJc2F5aW5nIC1ncmF5c2NhbGUsIHlvdSdsbCBnZXQgYSBzbWFsbGVyIEpQRUcgZmlsZSB0aGF0Ci0JCQl0YWtlcyBsZXNzIHRpbWUgdG8gcHJvY2Vzcy4KLQotCS1vcHRpbWl6ZQlQZXJmb3JtIG9wdGltaXphdGlvbiBvZiBlbnRyb3B5IGVuY29kaW5nIHBhcmFtZXRlcnMuCi0JCQlXaXRob3V0IHRoaXMsIGRlZmF1bHQgZW5jb2RpbmcgcGFyYW1ldGVycyBhcmUgdXNlZC4KLQkJCS1vcHRpbWl6ZSB1c3VhbGx5IG1ha2VzIHRoZSBKUEVHIGZpbGUgYSBsaXR0bGUgc21hbGxlciwKLQkJCWJ1dCBjanBlZyBydW5zIHNvbWV3aGF0IHNsb3dlciBhbmQgbmVlZHMgbXVjaCBtb3JlCi0JCQltZW1vcnkuICBJbWFnZSBxdWFsaXR5IGFuZCBzcGVlZCBvZiBkZWNvbXByZXNzaW9uIGFyZQotCQkJdW5hZmZlY3RlZCBieSAtb3B0aW1pemUuCi0KLQktcHJvZ3Jlc3NpdmUJQ3JlYXRlIHByb2dyZXNzaXZlIEpQRUcgZmlsZSAoc2VlIGJlbG93KS4KLQotCS10YXJnYQkJSW5wdXQgZmlsZSBpcyBUYXJnYSBmb3JtYXQuICBUYXJnYSBmaWxlcyB0aGF0IGNvbnRhaW4KLQkJCWFuICJpZGVudGlmaWNhdGlvbiIgZmllbGQgd2lsbCBub3QgYmUgYXV0b21hdGljYWxseQotCQkJcmVjb2duaXplZCBieSBjanBlZzsgZm9yIHN1Y2ggZmlsZXMgeW91IG11c3Qgc3BlY2lmeQotCQkJLXRhcmdhIHRvIG1ha2UgY2pwZWcgdHJlYXQgdGhlIGlucHV0IGFzIFRhcmdhIGZvcm1hdC4KLQkJCUZvciBtb3N0IFRhcmdhIGZpbGVzLCB5b3Ugd29uJ3QgbmVlZCB0aGlzIHN3aXRjaC4KLQotVGhlIC1xdWFsaXR5IHN3aXRjaCBsZXRzIHlvdSB0cmFkZSBvZmYgY29tcHJlc3NlZCBmaWxlIHNpemUgYWdhaW5zdCBxdWFsaXR5IG9mCi10aGUgcmVjb25zdHJ1Y3RlZCBpbWFnZTogdGhlIGhpZ2hlciB0aGUgcXVhbGl0eSBzZXR0aW5nLCB0aGUgbGFyZ2VyIHRoZSBKUEVHCi1maWxlLCBhbmQgdGhlIGNsb3NlciB0aGUgb3V0cHV0IGltYWdlIHdpbGwgYmUgdG8gdGhlIG9yaWdpbmFsIGlucHV0LiAgTm9ybWFsbHkKLXlvdSB3YW50IHRvIHVzZSB0aGUgbG93ZXN0IHF1YWxpdHkgc2V0dGluZyAoc21hbGxlc3QgZmlsZSkgdGhhdCBkZWNvbXByZXNzZXMKLWludG8gc29tZXRoaW5nIHZpc3VhbGx5IGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIG9yaWdpbmFsIGltYWdlLiAgRm9yIHRoaXMKLXB1cnBvc2UgdGhlIHF1YWxpdHkgc2V0dGluZyBzaG91bGQgYmUgYmV0d2VlbiA1MCBhbmQgOTU7IHRoZSBkZWZhdWx0IG9mIDc1IGlzCi1vZnRlbiBhYm91dCByaWdodC4gIElmIHlvdSBzZWUgZGVmZWN0cyBhdCAtcXVhbGl0eSA3NSwgdGhlbiBnbyB1cCA1IG9yIDEwCi1jb3VudHMgYXQgYSB0aW1lIHVudGlsIHlvdSBhcmUgaGFwcHkgd2l0aCB0aGUgb3V0cHV0IGltYWdlLiAgKFRoZSBvcHRpbWFsCi1zZXR0aW5nIHdpbGwgdmFyeSBmcm9tIG9uZSBpbWFnZSB0byBhbm90aGVyLikKLQotLXF1YWxpdHkgMTAwIHdpbGwgZ2VuZXJhdGUgYSBxdWFudGl6YXRpb24gdGFibGUgb2YgYWxsIDEncywgbWluaW1pemluZyBsb3NzCi1pbiB0aGUgcXVhbnRpemF0aW9uIHN0ZXAgKGJ1dCB0aGVyZSBpcyBzdGlsbCBpbmZvcm1hdGlvbiBsb3NzIGluIHN1YnNhbXBsaW5nLAotYXMgd2VsbCBhcyByb3VuZG9mZiBlcnJvcikuICBUaGlzIHNldHRpbmcgaXMgbWFpbmx5IG9mIGludGVyZXN0IGZvcgotZXhwZXJpbWVudGFsIHB1cnBvc2VzLiAgUXVhbGl0eSB2YWx1ZXMgYWJvdmUgYWJvdXQgOTUgYXJlIE5PVCByZWNvbW1lbmRlZCBmb3IKLW5vcm1hbCB1c2U7IHRoZSBjb21wcmVzc2VkIGZpbGUgc2l6ZSBnb2VzIHVwIGRyYW1hdGljYWxseSBmb3IgaGFyZGx5IGFueSBnYWluCi1pbiBvdXRwdXQgaW1hZ2UgcXVhbGl0eS4KLQotSW4gdGhlIG90aGVyIGRpcmVjdGlvbiwgcXVhbGl0eSB2YWx1ZXMgYmVsb3cgNTAgd2lsbCBwcm9kdWNlIHZlcnkgc21hbGwgZmlsZXMKLW9mIGxvdyBpbWFnZSBxdWFsaXR5LiAgU2V0dGluZ3MgYXJvdW5kIDUgdG8gMTAgbWlnaHQgYmUgdXNlZnVsIGluIHByZXBhcmluZyBhbgotaW5kZXggb2YgYSBsYXJnZSBpbWFnZSBsaWJyYXJ5LCBmb3IgZXhhbXBsZS4gIFRyeSAtcXVhbGl0eSAyIChvciBzbykgZm9yIHNvbWUKLWFtdXNpbmcgQ3ViaXN0IGVmZmVjdHMuICAoTm90ZTogcXVhbGl0eSB2YWx1ZXMgYmVsb3cgYWJvdXQgMjUgZ2VuZXJhdGUgMi1ieXRlCi1xdWFudGl6YXRpb24gdGFibGVzLCB3aGljaCBhcmUgY29uc2lkZXJlZCBvcHRpb25hbCBpbiB0aGUgSlBFRyBzdGFuZGFyZC4KLWNqcGVnIGVtaXRzIGEgd2FybmluZyBtZXNzYWdlIHdoZW4geW91IGdpdmUgc3VjaCBhIHF1YWxpdHkgdmFsdWUsIGJlY2F1c2Ugc29tZQotb3RoZXIgSlBFRyBwcm9ncmFtcyBtYXkgYmUgdW5hYmxlIHRvIGRlY29kZSB0aGUgcmVzdWx0aW5nIGZpbGUuICBVc2UgLWJhc2VsaW5lCi1pZiB5b3UgbmVlZCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSBhdCBsb3cgcXVhbGl0eSB2YWx1ZXMuKQotCi1UaGUgLXByb2dyZXNzaXZlIHN3aXRjaCBjcmVhdGVzIGEgInByb2dyZXNzaXZlIEpQRUciIGZpbGUuICBJbiB0aGlzIHR5cGUgb2YKLUpQRUcgZmlsZSwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIG11bHRpcGxlIHNjYW5zIG9mIGluY3JlYXNpbmcgcXVhbGl0eS4gIElmIHRoZQotZmlsZSBpcyBiZWluZyB0cmFuc21pdHRlZCBvdmVyIGEgc2xvdyBjb21tdW5pY2F0aW9ucyBsaW5rLCB0aGUgZGVjb2RlciBjYW4gdXNlCi10aGUgZmlyc3Qgc2NhbiB0byBkaXNwbGF5IGEgbG93LXF1YWxpdHkgaW1hZ2UgdmVyeSBxdWlja2x5LCBhbmQgY2FuIHRoZW4KLWltcHJvdmUgdGhlIGRpc3BsYXkgd2l0aCBlYWNoIHN1YnNlcXVlbnQgc2Nhbi4gIFRoZSBmaW5hbCBpbWFnZSBpcyBleGFjdGx5Ci1lcXVpdmFsZW50IHRvIGEgc3RhbmRhcmQgSlBFRyBmaWxlIG9mIHRoZSBzYW1lIHF1YWxpdHkgc2V0dGluZywgYW5kIHRoZSB0b3RhbAotZmlsZSBzaXplIGlzIGFib3V0IHRoZSBzYW1lIC0tLSBvZnRlbiBhIGxpdHRsZSBzbWFsbGVyLiAgQ0FVVElPTjogcHJvZ3Jlc3NpdmUKLUpQRUcgaXMgbm90IHlldCB3aWRlbHkgaW1wbGVtZW50ZWQsIHNvIG1hbnkgZGVjb2RlcnMgd2lsbCBiZSB1bmFibGUgdG8gdmlldyBhCi1wcm9ncmVzc2l2ZSBKUEVHIGZpbGUgYXQgYWxsLgotCi1Td2l0Y2hlcyBmb3IgYWR2YW5jZWQgdXNlcnM6Ci0KLQktZGN0IGludAlVc2UgaW50ZWdlciBEQ1QgbWV0aG9kIChkZWZhdWx0KS4KLQktZGN0IGZhc3QJVXNlIGZhc3QgaW50ZWdlciBEQ1QgKGxlc3MgYWNjdXJhdGUpLgotCS1kY3QgZmxvYXQJVXNlIGZsb2F0aW5nLXBvaW50IERDVCBtZXRob2QuCi0JCQlUaGUgZmxvYXQgbWV0aG9kIGlzIHZlcnkgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuCi0JCQl0aGUgaW50IG1ldGhvZCwgYnV0IGlzIG11Y2ggc2xvd2VyIHVubGVzcyB5b3VyIG1hY2hpbmUKLQkJCWhhcyB2ZXJ5IGZhc3QgZmxvYXRpbmctcG9pbnQgaGFyZHdhcmUuICBBbHNvIG5vdGUgdGhhdAotCQkJcmVzdWx0cyBvZiB0aGUgZmxvYXRpbmctcG9pbnQgbWV0aG9kIG1heSB2YXJ5IHNsaWdodGx5Ci0JCQlhY3Jvc3MgbWFjaGluZXMsIHdoaWxlIHRoZSBpbnRlZ2VyIG1ldGhvZHMgc2hvdWxkIGdpdmUKLQkJCXRoZSBzYW1lIHJlc3VsdHMgZXZlcnl3aGVyZS4gIFRoZSBmYXN0IGludGVnZXIgbWV0aG9kCi0JCQlpcyBtdWNoIGxlc3MgYWNjdXJhdGUgdGhhbiB0aGUgb3RoZXIgdHdvLgotCi0JLXJlc3RhcnQgTglFbWl0IGEgSlBFRyByZXN0YXJ0IG1hcmtlciBldmVyeSBOIE1DVSByb3dzLCBvciBldmVyeQotCQkJTiBNQ1UgYmxvY2tzIGlmICJCIiBpcyBhdHRhY2hlZCB0byB0aGUgbnVtYmVyLgotCQkJLXJlc3RhcnQgMCAodGhlIGRlZmF1bHQpIG1lYW5zIG5vIHJlc3RhcnQgbWFya2Vycy4KLQotCS1zbW9vdGggTglTbW9vdGggdGhlIGlucHV0IGltYWdlIHRvIGVsaW1pbmF0ZSBkaXRoZXJpbmcgbm9pc2UuCi0JCQlOLCByYW5naW5nIGZyb20gMSB0byAxMDAsIGluZGljYXRlcyB0aGUgc3RyZW5ndGggb2YKLQkJCXNtb290aGluZy4gIDAgKHRoZSBkZWZhdWx0KSBtZWFucyBubyBzbW9vdGhpbmcuCi0KLQktbWF4bWVtb3J5IE4JU2V0IGxpbWl0IGZvciBhbW91bnQgb2YgbWVtb3J5IHRvIHVzZSBpbiBwcm9jZXNzaW5nCi0JCQlsYXJnZSBpbWFnZXMuICBWYWx1ZSBpcyBpbiB0aG91c2FuZHMgb2YgYnl0ZXMsIG9yCi0JCQltaWxsaW9ucyBvZiBieXRlcyBpZiAiTSIgaXMgYXR0YWNoZWQgdG8gdGhlIG51bWJlci4KLQkJCUZvciBleGFtcGxlLCAtbWF4IDRtIHNlbGVjdHMgNDAwMDAwMCBieXRlcy4gIElmIG1vcmUKLQkJCXNwYWNlIGlzIG5lZWRlZCwgdGVtcG9yYXJ5IGZpbGVzIHdpbGwgYmUgdXNlZC4KLQotCS12ZXJib3NlCUVuYWJsZSBkZWJ1ZyBwcmludG91dC4gIE1vcmUgLXYncyBnaXZlIG1vcmUgcHJpbnRvdXQuCi0Jb3IgIC1kZWJ1ZwlBbHNvLCB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIHByaW50ZWQgYXQgc3RhcnR1cC4KLQotVGhlIC1yZXN0YXJ0IG9wdGlvbiBpbnNlcnRzIGV4dHJhIG1hcmtlcnMgdGhhdCBhbGxvdyBhIEpQRUcgZGVjb2RlciB0bwotcmVzeW5jaHJvbml6ZSBhZnRlciBhIHRyYW5zbWlzc2lvbiBlcnJvci4gIFdpdGhvdXQgcmVzdGFydCBtYXJrZXJzLCBhbnkgZGFtYWdlCi10byBhIGNvbXByZXNzZWQgZmlsZSB3aWxsIHVzdWFsbHkgcnVpbiB0aGUgaW1hZ2UgZnJvbSB0aGUgcG9pbnQgb2YgdGhlIGVycm9yCi10byB0aGUgZW5kIG9mIHRoZSBpbWFnZTsgd2l0aCByZXN0YXJ0IG1hcmtlcnMsIHRoZSBkYW1hZ2UgaXMgdXN1YWxseSBjb25maW5lZAotdG8gdGhlIHBvcnRpb24gb2YgdGhlIGltYWdlIHVwIHRvIHRoZSBuZXh0IHJlc3RhcnQgbWFya2VyLiAgT2YgY291cnNlLCB0aGUKLXJlc3RhcnQgbWFya2VycyBvY2N1cHkgZXh0cmEgc3BhY2UuICBXZSByZWNvbW1lbmQgLXJlc3RhcnQgMSBmb3IgaW1hZ2VzIHRoYXQKLXdpbGwgYmUgdHJhbnNtaXR0ZWQgYWNyb3NzIHVucmVsaWFibGUgbmV0d29ya3Mgc3VjaCBhcyBVc2VuZXQuCi0KLVRoZSAtc21vb3RoIG9wdGlvbiBmaWx0ZXJzIHRoZSBpbnB1dCB0byBlbGltaW5hdGUgZmluZS1zY2FsZSBub2lzZS4gIFRoaXMgaXMKLW9mdGVuIHVzZWZ1bCB3aGVuIGNvbnZlcnRpbmcgZGl0aGVyZWQgaW1hZ2VzIHRvIEpQRUc6IGEgbW9kZXJhdGUgc21vb3RoaW5nCi1mYWN0b3Igb2YgMTAgdG8gNTAgZ2V0cyByaWQgb2YgZGl0aGVyaW5nIHBhdHRlcm5zIGluIHRoZSBpbnB1dCBmaWxlLCByZXN1bHRpbmcKLWluIGEgc21hbGxlciBKUEVHIGZpbGUgYW5kIGEgYmV0dGVyLWxvb2tpbmcgaW1hZ2UuICBUb28gbGFyZ2UgYSBzbW9vdGhpbmcKLWZhY3RvciB3aWxsIHZpc2libHkgYmx1ciB0aGUgaW1hZ2UsIGhvd2V2ZXIuCi0KLVN3aXRjaGVzIGZvciB3aXphcmRzOgotCi0JLWJhc2VsaW5lCUZvcmNlIGJhc2VsaW5lLWNvbXBhdGlibGUgcXVhbnRpemF0aW9uIHRhYmxlcyB0byBiZQotCQkJZ2VuZXJhdGVkLiAgVGhpcyBjbGFtcHMgcXVhbnRpemF0aW9uIHZhbHVlcyB0byA4IGJpdHMKLQkJCWV2ZW4gYXQgbG93IHF1YWxpdHkgc2V0dGluZ3MuICAoVGhpcyBzd2l0Y2ggaXMgcG9vcmx5Ci0JCQluYW1lZCwgc2luY2UgaXQgZG9lcyBub3QgZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBpcwotCQkJYWN0dWFsbHkgYmFzZWxpbmUgSlBFRy4gIEZvciBleGFtcGxlLCB5b3UgY2FuIHVzZQotCQkJLWJhc2VsaW5lIGFuZCAtcHJvZ3Jlc3NpdmUgdG9nZXRoZXIuKQotCi0JLXF0YWJsZXMgZmlsZQlVc2UgdGhlIHF1YW50aXphdGlvbiB0YWJsZXMgZ2l2ZW4gaW4gdGhlIHNwZWNpZmllZAotCQkJdGV4dCBmaWxlLgotCi0JLXFzbG90cyBOWywuLi5dIFNlbGVjdCB3aGljaCBxdWFudGl6YXRpb24gdGFibGUgdG8gdXNlIGZvciBlYWNoIGNvbG9yCi0JCQljb21wb25lbnQuCi0KLQktc2FtcGxlIEh4VlssLi4uXSAgU2V0IEpQRUcgc2FtcGxpbmcgZmFjdG9ycyBmb3IgZWFjaCBjb2xvciBjb21wb25lbnQuCi0KLQktc2NhbnMgZmlsZQlVc2UgdGhlIHNjYW4gc2NyaXB0IGdpdmVuIGluIHRoZSBzcGVjaWZpZWQgdGV4dCBmaWxlLgotCi1UaGUgIndpemFyZCIgc3dpdGNoZXMgYXJlIGludGVuZGVkIGZvciBleHBlcmltZW50YXRpb24gd2l0aCBKUEVHLiAgSWYgeW91Ci1kb24ndCBrbm93IHdoYXQgeW91IGFyZSBkb2luZywgRE9OJ1QgVVNFIFRIRU0uICBUaGVzZSBzd2l0Y2hlcyBhcmUgZG9jdW1lbnRlZAotZnVydGhlciBpbiB0aGUgZmlsZSB3aXphcmQuZG9jLgotCi0KLURKUEVHIERFVEFJTFMKLQotVGhlIGJhc2ljIGNvbW1hbmQgbGluZSBzd2l0Y2hlcyBmb3IgZGpwZWcgYXJlOgotCi0JLWNvbG9ycyBOCVJlZHVjZSBpbWFnZSB0byBhdCBtb3N0IE4gY29sb3JzLiAgVGhpcyByZWR1Y2VzIHRoZQotCW9yIC1xdWFudGl6ZSBOCW51bWJlciBvZiBjb2xvcnMgdXNlZCBpbiB0aGUgb3V0cHV0IGltYWdlLCBzbyB0aGF0IGl0Ci0JCQljYW4gYmUgZGlzcGxheWVkIG9uIGEgY29sb3JtYXBwZWQgZGlzcGxheSBvciBzdG9yZWQgaW4KLQkJCWEgY29sb3JtYXBwZWQgZmlsZSBmb3JtYXQuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUKLQkJCWFuIDgtYml0IGRpc3BsYXksIHlvdSdkIG5lZWQgdG8gcmVkdWNlIHRvIDI1NiBvciBmZXdlcgotCQkJY29sb3JzLiAgKC1jb2xvcnMgaXMgdGhlIHJlY29tbWVuZGVkIG5hbWUsIC1xdWFudGl6ZQotCQkJaXMgcHJvdmlkZWQgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuKQotCi0JLWZhc3QJCVNlbGVjdCByZWNvbW1lbmRlZCBwcm9jZXNzaW5nIG9wdGlvbnMgZm9yIGZhc3QsIGxvdwotCQkJcXVhbGl0eSBvdXRwdXQuICAoVGhlIGRlZmF1bHQgb3B0aW9ucyBhcmUgY2hvc2VuIGZvcgotCQkJaGlnaGVzdCBxdWFsaXR5IG91dHB1dC4pICBDdXJyZW50bHksIHRoaXMgaXMgZXF1aXZhbGVudAotCQkJdG8gIi1kY3QgZmFzdCAtbm9zbW9vdGggLW9uZXBhc3MgLWRpdGhlciBvcmRlcmVkIi4KLQotCS1ncmF5c2NhbGUJRm9yY2UgZ3JheS1zY2FsZSBvdXRwdXQgZXZlbiBpZiBKUEVHIGZpbGUgaXMgY29sb3IuCi0JCQlVc2VmdWwgZm9yIHZpZXdpbmcgb24gbW9ub2Nocm9tZSBkaXNwbGF5czsgYWxzbywKLQkJCWRqcGVnIHJ1bnMgbm90aWNlYWJseSBmYXN0ZXIgaW4gdGhpcyBtb2RlLgotCi0JLXNjYWxlIE0vTglTY2FsZSB0aGUgb3V0cHV0IGltYWdlIGJ5IGEgZmFjdG9yIE0vTi4gIEN1cnJlbnRseQotCQkJdGhlIHNjYWxlIGZhY3RvciBtdXN0IGJlIDEvMSwgMS8yLCAxLzQsIG9yIDEvOC4KLQkJCVNjYWxpbmcgaXMgaGFuZHkgaWYgdGhlIGltYWdlIGlzIGxhcmdlciB0aGFuIHlvdXIKLQkJCXNjcmVlbjsgYWxzbywgZGpwZWcgcnVucyBtdWNoIGZhc3RlciB3aGVuIHNjYWxpbmcKLQkJCWRvd24gdGhlIG91dHB1dC4KLQotCS1ibXAJCVNlbGVjdCBCTVAgb3V0cHV0IGZvcm1hdCAoV2luZG93cyBmbGF2b3IpLiAgOC1iaXQKLQkJCWNvbG9ybWFwcGVkIGZvcm1hdCBpcyBlbWl0dGVkIGlmIC1jb2xvcnMgb3IgLWdyYXlzY2FsZQotCQkJaXMgc3BlY2lmaWVkLCBvciBpZiB0aGUgSlBFRyBmaWxlIGlzIGdyYXktc2NhbGU7Ci0JCQlvdGhlcndpc2UsIDI0LWJpdCBmdWxsLWNvbG9yIGZvcm1hdCBpcyBlbWl0dGVkLgotCi0JLWdpZgkJU2VsZWN0IEdJRiBvdXRwdXQgZm9ybWF0LiAgU2luY2UgR0lGIGRvZXMgbm90IHN1cHBvcnQKLQkJCW1vcmUgdGhhbiAyNTYgY29sb3JzLCAtY29sb3JzIDI1NiBpcyBhc3N1bWVkICh1bmxlc3MKLQkJCXlvdSBzcGVjaWZ5IGEgc21hbGxlciBudW1iZXIgb2YgY29sb3JzKS4gIElmIHlvdQotCQkJc3BlY2lmeSAtZmFzdCwgdGhlIGRlZmF1bHQgbnVtYmVyIG9mIGNvbG9ycyBpcyAyMTYuCi0KLQktb3MyCQlTZWxlY3QgQk1QIG91dHB1dCBmb3JtYXQgKE9TLzIgMS54IGZsYXZvcikuICA4LWJpdAotCQkJY29sb3JtYXBwZWQgZm9ybWF0IGlzIGVtaXR0ZWQgaWYgLWNvbG9ycyBvciAtZ3JheXNjYWxlCi0JCQlpcyBzcGVjaWZpZWQsIG9yIGlmIHRoZSBKUEVHIGZpbGUgaXMgZ3JheS1zY2FsZTsKLQkJCW90aGVyd2lzZSwgMjQtYml0IGZ1bGwtY29sb3IgZm9ybWF0IGlzIGVtaXR0ZWQuCi0KLQktcG5tCQlTZWxlY3QgUEJNUExVUyAoUFBNL1BHTSkgb3V0cHV0IGZvcm1hdCAodGhpcyBpcyB0aGUKLQkJCWRlZmF1bHQgZm9ybWF0KS4gIFBHTSBpcyBlbWl0dGVkIGlmIHRoZSBKUEVHIGZpbGUgaXMKLQkJCWdyYXktc2NhbGUgb3IgaWYgLWdyYXlzY2FsZSBpcyBzcGVjaWZpZWQ7IG90aGVyd2lzZQotCQkJUFBNIGlzIGVtaXR0ZWQuCi0KLQktcmxlCQlTZWxlY3QgUkxFIG91dHB1dCBmb3JtYXQuICAoUmVxdWlyZXMgVVJUIGxpYnJhcnkuKQotCi0JLXRhcmdhCQlTZWxlY3QgVGFyZ2Egb3V0cHV0IGZvcm1hdC4gIEdyYXktc2NhbGUgZm9ybWF0IGlzCi0JCQllbWl0dGVkIGlmIHRoZSBKUEVHIGZpbGUgaXMgZ3JheS1zY2FsZSBvciBpZgotCQkJLWdyYXlzY2FsZSBpcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSwgY29sb3JtYXBwZWQgZm9ybWF0Ci0JCQlpcyBlbWl0dGVkIGlmIC1jb2xvcnMgaXMgc3BlY2lmaWVkOyBvdGhlcndpc2UsIDI0LWJpdAotCQkJZnVsbC1jb2xvciBmb3JtYXQgaXMgZW1pdHRlZC4KLQotU3dpdGNoZXMgZm9yIGFkdmFuY2VkIHVzZXJzOgotCi0JLWRjdCBpbnQJVXNlIGludGVnZXIgRENUIG1ldGhvZCAoZGVmYXVsdCkuCi0JLWRjdCBmYXN0CVVzZSBmYXN0IGludGVnZXIgRENUIChsZXNzIGFjY3VyYXRlKS4KLQktZGN0IGZsb2F0CVVzZSBmbG9hdGluZy1wb2ludCBEQ1QgbWV0aG9kLgotCQkJVGhlIGZsb2F0IG1ldGhvZCBpcyB2ZXJ5IHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbgotCQkJdGhlIGludCBtZXRob2QsIGJ1dCBpcyBtdWNoIHNsb3dlciB1bmxlc3MgeW91ciBtYWNoaW5lCi0JCQloYXMgdmVyeSBmYXN0IGZsb2F0aW5nLXBvaW50IGhhcmR3YXJlLiAgQWxzbyBub3RlIHRoYXQKLQkJCXJlc3VsdHMgb2YgdGhlIGZsb2F0aW5nLXBvaW50IG1ldGhvZCBtYXkgdmFyeSBzbGlnaHRseQotCQkJYWNyb3NzIG1hY2hpbmVzLCB3aGlsZSB0aGUgaW50ZWdlciBtZXRob2RzIHNob3VsZCBnaXZlCi0JCQl0aGUgc2FtZSByZXN1bHRzIGV2ZXJ5d2hlcmUuICBUaGUgZmFzdCBpbnRlZ2VyIG1ldGhvZAotCQkJaXMgbXVjaCBsZXNzIGFjY3VyYXRlIHRoYW4gdGhlIG90aGVyIHR3by4KLQotCS1kaXRoZXIgZnMJVXNlIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcgaW4gY29sb3IgcXVhbnRpemF0aW9uLgotCS1kaXRoZXIgb3JkZXJlZAlVc2Ugb3JkZXJlZCBkaXRoZXJpbmcgaW4gY29sb3IgcXVhbnRpemF0aW9uLgotCS1kaXRoZXIgbm9uZQlEbyBub3QgdXNlIGRpdGhlcmluZyBpbiBjb2xvciBxdWFudGl6YXRpb24uCi0JCQlCeSBkZWZhdWx0LCBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nIGlzIGFwcGxpZWQgd2hlbgotCQkJcXVhbnRpemluZyBjb2xvcnM7IHRoaXMgaXMgc2xvdyBidXQgdXN1YWxseSBwcm9kdWNlcwotCQkJdGhlIGJlc3QgcmVzdWx0cy4gIE9yZGVyZWQgZGl0aGVyIGlzIGEgY29tcHJvbWlzZQotCQkJYmV0d2VlbiBzcGVlZCBhbmQgcXVhbGl0eTsgbm8gZGl0aGVyaW5nIGlzIGZhc3QgYnV0Ci0JCQl1c3VhbGx5IGxvb2tzIGF3ZnVsLiAgTm90ZSB0aGF0IHRoZXNlIHN3aXRjaGVzIGhhdmUKLQkJCW5vIGVmZmVjdCB1bmxlc3MgY29sb3IgcXVhbnRpemF0aW9uIGlzIGJlaW5nIGRvbmUuCi0JCQlPcmRlcmVkIGRpdGhlciBpcyBvbmx5IGF2YWlsYWJsZSBpbiAtb25lcGFzcyBtb2RlLgotCi0JLW1hcCBGSUxFCVF1YW50aXplIHRvIHRoZSBjb2xvcnMgdXNlZCBpbiB0aGUgc3BlY2lmaWVkIGltYWdlCi0JCQlmaWxlLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHByb2R1Y2luZyBtdWx0aXBsZSBmaWxlcwotCQkJd2l0aCBpZGVudGljYWwgY29sb3IgbWFwcywgb3IgZm9yIGZvcmNpbmcgYSBwcmVkZWZpbmVkCi0JCQlzZXQgb2YgY29sb3JzIHRvIGJlIHVzZWQuICBUaGUgRklMRSBtdXN0IGJlIGEgR0lGCi0JCQlvciBQUE0gZmlsZS4gIFRoaXMgb3B0aW9uIG92ZXJyaWRlcyAtY29sb3JzIGFuZAotCQkJLW9uZXBhc3MuCi0KLQktbm9zbW9vdGgJVXNlIGEgZmFzdGVyLCBsb3dlci1xdWFsaXR5IHVwc2FtcGxpbmcgcm91dGluZS4KLQotCS1vbmVwYXNzCVVzZSBvbmUtcGFzcyBpbnN0ZWFkIG9mIHR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbi4KLQkJCVRoZSBvbmUtcGFzcyBtZXRob2QgaXMgZmFzdGVyIGFuZCBuZWVkcyBsZXNzIG1lbW9yeSwKLQkJCWJ1dCBpdCBwcm9kdWNlcyBhIGxvd2VyLXF1YWxpdHkgaW1hZ2UuICAtb25lcGFzcyBpcwotCQkJaWdub3JlZCB1bmxlc3MgeW91IGFsc28gc2F5IC1jb2xvcnMgTi4gIEFsc28sCi0JCQl0aGUgb25lLXBhc3MgbWV0aG9kIGlzIGFsd2F5cyB1c2VkIGZvciBncmF5LXNjYWxlCi0JCQlvdXRwdXQgKHRoZSB0d28tcGFzcyBtZXRob2QgaXMgbm8gaW1wcm92ZW1lbnQgdGhlbikuCi0KLQktbWF4bWVtb3J5IE4JU2V0IGxpbWl0IGZvciBhbW91bnQgb2YgbWVtb3J5IHRvIHVzZSBpbiBwcm9jZXNzaW5nCi0JCQlsYXJnZSBpbWFnZXMuICBWYWx1ZSBpcyBpbiB0aG91c2FuZHMgb2YgYnl0ZXMsIG9yCi0JCQltaWxsaW9ucyBvZiBieXRlcyBpZiAiTSIgaXMgYXR0YWNoZWQgdG8gdGhlIG51bWJlci4KLQkJCUZvciBleGFtcGxlLCAtbWF4IDRtIHNlbGVjdHMgNDAwMDAwMCBieXRlcy4gIElmIG1vcmUKLQkJCXNwYWNlIGlzIG5lZWRlZCwgdGVtcG9yYXJ5IGZpbGVzIHdpbGwgYmUgdXNlZC4KLQotCS12ZXJib3NlCUVuYWJsZSBkZWJ1ZyBwcmludG91dC4gIE1vcmUgLXYncyBnaXZlIG1vcmUgcHJpbnRvdXQuCi0Jb3IgIC1kZWJ1ZwlBbHNvLCB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIHByaW50ZWQgYXQgc3RhcnR1cC4KLQotCi1ISU5UUyBGT1IgQ0pQRUcKLQotQ29sb3IgR0lGIGZpbGVzIGFyZSBub3QgdGhlIGlkZWFsIGlucHV0IGZvciBKUEVHOyBKUEVHIGlzIHJlYWxseSBpbnRlbmRlZCBmb3IKLWNvbXByZXNzaW5nIGZ1bGwtY29sb3IgKDI0LWJpdCkgaW1hZ2VzLiAgSW4gcGFydGljdWxhciwgZG9uJ3QgdHJ5IHRvIGNvbnZlcnQKLWNhcnRvb25zLCBsaW5lIGRyYXdpbmdzLCBhbmQgb3RoZXIgaW1hZ2VzIHRoYXQgaGF2ZSBvbmx5IGEgZmV3IGRpc3RpbmN0Ci1jb2xvcnMuICBHSUYgd29ya3MgZ3JlYXQgb24gdGhlc2UsIEpQRUcgZG9lcyBub3QuICBJZiB5b3Ugd2FudCB0byBjb252ZXJ0IGEKLUdJRiB0byBKUEVHLCB5b3Ugc2hvdWxkIGV4cGVyaW1lbnQgd2l0aCBjanBlZydzIC1xdWFsaXR5IGFuZCAtc21vb3RoIG9wdGlvbnMKLXRvIGdldCBhIHNhdGlzZmFjdG9yeSBjb252ZXJzaW9uLiAgLXNtb290aCAxMCBvciBzbyBpcyBvZnRlbiBoZWxwZnVsLgotCi1Bdm9pZCBydW5uaW5nIGFuIGltYWdlIHRocm91Z2ggYSBzZXJpZXMgb2YgSlBFRyBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uCi1jeWNsZXMuICBJbWFnZSBxdWFsaXR5IGxvc3Mgd2lsbCBhY2N1bXVsYXRlOyBhZnRlciB0ZW4gb3Igc28gY3ljbGVzIHRoZSBpbWFnZQotbWF5IGJlIG5vdGljZWFibHkgd29yc2UgdGhhbiBpdCB3YXMgYWZ0ZXIgb25lIGN5Y2xlLiAgSXQncyBiZXN0IHRvIHVzZSBhCi1sb3NzbGVzcyBmb3JtYXQgd2hpbGUgbWFuaXB1bGF0aW5nIGFuIGltYWdlLCB0aGVuIGNvbnZlcnQgdG8gSlBFRyBmb3JtYXQgd2hlbgoteW91IGFyZSByZWFkeSB0byBmaWxlIHRoZSBpbWFnZSBhd2F5LgotCi1UaGUgLW9wdGltaXplIG9wdGlvbiB0byBjanBlZyBpcyB3b3J0aCB1c2luZyB3aGVuIHlvdSBhcmUgbWFraW5nIGEgImZpbmFsIgotdmVyc2lvbiBmb3IgcG9zdGluZyBvciBhcmNoaXZpbmcuICBJdCdzIGFsc28gYSB3aW4gd2hlbiB5b3UgYXJlIHVzaW5nIGxvdwotcXVhbGl0eSBzZXR0aW5ncyB0byBtYWtlIHZlcnkgc21hbGwgSlBFRyBmaWxlczsgdGhlIHBlcmNlbnRhZ2UgaW1wcm92ZW1lbnQKLWlzIG9mdGVuIGEgbG90IG1vcmUgdGhhbiBpdCBpcyBvbiBsYXJnZXIgZmlsZXMuICAoQXQgcHJlc2VudCwgLW9wdGltaXplCi1tb2RlIGlzIGFsd2F5cyBzZWxlY3RlZCB3aGVuIGdlbmVyYXRpbmcgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcy4pCi0KLUdJRiBpbnB1dCBmaWxlcyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZCwgdG8gYXZvaWQgdGhlIFVuaXN5cyBMWlcgcGF0ZW50LgotVXNlIGEgVW5pc3lzLWxpY2Vuc2VkIHByb2dyYW0gaWYgeW91IG5lZWQgdG8gcmVhZCBhIEdJRiBmaWxlLiAgKENvbnZlcnNpb24KLW9mIEdJRiBmaWxlcyB0byBKUEVHIGlzIHVzdWFsbHkgYSBiYWQgaWRlYSBhbnl3YXkuKQotCi0KLUhJTlRTIEZPUiBESlBFRwotCi1UbyBnZXQgYSBxdWljayBwcmV2aWV3IG9mIGFuIGltYWdlLCB1c2UgdGhlIC1ncmF5c2NhbGUgYW5kL29yIC1zY2FsZSBzd2l0Y2hlcy4KLSItZ3JheXNjYWxlIC1zY2FsZSAxLzgiIGlzIHRoZSBmYXN0ZXN0IGNhc2UuCi0KLVNldmVyYWwgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHRoYXQgdHJhZGUgb2ZmIGltYWdlIHF1YWxpdHkgdG8gZ2FpbiBzcGVlZC4KLSItZmFzdCIgdHVybnMgb24gdGhlIHJlY29tbWVuZGVkIHNldHRpbmdzLgotCi0iLWRjdCBmYXN0IiBhbmQvb3IgIi1ub3Ntb290aCIgZ2FpbiBzcGVlZCBhdCBhIHNtYWxsIHNhY3JpZmljZSBpbiBxdWFsaXR5LgotV2hlbiBwcm9kdWNpbmcgYSBjb2xvci1xdWFudGl6ZWQgaW1hZ2UsICItb25lcGFzcyAtZGl0aGVyIG9yZGVyZWQiIGlzIGZhc3QgYnV0Ci1tdWNoIGxvd2VyIHF1YWxpdHkgdGhhbiB0aGUgZGVmYXVsdCBiZWhhdmlvci4gICItZGl0aGVyIG5vbmUiIG1heSBnaXZlCi1hY2NlcHRhYmxlIHJlc3VsdHMgaW4gdHdvLXBhc3MgbW9kZSwgYnV0IGlzIHNlbGRvbSB0b2xlcmFibGUgaW4gb25lLXBhc3MgbW9kZS4KLQotSWYgeW91IGFyZSBmb3J0dW5hdGUgZW5vdWdoIHRvIGhhdmUgdmVyeSBmYXN0IGZsb2F0aW5nIHBvaW50IGhhcmR3YXJlLAotIi1kY3QgZmxvYXQiIG1heSBiZSBldmVuIGZhc3RlciB0aGFuICItZGN0IGZhc3QiLiAgQnV0IG9uIG1vc3QgbWFjaGluZXMKLSItZGN0IGZsb2F0IiBpcyBzbG93ZXIgdGhhbiAiLWRjdCBpbnQiOyBpbiB0aGlzIGNhc2UgaXQgaXMgbm90IHdvcnRoIHVzaW5nLAotYmVjYXVzZSBpdHMgdGhlb3JldGljYWwgYWNjdXJhY3kgYWR2YW50YWdlIGlzIHRvbyBzbWFsbCB0byBiZSBzaWduaWZpY2FudAotaW4gcHJhY3RpY2UuCi0KLVR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiByZXF1aXJlcyBhIGdvb2QgZGVhbCBvZiBtZW1vcnk7IG9uIE1TLURPUyBtYWNoaW5lcwotaXQgbWF5IHJ1biBvdXQgb2YgbWVtb3J5IGV2ZW4gd2l0aCAtbWF4bWVtb3J5IDAuICBJbiB0aGF0IGNhc2UgeW91IGNhbiBzdGlsbAotZGVjb21wcmVzcywgd2l0aCBzb21lIGxvc3Mgb2YgaW1hZ2UgcXVhbGl0eSwgYnkgc3BlY2lmeWluZyAtb25lcGFzcyBmb3IKLW9uZS1wYXNzIHF1YW50aXphdGlvbi4KLQotVG8gYXZvaWQgdGhlIFVuaXN5cyBMWlcgcGF0ZW50LCBkanBlZyBwcm9kdWNlcyB1bmNvbXByZXNzZWQgR0lGIGZpbGVzLiAgVGhlc2UKLWFyZSBsYXJnZXIgdGhhbiB0aGV5IHNob3VsZCBiZSwgYnV0IGFyZSByZWFkYWJsZSBieSBzdGFuZGFyZCBHSUYgZGVjb2RlcnMuCi0KLQotSElOVFMgRk9SIEJPVEggUFJPR1JBTVMKLQotSWYgbW9yZSBzcGFjZSBpcyBuZWVkZWQgdGhhbiB3aWxsIGZpdCBpbiB0aGUgYXZhaWxhYmxlIG1haW4gbWVtb3J5IChhcwotZGV0ZXJtaW5lZCBieSAtbWF4bWVtb3J5KSwgdGVtcG9yYXJ5IGZpbGVzIHdpbGwgYmUgdXNlZC4gIChNUy1ET1MgdmVyc2lvbnMKLXdpbGwgdHJ5IHRvIGdldCBleHRlbmRlZCBvciBleHBhbmRlZCBtZW1vcnkgZmlyc3QuKSAgVGhlIHRlbXBvcmFyeSBmaWxlcyBhcmUKLW9mdGVuIHJhdGhlciBsYXJnZTogaW4gdHlwaWNhbCBjYXNlcyB0aGV5IG9jY3VweSB0aHJlZSBieXRlcyBwZXIgcGl4ZWwsIGZvcgotZXhhbXBsZSAzKjgwMCo2MDAgPSAxLjQ0TWIgZm9yIGFuIDgwMHg2MDAgaW1hZ2UuICBJZiB5b3UgZG9uJ3QgaGF2ZSBlbm91Z2gKLWZyZWUgZGlzayBzcGFjZSwgbGVhdmUgb3V0IC1wcm9ncmVzc2l2ZSBhbmQgLW9wdGltaXplIChmb3IgY2pwZWcpIG9yIHNwZWNpZnkKLS1vbmVwYXNzIChmb3IgZGpwZWcpLgotCi1PbiBNUy1ET1MsIHRoZSB0ZW1wb3JhcnkgZmlsZXMgYXJlIGNyZWF0ZWQgaW4gdGhlIGRpcmVjdG9yeSBuYW1lZCBieSB0aGUgVE1QCi1vciBURU1QIGVudmlyb25tZW50IHZhcmlhYmxlLCBvciBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgaWYgbmVpdGhlciBvZiB0aG9zZQotZXhpc3QuICBBbWlnYSBpbXBsZW1lbnRhdGlvbnMgcHV0IHRoZSB0ZW1wIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgbmFtZWQgYnkKLUpQRUdUTVA6LCBzbyBiZSBzdXJlIHRvIGFzc2lnbiBKUEVHVE1QOiB0byBhIGRpc2sgcGFydGl0aW9uIHdpdGggYWRlcXVhdGUgZnJlZQotc3BhY2UuCi0KLVRoZSBkZWZhdWx0IG1lbW9yeSB1c2FnZSBsaW1pdCAoLW1heG1lbW9yeSkgaXMgc2V0IHdoZW4gdGhlIHNvZnR3YXJlIGlzCi1jb21waWxlZC4gIElmIHlvdSBnZXQgYW4gImluc3VmZmljaWVudCBtZW1vcnkiIGVycm9yLCB0cnkgc3BlY2lmeWluZyBhIHNtYWxsZXIKLS1tYXhtZW1vcnkgdmFsdWUsIGV2ZW4gLW1heG1lbW9yeSAwIHRvIHVzZSB0aGUgYWJzb2x1dGUgbWluaW11bSBzcGFjZS4gIFlvdQotbWF5IHdhbnQgdG8gcmVjb21waWxlIHdpdGggYSBzbWFsbGVyIGRlZmF1bHQgdmFsdWUgaWYgdGhpcyBoYXBwZW5zIG9mdGVuLgotCi1PbiBtYWNoaW5lcyB0aGF0IGhhdmUgImVudmlyb25tZW50IiB2YXJpYWJsZXMsIHlvdSBjYW4gZGVmaW5lIHRoZSBlbnZpcm9ubWVudAotdmFyaWFibGUgSlBFR01FTSB0byBzZXQgdGhlIGRlZmF1bHQgbWVtb3J5IGxpbWl0LiAgVGhlIHZhbHVlIGlzIHNwZWNpZmllZCBhcwotZGVzY3JpYmVkIGZvciB0aGUgLW1heG1lbW9yeSBzd2l0Y2guICBKUEVHTUVNIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCB2YWx1ZQotc3BlY2lmaWVkIHdoZW4gdGhlIHByb2dyYW0gd2FzIGNvbXBpbGVkLCBhbmQgaXRzZWxmIGlzIG92ZXJyaWRkZW4gYnkgYW4KLWV4cGxpY2l0IC1tYXhtZW1vcnkgc3dpdGNoLgotCi1PbiBNUy1ET1MgbWFjaGluZXMsIC1tYXhtZW1vcnkgaXMgdGhlIGFtb3VudCBvZiBtYWluIChjb252ZW50aW9uYWwpIG1lbW9yeSB0bwotdXNlLiAgKEV4dGVuZGVkIG9yIGV4cGFuZGVkIG1lbW9yeSBpcyBhbHNvIHVzZWQgaWYgYXZhaWxhYmxlLikgIE1vc3QKLURPUy1zcGVjaWZpYyB2ZXJzaW9ucyBvZiB0aGlzIHNvZnR3YXJlIGRvIHRoZWlyIG93biBtZW1vcnkgc3BhY2UgZXN0aW1hdGlvbgotYW5kIGRvIG5vdCBuZWVkIHlvdSB0byBzcGVjaWZ5IC1tYXhtZW1vcnkuCi0KLQotSlBFR1RSQU4KLQotanBlZ3RyYW4gcGVyZm9ybXMgdmFyaW91cyB1c2VmdWwgdHJhbnNmb3JtYXRpb25zIG9mIEpQRUcgZmlsZXMuCi1JdCBjYW4gdHJhbnNsYXRlIHRoZSBjb2RlZCByZXByZXNlbnRhdGlvbiBmcm9tIG9uZSB2YXJpYW50IG9mIEpQRUcgdG8gYW5vdGhlciwKLWZvciBleGFtcGxlIGZyb20gYmFzZWxpbmUgSlBFRyB0byBwcm9ncmVzc2l2ZSBKUEVHIG9yIHZpY2UgdmVyc2EuICBJdCBjYW4gYWxzbwotcGVyZm9ybSBzb21lIHJlYXJyYW5nZW1lbnRzIG9mIHRoZSBpbWFnZSBkYXRhLCBmb3IgZXhhbXBsZSB0dXJuaW5nIGFuIGltYWdlCi1mcm9tIGxhbmRzY2FwZSB0byBwb3J0cmFpdCBmb3JtYXQgYnkgcm90YXRpb24uCi0KLWpwZWd0cmFuIHdvcmtzIGJ5IHJlYXJyYW5naW5nIHRoZSBjb21wcmVzc2VkIGRhdGEgKERDVCBjb2VmZmljaWVudHMpLCB3aXRob3V0Ci1ldmVyIGZ1bGx5IGRlY29kaW5nIHRoZSBpbWFnZS4gIFRoZXJlZm9yZSwgaXRzIHRyYW5zZm9ybWF0aW9ucyBhcmUgbG9zc2xlc3M6Ci10aGVyZSBpcyBubyBpbWFnZSBkZWdyYWRhdGlvbiBhdCBhbGwsIHdoaWNoIHdvdWxkIG5vdCBiZSB0cnVlIGlmIHlvdSB1c2VkCi1kanBlZyBmb2xsb3dlZCBieSBjanBlZyB0byBhY2NvbXBsaXNoIHRoZSBzYW1lIGNvbnZlcnNpb24uICBCdXQgYnkgdGhlIHNhbWUKLXRva2VuLCBqcGVndHJhbiBjYW5ub3QgcGVyZm9ybSBsb3NzeSBvcGVyYXRpb25zIHN1Y2ggYXMgY2hhbmdpbmcgdGhlIGltYWdlCi1xdWFsaXR5LgotCi1qcGVndHJhbiB1c2VzIGEgY29tbWFuZCBsaW5lIHN5bnRheCBzaW1pbGFyIHRvIGNqcGVnIG9yIGRqcGVnLgotT24gVW5peC1saWtlIHN5c3RlbXMsIHlvdSBzYXk6Ci0JanBlZ3RyYW4gW3N3aXRjaGVzXSBbaW5wdXRmaWxlXSA+b3V0cHV0ZmlsZQotT24gbW9zdCBub24tVW5peCBzeXN0ZW1zLCB5b3Ugc2F5OgotCWpwZWd0cmFuIFtzd2l0Y2hlc10gaW5wdXRmaWxlIG91dHB1dGZpbGUKLXdoZXJlIGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgYXJlIEpQRUcgZmlsZXMuCi0KLVRvIHNwZWNpZnkgdGhlIGNvZGVkIEpQRUcgcmVwcmVzZW50YXRpb24gdXNlZCBpbiB0aGUgb3V0cHV0IGZpbGUsCi1qcGVndHJhbiBhY2NlcHRzIGEgc3Vic2V0IG9mIHRoZSBzd2l0Y2hlcyByZWNvZ25pemVkIGJ5IGNqcGVnOgotCS1vcHRpbWl6ZQlQZXJmb3JtIG9wdGltaXphdGlvbiBvZiBlbnRyb3B5IGVuY29kaW5nIHBhcmFtZXRlcnMuCi0JLXByb2dyZXNzaXZlCUNyZWF0ZSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUuCi0JLXJlc3RhcnQgTglFbWl0IGEgSlBFRyByZXN0YXJ0IG1hcmtlciBldmVyeSBOIE1DVSByb3dzLCBvciBldmVyeQotCQkJTiBNQ1UgYmxvY2tzIGlmICJCIiBpcyBhdHRhY2hlZCB0byB0aGUgbnVtYmVyLgotCS1zY2FucyBmaWxlCVVzZSB0aGUgc2NhbiBzY3JpcHQgZ2l2ZW4gaW4gdGhlIHNwZWNpZmllZCB0ZXh0IGZpbGUuCi1TZWUgdGhlIHByZXZpb3VzIGRpc2N1c3Npb24gb2YgY2pwZWcgZm9yIG1vcmUgZGV0YWlscyBhYm91dCB0aGVzZSBzd2l0Y2hlcy4KLUlmIHlvdSBzcGVjaWZ5IG5vbmUgb2YgdGhlc2Ugc3dpdGNoZXMsIHlvdSBnZXQgYSBwbGFpbiBiYXNlbGluZS1KUEVHIG91dHB1dAotZmlsZS4gIFRoZSBxdWFsaXR5IHNldHRpbmcgYW5kIHNvIGZvcnRoIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnB1dCBmaWxlLgotCi1UaGUgaW1hZ2UgY2FuIGJlIGxvc3NsZXNzbHkgdHJhbnNmb3JtZWQgYnkgZ2l2aW5nIG9uZSBvZiB0aGVzZSBzd2l0Y2hlczoKLQktZmxpcCBob3Jpem9udGFsCU1pcnJvciBpbWFnZSBob3Jpem9udGFsbHkgKGxlZnQtcmlnaHQpLgotCS1mbGlwIHZlcnRpY2FsCQlNaXJyb3IgaW1hZ2UgdmVydGljYWxseSAodG9wLWJvdHRvbSkuCi0JLXJvdGF0ZSA5MAkJUm90YXRlIGltYWdlIDkwIGRlZ3JlZXMgY2xvY2t3aXNlLgotCS1yb3RhdGUgMTgwCQlSb3RhdGUgaW1hZ2UgMTgwIGRlZ3JlZXMuCi0JLXJvdGF0ZSAyNzAJCVJvdGF0ZSBpbWFnZSAyNzAgZGVncmVlcyBjbG9ja3dpc2UgKG9yIDkwIGNjdykuCi0JLXRyYW5zcG9zZQkJVHJhbnNwb3NlIGltYWdlIChhY3Jvc3MgVUwtdG8tTFIgYXhpcykuCi0JLXRyYW5zdmVyc2UJCVRyYW5zdmVyc2UgdHJhbnNwb3NlIChhY3Jvc3MgVVItdG8tTEwgYXhpcykuCi0KLVRoZSB0cmFuc3Bvc2UgdHJhbnNmb3JtYXRpb24gaGFzIG5vIHJlc3RyaWN0aW9ucyByZWdhcmRpbmcgaW1hZ2UgZGltZW5zaW9ucy4KLVRoZSBvdGhlciB0cmFuc2Zvcm1hdGlvbnMgb3BlcmF0ZSByYXRoZXIgb2RkbHkgaWYgdGhlIGltYWdlIGRpbWVuc2lvbnMgYXJlIG5vdAotYSBtdWx0aXBsZSBvZiB0aGUgaU1DVSBzaXplICh1c3VhbGx5IDggb3IgMTYgcGl4ZWxzKSwgYmVjYXVzZSB0aGV5IGNhbiBvbmx5Ci10cmFuc2Zvcm0gY29tcGxldGUgYmxvY2tzIG9mIERDVCBjb2VmZmljaWVudCBkYXRhIGluIHRoZSBkZXNpcmVkIHdheS4KLQotanBlZ3RyYW4ncyBkZWZhdWx0IGJlaGF2aW9yIHdoZW4gdHJhbnNmb3JtaW5nIGFuIG9kZC1zaXplIGltYWdlIGlzIGRlc2lnbmVkCi10byBwcmVzZXJ2ZSBleGFjdCByZXZlcnNpYmlsaXR5IGFuZCBtYXRoZW1hdGljYWwgY29uc2lzdGVuY3kgb2YgdGhlCi10cmFuc2Zvcm1hdGlvbiBzZXQuICBBcyBzdGF0ZWQsIHRyYW5zcG9zZSBpcyBhYmxlIHRvIGZsaXAgdGhlIGVudGlyZSBpbWFnZQotYXJlYS4gIEhvcml6b250YWwgbWlycm9yaW5nIGxlYXZlcyBhbnkgcGFydGlhbCBpTUNVIGNvbHVtbiBhdCB0aGUgcmlnaHQgZWRnZQotdW50b3VjaGVkLCBidXQgaXMgYWJsZSB0byBmbGlwIGFsbCByb3dzIG9mIHRoZSBpbWFnZS4gIFNpbWlsYXJseSwgdmVydGljYWwKLW1pcnJvcmluZyBsZWF2ZXMgYW55IHBhcnRpYWwgaU1DVSByb3cgYXQgdGhlIGJvdHRvbSBlZGdlIHVudG91Y2hlZCwgYnV0IGlzCi1hYmxlIHRvIGZsaXAgYWxsIGNvbHVtbnMuICBUaGUgb3RoZXIgdHJhbnNmb3JtcyBjYW4gYmUgYnVpbHQgdXAgYXMgc2VxdWVuY2VzCi1vZiB0cmFuc3Bvc2UgYW5kIGZsaXAgb3BlcmF0aW9uczsgZm9yIGNvbnNpc3RlbmN5LCB0aGVpciBhY3Rpb25zIG9uIGVkZ2UKLXBpeGVscyBhcmUgZGVmaW5lZCB0byBiZSB0aGUgc2FtZSBhcyB0aGUgZW5kIHJlc3VsdCBvZiB0aGUgY29ycmVzcG9uZGluZwotdHJhbnNwb3NlLWFuZC1mbGlwIHNlcXVlbmNlLgotCi1Gb3IgcHJhY3RpY2FsIHVzZSwgeW91IG1heSBwcmVmZXIgdG8gZGlzY2FyZCBhbnkgdW50cmFuc2Zvcm1hYmxlIGVkZ2UgcGl4ZWxzCi1yYXRoZXIgdGhhbiBoYXZpbmcgYSBzdHJhbmdlLWxvb2tpbmcgc3RyaXAgYWxvbmcgdGhlIHJpZ2h0IGFuZC9vciBib3R0b20gZWRnZXMKLW9mIGEgdHJhbnNmb3JtZWQgaW1hZ2UuICBUbyBkbyB0aGlzLCBhZGQgdGhlIC10cmltIHN3aXRjaDoKLQktdHJpbQkJRHJvcCBub24tdHJhbnNmb3JtYWJsZSBlZGdlIGJsb2Nrcy4KLU9idmlvdXNseSwgYSB0cmFuc2Zvcm1hdGlvbiB3aXRoIC10cmltIGlzIG5vdCByZXZlcnNpYmxlLCBzbyBzdHJpY3RseSBzcGVha2luZwotanBlZ3RyYW4gd2l0aCB0aGlzIHN3aXRjaCBpcyBub3QgbG9zc2xlc3MuICBBbHNvLCB0aGUgZXhwZWN0ZWQgbWF0aGVtYXRpY2FsCi1lcXVpdmFsZW5jZXMgYmV0d2VlbiB0aGUgdHJhbnNmb3JtYXRpb25zIG5vIGxvbmdlciBob2xkLiAgRm9yIGV4YW1wbGUsCi0iLXJvdCAyNzAgLXRyaW0iIHRyaW1zIG9ubHkgdGhlIGJvdHRvbSBlZGdlLCBidXQgIi1yb3QgOTAgLXRyaW0iIGZvbGxvd2VkIGJ5Ci0iLXJvdCAxODAgLXRyaW0iIHRyaW1zIGJvdGggZWRnZXMuCi0KLUFub3RoZXIgbm90LXN0cmljdGx5LWxvc3NsZXNzIHRyYW5zZm9ybWF0aW9uIHN3aXRjaCBpczoKLQktZ3JheXNjYWxlCUZvcmNlIGdyYXlzY2FsZSBvdXRwdXQuCi1UaGlzIG9wdGlvbiBkaXNjYXJkcyB0aGUgY2hyb21pbmFuY2UgY2hhbm5lbHMgaWYgdGhlIGlucHV0IGltYWdlIGlzIFlDYkNyCi0oaWUsIGEgc3RhbmRhcmQgY29sb3IgSlBFRyksIHJlc3VsdGluZyBpbiBhIGdyYXlzY2FsZSBKUEVHIGZpbGUuICBUaGUKLWx1bWluYW5jZSBjaGFubmVsIGlzIHByZXNlcnZlZCBleGFjdGx5LCBzbyB0aGlzIGlzIGEgYmV0dGVyIG1ldGhvZCBvZiByZWR1Y2luZwotdG8gZ3JheXNjYWxlIHRoYW4gZGVjb21wcmVzc2lvbiwgY29udmVyc2lvbiwgYW5kIHJlY29tcHJlc3Npb24uICBUaGlzIHN3aXRjaAotaXMgcGFydGljdWxhcmx5IGhhbmR5IGZvciBmaXhpbmcgYSBtb25vY2hyb21lIHBpY3R1cmUgdGhhdCB3YXMgbWlzdGFrZW5seQotZW5jb2RlZCBhcyBhIGNvbG9yIEpQRUcuICAoSW4gc3VjaCBhIGNhc2UsIHRoZSBzcGFjZSBzYXZpbmdzIGZyb20gZ2V0dGluZyByaWQKLW9mIHRoZSBuZWFyLWVtcHR5IGNocm9tYSBjaGFubmVscyB3b24ndCBiZSBsYXJnZTsgYnV0IHRoZSBkZWNvZGluZyB0aW1lIGZvcgotYSBncmF5c2NhbGUgSlBFRyBpcyBzdWJzdGFudGlhbGx5IGxlc3MgdGhhbiB0aGF0IGZvciBhIGNvbG9yIEpQRUcuKQotCi1qcGVndHJhbiBhbHNvIHJlY29nbml6ZXMgdGhlc2Ugc3dpdGNoZXMgdGhhdCBjb250cm9sIHdoYXQgdG8gZG8gd2l0aCAiZXh0cmEiCi1tYXJrZXJzLCBzdWNoIGFzIGNvbW1lbnQgYmxvY2tzOgotCS1jb3B5IG5vbmUJQ29weSBubyBleHRyYSBtYXJrZXJzIGZyb20gc291cmNlIGZpbGUuICBUaGlzIHNldHRpbmcKLQkJCXN1cHByZXNzZXMgYWxsIGNvbW1lbnRzIGFuZCBvdGhlciBleGNlc3MgYmFnZ2FnZQotCQkJcHJlc2VudCBpbiB0aGUgc291cmNlIGZpbGUuCi0JLWNvcHkgY29tbWVudHMJQ29weSBvbmx5IGNvbW1lbnQgbWFya2Vycy4gIFRoaXMgc2V0dGluZyBjb3BpZXMKLQkJCWNvbW1lbnRzIGZyb20gdGhlIHNvdXJjZSBmaWxlLCBidXQgZGlzY2FyZHMKLQkJCWFueSBvdGhlciBpbmVzc2VudGlhbCBkYXRhLiAKLQktY29weSBhbGwJQ29weSBhbGwgZXh0cmEgbWFya2Vycy4gIFRoaXMgc2V0dGluZyBwcmVzZXJ2ZXMKLQkJCW1pc2NlbGxhbmVvdXMgbWFya2VycyBmb3VuZCBpbiB0aGUgc291cmNlIGZpbGUsIHN1Y2gKLQkJCWFzIEpGSUYgdGh1bWJuYWlscyBhbmQgUGhvdG9zaG9wIHNldHRpbmdzLiAgSW4gc29tZQotCQkJZmlsZXMgdGhlc2UgZXh0cmEgbWFya2VycyBjYW4gYmUgc2l6YWJsZS4KLVRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIC1jb3B5IGNvbW1lbnRzLiAgKE5vdGU6IGluIElKRyByZWxlYXNlcyB2NiBhbmQgdjZhLAotanBlZ3RyYW4gYWx3YXlzIGRpZCB0aGUgZXF1aXZhbGVudCBvZiAtY29weSBub25lLikKLQotQWRkaXRpb25hbCBzd2l0Y2hlcyByZWNvZ25pemVkIGJ5IGpwZWd0cmFuIGFyZToKLQktb3V0ZmlsZSBmaWxlbmFtZQotCS1tYXhtZW1vcnkgTgotCS12ZXJib3NlCi0JLWRlYnVnCi1UaGVzZSB3b3JrIHRoZSBzYW1lIGFzIGluIGNqcGVnIG9yIGRqcGVnLgotCi0KLVRIRSBDT01NRU5UIFVUSUxJVElFUwotCi1UaGUgSlBFRyBzdGFuZGFyZCBhbGxvd3MgImNvbW1lbnQiIChDT00pIGJsb2NrcyB0byBvY2N1ciB3aXRoaW4gYSBKUEVHIGZpbGUuCi1BbHRob3VnaCB0aGUgc3RhbmRhcmQgZG9lc24ndCBhY3R1YWxseSBkZWZpbmUgd2hhdCBDT00gYmxvY2tzIGFyZSBmb3IsIHRoZXkKLWFyZSB3aWRlbHkgdXNlZCB0byBob2xkIHVzZXItc3VwcGxpZWQgdGV4dCBzdHJpbmdzLiAgVGhpcyBsZXRzIHlvdSBhZGQKLWFubm90YXRpb25zLCB0aXRsZXMsIGluZGV4IHRlcm1zLCBldGMgdG8geW91ciBKUEVHIGZpbGVzLCBhbmQgbGF0ZXIgcmV0cmlldmUKLXRoZW0gYXMgdGV4dC4gIENPTSBibG9ja3MgZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZSBpbWFnZSBzdG9yZWQgaW4gdGhlIEpQRUcKLWZpbGUuICBUaGUgbWF4aW11bSBzaXplIG9mIGEgQ09NIGJsb2NrIGlzIDY0SywgYnV0IHlvdSBjYW4gaGF2ZSBhcyBtYW55IG9mCi10aGVtIGFzIHlvdSBsaWtlIGluIG9uZSBKUEVHIGZpbGUuCi0KLVdlIHByb3ZpZGUgdHdvIHV0aWxpdHkgcHJvZ3JhbXMgdG8gZGlzcGxheSBDT00gYmxvY2sgY29udGVudHMgYW5kIGFkZCBDT00KLWJsb2NrcyB0byBhIEpQRUcgZmlsZS4KLQotcmRqcGdjb20gc2VhcmNoZXMgYSBKUEVHIGZpbGUgYW5kIHByaW50cyB0aGUgY29udGVudHMgb2YgYW55IENPTSBibG9ja3Mgb24KLXN0YW5kYXJkIG91dHB1dC4gIFRoZSBjb21tYW5kIGxpbmUgc3ludGF4IGlzCi0JcmRqcGdjb20gWy12ZXJib3NlXSBbaW5wdXRmaWxlbmFtZV0KLVRoZSBzd2l0Y2ggIi12ZXJib3NlIiAob3IganVzdCAiLXYiKSBjYXVzZXMgcmRqcGdjb20gdG8gYWxzbyBkaXNwbGF5IHRoZSBKUEVHCi1pbWFnZSBkaW1lbnNpb25zLiAgSWYgeW91IG9taXQgdGhlIGlucHV0IGZpbGUgbmFtZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUsCi10aGUgSlBFRyBmaWxlIGlzIHJlYWQgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIChUaGlzIG1heSBub3Qgd29yayBvbiBzb21lCi1vcGVyYXRpbmcgc3lzdGVtcywgaWYgYmluYXJ5IGRhdGEgY2FuJ3QgYmUgcmVhZCBmcm9tIHN0ZGluLikKLQotd3JqcGdjb20gYWRkcyBhIENPTSBibG9jaywgY29udGFpbmluZyB0ZXh0IHlvdSBwcm92aWRlLCB0byBhIEpQRUcgZmlsZS4KLU9yZGluYXJpbHksIHRoZSBDT00gYmxvY2sgaXMgYWRkZWQgYWZ0ZXIgYW55IGV4aXN0aW5nIENPTSBibG9ja3MsIGJ1dCB5b3UKLWNhbiBkZWxldGUgdGhlIG9sZCBDT00gYmxvY2tzIGlmIHlvdSB3aXNoLiAgd3JqcGdjb20gcHJvZHVjZXMgYSBuZXcgSlBFRwotZmlsZTsgaXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBpbnB1dCBmaWxlLiAgRE8gTk9UIHRyeSB0byBvdmVyd3JpdGUgdGhlIGlucHV0Ci1maWxlIGJ5IGRpcmVjdGluZyB3cmpwZ2NvbSdzIG91dHB1dCBiYWNrIGludG8gaXQ7IG9uIG1vc3Qgc3lzdGVtcyB0aGlzIHdpbGwKLWp1c3QgZGVzdHJveSB5b3VyIGZpbGUuCi0KLVRoZSBjb21tYW5kIGxpbmUgc3ludGF4IGZvciB3cmpwZ2NvbSBpcyBzaW1pbGFyIHRvIGNqcGVnJ3MuICBPbiBVbml4LWxpa2UKLXN5c3RlbXMsIGl0IGlzCi0Jd3JqcGdjb20gW3N3aXRjaGVzXSBbaW5wdXRmaWxlbmFtZV0KLVRoZSBvdXRwdXQgZmlsZSBpcyB3cml0dGVuIHRvIHN0YW5kYXJkIG91dHB1dC4gIFRoZSBpbnB1dCBmaWxlIGNvbWVzIGZyb20KLXRoZSBuYW1lZCBmaWxlLCBvciBmcm9tIHN0YW5kYXJkIGlucHV0IGlmIG5vIGlucHV0IGZpbGUgaXMgbmFtZWQuCi0KLU9uIG1vc3Qgbm9uLVVuaXggc3lzdGVtcywgdGhlIHN5bnRheCBpcwotCXdyanBnY29tIFtzd2l0Y2hlc10gaW5wdXRmaWxlbmFtZSBvdXRwdXRmaWxlbmFtZQotd2hlcmUgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGZpbGUgbmFtZXMgbXVzdCBiZSBnaXZlbiBleHBsaWNpdGx5LgotCi13cmpwZ2NvbSB1bmRlcnN0YW5kcyB0aHJlZSBzd2l0Y2hlczoKLQktcmVwbGFjZQkJIERlbGV0ZSBhbnkgZXhpc3RpbmcgQ09NIGJsb2NrcyBmcm9tIHRoZSBmaWxlLgotCS1jb21tZW50ICJDb21tZW50IHRleHQiCSBTdXBwbHkgbmV3IENPTSB0ZXh0IG9uIGNvbW1hbmQgbGluZS4KLQktY2ZpbGUgbmFtZQkJIFJlYWQgdGV4dCBmb3IgbmV3IENPTSBibG9jayBmcm9tIG5hbWVkIGZpbGUuCi0oU3dpdGNoIG5hbWVzIGNhbiBiZSBhYmJyZXZpYXRlZC4pICBJZiB5b3UgaGF2ZSBvbmx5IG9uZSBsaW5lIG9mIGNvbW1lbnQgdGV4dAotdG8gYWRkLCB5b3UgY2FuIHByb3ZpZGUgaXQgb24gdGhlIGNvbW1hbmQgbGluZSB3aXRoIC1jb21tZW50LiAgVGhlIGNvbW1lbnQKLXRleHQgbXVzdCBiZSBzdXJyb3VuZGVkIHdpdGggcXVvdGVzIHNvIHRoYXQgaXQgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZQotYXJndW1lbnQuICBMb25nZXIgY29tbWVudHMgY2FuIGJlIHJlYWQgZnJvbSBhIHRleHQgZmlsZS4KLQotSWYgeW91IGdpdmUgbmVpdGhlciAtY29tbWVudCBub3IgLWNmaWxlLCB0aGVuIHdyanBnY29tIHdpbGwgcmVhZCB0aGUgY29tbWVudAotdGV4dCBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKEluIHRoaXMgY2FzZSBhbiBpbnB1dCBpbWFnZSBmaWxlIG5hbWUgTVVTVCBiZQotc3VwcGxpZWQsIHNvIHRoYXQgdGhlIHNvdXJjZSBKUEVHIGZpbGUgY29tZXMgZnJvbSBzb21ld2hlcmUgZWxzZS4pICBZb3UgY2FuCi1lbnRlciBtdWx0aXBsZSBsaW5lcywgdXAgdG8gNjRLQiB3b3J0aC4gIFR5cGUgYW4gZW5kLW9mLWZpbGUgaW5kaWNhdG9yCi0odXN1YWxseSBjb250cm9sLUQgb3IgY29udHJvbC1aKSB0byB0ZXJtaW5hdGUgdGhlIGNvbW1lbnQgdGV4dCBlbnRyeS4KLQotd3JqcGdjb20gd2lsbCBub3QgYWRkIGEgQ09NIGJsb2NrIGlmIHRoZSBwcm92aWRlZCBjb21tZW50IHN0cmluZyBpcyBlbXB0eS4KLVRoZXJlZm9yZSAtcmVwbGFjZSAtY29tbWVudCAiIiBjYW4gYmUgdXNlZCB0byBkZWxldGUgYWxsIENPTSBibG9ja3MgZnJvbSBhCi1maWxlLgotCi1UaGVzZSB1dGlsaXR5IHByb2dyYW1zIGRvIG5vdCBkZXBlbmQgb24gdGhlIElKRyBKUEVHIGxpYnJhcnkuICBJbgotcGFydGljdWxhciwgdGhlIHNvdXJjZSBjb2RlIGZvciByZGpwZ2NvbSBpcyBpbnRlbmRlZCBhcyBhbiBpbGx1c3RyYXRpb24gb2YKLXRoZSBtaW5pbXVtIGFtb3VudCBvZiBjb2RlIHJlcXVpcmVkIHRvIHBhcnNlIGEgSlBFRyBmaWxlIGhlYWRlciBjb3JyZWN0bHkuCmRpZmYgLS1naXQgYS92YzZwcm9qL2FwcHRlc3QuZHNwIGIvdmM2cHJvai9hcHB0ZXN0LmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1YzM1Yi4uMDAwMDAwMAotLS0gYS92YzZwcm9qL2FwcHRlc3QuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iYXBwdGVzdCIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiDK1L24pLekyqSkpMekr6TApLWkpCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBHZW5lcmljIFByb2plY3QiIDB4MDEwYQotCi1DRkc9YXBwdGVzdCAtIFdpbjMyIERlYnVnCi0hTUVTU0FHRSCks6TspM/Nrbj6pMqO0o6yjriOzI6njrKO2aTHpM+koqTqpN6ku6TzoaMgpLOkzo7Mjt+O2468jt6Oqo64jsSk8o7Ljt6O2Y7Ejt6kuaTrpL+k4aTLpM8gTk1BS0UgpPK7yM3RpLekxqSvpMCktaSkoaMKLSFNRVNTQUdFIFuO0o6yjriOzI6njrKO2aTOjrSOuI69js6O346wjsRdII66js+O3Y7Ejt6k8rvIzdGkt6TGvMK51KS3pMakr6TApLWkpAotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiYXBwdGVzdC5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSCkzrzCudS7/qTLub3ArqTyu9jE6qTHpK2k3qS5Ci0hTUVTU0FHRSCOuo7Pjt2OxI7eII7XjrKO3b7lpMeOz464jtukzsDfxOqk8sTqtcGkt6TepLmho87jOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiYXBwdGVzdC5tYWsiIENGRz0iYXBwdGVzdCAtIFdpbjMyIERlYnVnIgotIU1FU1NBR0UgCi0hTUVTU0FHRSDBqsLyssTHvaTKjsuO3o7ZjsSO3iCO046wjsSO3joKLSFNRVNTQUdFIAotIU1FU1NBR0UgImFwcHRlc3QgLSBXaW4zMiBSZWxlYXNlIiAoIldpbjMyICh4ODYpIEdlbmVyaWMgUHJvamVjdCIgzdEpCi0hTUVTU0FHRSAiYXBwdGVzdCAtIFdpbjMyIERlYnVnIiAoIldpbjMyICh4ODYpIEdlbmVyaWMgUHJvamVjdCIgzdEpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLU1UTD1taWRsLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJhcHB0ZXN0IC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEJlZ2luIFNwZWNpYWwgQnVpbGQgVG9vbAotT3V0RGlyPS5cUmVsZWFzZQotU09VUkNFPSIkKElucHV0UGF0aCkiCi1Qb3N0QnVpbGRfQ21kcz1mYyAvYiAuXHRlc3RpbWcucHBtICQoT3V0RGlyKVx0ZXN0b3V0LnBwbQlmYyAvYiAuXHRlc3RpbWcuYm1wICQoT3V0RGlyKVx0ZXN0b3V0LmJtcAlmYyAvYiAuXHRlc3RpbWcuanBnICQoT3V0RGlyKVx0ZXN0b3V0LmpwZwlmYyAvYiAuXHRlc3RpbWcucHBtICQoT3V0RGlyKVx0ZXN0b3V0cC5wcG0JZmMgL2IgLlx0ZXN0aW1ncC5qcGcgJChPdXREaXIpXHRlc3RvdXRwLmpwZwlmYyAvYiAuXHRlc3RvcmlnLmpwZyAkKE91dERpcilcdGVzdG91dHQuanBnCi0jIEVuZCBTcGVjaWFsIEJ1aWxkIFRvb2wKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImFwcHRlc3QgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBCZWdpbiBTcGVjaWFsIEJ1aWxkIFRvb2wKLU91dERpcj0uXERlYnVnCi1TT1VSQ0U9IiQoSW5wdXRQYXRoKSIKLVBvc3RCdWlsZF9DbWRzPWZjIC9iIC5cdGVzdGltZy5wcG0gJChPdXREaXIpXHRlc3RvdXQucHBtCWZjIC9iIC5cdGVzdGltZy5ibXAgJChPdXREaXIpXHRlc3RvdXQuYm1wCWZjIC9iIC5cdGVzdGltZy5qcGcgJChPdXREaXIpXHRlc3RvdXQuanBnCWZjIC9iIC5cdGVzdGltZy5wcG0gJChPdXREaXIpXHRlc3RvdXRwLnBwbQlmYyAvYiAuXHRlc3RpbWdwLmpwZyAkKE91dERpcilcdGVzdG91dHAuanBnCWZjIC9iIC5cdGVzdG9yaWcuanBnICQoT3V0RGlyKVx0ZXN0b3V0dC5qcGcKLSMgRW5kIFNwZWNpYWwgQnVpbGQgVG9vbAotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiYXBwdGVzdCAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgImFwcHRlc3QgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gR3JvdXAgIlRlc3QgSW1hZ2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiKi5qcGc7Ki5ibXA7Ki5wcG0iCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHRlc3RpbWcuYm1wCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llx0ZXN0aW1nLmpwZwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cdGVzdGltZy5wcG0KLQotIUlGICAiJChDRkcpIiA9PSAiYXBwdGVzdCAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkCi1JbnB1dERpcj0uCi1PdXREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9Llx0ZXN0aW1nLnBwbQotCi1CdWlsZENtZHM9IFwKLQllY2hvICQoT3V0RGlyKVxjanBlZyAtZGN0IGludCAtb3V0ZmlsZSAkKE91dERpcilcdGVzdG91dC5qcGcgLlx0ZXN0aW1nLnBwbSBcCi0JJChPdXREaXIpXGNqcGVnIC1kY3QgaW50IC1vdXRmaWxlICQoT3V0RGlyKVx0ZXN0b3V0LmpwZyAuXHRlc3RpbWcucHBtIFwKLQllY2hvICQoT3V0RGlyKVxjanBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSAkKE91dERpcilcdGVzdG91dHAuanBnIC5cdGVzdGltZy5wcG0gXAotCSQoT3V0RGlyKVxjanBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSAkKE91dERpcilcdGVzdG91dHAuanBnIC5cdGVzdGltZy5wcG0gXAotCQotCi0iJChPdXREaXIpXHRlc3RvdXQuanBnIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotICAgJChCdWlsZENtZHMpCi0KLSIkKE91dERpcilcdGVzdG91dHAuanBnIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotICAgJChCdWlsZENtZHMpCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImFwcHRlc3QgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBUZXN0aW5nIC0gJChJbnB1dFBhdGgpCi1JbnB1dERpcj0uCi1PdXREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5cdGVzdGltZy5wcG0KLQotQnVpbGRDbWRzPSBcCi0JZWNobyAkKE91dERpcilcY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgJChPdXREaXIpXHRlc3RvdXQuanBnIC5cdGVzdGltZy5wcG0gXAotCSQoT3V0RGlyKVxjanBlZyAtZGN0IGludCAtb3V0ZmlsZSAkKE91dERpcilcdGVzdG91dC5qcGcgLlx0ZXN0aW1nLnBwbSBcCi0JZWNobyAkKE91dERpcilcY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgJChPdXREaXIpXHRlc3RvdXRwLmpwZyAuXHRlc3RpbWcucHBtIFwKLQkkKE91dERpcilcY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgJChPdXREaXIpXHRlc3RvdXRwLmpwZyAuXHRlc3RpbWcucHBtIFwKLQkKLQotIiQoT3V0RGlyKVx0ZXN0b3V0LmpwZyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLSAgICQoQnVpbGRDbWRzKQotCi0iJChPdXREaXIpXHRlc3RvdXRwLmpwZyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLSAgICQoQnVpbGRDbWRzKQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cdGVzdGltZ3AuanBnCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llx0ZXN0b3JpZy5qcGcKLQotIUlGICAiJChDRkcpIiA9PSAiYXBwdGVzdCAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkCi1JbnB1dERpcj0uCi1PdXREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9Llx0ZXN0b3JpZy5qcGcKLQotQnVpbGRDbWRzPSBcCi0JZWNobyAkKE91dERpcilcZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSAkKE91dERpcilcdGVzdG91dC5wcG0gLlx0ZXN0b3JpZy5qcGcgXAotCSQoT3V0RGlyKVxkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlICQoT3V0RGlyKVx0ZXN0b3V0LnBwbSAuXHRlc3RvcmlnLmpwZyBcCi0JZWNobyAkKE91dERpcilcZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSAkKE91dERpcilcdGVzdG91dC5ibXAgLlx0ZXN0b3JpZy5qcGcgXAotCSQoT3V0RGlyKVxkanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlICQoT3V0RGlyKVx0ZXN0b3V0LmJtcCAuXHRlc3RvcmlnLmpwZyBcCi0JCi0KLSIkKE91dERpcilcdGVzdG91dC5wcG0iIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0gICAkKEJ1aWxkQ21kcykKLQotIiQoT3V0RGlyKVx0ZXN0b3V0LmJtcCIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLSAgICQoQnVpbGRDbWRzKQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJhcHB0ZXN0IC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gVGVzdGluZyAtICQoSW5wdXRQYXRoKQotSW5wdXREaXI9LgotT3V0RGlyPS5cRGVidWcKLUlucHV0UGF0aD0uXHRlc3RvcmlnLmpwZwotCi1CdWlsZENtZHM9IFwKLQllY2hvICQoT3V0RGlyKVxkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlICQoT3V0RGlyKVx0ZXN0b3V0LnBwbSAuXHRlc3RvcmlnLmpwZyBcCi0JJChPdXREaXIpXGRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgJChPdXREaXIpXHRlc3RvdXQucHBtIC5cdGVzdG9yaWcuanBnIFwKLQllY2hvICQoT3V0RGlyKVxkanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlICQoT3V0RGlyKVx0ZXN0b3V0LmJtcCAuXHRlc3RvcmlnLmpwZyBcCi0JJChPdXREaXIpXGRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgJChPdXREaXIpXHRlc3RvdXQuYm1wIC5cdGVzdG9yaWcuanBnIFwKLQkKLQotIiQoT3V0RGlyKVx0ZXN0b3V0LnBwbSIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLSAgICQoQnVpbGRDbWRzKQotCi0iJChPdXREaXIpXHRlc3RvdXQuYm1wIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotICAgJChCdWlsZENtZHMpCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llx0ZXN0cHJvZy5qcGcKLQotIUlGICAiJChDRkcpIiA9PSAiYXBwdGVzdCAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkCi1JbnB1dERpcj0uCi1PdXREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9Llx0ZXN0cHJvZy5qcGcKLQotQnVpbGRDbWRzPSBcCi0JZWNobyAkKE91dERpcilcZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSAkKE91dERpcilcdGVzdG91dHAucHBtIC5cdGVzdHByb2cuanBnIFwKLQkkKE91dERpcilcZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSAkKE91dERpcilcdGVzdG91dHAucHBtIC5cdGVzdHByb2cuanBnIFwKLQllY2hvICQoT3V0RGlyKVxqcGVndHJhbiAtb3V0ZmlsZSAkKE91dERpcilcdGVzdG91dHQuanBnIC5cdGVzdHByb2cuanBnIFwKLQkkKE91dERpcilcanBlZ3RyYW4gLW91dGZpbGUgJChPdXREaXIpXHRlc3RvdXR0LmpwZyAuXHRlc3Rwcm9nLmpwZyBcCi0JCi0KLSIkKE91dERpcilcdGVzdG91dHAucHBtIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotICAgJChCdWlsZENtZHMpCi0KLSIkKE91dERpcilcdGVzdG91dHQuanBnIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotICAgJChCdWlsZENtZHMpCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImFwcHRlc3QgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBUZXN0aW5nIC0gJChJbnB1dFBhdGgpCi1JbnB1dERpcj0uCi1PdXREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5cdGVzdHByb2cuanBnCi0KLUJ1aWxkQ21kcz0gXAotCWVjaG8gJChPdXREaXIpXGRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgJChPdXREaXIpXHRlc3RvdXRwLnBwbSAuXHRlc3Rwcm9nLmpwZyBcCi0JJChPdXREaXIpXGRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgJChPdXREaXIpXHRlc3RvdXRwLnBwbSAuXHRlc3Rwcm9nLmpwZyBcCi0JZWNobyAkKE91dERpcilcanBlZ3RyYW4gLW91dGZpbGUgJChPdXREaXIpXHRlc3RvdXR0LmpwZyAuXHRlc3Rwcm9nLmpwZyBcCi0JJChPdXREaXIpXGpwZWd0cmFuIC1vdXRmaWxlICQoT3V0RGlyKVx0ZXN0b3V0dC5qcGcgLlx0ZXN0cHJvZy5qcGcgXAotCQotCi0iJChPdXREaXIpXHRlc3RvdXRwLnBwbSIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLSAgICQoQnVpbGRDbWRzKQotCi0iJChPdXREaXIpXHRlc3RvdXR0LmpwZyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLSAgICQoQnVpbGRDbWRzKQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL3ZjNnByb2ovY2pwZWcuZHNwIGIvdmM2cHJvai9janBlZy5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3M2U2MTkuLjAwMDAwMDAKLS0tIGEvdmM2cHJvai9janBlZy5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJjanBlZyIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiDK1L24pLekyqSkpMekr6TApLWkpCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMKLQotQ0ZHPWNqcGVnIC0gV2luMzIgRGVidWcKLSFNRVNTQUdFIKSzpOykz82tuPqkyo7SjrKOuI7MjqeOso7ZpMekz6SipOqk3qS7pPOhoyCks6TOjsyO347bjryO3o6qjriOxKTyjsuO3o7ZjsSO3qS5pOukv6ThpMukzyBOTUFLRSCk8rvIzdGkt6TGpK+kwKS1pKShowotIU1FU1NBR0UgW47SjrKOuI7MjqeOso7ZpM6OtI64jr2Ozo7fjrCOxF0gjrqOz47djsSO3qTyu8jN0aS3pMa8wrnUpLekxqSvpMCktaSkCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJjanBlZy5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSCkzrzCudS7/qTLub3ArqTyu9jE6qTHpK2k3qS5Ci0hTUVTU0FHRSCOuo7Pjt2OxI7eII7XjrKO3b7lpMeOz464jtukzsDfxOqk8sTqtcGkt6TepLmho87jOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiY2pwZWcubWFrIiBDRkc9ImNqcGVnIC0gV2luMzIgRGVidWciCi0hTUVTU0FHRSAKLSFNRVNTQUdFIMGqwvKyxMe9pMqOy47ejtmOxI7eII7TjrCOxI7eOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiY2pwZWcgLSBXaW4zMiBSZWxlYXNlIiAoIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIM3RKQotIU1FU1NBR0UgImNqcGVnIC0gV2luMzIgRGVidWciICgiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgzdEpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAiY2pwZWcgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvVzMgL08yIC9HRiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBSU0MgL2wgMHg0MTEgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQxMSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgbGlianBlZy5saWIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYgL2xpYnBhdGg6IlJlbGVhc2UiIC9vcHQ6bm93aW45OAotIyBTVUJUUkFDVCBMSU5LMzIgL3BkYjpub25lCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJjanBlZyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL0ZEIC9HWiAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HbSAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL0ZEIC9HWiAvYwotIyBBREQgQkFTRSBSU0MgL2wgMHg0MTEgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQxMSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0Ci0jIEFERCBMSU5LMzIgbGlianBlZy5saWIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQgL2xpYnBhdGg6IkRlYnVnIiAvb3B0Om5vd2luOTgKLSMgU1VCVFJBQ1QgTElOSzMyIC9wZGI6bm9uZQotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiY2pwZWcgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJjanBlZyAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGNkanBlZy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxjanBlZy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxyZGJtcC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxyZGdpZi5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxyZHBwbS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxyZHJsZS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxyZHN3aXRjaC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxyZHRhcmdhLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGNkZXJyb3IuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cY2RqcGVnLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpjb25maWcuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camVycm9yLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGppbmNsdWRlLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGptb3JlY2ZnLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpwZWdsaWIuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5canZlcnNpb24uaAotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiCi0jIEVuZCBHcm91cAotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS92YzZwcm9qL2RqcGVnLmRzcCBiL3ZjNnByb2ovZGpwZWcuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTZiMzc4Li4wMDAwMDAwCi0tLSBhL3ZjNnByb2ovZGpwZWcuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iZGpwZWciIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKLSMgKiogytS9uKS3pMqkpKTHpK+kwKS1pKQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzCi0KLUNGRz1kanBlZyAtIFdpbjMyIERlYnVnCi0hTUVTU0FHRSCks6TspM/Nrbj6pMqO0o6yjriOzI6njrKO2aTHpM+koqTqpN6ku6TzoaMgpLOkzo7Mjt+O2468jt6Oqo64jsSk8o7Ljt6O2Y7Ejt6kuaTrpL+k4aTLpM8gTk1BS0UgpPK7yM3RpLekxqSvpMCktaSkoaMKLSFNRVNTQUdFIFuO0o6yjriOzI6njrKO2aTOjrSOuI69js6O346wjsRdII66js+O3Y7Ejt6k8rvIzdGkt6TGvMK51KS3pMakr6TApLWkpAotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiZGpwZWcubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgpM68wrnUu/6ky7m9wK6k8rvYxOqkx6StpN6kuQotIU1FU1NBR0UgjrqOz47djsSO3iCO146yjt2+5aTHjs+OuI7bpM7A38TqpPLE6rXBpLek3qS5oaPO4zoKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgImRqcGVnLm1hayIgQ0ZHPSJkanBlZyAtIFdpbjMyIERlYnVnIgotIU1FU1NBR0UgCi0hTUVTU0FHRSDBqsLyssTHvaTKjsuO3o7ZjsSO3iCO046wjsSO3joKLSFNRVNTQUdFIAotIU1FU1NBR0UgImRqcGVnIC0gV2luMzIgUmVsZWFzZSIgKCJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiDN0SkKLSFNRVNTQUdFICJkanBlZyAtIFdpbjMyIERlYnVnIiAoIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIM3RKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImRqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9PMiAvR0YgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDExIC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MTEgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIGxpYmpwZWcubGliIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2IC9saWJwYXRoOiJSZWxlYXNlIiAvb3B0Om5vd2luOTgKLSMgU1VCVFJBQ1QgTElOSzMyIC9wZGI6bm9uZQotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiZGpwZWcgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9GRCAvR1ogL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9GRCAvR1ogL2MKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDExIC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MTEgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAotIyBBREQgTElOSzMyIGxpYmpwZWcubGliIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0IC9saWJwYXRoOiJEZWJ1ZyIgL29wdDpub3dpbjk4Ci0jIFNVQlRSQUNUIExJTkszMiAvcGRiOm5vbmUKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgImRqcGVnIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiZGpwZWcgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0IgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxjZGpwZWcuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cZGpwZWcuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5ccmRjb2xtYXAuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cd3JibXAuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cd3JnaWYuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cd3JwcG0uYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cd3JybGUuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cd3J0YXJnYS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxjZGVycm9yLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGNkanBlZy5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqY29uZmlnLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGplcnJvci5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqaW5jbHVkZS5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqbW9yZWNmZy5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqcGVnbGliLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGp2ZXJzaW9uLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIgotIyBFbmQgR3JvdXAKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvdmM2cHJvai9qY29uZmlnLmggYi92YzZwcm9qL2pjb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDViYzlmOS4uMDAwMDAwMAotLS0gYS92YzZwcm9qL2pjb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qIGpjb25maWcudmMgLS0tIGpjb25maWcuaCBmb3IgTWljcm9zb2Z0IFZpc3VhbCBDKysgb24gV2luZG93cyA5NSBvciBOVC4gKi8KLS8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCi0KLSNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgotI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCi0vKiAjZGVmaW5lIHZvaWQgY2hhciAqLwotLyogI2RlZmluZSBjb25zdCAqLwotI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKLSNkZWZpbmUgSEFWRV9TVERERUZfSAotI2RlZmluZSBIQVZFX1NURExJQl9ICi0jdW5kZWYgTkVFRF9CU0RfU1RSSU5HUwotI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKLSN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUwkvKiB3ZSBwcmVzdW1lIGEgMzItYml0IGZsYXQgbWVtb3J5IG1vZGVsICovCi0jdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCi0KLS8qIERlZmluZSAiYm9vbGVhbiIgYXMgdW5zaWduZWQgY2hhciwgbm90IGludCwgcGVyIFdpbmRvd3MgY3VzdG9tICovCi0jZGVmaW5lIFRZUEVERUZfVUNIQVJfQk9PTEVBTgotCi0jaWZkZWYgSlBFR19JTlRFUk5BTFMKLQotI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECi0KLSNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLwotCi0jaWYgZGVmaW5lZChKUEVHX0lOVEVSTkFMUykgfHwgZGVmaW5lZChKUEVHX0lOVEVSTkFMX09QVElPTlMpCi0jdW5kZWYgSlNJTURfTU1YX05PVF9TVVBQT1JURUQKLSN1bmRlZiBKU0lNRF8zRE5PV19OT1RfU1VQUE9SVEVECi0jdW5kZWYgSlNJTURfU1NFX05PVF9TVVBQT1JURUQKLSN1bmRlZiBKU0lNRF9TU0UyX05PVF9TVVBQT1JURUQKLSNlbmRpZgotCi0jaWZkZWYgSlBFR19DSlBFR19ESlBFRwotCi0jZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotCi0jZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCS8qIG9wdGlvbmFsICovCi0jZGVmaW5lIFVTRV9TRVRNT0RFCQkvKiBNaWNyb3NvZnQgaGFzIHNldG1vZGUoKSAqLwotI3VuZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKLSN1bmRlZiBET05UX1VTRV9CX01PREUKLSN1bmRlZiBQUk9HUkVTU19SRVBPUlQJCS8qIG9wdGlvbmFsICovCi0KLSNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS92YzZwcm9qL2pwZWd0cmFuLmRzcCBiL3ZjNnByb2ovanBlZ3RyYW4uZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGMzOGQ0Li4wMDAwMDAwCi0tLSBhL3ZjNnByb2ovanBlZ3RyYW4uZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ianBlZ3RyYW4iIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKLSMgKiogytS9uKS3pMqkpKTHpK+kwKS1pKQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzCi0KLUNGRz1qcGVndHJhbiAtIFdpbjMyIERlYnVnCi0hTUVTU0FHRSCks6TspM/Nrbj6pMqO0o6yjriOzI6njrKO2aTHpM+koqTqpN6ku6TzoaMgpLOkzo7Mjt+O2468jt6Oqo64jsSk8o7Ljt6O2Y7Ejt6kuaTrpL+k4aTLpM8gTk1BS0UgpPK7yM3RpLekxqSvpMCktaSkoaMKLSFNRVNTQUdFIFuO0o6yjriOzI6njrKO2aTOjrSOuI69js6O346wjsRdII66js+O3Y7Ejt6k8rvIzdGkt6TGvMK51KS3pMakr6TApLWkpAotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAianBlZ3RyYW4ubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgpM68wrnUu/6ky7m9wK6k8rvYxOqkx6StpN6kuQotIU1FU1NBR0UgjrqOz47djsSO3iCO146yjt2+5aTHjs+OuI7bpM7A38TqpPLE6rXBpLek3qS5oaPO4zoKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgImpwZWd0cmFuLm1hayIgQ0ZHPSJqcGVndHJhbiAtIFdpbjMyIERlYnVnIgotIU1FU1NBR0UgCi0hTUVTU0FHRSDBqsLyssTHvaTKjsuO3o7ZjsSO3iCO046wjsSO3joKLSFNRVNTQUdFIAotIU1FU1NBR0UgImpwZWd0cmFuIC0gV2luMzIgUmVsZWFzZSIgKCJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiDN0SkKLSFNRVNTQUdFICJqcGVndHJhbiAtIFdpbjMyIERlYnVnIiAoIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIM3RKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImpwZWd0cmFuIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9PMiAvR0YgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDExIC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MTEgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIGxpYmpwZWcubGliIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2IC9saWJwYXRoOiJSZWxlYXNlIiAvb3B0Om5vd2luOTgKLSMgU1VCVFJBQ1QgTElOSzMyIC9wZGI6bm9uZQotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAianBlZ3RyYW4gLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9GRCAvR1ogL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9GRCAvR1ogL2MKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDExIC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MTEgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAotIyBBREQgTElOSzMyIGxpYmpwZWcubGliIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0IC9saWJwYXRoOiJEZWJ1ZyIgL29wdDpub3dpbjk4Ci0jIFNVQlRSQUNUIExJTkszMiAvcGRiOm5vbmUKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgImpwZWd0cmFuIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAianBlZ3RyYW4gLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0IgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxjZGpwZWcuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5canBlZ3RyYW4uYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5ccmRzd2l0Y2guYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cdHJhbnN1cHAuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cY2RlcnJvci5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxjZGpwZWcuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camNvbmZpZy5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqZXJyb3IuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camluY2x1ZGUuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cam1vcmVjZmcuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5canBlZ2ludC5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqcGVnbGliLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGp2ZXJzaW9uLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHRyYW5zdXBwLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIgotIyBFbmQgR3JvdXAKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvdmM2cHJvai9saWJqcGVnLmRzcCBiL3ZjNnByb2ovbGlianBlZy5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NjQ3ZDAuLjAwMDAwMDAKLS0tIGEvdmM2cHJvai9saWJqcGVnLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDE3NTEgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJsaWJqcGVnIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jICoqIMrUvbikt6TKpKSkx6SvpMCktaSkICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IiAweDAxMDQKLQotQ0ZHPWxpYmpwZWcgLSBXaW4zMiBEZWJ1ZwotIU1FU1NBR0UgpLOk7KTPza24+qTKjtKOso64jsyOp46yjtmkx6TPpKKk6qTepLuk86GjIKSzpM6OzI7fjtuOvI7ejqqOuI7EpPKOy47ejtmOxI7epLmk66S/pOGky6TPIE5NQUtFIKTyu8jN0aS3pMakr6TApLWkpKGjCi0hTUVTU0FHRSBbjtKOso64jsyOp46yjtmkzo60jriOvY7Ojt+OsI7EXSCOuo7Pjt2OxI7epPK7yM3RpLekxrzCudSkt6TGpK+kwKS1pKQKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgImxpYmpwZWcubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgpM68wrnUu/6ky7m9wK6k8rvYxOqkx6StpN6kuQotIU1FU1NBR0UgjrqOz47djsSO3iCO146yjt2+5aTHjs+OuI7bpM7A38TqpPLE6rXBpLek3qS5oaPO4zoKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgImxpYmpwZWcubWFrIiBDRkc9ImxpYmpwZWcgLSBXaW4zMiBEZWJ1ZyIKLSFNRVNTQUdFIAotIU1FU1NBR0UgwarC8rLEx72kyo7Ljt6O2Y7Ejt4gjtOOsI7Ejt46Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIgKCJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIgzdEpCi0hTUVTU0FHRSAibGlianBlZyAtIFdpbjMyIERlYnVnIiAoIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IiDN0SkKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwCi0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9MSUIiIC9ZWCAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0xJQiIgL1lYIC9abCAvRkQgL0dGIC9jCi0jIEFERCBCQVNFIFJTQyAvbCAweDQxMSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDExIC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSUIzMj1saW5rLmV4ZSAtbGliCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KLSMgQUREIExJQjMyIC9ub2xvZ28KLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9MSUIiIC9ZWCAvRkQgL0daIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvVzMgL0dtIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0xJQiIgL1lYIC9abCAvRkQgL0daIC9jCi0jIEFERCBCQVNFIFJTQyAvbCAweDQxMSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDExIC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSUIzMj1saW5rLmV4ZSAtbGliCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KLSMgQUREIExJQjMyIC9ub2xvZ28KLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgImxpYmpwZWcgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJsaWJqcGVnIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camNhcGltaW4uYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camNhcGlzdGQuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camNjb2VmY3QuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camNjb2xvci5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqY2RjdG1nci5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqY2h1ZmYuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camNpbml0LmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpjbWFpbmN0LmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpjbWFya2VyLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpjbWFzdGVyLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpjb21hcGkuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camNwYXJhbS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqY3BodWZmLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpjcHJlcGN0LmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpjc2FtcGxlLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpjdHJhbnMuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camRhcGltaW4uYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camRhcGlzdGQuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camRhdGFkc3QuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camRhdGFzcmMuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camRjb2VmY3QuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camRjb2xvci5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqZGRjdG1nci5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqZGh1ZmYuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camRpbnB1dC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqZG1haW5jdC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqZG1hcmtlci5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqZG1hc3Rlci5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqZG1lcmdlLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpkcGh1ZmYuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camRwb3N0Y3QuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camRzYW1wbGUuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camR0cmFucy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqZXJyb3IuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cam1lbW1nci5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqbWVtbm9icy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqcXVhbnQxLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpxdWFudDIuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5canV0aWxzLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpjaHVmZi5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqY29sc2FtcC5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqY29uZmlnLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpkY3QuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camRodWZmLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGplcnJvci5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqaW5jbHVkZS5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqbWVtc3lzLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGptb3JlY2ZnLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpwZWdpbnQuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5canBlZ2xpYi5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqdmVyc2lvbi5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIk5BU00gU291cmNlIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImFzbSIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camNjb2xtbXguYXNtCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KQ0NPTD0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpjb2xzYW1wLmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXFJlbGVhc2UKLUlucHV0UGF0aD0uXGpjY29sbW14LmFzbQotSW5wdXROYW1lPWpjY29sbW14Ci0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkNDT0w9IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqY29sc2FtcC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5camNjb2xtbXguYXNtCi1JbnB1dE5hbWU9amNjb2xtbXgKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpjY29sc3MyLmFzbQotCi0hSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkNDT0xTPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamNvbHNhbXAuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cUmVsZWFzZQotSW5wdXRQYXRoPS5camNjb2xzczIuYXNtCi1JbnB1dE5hbWU9amNjb2xzczIKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KQ0NPTFM9IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqY29sc2FtcC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5camNjb2xzczIuYXNtCi1JbnB1dE5hbWU9amNjb2xzczIKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpjcW50M2RuLmFzbQotCi0hSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkNRTlQ9IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqZGN0LmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXFJlbGVhc2UKLUlucHV0UGF0aD0uXGpjcW50M2RuLmFzbQotSW5wdXROYW1lPWpjcW50M2RuCi0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkNRTlQ9IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqZGN0LmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXERlYnVnCi1JbnB1dFBhdGg9LlxqY3FudDNkbi5hc20KLUlucHV0TmFtZT1qY3FudDNkbgotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camNxbnRmbHQuYXNtCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KQ1FOVEY9IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqZGN0LmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXFJlbGVhc2UKLUlucHV0UGF0aD0uXGpjcW50Zmx0LmFzbQotSW5wdXROYW1lPWpjcW50Zmx0Ci0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkNRTlRGPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5camNxbnRmbHQuYXNtCi1JbnB1dE5hbWU9amNxbnRmbHQKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpjcW50aW50LmFzbQotCi0hSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkNRTlRJPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9LlxqY3FudGludC5hc20KLUlucHV0TmFtZT1qY3FudGludAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pDUU5UST0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpkY3QuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cRGVidWcKLUlucHV0UGF0aD0uXGpjcW50aW50LmFzbQotSW5wdXROYW1lPWpjcW50aW50Ci0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqY3FudG1teC5hc20KLQotIUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pDUU5UTT0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpkY3QuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cUmVsZWFzZQotSW5wdXRQYXRoPS5camNxbnRtbXguYXNtCi1JbnB1dE5hbWU9amNxbnRtbXgKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KQ1FOVE09IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqZGN0LmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXERlYnVnCi1JbnB1dFBhdGg9LlxqY3FudG1teC5hc20KLUlucHV0TmFtZT1qY3FudG1teAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camNxbnRzMmYuYXNtCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KQ1FOVFM9IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqZGN0LmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXFJlbGVhc2UKLUlucHV0UGF0aD0uXGpjcW50czJmLmFzbQotSW5wdXROYW1lPWpjcW50czJmCi0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkNRTlRTPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5camNxbnRzMmYuYXNtCi1JbnB1dE5hbWU9amNxbnRzMmYKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpjcW50czJpLmFzbQotCi0hSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkNRTlRTMj0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpkY3QuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cUmVsZWFzZQotSW5wdXRQYXRoPS5camNxbnRzMmkuYXNtCi1JbnB1dE5hbWU9amNxbnRzMmkKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KQ1FOVFMyPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5camNxbnRzMmkuYXNtCi1JbnB1dE5hbWU9amNxbnRzMmkKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpjcW50c3NlLmFzbQotCi0hSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkNRTlRTUz0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpkY3QuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cUmVsZWFzZQotSW5wdXRQYXRoPS5camNxbnRzc2UuYXNtCi1JbnB1dE5hbWU9amNxbnRzc2UKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KQ1FOVFNTPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5camNxbnRzc2UuYXNtCi1JbnB1dE5hbWU9amNxbnRzc2UKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpjc2FtbW14LmFzbQotCi0hSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkNTQU09IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqY29sc2FtcC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9LlxqY3NhbW1teC5hc20KLUlucHV0TmFtZT1qY3NhbW1teAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pDU0FNPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamNvbHNhbXAuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cRGVidWcKLUlucHV0UGF0aD0uXGpjc2FtbW14LmFzbQotSW5wdXROYW1lPWpjc2FtbW14Ci0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqY3NhbXNzMi5hc20KLQotIUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pDU0FNUz0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpjb2xzYW1wLmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXFJlbGVhc2UKLUlucHV0UGF0aD0uXGpjc2Ftc3MyLmFzbQotSW5wdXROYW1lPWpjc2Ftc3MyCi0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkNTQU1TPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamNvbHNhbXAuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cRGVidWcKLUlucHV0UGF0aD0uXGpjc2Ftc3MyLmFzbQotSW5wdXROYW1lPWpjc2Ftc3MyCi0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqZGNvbG1teC5hc20KLQotIUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pEQ09MPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamNvbHNhbXAuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cUmVsZWFzZQotSW5wdXRQYXRoPS5camRjb2xtbXguYXNtCi1JbnB1dE5hbWU9amRjb2xtbXgKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KRENPTD0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpjb2xzYW1wLmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXERlYnVnCi1JbnB1dFBhdGg9LlxqZGNvbG1teC5hc20KLUlucHV0TmFtZT1qZGNvbG1teAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camRjb2xzczIuYXNtCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KRENPTFM9IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqY29sc2FtcC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9LlxqZGNvbHNzMi5hc20KLUlucHV0TmFtZT1qZGNvbHNzMgotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pEQ09MUz0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpjb2xzYW1wLmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXERlYnVnCi1JbnB1dFBhdGg9LlxqZGNvbHNzMi5hc20KLUlucHV0TmFtZT1qZGNvbHNzMgotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camRtZXJtbXguYXNtCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KRE1FUj0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpjb2xzYW1wLmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXFJlbGVhc2UKLUlucHV0UGF0aD0uXGpkbWVybW14LmFzbQotSW5wdXROYW1lPWpkbWVybW14Ci0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkRNRVI9IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqY29sc2FtcC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5camRtZXJtbXguYXNtCi1JbnB1dE5hbWU9amRtZXJtbXgKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpkbWVyc3MyLmFzbQotCi0hSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkRNRVJTPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamNvbHNhbXAuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cUmVsZWFzZQotSW5wdXRQYXRoPS5camRtZXJzczIuYXNtCi1JbnB1dE5hbWU9amRtZXJzczIKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KRE1FUlM9IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqY29sc2FtcC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5camRtZXJzczIuYXNtCi1JbnB1dE5hbWU9amRtZXJzczIKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpkc2FtbW14LmFzbQotCi0hSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkRTQU09IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqY29sc2FtcC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9LlxqZHNhbW1teC5hc20KLUlucHV0TmFtZT1qZHNhbW1teAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pEU0FNPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamNvbHNhbXAuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cRGVidWcKLUlucHV0UGF0aD0uXGpkc2FtbW14LmFzbQotSW5wdXROYW1lPWpkc2FtbW14Ci0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqZHNhbXNzMi5hc20KLQotIUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pEU0FNUz0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpjb2xzYW1wLmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXFJlbGVhc2UKLUlucHV0UGF0aD0uXGpkc2Ftc3MyLmFzbQotSW5wdXROYW1lPWpkc2Ftc3MyCi0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkRTQU1TPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamNvbHNhbXAuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cRGVidWcKLUlucHV0UGF0aD0uXGpkc2Ftc3MyLmFzbQotSW5wdXROYW1lPWpkc2Ftc3MyCi0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqZjNkbmZsdC5hc20KLQotIUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pGM0ROPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9LlxqZjNkbmZsdC5hc20KLUlucHV0TmFtZT1qZjNkbmZsdAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pGM0ROPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5camYzZG5mbHQuYXNtCi1JbnB1dE5hbWU9amYzZG5mbHQKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpmZGN0Zmx0LmFzbQotCi0hSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkZEQ1Q9IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqZGN0LmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXFJlbGVhc2UKLUlucHV0UGF0aD0uXGpmZGN0Zmx0LmFzbQotSW5wdXROYW1lPWpmZGN0Zmx0Ci0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkZEQ1Q9IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqZGN0LmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXERlYnVnCi1JbnB1dFBhdGg9LlxqZmRjdGZsdC5hc20KLUlucHV0TmFtZT1qZmRjdGZsdAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camZkY3Rmc3QuYXNtCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KRkRDVEY9IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqZGN0LmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXFJlbGVhc2UKLUlucHV0UGF0aD0uXGpmZGN0ZnN0LmFzbQotSW5wdXROYW1lPWpmZGN0ZnN0Ci0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkZEQ1RGPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5camZkY3Rmc3QuYXNtCi1JbnB1dE5hbWU9amZkY3Rmc3QKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpmZGN0aW50LmFzbQotCi0hSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkZEQ1RJPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9LlxqZmRjdGludC5hc20KLUlucHV0TmFtZT1qZmRjdGludAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pGRENUST0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpkY3QuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cRGVidWcKLUlucHV0UGF0aD0uXGpmZGN0aW50LmFzbQotSW5wdXROYW1lPWpmZGN0aW50Ci0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqZm1teGZzdC5hc20KLQotIUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pGTU1YPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9LlxqZm1teGZzdC5hc20KLUlucHV0TmFtZT1qZm1teGZzdAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pGTU1YPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5camZtbXhmc3QuYXNtCi1JbnB1dE5hbWU9amZtbXhmc3QKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpmbW14aW50LmFzbQotCi0hSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkZNTVhJPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9LlxqZm1teGludC5hc20KLUlucHV0TmFtZT1qZm1teGludAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pGTU1YST0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpkY3QuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cRGVidWcKLUlucHV0UGF0aD0uXGpmbW14aW50LmFzbQotSW5wdXROYW1lPWpmbW14aW50Ci0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqZnNzMmZzdC5hc20KLQotIUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pGU1MyPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9LlxqZnNzMmZzdC5hc20KLUlucHV0TmFtZT1qZnNzMmZzdAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pGU1MyPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5camZzczJmc3QuYXNtCi1JbnB1dE5hbWU9amZzczJmc3QKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpmc3MyaW50LmFzbQotCi0hSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkZTUzJJPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9LlxqZnNzMmludC5hc20KLUlucHV0TmFtZT1qZnNzMmludAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pGU1MyST0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpkY3QuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cRGVidWcKLUlucHV0UGF0aD0uXGpmc3MyaW50LmFzbQotSW5wdXROYW1lPWpmc3MyaW50Ci0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqZnNzZWZsdC5hc20KLQotIUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pGU1NFPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9LlxqZnNzZWZsdC5hc20KLUlucHV0TmFtZT1qZnNzZWZsdAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pGU1NFPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5camZzc2VmbHQuYXNtCi1JbnB1dE5hbWU9amZzc2VmbHQKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGppM2RuZmx0LmFzbQotCi0hSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkkzRE49IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqZGN0LmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXFJlbGVhc2UKLUlucHV0UGF0aD0uXGppM2RuZmx0LmFzbQotSW5wdXROYW1lPWppM2RuZmx0Ci0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSkkzRE49IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqZGN0LmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXERlYnVnCi1JbnB1dFBhdGg9LlxqaTNkbmZsdC5hc20KLUlucHV0TmFtZT1qaTNkbmZsdAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camlkY3RmbHQuYXNtCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KSURDVD0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpkY3QuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cUmVsZWFzZQotSW5wdXRQYXRoPS5camlkY3RmbHQuYXNtCi1JbnB1dE5hbWU9amlkY3RmbHQKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KSURDVD0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpkY3QuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cRGVidWcKLUlucHV0UGF0aD0uXGppZGN0Zmx0LmFzbQotSW5wdXROYW1lPWppZGN0Zmx0Ci0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqaWRjdGZzdC5hc20KLQotIUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pJRENURj0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpkY3QuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cUmVsZWFzZQotSW5wdXRQYXRoPS5camlkY3Rmc3QuYXNtCi1JbnB1dE5hbWU9amlkY3Rmc3QKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KSURDVEY9IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqZGN0LmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXERlYnVnCi1JbnB1dFBhdGg9LlxqaWRjdGZzdC5hc20KLUlucHV0TmFtZT1qaWRjdGZzdAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camlkY3RpbnQuYXNtCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KSURDVEk9IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqZGN0LmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXFJlbGVhc2UKLUlucHV0UGF0aD0uXGppZGN0aW50LmFzbQotSW5wdXROYW1lPWppZGN0aW50Ci0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSklEQ1RJPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5camlkY3RpbnQuYXNtCi1JbnB1dE5hbWU9amlkY3RpbnQKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGppZGN0cmVkLmFzbQotCi0hSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSklEQ1RSPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9LlxqaWRjdHJlZC5hc20KLUlucHV0TmFtZT1qaWRjdHJlZAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pJRENUUj0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpkY3QuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cRGVidWcKLUlucHV0UGF0aD0uXGppZGN0cmVkLmFzbQotSW5wdXROYW1lPWppZGN0cmVkCi0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqaW1teGZzdC5hc20KLQotIUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pJTU1YPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9LlxqaW1teGZzdC5hc20KLUlucHV0TmFtZT1qaW1teGZzdAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pJTU1YPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5camltbXhmc3QuYXNtCi1JbnB1dE5hbWU9amltbXhmc3QKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGppbW14aW50LmFzbQotCi0hSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSklNTVhJPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9LlxqaW1teGludC5hc20KLUlucHV0TmFtZT1qaW1teGludAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pJTU1YST0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpkY3QuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cRGVidWcKLUlucHV0UGF0aD0uXGppbW14aW50LmFzbQotSW5wdXROYW1lPWppbW14aW50Ci0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqaW1teHJlZC5hc20KLQotIUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pJTU1YUj0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpkY3QuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cUmVsZWFzZQotSW5wdXRQYXRoPS5camltbXhyZWQuYXNtCi1JbnB1dE5hbWU9amltbXhyZWQKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KSU1NWFI9IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqZGN0LmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXERlYnVnCi1JbnB1dFBhdGg9LlxqaW1teHJlZC5hc20KLUlucHV0TmFtZT1qaW1teHJlZAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camlzczJmbHQuYXNtCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KSVNTMj0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpkY3QuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cUmVsZWFzZQotSW5wdXRQYXRoPS5camlzczJmbHQuYXNtCi1JbnB1dE5hbWU9amlzczJmbHQKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KSVNTMj0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpkY3QuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cRGVidWcKLUlucHV0UGF0aD0uXGppc3MyZmx0LmFzbQotSW5wdXROYW1lPWppc3MyZmx0Ci0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqaXNzMmZzdC5hc20KLQotIUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pJU1MyRj0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpkY3QuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cUmVsZWFzZQotSW5wdXRQYXRoPS5camlzczJmc3QuYXNtCi1JbnB1dE5hbWU9amlzczJmc3QKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KSVNTMkY9IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqZGN0LmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXERlYnVnCi1JbnB1dFBhdGg9LlxqaXNzMmZzdC5hc20KLUlucHV0TmFtZT1qaXNzMmZzdAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camlzczJpbnQuYXNtCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi1VU0VSREVQX19KSVNTMkk9IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCSJqZGN0LmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXFJlbGVhc2UKLUlucHV0UGF0aD0uXGppc3MyaW50LmFzbQotSW5wdXROYW1lPWppc3MyaW50Ci0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSklTUzJJPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5camlzczJpbnQuYXNtCi1JbnB1dE5hbWU9amlzczJpbnQKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGppc3MycmVkLmFzbQotCi0hSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSklTUzJSPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9LlxqaXNzMnJlZC5hc20KLUlucHV0TmFtZT1qaXNzMnJlZAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pJU1MyUj0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJImpkY3QuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cRGVidWcKLUlucHV0UGF0aD0uXGppc3MycmVkLmFzbQotSW5wdXROYW1lPWppc3MycmVkCi0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqaXNzZWZsdC5hc20KLQotIUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pJU1NFPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9LlxqaXNzZWZsdC5hc20KLUlucHV0TmFtZT1qaXNzZWZsdAotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pJU1NFPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkiamRjdC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5camlzc2VmbHQuYXNtCi1JbnB1dE5hbWU9amlzc2VmbHQKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW5hc213IC1YdmMgLWZ3aW4zMiAtRFdJTjMyIC1JICQoSW50RGlyKVwgLW8gJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmogJChJbnB1dFBhdGgpCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpzaW1kY3B1LmFzbQotCi0hSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSlNJTUQ9IiQoSW50RGlyKVxqc2ltZGNmZy5pbmMiCSJqc2ltZGV4dC5pbmMiCQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nIC0gJChJbnB1dFBhdGgpCi1JbnREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9Llxqc2ltZGNwdS5hc20KLUlucHV0TmFtZT1qc2ltZGNwdQotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbmFzbXcgLVh2YyAtZndpbjMyIC1EV0lOMzIgLUkgJChJbnREaXIpXCAtbyAkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiAkKElucHV0UGF0aCkKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJqcGVnIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pTSU1EPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cRGVidWcKLUlucHV0UGF0aD0uXGpzaW1kY3B1LmFzbQotSW5wdXROYW1lPWpzaW1kY3B1Ci0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxqc2ltZHczMi5hc20KLQotIUlGICAiJChDRkcpIiA9PSAibGlianBlZyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLVVTRVJERVBfX0pTSU1EVz0iJChJbnREaXIpXGpzaW1kY2ZnLmluYyIJImpzaW1kZXh0LmluYyIJCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgLSAkKElucHV0UGF0aCkKLUludERpcj0uXFJlbGVhc2UKLUlucHV0UGF0aD0uXGpzaW1kdzMyLmFzbQotSW5wdXROYW1lPWpzaW1kdzMyCi0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYmpwZWcgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotVVNFUkRFUF9fSlNJTURXPSIkKEludERpcilcanNpbWRjZmcuaW5jIgkianNpbWRleHQuaW5jIgkKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAtICQoSW5wdXRQYXRoKQotSW50RGlyPS5cRGVidWcKLUlucHV0UGF0aD0uXGpzaW1kdzMyLmFzbQotSW5wdXROYW1lPWpzaW1kdzMyCi0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQluYXNtdyAtWHZjIC1md2luMzIgLURXSU4zMiAtSSAkKEludERpcilcIC1vICQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqICQoSW5wdXRQYXRoKQotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIk5BU00gSGVhZGVyIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImluYyIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camNvbHNhbXAuaW5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqZGN0LmluYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5canNpbWRleHQuaW5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvdmM2cHJvai9saWJqcGVnLmRzdyBiL3ZjNnByb2ovbGlianBlZy5kc3cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhY2UxNTMuLjAwMDAwMDAKLS0tIGEvdmM2cHJvai9saWJqcGVnLmRzdworKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi1NaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBXb3Jrc3BhY2UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyC32bnwOiCks6TOjtyOsI64jr2OzY7fjrCOvSCOzI6njrKO2SCk8srUvbik3qS/pM+67738pLekyqSkpMekr6TApLWkpCEKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Qcm9qZWN0OiAiYXBwdGVzdCI9Ii5cYXBwdGVzdC5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4KLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDQ+Ci17e3sKLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBQcm9qZWN0X0RlcF9OYW1lIGNqcGVnCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgZGpwZWcKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgUHJvamVjdF9EZXBfTmFtZSBqcGVndHJhbgotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVByb2plY3Q6ICJjanBlZyI9Ii5cY2pwZWcuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0KLVBhY2thZ2U9PDU+Ci17e3sKLX19fQotCi1QYWNrYWdlPTw0Pgote3t7Ci0gICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgUHJvamVjdF9EZXBfTmFtZSBsaWJqcGVnCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotfX19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotUHJvamVjdDogImRqcGVnIj0iLlxkanBlZy5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4KLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDQ+Ci17e3sKLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBQcm9qZWN0X0RlcF9OYW1lIGxpYmpwZWcKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci19fX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Qcm9qZWN0OiAianBlZ3RyYW4iPSIuXGpwZWd0cmFuLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgotCi1QYWNrYWdlPTw1Pgote3t7Ci19fX0KLQotUGFja2FnZT08ND4KLXt7ewotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgbGlianBlZwotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVByb2plY3Q6ICJsaWJqcGVnIj0iLlxsaWJqcGVnLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgotCi1QYWNrYWdlPTw1Pgote3t7Ci19fX0KLQotUGFja2FnZT08ND4KLXt7ewotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgbWFrZWNmZwotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVByb2plY3Q6ICJtYWtlY2ZnIj0iLlxtYWtlY2ZnLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgotCi1QYWNrYWdlPTw1Pgote3t7Ci19fX0KLQotUGFja2FnZT08ND4KLXt7ewotfX19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotUHJvamVjdDogInJkanBnY29tIj0iLlxyZGpwZ2NvbS5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4KLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDQ+Ci17e3sKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVByb2plY3Q6ICJ3cmpwZ2NvbSI9Ii5cd3JqcGdjb20uZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0KLVBhY2thZ2U9PDU+Ci17e3sKLX19fQotCi1QYWNrYWdlPTw0Pgote3t7Ci19fX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1HbG9iYWw6Ci0KLVBhY2thZ2U9PDU+Ci17e3sKLX19fQotCi1QYWNrYWdlPTwzPgote3t7Ci19fX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCmRpZmYgLS1naXQgYS92YzZwcm9qL21ha2VjZmcuZHNwIGIvdmM2cHJvai9tYWtlY2ZnLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlOTE0YS4uMDAwMDAwMAotLS0gYS92YzZwcm9qL21ha2VjZmcuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibWFrZWNmZyIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiDK1L24pLekyqSkpMekr6TApLWkpCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMKLQotQ0ZHPW1ha2VjZmcgLSBXaW4zMiBEZWJ1ZwotIU1FU1NBR0UgpLOk7KTPza24+qTKjtKOso64jsyOp46yjtmkx6TPpKKk6qTepLuk86GjIKSzpM6OzI7fjtuOvI7ejqqOuI7EpPKOy47ejtmOxI7epLmk66S/pOGky6TPIE5NQUtFIKTyu8jN0aS3pMakr6TApLWkpKGjCi0hTUVTU0FHRSBbjtKOso64jsyOp46yjtmkzo60jriOvY7Ojt+OsI7EXSCOuo7Pjt2OxI7epPK7yM3RpLekxrzCudSkt6TGpK+kwKS1pKQKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1ha2VjZmcubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgpM68wrnUu/6ky7m9wK6k8rvYxOqkx6StpN6kuQotIU1FU1NBR0UgjrqOz47djsSO3iCO146yjt2+5aTHjs+OuI7bpM7A38TqpPLE6rXBpLek3qS5oaPO4zoKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1ha2VjZmcubWFrIiBDRkc9Im1ha2VjZmcgLSBXaW4zMiBEZWJ1ZyIKLSFNRVNTQUdFIAotIU1FU1NBR0UgwarC8rLEx72kyo7Ljt6O2Y7Ejt4gjtOOsI7Ejt46Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJtYWtlY2ZnIC0gV2luMzIgUmVsZWFzZSIgKCJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiDN0SkKLSFNRVNTQUdFICJtYWtlY2ZnIC0gV2luMzIgRGVidWciICgiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgzdEpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAibWFrZWNmZyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvTzIgL0dGIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIFJTQyAvbCAweDQxMSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDExIC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2IC9vcHQ6bm93aW45OAotIyBTVUJUUkFDVCBMSU5LMzIgL3BkYjpub25lCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEdlbmVyYXRpbmcgLSAkKE91dERpcilcanNpbWRjZmcuaW5jCi1PdXREaXI9LlxSZWxlYXNlCi1JbnB1dFBhdGg9LlxSZWxlYXNlXG1ha2VjZmcuZXhlCi1TT1VSQ0U9IiQoSW5wdXRQYXRoKSIKLQotIiQoT3V0RGlyKVxqc2ltZGNmZy5pbmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JJChUYXJnZXRQYXRoKSA+ICQoT3V0RGlyKVxqc2ltZGNmZy5pbmMKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJtYWtlY2ZnIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvRkQgL0daIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvVzMgL0dtIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvRkQgL0daIC9jCi0jIEFERCBCQVNFIFJTQyAvbCAweDQxMSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDExIC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQUREIExJTkszMiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0IC9vcHQ6bm93aW45OAotIyBTVUJUUkFDVCBMSU5LMzIgL3BkYjpub25lCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEdlbmVyYXRpbmcgLSAkKE91dERpcilcanNpbWRjZmcuaW5jCi1PdXREaXI9LlxEZWJ1ZwotSW5wdXRQYXRoPS5cRGVidWdcbWFrZWNmZy5leGUKLVNPVVJDRT0iJChJbnB1dFBhdGgpIgotCi0iJChPdXREaXIpXGpzaW1kY2ZnLmluYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQkkKFRhcmdldFBhdGgpID4gJChPdXREaXIpXGpzaW1kY2ZnLmluYwotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIm1ha2VjZmcgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJtYWtlY2ZnIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbWFrZWNmZy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqY29uZmlnLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGplcnJvci5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqaW5jbHVkZS5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqbW9yZWNmZy5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqcGVnaW50LmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpwZWdsaWIuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL3ZjNnByb2ovcmRqcGdjb20uZHNwIGIvdmM2cHJvai9yZGpwZ2NvbS5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNWVkYTIuLjAwMDAwMDAKLS0tIGEvdmM2cHJvai9yZGpwZ2NvbS5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJyZGpwZ2NvbSIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiDK1L24pLekyqSkpMekr6TApLWkpCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMKLQotQ0ZHPXJkanBnY29tIC0gV2luMzIgRGVidWcKLSFNRVNTQUdFIKSzpOykz82tuPqkyo7SjrKOuI7MjqeOso7ZpMekz6SipOqk3qS7pPOhoyCks6TOjsyO347bjryO3o6qjriOxKTyjsuO3o7ZjsSO3qS5pOukv6ThpMukzyBOTUFLRSCk8rvIzdGkt6TGpK+kwKS1pKShowotIU1FU1NBR0UgW47SjrKOuI7MjqeOso7ZpM6OtI64jr2Ozo7fjrCOxF0gjrqOz47djsSO3qTyu8jN0aS3pMa8wrnUpLekxqSvpMCktaSkCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJyZGpwZ2NvbS5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSCkzrzCudS7/qTLub3ArqTyu9jE6qTHpK2k3qS5Ci0hTUVTU0FHRSCOuo7Pjt2OxI7eII7XjrKO3b7lpMeOz464jtukzsDfxOqk8sTqtcGkt6TepLmho87jOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAicmRqcGdjb20ubWFrIiBDRkc9InJkanBnY29tIC0gV2luMzIgRGVidWciCi0hTUVTU0FHRSAKLSFNRVNTQUdFIMGqwvKyxMe9pMqOy47ejtmOxI7eII7TjrCOxI7eOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAicmRqcGdjb20gLSBXaW4zMiBSZWxlYXNlIiAoIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIM3RKQotIU1FU1NBR0UgInJkanBnY29tIC0gV2luMzIgRGVidWciICgiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgzdEpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAicmRqcGdjb20gLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvVzMgL08yIC9HRiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBSU0MgL2wgMHg0MTEgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQxMSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYgL29wdDpub3dpbjk4Ci0jIFNVQlRSQUNUIExJTkszMiAvcGRiOm5vbmUKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInJkanBnY29tIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvRkQgL0daIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvVzMgL0dtIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvRkQgL0daIC9jCi0jIEFERCBCQVNFIFJTQyAvbCAweDQxMSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDExIC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdCAvb3B0Om5vd2luOTgKLSMgU1VCVFJBQ1QgTElOSzMyIC9wZGI6bm9uZQotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAicmRqcGdjb20gLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJyZGpwZ2NvbSAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHJkanBnY29tLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGpjb25maWcuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5camluY2x1ZGUuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiCi0jIEVuZCBHcm91cAotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS92YzZwcm9qL3dyanBnY29tLmRzcCBiL3ZjNnByb2ovd3JqcGdjb20uZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmRmOWVjLi4wMDAwMDAwCi0tLSBhL3ZjNnByb2ovd3JqcGdjb20uZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0id3JqcGdjb20iIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKLSMgKiogytS9uKS3pMqkpKTHpK+kwKS1pKQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzCi0KLUNGRz13cmpwZ2NvbSAtIFdpbjMyIERlYnVnCi0hTUVTU0FHRSCks6TspM/Nrbj6pMqO0o6yjriOzI6njrKO2aTHpM+koqTqpN6ku6TzoaMgpLOkzo7Mjt+O2468jt6Oqo64jsSk8o7Ljt6O2Y7Ejt6kuaTrpL+k4aTLpM8gTk1BS0UgpPK7yM3RpLekxqSvpMCktaSkoaMKLSFNRVNTQUdFIFuO0o6yjriOzI6njrKO2aTOjrSOuI69js6O346wjsRdII66js+O3Y7Ejt6k8rvIzdGkt6TGvMK51KS3pMakr6TApLWkpAotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAid3JqcGdjb20ubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgpM68wrnUu/6ky7m9wK6k8rvYxOqkx6StpN6kuQotIU1FU1NBR0UgjrqOz47djsSO3iCO146yjt2+5aTHjs+OuI7bpM7A38TqpPLE6rXBpLek3qS5oaPO4zoKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIndyanBnY29tLm1hayIgQ0ZHPSJ3cmpwZ2NvbSAtIFdpbjMyIERlYnVnIgotIU1FU1NBR0UgCi0hTUVTU0FHRSDBqsLyssTHvaTKjsuO3o7ZjsSO3iCO046wjsSO3joKLSFNRVNTQUdFIAotIU1FU1NBR0UgIndyanBnY29tIC0gV2luMzIgUmVsZWFzZSIgKCJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiDN0SkKLSFNRVNTQUdFICJ3cmpwZ2NvbSAtIFdpbjMyIERlYnVnIiAoIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIM3RKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIndyanBnY29tIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9PMiAvR0YgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDExIC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MTEgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2IC9vcHQ6bm93aW45OAotIyBTVUJUUkFDVCBMSU5LMzIgL3BkYjpub25lCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ3cmpwZ2NvbSAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL0ZEIC9HWiAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HbSAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL0ZEIC9HWiAvYwotIyBBREQgQkFTRSBSU0MgL2wgMHg0MTEgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQxMSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0Ci0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQgL29wdDpub3dpbjk4Ci0jIFNVQlRSQUNUIExJTkszMiAvcGRiOm5vbmUKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIndyanBnY29tIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAid3JqcGdjb20gLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0IgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llx3cmpwZ2NvbS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxqY29uZmlnLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGppbmNsdWRlLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIgotIyBFbmQgR3JvdXAKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvamNvbmZpZy52YyBiL3dpbi9qY29uZmlnLmgKc2ltaWxhcml0eSBpbmRleCA4MyUKcmVuYW1lIGZyb20gamNvbmZpZy52YwpyZW5hbWUgdG8gd2luL2pjb25maWcuaAppbmRleCBkNWJjOWY5Li43OTg3YmE2IDEwMDY0NAotLS0gYS9qY29uZmlnLnZjCisrKyBiL3dpbi9qY29uZmlnLmgKQEAgLTE2LDcgKzE2LDEyIEBACiAjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KIAogLyogRGVmaW5lICJib29sZWFuIiBhcyB1bnNpZ25lZCBjaGFyLCBub3QgaW50LCBwZXIgV2luZG93cyBjdXN0b20gKi8KLSNkZWZpbmUgVFlQRURFRl9VQ0hBUl9CT09MRUFOCisjaWZuZGVmIF9fUlBDTkRSX0hfXwkJLyogZG9uJ3QgY29uZmxpY3QgaWYgcnBjbmRyLmggYWxyZWFkeSByZWFkICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgYm9vbGVhbjsKKyNlbmRpZgorI2RlZmluZSBIQVZFX0JPT0xFQU4JCS8qIHByZXZlbnQgam1vcmVjZmcuaCBmcm9tIHJlZGVmaW5pbmcgaXQgKi8KKworI2RlZmluZSBpbmxpbmUgX19pbmxpbmUKIAogI2lmZGVmIEpQRUdfSU5URVJOQUxTCiAKQEAgLTI0LDEzICsyOSw2IEBACiAKICNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLwogCi0jaWYgZGVmaW5lZChKUEVHX0lOVEVSTkFMUykgfHwgZGVmaW5lZChKUEVHX0lOVEVSTkFMX09QVElPTlMpCi0jdW5kZWYgSlNJTURfTU1YX05PVF9TVVBQT1JURUQKLSN1bmRlZiBKU0lNRF8zRE5PV19OT1RfU1VQUE9SVEVECi0jdW5kZWYgSlNJTURfU1NFX05PVF9TVVBQT1JURUQKLSN1bmRlZiBKU0lNRF9TU0UyX05PVF9TVVBQT1JURUQKLSNlbmRpZgotCiAjaWZkZWYgSlBFR19DSlBFR19ESlBFRwogCiAjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLwpkaWZmIC0tZ2l0IGEvd2l6YXJkLmRvYyBiL3dpemFyZC5kb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MTcwYjIuLjAwMDAwMDAKLS0tIGEvd2l6YXJkLmRvYworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi1BZHZhbmNlZCB1c2FnZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFRyBzb2Z0d2FyZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBmaWxlIGRlc2NyaWJlcyBjanBlZydzICJzd2l0Y2hlcyBmb3Igd2l6YXJkcyIuCi0KLVRoZSAid2l6YXJkIiBzd2l0Y2hlcyBhcmUgaW50ZW5kZWQgZm9yIGV4cGVyaW1lbnRhdGlvbiB3aXRoIEpQRUcgYnkgcGVyc29ucwotd2hvIGFyZSByZWFzb25hYmx5IGtub3dsZWRnZWFibGUgYWJvdXQgdGhlIEpQRUcgc3RhbmRhcmQuICBJZiB5b3UgZG9uJ3Qga25vdwotd2hhdCB5b3UgYXJlIGRvaW5nLCBET04nVCBVU0UgVEhFU0UgU1dJVENIRVMuICBZb3UnbGwgbGlrZWx5IHByb2R1Y2UgZmlsZXMKLXdpdGggd29yc2UgaW1hZ2UgcXVhbGl0eSBhbmQvb3IgcG9vcmVyIGNvbXByZXNzaW9uIHRoYW4geW91J2QgZ2V0IGZyb20gdGhlCi1kZWZhdWx0IHNldHRpbmdzLiAgRnVydGhlcm1vcmUsIHRoZXNlIHN3aXRjaGVzIG11c3QgYmUgdXNlZCB3aXRoIGNhdXRpb24KLXdoZW4gbWFraW5nIGZpbGVzIGludGVuZGVkIGZvciBnZW5lcmFsIHVzZSwgYmVjYXVzZSBub3QgYWxsIEpQRUcgZGVjb2RlcnMKLXdpbGwgc3VwcG9ydCB1bnVzdWFsIEpQRUcgcGFyYW1ldGVyIHNldHRpbmdzLgotCi0KLVF1YW50aXphdGlvbiBUYWJsZSBBZGp1c3RtZW50Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1PcmRpbmFyaWx5LCBjanBlZyBzdGFydHMgd2l0aCBhIGRlZmF1bHQgc2V0IG9mIHRhYmxlcyAodGhlIHNhbWUgb25lcyBnaXZlbgotYXMgZXhhbXBsZXMgaW4gdGhlIEpQRUcgc3RhbmRhcmQpIGFuZCBzY2FsZXMgdGhlbSB1cCBvciBkb3duIGFjY29yZGluZyB0bwotdGhlIC1xdWFsaXR5IHNldHRpbmcuICBUaGUgZGV0YWlscyBvZiB0aGUgc2NhbGluZyBhbGdvcml0aG0gY2FuIGJlIGZvdW5kIGluCi1qY3BhcmFtLmMuICBBdCB2ZXJ5IGxvdyBxdWFsaXR5IHNldHRpbmdzLCBzb21lIHF1YW50aXphdGlvbiB0YWJsZSBlbnRyaWVzCi1jYW4gZ2V0IHNjYWxlZCB1cCB0byB2YWx1ZXMgZXhjZWVkaW5nIDI1NS4gIEFsdGhvdWdoIDItYnl0ZSBxdWFudGl6YXRpb24KLXZhbHVlcyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBJSkcgc29mdHdhcmUsIHRoaXMgZmVhdHVyZSBpcyBub3QgaW4gYmFzZWxpbmUKLUpQRUcgYW5kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucy4gIElmIHlvdSBuZWVkIHRvIGVuc3VyZQotd2lkZSBjb21wYXRpYmlsaXR5IG9mIGxvdy1xdWFsaXR5IGZpbGVzLCB5b3UgY2FuIGNvbnN0cmFpbiB0aGUgc2NhbGVkCi1xdWFudGl6YXRpb24gdmFsdWVzIHRvIG5vIG1vcmUgdGhhbiAyNTUgYnkgZ2l2aW5nIHRoZSAtYmFzZWxpbmUgc3dpdGNoLgotTm90ZSB0aGF0IHVzZSBvZiAtYmFzZWxpbmUgd2lsbCByZXN1bHQgaW4gcG9vcmVyIHF1YWxpdHkgZm9yIHRoZSBzYW1lIGZpbGUKLXNpemUsIHNpbmNlIG1vcmUgYml0cyB0aGFuIG5lY2Vzc2FyeSBhcmUgZXhwZW5kZWQgb24gaGlnaGVyIEFDIGNvZWZmaWNpZW50cy4KLQotWW91IGNhbiBzdWJzdGl0dXRlIGEgZGlmZmVyZW50IHNldCBvZiBxdWFudGl6YXRpb24gdmFsdWVzIGJ5IHVzaW5nIHRoZQotLXF0YWJsZXMgc3dpdGNoOgotCi0JLXF0YWJsZXMgZmlsZQlVc2UgdGhlIHF1YW50aXphdGlvbiB0YWJsZXMgZ2l2ZW4gaW4gdGhlIG5hbWVkIGZpbGUuCi0KLVRoZSBzcGVjaWZpZWQgZmlsZSBzaG91bGQgYmUgYSB0ZXh0IGZpbGUgY29udGFpbmluZyBkZWNpbWFsIHF1YW50aXphdGlvbgotdmFsdWVzLiAgVGhlIGZpbGUgc2hvdWxkIGNvbnRhaW4gb25lIHRvIGZvdXIgdGFibGVzLCBlYWNoIG9mIDY0IGVsZW1lbnRzLgotVGhlIHRhYmxlcyBhcmUgaW1wbGljaXRseSBudW1iZXJlZCAwLDEsZXRjLiBpbiBvcmRlciBvZiBhcHBlYXJhbmNlLiAgVGFibGUKLWVudHJpZXMgYXBwZWFyIGluIG5vcm1hbCBhcnJheSBvcmRlciAoTk9UIGluIHRoZSB6aWd6YWcgb3JkZXIgaW4gd2hpY2ggdGhleQotd2lsbCBiZSBzdG9yZWQgaW4gdGhlIEpQRUcgZmlsZSkuCi0KLVF1YW50aXphdGlvbiB0YWJsZSBmaWxlcyBhcmUgZnJlZSBmb3JtYXQsIGluIHRoYXQgYXJiaXRyYXJ5IHdoaXRlc3BhY2UgY2FuCi1hcHBlYXIgYmV0d2VlbiBudW1iZXJzLiAgQWxzbywgY29tbWVudHMgY2FuIGJlIGluY2x1ZGVkOiBhIGNvbW1lbnQgc3RhcnRzCi13aXRoICcjJyBhbmQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLiAgSGVyZSBpcyBhbiBleGFtcGxlIGZpbGUgdGhhdAotZHVwbGljYXRlcyB0aGUgZGVmYXVsdCBxdWFudGl6YXRpb24gdGFibGVzOgotCi0JIyBRdWFudGl6YXRpb24gdGFibGVzIGdpdmVuIGluIEpQRUcgc3BlYywgc2VjdGlvbiBLLjEKLQotCSMgVGhpcyBpcyB0YWJsZSAwICh0aGUgbHVtaW5hbmNlIHRhYmxlKToKLQkgIDE2ICAxMSAgMTAgIDE2ICAyNCAgNDAgIDUxICA2MQotCSAgMTIgIDEyICAxNCAgMTkgIDI2ICA1OCAgNjAgIDU1Ci0JICAxNCAgMTMgIDE2ICAyNCAgNDAgIDU3ICA2OSAgNTYKLQkgIDE0ICAxNyAgMjIgIDI5ICA1MSAgODcgIDgwICA2MgotCSAgMTggIDIyICAzNyAgNTYgIDY4IDEwOSAxMDMgIDc3Ci0JICAyNCAgMzUgIDU1ICA2NCAgODEgMTA0IDExMyAgOTIKLQkgIDQ5ICA2NCAgNzggIDg3IDEwMyAxMjEgMTIwIDEwMQotCSAgNzIgIDkyICA5NSAgOTggMTEyIDEwMCAxMDMgIDk5Ci0KLQkjIFRoaXMgaXMgdGFibGUgMSAodGhlIGNocm9taW5hbmNlIHRhYmxlKToKLQkgIDE3ICAxOCAgMjQgIDQ3ICA5OSAgOTkgIDk5ICA5OQotCSAgMTggIDIxICAyNiAgNjYgIDk5ICA5OSAgOTkgIDk5Ci0JICAyNCAgMjYgIDU2ICA5OSAgOTkgIDk5ICA5OSAgOTkKLQkgIDQ3ICA2NiAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OQotCSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5Ci0JICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkKLQkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OQotCSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5Ci0KLUlmIHRoZSAtcXRhYmxlcyBzd2l0Y2ggaXMgdXNlZCB3aXRob3V0IC1xdWFsaXR5LCB0aGVuIHRoZSBzcGVjaWZpZWQgdGFibGVzCi1hcmUgdXNlZCBleGFjdGx5IGFzLWlzLiAgSWYgYm90aCAtcXRhYmxlcyBhbmQgLXF1YWxpdHkgYXJlIHVzZWQsIHRoZW4gdGhlCi10YWJsZXMgdGFrZW4gZnJvbSB0aGUgZmlsZSBhcmUgc2NhbGVkIGluIHRoZSBzYW1lIGZhc2hpb24gdGhhdCB0aGUgZGVmYXVsdAotdGFibGVzIHdvdWxkIGJlIHNjYWxlZCBmb3IgdGhhdCBxdWFsaXR5IHNldHRpbmcuICBJZiAtYmFzZWxpbmUgYXBwZWFycywgdGhlbgotdGhlIHF1YW50aXphdGlvbiB2YWx1ZXMgYXJlIGNvbnN0cmFpbmVkIHRvIHRoZSByYW5nZSAxLTI1NS4KLQotQnkgZGVmYXVsdCwgY2pwZWcgd2lsbCB1c2UgcXVhbnRpemF0aW9uIHRhYmxlIDAgZm9yIGx1bWluYW5jZSBjb21wb25lbnRzIGFuZAotdGFibGUgMSBmb3IgY2hyb21pbmFuY2UgY29tcG9uZW50cy4gIFRvIG92ZXJyaWRlIHRoaXMgY2hvaWNlLCB1c2UgdGhlIC1xc2xvdHMKLXN3aXRjaDoKLQotCS1xc2xvdHMgTlssLi4uXQkJU2VsZWN0IHdoaWNoIHF1YW50aXphdGlvbiB0YWJsZSB0byB1c2UgZm9yCi0JCQkJZWFjaCBjb2xvciBjb21wb25lbnQuCi0KLVRoZSAtcXNsb3RzIHN3aXRjaCBzcGVjaWZpZXMgYSBxdWFudGl6YXRpb24gdGFibGUgbnVtYmVyIGZvciBlYWNoIGNvbG9yCi1jb21wb25lbnQsIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgY29tcG9uZW50cyBhcHBlYXIgaW4gdGhlIEpQRUcgU09GIG1hcmtlci4KLUZvciBleGFtcGxlLCB0byBjcmVhdGUgYSBzZXBhcmF0ZSB0YWJsZSBmb3IgZWFjaCBvZiBZLENiLENyLCB5b3UgY291bGQKLXByb3ZpZGUgYSAtcXRhYmxlcyBmaWxlIHRoYXQgZGVmaW5lcyB0aHJlZSBxdWFudGl6YXRpb24gdGFibGVzIGFuZCBzYXkKLSItcXNsb3RzIDAsMSwyIi4gIElmIC1xc2xvdHMgZ2l2ZXMgZmV3ZXIgdGFibGUgbnVtYmVycyB0aGFuIHRoZXJlIGFyZSBjb2xvcgotY29tcG9uZW50cywgdGhlbiB0aGUgbGFzdCB0YWJsZSBudW1iZXIgaXMgcmVwZWF0ZWQgYXMgbmVjZXNzYXJ5LgotCi0KLVNhbXBsaW5nIEZhY3RvciBBZGp1c3RtZW50Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1CeSBkZWZhdWx0LCBjanBlZyB1c2VzIDI6MSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkb3duc2FtcGxpbmcgd2hlbgotY29tcHJlc3NpbmcgWUNiQ3IgZGF0YSwgYW5kIG5vIGRvd25zYW1wbGluZyBmb3IgYWxsIG90aGVyIGNvbG9yIHNwYWNlcy4KLVlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBkZWZhdWx0IHdpdGggdGhlIC1zYW1wbGUgc3dpdGNoOgotCi0JLXNhbXBsZSBIeFZbLC4uLl0JU2V0IEpQRUcgc2FtcGxpbmcgZmFjdG9ycyBmb3IgZWFjaCBjb2xvcgotCQkJCWNvbXBvbmVudC4KLQotVGhlIC1zYW1wbGUgc3dpdGNoIHNwZWNpZmllcyB0aGUgSlBFRyBzYW1wbGluZyBmYWN0b3JzIGZvciBlYWNoIGNvbG9yCi1jb21wb25lbnQsIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgSlBFRyBTT0YgbWFya2VyLgotSWYgeW91IHNwZWNpZnkgZmV3ZXIgSHhWIHBhaXJzIHRoYW4gdGhlcmUgYXJlIGNvbXBvbmVudHMsIHRoZSByZW1haW5pbmcKLWNvbXBvbmVudHMgYXJlIHNldCB0byAxeDEgc2FtcGxpbmcuICBGb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgWUNiQ3Igc2V0dGluZwotaXMgZXF1aXZhbGVudCB0byAiLXNhbXBsZSAyeDIsMXgxLDF4MSIsIHdoaWNoIGNhbiBiZSBhYmJyZXZpYXRlZCB0bwotIi1zYW1wbGUgMngyIi4KLQotVGhlcmUgYXJlIHN0aWxsIHNvbWUgSlBFRyBkZWNvZGVycyBpbiBleGlzdGVuY2UgdGhhdCBzdXBwb3J0IG9ubHkgMngxCi1zYW1wbGluZyAoYWxzbyBjYWxsZWQgNDoyOjIgc2FtcGxpbmcpLiAgQ29tcGF0aWJpbGl0eSB3aXRoIHN1Y2ggZGVjb2RlcnMgY2FuCi1iZSBhY2hpZXZlZCBieSBzcGVjaWZ5aW5nICItc2FtcGxlIDJ4MSIuICBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCB1bmxlc3MKLXJlYWxseSBuZWNlc3NhcnksIHNpbmNlIGl0IGluY3JlYXNlcyBmaWxlIHNpemUgYW5kIGVuY29kaW5nL2RlY29kaW5nIHRpbWUKLXdpdGggdmVyeSBsaXR0bGUgcXVhbGl0eSBnYWluLgotCi0KLU11bHRpcGxlIFNjYW4gLyBQcm9ncmVzc2lvbiBDb250cm9sCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1CeSBkZWZhdWx0LCBjanBlZyBlbWl0cyBhIHNpbmdsZS1zY2FuIHNlcXVlbnRpYWwgSlBFRyBmaWxlLiAgVGhlCi0tcHJvZ3Jlc3NpdmUgc3dpdGNoIGdlbmVyYXRlcyBhIHByb2dyZXNzaXZlIEpQRUcgZmlsZSB1c2luZyBhIGRlZmF1bHQgc2VyaWVzCi1vZiBwcm9ncmVzc2lvbiBwYXJhbWV0ZXJzLiAgWW91IGNhbiBjcmVhdGUgbXVsdGlwbGUtc2NhbiBzZXF1ZW50aWFsIEpQRUcKLWZpbGVzIG9yIHByb2dyZXNzaXZlIEpQRUcgZmlsZXMgd2l0aCBjdXN0b20gcHJvZ3Jlc3Npb24gcGFyYW1ldGVycyBieSB1c2luZwotdGhlIC1zY2FucyBzd2l0Y2g6Ci0KLQktc2NhbnMgZmlsZQlVc2UgdGhlIHNjYW4gc2VxdWVuY2UgZ2l2ZW4gaW4gdGhlIG5hbWVkIGZpbGUuCi0KLVRoZSBzcGVjaWZpZWQgZmlsZSBzaG91bGQgYmUgYSB0ZXh0IGZpbGUgY29udGFpbmluZyBhICJzY2FuIHNjcmlwdCIuCi1UaGUgc2NyaXB0IHNwZWNpZmllcyB0aGUgY29udGVudHMgYW5kIG9yZGVyaW5nIG9mIHRoZSBzY2FucyB0byBiZSBlbWl0dGVkLgotRWFjaCBlbnRyeSBpbiB0aGUgc2NyaXB0IGRlZmluZXMgb25lIHNjYW4uICBBIHNjYW4gZGVmaW5pdGlvbiBzcGVjaWZpZXMKLXRoZSBjb21wb25lbnRzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzY2FuLCBhbmQgZm9yIHByb2dyZXNzaXZlIEpQRUcgaXQgYWxzbwotc3BlY2lmaWVzIHRoZSBwcm9ncmVzc2lvbiBwYXJhbWV0ZXJzIFNzLFNlLEFoLEFsIGZvciB0aGUgc2Nhbi4gIFNjYW4KLWRlZmluaXRpb25zIGFyZSBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucyAoJzsnKS4gIEEgc2VtaWNvbG9uIGFmdGVyIHRoZSBsYXN0Ci1zY2FuIGRlZmluaXRpb24gaXMgb3B0aW9uYWwuCi0KLUVhY2ggc2NhbiBkZWZpbml0aW9uIGNvbnRhaW5zIG9uZSB0byBmb3VyIGNvbXBvbmVudCBpbmRleGVzLCBvcHRpb25hbGx5Ci1mb2xsb3dlZCBieSBhIGNvbG9uICgnOicpIGFuZCB0aGUgZm91ciBwcm9ncmVzc2l2ZS1KUEVHIHBhcmFtZXRlcnMuICBUaGUKLWNvbXBvbmVudCBpbmRleGVzIGRlbm90ZSB3aGljaCBjb2xvciBjb21wb25lbnQocykgYXJlIHRvIGJlIHRyYW5zbWl0dGVkIGluCi10aGUgc2Nhbi4gIENvbXBvbmVudHMgYXJlIG51bWJlcmVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUKLUpQRUcgU09GIG1hcmtlciwgd2l0aCB0aGUgZmlyc3QgY29tcG9uZW50IGJlaW5nIG51bWJlcmVkIDAuICAoTm90ZSB0aGF0IHRoZXNlCi1pbmRleGVzIGFyZSBub3QgdGhlICJjb21wb25lbnQgSUQiIGNvZGVzIGFzc2lnbmVkIHRvIHRoZSBjb21wb25lbnRzLCBqdXN0Ci1wb3NpdGlvbmFsIGluZGV4ZXMuKQotCi1UaGUgcHJvZ3Jlc3Npb24gcGFyYW1ldGVycyBmb3IgZWFjaCBzY2FuIGFyZToKLQlTcwlaaWd6YWcgaW5kZXggb2YgZmlyc3QgY29lZmZpY2llbnQgaW5jbHVkZWQgaW4gc2NhbgotCVNlCVppZ3phZyBpbmRleCBvZiBsYXN0IGNvZWZmaWNpZW50IGluY2x1ZGVkIGluIHNjYW4KLQlBaAlaZXJvIGZvciBmaXJzdCBzY2FuIG9mIGEgY29lZmZpY2llbnQsIGVsc2UgQWwgb2YgcHJpb3Igc2NhbgotCUFsCVN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiBsb3cgYml0IHBvc2l0aW9uIGZvciBzY2FuCi1JZiB0aGUgcHJvZ3Jlc3Npb24gcGFyYW1ldGVycyBhcmUgb21pdHRlZCwgdGhlIHZhbHVlcyAwLDYzLDAsMCBhcmUgdXNlZCwKLXByb2R1Y2luZyBhIHNlcXVlbnRpYWwgSlBFRyBmaWxlLiAgY2pwZWcgYXV0b21hdGljYWxseSBkZXRlcm1pbmVzIHdoZXRoZXIKLXRoZSBzY3JpcHQgcmVwcmVzZW50cyBhIHByb2dyZXNzaXZlIG9yIHNlcXVlbnRpYWwgZmlsZSwgYnkgb2JzZXJ2aW5nIHdoZXRoZXIKLVNzIGFuZCBTZSB2YWx1ZXMgb3RoZXIgdGhhbiAwIGFuZCA2MyBhcHBlYXIuICAoVGhlIC1wcm9ncmVzc2l2ZSBzd2l0Y2ggaXMKLW5vdCBuZWVkZWQgdG8gc3BlY2lmeSB0aGlzOyBpbiBmYWN0LCBpdCBpcyBpZ25vcmVkIHdoZW4gLXNjYW5zIGFwcGVhcnMuKQotVGhlIHNjYW4gc2NyaXB0IG11c3QgbWVldCB0aGUgSlBFRyByZXN0cmljdGlvbnMgb24gcHJvZ3Jlc3Npb24gc2VxdWVuY2VzLgotKGNqcGVnIGNoZWNrcyB0aGF0IHRoZSBzcGVjJ3MgcmVxdWlyZW1lbnRzIGFyZSBvYmV5ZWQuKQotCi1TY2FuIHNjcmlwdCBmaWxlcyBhcmUgZnJlZSBmb3JtYXQsIGluIHRoYXQgYXJiaXRyYXJ5IHdoaXRlc3BhY2UgY2FuIGFwcGVhcgotYmV0d2VlbiBudW1iZXJzIGFuZCBhcm91bmQgcHVuY3R1YXRpb24uICBBbHNvLCBjb21tZW50cyBjYW4gYmUgaW5jbHVkZWQ6IGEKLWNvbW1lbnQgc3RhcnRzIHdpdGggJyMnIGFuZCBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuICBGb3IgYWRkaXRpb25hbAotbGVnaWJpbGl0eSwgY29tbWFzIG9yIGRhc2hlcyBjYW4gYmUgcGxhY2VkIGJldHdlZW4gdmFsdWVzLiAgKEFjdHVhbGx5LCBhbnkKLXNpbmdsZSBwdW5jdHVhdGlvbiBjaGFyYWN0ZXIgb3RoZXIgdGhhbiAnOicgb3IgJzsnIGNhbiBiZSBpbnNlcnRlZC4pICBGb3IKLWV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdHdvIHNjYW4gZGVmaW5pdGlvbnMgYXJlIGVxdWl2YWxlbnQ6Ci0JMCAxIDI6IDAgNjMgMCAwOwotCTAsMSwyIDogMC02MywgMCwwIDsKLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgc2NhbiBzY3JpcHQgdGhhdCBnZW5lcmF0ZXMgYSBwYXJ0aWFsbHkgaW50ZXJsZWF2ZWQKLXNlcXVlbnRpYWwgSlBFRyBmaWxlOgotCi0JMDsJCQkjIFkgb25seSBpbiBmaXJzdCBzY2FuCi0JMSAyOwkJCSMgQ2IgYW5kIENyIGluIHNlY29uZCBzY2FuCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIHByb2dyZXNzaXZlIHNjYW4gc2NyaXB0IHVzaW5nIG9ubHkgc3BlY3RyYWwgc2VsZWN0aW9uCi0obm8gc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uKToKLQotCSMgSW50ZXJsZWF2ZWQgREMgc2NhbiBmb3IgWSxDYixDcjoKLQkwLDEsMjogMC0wLCAgIDAsIDAgOwotCSMgQUMgc2NhbnM6Ci0JMDogICAgIDEtMiwgICAwLCAwIDsJIyBGaXJzdCB0d28gWSBBQyBjb2VmZmljaWVudHMKLQkwOiAgICAgMy01LCAgIDAsIDAgOwkjIFRocmVlIG1vcmUKLQkxOiAgICAgMS02MywgIDAsIDAgOwkjIEFsbCBBQyBjb2VmZmljaWVudHMgZm9yIENiCi0JMjogICAgIDEtNjMsICAwLCAwIDsJIyBBbGwgQUMgY29lZmZpY2llbnRzIGZvciBDcgotCTA6ICAgICA2LTksICAgMCwgMCA7CSMgTW9yZSBZIGNvZWZmaWNpZW50cwotCTA6ICAgICAxMC02MywgMCwgMCA7CSMgUmVtYWluaW5nIFkgY29lZmZpY2llbnRzCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIHN1Y2Nlc3NpdmUtYXBwcm94aW1hdGlvbiBzY3JpcHQuICBUaGlzIGlzIGVxdWl2YWxlbnQKLXRvIHRoZSBkZWZhdWx0IHNjcmlwdCB1c2VkIGJ5ICJjanBlZyAtcHJvZ3Jlc3NpdmUiIGZvciBZQ2JDciBpbWFnZXM6Ci0KLQkjIEluaXRpYWwgREMgc2NhbiBmb3IgWSxDYixDciAobG93ZXN0IGJpdCBub3Qgc2VudCkKLQkwLDEsMjogMC0wLCAgIDAsIDEgOwotCSMgRmlyc3QgQUMgc2Nhbjogc2VuZCBmaXJzdCA1IFkgQUMgY29lZmZpY2llbnRzLCBtaW51cyAyIGxvd2VzdCBiaXRzOgotCTA6ICAgICAxLTUsICAgMCwgMiA7Ci0JIyBTZW5kIGFsbCBDcixDYiBBQyBjb2VmZmljaWVudHMsIG1pbnVzIGxvd2VzdCBiaXQ6Ci0JIyAoY2hyb21hIGRhdGEgaXMgdXN1YWxseSB0b28gc21hbGwgdG8gYmUgd29ydGggc3ViZGl2aWRpbmcgZnVydGhlcjsKLQkjICBidXQgbm90ZSB3ZSBzZW5kIENyIGZpcnN0IHNpbmNlIGV5ZSBpcyBsZWFzdCBzZW5zaXRpdmUgdG8gQ2IpCi0JMjogICAgIDEtNjMsICAwLCAxIDsKLQkxOiAgICAgMS02MywgIDAsIDEgOwotCSMgU2VuZCByZW1haW5pbmcgWSBBQyBjb2VmZmljaWVudHMsIG1pbnVzIDIgbG93ZXN0IGJpdHM6Ci0JMDogICAgIDYtNjMsICAwLCAyIDsKLQkjIFNlbmQgbmV4dC10by1sb3dlc3QgYml0IG9mIGFsbCBZIEFDIGNvZWZmaWNpZW50czoKLQkwOiAgICAgMS02MywgIDIsIDEgOwotCSMgQXQgdGhpcyBwb2ludCB3ZSd2ZSBzZW50IGFsbCBidXQgdGhlIGxvd2VzdCBiaXQgb2YgYWxsIGNvZWZmaWNpZW50cy4KLQkjIFNlbmQgbG93ZXN0IGJpdCBvZiBEQyBjb2VmZmljaWVudHMKLQkwLDEsMjogMC0wLCAgIDEsIDAgOwotCSMgU2VuZCBsb3dlc3QgYml0IG9mIEFDIGNvZWZmaWNpZW50cwotCTI6ICAgICAxLTYzLCAgMSwgMCA7Ci0JMTogICAgIDEtNjMsICAxLCAwIDsKLQkjIFkgQUMgbG93ZXN0IGJpdCBzY2FuIGlzIGxhc3Q7IGl0J3MgdXN1YWxseSB0aGUgbGFyZ2VzdCBzY2FuCi0JMDogICAgIDEtNjMsICAxLCAwIDsKLQotSXQgbWF5IGJlIHdvcnRoIHBvaW50aW5nIG91dCB0aGF0IHRoaXMgc2NyaXB0IGlzIHR1bmVkIGZvciBxdWFsaXR5IHNldHRpbmdzCi1vZiBhcm91bmQgNTAgdG8gNzUuICBGb3IgbG93ZXIgcXVhbGl0eSBzZXR0aW5ncywgeW91J2QgcHJvYmFibHkgd2FudCB0byB1c2UKLWEgc2NyaXB0IHdpdGggZmV3ZXIgc3RhZ2VzIG9mIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiAob3RoZXJ3aXNlIHRoZQotaW5pdGlhbCBzY2FucyB3aWxsIGJlIHJlYWxseSBiYWQpLiAgRm9yIGhpZ2hlciBxdWFsaXR5IHNldHRpbmdzLCB5b3UgbWlnaHQKLXdhbnQgdG8gdXNlIG1vcmUgc3RhZ2VzIG9mIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiAoc28gdGhhdCB0aGUgaW5pdGlhbAotc2NhbnMgYXJlIG5vdCB0b28gbGFyZ2UpLgpkaWZmIC0tZ2l0IGEvd3JibXAuYyBiL3dyYm1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNzQ0MWEuLjAwMDAwMDAKLS0tIGEvd3JibXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1NyArMCwwIEBACi0vKgotICogd3JibXAuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB4ODYgU0lNRCBleHRlbnNpb24gZm9yIElKRyBKUEVHIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBNSVlBU0FLQSBNYXNhcnUuCi0gKiBUaGlzIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KLSAqIExhc3QgTW9kaWZpZWQgOiBPY3RvYmVyIDE5LCAyMDA0Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gd3JpdGUgb3V0cHV0IGltYWdlcyBpbiBNaWNyb3NvZnQgIkJNUCIKLSAqIGZvcm1hdCAoTVMgV2luZG93cyAzLnggYW5kIE9TLzIgMS54IGZsYXZvcnMpLgotICogRWl0aGVyIDgtYml0IGNvbG9ybWFwcGVkIG9yIDI0LWJpdCBmdWxsLWNvbG9yIGZvcm1hdCBjYW4gYmUgd3JpdHRlbi4KLSAqIE5vIGNvbXByZXNzaW9uIGlzIHN1cHBvcnRlZC4KLSAqCi0gKiBUaGVzZSByb3V0aW5lcyBtYXkgbmVlZCBtb2RpZmljYXRpb24gZm9yIG5vbi1Vbml4IGVudmlyb25tZW50cyBvcgotICogc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgQXMgdGhleSBzdGFuZCwgdGhleSBhc3N1bWUgb3V0cHV0IHRvCi0gKiBhbiBvcmRpbmFyeSBzdGRpbyBzdHJlYW0uCi0gKgotICogVGhpcyBjb2RlIGNvbnRyaWJ1dGVkIGJ5IEphbWVzIEFydGh1ciBCb3VjaGVyLgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0KLSNpZmRlZiBCTVBfU1VQUE9SVEVECi0KLQotLyoKLSAqIFRvIHN1cHBvcnQgMTItYml0IEpQRUcgZGF0YSwgd2UnZCBoYXZlIHRvIHNjYWxlIG91dHB1dCBkb3duIHRvIDggYml0cy4KLSAqIFRoaXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KLSAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFICE9IDgKLSAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOC1iaXQgSlNBTVBMRXMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLwotI2VuZGlmCi0KLS8qCi0gKiBTaW5jZSBCTVAgc3RvcmVzIHNjYW5saW5lcyBib3R0b20tdG8tdG9wLCB3ZSBoYXZlIHRvIGludmVydCB0aGUgaW1hZ2UKLSAqIGZyb20gSlBFRydzIHRvcC10by1ib3R0b20gb3JkZXIuICBUbyBkbyB0aGlzLCB3ZSBzYXZlIHRoZSBvdXRnb2luZyBkYXRhCi0gKiBpbiBhIHZpcnR1YWwgYXJyYXkgZHVyaW5nIHB1dF9waXhlbF9yb3cgY2FsbHMsIHRoZW4gYWN0dWFsbHkgZW1pdCB0aGUKLSAqIEJNUCBmaWxlIGR1cmluZyBmaW5pc2hfb3V0cHV0LiAgVGhlIHZpcnR1YWwgYXJyYXkgY29udGFpbnMgb25lIEpTQU1QTEUgcGVyCi0gKiBwaXhlbCBpZiB0aGUgb3V0cHV0IGlzIGdyYXlzY2FsZSBvciBjb2xvcm1hcHBlZCwgdGhyZWUgaWYgaXQgaXMgZnVsbCBjb2xvci4KLSAqLwotCi0vKiBQcml2YXRlIHZlcnNpb24gb2YgZGF0YSBkZXN0aW5hdGlvbiBvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QgZGpwZWdfZGVzdF9zdHJ1Y3QgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgYm9vbGVhbiBpc19vczI7CQkvKiBzYXZlcyB0aGUgT1MyIGZvcm1hdCByZXF1ZXN0IGZsYWcgKi8KLQotICBqdmlydF9zYXJyYXlfcHRyIHdob2xlX2ltYWdlOwkvKiBuZWVkZWQgdG8gcmV2ZXJzZSByb3cgb3JkZXIgKi8KLSAgSkRJTUVOU0lPTiBkYXRhX3dpZHRoOwkvKiBKU0FNUExFcyBwZXIgcm93ICovCi0gIEpESU1FTlNJT04gcm93X3dpZHRoOwkJLyogcGh5c2ljYWwgd2lkdGggb2Ygb25lIHJvdyBpbiB0aGUgQk1QIGZpbGUgKi8KLSAgaW50IHBhZF9ieXRlczsJCS8qIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIG5lZWRlZCBwZXIgcm93ICovCi0gIEpESU1FTlNJT04gY3VyX291dHB1dF9yb3c7CS8qIG5leHQgcm93IyB0byB3cml0ZSB0byB2aXJ0dWFsIGFycmF5ICovCi19IGJtcF9kZXN0X3N0cnVjdDsKLQotdHlwZWRlZiBibXBfZGVzdF9zdHJ1Y3QgKiBibXBfZGVzdF9wdHI7Ci0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLUxPQ0FMKHZvaWQpIHdyaXRlX2NvbG9ybWFwCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBibXBfZGVzdF9wdHIgZGVzdCwKLQkgICAgIGludCBtYXBfY29sb3JzLCBpbnQgbWFwX2VudHJ5X3NpemUpKTsKLQotCi0vKgotICogV3JpdGUgc29tZSBwaXhlbCBkYXRhLgotICogSW4gdGhpcyBtb2R1bGUgcm93c19zdXBwbGllZCB3aWxsIGFsd2F5cyBiZSAxLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcHV0X3BpeGVsX3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAotCQlKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCi0vKiBUaGlzIHZlcnNpb24gaXMgZm9yIHdyaXRpbmcgMjQtYml0IHBpeGVscyAqLwotewotICBibXBfZGVzdF9wdHIgZGVzdCA9IChibXBfZGVzdF9wdHIpIGRpbmZvOwotICBKU0FNUEFSUkFZIGltYWdlX3B0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIGludCBwYWQ7Ci0KLSAgLyogQWNjZXNzIG5leHQgcm93IGluIHZpcnR1YWwgYXJyYXkgKi8KLSAgaW1hZ2VfcHRyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBkZXN0LT53aG9sZV9pbWFnZSwKLSAgICAgZGVzdC0+Y3VyX291dHB1dF9yb3csIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKLSAgZGVzdC0+Y3VyX291dHB1dF9yb3crKzsKLQotICAvKiBUcmFuc2ZlciBkYXRhLiAgTm90ZSBkZXN0aW5hdGlvbiB2YWx1ZXMgbXVzdCBiZSBpbiBCR1Igb3JkZXIKLSAgICogKGV2ZW4gdGhvdWdoIE1pY3Jvc29mdCdzIG93biBkb2N1bWVudHMgc2F5IHRoZSBvcHBvc2l0ZSkuCi0gICAqLwotICBpbnB0ciA9IGRlc3QtPnB1Yi5idWZmZXJbMF07Ci0gIG91dHB0ciA9IGltYWdlX3B0clswXTsKLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgIG91dHB0clsyXSA9ICppbnB0cisrOwkvKiBjYW4gb21pdCBHRVRKU0FNUExFKCkgc2FmZWx5ICovCi0gICAgb3V0cHRyWzFdID0gKmlucHRyKys7Ci0gICAgb3V0cHRyWzBdID0gKmlucHRyKys7Ci0gICAgb3V0cHRyICs9IDM7Ci0gIH0KLQotICAvKiBaZXJvIG91dCB0aGUgcGFkIGJ5dGVzLiAqLwotICBwYWQgPSBkZXN0LT5wYWRfYnl0ZXM7Ci0gIHdoaWxlICgtLXBhZCA+PSAwKQotICAgICpvdXRwdHIrKyA9IDA7Ci19Ci0KLU1FVEhPRERFRih2b2lkKQotcHV0X2dyYXlfcm93cyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCi0JICAgICAgIEpESU1FTlNJT04gcm93c19zdXBwbGllZCkKLS8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgZ3JheXNjYWxlIE9SIHF1YW50aXplZCBjb2xvciBvdXRwdXQgKi8KLXsKLSAgYm1wX2Rlc3RfcHRyIGRlc3QgPSAoYm1wX2Rlc3RfcHRyKSBkaW5mbzsKLSAgSlNBTVBBUlJBWSBpbWFnZV9wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICBpbnQgcGFkOwotCi0gIC8qIEFjY2VzcyBuZXh0IHJvdyBpbiB2aXJ0dWFsIGFycmF5ICovCi0gIGltYWdlX3B0ciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgZGVzdC0+d2hvbGVfaW1hZ2UsCi0gICAgIGRlc3QtPmN1cl9vdXRwdXRfcm93LCAoSkRJTUVOU0lPTikgMSwgVFJVRSk7Ci0gIGRlc3QtPmN1cl9vdXRwdXRfcm93Kys7Ci0KLSAgLyogVHJhbnNmZXIgZGF0YS4gKi8KLSAgaW5wdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOwotICBvdXRwdHIgPSBpbWFnZV9wdHJbMF07Ci0gIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICAqb3V0cHRyKysgPSAqaW5wdHIrKzsJLyogY2FuIG9taXQgR0VUSlNBTVBMRSgpIHNhZmVseSAqLwotICB9Ci0KLSAgLyogWmVybyBvdXQgdGhlIHBhZCBieXRlcy4gKi8KLSAgcGFkID0gZGVzdC0+cGFkX2J5dGVzOwotICB3aGlsZSAoLS1wYWQgPj0gMCkKLSAgICAqb3V0cHRyKysgPSAwOwotfQotCi0KLS8qCi0gKiBTdGFydHVwOiBub3JtYWxseSB3cml0ZXMgdGhlIGZpbGUgaGVhZGVyLgotICogSW4gdGhpcyBtb2R1bGUgd2UgbWF5IGFzIHdlbGwgcG9zdHBvbmUgZXZlcnl0aGluZyB1bnRpbCBmaW5pc2hfb3V0cHV0LgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfb3V0cHV0X2JtcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCi17Ci0gIC8qIG5vIHdvcmsgaGVyZSAqLwotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAqCi0gKiBIZXJlIGlzIHdoZXJlIHdlIHJlYWxseSBvdXRwdXQgdGhlIEJNUCBmaWxlLgotICoKLSAqIEZpcnN0LCByb3V0aW5lcyB0byB3cml0ZSB0aGUgV2luZG93cyBhbmQgT1MvMiB2YXJpYW50cyBvZiB0aGUgZmlsZSBoZWFkZXIuCi0gKi8KLQotTE9DQUwodm9pZCkKLXdyaXRlX2JtcF9oZWFkZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJtcF9kZXN0X3B0ciBkZXN0KQotLyogV3JpdGUgYSBXaW5kb3dzLXN0eWxlIEJNUCBmaWxlIGhlYWRlciwgaW5jbHVkaW5nIGNvbG9ybWFwIGlmIG5lZWRlZCAqLwotewotICBjaGFyIGJtcGZpbGVoZWFkZXJbMTRdOwotICBjaGFyIGJtcGluZm9oZWFkZXJbNDBdOwotI2RlZmluZSBQVVRfMkIoYXJyYXksb2Zmc2V0LHZhbHVlKSAgXAotCShhcnJheVtvZmZzZXRdID0gKGNoYXIpICgodmFsdWUpICYgMHhGRiksIFwKLQkgYXJyYXlbb2Zmc2V0KzFdID0gKGNoYXIpICgoKHZhbHVlKSA+PiA4KSAmIDB4RkYpKQotI2RlZmluZSBQVVRfNEIoYXJyYXksb2Zmc2V0LHZhbHVlKSAgXAotCShhcnJheVtvZmZzZXRdID0gKGNoYXIpICgodmFsdWUpICYgMHhGRiksIFwKLQkgYXJyYXlbb2Zmc2V0KzFdID0gKGNoYXIpICgoKHZhbHVlKSA+PiA4KSAmIDB4RkYpLCBcCi0JIGFycmF5W29mZnNldCsyXSA9IChjaGFyKSAoKCh2YWx1ZSkgPj4gMTYpICYgMHhGRiksIFwKLQkgYXJyYXlbb2Zmc2V0KzNdID0gKGNoYXIpICgoKHZhbHVlKSA+PiAyNCkgJiAweEZGKSkKLSAgSU5UMzIgaGVhZGVyc2l6ZSwgYmZTaXplOwotICBpbnQgYml0c19wZXJfcGl4ZWwsIGNtYXBfZW50cmllczsKLQotICAvKiBDb21wdXRlIGNvbG9ybWFwIHNpemUgYW5kIHRvdGFsIGZpbGUgc2l6ZSAqLwotICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7Ci0gICAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKLSAgICAgIC8qIENvbG9ybWFwcGVkIFJHQiAqLwotICAgICAgYml0c19wZXJfcGl4ZWwgPSA4OwotICAgICAgY21hcF9lbnRyaWVzID0gMjU2OwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBVbnF1YW50aXplZCwgZnVsbCBjb2xvciBSR0IgKi8KLSAgICAgIGJpdHNfcGVyX3BpeGVsID0gMjQ7Ci0gICAgICBjbWFwX2VudHJpZXMgPSAwOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBHcmF5c2NhbGUgb3V0cHV0LiAgV2UgbmVlZCB0byBmYWtlIGEgMjU2LWVudHJ5IGNvbG9ybWFwLiAqLwotICAgIGJpdHNfcGVyX3BpeGVsID0gODsKLSAgICBjbWFwX2VudHJpZXMgPSAyNTY7Ci0gIH0KLSAgLyogRmlsZSBzaXplICovCi0gIGhlYWRlcnNpemUgPSAxNCArIDQwICsgY21hcF9lbnRyaWVzICogNDsgLyogSGVhZGVyIGFuZCBjb2xvcm1hcCAqLwotICBiZlNpemUgPSBoZWFkZXJzaXplICsgKElOVDMyKSBkZXN0LT5yb3dfd2lkdGggKiAoSU5UMzIpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OwotICAKLSAgLyogU2V0IHVudXNlZCBmaWVsZHMgb2YgaGVhZGVyIHRvIDAgKi8KLSAgTUVNWkVSTyhibXBmaWxlaGVhZGVyLCBTSVpFT0YoYm1wZmlsZWhlYWRlcikpOwotICBNRU1aRVJPKGJtcGluZm9oZWFkZXIsIFNJWkVPRihibXBpbmZvaGVhZGVyKSk7Ci0KLSAgLyogRmlsbCB0aGUgZmlsZSBoZWFkZXIgKi8KLSAgYm1wZmlsZWhlYWRlclswXSA9IDB4NDI7CS8qIGZpcnN0IDIgYnl0ZXMgYXJlIEFTQ0lJICdCJywgJ00nICovCi0gIGJtcGZpbGVoZWFkZXJbMV0gPSAweDREOwotICBQVVRfNEIoYm1wZmlsZWhlYWRlciwgMiwgYmZTaXplKTsgLyogYmZTaXplICovCi0gIC8qIHdlIGxlYXZlIGJmUmVzZXJ2ZWQxICYgYmZSZXNlcnZlZDIgPSAwICovCi0gIFBVVF80QihibXBmaWxlaGVhZGVyLCAxMCwgaGVhZGVyc2l6ZSk7IC8qIGJmT2ZmQml0cyAqLwotCi0gIC8qIEZpbGwgdGhlIGluZm8gaGVhZGVyIChNaWNyb3NvZnQgY2FsbHMgdGhpcyBhIEJJVE1BUElORk9IRUFERVIpICovCi0gIFBVVF8yQihibXBpbmZvaGVhZGVyLCAwLCA0MCk7CS8qIGJpU2l6ZSAqLwotICBQVVRfNEIoYm1waW5mb2hlYWRlciwgNCwgY2luZm8tPm91dHB1dF93aWR0aCk7IC8qIGJpV2lkdGggKi8KLSAgUFVUXzRCKGJtcGluZm9oZWFkZXIsIDgsIGNpbmZvLT5vdXRwdXRfaGVpZ2h0KTsgLyogYmlIZWlnaHQgKi8KLSAgUFVUXzJCKGJtcGluZm9oZWFkZXIsIDEyLCAxKTsJLyogYmlQbGFuZXMgLSBtdXN0IGJlIDEgKi8KLSAgUFVUXzJCKGJtcGluZm9oZWFkZXIsIDE0LCBiaXRzX3Blcl9waXhlbCk7IC8qIGJpQml0Q291bnQgKi8KLSAgLyogd2UgbGVhdmUgYmlDb21wcmVzc2lvbiA9IDAsIGZvciBub25lICovCi0gIC8qIHdlIGxlYXZlIGJpU2l6ZUltYWdlID0gMDsgdGhpcyBpcyBjb3JyZWN0IGZvciB1bmNvbXByZXNzZWQgZGF0YSAqLwotICBpZiAoY2luZm8tPmRlbnNpdHlfdW5pdCA9PSAyKSB7IC8qIGlmIGhhdmUgZGVuc2l0eSBpbiBkb3RzL2NtLCB0aGVuICovCi0gICAgUFVUXzRCKGJtcGluZm9oZWFkZXIsIDI0LCAoSU5UMzIpIChjaW5mby0+WF9kZW5zaXR5KjEwMCkpOyAvKiBYUGVscy9NICovCi0gICAgUFVUXzRCKGJtcGluZm9oZWFkZXIsIDI4LCAoSU5UMzIpIChjaW5mby0+WV9kZW5zaXR5KjEwMCkpOyAvKiBYUGVscy9NICovCi0gIH0KLSAgUFVUXzJCKGJtcGluZm9oZWFkZXIsIDMyLCBjbWFwX2VudHJpZXMpOyAvKiBiaUNsclVzZWQgKi8KLSAgLyogd2UgbGVhdmUgYmlDbHJJbXBvcnRhbnQgPSAwICovCi0KLSAgaWYgKEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBibXBmaWxlaGVhZGVyLCAxNCkgIT0gKHNpemVfdCkgMTQpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKLSAgaWYgKEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBibXBpbmZvaGVhZGVyLCA0MCkgIT0gKHNpemVfdCkgNDApCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKLQotICBpZiAoY21hcF9lbnRyaWVzID4gMCkKLSAgICB3cml0ZV9jb2xvcm1hcChjaW5mbywgZGVzdCwgY21hcF9lbnRyaWVzLCA0KTsKLX0KLQotCi1MT0NBTCh2b2lkKQotd3JpdGVfb3MyX2hlYWRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm1wX2Rlc3RfcHRyIGRlc3QpCi0vKiBXcml0ZSBhbiBPUzItc3R5bGUgQk1QIGZpbGUgaGVhZGVyLCBpbmNsdWRpbmcgY29sb3JtYXAgaWYgbmVlZGVkICovCi17Ci0gIGNoYXIgYm1wZmlsZWhlYWRlclsxNF07Ci0gIGNoYXIgYm1wY29yZWhlYWRlclsxMl07Ci0gIElOVDMyIGhlYWRlcnNpemUsIGJmU2l6ZTsKLSAgaW50IGJpdHNfcGVyX3BpeGVsLCBjbWFwX2VudHJpZXM7Ci0KLSAgLyogQ29tcHV0ZSBjb2xvcm1hcCBzaXplIGFuZCB0b3RhbCBmaWxlIHNpemUgKi8KLSAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgewotICAgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7Ci0gICAgICAvKiBDb2xvcm1hcHBlZCBSR0IgKi8KLSAgICAgIGJpdHNfcGVyX3BpeGVsID0gODsKLSAgICAgIGNtYXBfZW50cmllcyA9IDI1NjsKLSAgICB9IGVsc2UgewotICAgICAgLyogVW5xdWFudGl6ZWQsIGZ1bGwgY29sb3IgUkdCICovCi0gICAgICBiaXRzX3Blcl9waXhlbCA9IDI0OwotICAgICAgY21hcF9lbnRyaWVzID0gMDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogR3JheXNjYWxlIG91dHB1dC4gIFdlIG5lZWQgdG8gZmFrZSBhIDI1Ni1lbnRyeSBjb2xvcm1hcC4gKi8KLSAgICBiaXRzX3Blcl9waXhlbCA9IDg7Ci0gICAgY21hcF9lbnRyaWVzID0gMjU2OwotICB9Ci0gIC8qIEZpbGUgc2l6ZSAqLwotICBoZWFkZXJzaXplID0gMTQgKyAxMiArIGNtYXBfZW50cmllcyAqIDM7IC8qIEhlYWRlciBhbmQgY29sb3JtYXAgKi8KLSAgYmZTaXplID0gaGVhZGVyc2l6ZSArIChJTlQzMikgZGVzdC0+cm93X3dpZHRoICogKElOVDMyKSBjaW5mby0+b3V0cHV0X2hlaWdodDsKLSAgCi0gIC8qIFNldCB1bnVzZWQgZmllbGRzIG9mIGhlYWRlciB0byAwICovCi0gIE1FTVpFUk8oYm1wZmlsZWhlYWRlciwgU0laRU9GKGJtcGZpbGVoZWFkZXIpKTsKLSAgTUVNWkVSTyhibXBjb3JlaGVhZGVyLCBTSVpFT0YoYm1wY29yZWhlYWRlcikpOwotCi0gIC8qIEZpbGwgdGhlIGZpbGUgaGVhZGVyICovCi0gIGJtcGZpbGVoZWFkZXJbMF0gPSAweDQyOwkvKiBmaXJzdCAyIGJ5dGVzIGFyZSBBU0NJSSAnQicsICdNJyAqLwotICBibXBmaWxlaGVhZGVyWzFdID0gMHg0RDsKLSAgUFVUXzRCKGJtcGZpbGVoZWFkZXIsIDIsIGJmU2l6ZSk7IC8qIGJmU2l6ZSAqLwotICAvKiB3ZSBsZWF2ZSBiZlJlc2VydmVkMSAmIGJmUmVzZXJ2ZWQyID0gMCAqLwotICBQVVRfNEIoYm1wZmlsZWhlYWRlciwgMTAsIGhlYWRlcnNpemUpOyAvKiBiZk9mZkJpdHMgKi8KLQotICAvKiBGaWxsIHRoZSBpbmZvIGhlYWRlciAoTWljcm9zb2Z0IGNhbGxzIHRoaXMgYSBCSVRNQVBDT1JFSEVBREVSKSAqLwotICBQVVRfMkIoYm1wY29yZWhlYWRlciwgMCwgMTIpOwkvKiBiY1NpemUgKi8KLSAgUFVUXzJCKGJtcGNvcmVoZWFkZXIsIDQsIGNpbmZvLT5vdXRwdXRfd2lkdGgpOyAvKiBiY1dpZHRoICovCi0gIFBVVF8yQihibXBjb3JlaGVhZGVyLCA2LCBjaW5mby0+b3V0cHV0X2hlaWdodCk7IC8qIGJjSGVpZ2h0ICovCi0gIFBVVF8yQihibXBjb3JlaGVhZGVyLCA4LCAxKTsJLyogYmNQbGFuZXMgLSBtdXN0IGJlIDEgKi8KLSAgUFVUXzJCKGJtcGNvcmVoZWFkZXIsIDEwLCBiaXRzX3Blcl9waXhlbCk7IC8qIGJjQml0Q291bnQgKi8KLQotICBpZiAoSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGJtcGZpbGVoZWFkZXIsIDE0KSAhPSAoc2l6ZV90KSAxNCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOwotICBpZiAoSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGJtcGNvcmVoZWFkZXIsIDEyKSAhPSAoc2l6ZV90KSAxMikKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOwotCi0gIGlmIChjbWFwX2VudHJpZXMgPiAwKQotICAgIHdyaXRlX2NvbG9ybWFwKGNpbmZvLCBkZXN0LCBjbWFwX2VudHJpZXMsIDMpOwotfQotCi0KLS8qCi0gKiBXcml0ZSB0aGUgY29sb3JtYXAuCi0gKiBXaW5kb3dzIHVzZXMgQkdSMCBtYXAgZW50cmllczsgT1MvMiB1c2VzIEJHUiBlbnRyaWVzLgotICovCi0KLUxPQ0FMKHZvaWQpCi13cml0ZV9jb2xvcm1hcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm1wX2Rlc3RfcHRyIGRlc3QsCi0JCWludCBtYXBfY29sb3JzLCBpbnQgbWFwX2VudHJ5X3NpemUpCi17Ci0gIEpTQU1QQVJSQVkgY29sb3JtYXAgPSBjaW5mby0+Y29sb3JtYXA7Ci0gIGludCBudW1fY29sb3JzID0gY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOwotICBGSUxFICogb3V0ZmlsZSA9IGRlc3QtPnB1Yi5vdXRwdXRfZmlsZTsKLSAgaW50IGk7Ci0KLSAgaWYgKGNvbG9ybWFwICE9IE5VTEwpIHsKLSAgICBpZiAoY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID09IDMpIHsKLSAgICAgIC8qIE5vcm1hbCBjYXNlIHdpdGggUkdCIGNvbG9ybWFwICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbG9yczsgaSsrKSB7Ci0JcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzJdW2ldKSwgb3V0ZmlsZSk7Ci0JcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzFdW2ldKSwgb3V0ZmlsZSk7Ci0JcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzBdW2ldKSwgb3V0ZmlsZSk7Ci0JaWYgKG1hcF9lbnRyeV9zaXplID09IDQpCi0JICBwdXRjKDAsIG91dGZpbGUpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBHcmF5c2NhbGUgY29sb3JtYXAgKG9ubHkgaGFwcGVucyB3aXRoIGdyYXlzY2FsZSBxdWFudGl6YXRpb24pICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbG9yczsgaSsrKSB7Ci0JcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzBdW2ldKSwgb3V0ZmlsZSk7Ci0JcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzBdW2ldKSwgb3V0ZmlsZSk7Ci0JcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzBdW2ldKSwgb3V0ZmlsZSk7Ci0JaWYgKG1hcF9lbnRyeV9zaXplID09IDQpCi0JICBwdXRjKDAsIG91dGZpbGUpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBJZiBubyBjb2xvcm1hcCwgbXVzdCBiZSBncmF5c2NhbGUgZGF0YS4gIEdlbmVyYXRlIGEgbGluZWFyICJtYXAiLiAqLwotICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgcHV0YyhpLCBvdXRmaWxlKTsKLSAgICAgIHB1dGMoaSwgb3V0ZmlsZSk7Ci0gICAgICBwdXRjKGksIG91dGZpbGUpOwotICAgICAgaWYgKG1hcF9lbnRyeV9zaXplID09IDQpCi0JcHV0YygwLCBvdXRmaWxlKTsKLSAgICB9Ci0gIH0KLSAgLyogUGFkIGNvbG9ybWFwIHdpdGggemVyb3MgdG8gZW5zdXJlIHNwZWNpZmllZCBudW1iZXIgb2YgY29sb3JtYXAgZW50cmllcyAqLyAKLSAgaWYgKGkgPiBtYXBfY29sb3JzKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1RPT19NQU5ZX0NPTE9SUywgaSk7Ci0gIGZvciAoOyBpIDwgbWFwX2NvbG9yczsgaSsrKSB7Ci0gICAgcHV0YygwLCBvdXRmaWxlKTsKLSAgICBwdXRjKDAsIG91dGZpbGUpOwotICAgIHB1dGMoMCwgb3V0ZmlsZSk7Ci0gICAgaWYgKG1hcF9lbnRyeV9zaXplID09IDQpCi0gICAgICBwdXRjKDAsIG91dGZpbGUpOwotICB9Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfb3V0cHV0X2JtcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCi17Ci0gIGJtcF9kZXN0X3B0ciBkZXN0ID0gKGJtcF9kZXN0X3B0cikgZGluZm87Ci0gIHJlZ2lzdGVyIEZJTEUgKiBvdXRmaWxlID0gZGVzdC0+cHViLm91dHB1dF9maWxlOwotICBKU0FNUEFSUkFZIGltYWdlX3B0cjsKLSNpZiAoQklUU19JTl9KU0FNUExFICE9IDgpIHx8IGRlZmluZWQoTkVFRF9GQVJfUE9JTlRFUlMpCi0gIHJlZ2lzdGVyIEpTQU1QUk9XIGRhdGFfcHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSNlbmRpZgotICBKRElNRU5TSU9OIHJvdzsKLSAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOwotCi0gIC8qIFdyaXRlIHRoZSBoZWFkZXIgYW5kIGNvbG9ybWFwICovCi0gIGlmIChkZXN0LT5pc19vczIpCi0gICAgd3JpdGVfb3MyX2hlYWRlcihjaW5mbywgZGVzdCk7Ci0gIGVsc2UKLSAgICB3cml0ZV9ibXBfaGVhZGVyKGNpbmZvLCBkZXN0KTsKLQotICAvKiBXcml0ZSB0aGUgZmlsZSBib2R5IGZyb20gb3VyIHZpcnR1YWwgYXJyYXkgKi8KLSAgZm9yIChyb3cgPSBjaW5mby0+b3V0cHV0X2hlaWdodDsgcm93ID4gMDsgcm93LS0pIHsKLSAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2NvdW50ZXIgPSAobG9uZykgKGNpbmZvLT5vdXRwdXRfaGVpZ2h0IC0gcm93KTsKLSAgICAgIHByb2dyZXNzLT5wdWIucGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+b3V0cHV0X2hlaWdodDsKLSAgICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgIH0KLSAgICBpbWFnZV9wdHIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgZGVzdC0+d2hvbGVfaW1hZ2UsIHJvdy0xLCAoSkRJTUVOU0lPTikgMSwgRkFMU0UpOwotI2lmIChCSVRTX0lOX0pTQU1QTEUgPT0gOCkgJiYgIWRlZmluZWQoTkVFRF9GQVJfUE9JTlRFUlMpCi0gICAgaWYgKEpGV1JJVEUob3V0ZmlsZSwgaW1hZ2VfcHRyWzBdLCBkZXN0LT5yb3dfd2lkdGgpCi0JIT0gKHNpemVfdCkgZGVzdC0+cm93X3dpZHRoKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKLSNlbHNlCi0gICAgZGF0YV9wdHIgPSBpbWFnZV9wdHJbMF07Ci0gICAgZm9yIChjb2wgPSBkZXN0LT5yb3dfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgICBwdXRjKEdFVEpTQU1QTEUoKmRhdGFfcHRyKSwgb3V0ZmlsZSk7Ci0gICAgICBkYXRhX3B0cisrOwotICAgIH0KLSNlbmRpZgotICB9Ci0gIGlmIChwcm9ncmVzcyAhPSBOVUxMKQotICAgIHByb2dyZXNzLT5jb21wbGV0ZWRfZXh0cmFfcGFzc2VzKys7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIHdyb3RlIHRoZSBvdXRwdXQgZmlsZSBPSyAqLwotICBmZmx1c2gob3V0ZmlsZSk7Ci0gIGlmIChmZXJyb3Iob3V0ZmlsZSkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKLX0KLQotCi0vKgotICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgQk1QIGZvcm1hdCBvdXRwdXQuCi0gKi8KLQotR0xPQkFMKGRqcGVnX2Rlc3RfcHRyKQotamluaXRfd3JpdGVfYm1wIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzX29zMikKLXsKLSAgYm1wX2Rlc3RfcHRyIGRlc3Q7Ci0gIEpESU1FTlNJT04gcm93X3dpZHRoOwotCi0gIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCwgZmlsbCBpbiBtZXRob2QgcG9pbnRlcnMgKi8KLSAgZGVzdCA9IChibXBfZGVzdF9wdHIpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgU0laRU9GKGJtcF9kZXN0X3N0cnVjdCkpOwotICBkZXN0LT5wdWIuc3RhcnRfb3V0cHV0ID0gc3RhcnRfb3V0cHV0X2JtcDsKLSAgZGVzdC0+cHViLmZpbmlzaF9vdXRwdXQgPSBmaW5pc2hfb3V0cHV0X2JtcDsKLSAgZGVzdC0+aXNfb3MyID0gaXNfb3MyOwotCi0gIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpIHsKLSAgICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfZ3JheV9yb3dzOwotICB9IGVsc2UgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgewotICAgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKQotICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X2dyYXlfcm93czsKLSAgICBlbHNlCi0gICAgICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfcGl4ZWxfcm93czsKLSAgfSBlbHNlIHsKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9DT0xPUlNQQUNFKTsKLSAgfQotCi0gIC8qIENhbGN1bGF0ZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBzbyB3ZSBjYW4gYWxsb2NhdGUgc3BhY2UgKi8KLSAganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKGNpbmZvKTsKLQotICAvKiBEZXRlcm1pbmUgd2lkdGggb2Ygcm93cyBpbiB0aGUgQk1QIGZpbGUgKHBhZGRlZCB0byA0LWJ5dGUgYm91bmRhcnkpLiAqLwotICByb3dfd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dHB1dF9jb21wb25lbnRzOwotICBkZXN0LT5kYXRhX3dpZHRoID0gcm93X3dpZHRoOwotICB3aGlsZSAoKHJvd193aWR0aCAmIDMpICE9IDApIHJvd193aWR0aCsrOwotICBkZXN0LT5yb3dfd2lkdGggPSByb3dfd2lkdGg7Ci0gIGRlc3QtPnBhZF9ieXRlcyA9IChpbnQpIChyb3dfd2lkdGggLSBkZXN0LT5kYXRhX3dpZHRoKTsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgaW52ZXJzaW9uIGFycmF5LCBwcmVwYXJlIGZvciB3cml0ZSBwYXNzICovCi0gIGRlc3QtPndob2xlX2ltYWdlID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfc2FycmF5KQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAotICAgICByb3dfd2lkdGgsIGNpbmZvLT5vdXRwdXRfaGVpZ2h0LCAoSkRJTUVOU0lPTikgMSk7Ci0gIGRlc3QtPmN1cl9vdXRwdXRfcm93ID0gMDsKLSAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOwotICAgIHByb2dyZXNzLT50b3RhbF9leHRyYV9wYXNzZXMrKzsgLyogY291bnQgZmlsZSBpbnB1dCBhcyBzZXBhcmF0ZSBwYXNzICovCi0gIH0KLQotICAvKiBDcmVhdGUgZGVjb21wcmVzc29yIG91dHB1dCBidWZmZXIuICovCi0gIGRlc3QtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCByb3dfd2lkdGgsIChKRElNRU5TSU9OKSAxKTsKLSAgZGVzdC0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOwotCi0gIHJldHVybiAoZGpwZWdfZGVzdF9wdHIpIGRlc3Q7Ci19Ci0KLSNlbmRpZiAvKiBCTVBfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS93cmdpZi5jIGIvd3JnaWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVjZmFhOC4uMDAwMDAwMAotLS0gYS93cmdpZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA1ICswLDAgQEAKLS8qCi0gKiB3cmdpZi5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFdBUk5JTkc6IFlvdSB3aWxsIG5lZWQgYW4gTFpXIHBhdGVudCBsaWNlbnNlIGZyb20gVW5pc3lzIGluIG9yZGVyIHRvICAgKgotICogdXNlIHRoaXMgZmlsZSBsZWdhbGx5IGluIGFueSBjb21tZXJjaWFsIG9yIHNoYXJld2FyZSBhcHBsaWNhdGlvbi4gICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gd3JpdGUgb3V0cHV0IGltYWdlcyBpbiBHSUYgZm9ybWF0LgotICoKLSAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCi0gKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBvdXRwdXQgdG8KLSAqIGFuIG9yZGluYXJ5IHN0ZGlvIHN0cmVhbS4KLSAqLwotCi0vKgotICogVGhpcyBjb2RlIGlzIGxvb3NlbHkgYmFzZWQgb24gcHBtdG9naWYgZnJvbSB0aGUgUEJNUExVUyBkaXN0cmlidXRpb24KLSAqIG9mIEZlYi4gMTk5MS4gIFRoYXQgZmlsZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBub3RpY2U6Ci0gKiAgICBCYXNlZCBvbiBHSUZFTkNPREUgYnkgRGF2aWQgUm93bGV5IDxtZ2FyZGlAd2F0ZHNjdS53YXRlcmxvby5lZHU+LgotICogICAgTGVtcGVsLVppdiBjb21wcmVzc2lvbiBiYXNlZCBvbiAiY29tcHJlc3MiIGJ5IFNwZW5jZXIgVy4gVGhvbWFzIGV0IGFsLgotICogICAgQ29weXJpZ2h0IChDKSAxOTg5IGJ5IEplZiBQb3NrYW56ZXIuCi0gKiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqICAgIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQKLSAqICAgIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0gKiAgICBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0gKiAgICBkb2N1bWVudGF0aW9uLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvcgotICogICAgaW1wbGllZCB3YXJyYW50eS4KLSAqCi0gKiBXZSBhcmUgYWxzbyByZXF1aXJlZCB0byBzdGF0ZSB0aGF0Ci0gKiAgICAiVGhlIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdChjKSBpcyB0aGUgQ29weXJpZ2h0IHByb3BlcnR5IG9mCi0gKiAgICBDb21wdVNlcnZlIEluY29ycG9yYXRlZC4gR0lGKHNtKSBpcyBhIFNlcnZpY2UgTWFyayBwcm9wZXJ0eSBvZgotICogICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuIgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0KLSNpZmRlZiBHSUZfU1VQUE9SVEVECi0KLQotI2RlZmluZQlNQVhfTFpXX0JJVFMJMTIJLyogbWF4aW11bSBMWlcgY29kZSBzaXplICg0MDk2IHN5bWJvbHMpICovCi0KLXR5cGVkZWYgSU5UMTYgY29kZV9pbnQ7CQkvKiBtdXN0IGhvbGQgLTEgLi4gMioqTUFYX0xaV19CSVRTICovCi0KLSNkZWZpbmUgTFpXX1RBQkxFX1NJWkUJKChjb2RlX2ludCkgMSA8PCBNQVhfTFpXX0JJVFMpCi0KLSNkZWZpbmUgSFNJWkUJCTUwMDMJLyogaGFzaCB0YWJsZSBzaXplIGZvciA4MCUgb2NjdXBhbmN5ICovCi0KLXR5cGVkZWYgaW50IGhhc2hfaW50OwkJLyogbXVzdCBob2xkIC0yKkhTSVpFLi4yKkhTSVpFICovCi0KLSNkZWZpbmUgTUFYQ09ERShuX2JpdHMpCSgoKGNvZGVfaW50KSAxIDw8IChuX2JpdHMpKSAtIDEpCi0KLQotLyoKLSAqIFRoZSBMWlcgaGFzaCB0YWJsZSBjb25zaXN0cyBvZiB0d28gcGFyYWxsZWwgYXJyYXlzOgotICogICBoYXNoX2NvZGVbaV0JY29kZSBvZiBzeW1ib2wgaW4gc2xvdCBpLCBvciAwIGlmIGVtcHR5IHNsb3QKLSAqICAgaGFzaF92YWx1ZVtpXQlzeW1ib2wncyB2YWx1ZTsgdW5kZWZpbmVkIGlmIGVtcHR5IHNsb3QKLSAqIHdoZXJlIHNsb3QgdmFsdWVzIChpKSByYW5nZSBmcm9tIDAgdG8gSFNJWkUtMS4gIFRoZSBzeW1ib2wgdmFsdWUgaXMKLSAqIGl0cyBwcmVmaXggc3ltYm9sJ3MgY29kZSBjb25jYXRlbmF0ZWQgd2l0aCBpdHMgc3VmZml4IGNoYXJhY3Rlci4KLSAqCi0gKiBBbGdvcml0aG06ICB1c2Ugb3BlbiBhZGRyZXNzaW5nIGRvdWJsZSBoYXNoaW5nIChubyBjaGFpbmluZykgb24gdGhlCi0gKiBwcmVmaXggY29kZSAvIHN1ZmZpeCBjaGFyYWN0ZXIgY29tYmluYXRpb24uICBXZSBkbyBhIHZhcmlhbnQgb2YgS251dGgncwotICogYWxnb3JpdGhtIEQgKHZvbC4gMywgc2VjLiA2LjQpIGFsb25nIHdpdGggRy4gS25vdHQncyByZWxhdGl2ZWx5LXByaW1lCi0gKiBzZWNvbmRhcnkgcHJvYmUuCi0gKgotICogVGhlIGhhc2hfdmFsdWVbXSB0YWJsZSBpcyBhbGxvY2F0ZWQgZnJvbSBGQVIgaGVhcCBzcGFjZSBzaW5jZSBpdCB3b3VsZAotICogdXNlIHVwIHJhdGhlciBhIGxvdCBvZiB0aGUgbmVhciBkYXRhIHNwYWNlIGluIGEgUEMuCi0gKi8KLQotdHlwZWRlZiBJTlQzMiBoYXNoX2VudHJ5OwkvKiBtdXN0IGhvbGQgKGNvZGVfaW50PDw4KSB8IGJ5dGUgKi8KLQotI2RlZmluZSBIQVNIX0VOVFJZKHByZWZpeCxzdWZmaXgpICAoKCgoaGFzaF9lbnRyeSkgKHByZWZpeCkpIDw8IDgpIHwgKHN1ZmZpeCkpCi0KLQotLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIGRhdGEgZGVzdGluYXRpb24gb2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLwotCi0gIGpfZGVjb21wcmVzc19wdHIgY2luZm87CS8qIGJhY2sgbGluayBzYXZlcyBwYXNzaW5nIHNlcGFyYXRlIHBhcm0gKi8KLQotICAvKiBTdGF0ZSBmb3IgcGFja2luZyB2YXJpYWJsZS13aWR0aCBjb2RlcyBpbnRvIGEgYml0c3RyZWFtICovCi0gIGludCBuX2JpdHM7CQkJLyogY3VycmVudCBudW1iZXIgb2YgYml0cy9jb2RlICovCi0gIGNvZGVfaW50IG1heGNvZGU7CQkvKiBtYXhpbXVtIGNvZGUsIGdpdmVuIG5fYml0cyAqLwotICBpbnQgaW5pdF9iaXRzOwkJLyogaW5pdGlhbCBuX2JpdHMgLi4uIHJlc3RvcmVkIGFmdGVyIGNsZWFyICovCi0gIElOVDMyIGN1cl9hY2N1bTsJCS8qIGhvbGRzIGJpdHMgbm90IHlldCBvdXRwdXQgKi8KLSAgaW50IGN1cl9iaXRzOwkJCS8qICMgb2YgYml0cyBpbiBjdXJfYWNjdW0gKi8KLQotICAvKiBMWlcgc3RyaW5nIGNvbnN0cnVjdGlvbiAqLwotICBjb2RlX2ludCB3YWl0aW5nX2NvZGU7CS8qIHN5bWJvbCBub3QgeWV0IG91dHB1dDsgbWF5IGJlIGV4dGVuZGFibGUgKi8KLSAgYm9vbGVhbiBmaXJzdF9ieXRlOwkJLyogaWYgVFJVRSwgd2FpdGluZ19jb2RlIGlzIG5vdCB2YWxpZCAqLwotCi0gIC8qIFN0YXRlIGZvciBMWlcgY29kZSBhc3NpZ25tZW50ICovCi0gIGNvZGVfaW50IENsZWFyQ29kZTsJCS8qIGNsZWFyIGNvZGUgKGRvZXNuJ3QgY2hhbmdlKSAqLwotICBjb2RlX2ludCBFT0ZDb2RlOwkJLyogRU9GIGNvZGUgKGRpdHRvKSAqLwotICBjb2RlX2ludCBmcmVlX2NvZGU7CQkvKiBmaXJzdCBub3QteWV0LXVzZWQgc3ltYm9sIGNvZGUgKi8KLQotICAvKiBMWlcgaGFzaCB0YWJsZSAqLwotICBjb2RlX2ludCAqaGFzaF9jb2RlOwkJLyogPT4gaGFzaCB0YWJsZSBvZiBzeW1ib2wgY29kZXMgKi8KLSAgaGFzaF9lbnRyeSBGQVIgKmhhc2hfdmFsdWU7CS8qID0+IGhhc2ggdGFibGUgb2Ygc3ltYm9sIHZhbHVlcyAqLwotCi0gIC8qIEdJRiBkYXRhIHBhY2tldCBjb25zdHJ1Y3Rpb24gYnVmZmVyICovCi0gIGludCBieXRlc2lucGt0OwkJLyogIyBvZiBieXRlcyBpbiBjdXJyZW50IHBhY2tldCAqLwotICBjaGFyIHBhY2tldGJ1ZlsyNTZdOwkJLyogd29ya3NwYWNlIGZvciBhY2N1bXVsYXRpbmcgcGFja2V0ICovCi0KLX0gZ2lmX2Rlc3Rfc3RydWN0OwotCi10eXBlZGVmIGdpZl9kZXN0X3N0cnVjdCAqIGdpZl9kZXN0X3B0cjsKLQotCi0vKgotICogUm91dGluZXMgdG8gcGFja2FnZSBjb21wcmVzc2VkIGRhdGEgYnl0ZXMgaW50byBHSUYgZGF0YSBibG9ja3MuCi0gKiBBIGRhdGEgYmxvY2sgY29uc2lzdHMgb2YgYSBjb3VudCBieXRlICgxLi4yNTUpIGFuZCB0aGF0IG1hbnkgZGF0YSBieXRlcy4KLSAqLwotCi1MT0NBTCh2b2lkKQotZmx1c2hfcGFja2V0IChnaWZfZGVzdF9wdHIgZGluZm8pCi0vKiBmbHVzaCBhbnkgYWNjdW11bGF0ZWQgZGF0YSAqLwotewotICBpZiAoZGluZm8tPmJ5dGVzaW5wa3QgPiAwKSB7CS8qIG5ldmVyIHdyaXRlIHplcm8tbGVuZ3RoIHBhY2tldCAqLwotICAgIGRpbmZvLT5wYWNrZXRidWZbMF0gPSAoY2hhcikgZGluZm8tPmJ5dGVzaW5wa3QrKzsKLSAgICBpZiAoSkZXUklURShkaW5mby0+cHViLm91dHB1dF9maWxlLCBkaW5mby0+cGFja2V0YnVmLCBkaW5mby0+Ynl0ZXNpbnBrdCkKLQkhPSAoc2l6ZV90KSBkaW5mby0+Ynl0ZXNpbnBrdCkKLSAgICAgIEVSUkVYSVQoZGluZm8tPmNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOwotICAgIGRpbmZvLT5ieXRlc2lucGt0ID0gMDsKLSAgfQotfQotCi0KLS8qIEFkZCBhIGNoYXJhY3RlciB0byBjdXJyZW50IHBhY2tldDsgZmx1c2ggdG8gZGlzayBpZiBuZWNlc3NhcnkgKi8KLSNkZWZpbmUgQ0hBUl9PVVQoZGluZm8sYykgIFwKLQl7IChkaW5mbyktPnBhY2tldGJ1ZlsrKyhkaW5mbyktPmJ5dGVzaW5wa3RdID0gKGNoYXIpIChjKTsgIFwKLQkgICAgaWYgKChkaW5mbyktPmJ5dGVzaW5wa3QgPj0gMjU1KSAgXAotCSAgICAgIGZsdXNoX3BhY2tldChkaW5mbyk7ICBcCi0JfQotCi0KLS8qIFJvdXRpbmUgdG8gY29udmVydCB2YXJpYWJsZS13aWR0aCBjb2RlcyBpbnRvIGEgYnl0ZSBzdHJlYW0gKi8KLQotTE9DQUwodm9pZCkKLW91dHB1dCAoZ2lmX2Rlc3RfcHRyIGRpbmZvLCBjb2RlX2ludCBjb2RlKQotLyogRW1pdCBhIGNvZGUgb2Ygbl9iaXRzIGJpdHMgKi8KLS8qIFVzZXMgY3VyX2FjY3VtIGFuZCBjdXJfYml0cyB0byByZWJsb2NrIGludG8gOC1iaXQgYnl0ZXMgKi8KLXsKLSAgZGluZm8tPmN1cl9hY2N1bSB8PSAoKElOVDMyKSBjb2RlKSA8PCBkaW5mby0+Y3VyX2JpdHM7Ci0gIGRpbmZvLT5jdXJfYml0cyArPSBkaW5mby0+bl9iaXRzOwotCi0gIHdoaWxlIChkaW5mby0+Y3VyX2JpdHMgPj0gOCkgewotICAgIENIQVJfT1VUKGRpbmZvLCBkaW5mby0+Y3VyX2FjY3VtICYgMHhGRik7Ci0gICAgZGluZm8tPmN1cl9hY2N1bSA+Pj0gODsKLSAgICBkaW5mby0+Y3VyX2JpdHMgLT0gODsKLSAgfQotCi0gIC8qCi0gICAqIElmIHRoZSBuZXh0IGVudHJ5IGlzIGdvaW5nIHRvIGJlIHRvbyBiaWcgZm9yIHRoZSBjb2RlIHNpemUsCi0gICAqIHRoZW4gaW5jcmVhc2UgaXQsIGlmIHBvc3NpYmxlLiAgV2UgZG8gdGhpcyBoZXJlIHRvIGVuc3VyZQotICAgKiB0aGF0IGl0J3MgZG9uZSBpbiBzeW5jIHdpdGggdGhlIGRlY29kZXIncyBjb2Rlc2l6ZSBpbmNyZWFzZXMuCi0gICAqLwotICBpZiAoZGluZm8tPmZyZWVfY29kZSA+IGRpbmZvLT5tYXhjb2RlKSB7Ci0gICAgZGluZm8tPm5fYml0cysrOwotICAgIGlmIChkaW5mby0+bl9iaXRzID09IE1BWF9MWldfQklUUykKLSAgICAgIGRpbmZvLT5tYXhjb2RlID0gTFpXX1RBQkxFX1NJWkU7IC8qIGZyZWVfY29kZSB3aWxsIG5ldmVyIGV4Y2VlZCB0aGlzICovCi0gICAgZWxzZQotICAgICAgZGluZm8tPm1heGNvZGUgPSBNQVhDT0RFKGRpbmZvLT5uX2JpdHMpOwotICB9Ci19Ci0KLQotLyogVGhlIExaVyBhbGdvcml0aG0gcHJvcGVyICovCi0KLQotTE9DQUwodm9pZCkKLWNsZWFyX2hhc2ggKGdpZl9kZXN0X3B0ciBkaW5mbykKLS8qIEZpbGwgdGhlIGhhc2ggdGFibGUgd2l0aCBlbXB0eSBlbnRyaWVzICovCi17Ci0gIC8qIEl0J3Mgc3VmZmljaWVudCB0byB6ZXJvIGhhc2hfY29kZVtdICovCi0gIE1FTVpFUk8oZGluZm8tPmhhc2hfY29kZSwgSFNJWkUgKiBTSVpFT0YoY29kZV9pbnQpKTsKLX0KLQotCi1MT0NBTCh2b2lkKQotY2xlYXJfYmxvY2sgKGdpZl9kZXN0X3B0ciBkaW5mbykKLS8qIFJlc2V0IGNvbXByZXNzb3IgYW5kIGlzc3VlIGEgQ2xlYXIgY29kZSAqLwotewotICBjbGVhcl9oYXNoKGRpbmZvKTsJCQkvKiBkZWxldGUgYWxsIHRoZSBzeW1ib2xzICovCi0gIGRpbmZvLT5mcmVlX2NvZGUgPSBkaW5mby0+Q2xlYXJDb2RlICsgMjsKLSAgb3V0cHV0KGRpbmZvLCBkaW5mby0+Q2xlYXJDb2RlKTsJLyogaW5mb3JtIGRlY29kZXIgKi8KLSAgZGluZm8tPm5fYml0cyA9IGRpbmZvLT5pbml0X2JpdHM7CS8qIHJlc2V0IGNvZGUgc2l6ZSAqLwotICBkaW5mby0+bWF4Y29kZSA9IE1BWENPREUoZGluZm8tPm5fYml0cyk7Ci19Ci0KLQotTE9DQUwodm9pZCkKLWNvbXByZXNzX2luaXQgKGdpZl9kZXN0X3B0ciBkaW5mbywgaW50IGlfYml0cykKLS8qIEluaXRpYWxpemUgTFpXIGNvbXByZXNzb3IgKi8KLXsKLSAgLyogaW5pdCBhbGwgdGhlIHN0YXRlIHZhcmlhYmxlcyAqLwotICBkaW5mby0+bl9iaXRzID0gZGluZm8tPmluaXRfYml0cyA9IGlfYml0czsKLSAgZGluZm8tPm1heGNvZGUgPSBNQVhDT0RFKGRpbmZvLT5uX2JpdHMpOwotICBkaW5mby0+Q2xlYXJDb2RlID0gKChjb2RlX2ludCkgMSA8PCAoaV9iaXRzIC0gMSkpOwotICBkaW5mby0+RU9GQ29kZSA9IGRpbmZvLT5DbGVhckNvZGUgKyAxOwotICBkaW5mby0+ZnJlZV9jb2RlID0gZGluZm8tPkNsZWFyQ29kZSArIDI7Ci0gIGRpbmZvLT5maXJzdF9ieXRlID0gVFJVRTsJLyogbm8gd2FpdGluZyBzeW1ib2wgeWV0ICovCi0gIC8qIGluaXQgb3V0cHV0IGJ1ZmZlcmluZyB2YXJzICovCi0gIGRpbmZvLT5ieXRlc2lucGt0ID0gMDsKLSAgZGluZm8tPmN1cl9hY2N1bSA9IDA7Ci0gIGRpbmZvLT5jdXJfYml0cyA9IDA7Ci0gIC8qIGNsZWFyIGhhc2ggdGFibGUgKi8KLSAgY2xlYXJfaGFzaChkaW5mbyk7Ci0gIC8qIEdJRiBzcGVjaWZpZXMgYW4gaW5pdGlhbCBDbGVhciBjb2RlICovCi0gIG91dHB1dChkaW5mbywgZGluZm8tPkNsZWFyQ29kZSk7Ci19Ci0KLQotTE9DQUwodm9pZCkKLWNvbXByZXNzX2J5dGUgKGdpZl9kZXN0X3B0ciBkaW5mbywgaW50IGMpCi0vKiBBY2NlcHQgYW5kIGNvbXByZXNzIG9uZSA4LWJpdCBieXRlICovCi17Ci0gIHJlZ2lzdGVyIGhhc2hfaW50IGk7Ci0gIHJlZ2lzdGVyIGhhc2hfaW50IGRpc3A7Ci0gIHJlZ2lzdGVyIGhhc2hfZW50cnkgcHJvYmVfdmFsdWU7Ci0KLSAgaWYgKGRpbmZvLT5maXJzdF9ieXRlKSB7CS8qIG5lZWQgdG8gaW5pdGlhbGl6ZSB3YWl0aW5nX2NvZGUgKi8KLSAgICBkaW5mby0+d2FpdGluZ19jb2RlID0gYzsKLSAgICBkaW5mby0+Zmlyc3RfYnl0ZSA9IEZBTFNFOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFByb2JlIGhhc2ggdGFibGUgdG8gc2VlIGlmIGEgc3ltYm9sIGV4aXN0cyBmb3IKLSAgICogd2FpdGluZ19jb2RlIGZvbGxvd2VkIGJ5IGMuCi0gICAqIElmIHNvLCByZXBsYWNlIHdhaXRpbmdfY29kZSBieSB0aGF0IHN5bWJvbCBhbmQgcmV0dXJuLgotICAgKi8KLSAgaSA9ICgoaGFzaF9pbnQpIGMgPDwgKE1BWF9MWldfQklUUy04KSkgKyBkaW5mby0+d2FpdGluZ19jb2RlOwotICAvKiBpIGlzIGxlc3MgdGhhbiB0d2ljZSAyKipNQVhfTFpXX0JJVFMsIHRoZXJlZm9yZSBsZXNzIHRoYW4gdHdpY2UgSFNJWkUgKi8KLSAgaWYgKGkgPj0gSFNJWkUpCi0gICAgaSAtPSBIU0laRTsKLQotICBwcm9iZV92YWx1ZSA9IEhBU0hfRU5UUlkoZGluZm8tPndhaXRpbmdfY29kZSwgYyk7Ci0gIAotICBpZiAoZGluZm8tPmhhc2hfY29kZVtpXSAhPSAwKSB7IC8qIGlzIGZpcnN0IHByb2JlZCBzbG90IGVtcHR5PyAqLwotICAgIGlmIChkaW5mby0+aGFzaF92YWx1ZVtpXSA9PSBwcm9iZV92YWx1ZSkgewotICAgICAgZGluZm8tPndhaXRpbmdfY29kZSA9IGRpbmZvLT5oYXNoX2NvZGVbaV07Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChpID09IDApCQkJLyogc2Vjb25kYXJ5IGhhc2ggKGFmdGVyIEcuIEtub3R0KSAqLwotICAgICAgZGlzcCA9IDE7Ci0gICAgZWxzZQotICAgICAgZGlzcCA9IEhTSVpFIC0gaTsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICBpIC09IGRpc3A7Ci0gICAgICBpZiAoaSA8IDApCi0JaSArPSBIU0laRTsKLSAgICAgIGlmIChkaW5mby0+aGFzaF9jb2RlW2ldID09IDApCi0JYnJlYWs7CQkJLyogaGl0IGVtcHR5IHNsb3QgKi8KLSAgICAgIGlmIChkaW5mby0+aGFzaF92YWx1ZVtpXSA9PSBwcm9iZV92YWx1ZSkgewotCWRpbmZvLT53YWl0aW5nX2NvZGUgPSBkaW5mby0+aGFzaF9jb2RlW2ldOwotCXJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBoZXJlIHdoZW4gaGFzaHRhYmxlW2ldIGlzIGFuIGVtcHR5IHNsb3Q7IGRlc2lyZWQgc3ltYm9sIG5vdCBpbiB0YWJsZSAqLwotICBvdXRwdXQoZGluZm8sIGRpbmZvLT53YWl0aW5nX2NvZGUpOwotICBpZiAoZGluZm8tPmZyZWVfY29kZSA8IExaV19UQUJMRV9TSVpFKSB7Ci0gICAgZGluZm8tPmhhc2hfY29kZVtpXSA9IGRpbmZvLT5mcmVlX2NvZGUrKzsgLyogYWRkIHN5bWJvbCB0byBoYXNodGFibGUgKi8KLSAgICBkaW5mby0+aGFzaF92YWx1ZVtpXSA9IHByb2JlX3ZhbHVlOwotICB9IGVsc2UKLSAgICBjbGVhcl9ibG9jayhkaW5mbyk7Ci0gIGRpbmZvLT53YWl0aW5nX2NvZGUgPSBjOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1jb21wcmVzc190ZXJtIChnaWZfZGVzdF9wdHIgZGluZm8pCi0vKiBDbGVhbiB1cCBhdCBlbmQgKi8KLXsKLSAgLyogRmx1c2ggb3V0IHRoZSBidWZmZXJlZCBjb2RlICovCi0gIGlmICghIGRpbmZvLT5maXJzdF9ieXRlKQotICAgIG91dHB1dChkaW5mbywgZGluZm8tPndhaXRpbmdfY29kZSk7Ci0gIC8qIFNlbmQgYW4gRU9GIGNvZGUgKi8KLSAgb3V0cHV0KGRpbmZvLCBkaW5mby0+RU9GQ29kZSk7Ci0gIC8qIEZsdXNoIHRoZSBiaXQtcGFja2luZyBidWZmZXIgKi8KLSAgaWYgKGRpbmZvLT5jdXJfYml0cyA+IDApIHsKLSAgICBDSEFSX09VVChkaW5mbywgZGluZm8tPmN1cl9hY2N1bSAmIDB4RkYpOwotICB9Ci0gIC8qIEZsdXNoIHRoZSBwYWNrZXQgYnVmZmVyICovCi0gIGZsdXNoX3BhY2tldChkaW5mbyk7Ci19Ci0KLQotLyogR0lGIGhlYWRlciBjb25zdHJ1Y3Rpb24gKi8KLQotCi1MT0NBTCh2b2lkKQotcHV0X3dvcmQgKGdpZl9kZXN0X3B0ciBkaW5mbywgdW5zaWduZWQgaW50IHcpCi0vKiBFbWl0IGEgMTYtYml0IHdvcmQsIExTQiBmaXJzdCAqLwotewotICBwdXRjKHcgJiAweEZGLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLSAgcHV0YygodyA+PiA4KSAmIDB4RkYsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1wdXRfM2J5dGVzIChnaWZfZGVzdF9wdHIgZGluZm8sIGludCB2YWwpCi0vKiBFbWl0IDMgY29waWVzIG9mIHNhbWUgYnl0ZSB2YWx1ZSAtLS0gaGFuZHkgc3ViciBmb3IgY29sb3JtYXAgY29uc3RydWN0aW9uICovCi17Ci0gIHB1dGModmFsLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLSAgcHV0Yyh2YWwsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotICBwdXRjKHZhbCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci19Ci0KLQotTE9DQUwodm9pZCkKLWVtaXRfaGVhZGVyIChnaWZfZGVzdF9wdHIgZGluZm8sIGludCBudW1fY29sb3JzLCBKU0FNUEFSUkFZIGNvbG9ybWFwKQotLyogT3V0cHV0IHRoZSBHSUYgZmlsZSBoZWFkZXIsIGluY2x1ZGluZyBjb2xvciBtYXAgKi8KLS8qIElmIGNvbG9ybWFwPT1OVUxMLCBzeW50aGVzaXplIGEgZ3JheS1zY2FsZSBjb2xvcm1hcCAqLwotewotICBpbnQgQml0c1BlclBpeGVsLCBDb2xvck1hcFNpemUsIEluaXRDb2RlU2l6ZSwgRmxhZ0J5dGU7Ci0gIGludCBjc2hpZnQgPSBkaW5mby0+Y2luZm8tPmRhdGFfcHJlY2lzaW9uIC0gODsKLSAgaW50IGk7Ci0KLSAgaWYgKG51bV9jb2xvcnMgPiAyNTYpCi0gICAgRVJSRVhJVDEoZGluZm8tPmNpbmZvLCBKRVJSX1RPT19NQU5ZX0NPTE9SUywgbnVtX2NvbG9ycyk7Ci0gIC8qIENvbXB1dGUgYml0cy9waXhlbCBhbmQgcmVsYXRlZCB2YWx1ZXMgKi8KLSAgQml0c1BlclBpeGVsID0gMTsKLSAgd2hpbGUgKG51bV9jb2xvcnMgPiAoMSA8PCBCaXRzUGVyUGl4ZWwpKQotICAgIEJpdHNQZXJQaXhlbCsrOwotICBDb2xvck1hcFNpemUgPSAxIDw8IEJpdHNQZXJQaXhlbDsKLSAgaWYgKEJpdHNQZXJQaXhlbCA8PSAxKQotICAgIEluaXRDb2RlU2l6ZSA9IDI7Ci0gIGVsc2UKLSAgICBJbml0Q29kZVNpemUgPSBCaXRzUGVyUGl4ZWw7Ci0gIC8qCi0gICAqIFdyaXRlIHRoZSBHSUYgaGVhZGVyLgotICAgKiBOb3RlIHRoYXQgd2UgZ2VuZXJhdGUgYSBwbGFpbiBHSUY4NyBoZWFkZXIgZm9yIG1heGltdW0gY29tcGF0aWJpbGl0eS4KLSAgICovCi0gIHB1dGMoJ0cnLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLSAgcHV0YygnSScsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotICBwdXRjKCdGJywgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIHB1dGMoJzgnLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLSAgcHV0YygnNycsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotICBwdXRjKCdhJywgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIC8qIFdyaXRlIHRoZSBMb2dpY2FsIFNjcmVlbiBEZXNjcmlwdG9yICovCi0gIHB1dF93b3JkKGRpbmZvLCAodW5zaWduZWQgaW50KSBkaW5mby0+Y2luZm8tPm91dHB1dF93aWR0aCk7Ci0gIHB1dF93b3JkKGRpbmZvLCAodW5zaWduZWQgaW50KSBkaW5mby0+Y2luZm8tPm91dHB1dF9oZWlnaHQpOwotICBGbGFnQnl0ZSA9IDB4ODA7CQkvKiBZZXMsIHRoZXJlIGlzIGEgZ2xvYmFsIGNvbG9yIHRhYmxlICovCi0gIEZsYWdCeXRlIHw9IChCaXRzUGVyUGl4ZWwtMSkgPDwgNDsgLyogY29sb3IgcmVzb2x1dGlvbiAqLwotICBGbGFnQnl0ZSB8PSAoQml0c1BlclBpeGVsLTEpOwkvKiBzaXplIG9mIGdsb2JhbCBjb2xvciB0YWJsZSAqLwotICBwdXRjKEZsYWdCeXRlLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLSAgcHV0YygwLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsgLyogQmFja2dyb3VuZCBjb2xvciBpbmRleCAqLwotICBwdXRjKDAsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOyAvKiBSZXNlcnZlZCAoYXNwZWN0IHJhdGlvIGluIEdJRjg5KSAqLwotICAvKiBXcml0ZSB0aGUgR2xvYmFsIENvbG9yIE1hcCAqLwotICAvKiBJZiB0aGUgY29sb3IgbWFwIGlzIG1vcmUgdGhhbiA4IGJpdHMgcHJlY2lzaW9uLCAqLwotICAvKiB3ZSByZWR1Y2UgaXQgdG8gOCBiaXRzIGJ5IHNoaWZ0aW5nICovCi0gIGZvciAoaT0wOyBpIDwgQ29sb3JNYXBTaXplOyBpKyspIHsKLSAgICBpZiAoaSA8IG51bV9jb2xvcnMpIHsKLSAgICAgIGlmIChjb2xvcm1hcCAhPSBOVUxMKSB7Ci0JaWYgKGRpbmZvLT5jaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKLQkgIC8qIE5vcm1hbCBjYXNlOiBSR0IgY29sb3IgbWFwICovCi0JICBwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMF1baV0pID4+IGNzaGlmdCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0JICBwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMV1baV0pID4+IGNzaGlmdCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0JICBwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMl1baV0pID4+IGNzaGlmdCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0JfSBlbHNlIHsKLQkgIC8qIEdyYXlzY2FsZSAiY29sb3IgbWFwIjogcG9zc2libGUgaWYgcXVhbnRpemluZyBncmF5c2NhbGUgaW1hZ2UgKi8KLQkgIHB1dF8zYnl0ZXMoZGluZm8sIEdFVEpTQU1QTEUoY29sb3JtYXBbMF1baV0pID4+IGNzaGlmdCk7Ci0JfQotICAgICAgfSBlbHNlIHsKLQkvKiBDcmVhdGUgYSBncmF5LXNjYWxlIG1hcCBvZiBudW1fY29sb3JzIHZhbHVlcywgcmFuZ2UgMC4uMjU1ICovCi0JcHV0XzNieXRlcyhkaW5mbywgKGkgKiAyNTUgKyAobnVtX2NvbG9ycy0xKS8yKSAvIChudW1fY29sb3JzLTEpKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLyogZmlsbCBvdXQgdGhlIG1hcCB0byBhIHBvd2VyIG9mIDIgKi8KLSAgICAgIHB1dF8zYnl0ZXMoZGluZm8sIDApOwotICAgIH0KLSAgfQotICAvKiBXcml0ZSBpbWFnZSBzZXBhcmF0b3IgYW5kIEltYWdlIERlc2NyaXB0b3IgKi8KLSAgcHV0YygnLCcsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOyAvKiBzZXBhcmF0b3IgKi8KLSAgcHV0X3dvcmQoZGluZm8sIDApOwkJLyogbGVmdC90b3Agb2Zmc2V0ICovCi0gIHB1dF93b3JkKGRpbmZvLCAwKTsKLSAgcHV0X3dvcmQoZGluZm8sICh1bnNpZ25lZCBpbnQpIGRpbmZvLT5jaW5mby0+b3V0cHV0X3dpZHRoKTsgLyogaW1hZ2Ugc2l6ZSAqLwotICBwdXRfd29yZChkaW5mbywgKHVuc2lnbmVkIGludCkgZGluZm8tPmNpbmZvLT5vdXRwdXRfaGVpZ2h0KTsKLSAgLyogZmxhZyBieXRlOiBub3QgaW50ZXJsYWNlZCwgbm8gbG9jYWwgY29sb3IgbWFwICovCi0gIHB1dGMoMHgwMCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIC8qIFdyaXRlIEluaXRpYWwgQ29kZSBTaXplIGJ5dGUgKi8KLSAgcHV0YyhJbml0Q29kZVNpemUsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotCi0gIC8qIEluaXRpYWxpemUgZm9yIExaVyBjb21wcmVzc2lvbiBvZiBpbWFnZSBkYXRhICovCi0gIGNvbXByZXNzX2luaXQoZGluZm8sIEluaXRDb2RlU2l6ZSsxKTsKLX0KLQotCi0vKgotICogU3RhcnR1cDogd3JpdGUgdGhlIGZpbGUgaGVhZGVyLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfb3V0cHV0X2dpZiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCi17Ci0gIGdpZl9kZXN0X3B0ciBkZXN0ID0gKGdpZl9kZXN0X3B0cikgZGluZm87Ci0KLSAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpCi0gICAgZW1pdF9oZWFkZXIoZGVzdCwgY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzLCBjaW5mby0+Y29sb3JtYXApOwotICBlbHNlCi0gICAgZW1pdF9oZWFkZXIoZGVzdCwgMjU2LCAoSlNBTVBBUlJBWSkgTlVMTCk7Ci19Ci0KLQotLyoKLSAqIFdyaXRlIHNvbWUgcGl4ZWwgZGF0YS4KLSAqIEluIHRoaXMgbW9kdWxlIHJvd3Nfc3VwcGxpZWQgd2lsbCBhbHdheXMgYmUgMS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXB1dF9waXhlbF9yb3dzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKLQkJSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQotewotICBnaWZfZGVzdF9wdHIgZGVzdCA9IChnaWZfZGVzdF9wdHIpIGRpbmZvOwotICByZWdpc3RlciBKU0FNUFJPVyBwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotCi0gIHB0ciA9IGRlc3QtPnB1Yi5idWZmZXJbMF07Ci0gIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICBjb21wcmVzc19ieXRlKGRlc3QsIEdFVEpTQU1QTEUoKnB0cisrKSk7Ci0gIH0KLX0KLQotCi0vKgotICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfb3V0cHV0X2dpZiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCi17Ci0gIGdpZl9kZXN0X3B0ciBkZXN0ID0gKGdpZl9kZXN0X3B0cikgZGluZm87Ci0KLSAgLyogRmx1c2ggTFpXIG1lY2hhbmlzbSAqLwotICBjb21wcmVzc190ZXJtKGRlc3QpOwotICAvKiBXcml0ZSBhIHplcm8tbGVuZ3RoIGRhdGEgYmxvY2sgdG8gZW5kIHRoZSBzZXJpZXMgKi8KLSAgcHV0YygwLCBkZXN0LT5wdWIub3V0cHV0X2ZpbGUpOwotICAvKiBXcml0ZSB0aGUgR0lGIHRlcm1pbmF0b3IgbWFyayAqLwotICBwdXRjKCc7JywgZGVzdC0+cHViLm91dHB1dF9maWxlKTsKLSAgLyogTWFrZSBzdXJlIHdlIHdyb3RlIHRoZSBvdXRwdXQgZmlsZSBPSyAqLwotICBmZmx1c2goZGVzdC0+cHViLm91dHB1dF9maWxlKTsKLSAgaWYgKGZlcnJvcihkZXN0LT5wdWIub3V0cHV0X2ZpbGUpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7Ci19Ci0KLQotLyoKLSAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIEdJRiBmb3JtYXQgb3V0cHV0LgotICovCi0KLUdMT0JBTChkanBlZ19kZXN0X3B0cikKLWppbml0X3dyaXRlX2dpZiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgZ2lmX2Rlc3RfcHRyIGRlc3Q7Ci0KLSAgLyogQ3JlYXRlIG1vZHVsZSBpbnRlcmZhY2Ugb2JqZWN0LCBmaWxsIGluIG1ldGhvZCBwb2ludGVycyAqLwotICBkZXN0ID0gKGdpZl9kZXN0X3B0cikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBTSVpFT0YoZ2lmX2Rlc3Rfc3RydWN0KSk7Ci0gIGRlc3QtPmNpbmZvID0gY2luZm87CQkvKiBtYWtlIGJhY2sgbGluayBmb3Igc3Vicm91dGluZXMgKi8KLSAgZGVzdC0+cHViLnN0YXJ0X291dHB1dCA9IHN0YXJ0X291dHB1dF9naWY7Ci0gIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9waXhlbF9yb3dzOwotICBkZXN0LT5wdWIuZmluaXNoX291dHB1dCA9IGZpbmlzaF9vdXRwdXRfZ2lmOwotCi0gIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlICE9IEpDU19HUkFZU0NBTEUgJiYKLSAgICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgIT0gSkNTX1JHQikKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0dJRl9DT0xPUlNQQUNFKTsKLQotICAvKiBGb3JjZSBxdWFudGl6YXRpb24gaWYgY29sb3Igb3IgaWYgPiA4IGJpdHMgaW5wdXQgKi8KLSAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgIT0gSkNTX0dSQVlTQ0FMRSB8fCBjaW5mby0+ZGF0YV9wcmVjaXNpb24gPiA4KSB7Ci0gICAgLyogRm9yY2UgcXVhbnRpemF0aW9uIHRvIGF0IG1vc3QgMjU2IGNvbG9ycyAqLwotICAgIGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgPSBUUlVFOwotICAgIGlmIChjaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzID4gMjU2KQotICAgICAgY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9ycyA9IDI1NjsKLSAgfQotCi0gIC8qIENhbGN1bGF0ZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBzbyB3ZSBjYW4gYWxsb2NhdGUgc3BhY2UgKi8KLSAganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKGNpbmZvKTsKLQotICBpZiAoY2luZm8tPm91dHB1dF9jb21wb25lbnRzICE9IDEpIC8qIHNhZmV0eSBjaGVjazoganVzdCBvbmUgY29tcG9uZW50PyAqLwotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfR0lGX0JVRyk7Ci0KLSAgLyogQ3JlYXRlIGRlY29tcHJlc3NvciBvdXRwdXQgYnVmZmVyLiAqLwotICBkZXN0LT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgY2luZm8tPm91dHB1dF93aWR0aCwgKEpESU1FTlNJT04pIDEpOwotICBkZXN0LT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIGhhc2ggdGFibGUgKi8KLSAgZGVzdC0+aGFzaF9jb2RlID0gKGNvZGVfaW50ICopCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlIU0laRSAqIFNJWkVPRihjb2RlX2ludCkpOwotICBkZXN0LT5oYXNoX3ZhbHVlID0gKGhhc2hfZW50cnkgRkFSICopCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlIU0laRSAqIFNJWkVPRihoYXNoX2VudHJ5KSk7Ci0KLSAgcmV0dXJuIChkanBlZ19kZXN0X3B0cikgZGVzdDsKLX0KLQotI2VuZGlmIC8qIEdJRl9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL3dyanBnY29tLjEgYi93cmpwZ2NvbS4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDE5YTk5Li4wMDAwMDAwCi0tLSBhL3dyanBnY29tLjEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLlRIIFdSSlBHQ09NIDEgIjE1IEp1bmUgMTk5NSIKLS5TSCBOQU1FCi13cmpwZ2NvbSBcLSBpbnNlcnQgdGV4dCBjb21tZW50cyBpbnRvIGEgSlBFRyBmaWxlCi0uU0ggU1lOT1BTSVMKLS5CIHdyanBnY29tCi1bCi0uQiBcLXJlcGxhY2UKLV0KLVsKLS5CSSBcLWNvbW1lbnQgIiB0ZXh0IgotXQotWwotLkJJIFwtY2ZpbGUgIiBuYW1lIgotXQotWwotLkkgZmlsZW5hbWUKLV0KLS5MUAotLlNIIERFU0NSSVBUSU9OCi0uTFAKLS5CIHdyanBnY29tCi1yZWFkcyB0aGUgbmFtZWQgSlBFRy9KRklGIGZpbGUsIG9yIHRoZSBzdGFuZGFyZCBpbnB1dCBpZiBubyBmaWxlIGlzIG5hbWVkLAotYW5kIGdlbmVyYXRlcyBhIG5ldyBKUEVHL0pGSUYgZmlsZSBvbiBzdGFuZGFyZCBvdXRwdXQuICBBIGNvbW1lbnQgYmxvY2sgaXMKLWFkZGVkIHRvIHRoZSBmaWxlLgotLlBQCi1UaGUgSlBFRyBzdGFuZGFyZCBhbGxvd3MgImNvbW1lbnQiIChDT00pIGJsb2NrcyB0byBvY2N1ciB3aXRoaW4gYSBKUEVHIGZpbGUuCi1BbHRob3VnaCB0aGUgc3RhbmRhcmQgZG9lc24ndCBhY3R1YWxseSBkZWZpbmUgd2hhdCBDT00gYmxvY2tzIGFyZSBmb3IsIHRoZXkKLWFyZSB3aWRlbHkgdXNlZCB0byBob2xkIHVzZXItc3VwcGxpZWQgdGV4dCBzdHJpbmdzLiAgVGhpcyBsZXRzIHlvdSBhZGQKLWFubm90YXRpb25zLCB0aXRsZXMsIGluZGV4IHRlcm1zLCBldGMgdG8geW91ciBKUEVHIGZpbGVzLCBhbmQgbGF0ZXIgcmV0cmlldmUKLXRoZW0gYXMgdGV4dC4gIENPTSBibG9ja3MgZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZSBpbWFnZSBzdG9yZWQgaW4gdGhlIEpQRUcKLWZpbGUuICBUaGUgbWF4aW11bSBzaXplIG9mIGEgQ09NIGJsb2NrIGlzIDY0SywgYnV0IHlvdSBjYW4gaGF2ZSBhcyBtYW55IG9mCi10aGVtIGFzIHlvdSBsaWtlIGluIG9uZSBKUEVHIGZpbGUuCi0uUFAKLS5CIHdyanBnY29tCi1hZGRzIGEgQ09NIGJsb2NrLCBjb250YWluaW5nIHRleHQgeW91IHByb3ZpZGUsIHRvIGEgSlBFRyBmaWxlLgotT3JkaW5hcmlseSwgdGhlIENPTSBibG9jayBpcyBhZGRlZCBhZnRlciBhbnkgZXhpc3RpbmcgQ09NIGJsb2NrczsgYnV0IHlvdQotY2FuIGRlbGV0ZSB0aGUgb2xkIENPTSBibG9ja3MgaWYgeW91IHdpc2guCi0uU0ggT1BUSU9OUwotU3dpdGNoIG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCwgYW5kIGFyZSBub3QgY2FzZSBzZW5zaXRpdmUuCi0uVFAKLS5CIFwtcmVwbGFjZQotRGVsZXRlIGFueSBleGlzdGluZyBDT00gYmxvY2tzIGZyb20gdGhlIGZpbGUuCi0uVFAKLS5CSSBcLWNvbW1lbnQgIiB0ZXh0IgotU3VwcGx5IHRleHQgZm9yIG5ldyBDT00gYmxvY2sgb24gY29tbWFuZCBsaW5lLgotLlRQCi0uQkkgXC1jZmlsZSAiIG5hbWUiCi1SZWFkIHRleHQgZm9yIG5ldyBDT00gYmxvY2sgZnJvbSBuYW1lZCBmaWxlLgotLlBQCi1JZiB5b3UgaGF2ZSBvbmx5IG9uZSBsaW5lIG9mIGNvbW1lbnQgdGV4dCB0byBhZGQsIHlvdSBjYW4gcHJvdmlkZSBpdCBvbiB0aGUKLWNvbW1hbmQgbGluZSB3aXRoCi0uQlIgXC1jb21tZW50IC4KLVRoZSBjb21tZW50IHRleHQgbXVzdCBiZSBzdXJyb3VuZGVkIHdpdGggcXVvdGVzIHNvIHRoYXQgaXQgaXMgdHJlYXRlZCBhcyBhCi1zaW5nbGUgYXJndW1lbnQuICBMb25nZXIgY29tbWVudHMgY2FuIGJlIHJlYWQgZnJvbSBhIHRleHQgZmlsZS4KLS5QUAotSWYgeW91IGdpdmUgbmVpdGhlcgotLkIgXC1jb21tZW50Ci1ub3IKLS5CUiBcLWNmaWxlICwKLXRoZW4KLS5CIHdyanBnY29tCi13aWxsIHJlYWQgdGhlIGNvbW1lbnQgdGV4dCBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKEluIHRoaXMgY2FzZSBhbiBpbnB1dCBpbWFnZQotZmlsZSBuYW1lIE1VU1QgYmUgc3VwcGxpZWQsIHNvIHRoYXQgdGhlIHNvdXJjZSBKUEVHIGZpbGUgY29tZXMgZnJvbSBzb21ld2hlcmUKLWVsc2UuKSAgWW91IGNhbiBlbnRlciBtdWx0aXBsZSBsaW5lcywgdXAgdG8gNjRLQiB3b3J0aC4gIFR5cGUgYW4gZW5kLW9mLWZpbGUKLWluZGljYXRvciAodXN1YWxseSBjb250cm9sLUQpIHRvIHRlcm1pbmF0ZSB0aGUgY29tbWVudCB0ZXh0IGVudHJ5LgotLlBQCi0uQiB3cmpwZ2NvbQotd2lsbCBub3QgYWRkIGEgQ09NIGJsb2NrIGlmIHRoZSBwcm92aWRlZCBjb21tZW50IHN0cmluZyBpcyBlbXB0eS4gIFRoZXJlZm9yZQotXGZCXC1yZXBsYWNlIFwtY29tbWVudCAiIlxmUiBjYW4gYmUgdXNlZCB0byBkZWxldGUgYWxsIENPTSBibG9ja3MgZnJvbSBhIGZpbGUuCi0uU0ggRVhBTVBMRVMKLS5MUAotQWRkIGEgc2hvcnQgY29tbWVudCB0byBpbi5qcGcsIHByb2R1Y2luZyBvdXQuanBnOgotLklQCi0uQiB3cmpwZ2NvbSBcLWMKLVxmSSJWaWV3IG9mIG15IGJhY2sgeWFyZCIgaW4uanBnCi0uQiA+Ci0uSSBvdXQuanBnCi0uUFAKLUF0dGFjaCBhIGxvbmcgY29tbWVudCBwcmV2aW91c2x5IHN0b3JlZCBpbiBjb21tZW50LnR4dDoKLS5JUAotLkIgd3JqcGdjb20KLS5JIGluLmpwZwotLkIgPAotLkkgY29tbWVudC50eHQKLS5CID4KLS5JIG91dC5qcGcKLS5QUAotb3IgZXF1aXZhbGVudGx5Ci0uSVAKLS5CIHdyanBnY29tCi0uQiAtY2ZpbGUKLS5JIGNvbW1lbnQudHh0Ci0uQiA8Ci0uSSBpbi5qcGcKLS5CID4KLS5JIG91dC5qcGcKLS5TSCBTRUUgQUxTTwotLkJSIGNqcGVnICgxKSwKLS5CUiBkanBlZyAoMSksCi0uQlIganBlZ3RyYW4gKDEpLAotLkJSIHJkanBnY29tICgxKQotLlNIIEFVVEhPUgotSW5kZXBlbmRlbnQgSlBFRyBHcm91cApkaWZmIC0tZ2l0IGEvd3JqcGdjb20uYyBiL3dyanBnY29tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMDRiMDUuLjAwMDAwMDAKLS0tIGEvd3JqcGdjb20uYworKysgL2Rldi9udWxsCkBAIC0xLDU4MyArMCwwIEBACi0vKgotICogd3JqcGdjb20uYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgdmVyeSBzaW1wbGUgc3RhbmQtYWxvbmUgYXBwbGljYXRpb24gdGhhdCBpbnNlcnRzCi0gKiB1c2VyLXN1cHBsaWVkIHRleHQgYXMgYSBDT00gKGNvbW1lbnQpIG1hcmtlciBpbiBhIEpGSUYgZmlsZS4KLSAqIFRoaXMgbWF5IGJlIHVzZWZ1bCBhcyBhbiBleGFtcGxlIG9mIHRoZSBtaW5pbXVtIGxvZ2ljIG5lZWRlZCB0byBwYXJzZQotICogSlBFRyBtYXJrZXJzLgotICovCi0KLSNkZWZpbmUgSlBFR19DSlBFR19ESlBFRwkvKiB0byBnZXQgdGhlIGNvbW1hbmQtbGluZSBjb25maWcgc3ltYm9scyAqLwotI2luY2x1ZGUgImppbmNsdWRlLmgiCQkvKiBnZXQgYXV0by1jb25maWcgc3ltYm9scywgPHN0ZGlvLmg+ICovCi0KLSNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSBtYWxsb2MoKSAqLwotZXh0ZXJuIHZvaWQgKiBtYWxsb2MgKCk7Ci0jZW5kaWYKLSNpbmNsdWRlIDxjdHlwZS5oPgkJLyogdG8gZGVjbGFyZSBpc3VwcGVyKCksIHRvbG93ZXIoKSAqLwotI2lmZGVmIFVTRV9TRVRNT0RFCi0jaW5jbHVkZSA8ZmNudGwuaD4JCS8qIHRvIGRlY2xhcmUgc2V0bW9kZSgpJ3MgcGFyYW1ldGVyIG1hY3JvcyAqLwotLyogSWYgeW91IGhhdmUgc2V0bW9kZSgpIGJ1dCBub3QgPGlvLmg+LCBqdXN0IGRlbGV0ZSB0aGlzIGxpbmU6ICovCi0jaW5jbHVkZSA8aW8uaD4JCQkvKiB0byBkZWNsYXJlIHNldG1vZGUoKSAqLwotI2VuZGlmCi0KLSNpZmRlZiBVU0VfQ0NPTU1BTkQJCS8qIGNvbW1hbmQtbGluZSByZWFkZXIgZm9yIE1hY2ludG9zaCAqLwotI2lmZGVmIF9fTVdFUktTX18KLSNpbmNsdWRlIDxTSU9VWC5oPiAgICAgICAgICAgICAgLyogTWV0cm93ZXJrcyBuZWVkcyB0aGlzICovCi0jaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogLi4uIGFuZCB0aGlzICovCi0jZW5kaWYKLSNpZmRlZiBUSElOS19DCi0jaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogVGhpbmsgZGVjbGFyZXMgaXQgaGVyZSAqLwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERPTlRfVVNFX0JfTU9ERQkJLyogZGVmaW5lIG1vZGUgcGFyYW1ldGVycyBmb3IgZm9wZW4oKSAqLwotI2RlZmluZSBSRUFEX0JJTkFSWQkiciIKLSNkZWZpbmUgV1JJVEVfQklOQVJZCSJ3IgotI2Vsc2UKLSNpZmRlZiBWTVMJCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLwotI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiLCAiY3R4PXN0bSIKLSNkZWZpbmUgV1JJVEVfQklOQVJZCSJ3YiIsICJjdHg9c3RtIgotI2Vsc2UJCQkJLyogc3RhbmRhcmQgQU5TSS1jb21wbGlhbnQgY2FzZSAqLwotI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiCi0jZGVmaW5lIFdSSVRFX0JJTkFSWQkid2IiCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEVYSVRfRkFJTFVSRQkJLyogZGVmaW5lIGV4aXQoKSBjb2RlcyBpZiBub3QgcHJvdmlkZWQgKi8KLSNkZWZpbmUgRVhJVF9GQUlMVVJFICAxCi0jZW5kaWYKLSNpZm5kZWYgRVhJVF9TVUNDRVNTCi0jaWZkZWYgVk1TCi0jZGVmaW5lIEVYSVRfU1VDQ0VTUyAgMQkJLyogVk1TIGlzIHZlcnkgbm9uc3RhbmRhcmQgKi8KLSNlbHNlCi0jZGVmaW5lIEVYSVRfU1VDQ0VTUyAgMAotI2VuZGlmCi0jZW5kaWYKLQotLyogUmVkdWNlIHRoaXMgdmFsdWUgaWYgeW91ciBtYWxsb2MoKSBjYW4ndCBhbGxvY2F0ZSBibG9ja3MgdXAgdG8gNjRLLgotICogT24gRE9TLCBjb21waWxpbmcgaW4gbGFyZ2UgbW9kZWwgaXMgdXN1YWxseSBhIGJldHRlciBzb2x1dGlvbi4KLSAqLwotCi0jaWZuZGVmIE1BWF9DT01fTEVOR1RICi0jZGVmaW5lIE1BWF9DT01fTEVOR1RIIDY1MDAwTAkvKiBtdXN0IGJlIDw9IDY1NTMzIGluIGFueSBjYXNlICovCi0jZW5kaWYKLQotCi0vKgotICogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIHRvIHJlYWQgdGhlIGlucHV0IGZpbGUgYW5kIHdyaXRlIHRoZSBvdXRwdXQgZmlsZS4KLSAqIFRvIHJldXNlIHRoaXMgY29kZSBpbiBhbm90aGVyIGFwcGxpY2F0aW9uLCB5b3UgbWlnaHQgbmVlZCB0byBjaGFuZ2UgdGhlc2UuCi0gKi8KLQotc3RhdGljIEZJTEUgKiBpbmZpbGU7CQkvKiBpbnB1dCBKUEVHIGZpbGUgKi8KLQotLyogUmV0dXJuIG5leHQgaW5wdXQgYnl0ZSwgb3IgRU9GIGlmIG5vIG1vcmUgKi8KLSNkZWZpbmUgTkVYVEJZVEUoKSAgZ2V0YyhpbmZpbGUpCi0KLXN0YXRpYyBGSUxFICogb3V0ZmlsZTsJCS8qIG91dHB1dCBKUEVHIGZpbGUgKi8KLQotLyogRW1pdCBhbiBvdXRwdXQgYnl0ZSAqLwotI2RlZmluZSBQVVRCWVRFKHgpICBwdXRjKCh4KSwgb3V0ZmlsZSkKLQotCi0vKiBFcnJvciBleGl0IGhhbmRsZXIgKi8KLSNkZWZpbmUgRVJSRVhJVChtc2cpICAoZnByaW50ZihzdGRlcnIsICIlc1xuIiwgbXNnKSwgZXhpdChFWElUX0ZBSUxVUkUpKQotCi0KLS8qIFJlYWQgb25lIGJ5dGUsIHRlc3RpbmcgZm9yIEVPRiAqLwotc3RhdGljIGludAotcmVhZF8xX2J5dGUgKHZvaWQpCi17Ci0gIGludCBjOwotCi0gIGMgPSBORVhUQllURSgpOwotICBpZiAoYyA9PSBFT0YpCi0gICAgRVJSRVhJVCgiUHJlbWF0dXJlIEVPRiBpbiBKUEVHIGZpbGUiKTsKLSAgcmV0dXJuIGM7Ci19Ci0KLS8qIFJlYWQgMiBieXRlcywgY29udmVydCB0byB1bnNpZ25lZCBpbnQgKi8KLS8qIEFsbCAyLWJ5dGUgcXVhbnRpdGllcyBpbiBKUEVHIG1hcmtlcnMgYXJlIE1TQiBmaXJzdCAqLwotc3RhdGljIHVuc2lnbmVkIGludAotcmVhZF8yX2J5dGVzICh2b2lkKQotewotICBpbnQgYzEsIGMyOwotCi0gIGMxID0gTkVYVEJZVEUoKTsKLSAgaWYgKGMxID09IEVPRikKLSAgICBFUlJFWElUKCJQcmVtYXR1cmUgRU9GIGluIEpQRUcgZmlsZSIpOwotICBjMiA9IE5FWFRCWVRFKCk7Ci0gIGlmIChjMiA9PSBFT0YpCi0gICAgRVJSRVhJVCgiUHJlbWF0dXJlIEVPRiBpbiBKUEVHIGZpbGUiKTsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkgYzEpIDw8IDgpICsgKCh1bnNpZ25lZCBpbnQpIGMyKTsKLX0KLQotCi0vKiBSb3V0aW5lcyB0byB3cml0ZSBkYXRhIHRvIG91dHB1dCBmaWxlICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV8xX2J5dGUgKGludCBjKQotewotICBQVVRCWVRFKGMpOwotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVfMl9ieXRlcyAodW5zaWduZWQgaW50IHZhbCkKLXsKLSAgUFVUQllURSgodmFsID4+IDgpICYgMHhGRik7Ci0gIFBVVEJZVEUodmFsICYgMHhGRik7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9tYXJrZXIgKGludCBtYXJrZXIpCi17Ci0gIFBVVEJZVEUoMHhGRik7Ci0gIFBVVEJZVEUobWFya2VyKTsKLX0KLQotc3RhdGljIHZvaWQKLWNvcHlfcmVzdF9vZl9maWxlICh2b2lkKQotewotICBpbnQgYzsKLQotICB3aGlsZSAoKGMgPSBORVhUQllURSgpKSAhPSBFT0YpCi0gICAgUFVUQllURShjKTsKLX0KLQotCi0vKgotICogSlBFRyBtYXJrZXJzIGNvbnNpc3Qgb2Ygb25lIG9yIG1vcmUgMHhGRiBieXRlcywgZm9sbG93ZWQgYnkgYSBtYXJrZXIKLSAqIGNvZGUgYnl0ZSAod2hpY2ggaXMgbm90IGFuIEZGKS4gIEhlcmUgYXJlIHRoZSBtYXJrZXIgY29kZXMgb2YgaW50ZXJlc3QKLSAqIGluIHRoaXMgcHJvZ3JhbS4gIChTZWUgamRtYXJrZXIuYyBmb3IgYSBtb3JlIGNvbXBsZXRlIGxpc3QuKQotICovCi0KLSNkZWZpbmUgTV9TT0YwICAweEMwCQkvKiBTdGFydCBPZiBGcmFtZSBOICovCi0jZGVmaW5lIE1fU09GMSAgMHhDMQkJLyogTiBpbmRpY2F0ZXMgd2hpY2ggY29tcHJlc3Npb24gcHJvY2VzcyAqLwotI2RlZmluZSBNX1NPRjIgIDB4QzIJCS8qIE9ubHkgU09GMC1TT0YyIGFyZSBub3cgaW4gY29tbW9uIHVzZSAqLwotI2RlZmluZSBNX1NPRjMgIDB4QzMKLSNkZWZpbmUgTV9TT0Y1ICAweEM1CQkvKiBOQjogY29kZXMgQzQgYW5kIENDIGFyZSBOT1QgU09GIG1hcmtlcnMgKi8KLSNkZWZpbmUgTV9TT0Y2ICAweEM2Ci0jZGVmaW5lIE1fU09GNyAgMHhDNwotI2RlZmluZSBNX1NPRjkgIDB4QzkKLSNkZWZpbmUgTV9TT0YxMCAweENBCi0jZGVmaW5lIE1fU09GMTEgMHhDQgotI2RlZmluZSBNX1NPRjEzIDB4Q0QKLSNkZWZpbmUgTV9TT0YxNCAweENFCi0jZGVmaW5lIE1fU09GMTUgMHhDRgotI2RlZmluZSBNX1NPSSAgIDB4RDgJCS8qIFN0YXJ0IE9mIEltYWdlIChiZWdpbm5pbmcgb2YgZGF0YXN0cmVhbSkgKi8KLSNkZWZpbmUgTV9FT0kgICAweEQ5CQkvKiBFbmQgT2YgSW1hZ2UgKGVuZCBvZiBkYXRhc3RyZWFtKSAqLwotI2RlZmluZSBNX1NPUyAgIDB4REEJCS8qIFN0YXJ0IE9mIFNjYW4gKGJlZ2lucyBjb21wcmVzc2VkIGRhdGEpICovCi0jZGVmaW5lIE1fQ09NICAgMHhGRQkJLyogQ09NbWVudCAqLwotCi0KLS8qCi0gKiBGaW5kIHRoZSBuZXh0IEpQRUcgbWFya2VyIGFuZCByZXR1cm4gaXRzIG1hcmtlciBjb2RlLgotICogV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBGRiBieXRlLCBwb3NzaWJseSBtb3JlIGlmIHRoZSBjb21wcmVzc29yIHVzZWQgRkZzCi0gKiB0byBwYWQgdGhlIGZpbGUuICAoUGFkZGluZyBGRnMgd2lsbCBOT1QgYmUgcmVwbGljYXRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuKQotICogVGhlcmUgY291bGQgYWxzbyBiZSBub24tRkYgZ2FyYmFnZSBiZXR3ZWVuIG1hcmtlcnMuICBUaGUgdHJlYXRtZW50IG9mIHN1Y2gKLSAqIGdhcmJhZ2UgaXMgdW5zcGVjaWZpZWQ7IHdlIGNob29zZSB0byBza2lwIG92ZXIgaXQgYnV0IGVtaXQgYSB3YXJuaW5nIG1zZy4KLSAqIE5COiB0aGlzIHJvdXRpbmUgbXVzdCBub3QgYmUgdXNlZCBhZnRlciBzZWVpbmcgU09TIG1hcmtlciwgc2luY2UgaXQgd2lsbAotICogbm90IGRlYWwgY29ycmVjdGx5IHdpdGggRkYvMDAgc2VxdWVuY2VzIGluIHRoZSBjb21wcmVzc2VkIGltYWdlIGRhdGEuLi4KLSAqLwotCi1zdGF0aWMgaW50Ci1uZXh0X21hcmtlciAodm9pZCkKLXsKLSAgaW50IGM7Ci0gIGludCBkaXNjYXJkZWRfYnl0ZXMgPSAwOwotCi0gIC8qIEZpbmQgMHhGRiBieXRlOyBjb3VudCBhbmQgc2tpcCBhbnkgbm9uLUZGcy4gKi8KLSAgYyA9IHJlYWRfMV9ieXRlKCk7Ci0gIHdoaWxlIChjICE9IDB4RkYpIHsKLSAgICBkaXNjYXJkZWRfYnl0ZXMrKzsKLSAgICBjID0gcmVhZF8xX2J5dGUoKTsKLSAgfQotICAvKiBHZXQgbWFya2VyIGNvZGUgYnl0ZSwgc3dhbGxvd2luZyBhbnkgZHVwbGljYXRlIEZGIGJ5dGVzLiAgRXh0cmEgRkZzCi0gICAqIGFyZSBsZWdhbCBhcyBwYWQgYnl0ZXMsIHNvIGRvbid0IGNvdW50IHRoZW0gaW4gZGlzY2FyZGVkX2J5dGVzLgotICAgKi8KLSAgZG8gewotICAgIGMgPSByZWFkXzFfYnl0ZSgpOwotICB9IHdoaWxlIChjID09IDB4RkYpOwotCi0gIGlmIChkaXNjYXJkZWRfYnl0ZXMgIT0gMCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogZ2FyYmFnZSBkYXRhIGZvdW5kIGluIEpQRUcgZmlsZVxuIik7Ci0gIH0KLQotICByZXR1cm4gYzsKLX0KLQotCi0vKgotICogUmVhZCB0aGUgaW5pdGlhbCBtYXJrZXIsIHdoaWNoIHNob3VsZCBiZSBTT0kuCi0gKiBGb3IgYSBKRklGIGZpbGUsIHRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgdGhlIGZpbGUgc2hvdWxkIGJlIGxpdGVyYWxseQotICogMHhGRiBNX1NPSS4gIFRvIGJlIG1vcmUgZ2VuZXJhbCwgd2UgY291bGQgdXNlIG5leHRfbWFya2VyLCBidXQgaWYgdGhlCi0gKiBpbnB1dCBmaWxlIHdlcmVuJ3QgYWN0dWFsbHkgSlBFRyBhdCBhbGwsIG5leHRfbWFya2VyIG1pZ2h0IHJlYWQgdGhlIHdob2xlCi0gKiBmaWxlIGFuZCB0aGVuIHJldHVybiBhIG1pc2xlYWRpbmcgZXJyb3IgbWVzc2FnZS4uLgotICovCi0KLXN0YXRpYyBpbnQKLWZpcnN0X21hcmtlciAodm9pZCkKLXsKLSAgaW50IGMxLCBjMjsKLQotICBjMSA9IE5FWFRCWVRFKCk7Ci0gIGMyID0gTkVYVEJZVEUoKTsKLSAgaWYgKGMxICE9IDB4RkYgfHwgYzIgIT0gTV9TT0kpCi0gICAgRVJSRVhJVCgiTm90IGEgSlBFRyBmaWxlIik7Ci0gIHJldHVybiBjMjsKLX0KLQotCi0vKgotICogTW9zdCB0eXBlcyBvZiBtYXJrZXIgYXJlIGZvbGxvd2VkIGJ5IGEgdmFyaWFibGUtbGVuZ3RoIHBhcmFtZXRlciBzZWdtZW50LgotICogVGhpcyByb3V0aW5lIHNraXBzIG92ZXIgdGhlIHBhcmFtZXRlcnMgZm9yIGFueSBtYXJrZXIgd2UgZG9uJ3Qgb3RoZXJ3aXNlCi0gKiB3YW50IHRvIHByb2Nlc3MuCi0gKiBOb3RlIHRoYXQgd2UgTVVTVCBza2lwIHRoZSBwYXJhbWV0ZXIgc2VnbWVudCBleHBsaWNpdGx5IGluIG9yZGVyIG5vdCB0bwotICogYmUgZm9vbGVkIGJ5IDB4RkYgYnl0ZXMgdGhhdCBtaWdodCBhcHBlYXIgd2l0aGluIHRoZSBwYXJhbWV0ZXIgc2VnbWVudDsKLSAqIHN1Y2ggYnl0ZXMgZG8gTk9UIGludHJvZHVjZSBuZXcgbWFya2Vycy4KLSAqLwotCi1zdGF0aWMgdm9pZAotY29weV92YXJpYWJsZSAodm9pZCkKLS8qIENvcHkgYW4gdW5rbm93biBvciB1bmludGVyZXN0aW5nIHZhcmlhYmxlLWxlbmd0aCBtYXJrZXIgKi8KLXsKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLQotICAvKiBHZXQgdGhlIG1hcmtlciBwYXJhbWV0ZXIgbGVuZ3RoIGNvdW50ICovCi0gIGxlbmd0aCA9IHJlYWRfMl9ieXRlcygpOwotICB3cml0ZV8yX2J5dGVzKGxlbmd0aCk7Ci0gIC8qIExlbmd0aCBpbmNsdWRlcyBpdHNlbGYsIHNvIG11c3QgYmUgYXQgbGVhc3QgMiAqLwotICBpZiAobGVuZ3RoIDwgMikKLSAgICBFUlJFWElUKCJFcnJvbmVvdXMgSlBFRyBtYXJrZXIgbGVuZ3RoIik7Ci0gIGxlbmd0aCAtPSAyOwotICAvKiBTa2lwIG92ZXIgdGhlIHJlbWFpbmluZyBieXRlcyAqLwotICB3aGlsZSAobGVuZ3RoID4gMCkgewotICAgIHdyaXRlXzFfYnl0ZShyZWFkXzFfYnl0ZSgpKTsKLSAgICBsZW5ndGgtLTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZAotc2tpcF92YXJpYWJsZSAodm9pZCkKLS8qIFNraXAgb3ZlciBhbiB1bmtub3duIG9yIHVuaW50ZXJlc3RpbmcgdmFyaWFibGUtbGVuZ3RoIG1hcmtlciAqLwotewotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCi0gIC8qIEdldCB0aGUgbWFya2VyIHBhcmFtZXRlciBsZW5ndGggY291bnQgKi8KLSAgbGVuZ3RoID0gcmVhZF8yX2J5dGVzKCk7Ci0gIC8qIExlbmd0aCBpbmNsdWRlcyBpdHNlbGYsIHNvIG11c3QgYmUgYXQgbGVhc3QgMiAqLwotICBpZiAobGVuZ3RoIDwgMikKLSAgICBFUlJFWElUKCJFcnJvbmVvdXMgSlBFRyBtYXJrZXIgbGVuZ3RoIik7Ci0gIGxlbmd0aCAtPSAyOwotICAvKiBTa2lwIG92ZXIgdGhlIHJlbWFpbmluZyBieXRlcyAqLwotICB3aGlsZSAobGVuZ3RoID4gMCkgewotICAgICh2b2lkKSByZWFkXzFfYnl0ZSgpOwotICAgIGxlbmd0aC0tOwotICB9Ci19Ci0KLQotLyoKLSAqIFBhcnNlIHRoZSBtYXJrZXIgc3RyZWFtIHVudGlsIFNPRm4gb3IgRU9JIGlzIHNlZW47Ci0gKiBjb3B5IGRhdGEgdG8gb3V0cHV0LCBidXQgZGlzY2FyZCBDT00gbWFya2VycyB1bmxlc3Mga2VlcF9DT00gaXMgdHJ1ZS4KLSAqLwotCi1zdGF0aWMgaW50Ci1zY2FuX0pQRUdfaGVhZGVyIChpbnQga2VlcF9DT00pCi17Ci0gIGludCBtYXJrZXI7Ci0KLSAgLyogRXhwZWN0IFNPSSBhdCBzdGFydCBvZiBmaWxlICovCi0gIGlmIChmaXJzdF9tYXJrZXIoKSAhPSBNX1NPSSkKLSAgICBFUlJFWElUKCJFeHBlY3RlZCBTT0kgbWFya2VyIGZpcnN0Iik7Ci0gIHdyaXRlX21hcmtlcihNX1NPSSk7Ci0KLSAgLyogU2NhbiBtaXNjZWxsYW5lb3VzIG1hcmtlcnMgdW50aWwgd2UgcmVhY2ggU09Gbi4gKi8KLSAgZm9yICg7OykgewotICAgIG1hcmtlciA9IG5leHRfbWFya2VyKCk7Ci0gICAgc3dpdGNoIChtYXJrZXIpIHsKLSAgICAgIC8qIE5vdGUgdGhhdCBtYXJrZXIgY29kZXMgMHhDNCwgMHhDOCwgMHhDQyBhcmUgbm90LCBhbmQgbXVzdCBub3QgYmUsCi0gICAgICAgKiB0cmVhdGVkIGFzIFNPRm4uICBDNCBpbiBwYXJ0aWN1bGFyIGlzIGFjdHVhbGx5IERIVC4KLSAgICAgICAqLwotICAgIGNhc2UgTV9TT0YwOgkJLyogQmFzZWxpbmUgKi8KLSAgICBjYXNlIE1fU09GMToJCS8qIEV4dGVuZGVkIHNlcXVlbnRpYWwsIEh1ZmZtYW4gKi8KLSAgICBjYXNlIE1fU09GMjoJCS8qIFByb2dyZXNzaXZlLCBIdWZmbWFuICovCi0gICAgY2FzZSBNX1NPRjM6CQkvKiBMb3NzbGVzcywgSHVmZm1hbiAqLwotICAgIGNhc2UgTV9TT0Y1OgkJLyogRGlmZmVyZW50aWFsIHNlcXVlbnRpYWwsIEh1ZmZtYW4gKi8KLSAgICBjYXNlIE1fU09GNjoJCS8qIERpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgSHVmZm1hbiAqLwotICAgIGNhc2UgTV9TT0Y3OgkJLyogRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBIdWZmbWFuICovCi0gICAgY2FzZSBNX1NPRjk6CQkvKiBFeHRlbmRlZCBzZXF1ZW50aWFsLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjEwOgkJLyogUHJvZ3Jlc3NpdmUsIGFyaXRobWV0aWMgKi8KLSAgICBjYXNlIE1fU09GMTE6CQkvKiBMb3NzbGVzcywgYXJpdGhtZXRpYyAqLwotICAgIGNhc2UgTV9TT0YxMzoJCS8qIERpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjE0OgkJLyogRGlmZmVyZW50aWFsIHByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjE1OgkJLyogRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBhcml0aG1ldGljICovCi0gICAgICByZXR1cm4gbWFya2VyOwotCi0gICAgY2FzZSBNX1NPUzoJCQkvKiBzaG91bGQgbm90IHNlZSBjb21wcmVzc2VkIGRhdGEgYmVmb3JlIFNPRiAqLwotICAgICAgRVJSRVhJVCgiU09TIHdpdGhvdXQgcHJpb3IgU09GbiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fRU9JOgkJCS8qIGluIGNhc2UgaXQncyBhIHRhYmxlcy1vbmx5IEpQRUcgc3RyZWFtICovCi0gICAgICByZXR1cm4gbWFya2VyOwotCi0gICAgY2FzZSBNX0NPTToJCQkvKiBFeGlzdGluZyBDT006IGNvbmRpdGlvbmFsbHkgZGlzY2FyZCAqLwotICAgICAgaWYgKGtlZXBfQ09NKSB7Ci0Jd3JpdGVfbWFya2VyKG1hcmtlcik7Ci0JY29weV92YXJpYWJsZSgpOwotICAgICAgfSBlbHNlIHsKLQlza2lwX3ZhcmlhYmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6CQkJLyogQW55dGhpbmcgZWxzZSBqdXN0IGdldHMgY29waWVkICovCi0gICAgICB3cml0ZV9tYXJrZXIobWFya2VyKTsKLSAgICAgIGNvcHlfdmFyaWFibGUoKTsJCS8qIHdlIGFzc3VtZSBpdCBoYXMgYSBwYXJhbWV0ZXIgY291bnQuLi4gKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfSAvKiBlbmQgbG9vcCAqLwotfQotCi0KLS8qIENvbW1hbmQgbGluZSBwYXJzaW5nIGNvZGUgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBwcm9nbmFtZTsJLyogcHJvZ3JhbSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcyAqLwotCi0KLXN0YXRpYyB2b2lkCi11c2FnZSAodm9pZCkKLS8qIGNvbXBsYWluIGFib3V0IGJhZCBjb21tYW5kIGxpbmUgKi8KLXsKLSAgZnByaW50ZihzdGRlcnIsICJ3cmpwZ2NvbSBpbnNlcnRzIGEgdGV4dHVhbCBjb21tZW50IGluIGEgSlBFRyBmaWxlLlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiWW91IGNhbiBhZGQgdG8gb3IgcmVwbGFjZSBhbnkgZXhpc3RpbmcgY29tbWVudChzKS5cbiIpOwotCi0gIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFtzd2l0Y2hlc10gIiwgcHJvZ25hbWUpOwotI2lmZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCi0gIGZwcmludGYoc3RkZXJyLCAiaW5wdXRmaWxlIG91dHB1dGZpbGVcbiIpOwotI2Vsc2UKLSAgZnByaW50ZihzdGRlcnIsICJbaW5wdXRmaWxlXVxuIik7Ci0jZW5kaWYKLQotICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIChuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQpOlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtcmVwbGFjZSAgICAgICAgIERlbGV0ZSBhbnkgZXhpc3RpbmcgY29tbWVudHNcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWNvbW1lbnQgXCJ0ZXh0XCIgIEluc2VydCBjb21tZW50IHdpdGggZ2l2ZW4gdGV4dFxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtY2ZpbGUgbmFtZSAgICAgIFJlYWQgY29tbWVudCBmcm9tIG5hbWVkIGZpbGVcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIk5vdGljZSB0aGF0IHlvdSBtdXN0IHB1dCBxdW90ZXMgYXJvdW5kIHRoZSBjb21tZW50IHRleHRcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIndoZW4geW91IHVzZSAtY29tbWVudC5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIklmIHlvdSBkbyBub3QgZ2l2ZSBlaXRoZXIgLWNvbW1lbnQgb3IgLWNmaWxlIG9uIHRoZSBjb21tYW5kIGxpbmUsXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJ0aGVuIHRoZSBjb21tZW50IHRleHQgaXMgcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0LlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiSXQgY2FuIGJlIG11bHRpcGxlIGxpbmVzLCB1cCB0byAldSBjaGFyYWN0ZXJzIHRvdGFsLlxuIiwKLQkgICh1bnNpZ25lZCBpbnQpIE1BWF9DT01fTEVOR1RIKTsKLSNpZm5kZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKLSAgZnByaW50ZihzdGRlcnIsICJZb3UgbXVzdCBzcGVjaWZ5IGFuIGlucHV0IEpQRUcgZmlsZSBuYW1lIHdoZW4gc3VwcGx5aW5nXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJjb21tZW50IHRleHQgZnJvbSBzdGFuZGFyZCBpbnB1dC5cbiIpOwotI2VuZGlmCi0KLSAgZXhpdChFWElUX0ZBSUxVUkUpOwotfQotCi0KLXN0YXRpYyBpbnQKLWtleW1hdGNoIChjaGFyICogYXJnLCBjb25zdCBjaGFyICoga2V5d29yZCwgaW50IG1pbmNoYXJzKQotLyogQ2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZyBvZiAocG9zc2libHkgYWJicmV2aWF0ZWQpIGtleXdvcmQgc3dpdGNoZXMuICovCi0vKiBrZXl3b3JkIGlzIHRoZSBjb25zdGFudCBrZXl3b3JkIChtdXN0IGJlIGxvd2VyIGNhc2UgYWxyZWFkeSksICovCi0vKiBtaW5jaGFycyBpcyBsZW5ndGggb2YgbWluaW11bSBsZWdhbCBhYmJyZXZpYXRpb24uICovCi17Ci0gIHJlZ2lzdGVyIGludCBjYSwgY2s7Ci0gIHJlZ2lzdGVyIGludCBubWF0Y2hlZCA9IDA7Ci0KLSAgd2hpbGUgKChjYSA9ICphcmcrKykgIT0gJ1wwJykgewotICAgIGlmICgoY2sgPSAqa2V5d29yZCsrKSA9PSAnXDAnKQotICAgICAgcmV0dXJuIDA7CQkJLyogYXJnIGxvbmdlciB0aGFuIGtleXdvcmQsIG5vIGdvb2QgKi8KLSAgICBpZiAoaXN1cHBlcihjYSkpCQkvKiBmb3JjZSBhcmcgdG8gbGNhc2UgKGFzc3VtZSBjayBpcyBhbHJlYWR5KSAqLwotICAgICAgY2EgPSB0b2xvd2VyKGNhKTsKLSAgICBpZiAoY2EgIT0gY2spCi0gICAgICByZXR1cm4gMDsJCQkvKiBubyBnb29kICovCi0gICAgbm1hdGNoZWQrKzsJCQkvKiBjb3VudCBtYXRjaGVkIGNoYXJhY3RlcnMgKi8KLSAgfQotICAvKiByZWFjaGVkIGVuZCBvZiBhcmd1bWVudDsgZmFpbCBpZiBpdCdzIHRvbyBzaG9ydCBmb3IgdW5pcXVlIGFiYnJldiAqLwotICBpZiAobm1hdGNoZWQgPCBtaW5jaGFycykKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7CQkJLyogQS1PSyAqLwotfQotCi0KLS8qCi0gKiBUaGUgbWFpbiBwcm9ncmFtLgotICovCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICBpbnQgYXJnbjsKLSAgY2hhciAqIGFyZzsKLSAgaW50IGtlZXBfQ09NID0gMTsKLSAgY2hhciAqIGNvbW1lbnRfYXJnID0gTlVMTDsKLSAgRklMRSAqIGNvbW1lbnRfZmlsZSA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCBjb21tZW50X2xlbmd0aCA9IDA7Ci0gIGludCBtYXJrZXI7Ci0KLSAgLyogT24gTWFjLCBmZXRjaCBhIGNvbW1hbmQgbGluZS4gKi8KLSNpZmRlZiBVU0VfQ0NPTU1BTkQKLSAgYXJnYyA9IGNjb21tYW5kKCZhcmd2KTsKLSNlbmRpZgotCi0gIHByb2duYW1lID0gYXJndlswXTsKLSAgaWYgKHByb2duYW1lID09IE5VTEwgfHwgcHJvZ25hbWVbMF0gPT0gMCkKLSAgICBwcm9nbmFtZSA9ICJ3cmpwZ2NvbSI7CS8qIGluIGNhc2UgQyBsaWJyYXJ5IGRvZXNuJ3QgcHJvdmlkZSBpdCAqLwotCi0gIC8qIFBhcnNlIHN3aXRjaGVzLCBpZiBhbnkgKi8KLSAgZm9yIChhcmduID0gMTsgYXJnbiA8IGFyZ2M7IGFyZ24rKykgewotICAgIGFyZyA9IGFyZ3ZbYXJnbl07Ci0gICAgaWYgKGFyZ1swXSAhPSAnLScpCi0gICAgICBicmVhazsJCQkvKiBub3Qgc3dpdGNoLCBtdXN0IGJlIGZpbGUgbmFtZSAqLwotICAgIGFyZysrOwkJCS8qIGFkdmFuY2Ugb3ZlciAnLScgKi8KLSAgICBpZiAoa2V5bWF0Y2goYXJnLCAicmVwbGFjZSIsIDEpKSB7Ci0gICAgICBrZWVwX0NPTSA9IDA7Ci0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJjZmlsZSIsIDIpKSB7Ci0gICAgICBpZiAoKythcmduID49IGFyZ2MpIHVzYWdlKCk7Ci0gICAgICBpZiAoKGNvbW1lbnRfZmlsZSA9IGZvcGVuKGFyZ3ZbYXJnbl0sICJyIikpID09IE5VTEwpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgYXJndlthcmduXSk7Ci0JZXhpdChFWElUX0ZBSUxVUkUpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiY29tbWVudCIsIDEpKSB7Ci0gICAgICBpZiAoKythcmduID49IGFyZ2MpIHVzYWdlKCk7Ci0gICAgICBjb21tZW50X2FyZyA9IGFyZ3ZbYXJnbl07Ci0gICAgICAvKiBJZiB0aGUgY29tbWVudCB0ZXh0IHN0YXJ0cyB3aXRoICciJywgdGhlbiB3ZSBhcmUgcHJvYmFibHkgcnVubmluZwotICAgICAgICogdW5kZXIgTVMtRE9HIGFuZCBtdXN0IHBhcnNlIG91dCB0aGUgcXVvdGVkIHN0cmluZyBvdXJzZWx2ZXMuICBTaWdoLgotICAgICAgICovCi0gICAgICBpZiAoY29tbWVudF9hcmdbMF0gPT0gJyInKSB7Ci0JY29tbWVudF9hcmcgPSAoY2hhciAqKSBtYWxsb2MoKHNpemVfdCkgTUFYX0NPTV9MRU5HVEgpOwotCWlmIChjb21tZW50X2FyZyA9PSBOVUxMKQotCSAgRVJSRVhJVCgiSW5zdWZmaWNpZW50IG1lbW9yeSIpOwotCXN0cmNweShjb21tZW50X2FyZywgYXJndlthcmduXSsxKTsKLQlmb3IgKDs7KSB7Ci0JICBjb21tZW50X2xlbmd0aCA9ICh1bnNpZ25lZCBpbnQpIHN0cmxlbihjb21tZW50X2FyZyk7Ci0JICBpZiAoY29tbWVudF9sZW5ndGggPiAwICYmIGNvbW1lbnRfYXJnW2NvbW1lbnRfbGVuZ3RoLTFdID09ICciJykgewotCSAgICBjb21tZW50X2FyZ1tjb21tZW50X2xlbmd0aC0xXSA9ICdcMCc7IC8qIHphcCB0ZXJtaW5hdGluZyBxdW90ZSAqLwotCSAgICBicmVhazsKLQkgIH0KLQkgIGlmICgrK2FyZ24gPj0gYXJnYykKLQkgICAgRVJSRVhJVCgiTWlzc2luZyBlbmRpbmcgcXVvdGUgbWFyayIpOwotCSAgc3RyY2F0KGNvbW1lbnRfYXJnLCAiICIpOwotCSAgc3RyY2F0KGNvbW1lbnRfYXJnLCBhcmd2W2FyZ25dKTsKLQl9Ci0gICAgICB9Ci0gICAgICBjb21tZW50X2xlbmd0aCA9ICh1bnNpZ25lZCBpbnQpIHN0cmxlbihjb21tZW50X2FyZyk7Ci0gICAgfSBlbHNlCi0gICAgICB1c2FnZSgpOwotICB9Ci0KLSAgLyogQ2Fubm90IHVzZSBib3RoIC1jb21tZW50IGFuZCAtY2ZpbGUuICovCi0gIGlmIChjb21tZW50X2FyZyAhPSBOVUxMICYmIGNvbW1lbnRfZmlsZSAhPSBOVUxMKQotICAgIHVzYWdlKCk7Ci0gIC8qIElmIHRoZXJlIGlzIG5laXRoZXIgLWNvbW1lbnQgbm9yIC1jZmlsZSwgd2Ugd2lsbCByZWFkIHRoZSBjb21tZW50IHRleHQKLSAgICogZnJvbSBzdGRpbjsgaW4gdGhpcyBjYXNlIHRoZXJlIE1VU1QgYmUgYW4gaW5wdXQgSlBFRyBmaWxlIG5hbWUuCi0gICAqLwotICBpZiAoY29tbWVudF9hcmcgPT0gTlVMTCAmJiBjb21tZW50X2ZpbGUgPT0gTlVMTCAmJiBhcmduID49IGFyZ2MpCi0gICAgdXNhZ2UoKTsKLQotICAvKiBPcGVuIHRoZSBpbnB1dCBmaWxlLiAqLwotICBpZiAoYXJnbiA8IGFyZ2MpIHsKLSAgICBpZiAoKGluZmlsZSA9IGZvcGVuKGFyZ3ZbYXJnbl0sIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbYXJnbl0pOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBkZWZhdWx0IGlucHV0IGZpbGUgaXMgc3RkaW4gKi8KLSNpZmRlZiBVU0VfU0VUTU9ERQkJLyogbmVlZCB0byBoYWNrIGZpbGUgbW9kZT8gKi8KLSAgICBzZXRtb2RlKGZpbGVubyhzdGRpbiksIE9fQklOQVJZKTsKLSNlbmRpZgotI2lmZGVmIFVTRV9GRE9QRU4JCS8qIG5lZWQgdG8gcmUtb3BlbiBpbiBiaW5hcnkgbW9kZT8gKi8KLSAgICBpZiAoKGluZmlsZSA9IGZkb3BlbihmaWxlbm8oc3RkaW4pLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gc3RkaW5cbiIsIHByb2duYW1lKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0jZWxzZQotICAgIGluZmlsZSA9IHN0ZGluOwotI2VuZGlmCi0gIH0KLQotICAvKiBPcGVuIHRoZSBvdXRwdXQgZmlsZS4gKi8KLSNpZmRlZiBUV09fRklMRV9DT01NQU5ETElORQotICAvKiBNdXN0IGhhdmUgZXhwbGljaXQgb3V0cHV0IGZpbGUgbmFtZSAqLwotICBpZiAoYXJnbiAhPSBhcmdjLTIpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBtdXN0IG5hbWUgb25lIGlucHV0IGFuZCBvbmUgb3V0cHV0IGZpbGVcbiIsCi0JICAgIHByb2duYW1lKTsKLSAgICB1c2FnZSgpOwotICB9Ci0gIGlmICgob3V0ZmlsZSA9IGZvcGVuKGFyZ3ZbYXJnbisxXSwgV1JJVEVfQklOQVJZKSkgPT0gTlVMTCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2FyZ24rMV0pOwotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgfQotI2Vsc2UKLSAgLyogVW5peCBzdHlsZTogZXhwZWN0IHplcm8gb3Igb25lIGZpbGUgbmFtZSAqLwotICBpZiAoYXJnbiA8IGFyZ2MtMSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG9ubHkgb25lIGlucHV0IGZpbGVcbiIsIHByb2duYW1lKTsKLSAgICB1c2FnZSgpOwotICB9Ci0gIC8qIGRlZmF1bHQgb3V0cHV0IGZpbGUgaXMgc3Rkb3V0ICovCi0jaWZkZWYgVVNFX1NFVE1PREUJCS8qIG5lZWQgdG8gaGFjayBmaWxlIG1vZGU/ICovCi0gIHNldG1vZGUoZmlsZW5vKHN0ZG91dCksIE9fQklOQVJZKTsKLSNlbmRpZgotI2lmZGVmIFVTRV9GRE9QRU4JCS8qIG5lZWQgdG8gcmUtb3BlbiBpbiBiaW5hcnkgbW9kZT8gKi8KLSAgaWYgKChvdXRmaWxlID0gZmRvcGVuKGZpbGVubyhzdGRvdXQpLCBXUklURV9CSU5BUlkpKSA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiBzdGRvdXRcbiIsIHByb2duYW1lKTsKLSAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gIH0KLSNlbHNlCi0gIG91dGZpbGUgPSBzdGRvdXQ7Ci0jZW5kaWYKLSNlbmRpZiAvKiBUV09fRklMRV9DT01NQU5ETElORSAqLwotCi0gIC8qIENvbGxlY3QgY29tbWVudCB0ZXh0IGZyb20gY29tbWVudF9maWxlIG9yIHN0ZGluLCBpZiBuZWNlc3NhcnkgKi8KLSAgaWYgKGNvbW1lbnRfYXJnID09IE5VTEwpIHsKLSAgICBGSUxFICogc3JjX2ZpbGU7Ci0gICAgaW50IGM7Ci0KLSAgICBjb21tZW50X2FyZyA9IChjaGFyICopIG1hbGxvYygoc2l6ZV90KSBNQVhfQ09NX0xFTkdUSCk7Ci0gICAgaWYgKGNvbW1lbnRfYXJnID09IE5VTEwpCi0gICAgICBFUlJFWElUKCJJbnN1ZmZpY2llbnQgbWVtb3J5Iik7Ci0gICAgY29tbWVudF9sZW5ndGggPSAwOwotICAgIHNyY19maWxlID0gKGNvbW1lbnRfZmlsZSAhPSBOVUxMID8gY29tbWVudF9maWxlIDogc3RkaW4pOwotICAgIHdoaWxlICgoYyA9IGdldGMoc3JjX2ZpbGUpKSAhPSBFT0YpIHsKLSAgICAgIGlmIChjb21tZW50X2xlbmd0aCA+PSAodW5zaWduZWQgaW50KSBNQVhfQ09NX0xFTkdUSCkgewotCWZwcmludGYoc3RkZXJyLCAiQ29tbWVudCB0ZXh0IG1heSBub3QgZXhjZWVkICV1IGJ5dGVzXG4iLAotCQkodW5zaWduZWQgaW50KSBNQVhfQ09NX0xFTkdUSCk7Ci0JZXhpdChFWElUX0ZBSUxVUkUpOwotICAgICAgfQotICAgICAgY29tbWVudF9hcmdbY29tbWVudF9sZW5ndGgrK10gPSAoY2hhcikgYzsKLSAgICB9Ci0gICAgaWYgKGNvbW1lbnRfZmlsZSAhPSBOVUxMKQotICAgICAgZmNsb3NlKGNvbW1lbnRfZmlsZSk7Ci0gIH0KLQotICAvKiBDb3B5IEpQRUcgaGVhZGVycyB1bnRpbCBTT0ZuIG1hcmtlcjsKLSAgICogd2Ugd2lsbCBpbnNlcnQgdGhlIG5ldyBjb21tZW50IG1hcmtlciBqdXN0IGJlZm9yZSBTT0ZuLgotICAgKiBUaGlzIChhKSBjYXVzZXMgdGhlIG5ldyBjb21tZW50IHRvIGFwcGVhciBhZnRlciwgcmF0aGVyIHRoYW4gYmVmb3JlLAotICAgKiBleGlzdGluZyBjb21tZW50czsgYW5kIChiKSBlbnN1cmVzIHRoYXQgY29tbWVudHMgY29tZSBhZnRlciBhbnkgSkZJRgotICAgKiBvciBKRlhYIG1hcmtlcnMsIGFzIHJlcXVpcmVkIGJ5IHRoZSBKRklGIHNwZWNpZmljYXRpb24uCi0gICAqLwotICBtYXJrZXIgPSBzY2FuX0pQRUdfaGVhZGVyKGtlZXBfQ09NKTsKLSAgLyogSW5zZXJ0IHRoZSBuZXcgQ09NIG1hcmtlciwgYnV0IG9ubHkgaWYgbm9uZW1wdHkgdGV4dCBoYXMgYmVlbiBzdXBwbGllZCAqLwotICBpZiAoY29tbWVudF9sZW5ndGggPiAwKSB7Ci0gICAgd3JpdGVfbWFya2VyKE1fQ09NKTsKLSAgICB3cml0ZV8yX2J5dGVzKGNvbW1lbnRfbGVuZ3RoICsgMik7Ci0gICAgd2hpbGUgKGNvbW1lbnRfbGVuZ3RoID4gMCkgewotICAgICAgd3JpdGVfMV9ieXRlKCpjb21tZW50X2FyZysrKTsKLSAgICAgIGNvbW1lbnRfbGVuZ3RoLS07Ci0gICAgfQotICB9Ci0gIC8qIER1cGxpY2F0ZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBzb3VyY2UgZmlsZS4KLSAgICogTm90ZSB0aGF0IGFueSBDT00gbWFya2VycyBvY2N1cmluZyBhZnRlciBTT0Ygd2lsbCBub3QgYmUgdG91Y2hlZC4KLSAgICovCi0gIHdyaXRlX21hcmtlcihtYXJrZXIpOwotICBjb3B5X3Jlc3Rfb2ZfZmlsZSgpOwotCi0gIC8qIEFsbCBkb25lLiAqLwotICBleGl0KEVYSVRfU1VDQ0VTUyk7Ci0gIHJldHVybiAwOwkJCS8qIHN1cHByZXNzIG5vLXJldHVybi12YWx1ZSB3YXJuaW5ncyAqLwotfQpkaWZmIC0tZ2l0IGEvd3JwcG0uYyBiL3dycHBtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNmQ5MDguLjAwMDAwMDAKLS0tIGEvd3JwcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKgotICogd3JwcG0uYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHdyaXRlIG91dHB1dCBpbWFnZXMgaW4gUFBNL1BHTSBmb3JtYXQuCi0gKiBUaGUgZXh0ZW5kZWQgMi1ieXRlLXBlci1zYW1wbGUgcmF3IFBQTS9QR00gZm9ybWF0cyBhcmUgc3VwcG9ydGVkLgotICogVGhlIFBCTVBMVVMgbGlicmFyeSBpcyBOT1QgcmVxdWlyZWQgdG8gY29tcGlsZSB0aGlzIHNvZnR3YXJlCi0gKiAoYnV0IGl0IGlzIGhpZ2hseSB1c2VmdWwgYXMgYSBzZXQgb2YgUFBNIGltYWdlIG1hbmlwdWxhdGlvbiBwcm9ncmFtcykuCi0gKgotICogVGhlc2Ugcm91dGluZXMgbWF5IG5lZWQgbW9kaWZpY2F0aW9uIGZvciBub24tVW5peCBlbnZpcm9ubWVudHMgb3IKLSAqIHNwZWNpYWxpemVkIGFwcGxpY2F0aW9ucy4gIEFzIHRoZXkgc3RhbmQsIHRoZXkgYXNzdW1lIG91dHB1dCB0bwotICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0KLSNpZmRlZiBQUE1fU1VQUE9SVEVECi0KLQotLyoKLSAqIEZvciAxMi1iaXQgSlBFRyBkYXRhLCB3ZSBlaXRoZXIgZG93bnNjYWxlIHRoZSB2YWx1ZXMgdG8gOCBiaXRzCi0gKiAodG8gd3JpdGUgc3RhbmRhcmQgYnl0ZS1wZXItc2FtcGxlIFBQTS9QR00gZmlsZXMpLCBvciBvdXRwdXQKLSAqIG5vbnN0YW5kYXJkIHdvcmQtcGVyLXNhbXBsZSBQUE0vUEdNIGZpbGVzLiAgRG93bnNjYWxpbmcgaXMgZG9uZQotICogaWYgUFBNX05PUkFXV09SRCBpcyBkZWZpbmVkICh0aGlzIGNhbiBiZSBkb25lIGluIHRoZSBNYWtlZmlsZQotICogb3IgaW4gamNvbmZpZy5oKS4KLSAqIChXaGVuIHRoZSBjb3JlIGxpYnJhcnkgc3VwcG9ydHMgZGF0YSBwcmVjaXNpb24gcmVkdWN0aW9uLCBhIGNsZWFuZXIKLSAqIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdG8gYXNrIGZvciB0aGF0IGluc3RlYWQuKQotICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotI2RlZmluZSBQVVRQUE1TQU1QTEUocHRyLHYpICAqcHRyKysgPSAoY2hhcikgKHYpCi0jZGVmaW5lIEJZVEVTUEVSU0FNUExFIDEKLSNkZWZpbmUgUFBNX01BWFZBTCAyNTUKLSNlbHNlCi0jaWZkZWYgUFBNX05PUkFXV09SRAotI2RlZmluZSBQVVRQUE1TQU1QTEUocHRyLHYpICAqcHRyKysgPSAoY2hhcikgKCh2KSA+PiAoQklUU19JTl9KU0FNUExFLTgpKQotI2RlZmluZSBCWVRFU1BFUlNBTVBMRSAxCi0jZGVmaW5lIFBQTV9NQVhWQUwgMjU1Ci0jZWxzZQotLyogVGhlIHdvcmQtcGVyLXNhbXBsZSBmb3JtYXQgYWx3YXlzIHB1dHMgdGhlIExTQiBmaXJzdC4gKi8KLSNkZWZpbmUgUFVUUFBNU0FNUExFKHB0cix2KQkJCVwKLQl7IHJlZ2lzdGVyIGludCB2YWxfID0gdjsJCVwKLQkgICpwdHIrKyA9IChjaGFyKSAodmFsXyAmIDB4RkYpOwlcCi0JICAqcHRyKysgPSAoY2hhcikgKCh2YWxfID4+IDgpICYgMHhGRik7CVwKLQl9Ci0jZGVmaW5lIEJZVEVTUEVSU0FNUExFIDIKLSNkZWZpbmUgUFBNX01BWFZBTCAoKDE8PEJJVFNfSU5fSlNBTVBMRSktMSkKLSNlbmRpZgotI2VuZGlmCi0KLQotLyoKLSAqIFdoZW4gSlNBTVBMRSBpcyB0aGUgc2FtZSBzaXplIGFzIGNoYXIsIHdlIGNhbiBqdXN0IGZ3cml0ZSgpIHRoZQotICogZGVjb21wcmVzc2VkIGRhdGEgdG8gdGhlIFBQTSBvciBQR00gZmlsZS4gIE9uIFBDcywgaW4gb3JkZXIgdG8gbWFrZSB0aGlzCi0gKiB3b3JrIHRoZSBvdXRwdXQgYnVmZmVyIG11c3QgYmUgYWxsb2NhdGVkIGluIG5lYXIgZGF0YSBzcGFjZSwgYmVjYXVzZSB3ZSBhcmUKLSAqIGFzc3VtaW5nIHNtYWxsLWRhdGEgbWVtb3J5IG1vZGVsIHdoZXJlaW4gZndyaXRlKCkgY2FuJ3QgcmVhY2ggZmFyIG1lbW9yeS4KLSAqIElmIHlvdSBuZWVkIHRvIHByb2Nlc3MgdmVyeSB3aWRlIGltYWdlcyBvbiBhIFBDLCB5b3UgbWlnaHQgaGF2ZSB0byBjb21waWxlCi0gKiBpbiBsYXJnZS1tZW1vcnkgbW9kZWwsIG9yIGVsc2UgcmVwbGFjZSBmd3JpdGUoKSB3aXRoIGEgcHV0YygpIGxvb3AgLS0tCi0gKiB3aGljaCB3aWxsIGJlIG11Y2ggc2xvd2VyLgotICovCi0KLQotLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIGRhdGEgZGVzdGluYXRpb24gb2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIFVzdWFsbHkgdGhlc2UgdHdvIHBvaW50ZXJzIHBvaW50IHRvIHRoZSBzYW1lIHBsYWNlOiAqLwotICBjaGFyICppb2J1ZmZlcjsJCS8qIGZ3cml0ZSdzIEkvTyBidWZmZXIgKi8KLSAgSlNBTVBST1cgcGl4cm93OwkJLyogZGVjb21wcmVzc29yIG91dHB1dCBidWZmZXIgKi8KLSAgc2l6ZV90IGJ1ZmZlcl93aWR0aDsJCS8qIHdpZHRoIG9mIEkvTyBidWZmZXIgKi8KLSAgSkRJTUVOU0lPTiBzYW1wbGVzX3Blcl9yb3c7CS8qIEpTQU1QTEVzIHBlciBvdXRwdXQgcm93ICovCi19IHBwbV9kZXN0X3N0cnVjdDsKLQotdHlwZWRlZiBwcG1fZGVzdF9zdHJ1Y3QgKiBwcG1fZGVzdF9wdHI7Ci0KLQotLyoKLSAqIFdyaXRlIHNvbWUgcGl4ZWwgZGF0YS4KLSAqIEluIHRoaXMgbW9kdWxlIHJvd3Nfc3VwcGxpZWQgd2lsbCBhbHdheXMgYmUgMS4KLSAqCi0gKiBwdXRfcGl4ZWxfcm93cyBoYW5kbGVzIHRoZSAibm9ybWFsIiA4LWJpdCBjYXNlIHdoZXJlIHRoZSBkZWNvbXByZXNzb3IKLSAqIG91dHB1dCBidWZmZXIgaXMgcGh5c2ljYWxseSB0aGUgc2FtZSBhcyB0aGUgZndyaXRlIGJ1ZmZlci4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXB1dF9waXhlbF9yb3dzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKLQkJSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQotewotICBwcG1fZGVzdF9wdHIgZGVzdCA9IChwcG1fZGVzdF9wdHIpIGRpbmZvOwotCi0gICh2b2lkKSBKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgZGVzdC0+aW9idWZmZXIsIGRlc3QtPmJ1ZmZlcl93aWR0aCk7Ci19Ci0KLQotLyoKLSAqIFRoaXMgY29kZSBpcyB1c2VkIHdoZW4gd2UgaGF2ZSB0byBjb3B5IHRoZSBkYXRhIGFuZCBhcHBseSBhIHBpeGVsCi0gKiBmb3JtYXQgdHJhbnNsYXRpb24uICBUeXBpY2FsbHkgdGhpcyBvbmx5IGhhcHBlbnMgaW4gMTItYml0IG1vZGUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1jb3B5X3BpeGVsX3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAotCQkgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQotewotICBwcG1fZGVzdF9wdHIgZGVzdCA9IChwcG1fZGVzdF9wdHIpIGRpbmZvOwotICByZWdpc3RlciBjaGFyICogYnVmZmVycHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotCi0gIHB0ciA9IGRlc3QtPnB1Yi5idWZmZXJbMF07Ci0gIGJ1ZmZlcnB0ciA9IGRlc3QtPmlvYnVmZmVyOwotICBmb3IgKGNvbCA9IGRlc3QtPnNhbXBsZXNfcGVyX3JvdzsgY29sID4gMDsgY29sLS0pIHsKLSAgICBQVVRQUE1TQU1QTEUoYnVmZmVycHRyLCBHRVRKU0FNUExFKCpwdHIrKykpOwotICB9Ci0gICh2b2lkKSBKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgZGVzdC0+aW9idWZmZXIsIGRlc3QtPmJ1ZmZlcl93aWR0aCk7Ci19Ci0KLQotLyoKLSAqIFdyaXRlIHNvbWUgcGl4ZWwgZGF0YSB3aGVuIGNvbG9yIHF1YW50aXphdGlvbiBpcyBpbiBlZmZlY3QuCi0gKiBXZSBoYXZlIHRvIGRlbWFwIHRoZSBjb2xvciBpbmRleCB2YWx1ZXMgdG8gc3RyYWlnaHQgZGF0YS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXB1dF9kZW1hcHBlZF9yZ2IgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAotCQkgIEpESU1FTlNJT04gcm93c19zdXBwbGllZCkKLXsKLSAgcHBtX2Rlc3RfcHRyIGRlc3QgPSAocHBtX2Rlc3RfcHRyKSBkaW5mbzsKLSAgcmVnaXN0ZXIgY2hhciAqIGJ1ZmZlcnB0cjsKLSAgcmVnaXN0ZXIgaW50IHBpeHZhbDsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBjb2xvcl9tYXAwID0gY2luZm8tPmNvbG9ybWFwWzBdOwotICByZWdpc3RlciBKU0FNUFJPVyBjb2xvcl9tYXAxID0gY2luZm8tPmNvbG9ybWFwWzFdOwotICByZWdpc3RlciBKU0FNUFJPVyBjb2xvcl9tYXAyID0gY2luZm8tPmNvbG9ybWFwWzJdOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLQotICBwdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOwotICBidWZmZXJwdHIgPSBkZXN0LT5pb2J1ZmZlcjsKLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgIHBpeHZhbCA9IEdFVEpTQU1QTEUoKnB0cisrKTsKLSAgICBQVVRQUE1TQU1QTEUoYnVmZmVycHRyLCBHRVRKU0FNUExFKGNvbG9yX21hcDBbcGl4dmFsXSkpOwotICAgIFBVVFBQTVNBTVBMRShidWZmZXJwdHIsIEdFVEpTQU1QTEUoY29sb3JfbWFwMVtwaXh2YWxdKSk7Ci0gICAgUFVUUFBNU0FNUExFKGJ1ZmZlcnB0ciwgR0VUSlNBTVBMRShjb2xvcl9tYXAyW3BpeHZhbF0pKTsKLSAgfQotICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOwotfQotCi0KLU1FVEhPRERFRih2b2lkKQotcHV0X2RlbWFwcGVkX2dyYXkgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAotCQkgICBKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCi17Ci0gIHBwbV9kZXN0X3B0ciBkZXN0ID0gKHBwbV9kZXN0X3B0cikgZGluZm87Ci0gIHJlZ2lzdGVyIGNoYXIgKiBidWZmZXJwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgY29sb3JfbWFwID0gY2luZm8tPmNvbG9ybWFwWzBdOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLQotICBwdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOwotICBidWZmZXJwdHIgPSBkZXN0LT5pb2J1ZmZlcjsKLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgIFBVVFBQTVNBTVBMRShidWZmZXJwdHIsIEdFVEpTQU1QTEUoY29sb3JfbWFwW0dFVEpTQU1QTEUoKnB0cisrKV0pKTsKLSAgfQotICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOwotfQotCi0KLS8qCi0gKiBTdGFydHVwOiB3cml0ZSB0aGUgZmlsZSBoZWFkZXIuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9vdXRwdXRfcHBtIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKLXsKLSAgcHBtX2Rlc3RfcHRyIGRlc3QgPSAocHBtX2Rlc3RfcHRyKSBkaW5mbzsKLQotICAvKiBFbWl0IGZpbGUgaGVhZGVyICovCi0gIHN3aXRjaCAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSkgewotICBjYXNlIEpDU19HUkFZU0NBTEU6Ci0gICAgLyogZW1pdCBoZWFkZXIgZm9yIHJhdyBQR00gZm9ybWF0ICovCi0gICAgZnByaW50ZihkZXN0LT5wdWIub3V0cHV0X2ZpbGUsICJQNVxuJWxkICVsZFxuJWRcbiIsCi0JICAgIChsb25nKSBjaW5mby0+b3V0cHV0X3dpZHRoLCAobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQsCi0JICAgIFBQTV9NQVhWQUwpOwotICAgIGJyZWFrOwotICBjYXNlIEpDU19SR0I6Ci0gICAgLyogZW1pdCBoZWFkZXIgZm9yIHJhdyBQUE0gZm9ybWF0ICovCi0gICAgZnByaW50ZihkZXN0LT5wdWIub3V0cHV0X2ZpbGUsICJQNlxuJWxkICVsZFxuJWRcbiIsCi0JICAgIChsb25nKSBjaW5mby0+b3V0cHV0X3dpZHRoLCAobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQsCi0JICAgIFBQTV9NQVhWQUwpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUFBNX0NPTE9SU1BBQ0UpOwotICB9Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX291dHB1dF9wcG0gKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKQotewotICAvKiBNYWtlIHN1cmUgd2Ugd3JvdGUgdGhlIG91dHB1dCBmaWxlIE9LICovCi0gIGZmbHVzaChkaW5mby0+b3V0cHV0X2ZpbGUpOwotICBpZiAoZmVycm9yKGRpbmZvLT5vdXRwdXRfZmlsZSkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKLX0KLQotCi0vKgotICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgUFBNIGZvcm1hdCBvdXRwdXQuCi0gKi8KLQotR0xPQkFMKGRqcGVnX2Rlc3RfcHRyKQotamluaXRfd3JpdGVfcHBtIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBwcG1fZGVzdF9wdHIgZGVzdDsKLQotICAvKiBDcmVhdGUgbW9kdWxlIGludGVyZmFjZSBvYmplY3QsIGZpbGwgaW4gbWV0aG9kIHBvaW50ZXJzICovCi0gIGRlc3QgPSAocHBtX2Rlc3RfcHRyKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIFNJWkVPRihwcG1fZGVzdF9zdHJ1Y3QpKTsKLSAgZGVzdC0+cHViLnN0YXJ0X291dHB1dCA9IHN0YXJ0X291dHB1dF9wcG07Ci0gIGRlc3QtPnB1Yi5maW5pc2hfb3V0cHV0ID0gZmluaXNoX291dHB1dF9wcG07Ci0KLSAgLyogQ2FsY3VsYXRlIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIHNvIHdlIGNhbiBhbGxvY2F0ZSBzcGFjZSAqLwotICBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoY2luZm8pOwotCi0gIC8qIENyZWF0ZSBwaHlzaWNhbCBJL08gYnVmZmVyLiAgTm90ZSB3ZSBtYWtlIHRoaXMgbmVhciBvbiBhIFBDLiAqLwotICBkZXN0LT5zYW1wbGVzX3Blcl9yb3cgPSBjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOwotICBkZXN0LT5idWZmZXJfd2lkdGggPSBkZXN0LT5zYW1wbGVzX3Blcl9yb3cgKiAoQllURVNQRVJTQU1QTEUgKiBTSVpFT0YoY2hhcikpOwotICBkZXN0LT5pb2J1ZmZlciA9IChjaGFyICopICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgZGVzdC0+YnVmZmVyX3dpZHRoKTsKLQotICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycyB8fCBCSVRTX0lOX0pTQU1QTEUgIT0gOCB8fAotICAgICAgU0laRU9GKEpTQU1QTEUpICE9IFNJWkVPRihjaGFyKSkgewotICAgIC8qIFdoZW4gcXVhbnRpemluZywgd2UgbmVlZCBhbiBvdXRwdXQgYnVmZmVyIGZvciBjb2xvcm1hcCBpbmRleGVzCi0gICAgICogdGhhdCdzIHNlcGFyYXRlIGZyb20gdGhlIHBoeXNpY2FsIEkvTyBidWZmZXIuICBXZSBhbHNvIG5lZWQgYQotICAgICAqIHNlcGFyYXRlIGJ1ZmZlciBpZiBwaXhlbCBmb3JtYXQgdHJhbnNsYXRpb24gbXVzdCB0YWtlIHBsYWNlLgotICAgICAqLwotICAgIGRlc3QtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0gICAgICAgY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cywgKEpESU1FTlNJT04pIDEpOwotICAgIGRlc3QtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKLSAgICBpZiAoISBjaW5mby0+cXVhbnRpemVfY29sb3JzKQotICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gY29weV9waXhlbF9yb3dzOwotICAgIGVsc2UgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkKLSAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9kZW1hcHBlZF9ncmF5OwotICAgIGVsc2UKLSAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9kZW1hcHBlZF9yZ2I7Ci0gIH0gZWxzZSB7Ci0gICAgLyogV2Ugd2lsbCBmd3JpdGUoKSBkaXJlY3RseSBmcm9tIGRlY29tcHJlc3NvciBvdXRwdXQgYnVmZmVyLiAqLwotICAgIC8qIFN5bnRoZXNpemUgYSBKU0FNUEFSUkFZIHBvaW50ZXIgc3RydWN0dXJlICovCi0gICAgLyogQ2FzdCBoZXJlIGltcGxpZXMgbmVhci0+ZmFyIHBvaW50ZXIgY29udmVyc2lvbiBvbiBQQ3MgKi8KLSAgICBkZXN0LT5waXhyb3cgPSAoSlNBTVBST1cpIGRlc3QtPmlvYnVmZmVyOwotICAgIGRlc3QtPnB1Yi5idWZmZXIgPSAmIGRlc3QtPnBpeHJvdzsKLSAgICBkZXN0LT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7Ci0gICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X3BpeGVsX3Jvd3M7Ci0gIH0KLQotICByZXR1cm4gKGRqcGVnX2Rlc3RfcHRyKSBkZXN0OwotfQotCi0jZW5kaWYgLyogUFBNX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvd3JybGUuYyBiL3dycmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZTczMzcuLjAwMDAwMDAKLS0tIGEvd3JybGUuYworKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKgotICogd3JybGUuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHdyaXRlIG91dHB1dCBpbWFnZXMgaW4gUkxFIGZvcm1hdC4KLSAqIFRoZSBVdGFoIFJhc3RlciBUb29sa2l0IGxpYnJhcnkgaXMgcmVxdWlyZWQgKHZlcnNpb24gMy4xIG9yIGxhdGVyKS4KLSAqCi0gKiBUaGVzZSByb3V0aW5lcyBtYXkgbmVlZCBtb2RpZmljYXRpb24gZm9yIG5vbi1Vbml4IGVudmlyb25tZW50cyBvcgotICogc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgQXMgdGhleSBzdGFuZCwgdGhleSBhc3N1bWUgb3V0cHV0IHRvCi0gKiBhbiBvcmRpbmFyeSBzdGRpbyBzdHJlYW0uCi0gKgotICogQmFzZWQgb24gY29kZSBjb250cmlidXRlZCBieSBNaWtlIExpamV3c2tpLAotICogd2l0aCB1cGRhdGVzIGZyb20gUm9iZXJ0IEh1dGNoaW5zb24uCi0gKi8KLQotI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KLQotI2lmZGVmIFJMRV9TVVBQT1JURUQKLQotLyogcmxlLmggaXMgcHJvdmlkZWQgYnkgdGhlIFV0YWggUmFzdGVyIFRvb2xraXQuICovCi0KLSNpbmNsdWRlIDxybGUuaD4KLQotLyoKLSAqIFdlIGFzc3VtZSB0aGF0IEpTQU1QTEUgaGFzIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uIGFzIHJsZV9waXhlbCwKLSAqIHRvIHdpdCwgInVuc2lnbmVkIGNoYXIiLiAgSGVuY2Ugd2UgY2FuJ3QgY29wZSB3aXRoIDEyLSBvciAxNi1iaXQgc2FtcGxlcy4KLSAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFICE9IDgKLSAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOC1iaXQgSlNBTVBMRXMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLwotI2VuZGlmCi0KLQotLyoKLSAqIFNpbmNlIFJMRSBzdG9yZXMgc2NhbmxpbmVzIGJvdHRvbS10by10b3AsIHdlIGhhdmUgdG8gaW52ZXJ0IHRoZSBpbWFnZQotICogZnJvbSBKUEVHJ3MgdG9wLXRvLWJvdHRvbSBvcmRlci4gIFRvIGRvIHRoaXMsIHdlIHNhdmUgdGhlIG91dGdvaW5nIGRhdGEKLSAqIGluIGEgdmlydHVhbCBhcnJheSBkdXJpbmcgcHV0X3BpeGVsX3JvdyBjYWxscywgdGhlbiBhY3R1YWxseSBlbWl0IHRoZQotICogUkxFIGZpbGUgZHVyaW5nIGZpbmlzaF9vdXRwdXQuCi0gKi8KLQotCi0vKgotICogRm9yIG5vdywgaWYgd2UgZW1pdCBhbiBSTEUgY29sb3IgbWFwIHRoZW4gaXQgaXMgYWx3YXlzIDI1NiBlbnRyaWVzIGxvbmcsCi0gKiB0aG91Z2ggbm90IGFsbCBvZiB0aGUgZW50cmllcyBuZWVkIGJlIHVzZWQuCi0gKi8KLQotI2RlZmluZSBDTUFQQklUUwk4Ci0jZGVmaW5lIENNQVBMRU5HVEgJKDE8PChDTUFQQklUUykpCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0IHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIGp2aXJ0X3NhcnJheV9wdHIgaW1hZ2U7CS8qIHZpcnR1YWwgYXJyYXkgdG8gc3RvcmUgdGhlIG91dHB1dCBpbWFnZSAqLwotICBybGVfbWFwICpjb2xvcm1hcDsJIAkvKiBSTEUtc3R5bGUgY29sb3IgbWFwLCBvciBOVUxMIGlmIG5vbmUgKi8KLSAgcmxlX3BpeGVsICoqcmxlX3JvdzsJCS8qIFRvIHBhc3Mgcm93cyB0byBybGVfcHV0cm93KCkgKi8KLQotfSBybGVfZGVzdF9zdHJ1Y3Q7Ci0KLXR5cGVkZWYgcmxlX2Rlc3Rfc3RydWN0ICogcmxlX2Rlc3RfcHRyOwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTUVUSE9EREVGKHZvaWQpIHJsZV9wdXRfcGl4ZWxfcm93cwotICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCi0JIEpESU1FTlNJT04gcm93c19zdXBwbGllZCkpOwotCi0KLS8qCi0gKiBXcml0ZSB0aGUgZmlsZSBoZWFkZXIuCi0gKgotICogSW4gdGhpcyBtb2R1bGUgaXQncyBlYXNpZXIgdG8gd2FpdCB0aWxsIGZpbmlzaF9vdXRwdXQgdG8gd3JpdGUgYW55dGhpbmcuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9vdXRwdXRfcmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKLXsKLSAgcmxlX2Rlc3RfcHRyIGRlc3QgPSAocmxlX2Rlc3RfcHRyKSBkaW5mbzsKLSAgc2l6ZV90IGNtYXBzaXplOwotICBpbnQgaSwgY2k7Ci0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKLSNlbmRpZgotCi0gIC8qCi0gICAqIE1ha2Ugc3VyZSB0aGUgaW1hZ2UgY2FuIGJlIHN0b3JlZCBpbiBSTEUgZm9ybWF0LgotICAgKgotICAgKiAtIFJMRSBzdG9yZXMgaW1hZ2UgZGltZW5zaW9ucyBhcyAqc2lnbmVkKiAxNiBiaXQgaW50ZWdlcnMuICBKUEVHCi0gICAqICAgdXNlcyB1bnNpZ25lZCwgc28gd2UgaGF2ZSB0byBjaGVjayB0aGUgd2lkdGguCi0gICAqCi0gICAqIC0gQ29sb3JzcGFjZSBpcyBleHBlY3RlZCB0byBiZSBncmF5c2NhbGUgb3IgUkdCLgotICAgKgotICAgKiAtIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgKGNvbXBvbmVudHMpIGlzIGV4cGVjdGVkIHRvIGJlIDEgKGdyYXlzY2FsZS8KLSAgICogICBwc2V1ZG9jb2xvcikgb3IgMyAodHJ1ZWNvbG9yL2RpcmVjdGNvbG9yKS4KLSAgICogICAoY291bGQgYmUgMiBvciA0IGlmIHVzaW5nIGFuIGFscGhhIGNoYW5uZWwsIGJ1dCB3ZSBhcmVuJ3QpCi0gICAqLwotCi0gIGlmIChjaW5mby0+b3V0cHV0X3dpZHRoID4gMzI3NjcgfHwgY2luZm8tPm91dHB1dF9oZWlnaHQgPiAzMjc2NykKLSAgICBFUlJFWElUMihjaW5mbywgSkVSUl9STEVfRElNRU5TSU9OUywgY2luZm8tPm91dHB1dF93aWR0aCwgCi0JICAgICBjaW5mby0+b3V0cHV0X2hlaWdodCk7Ci0KLSAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgIT0gSkNTX0dSQVlTQ0FMRSAmJgotICAgICAgY2luZm8tPm91dF9jb2xvcl9zcGFjZSAhPSBKQ1NfUkdCKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUkxFX0NPTE9SU1BBQ0UpOwotCi0gIGlmIChjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgIT0gMSAmJiBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgIT0gMykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9STEVfVE9PTUFOWUNIQU5ORUxTLCBjaW5mby0+bnVtX2NvbXBvbmVudHMpOwotCi0gIC8qIENvbnZlcnQgY29sb3JtYXAsIGlmIGFueSwgdG8gUkxFIGZvcm1hdC4gKi8KLQotICBkZXN0LT5jb2xvcm1hcCA9IE5VTEw7Ci0KLSAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKLSAgICAvKiBBbGxvY2F0ZSBzdG9yYWdlIGZvciBSTEUtc3R5bGUgY21hcCwgemVybyBhbnkgZXh0cmEgZW50cmllcyAqLwotICAgIGNtYXBzaXplID0gY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzICogQ01BUExFTkdUSCAqIFNJWkVPRihybGVfbWFwKTsKLSAgICBkZXN0LT5jb2xvcm1hcCA9IChybGVfbWFwICopICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBjbWFwc2l6ZSk7Ci0gICAgTUVNWkVSTyhkZXN0LT5jb2xvcm1hcCwgY21hcHNpemUpOwotCi0gICAgLyogU2F2ZSBhd2F5IGRhdGEgaW4gUkxFIGZvcm1hdCAtLS0gbm90ZSA4LWJpdCBsZWZ0IHNoaWZ0ISAqLwotICAgIC8qIFNoaWZ0aW5nIHdvdWxkIG5lZWQgYWRqdXN0bWVudCBmb3IgSlNBTVBMRXMgd2lkZXIgdGhhbiA4IGJpdHMuICovCi0gICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOyBpKyspIHsKLSAgICAgICAgZGVzdC0+Y29sb3JtYXBbY2kgKiBDTUFQTEVOR1RIICsgaV0gPQotICAgICAgICAgIEdFVEpTQU1QTEUoY2luZm8tPmNvbG9ybWFwW2NpXVtpXSkgPDwgODsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBTZXQgdGhlIG91dHB1dCBidWZmZXIgdG8gdGhlIGZpcnN0IHJvdyAqLwotICBkZXN0LT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBkZXN0LT5pbWFnZSwgKEpESU1FTlNJT04pIDAsIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKLSAgZGVzdC0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOwotCi0gIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHJsZV9wdXRfcGl4ZWxfcm93czsKLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIHByb2dyZXNzLT50b3RhbF9leHRyYV9wYXNzZXMrKzsgIC8qIGNvdW50IGZpbGUgd3JpdGluZyBhcyBzZXBhcmF0ZSBwYXNzICovCi0gIH0KLSNlbmRpZgotfQotCi0KLS8qCi0gKiBXcml0ZSBzb21lIHBpeGVsIGRhdGEuCi0gKgotICogVGhpcyByb3V0aW5lIGp1c3Qgc2F2ZXMgdGhlIGRhdGEgYXdheSBpbiBhIHZpcnR1YWwgYXJyYXkuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1ybGVfcHV0X3BpeGVsX3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAotCQkgICAgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQotewotICBybGVfZGVzdF9wdHIgZGVzdCA9IChybGVfZGVzdF9wdHIpIGRpbmZvOwotCi0gIGlmIChjaW5mby0+b3V0cHV0X3NjYW5saW5lIDwgY2luZm8tPm91dHB1dF9oZWlnaHQpIHsKLSAgICBkZXN0LT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGRlc3QtPmltYWdlLAotICAgICAgIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUsIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKLSAgfQotfQotCi0vKgotICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0gKgotICogSGVyZSBpcyB3aGVyZSB3ZSByZWFsbHkgb3V0cHV0IHRoZSBSTEUgZmlsZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9vdXRwdXRfcmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKLXsKLSAgcmxlX2Rlc3RfcHRyIGRlc3QgPSAocmxlX2Rlc3RfcHRyKSBkaW5mbzsKLSAgcmxlX2hkciBoZWFkZXI7CQkvKiBPdXRwdXQgZmlsZSBpbmZvcm1hdGlvbiAqLwotICBybGVfcGl4ZWwgKipybGVfcm93LCAqcmVkLCAqZ3JlZW4sICpibHVlOwotICBKU0FNUFJPVyBvdXRwdXRfcm93OwotICBjaGFyIGNtYXBjb21tZW50WzgwXTsKLSAgaW50IHJvdywgY29sOwotICBpbnQgY2k7Ci0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKLSNlbmRpZgotCi0gIC8qIEluaXRpYWxpemUgdGhlIGhlYWRlciBpbmZvICovCi0gIGhlYWRlciA9ICpybGVfaGRyX2luaXQoTlVMTCk7Ci0gIGhlYWRlci5ybGVfZmlsZSA9IGRlc3QtPnB1Yi5vdXRwdXRfZmlsZTsKLSAgaGVhZGVyLnhtaW4gICAgID0gMDsKLSAgaGVhZGVyLnhtYXggICAgID0gY2luZm8tPm91dHB1dF93aWR0aCAgLSAxOwotICBoZWFkZXIueW1pbiAgICAgPSAwOwotICBoZWFkZXIueW1heCAgICAgPSBjaW5mby0+b3V0cHV0X2hlaWdodCAtIDE7Ci0gIGhlYWRlci5hbHBoYSAgICA9IDA7Ci0gIGhlYWRlci5uY29sb3JzICA9IGNpbmZvLT5vdXRwdXRfY29tcG9uZW50czsKLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm91dHB1dF9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgUkxFX1NFVF9CSVQoaGVhZGVyLCBjaSk7Ci0gIH0KLSAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKLSAgICBoZWFkZXIubmNtYXAgICA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKLSAgICBoZWFkZXIuY21hcGxlbiA9IENNQVBCSVRTOwotICAgIGhlYWRlci5jbWFwICAgID0gZGVzdC0+Y29sb3JtYXA7Ci0gICAgLyogQWRkIGEgY29tbWVudCB0byB0aGUgb3V0cHV0IGltYWdlIHdpdGggdGhlIHRydWUgY29sb3JtYXAgbGVuZ3RoLiAqLwotICAgIHNwcmludGYoY21hcGNvbW1lbnQsICJjb2xvcl9tYXBfbGVuZ3RoPSVkIiwgY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzKTsKLSAgICBybGVfcHV0Y29tKGNtYXBjb21tZW50LCAmaGVhZGVyKTsKLSAgfQotCi0gIC8qIEVtaXQgdGhlIFJMRSBoZWFkZXIgYW5kIGNvbG9yIG1hcCAoaWYgYW55KSAqLwotICBybGVfcHV0X3NldHVwKCZoZWFkZXIpOwotCi0gIC8qIE5vdyBvdXRwdXQgdGhlIFJMRSBkYXRhIGZyb20gb3VyIHZpcnR1YWwgYXJyYXkuCi0gICAqIFdlIGFzc3VtZSBoZXJlIHRoYXQgKGEpIHJsZV9waXhlbCBpcyByZXByZXNlbnRlZCB0aGUgc2FtZSBhcyBKU0FNUExFLAotICAgKiBhbmQgKGIpIHdlIGFyZSBub3Qgb24gYSBtYWNoaW5lIHdoZXJlIEZBUiBwb2ludGVycyBkaWZmZXIgZnJvbSByZWd1bGFyLgotICAgKi8KLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIHByb2dyZXNzLT5wdWIucGFzc19saW1pdCA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0OwotICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyID0gMDsKLSAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgfQotI2VuZGlmCi0KLSAgaWYgKGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyA9PSAxKSB7Ci0gICAgZm9yIChyb3cgPSBjaW5mby0+b3V0cHV0X2hlaWdodC0xOyByb3cgPj0gMDsgcm93LS0pIHsKLSAgICAgIHJsZV9yb3cgPSAocmxlX3BpeGVsICoqKSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBkZXN0LT5pbWFnZSwKLQkgKEpESU1FTlNJT04pIHJvdywgKEpESU1FTlNJT04pIDEsIEZBTFNFKTsKLSAgICAgIHJsZV9wdXRyb3cocmxlX3JvdywgKGludCkgY2luZm8tPm91dHB1dF93aWR0aCwgJmhlYWRlcik7Ci0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gICAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlcisrOwotICAgICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKHJvdyA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0LTE7IHJvdyA+PSAwOyByb3ctLSkgewotICAgICAgcmxlX3JvdyA9IChybGVfcGl4ZWwgKiopIGRlc3QtPnJsZV9yb3c7Ci0gICAgICBvdXRwdXRfcm93ID0gKiAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBkZXN0LT5pbWFnZSwKLQkgKEpESU1FTlNJT04pIHJvdywgKEpESU1FTlNJT04pIDEsIEZBTFNFKTsKLSAgICAgIHJlZCA9IHJsZV9yb3dbMF07Ci0gICAgICBncmVlbiA9IHJsZV9yb3dbMV07Ci0gICAgICBibHVlID0gcmxlX3Jvd1syXTsKLSAgICAgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICAgICAgKnJlZCsrID0gR0VUSlNBTVBMRSgqb3V0cHV0X3JvdysrKTsKLSAgICAgICAgKmdyZWVuKysgPSBHRVRKU0FNUExFKCpvdXRwdXRfcm93KyspOwotICAgICAgICAqYmx1ZSsrID0gR0VUSlNBTVBMRSgqb3V0cHV0X3JvdysrKTsKLSAgICAgIH0KLSAgICAgIHJsZV9wdXRyb3cocmxlX3JvdywgKGludCkgY2luZm8tPm91dHB1dF93aWR0aCwgJmhlYWRlcik7Ci0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gICAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlcisrOwotICAgICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLSAgfQotCi0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIGlmIChwcm9ncmVzcyAhPSBOVUxMKQotICAgIHByb2dyZXNzLT5jb21wbGV0ZWRfZXh0cmFfcGFzc2VzKys7Ci0jZW5kaWYKLQotICAvKiBFbWl0IGZpbGUgdHJhaWxlciAqLwotICBybGVfcHV0ZW9mKCZoZWFkZXIpOwotICBmZmx1c2goZGVzdC0+cHViLm91dHB1dF9maWxlKTsKLSAgaWYgKGZlcnJvcihkZXN0LT5wdWIub3V0cHV0X2ZpbGUpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7Ci19Ci0KLQotLyoKLSAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIFJMRSBmb3JtYXQgb3V0cHV0LgotICovCi0KLUdMT0JBTChkanBlZ19kZXN0X3B0cikKLWppbml0X3dyaXRlX3JsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcmxlX2Rlc3RfcHRyIGRlc3Q7Ci0KLSAgLyogQ3JlYXRlIG1vZHVsZSBpbnRlcmZhY2Ugb2JqZWN0LCBmaWxsIGluIG1ldGhvZCBwb2ludGVycyAqLwotICBkZXN0ID0gKHJsZV9kZXN0X3B0cikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRU9GKHJsZV9kZXN0X3N0cnVjdCkpOwotICBkZXN0LT5wdWIuc3RhcnRfb3V0cHV0ID0gc3RhcnRfb3V0cHV0X3JsZTsKLSAgZGVzdC0+cHViLmZpbmlzaF9vdXRwdXQgPSBmaW5pc2hfb3V0cHV0X3JsZTsKLQotICAvKiBDYWxjdWxhdGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgc28gd2UgY2FuIGFsbG9jYXRlIHNwYWNlICovCi0gIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyhjaW5mbyk7Ci0KLSAgLyogQWxsb2NhdGUgYSB3b3JrIGFycmF5IGZvciBvdXRwdXQgdG8gdGhlIFJMRSBsaWJyYXJ5LiAqLwotICBkZXN0LT5ybGVfcm93ID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLSAgICAgY2luZm8tPm91dHB1dF93aWR0aCwgKEpESU1FTlNJT04pIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyk7Ci0KLSAgLyogQWxsb2NhdGUgYSB2aXJ0dWFsIGFycmF5IHRvIGhvbGQgdGhlIGltYWdlLiAqLwotICBkZXN0LT5pbWFnZSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKLSAgICAgKEpESU1FTlNJT04pIChjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dHB1dF9jb21wb25lbnRzKSwKLSAgICAgY2luZm8tPm91dHB1dF9oZWlnaHQsIChKRElNRU5TSU9OKSAxKTsKLQotICByZXR1cm4gKGRqcGVnX2Rlc3RfcHRyKSBkZXN0OwotfQotCi0jZW5kaWYgLyogUkxFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvd3J0YXJnYS5jIGIvd3J0YXJnYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjEwNGQyLi4wMDAwMDAwCi0tLSBhL3dydGFyZ2EuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKgotICogd3J0YXJnYS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gd3JpdGUgb3V0cHV0IGltYWdlcyBpbiBUYXJnYSBmb3JtYXQuCi0gKgotICogVGhlc2Ugcm91dGluZXMgbWF5IG5lZWQgbW9kaWZpY2F0aW9uIGZvciBub24tVW5peCBlbnZpcm9ubWVudHMgb3IKLSAqIHNwZWNpYWxpemVkIGFwcGxpY2F0aW9ucy4gIEFzIHRoZXkgc3RhbmQsIHRoZXkgYXNzdW1lIG91dHB1dCB0bwotICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLgotICoKLSAqIEJhc2VkIG9uIGNvZGUgY29udHJpYnV0ZWQgYnkgTGVlIERhbmllbCBDcm9ja2VyLgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0KLSNpZmRlZiBUQVJHQV9TVVBQT1JURUQKLQotCi0vKgotICogVG8gc3VwcG9ydCAxMi1iaXQgSlBFRyBkYXRhLCB3ZSdkIGhhdmUgdG8gc2NhbGUgb3V0cHV0IGRvd24gdG8gOCBiaXRzLgotICogVGhpcyBpcyBub3QgeWV0IGltcGxlbWVudGVkLgotICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgIT0gOAotICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4LWJpdCBKU0FNUExFcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCi0jZW5kaWYKLQotLyoKLSAqIFRoZSBvdXRwdXQgYnVmZmVyIG5lZWRzIHRvIGJlIHdyaXRhYmxlIGJ5IGZ3cml0ZSgpLiAgT24gUENzLCB3ZSBtdXN0Ci0gKiBhbGxvY2F0ZSB0aGUgYnVmZmVyIGluIG5lYXIgZGF0YSBzcGFjZSwgYmVjYXVzZSB3ZSBhcmUgYXNzdW1pbmcgc21hbGwtZGF0YQotICogbWVtb3J5IG1vZGVsLCB3aGVyZWluIGZ3cml0ZSgpIGNhbid0IHJlYWNoIGZhciBtZW1vcnkuICBJZiB5b3UgbmVlZCB0bwotICogcHJvY2VzcyB2ZXJ5IHdpZGUgaW1hZ2VzIG9uIGEgUEMsIHlvdSBtaWdodCBoYXZlIHRvIGNvbXBpbGUgaW4gbGFyZ2UtbWVtb3J5Ci0gKiBtb2RlbCwgb3IgZWxzZSByZXBsYWNlIGZ3cml0ZSgpIHdpdGggYSBwdXRjKCkgbG9vcCAtLS0gd2hpY2ggd2lsbCBiZSBtdWNoCi0gKiBzbG93ZXIuCi0gKi8KLQotCi0vKiBQcml2YXRlIHZlcnNpb24gb2YgZGF0YSBkZXN0aW5hdGlvbiBvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QgZGpwZWdfZGVzdF9zdHJ1Y3QgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgY2hhciAqaW9idWZmZXI7CQkvKiBwaHlzaWNhbCBJL08gYnVmZmVyICovCi0gIEpESU1FTlNJT04gYnVmZmVyX3dpZHRoOwkvKiB3aWR0aCBvZiBvbmUgcm93ICovCi19IHRnYV9kZXN0X3N0cnVjdDsKLQotdHlwZWRlZiB0Z2FfZGVzdF9zdHJ1Y3QgKiB0Z2FfZGVzdF9wdHI7Ci0KLQotTE9DQUwodm9pZCkKLXdyaXRlX2hlYWRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sIGludCBudW1fY29sb3JzKQotLyogQ3JlYXRlIGFuZCB3cml0ZSBhIFRhcmdhIGhlYWRlciAqLwotewotICBjaGFyIHRhcmdhaGVhZGVyWzE4XTsKLQotICAvKiBTZXQgdW51c2VkIGZpZWxkcyBvZiBoZWFkZXIgdG8gMCAqLwotICBNRU1aRVJPKHRhcmdhaGVhZGVyLCBTSVpFT0YodGFyZ2FoZWFkZXIpKTsKLQotICBpZiAobnVtX2NvbG9ycyA+IDApIHsKLSAgICB0YXJnYWhlYWRlclsxXSA9IDE7CQkvKiBjb2xvciBtYXAgdHlwZSAxICovCi0gICAgdGFyZ2FoZWFkZXJbNV0gPSAoY2hhcikgKG51bV9jb2xvcnMgJiAweEZGKTsKLSAgICB0YXJnYWhlYWRlcls2XSA9IChjaGFyKSAobnVtX2NvbG9ycyA+PiA4KTsKLSAgICB0YXJnYWhlYWRlcls3XSA9IDI0OwkvKiAyNCBiaXRzIHBlciBjbWFwIGVudHJ5ICovCi0gIH0KLQotICB0YXJnYWhlYWRlclsxMl0gPSAoY2hhcikgKGNpbmZvLT5vdXRwdXRfd2lkdGggJiAweEZGKTsKLSAgdGFyZ2FoZWFkZXJbMTNdID0gKGNoYXIpIChjaW5mby0+b3V0cHV0X3dpZHRoID4+IDgpOwotICB0YXJnYWhlYWRlclsxNF0gPSAoY2hhcikgKGNpbmZvLT5vdXRwdXRfaGVpZ2h0ICYgMHhGRik7Ci0gIHRhcmdhaGVhZGVyWzE1XSA9IChjaGFyKSAoY2luZm8tPm91dHB1dF9oZWlnaHQgPj4gOCk7Ci0gIHRhcmdhaGVhZGVyWzE3XSA9IDB4MjA7CS8qIFRvcC1kb3duLCBub24taW50ZXJsYWNlZCAqLwotCi0gIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpIHsKLSAgICB0YXJnYWhlYWRlclsyXSA9IDM7CQkvKiBpbWFnZSB0eXBlID0gdW5jb21wcmVzc2VkIGdyYXktc2NhbGUgKi8KLSAgICB0YXJnYWhlYWRlclsxNl0gPSA4OwkvKiBiaXRzIHBlciBwaXhlbCAqLwotICB9IGVsc2UgewkJCS8qIG11c3QgYmUgUkdCICovCi0gICAgaWYgKG51bV9jb2xvcnMgPiAwKSB7Ci0gICAgICB0YXJnYWhlYWRlclsyXSA9IDE7CS8qIGltYWdlIHR5cGUgPSBjb2xvcm1hcHBlZCBSR0IgKi8KLSAgICAgIHRhcmdhaGVhZGVyWzE2XSA9IDg7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRhcmdhaGVhZGVyWzJdID0gMjsJLyogaW1hZ2UgdHlwZSA9IHVuY29tcHJlc3NlZCBSR0IgKi8KLSAgICAgIHRhcmdhaGVhZGVyWzE2XSA9IDI0OwotICAgIH0KLSAgfQotCi0gIGlmIChKRldSSVRFKGRpbmZvLT5vdXRwdXRfZmlsZSwgdGFyZ2FoZWFkZXIsIDE4KSAhPSAoc2l6ZV90KSAxOCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOwotfQotCi0KLS8qCi0gKiBXcml0ZSBzb21lIHBpeGVsIGRhdGEuCi0gKiBJbiB0aGlzIG1vZHVsZSByb3dzX3N1cHBsaWVkIHdpbGwgYWx3YXlzIGJlIDEuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wdXRfcGl4ZWxfcm93cyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCi0JCUpESU1FTlNJT04gcm93c19zdXBwbGllZCkKLS8qIHVzZWQgZm9yIHVucXVhbnRpemVkIGZ1bGwtY29sb3Igb3V0cHV0ICovCi17Ci0gIHRnYV9kZXN0X3B0ciBkZXN0ID0gKHRnYV9kZXN0X3B0cikgZGluZm87Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOwotICByZWdpc3RlciBjaGFyICogb3V0cHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLQotICBpbnB0ciA9IGRlc3QtPnB1Yi5idWZmZXJbMF07Ci0gIG91dHB0ciA9IGRlc3QtPmlvYnVmZmVyOwotICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgb3V0cHRyWzBdID0gKGNoYXIpIEdFVEpTQU1QTEUoaW5wdHJbMl0pOyAvKiBSR0IgdG8gQkdSIG9yZGVyICovCi0gICAgb3V0cHRyWzFdID0gKGNoYXIpIEdFVEpTQU1QTEUoaW5wdHJbMV0pOwotICAgIG91dHB0clsyXSA9IChjaGFyKSBHRVRKU0FNUExFKGlucHRyWzBdKTsKLSAgICBpbnB0ciArPSAzLCBvdXRwdHIgKz0gMzsKLSAgfQotICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOwotfQotCi1NRVRIT0RERUYodm9pZCkKLXB1dF9ncmF5X3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAotCSAgICAgICBKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCi0vKiB1c2VkIGZvciBncmF5c2NhbGUgT1IgcXVhbnRpemVkIGNvbG9yIG91dHB1dCAqLwotewotICB0Z2FfZGVzdF9wdHIgZGVzdCA9ICh0Z2FfZGVzdF9wdHIpIGRpbmZvOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKLSAgcmVnaXN0ZXIgY2hhciAqIG91dHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgaW5wdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOwotICBvdXRwdHIgPSBkZXN0LT5pb2J1ZmZlcjsKLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICpvdXRwdHIrKyA9IChjaGFyKSBHRVRKU0FNUExFKCppbnB0cisrKTsKLSAgfQotICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOwotfQotCi0KLS8qCi0gKiBXcml0ZSBzb21lIGRlbWFwcGVkIHBpeGVsIGRhdGEgd2hlbiBjb2xvciBxdWFudGl6YXRpb24gaXMgaW4gZWZmZWN0LgotICogRm9yIFRhcmdhLCB0aGlzIGlzIG9ubHkgYXBwbGllZCB0byBncmF5c2NhbGUgZGF0YS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXB1dF9kZW1hcHBlZF9ncmF5IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKLQkJICAgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQotewotICB0Z2FfZGVzdF9wdHIgZGVzdCA9ICh0Z2FfZGVzdF9wdHIpIGRpbmZvOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKLSAgcmVnaXN0ZXIgY2hhciAqIG91dHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgY29sb3JfbWFwMCA9IGNpbmZvLT5jb2xvcm1hcFswXTsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgaW5wdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOwotICBvdXRwdHIgPSBkZXN0LT5pb2J1ZmZlcjsKLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICpvdXRwdHIrKyA9IChjaGFyKSBHRVRKU0FNUExFKGNvbG9yX21hcDBbR0VUSlNBTVBMRSgqaW5wdHIrKyldKTsKLSAgfQotICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOwotfQotCi0KLS8qCi0gKiBTdGFydHVwOiB3cml0ZSB0aGUgZmlsZSBoZWFkZXIuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9vdXRwdXRfdGdhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKLXsKLSAgdGdhX2Rlc3RfcHRyIGRlc3QgPSAodGdhX2Rlc3RfcHRyKSBkaW5mbzsKLSAgaW50IG51bV9jb2xvcnMsIGk7Ci0gIEZJTEUgKm91dGZpbGU7Ci0KLSAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkgewotICAgIC8qIFRhcmdhIGRvZXNuJ3QgaGF2ZSBhIG1hcHBlZCBncmF5c2NhbGUgZm9ybWF0LCBzbyB3ZSB3aWxsICovCi0gICAgLyogZGVtYXAgcXVhbnRpemVkIGdyYXkgb3V0cHV0LiAgTmV2ZXIgZW1pdCBhIGNvbG9ybWFwLiAqLwotICAgIHdyaXRlX2hlYWRlcihjaW5mbywgZGluZm8sIDApOwotICAgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKQotICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X2RlbWFwcGVkX2dyYXk7Ci0gICAgZWxzZQotICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X2dyYXlfcm93czsKLSAgfSBlbHNlIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKLSAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykgewotICAgICAgLyogV2Ugb25seSBzdXBwb3J0IDgtYml0IGNvbG9ybWFwIGluZGV4ZXMsIHNvIG9ubHkgMjU2IGNvbG9ycyAqLwotICAgICAgbnVtX2NvbG9ycyA9IGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9yczsKLSAgICAgIGlmIChudW1fY29sb3JzID4gMjU2KQotCUVSUkVYSVQxKGNpbmZvLCBKRVJSX1RPT19NQU5ZX0NPTE9SUywgbnVtX2NvbG9ycyk7Ci0gICAgICB3cml0ZV9oZWFkZXIoY2luZm8sIGRpbmZvLCBudW1fY29sb3JzKTsKLSAgICAgIC8qIFdyaXRlIHRoZSBjb2xvcm1hcC4gIE5vdGUgVGFyZ2EgdXNlcyBCR1IgYnl0ZSBvcmRlciAqLwotICAgICAgb3V0ZmlsZSA9IGRlc3QtPnB1Yi5vdXRwdXRfZmlsZTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29sb3JzOyBpKyspIHsKLQlwdXRjKEdFVEpTQU1QTEUoY2luZm8tPmNvbG9ybWFwWzJdW2ldKSwgb3V0ZmlsZSk7Ci0JcHV0YyhHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsxXVtpXSksIG91dGZpbGUpOwotCXB1dGMoR0VUSlNBTVBMRShjaW5mby0+Y29sb3JtYXBbMF1baV0pLCBvdXRmaWxlKTsKLSAgICAgIH0KLSAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9ncmF5X3Jvd3M7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHdyaXRlX2hlYWRlcihjaW5mbywgZGluZm8sIDApOwotICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X3BpeGVsX3Jvd3M7Ci0gICAgfQotICB9IGVsc2UgewotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX0NPTE9SU1BBQ0UpOwotICB9Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX291dHB1dF90Z2EgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKQotewotICAvKiBNYWtlIHN1cmUgd2Ugd3JvdGUgdGhlIG91dHB1dCBmaWxlIE9LICovCi0gIGZmbHVzaChkaW5mby0+b3V0cHV0X2ZpbGUpOwotICBpZiAoZmVycm9yKGRpbmZvLT5vdXRwdXRfZmlsZSkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKLX0KLQotCi0vKgotICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgVGFyZ2EgZm9ybWF0IG91dHB1dC4KLSAqLwotCi1HTE9CQUwoZGpwZWdfZGVzdF9wdHIpCi1qaW5pdF93cml0ZV90YXJnYSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgdGdhX2Rlc3RfcHRyIGRlc3Q7Ci0KLSAgLyogQ3JlYXRlIG1vZHVsZSBpbnRlcmZhY2Ugb2JqZWN0LCBmaWxsIGluIG1ldGhvZCBwb2ludGVycyAqLwotICBkZXN0ID0gKHRnYV9kZXN0X3B0cikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBTSVpFT0YodGdhX2Rlc3Rfc3RydWN0KSk7Ci0gIGRlc3QtPnB1Yi5zdGFydF9vdXRwdXQgPSBzdGFydF9vdXRwdXRfdGdhOwotICBkZXN0LT5wdWIuZmluaXNoX291dHB1dCA9IGZpbmlzaF9vdXRwdXRfdGdhOwotCi0gIC8qIENhbGN1bGF0ZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBzbyB3ZSBjYW4gYWxsb2NhdGUgc3BhY2UgKi8KLSAganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKGNpbmZvKTsKLQotICAvKiBDcmVhdGUgSS9PIGJ1ZmZlci4gIE5vdGUgd2UgbWFrZSB0aGlzIG5lYXIgb24gYSBQQy4gKi8KLSAgZGVzdC0+YnVmZmVyX3dpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50czsKLSAgZGVzdC0+aW9idWZmZXIgPSAoY2hhciAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJKHNpemVfdCkgKGRlc3QtPmJ1ZmZlcl93aWR0aCAqIFNJWkVPRihjaGFyKSkpOwotCi0gIC8qIENyZWF0ZSBkZWNvbXByZXNzb3Igb3V0cHV0IGJ1ZmZlci4gKi8KLSAgZGVzdC0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIGRlc3QtPmJ1ZmZlcl93aWR0aCwgKEpESU1FTlNJT04pIDEpOwotICBkZXN0LT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7Ci0KLSAgcmV0dXJuIChkanBlZ19kZXN0X3B0cikgZGVzdDsKLX0KLQotI2VuZGlmIC8qIFRBUkdBX1NVUFBPUlRFRCAqLwo=