Introduction

The rise of data science competitions has profoundly shaped modern machine learning, both in practice and pedagogy. Platforms such as Kaggle, DrivenData, Zindi, KDD Cup, CrowdAI, and Topcoder have created ecosystems where individuals and teams compete to build the most accurate predictive models on shared datasets. These competitions are not just gamified analytics challenges—they are often tied to real-world problems in healthcare, finance, climate science, public policy, and e-commerce. In many of these competitions, ensemble methods consistently form the backbone of the winning solutions.

Among the most well-known platforms, Kaggle—acquired by Google in 2017—stands as the largest and most influential. It hosts hundreds of competitions annually, ranging from open research challenges to private industry-sponsored problems offering significant financial rewards. Platforms like DrivenData and Zindi focus on social impact problems and emerging markets, respectively, while KDD Cup remains a respected academic competition tied to the annual ACM SIGKDD conference.

Participation is open to anyone with a free account. Competitors are typically provided with a labeled training set, an unlabeled test set, and a problem description. Submissions are evaluated automatically against a hidden holdout test set using a predefined metric (e.g., root mean squared error, log-loss, AUC). A real-time leaderboard displays public scores, though final rankings depend on performance on a private test partition to prevent leaderboard overfitting.

Historical Context: Ensembles Dominante

The dominance of ensemble methods in competitions can be traced to the famous Netflix Prize (2006–2009), where teams competed to improve Netflix’s movie recommendation system. The $1 million prize was awarded to a stacked ensemble of hundreds of models, many of them independently trained and blended using ridge regression and neural nets. This established a pattern: the best results often arise not from a single model, but from clever combinations of many diverse models.

Competitions like the Kaggle Heritage Health Prize, BNP Paribas Cardif Claim Management, and Home Credit Default Risk further reinforced this pattern. In nearly all top-tier solutions, ensemble learning—especially stacking, blending, bagged boosting models, and model averaging—played a central role.

Common Winning Ensemble Architectures

Modern winning ensembles are rarely trivial. They often follow hierarchical, multi-layered architectures such as:

  • Stacked generalization with multiple first-layer models (e.g., LightGBM, CatBoost, neural nets, logistic regression) and a second-level meta-learner (e.g., XGBoost or ridge regression).
  • Blended models, which average predictions from different models trained with different seeds, features, or folds.
  • Cross-validated folds ensembles, where base models are trained on different folds and their predictions are averaged or passed to a meta-model.
  • Hybrid ensembles, combining tree-based models (for structured data) with deep learning models (for embeddings or time series features).

These architectures exploit both model diversity and error decorrelation, and often include hundreds of individual models, trained with subtle variations in hyperparameters, feature selection, and data transformations (Breiman, 1996; Wolpert, 1992; Freund & Schapire, 1997).

Competition-Style Ensemble in R: A Practical Illustration

To illustrate how an ensemble might be constructed in a competition, consider the House Prices competition (a popular Kaggle example). We’ll use a simplified version in R that includes:

  1. A base layer of diverse models (lm, rpart, xgboost)
  2. A meta-model trained on their predictions
# Load required packages
library(caret)
library(caretEnsemble)
library(xgboost)
library(rpart)
library(MASS)

# Load the dataset
data(Boston)
housing <- Boston
names(housing)[which(names(housing) == "medv")] <- "price"

# Train-test split
set.seed(123)
train.index <- createDataPartition(housing$price, p = 0.8, list = FALSE)
train.data <- housing[train.index, ]
test.data <- housing[-train.index, ]

# Train base models
control <- trainControl(method = "cv", number = 5,
                        savePredictions = "final",
                        allowParallel = TRUE)

base.models <- caretList(
  price ~ ., data = train.data,
  trControl = control,
  tuneList = list(
    lm = caretModelSpec(method = "lm"),
    tree = caretModelSpec(method = "rpart"),
    xgb = caretModelSpec(method = "xgbTree", 
                         tuneGrid = expand.grid(nrounds = 100,
                                                max_depth = 3,
                                                eta = 0.1,
                                                gamma = 0,
                                                colsample_bytree = 1,
                                                min_child_weight = 1,
                                                subsample = 1))
  )
)

# Stacking meta-model
stack.model <- caretStack(base.models, method = "glm", trControl = control)

# Predict and evaluate
preds <- predict(stack.model, newdata = test.data)
rmse <- sqrt(mean((preds - test.data$price)^2))
cat("Stacked RMSE on test set:", round(rmse, 2), "\n")

This code demonstrates the essence of competition-style ensembling using stacking. In practice, competitors would iterate over dozens of such base models, engineer features extensively, and optimize hyperparameters with advanced tools like mlr3 or BayesianOptimization.

Ethical Considerations and Critiques

While competitions foster innovation and collaboration, they are not without criticism. Key ethical and practical concerns include:

  • Leaderboard overfitting: Repeated submissions encourage tuning to the public leaderboard, which may harm generalization. Kaggle addresses this with private leaderboards, but the risk remains.
  • Computational privilege: Top-performing solutions often require substantial computing power, favoring competitors with access to GPUs and clusters.
  • Black-box modeling: Competitions reward predictive accuracy, not interpretability. This can lead to deployment of opaque models in sensitive domains like health or finance without adequate scrutiny.
  • Reproducibility issues: Many winning solutions are too complex or poorly documented to replicate, which undermines transparency and knowledge transfer.
  • Cultural bias: Platforms like Kaggle are English-centric and dominated by teams from high-income countries, limiting global inclusion.

Despite these concerns, competitions have played a transformative role in democratizing access to real-world data problems and popularizing best practices in ensemble modeling (Dodge et al., 2019; Lipton, 2018).

Practical Tips for Students and Practitioners

