Overview
The “No Free Lunch Theorem” (NFL) is a foundational concept in the field of optimization and machine learning, introduced by David Wolpert and William Macready in the 1990s (Wolpert, D. H., & Macready, W. G. , 1997). It essentially states that no one algorithm is universally better than others when averaged across all possible problems. This means that if an algorithm performs well on one class of problems, there must be another class of problems where it performs worse.
Explanation
At its core, the NFL theorem challenges the idea of a “silver bullet” in machine learning or optimization. It asserts that there is no universally best algorithm that can solve all problems optimally. The performance of any algorithm depends heavily on the specific characteristics of the problem at hand.
To understand the NFL theorem, consider the following intuitive example from machine learning:
Example 1: Classification Algorithms
Suppose you have two algorithms, \(A_1\) and \(A_2\), which you use to classify data. Algorithm \(A_1\) might perform exceptionally well on a certain type of dataset, say, where the features are linearly separable (think of logistic regression, which works well in such cases). However, if the dataset is highly non-linear and complex, algorithm \(A_2\), say a decision tree or a neural network, might outperform \(A_1\).
The NFL theorem tells us that if you take the performance of these two algorithms across all possible datasets, their average performance would be roughly the same. So while \(A_1\) excels on some datasets, there must be others where it performs poorly compared to \(A_2\), and vice versa.
Example 2: Optimization Algorithms
Consider optimization problems where you’re trying to find the minimum of a complex function. Different algorithms like gradient descent, evolutionary algorithms, or simulated annealing can be used to find this minimum. If gradient descent performs well on smooth and convex problems, it may perform poorly on non-smooth, multimodal problems, where simulated annealing might excel. The NFL theorem indicates that if you were to assess these algorithms across all possible optimization problems, their performance would even out.
Key Practical Takeaways
No Algorithm is Universally Best: If one algorithm outperforms others on a particular subset of problems, there are other problems where it will underperform.
Tailoring to the Problem: The NFL theorem suggests that it is crucial to choose or design algorithms based on the characteristics of the specific problem you’re dealing with, rather than assuming that one algorithm will always perform better.
Implication for Model Selection: When performing tasks like classification, regression, or clustering in machine learning, the NFL theorem encourages experimentation with different models. There’s no guarantee that a model like random forests, neural networks, or support vector machines will be the best in all scenarios.
Practical Considerations
While the NFL theorem is theoretically profound, in practice, many problems in machine learning fall into specific domains where some algorithms do indeed outperform others consistently. For example, neural networks have been incredibly successful in image recognition tasks, and support vector machines may work well in high-dimensional spaces. These successes arise because real-world problems often have structured, regular patterns, which are not part of the random, all-inclusive problem space envisioned by the NFL theorem.
Thus, while the NFL theorem serves as a warning against over-reliance on any single algorithm, it also highlights the importance of matching algorithms to problem characteristics.
Summary
In summary, the No Free Lunch Theorem underscores the idea that the “best” machine learning algorithm is context-dependent. There is no one-size-fits-all solution; algorithms must be selected and tuned based on the specific problem you are trying to solve.
References
Wolpert, D. H., & Macready, W. G. (1997). No Free Lunch Theorems for Optimization. IEEE Transactions on Evolutionary Computation, 1(1), 67-82. https://doi.org/10.1109/4235.585893
LS0tCnRpdGxlOiAiTm8gRnJlZSBMdW5jaCBUaGVvcmVtOiBObyBVbml2ZXJzYWwgTWFjaGluZSBMZWFybmluZyBBbGdvcml0aG0iCnBhcmFtczoKICBjYXRlZ29yeTogMwogIHN0YWNrczogIjAsMCIKICBudW1iZXI6IDEwNgogIHRpbWU6IDIwCiAgbGV2ZWw6IGJlZ2lubmVyCiAgdGFnczogbWFjaGluZSBsZWFybmluZyxzdGF0aXN0aWNzLG5vLWZyZWUgbHVuY2gsb3B0aW1pemF0aW9uLG1sCiAgZGVzY3JpcHRpb246ICJFeHBsYWlucyB0aGUgX05vIEZyZWUgTHVuY2ggVGhlb3JlbV8gaW4gbWFjaGluZSBsZWFybmluZyB0aGF0IAogICAgICAgICAgICAgICAgYXNzZXJ0cyB0aGF0IG5vIGFsZ29yaXRobSBpcyB1bml2ZXJzYWxseSBiZXR0ZXIgdGhhbiBvdGhlcnMgCiAgICAgICAgICAgICAgICBhY3Jvc3MgYWxsIHBvc3NpYmxlIHByb2JsZW1zLCBtZWFuaW5nIHBlcmZvcm1hbmNlIGRlcGVuZHMgb24gCiAgICAgICAgICAgICAgICB0aGUgc3BlY2lmaWMgdGFzayBhdCBoYW5kLiBJdCBoaWdobGlnaHRzIHRoZSBpbXBvcnRhbmNlIG9mIAogICAgICAgICAgICAgICAgc2VsZWN0aW5nIGFsZ29yaXRobXMgYmFzZWQgb24gdGhlIHByb2JsZW0ncyBjaGFyYWN0ZXJpc3RpY3MsIAogICAgICAgICAgICAgICAgYXMgdGhlcmUgaXMgbm8gb25lLXNpemUtZml0cy1hbGwgc29sdXRpb24uIgpkYXRlOiAiPHNtYWxsPmByIFN5cy5EYXRlKClgPC9zbWFsbD4iCmF1dGhvcjogIjxzbWFsbD5NYXJ0aW4gU2NoZWRsYmF1ZXI8L3NtYWxsPiIKZW1haWw6ICJtLnNjaGVkbGJhdWVyQG5ldS5lZHUiCmFmZmlsaXRhdGlvbjogIk5vcnRoZWFzdGVybiBVbml2ZXJzaXR5IgpvdXRwdXQ6IAogIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICB0aGVtZTogcmVhZGFibGUKICAgIGhpZ2hsaWdodDogdGFuZ28KLS0tCgotLS0KdGl0bGU6ICI8c21hbGw+YHIgcGFyYW1zJGNhdGVnb3J5YC5gciBwYXJhbXMkbnVtYmVyYDwvc21hbGw+PGJyLz48c3BhbiBzdHlsZT0nY29sb3I6ICMyRTQwNTM7IGZvbnQtc2l6ZTogMC45ZW0nPmByIHJtYXJrZG93bjo6bWV0YWRhdGEkdGl0bGVgPC9zcGFuPiIKLS0tCgpgYGB7ciBjb2RlPXhmdW46OnJlYWRfdXRmOChwYXN0ZTAoaGVyZTo6aGVyZSgpLCcvUi9faW5zZXJ0MkRCLlInKSksIGluY2x1ZGUgPSBGQUxTRX0KYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyBDb250ZW50cyBhdCBhIEdsYW5jZQoKLSAgIFtNb3RpdmF0aW9uXSgjbW90aXZhdGlvbikKLSAgIFtBc3N1bXB0aW9ucyBvZiBSZWdyZXNzaW9uIE1ldGhvZHNdKCNhc3N1bXB0aW9ucykKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgT3ZlcnZpZXcKClRoZSAiKk5vIEZyZWUgTHVuY2ggVGhlb3JlbSoiIChORkwpIGlzIGEgZm91bmRhdGlvbmFsIGNvbmNlcHQgaW4gdGhlIGZpZWxkIG9mIG9wdGltaXphdGlvbiBhbmQgbWFjaGluZSBsZWFybmluZywgaW50cm9kdWNlZCBieSBEYXZpZCBXb2xwZXJ0IGFuZCBXaWxsaWFtIE1hY3JlYWR5IGluIHRoZSAxOTkwcyAoV29scGVydCwgRC4gSC4sICYgTWFjcmVhZHksIFcuIEcuICwgMTk5NykuIEl0IGVzc2VudGlhbGx5IHN0YXRlcyB0aGF0IG5vIG9uZSBhbGdvcml0aG0gaXMgdW5pdmVyc2FsbHkgYmV0dGVyIHRoYW4gb3RoZXJzIHdoZW4gYXZlcmFnZWQgYWNyb3NzIGFsbCBwb3NzaWJsZSBwcm9ibGVtcy4gVGhpcyBtZWFucyB0aGF0IGlmIGFuIGFsZ29yaXRobSBwZXJmb3JtcyB3ZWxsIG9uIG9uZSBjbGFzcyBvZiBwcm9ibGVtcywgdGhlcmUgbXVzdCBiZSBhbm90aGVyIGNsYXNzIG9mIHByb2JsZW1zIHdoZXJlIGl0IHBlcmZvcm1zIHdvcnNlLgoKIyMgT3JpZ2luIGFuZCBGb3JtYWxpemF0aW9uCgpUaGUgTkZMIHRoZW9yZW0gb3JpZ2luYXRlcyBmcm9tIHJlc2VhcmNoIGluIG9wdGltaXphdGlvbiBhbmQgbWFjaGluZSBsZWFybmluZy4gV29scGVydCBhbmQgTWFjcmVhZHkgd2VyZSBzdHVkeWluZyB0aGUgcGVyZm9ybWFuY2Ugb2YgYWxnb3JpdGhtcyBhY3Jvc3MgZGlmZmVyZW50IHR5cGVzIG9mIHByb2JsZW1zIGFuZCBmb3VuZCB0aGF0IHdoZW4geW91IGNvbnNpZGVyIGFsbCBwb3NzaWJsZSBwcm9ibGVtcyAoaW5maW5pdGUgcG9zc2liaWxpdGllcyBvZiBwcm9ibGVtIHNwYWNlcyksIG5vIGFsZ29yaXRobSBjYW4gYmUgZXhwZWN0ZWQgdG8gY29uc2lzdGVudGx5IG91dHBlcmZvcm0gZXZlcnkgb3RoZXIgYWxnb3JpdGhtLiBUaGV5IGZvcm1hbGl6ZWQgdGhpcyBpZGVhIG1hdGhlbWF0aWNhbGx5LCBzaG93aW5nIHRoYXQgaWYgYW4gYWxnb3JpdGhtIHBlcmZvcm1zIGJldHRlciB0aGFuIG90aGVycyBvbiBvbmUgc2V0IG9mIHByb2JsZW1zLCBpdCB3aWxsIG5lY2Vzc2FyaWx5IHBlcmZvcm0gd29yc2Ugb24gb3RoZXIgc2V0cyBvZiBwcm9ibGVtcy4KCkJlZm9yZSBmdXJ0aGVyIHJlYWRpbmcsIGNvbnNpZGVyIHdhdGNoaW5nIHRoaXMgc2hvcnQgdmlkZW8gcHJvdmlkaW5nIGFuIG92ZXJ2aWV3IG9mIHRoZSB0aGVvcmVtIGFuZCBpdHMgaW1wbGljYXRpb25zIHRvIG1hY2hpbmUgbGVhcm5pbmcgYW5kIG9wdGltaXphdGlvbjoKCjxpZnJhbWUgd2lkdGg9IjU2MCIgaGVpZ2h0PSIzMTUiIHNyYz0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvQTI2Ukxvanc0Rm8/c2k9QmU2clFueWVacHpuZ3B4USIgdGl0bGU9IllvdVR1YmUgdmlkZW8gcGxheWVyIiBmcmFtZWJvcmRlcj0iMCIgYWxsb3c9ImFjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBjbGlwYm9hcmQtd3JpdGU7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmU7IHdlYi1zaGFyZSIgcmVmZXJyZXJwb2xpY3k9InN0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4iIGFsbG93ZnVsbHNjcmVlbiBkYXRhLWV4dGVybmFsPSIxIj4KCjwvaWZyYW1lPgoKIyMgRXhwbGFuYXRpb24KCkF0IGl0cyBjb3JlLCB0aGUgTkZMIHRoZW9yZW0gY2hhbGxlbmdlcyB0aGUgaWRlYSBvZiBhICJzaWx2ZXIgYnVsbGV0IiBpbiBtYWNoaW5lIGxlYXJuaW5nIG9yIG9wdGltaXphdGlvbi4gSXQgYXNzZXJ0cyB0aGF0IHRoZXJlIGlzIG5vIHVuaXZlcnNhbGx5IGJlc3QgYWxnb3JpdGhtIHRoYXQgY2FuIHNvbHZlIGFsbCBwcm9ibGVtcyBvcHRpbWFsbHkuIFRoZSBwZXJmb3JtYW5jZSBvZiBhbnkgYWxnb3JpdGhtIGRlcGVuZHMgaGVhdmlseSBvbiB0aGUgc3BlY2lmaWMgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBwcm9ibGVtIGF0IGhhbmQuCgpUbyB1bmRlcnN0YW5kIHRoZSBORkwgdGhlb3JlbSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBpbnR1aXRpdmUgZXhhbXBsZSBmcm9tIG1hY2hpbmUgbGVhcm5pbmc6CgojIyMgRXhhbXBsZSAxOiBDbGFzc2lmaWNhdGlvbiBBbGdvcml0aG1zCgpTdXBwb3NlIHlvdSBoYXZlIHR3byBhbGdvcml0aG1zLCAkQV8xJCBhbmQgJEFfMiQsIHdoaWNoIHlvdSB1c2UgdG8gY2xhc3NpZnkgZGF0YS4gQWxnb3JpdGhtICRBXzEkIG1pZ2h0IHBlcmZvcm0gZXhjZXB0aW9uYWxseSB3ZWxsIG9uIGEgY2VydGFpbiB0eXBlIG9mIGRhdGFzZXQsIHNheSwgd2hlcmUgdGhlIGZlYXR1cmVzIGFyZSBsaW5lYXJseSBzZXBhcmFibGUgKHRoaW5rIG9mIGxvZ2lzdGljIHJlZ3Jlc3Npb24sIHdoaWNoIHdvcmtzIHdlbGwgaW4gc3VjaCBjYXNlcykuIEhvd2V2ZXIsIGlmIHRoZSBkYXRhc2V0IGlzIGhpZ2hseSBub24tbGluZWFyIGFuZCBjb21wbGV4LCBhbGdvcml0aG0gJEFfMiQsIHNheSBhIGRlY2lzaW9uIHRyZWUgb3IgYSBuZXVyYWwgbmV0d29yaywgbWlnaHQgb3V0cGVyZm9ybSAkQV8xJC4KClRoZSBORkwgdGhlb3JlbSB0ZWxscyB1cyB0aGF0IGlmIHlvdSB0YWtlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGVzZSB0d28gYWxnb3JpdGhtcyBhY3Jvc3MgKmFsbCBwb3NzaWJsZSogZGF0YXNldHMsIHRoZWlyIGF2ZXJhZ2UgcGVyZm9ybWFuY2Ugd291bGQgYmUgcm91Z2hseSB0aGUgc2FtZS4gU28gd2hpbGUgJEFfMSQgZXhjZWxzIG9uIHNvbWUgZGF0YXNldHMsIHRoZXJlIG11c3QgYmUgb3RoZXJzIHdoZXJlIGl0IHBlcmZvcm1zIHBvb3JseSBjb21wYXJlZCB0byAkQV8yJCwgYW5kIHZpY2UgdmVyc2EuCgojIyMgRXhhbXBsZSAyOiBPcHRpbWl6YXRpb24gQWxnb3JpdGhtcwoKQ29uc2lkZXIgb3B0aW1pemF0aW9uIHByb2JsZW1zIHdoZXJlIHlvdSdyZSB0cnlpbmcgdG8gZmluZCB0aGUgbWluaW11bSBvZiBhIGNvbXBsZXggZnVuY3Rpb24uIERpZmZlcmVudCBhbGdvcml0aG1zIGxpa2UgZ3JhZGllbnQgZGVzY2VudCwgZXZvbHV0aW9uYXJ5IGFsZ29yaXRobXMsIG9yIHNpbXVsYXRlZCBhbm5lYWxpbmcgY2FuIGJlIHVzZWQgdG8gZmluZCB0aGlzIG1pbmltdW0uIElmIGdyYWRpZW50IGRlc2NlbnQgcGVyZm9ybXMgd2VsbCBvbiBzbW9vdGggYW5kIGNvbnZleCBwcm9ibGVtcywgaXQgbWF5IHBlcmZvcm0gcG9vcmx5IG9uIG5vbi1zbW9vdGgsIG11bHRpbW9kYWwgcHJvYmxlbXMsIHdoZXJlIHNpbXVsYXRlZCBhbm5lYWxpbmcgbWlnaHQgZXhjZWwuIFRoZSBORkwgdGhlb3JlbSBpbmRpY2F0ZXMgdGhhdCBpZiB5b3Ugd2VyZSB0byBhc3Nlc3MgdGhlc2UgYWxnb3JpdGhtcyBhY3Jvc3MgKmFsbCBwb3NzaWJsZSogb3B0aW1pemF0aW9uIHByb2JsZW1zLCB0aGVpciBwZXJmb3JtYW5jZSB3b3VsZCBldmVuIG91dC4KCiMjIEtleSBQcmFjdGljYWwgVGFrZWF3YXlzCgoxLiAgKipObyBBbGdvcml0aG0gaXMgVW5pdmVyc2FsbHkgQmVzdCoqOiBJZiBvbmUgYWxnb3JpdGhtIG91dHBlcmZvcm1zIG90aGVycyBvbiBhIHBhcnRpY3VsYXIgc3Vic2V0IG9mIHByb2JsZW1zLCB0aGVyZSBhcmUgb3RoZXIgcHJvYmxlbXMgd2hlcmUgaXQgd2lsbCB1bmRlcnBlcmZvcm0uCgoyLiAgKipUYWlsb3JpbmcgdG8gdGhlIFByb2JsZW0qKjogVGhlIE5GTCB0aGVvcmVtIHN1Z2dlc3RzIHRoYXQgaXQgaXMgY3J1Y2lhbCB0byBjaG9vc2Ugb3IgZGVzaWduIGFsZ29yaXRobXMgYmFzZWQgb24gdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgc3BlY2lmaWMgcHJvYmxlbSB5b3UncmUgZGVhbGluZyB3aXRoLCByYXRoZXIgdGhhbiBhc3N1bWluZyB0aGF0IG9uZSBhbGdvcml0aG0gd2lsbCBhbHdheXMgcGVyZm9ybSBiZXR0ZXIuCgozLiAgKipJbXBsaWNhdGlvbiBmb3IgTW9kZWwgU2VsZWN0aW9uKio6IFdoZW4gcGVyZm9ybWluZyB0YXNrcyBsaWtlIGNsYXNzaWZpY2F0aW9uLCByZWdyZXNzaW9uLCBvciBjbHVzdGVyaW5nIGluIG1hY2hpbmUgbGVhcm5pbmcsIHRoZSBORkwgdGhlb3JlbSBlbmNvdXJhZ2VzIGV4cGVyaW1lbnRhdGlvbiB3aXRoIGRpZmZlcmVudCBtb2RlbHMuIFRoZXJl4oCZcyBubyBndWFyYW50ZWUgdGhhdCBhIG1vZGVsIGxpa2UgcmFuZG9tIGZvcmVzdHMsIG5ldXJhbCBuZXR3b3Jrcywgb3Igc3VwcG9ydCB2ZWN0b3IgbWFjaGluZXMgd2lsbCBiZSB0aGUgYmVzdCBpbiBhbGwgc2NlbmFyaW9zLgoKIyMgRm9ybWFsIFN0YXRlbWVudAoKVG8gZ2l2ZSBhIG1vcmUgbWF0aGVtYXRpY2FsIGZsYXZvciBvZiB0aGUgTkZMIHRoZW9yZW0sIGNvbnNpZGVyIGEgZm9ybWFsIHNldHRpbmcgd2hlcmUgJFAkIHJlcHJlc2VudHMgYSBkaXN0cmlidXRpb24gb2YgYWxsIHBvc3NpYmxlIHByb2JsZW1zIGFuZCAkQSQgaXMgYW4gYWxnb3JpdGhtIGRlc2lnbmVkIHRvIHNvbHZlIHByb2JsZW1zIGRyYXduIGZyb20gJFAkLiBUaGUgdGhlb3JlbSBjYW4gYmUgZnJhbWVkIGFzIGZvbGxvd3M6CgpMZXQgJFxtYXRoZnJha3tBfSQgYmUgdGhlIHNldCBvZiBhbGwgcG9zc2libGUgYWxnb3JpdGhtcywgYW5kIGxldCAkXG1hdGhmcmFre1B9JCBiZSB0aGUgc2V0IG9mIGFsbCBwb3NzaWJsZSBvcHRpbWl6YXRpb24gcHJvYmxlbXMuIEZvciBhbnkgYWxnb3JpdGhtICRBXzEgXGluIFxtYXRoZnJha3tBfSQgYW5kICRBXzIgXGluIFxtYXRoZnJha3tBfSQsIGF2ZXJhZ2VkIG92ZXIgYWxsIHBvc3NpYmxlIHByb2JsZW1zICRcbWF0aGZyYWt7UH0kLAoKJCQKXHN1bV97UCBcaW4gXG1hdGhmcmFre1B9fSBmKEFfMSwgUCkgPSBcc3VtX3tQIFxpbiBcbWF0aGZyYWt7UH19IGYoQV8yLCBQKQokJAoKd2hlcmUgJGYoQSwgUCkkIHJlcHJlc2VudHMgdGhlIHBlcmZvcm1hbmNlIG9mIGFsZ29yaXRobSAkQSQgb24gcHJvYmxlbSAkUCQuCgojIyBQcmFjdGljYWwgQ29uc2lkZXJhdGlvbnMKCldoaWxlIHRoZSBORkwgdGhlb3JlbSBpcyB0aGVvcmV0aWNhbGx5IHByb2ZvdW5kLCBpbiBwcmFjdGljZSwgbWFueSBwcm9ibGVtcyBpbiBtYWNoaW5lIGxlYXJuaW5nIGZhbGwgaW50byBzcGVjaWZpYyBkb21haW5zIHdoZXJlIHNvbWUgYWxnb3JpdGhtcyBkbyBpbmRlZWQgb3V0cGVyZm9ybSBvdGhlcnMgY29uc2lzdGVudGx5LiBGb3IgZXhhbXBsZSwgbmV1cmFsIG5ldHdvcmtzIGhhdmUgYmVlbiBpbmNyZWRpYmx5IHN1Y2Nlc3NmdWwgaW4gaW1hZ2UgcmVjb2duaXRpb24gdGFza3MsIGFuZCBzdXBwb3J0IHZlY3RvciBtYWNoaW5lcyBtYXkgd29yayB3ZWxsIGluIGhpZ2gtZGltZW5zaW9uYWwgc3BhY2VzLiBUaGVzZSBzdWNjZXNzZXMgYXJpc2UgYmVjYXVzZSByZWFsLXdvcmxkIHByb2JsZW1zIG9mdGVuIGhhdmUgc3RydWN0dXJlZCwgcmVndWxhciBwYXR0ZXJucywgd2hpY2ggYXJlIG5vdCBwYXJ0IG9mIHRoZSByYW5kb20sIGFsbC1pbmNsdXNpdmUgcHJvYmxlbSBzcGFjZSBlbnZpc2lvbmVkIGJ5IHRoZSBORkwgdGhlb3JlbS4KCj4gVGh1cywgd2hpbGUgdGhlIE5GTCB0aGVvcmVtIHNlcnZlcyBhcyBhIHdhcm5pbmcgYWdhaW5zdCBvdmVyLXJlbGlhbmNlIG9uIGFueSBzaW5nbGUgYWxnb3JpdGhtLCBpdCBhbHNvIGhpZ2hsaWdodHMgdGhlIGltcG9ydGFuY2Ugb2YgbWF0Y2hpbmcgYWxnb3JpdGhtcyB0byBwcm9ibGVtIGNoYXJhY3RlcmlzdGljcy4KCiMjIFN1bW1hcnkKCkluIHN1bW1hcnksIHRoZSAqTm8gRnJlZSBMdW5jaCBUaGVvcmVtKiB1bmRlcnNjb3JlcyB0aGUgaWRlYSB0aGF0IHRoZSAiYmVzdCIgbWFjaGluZSBsZWFybmluZyBhbGdvcml0aG0gaXMgY29udGV4dC1kZXBlbmRlbnQuIFRoZXJlIGlzIG5vIG9uZS1zaXplLWZpdHMtYWxsIHNvbHV0aW9uOyBhbGdvcml0aG1zIG11c3QgYmUgc2VsZWN0ZWQgYW5kIHR1bmVkIGJhc2VkIG9uIHRoZSBzcGVjaWZpYyBwcm9ibGVtIHlvdSBhcmUgdHJ5aW5nIHRvIHNvbHZlLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBGaWxlcyAmIFJlc291cmNlcwoKYGBge3IgemlwRmlsZXMsIGVjaG89RkFMU0V9CnppcE5hbWUgPSBzcHJpbnRmKCJMZXNzb25GaWxlcy0lcy0lcy56aXAiLCAKICAgICAgICAgICAgICAgICBwYXJhbXMkY2F0ZWdvcnksCiAgICAgICAgICAgICAgICAgcGFyYW1zJG51bWJlcikKCnRleHRBTGluayA9IHBhc3RlMCgiQWxsIEZpbGVzIGZvciBMZXNzb24gIiwgCiAgICAgICAgICAgICAgIHBhcmFtcyRjYXRlZ29yeSwiLiIscGFyYW1zJG51bWJlcikKCiMgZG93bmxvYWRGaWxlc0xpbmsoKSBpcyBpbmNsdWRlZCBmcm9tIF9pbnNlcnQyREIuUgprbml0cjo6cmF3X2h0bWwoZG93bmxvYWRGaWxlc0xpbmsoIi4iLCB6aXBOYW1lLCB0ZXh0QUxpbmspKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgUmVmZXJlbmNlcwoKV29scGVydCwgRC4gSC4sICYgTWFjcmVhZHksIFcuIEcuICgxOTk3KS4gKk5vIEZyZWUgTHVuY2ggVGhlb3JlbXMgZm9yIE9wdGltaXphdGlvbiouIElFRUUgVHJhbnNhY3Rpb25zIG9uIEV2b2x1dGlvbmFyeSBDb21wdXRhdGlvbiwgMSgxKSwgNjctODIuIDxodHRwczovL2RvaS5vcmcvMTAuMTEwOS80MjM1LjU4NTg5Mz4KCiMjIEVycmF0YQoKTm9uZSBjb2xsZWN0ZWQgeWV0LiBbTGV0IHVzIGtub3ddKGh0dHBzOi8vZm9ybS5qb3Rmb3JtLmNvbS8yMTIxODcwNzI3ODQxNTcpe3RhcmdldD0iX2JsYW5rIn0uCg==