For those looking to compete or to simulate real-world model evaluation, the following practices are common among top competitors:

  • Start simple: Begin with a strong single model (e.g., xgboost, ranger) and develop a solid cross-validation scheme.
  • Log everything: Track performance across folds, seeds, and parameter settings. Reproducibility is key.
  • Stack wisely: Use out-of-fold predictions for stacking to avoid overfitting. Keep the meta-model simple.
  • Feature engineering wins: Clean data and insightful features often matter more than model complexity.
  • Blend diverse models: Combine models with different assumptions (trees vs. linear vs. neighbors). Diversity matters.
  • Respect leakage: Avoid using test data or derived variables that “peek” into the future or outcome.

Finally, always be cautious when adapting competition-winning models for deployment in real-world settings. Competitions optimize for score, not always for fairness, explainability, or long-term reliability.

Competing with Model Stacking


Files & Resources

All Files for Lesson 3.990

References

Foundational Works on Ensembles and Stacking:

Breiman, L. (1996). Bagging predictors. Machine Learning, 24(2), 123–140. https://doi.org/10.1007/BF00058655

Freund, Y., & Schapire, R. E. (1997). A decision-theoretic generalization of on-line learning and an application to boosting. Journal of Computer and System Sciences, 55(1), 119–139. https://doi.org/10.1006/jcss.1997.1504

Wolpert, D. H. (1992). Stacked generalization. Neural Networks, 5(2), 241–259. https://doi.org/10.1016/S0893-6080(05)80023-1

Caruana, R., Niculescu-Mizil, A., Crew, G., & Ksikes, A. (2004). Ensemble selection from libraries of models. In Proceedings of the Twenty-First International Conference on Machine Learning (pp. 18). https://doi.org/10.1145/1015330.1015432

Sill, J., Tikk, D., Zhang, Y., & Kadlec, R. (2009). Feature-weighted linear stacking. arXiv preprint arXiv:0911.0460. https://arxiv.org/abs/0911.0460

Historical Context and Netflix Prize:

Bell, R. M., Koren, Y., & Volinsky, C. (2007). The BellKor solution to the Netflix Prize. Netflix Prize documentation. Retrieved from https://www.netflixprize.com/assets/ProgressPrize2007_BPC_BellKor.pdf

Koren, Y. (2009). The BellKor solution to the Netflix Grand Prize. Netflix Prize documentation. Retrieved from https://www.netflixprize.com/assets/GrandPrize2009_BPC_BellKor.pdf

Platform and Competition Descriptions:

Kaggle. (2023). Kaggle competitions overview. Retrieved from https://www.kaggle.com/competitions

DrivenData. (2023). DrivenData: Data science competitions for social good. Retrieved from https://www.drivendata.org/

Zindi. (2023). Zindi: The data science competition platform for Africa. Retrieved from https://zindi.africa/

Ethics, Reproducibility, and Competition Culture:

Dodge, J., Gururangan, S., Card, D., Schwartz, R., & Smith, N. A. (2019). Show your work: Improved reporting of experimental results. In Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing (EMNLP) (pp. 2185–2194). https://doi.org/10.18653/v1/D19-1224

Lipton, Z. C. (2018). The mythos of model interpretability. Communications of the ACM, 61(10), 36–43. https://doi.org/10.1145/3233231

Errata

Let us know.

LS0tCnRpdGxlOiAiV2lubmluZyBTdHJhdGVnaWVzIGZvciBEYXRhIFNjaWVuY2UgQ29tcGV0aXRpb25zIgpwYXJhbXM6CiAgY2F0ZWdvcnk6IDMKICBzdGFja3M6IDAKICBudW1iZXI6IDk5MAogIHRpbWU6IDQ1CiAgbGV2ZWw6IGJlZ2lubmVyCiAgdGFnczogeGdib29zdCxtYWNoaW5lIGxlYXJuaW5nLHJlZ3Jlc3Npb24sY2xhc3NpZmljYXRpb24sZW5zZW1ibGUsZGVjaXNpb24gdHJlZSxjb21wZXRpdGlvbnMsa2FnZ2xlCiAgZGVzY3JpcHRpb246ICJQcmVzZW50cyBzdHJhdGVnaWVzIGZvciBjb21wZXRpbmcgaW4gS2FnZ2xlIGFuZCBvdGhlciBtYWNoaW5lIGxlYXJuaW5nCiAgICAgICAgICAgICAgICBjb21wZXRpdGlvbnMuIFByb3ZpZGVzIHByYWN0aWNhbCBjb2RlIGluIFIuIgpkYXRlOiAiPHNtYWxsPmByIFN5cy5EYXRlKClgPC9zbWFsbD4iCmF1dGhvcjogIjxzbWFsbD5NYXJ0aW4gU2NoZWRsYmF1ZXI8L3NtYWxsPiIKZW1haWw6ICJtLnNjaGVkbGJhdWVyQG5ldS5lZHUiCmFmZmlsaXRhdGlvbjogIk5vcnRoZWFzdGVybiBVbml2ZXJzaXR5IgpvdXRwdXQ6IAogIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICB0aGVtZTogc3BhY2VsYWIKICAgIGhpZ2hsaWdodDogdGFuZ28KLS0tCgotLS0KdGl0bGU6ICI8c21hbGw+YHIgcGFyYW1zJGNhdGVnb3J5YC5gciBwYXJhbXMkbnVtYmVyYDwvc21hbGw+PGJyLz48c3BhbiBzdHlsZT0nY29sb3I6ICMyRTQwNTM7IGZvbnQtc2l6ZTogMC45ZW0nPmByIHJtYXJrZG93bjo6bWV0YWRhdGEkdGl0bGVgPC9zcGFuPiIKLS0tCgpgYGB7ciBjb2RlPXhmdW46OnJlYWRfdXRmOChwYXN0ZTAoaGVyZTo6aGVyZSgpLCcvUi9faW5zZXJ0MkRCLlInKSksIGluY2x1ZGUgPSBGQUxTRX0KYGBgCgojIyBJbnRyb2R1Y3Rpb24KClRoZSByaXNlIG9mICpkYXRhIHNjaWVuY2UgY29tcGV0aXRpb25zKiBoYXMgcHJvZm91bmRseSBzaGFwZWQgbW9kZXJuIG1hY2hpbmUgbGVhcm5pbmcsIGJvdGggaW4gcHJhY3RpY2UgYW5kIHBlZGFnb2d5LiBQbGF0Zm9ybXMgc3VjaCBhcyAqS2FnZ2xlKiwgKkRyaXZlbkRhdGEqLCAqWmluZGkqLCAqS0REIEN1cCosICpDcm93ZEFJKiwgYW5kICpUb3Bjb2RlciogaGF2ZSBjcmVhdGVkIGVjb3N5c3RlbXMgd2hlcmUgaW5kaXZpZHVhbHMgYW5kIHRlYW1zIGNvbXBldGUgdG8gYnVpbGQgdGhlIG1vc3QgYWNjdXJhdGUgcHJlZGljdGl2ZSBtb2RlbHMgb24gc2hhcmVkIGRhdGFzZXRzLiBUaGVzZSBjb21wZXRpdGlvbnMgYXJlIG5vdCBqdXN0IGdhbWlmaWVkIGFuYWx5dGljcyBjaGFsbGVuZ2Vz4oCUdGhleSBhcmUgb2Z0ZW4gdGllZCB0byByZWFsLXdvcmxkIHByb2JsZW1zIGluIGhlYWx0aGNhcmUsIGZpbmFuY2UsIGNsaW1hdGUgc2NpZW5jZSwgcHVibGljIHBvbGljeSwgYW5kIGUtY29tbWVyY2UuIEluIG1hbnkgb2YgdGhlc2UgY29tcGV0aXRpb25zLCBlbnNlbWJsZSBtZXRob2RzIGNvbnNpc3RlbnRseSBmb3JtIHRoZSBiYWNrYm9uZSBvZiB0aGUgd2lubmluZyBzb2x1dGlvbnMuCgpBbW9uZyB0aGUgbW9zdCB3ZWxsLWtub3duIHBsYXRmb3JtcywgKkthZ2dsZSrigJRhY3F1aXJlZCBieSBHb29nbGUgaW4gMjAxN+KAlHN0YW5kcyBhcyB0aGUgbGFyZ2VzdCBhbmQgbW9zdCBpbmZsdWVudGlhbC4gSXQgaG9zdHMgaHVuZHJlZHMgb2YgY29tcGV0aXRpb25zIGFubnVhbGx5LCByYW5naW5nIGZyb20gb3BlbiByZXNlYXJjaCBjaGFsbGVuZ2VzIHRvIHByaXZhdGUgaW5kdXN0cnktc3BvbnNvcmVkIHByb2JsZW1zIG9mZmVyaW5nIHNpZ25pZmljYW50IGZpbmFuY2lhbCByZXdhcmRzLiBQbGF0Zm9ybXMgbGlrZSAqRHJpdmVuRGF0YSogYW5kICpaaW5kaSogZm9jdXMgb24gc29jaWFsIGltcGFjdCBwcm9ibGVtcyBhbmQgZW1lcmdpbmcgbWFya2V0cywgcmVzcGVjdGl2ZWx5LCB3aGlsZSAqS0REIEN1cCogcmVtYWlucyBhIHJlc3BlY3RlZCBhY2FkZW1pYyBjb21wZXRpdGlvbiB0aWVkIHRvIHRoZSBhbm51YWwgQUNNIFNJR0tERCBjb25mZXJlbmNlLgoKUGFydGljaXBhdGlvbiBpcyBvcGVuIHRvIGFueW9uZSB3aXRoIGEgZnJlZSBhY2NvdW50LiBDb21wZXRpdG9ycyBhcmUgdHlwaWNhbGx5IHByb3ZpZGVkIHdpdGggYSBsYWJlbGVkIHRyYWluaW5nIHNldCwgYW4gdW5sYWJlbGVkIHRlc3Qgc2V0LCBhbmQgYSBwcm9ibGVtIGRlc2NyaXB0aW9uLiBTdWJtaXNzaW9ucyBhcmUgZXZhbHVhdGVkIGF1dG9tYXRpY2FsbHkgYWdhaW5zdCBhIGhpZGRlbiBob2xkb3V0IHRlc3Qgc2V0IHVzaW5nIGEgcHJlZGVmaW5lZCBtZXRyaWMgKGUuZy4sIHJvb3QgbWVhbiBzcXVhcmVkIGVycm9yLCBsb2ctbG9zcywgQVVDKS4gQSByZWFsLXRpbWUgKmxlYWRlcmJvYXJkKiBkaXNwbGF5cyBwdWJsaWMgc2NvcmVzLCB0aG91Z2ggZmluYWwgcmFua2luZ3MgZGVwZW5kIG9uIHBlcmZvcm1hbmNlIG9uIGEgKnByaXZhdGUqIHRlc3QgcGFydGl0aW9uIHRvIHByZXZlbnQgbGVhZGVyYm9hcmQgb3ZlcmZpdHRpbmcuCgojIyBIaXN0b3JpY2FsIENvbnRleHQ6IEVuc2VtYmxlcyBEb21pbmFudGUKClRoZSBkb21pbmFuY2Ugb2YgZW5zZW1ibGUgbWV0aG9kcyBpbiBjb21wZXRpdGlvbnMgY2FuIGJlIHRyYWNlZCB0byB0aGUgZmFtb3VzICpOZXRmbGl4IFByaXplKiAoMjAwNuKAkzIwMDkpLCB3aGVyZSB0ZWFtcyBjb21wZXRlZCB0byBpbXByb3ZlIE5ldGZsaXjigJlzIG1vdmllIHJlY29tbWVuZGF0aW9uIHN5c3RlbS4gVGhlIFwkMSBtaWxsaW9uIHByaXplIHdhcyBhd2FyZGVkIHRvIGEgc3RhY2tlZCBlbnNlbWJsZSBvZiBodW5kcmVkcyBvZiBtb2RlbHMsIG1hbnkgb2YgdGhlbSBpbmRlcGVuZGVudGx5IHRyYWluZWQgYW5kIGJsZW5kZWQgdXNpbmcgcmlkZ2UgcmVncmVzc2lvbiBhbmQgbmV1cmFsIG5ldHMuIFRoaXMgZXN0YWJsaXNoZWQgYSBwYXR0ZXJuOiB0aGUgYmVzdCByZXN1bHRzIG9mdGVuIGFyaXNlIG5vdCBmcm9tIGEgc2luZ2xlIG1vZGVsLCBidXQgZnJvbSAqY2xldmVyIGNvbWJpbmF0aW9ucyogb2YgbWFueSBkaXZlcnNlIG1vZGVscy4KCkNvbXBldGl0aW9ucyBsaWtlIHRoZSAqS2FnZ2xlIEhlcml0YWdlIEhlYWx0aCBQcml6ZSosICpCTlAgUGFyaWJhcyBDYXJkaWYgQ2xhaW0gTWFuYWdlbWVudCosIGFuZCAqSG9tZSBDcmVkaXQgRGVmYXVsdCBSaXNrKiBmdXJ0aGVyIHJlaW5mb3JjZWQgdGhpcyBwYXR0ZXJuLiBJbiBuZWFybHkgYWxsIHRvcC10aWVyIHNvbHV0aW9ucywgZW5zZW1ibGUgbGVhcm5pbmfigJRlc3BlY2lhbGx5ICpzdGFja2luZyosICpibGVuZGluZyosICpiYWdnZWQgYm9vc3RpbmcgbW9kZWxzKiwgYW5kICptb2RlbCBhdmVyYWdpbmcq4oCUcGxheWVkIGEgY2VudHJhbCByb2xlLgoKIyMgQ29tbW9uIFdpbm5pbmcgRW5zZW1ibGUgQXJjaGl0ZWN0dXJlcwoKTW9kZXJuIHdpbm5pbmcgZW5zZW1ibGVzIGFyZSByYXJlbHkgdHJpdmlhbC4gVGhleSBvZnRlbiBmb2xsb3cgaGllcmFyY2hpY2FsLCBtdWx0aS1sYXllcmVkIGFyY2hpdGVjdHVyZXMgc3VjaCBhczoKCi0gICAqU3RhY2tlZCBnZW5lcmFsaXphdGlvbiogd2l0aCBtdWx0aXBsZSBmaXJzdC1sYXllciBtb2RlbHMgKGUuZy4sIExpZ2h0R0JNLCBDYXRCb29zdCwgbmV1cmFsIG5ldHMsIGxvZ2lzdGljIHJlZ3Jlc3Npb24pIGFuZCBhIHNlY29uZC1sZXZlbCBtZXRhLWxlYXJuZXIgKGUuZy4sIFhHQm9vc3Qgb3IgcmlkZ2UgcmVncmVzc2lvbikuCi0gICAqQmxlbmRlZCBtb2RlbHMqLCB3aGljaCBhdmVyYWdlIHByZWRpY3Rpb25zIGZyb20gZGlmZmVyZW50IG1vZGVscyB0cmFpbmVkIHdpdGggZGlmZmVyZW50IHNlZWRzLCBmZWF0dXJlcywgb3IgZm9sZHMuCi0gICAqQ3Jvc3MtdmFsaWRhdGVkIGZvbGRzIGVuc2VtYmxlcyosIHdoZXJlIGJhc2UgbW9kZWxzIGFyZSB0cmFpbmVkIG9uIGRpZmZlcmVudCBmb2xkcyBhbmQgdGhlaXIgcHJlZGljdGlvbnMgYXJlIGF2ZXJhZ2VkIG9yIHBhc3NlZCB0byBhIG1ldGEtbW9kZWwuCi0gICAqSHlicmlkIGVuc2VtYmxlcyosIGNvbWJpbmluZyB0cmVlLWJhc2VkIG1vZGVscyAoZm9yIHN0cnVjdHVyZWQgZGF0YSkgd2l0aCBkZWVwIGxlYXJuaW5nIG1vZGVscyAoZm9yIGVtYmVkZGluZ3Mgb3IgdGltZSBzZXJpZXMgZmVhdHVyZXMpLgoKVGhlc2UgYXJjaGl0ZWN0dXJlcyBleHBsb2l0IGJvdGggKm1vZGVsIGRpdmVyc2l0eSogYW5kICplcnJvciBkZWNvcnJlbGF0aW9uKiwgYW5kIG9mdGVuIGluY2x1ZGUgaHVuZHJlZHMgb2YgaW5kaXZpZHVhbCBtb2RlbHMsIHRyYWluZWQgd2l0aCBzdWJ0bGUgdmFyaWF0aW9ucyBpbiBoeXBlcnBhcmFtZXRlcnMsIGZlYXR1cmUgc2VsZWN0aW9uLCBhbmQgZGF0YSB0cmFuc2Zvcm1hdGlvbnMgKEJyZWltYW4sIDE5OTY7IFdvbHBlcnQsIDE5OTI7IEZyZXVuZCAmIFNjaGFwaXJlLCAxOTk3KS4KCiMjIENvbXBldGl0aW9uLVN0eWxlIEVuc2VtYmxlIGluIFI6IEEgUHJhY3RpY2FsIElsbHVzdHJhdGlvbgoKVG8gaWxsdXN0cmF0ZSBob3cgYW4gZW5zZW1ibGUgbWlnaHQgYmUgY29uc3RydWN0ZWQgaW4gYSBjb21wZXRpdGlvbiwgY29uc2lkZXIgdGhlICpIb3VzZSBQcmljZXMqIGNvbXBldGl0aW9uIChhIHBvcHVsYXIgS2FnZ2xlIGV4YW1wbGUpLiBXZSdsbCB1c2UgYSBzaW1wbGlmaWVkIHZlcnNpb24gaW4gUiB0aGF0IGluY2x1ZGVzOgoKMS4gIEEgYmFzZSBsYXllciBvZiBkaXZlcnNlIG1vZGVscyAoYGxtYCwgYHJwYXJ0YCwgYHhnYm9vc3RgKQoyLiAgQSBtZXRhLW1vZGVsIHRyYWluZWQgb24gdGhlaXIgcHJlZGljdGlvbnMKCmBgYCByCiMgTG9hZCByZXF1aXJlZCBwYWNrYWdlcwpsaWJyYXJ5KGNhcmV0KQpsaWJyYXJ5KGNhcmV0RW5zZW1ibGUpCmxpYnJhcnkoeGdib29zdCkKbGlicmFyeShycGFydCkKbGlicmFyeShNQVNTKQoKIyBMb2FkIHRoZSBkYXRhc2V0CmRhdGEoQm9zdG9uKQpob3VzaW5nIDwtIEJvc3RvbgpuYW1lcyhob3VzaW5nKVt3aGljaChuYW1lcyhob3VzaW5nKSA9PSAibWVkdiIpXSA8LSAicHJpY2UiCgojIFRyYWluLXRlc3Qgc3BsaXQKc2V0LnNlZWQoMTIzKQp0cmFpbi5pbmRleCA8LSBjcmVhdGVEYXRhUGFydGl0aW9uKGhvdXNpbmckcHJpY2UsIHAgPSAwLjgsIGxpc3QgPSBGQUxTRSkKdHJhaW4uZGF0YSA8LSBob3VzaW5nW3RyYWluLmluZGV4LCBdCnRlc3QuZGF0YSA8LSBob3VzaW5nWy10cmFpbi5pbmRleCwgXQoKIyBUcmFpbiBiYXNlIG1vZGVscwpjb250cm9sIDwtIHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXIgPSA1LAogICAgICAgICAgICAgICAgICAgICAgICBzYXZlUHJlZGljdGlvbnMgPSAiZmluYWwiLAogICAgICAgICAgICAgICAgICAgICAgICBhbGxvd1BhcmFsbGVsID0gVFJVRSkKCmJhc2UubW9kZWxzIDwtIGNhcmV0TGlzdCgKICBwcmljZSB+IC4sIGRhdGEgPSB0cmFpbi5kYXRhLAogIHRyQ29udHJvbCA9IGNvbnRyb2wsCiAgdHVuZUxpc3QgPSBsaXN0KAogICAgbG0gPSBjYXJldE1vZGVsU3BlYyhtZXRob2QgPSAibG0iKSwKICAgIHRyZWUgPSBjYXJldE1vZGVsU3BlYyhtZXRob2QgPSAicnBhcnQiKSwKICAgIHhnYiA9IGNhcmV0TW9kZWxTcGVjKG1ldGhvZCA9ICJ4Z2JUcmVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICB0dW5lR3JpZCA9IGV4cGFuZC5ncmlkKG5yb3VuZHMgPSAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kZXB0aCA9IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YSA9IDAuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FtbWEgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xzYW1wbGVfYnl0cmVlID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2NoaWxkX3dlaWdodCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNhbXBsZSA9IDEpKQogICkKKQoKIyBTdGFja2luZyBtZXRhLW1vZGVsCnN0YWNrLm1vZGVsIDwtIGNhcmV0U3RhY2soYmFzZS5tb2RlbHMsIG1ldGhvZCA9ICJnbG0iLCB0ckNvbnRyb2wgPSBjb250cm9sKQoKIyBQcmVkaWN0IGFuZCBldmFsdWF0ZQpwcmVkcyA8LSBwcmVkaWN0KHN0YWNrLm1vZGVsLCBuZXdkYXRhID0gdGVzdC5kYXRhKQpybXNlIDwtIHNxcnQobWVhbigocHJlZHMgLSB0ZXN0LmRhdGEkcHJpY2UpXjIpKQpjYXQoIlN0YWNrZWQgUk1TRSBvbiB0ZXN0IHNldDoiLCByb3VuZChybXNlLCAyKSwgIlxuIikKYGBgCgpUaGlzIGNvZGUgZGVtb25zdHJhdGVzIHRoZSBlc3NlbmNlIG9mIGNvbXBldGl0aW9uLXN0eWxlIGVuc2VtYmxpbmcgdXNpbmcgc3RhY2tpbmcuIEluIHByYWN0aWNlLCBjb21wZXRpdG9ycyB3b3VsZCBpdGVyYXRlIG92ZXIgZG96ZW5zIG9mIHN1Y2ggYmFzZSBtb2RlbHMsIGVuZ2luZWVyIGZlYXR1cmVzIGV4dGVuc2l2ZWx5LCBhbmQgb3B0aW1pemUgaHlwZXJwYXJhbWV0ZXJzIHdpdGggYWR2YW5jZWQgdG9vbHMgbGlrZSBgbWxyM2Agb3IgYEJheWVzaWFuT3B0aW1pemF0aW9uYC4KCiMjIEV0aGljYWwgQ29uc2lkZXJhdGlvbnMgYW5kIENyaXRpcXVlcwoKV2hpbGUgY29tcGV0aXRpb25zIGZvc3RlciBpbm5vdmF0aW9uIGFuZCBjb2xsYWJvcmF0aW9uLCB0aGV5IGFyZSBub3Qgd2l0aG91dCBjcml0aWNpc20uIEtleSBldGhpY2FsIGFuZCBwcmFjdGljYWwgY29uY2VybnMgaW5jbHVkZToKCi0gICAqTGVhZGVyYm9hcmQgb3ZlcmZpdHRpbmcqOiBSZXBlYXRlZCBzdWJtaXNzaW9ucyBlbmNvdXJhZ2UgdHVuaW5nIHRvIHRoZSBwdWJsaWMgbGVhZGVyYm9hcmQsIHdoaWNoIG1heSBoYXJtIGdlbmVyYWxpemF0aW9uLiBLYWdnbGUgYWRkcmVzc2VzIHRoaXMgd2l0aCBwcml2YXRlIGxlYWRlcmJvYXJkcywgYnV0IHRoZSByaXNrIHJlbWFpbnMuCi0gICAqQ29tcHV0YXRpb25hbCBwcml2aWxlZ2UqOiBUb3AtcGVyZm9ybWluZyBzb2x1dGlvbnMgb2Z0ZW4gcmVxdWlyZSBzdWJzdGFudGlhbCBjb21wdXRpbmcgcG93ZXIsIGZhdm9yaW5nIGNvbXBldGl0b3JzIHdpdGggYWNjZXNzIHRvIEdQVXMgYW5kIGNsdXN0ZXJzLgotICAgKkJsYWNrLWJveCBtb2RlbGluZyo6IENvbXBldGl0aW9ucyByZXdhcmQgcHJlZGljdGl2ZSBhY2N1cmFjeSwgbm90IGludGVycHJldGFiaWxpdHkuIFRoaXMgY2FuIGxlYWQgdG8gZGVwbG95bWVudCBvZiBvcGFxdWUgbW9kZWxzIGluIHNlbnNpdGl2ZSBkb21haW5zIGxpa2UgaGVhbHRoIG9yIGZpbmFuY2Ugd2l0aG91dCBhZGVxdWF0ZSBzY3J1dGlueS4KLSAgICpSZXByb2R1Y2liaWxpdHkgaXNzdWVzKjogTWFueSB3aW5uaW5nIHNvbHV0aW9ucyBhcmUgdG9vIGNvbXBsZXggb3IgcG9vcmx5IGRvY3VtZW50ZWQgdG8gcmVwbGljYXRlLCB3aGljaCB1bmRlcm1pbmVzIHRyYW5zcGFyZW5jeSBhbmQga25vd2xlZGdlIHRyYW5zZmVyLgotICAgKkN1bHR1cmFsIGJpYXMqOiBQbGF0Zm9ybXMgbGlrZSBLYWdnbGUgYXJlIEVuZ2xpc2gtY2VudHJpYyBhbmQgZG9taW5hdGVkIGJ5IHRlYW1zIGZyb20gaGlnaC1pbmNvbWUgY291bnRyaWVzLCBsaW1pdGluZyBnbG9iYWwgaW5jbHVzaW9uLgoKRGVzcGl0ZSB0aGVzZSBjb25jZXJucywgY29tcGV0aXRpb25zIGhhdmUgcGxheWVkIGEgdHJhbnNmb3JtYXRpdmUgcm9sZSBpbiBkZW1vY3JhdGl6aW5nIGFjY2VzcyB0byByZWFsLXdvcmxkIGRhdGEgcHJvYmxlbXMgYW5kIHBvcHVsYXJpemluZyBiZXN0IHByYWN0aWNlcyBpbiBlbnNlbWJsZSBtb2RlbGluZyAoRG9kZ2UgZXQgYWwuLCAyMDE5OyBMaXB0b24sIDIwMTgpLgoKIyMgUHJhY3RpY2FsIFRpcHMgZm9yIFN0dWRlbnRzIGFuZCBQcmFjdGl0aW9uZXJzCgpGb3IgdGhvc2UgbG9va2luZyB0byBjb21wZXRlIG9yIHRvIHNpbXVsYXRlIHJlYWwtd29ybGQgbW9kZWwgZXZhbHVhdGlvbiwgdGhlIGZvbGxvd2luZyBwcmFjdGljZXMgYXJlIGNvbW1vbiBhbW9uZyB0b3AgY29tcGV0aXRvcnM6CgotICAgKlN0YXJ0IHNpbXBsZSo6IEJlZ2luIHdpdGggYSBzdHJvbmcgc2luZ2xlIG1vZGVsIChlLmcuLCBgeGdib29zdGAsIGByYW5nZXJgKSBhbmQgZGV2ZWxvcCBhIHNvbGlkIGNyb3NzLXZhbGlkYXRpb24gc2NoZW1lLgotICAgKkxvZyBldmVyeXRoaW5nKjogVHJhY2sgcGVyZm9ybWFuY2UgYWNyb3NzIGZvbGRzLCBzZWVkcywgYW5kIHBhcmFtZXRlciBzZXR0aW5ncy4gUmVwcm9kdWNpYmlsaXR5IGlzIGtleS4KLSAgICpTdGFjayB3aXNlbHkqOiBVc2Ugb3V0LW9mLWZvbGQgcHJlZGljdGlvbnMgZm9yIHN0YWNraW5nIHRvIGF2b2lkIG92ZXJmaXR0aW5nLiBLZWVwIHRoZSBtZXRhLW1vZGVsIHNpbXBsZS4KLSAgICpGZWF0dXJlIGVuZ2luZWVyaW5nIHdpbnMqOiBDbGVhbiBkYXRhIGFuZCBpbnNpZ2h0ZnVsIGZlYXR1cmVzIG9mdGVuIG1hdHRlciBtb3JlIHRoYW4gbW9kZWwgY29tcGxleGl0eS4KLSAgICpCbGVuZCBkaXZlcnNlIG1vZGVscyo6IENvbWJpbmUgbW9kZWxzIHdpdGggZGlmZmVyZW50IGFzc3VtcHRpb25zICh0cmVlcyB2cy4gbGluZWFyIHZzLiBuZWlnaGJvcnMpLiBEaXZlcnNpdHkgbWF0dGVycy4KLSAgICpSZXNwZWN0IGxlYWthZ2UqOiBBdm9pZCB1c2luZyB0ZXN0IGRhdGEgb3IgZGVyaXZlZCB2YXJpYWJsZXMgdGhhdCAicGVlayIgaW50byB0aGUgZnV0dXJlIG9yIG91dGNvbWUuCgpGaW5hbGx5LCBhbHdheXMgYmUgY2F1dGlvdXMgd2hlbiBhZGFwdGluZyBjb21wZXRpdGlvbi13aW5uaW5nIG1vZGVscyBmb3IgZGVwbG95bWVudCBpbiByZWFsLXdvcmxkIHNldHRpbmdzLiBDb21wZXRpdGlvbnMgb3B0aW1pemUgZm9yIHNjb3JlLCBub3QgYWx3YXlzIGZvciAqZmFpcm5lc3MqLCAqZXhwbGFpbmFiaWxpdHkqLCBvciAqbG9uZy10ZXJtIHJlbGlhYmlsaXR5Ki4KCiMjIENvbXBldGluZyB3aXRoIE1vZGVsIFN0YWNraW5nCgo8aWZyYW1lIHdpZHRoPSI1NjAiIGhlaWdodD0iMzE1IiBzcmM9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLzlWazFyWExoRzQ4P3NpPWE0M2lKSGtPWTBwTHZ5TGIiIHRpdGxlPSJZb3VUdWJlIHZpZGVvIHBsYXllciIgZnJhbWVib3JkZXI9IjAiIGFsbG93PSJhY2NlbGVyb21ldGVyOyBhdXRvcGxheTsgY2xpcGJvYXJkLXdyaXRlOyBlbmNyeXB0ZWQtbWVkaWE7IGd5cm9zY29wZTsgcGljdHVyZS1pbi1waWN0dXJlOyB3ZWItc2hhcmUiIHJlZmVycmVycG9saWN5PSJzdHJpY3Qtb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luIiBhbGxvd2Z1bGxzY3JlZW4gZGF0YS1leHRlcm5hbD0iMSI+Cgo8L2lmcmFtZT4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgRmlsZXMgJiBSZXNvdXJjZXMKCmBgYHtyIHppcEZpbGVzLCBlY2hvPUZBTFNFfQp6aXBOYW1lID0gc3ByaW50ZigiTGVzc29uRmlsZXMtJXMtJXMuemlwIiwgCiAgICAgICAgICAgICAgICAgcGFyYW1zJGNhdGVnb3J5LAogICAgICAgICAgICAgICAgIHBhcmFtcyRudW1iZXIpCgp0ZXh0QUxpbmsgPSBwYXN0ZTAoIkFsbCBGaWxlcyBmb3IgTGVzc29uICIsIAogICAgICAgICAgICAgICBwYXJhbXMkY2F0ZWdvcnksIi4iLHBhcmFtcyRudW1iZXIpCgojIGRvd25sb2FkRmlsZXNMaW5rKCkgaXMgaW5jbHVkZWQgZnJvbSBfaW5zZXJ0MkRCLlIKa25pdHI6OnJhd19odG1sKGRvd25sb2FkRmlsZXNMaW5rKCIuIiwgemlwTmFtZSwgdGV4dEFMaW5rKSkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIFJlZmVyZW5jZXMKCipGb3VuZGF0aW9uYWwgV29ya3Mgb24gRW5zZW1ibGVzIGFuZCBTdGFja2luZzoqCgpCcmVpbWFuLCBMLiAoMTk5NikuIEJhZ2dpbmcgcHJlZGljdG9ycy4gKk1hY2hpbmUgTGVhcm5pbmcsIDI0KigyKSwgMTIz4oCTMTQwLiA8aHR0cHM6Ly9kb2kub3JnLzEwLjEwMDcvQkYwMDA1ODY1NT4KCkZyZXVuZCwgWS4sICYgU2NoYXBpcmUsIFIuIEUuICgxOTk3KS4gQSBkZWNpc2lvbi10aGVvcmV0aWMgZ2VuZXJhbGl6YXRpb24gb2Ygb24tbGluZSBsZWFybmluZyBhbmQgYW4gYXBwbGljYXRpb24gdG8gYm9vc3RpbmcuICpKb3VybmFsIG9mIENvbXB1dGVyIGFuZCBTeXN0ZW0gU2NpZW5jZXMsIDU1KigxKSwgMTE54oCTMTM5LiA8aHR0cHM6Ly9kb2kub3JnLzEwLjEwMDYvamNzcy4xOTk3LjE1MDQ+CgpXb2xwZXJ0LCBELiBILiAoMTk5MikuIFN0YWNrZWQgZ2VuZXJhbGl6YXRpb24uICpOZXVyYWwgTmV0d29ya3MsIDUqKDIpLCAyNDHigJMyNTkuIFtodHRwczovL2RvaS5vcmcvMTAuMTAxNi9TMDg5My02MDgwKDA1KTgwMDIzLTFdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L1MwODkzLTYwODAoMDUpODAwMjMtMSl7LnVyaX0KCkNhcnVhbmEsIFIuLCBOaWN1bGVzY3UtTWl6aWwsIEEuLCBDcmV3LCBHLiwgJiBLc2lrZXMsIEEuICgyMDA0KS4gRW5zZW1ibGUgc2VsZWN0aW9uIGZyb20gbGlicmFyaWVzIG9mIG1vZGVscy4gSW4gKlByb2NlZWRpbmdzIG9mIHRoZSBUd2VudHktRmlyc3QgSW50ZXJuYXRpb25hbCBDb25mZXJlbmNlIG9uIE1hY2hpbmUgTGVhcm5pbmcqIChwcC4gMTgpLiA8aHR0cHM6Ly9kb2kub3JnLzEwLjExNDUvMTAxNTMzMC4xMDE1NDMyPgoKU2lsbCwgSi4sIFRpa2ssIEQuLCBaaGFuZywgWS4sICYgS2FkbGVjLCBSLiAoMjAwOSkuIEZlYXR1cmUtd2VpZ2h0ZWQgbGluZWFyIHN0YWNraW5nLiAqYXJYaXYgcHJlcHJpbnQgYXJYaXY6MDkxMS4wNDYwKi4gPGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8wOTExLjA0NjA+CgoqSGlzdG9yaWNhbCBDb250ZXh0IGFuZCBOZXRmbGl4IFByaXplOioKCkJlbGwsIFIuIE0uLCBLb3JlbiwgWS4sICYgVm9saW5za3ksIEMuICgyMDA3KS4gVGhlIEJlbGxLb3Igc29sdXRpb24gdG8gdGhlIE5ldGZsaXggUHJpemUuICpOZXRmbGl4IFByaXplIGRvY3VtZW50YXRpb24qLiBSZXRyaWV2ZWQgZnJvbSA8aHR0cHM6Ly93d3cubmV0ZmxpeHByaXplLmNvbS9hc3NldHMvUHJvZ3Jlc3NQcml6ZTIwMDdfQlBDX0JlbGxLb3IucGRmPgoKS29yZW4sIFkuICgyMDA5KS4gVGhlIEJlbGxLb3Igc29sdXRpb24gdG8gdGhlIE5ldGZsaXggR3JhbmQgUHJpemUuICpOZXRmbGl4IFByaXplIGRvY3VtZW50YXRpb24qLiBSZXRyaWV2ZWQgZnJvbSA8aHR0cHM6Ly93d3cubmV0ZmxpeHByaXplLmNvbS9hc3NldHMvR3JhbmRQcml6ZTIwMDlfQlBDX0JlbGxLb3IucGRmPgoKKlBsYXRmb3JtIGFuZCBDb21wZXRpdGlvbiBEZXNjcmlwdGlvbnM6KgoKS2FnZ2xlLiAoMjAyMykuICpLYWdnbGUgY29tcGV0aXRpb25zIG92ZXJ2aWV3Ki4gUmV0cmlldmVkIGZyb20gPGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vY29tcGV0aXRpb25zPgoKRHJpdmVuRGF0YS4gKDIwMjMpLiAqRHJpdmVuRGF0YTogRGF0YSBzY2llbmNlIGNvbXBldGl0aW9ucyBmb3Igc29jaWFsIGdvb2QqLiBSZXRyaWV2ZWQgZnJvbSA8aHR0cHM6Ly93d3cuZHJpdmVuZGF0YS5vcmcvPgoKWmluZGkuICgyMDIzKS4gKlppbmRpOiBUaGUgZGF0YSBzY2llbmNlIGNvbXBldGl0aW9uIHBsYXRmb3JtIGZvciBBZnJpY2EqLiBSZXRyaWV2ZWQgZnJvbSA8aHR0cHM6Ly96aW5kaS5hZnJpY2EvPgoKKkV0aGljcywgUmVwcm9kdWNpYmlsaXR5LCBhbmQgQ29tcGV0aXRpb24gQ3VsdHVyZToqCgpEb2RnZSwgSi4sIEd1cnVyYW5nYW4sIFMuLCBDYXJkLCBELiwgU2Nod2FydHosIFIuLCAmIFNtaXRoLCBOLiBBLiAoMjAxOSkuIFNob3cgeW91ciB3b3JrOiBJbXByb3ZlZCByZXBvcnRpbmcgb2YgZXhwZXJpbWVudGFsIHJlc3VsdHMuIEluICpQcm9jZWVkaW5ncyBvZiB0aGUgMjAxOSBDb25mZXJlbmNlIG9uIEVtcGlyaWNhbCBNZXRob2RzIGluIE5hdHVyYWwgTGFuZ3VhZ2UgUHJvY2Vzc2luZyAoRU1OTFApKiAocHAuIDIxODXigJMyMTk0KS4gPGh0dHBzOi8vZG9pLm9yZy8xMC4xODY1My92MS9EMTktMTIyND4KCkxpcHRvbiwgWi4gQy4gKDIwMTgpLiBUaGUgbXl0aG9zIG9mIG1vZGVsIGludGVycHJldGFiaWxpdHkuICpDb21tdW5pY2F0aW9ucyBvZiB0aGUgQUNNLCA2MSooMTApLCAzNuKAkzQzLiA8aHR0cHM6Ly9kb2kub3JnLzEwLjExNDUvMzIzMzIzMT4KCiMjIEVycmF0YQoKW0xldCB1cyBrbm93XShodHRwczovL2Zvcm0uam90Zm9ybS5jb20vMjEyMTg3MDcyNzg0MTU3KXt0YXJnZXQ9Il9ibGFuayJ9Lgo=