Introduction
Supervised classification and prediction models are a core part of
machine learning (ML) and statistical modeling, where the goal is to
learn a mapping from input features to an output label based on labeled
training data. These models are widely used in applications like spam
detection, medical diagnosis, credit scoring, and more.
The goal of this project is to implement several commonly used,
simple supervised learning algorithms to solve binary
classification/prediction problems. The supervised learning algorithms
selected for classification in this project include:
Perceptron (single-layer neural
network)
Decision tree method (including penalized
trees)
Ensemble trees—Bagging (with encouragement to
explore other ensemble methods)
Additionally, a logistic regression model will serve as a baseline
for performance comparison.
Data Requirements
The following is a clear and structured breakdown of the data
requirements needed to perform EDA, feature engineering, and implement
the specified models (logistic regression, perceptron, decision tree,
and bagging):
- General Data Requirements
- Sufficient Sample Size
- At least 100–1,000+ samples (for reliable training/testing
splits).
- More data improves model robustness, especially for ensemble methods
like bagging.
- Binary Target Variable
- Clearly labeled 0/1 or True/False for classification (e.g.,
“Default/No Default”).
- Feature Variety
- Mix of numeric (continuous/discrete) and categorical features (if
applicable).
- Avoid datasets with only one feature type (limits feature
engineering).
- No Severe Class Imbalance
- Ideally, the minority class should be ≥20% of the data.
- If imbalanced, ensure techniques like resampling or class weights
can be applied.
- Data Quality Requirements
- Handling Missing Values
- Missing data should be \(<
10\%\) per feature (or a strategy for imputation, e.g.,
mean/median).
- No Severe Multicollinearity
- High correlation between features (\(|r|
> 0.8\)) can distort logistic regression/decision trees.
- No Leakage
- Ensure no feature directly reveals the target (e.g.,
“Loan_Approved_Flag” in features).
- Feature Engineering Needs
- Numeric Features
- Should be scaled (e.g., standardization for perceptron/logistic
regression).
- Potential for polynomial/interaction terms (if nonlinear
relationships exist).
- Categorical Features
- Low cardinality (e.g., \(<10\)
categories) to avoid excessive dummy variables.
- Encoding options: One-Hot (for a few categories) or Ordinal (if
ordered).
- Feature Importance Flexibility
- Some features should be redundant/noisy to test model robustness
(e.g., decision trees vs. bagging).
- Model-Specific Requirements
- Logistic Regression - Linearly separable features
(or engineered terms).
- Perceptron - Scaled features (sensitive to
magnitude).
- Decision Tree - Handles mixed data types; benefits
from outliers.
- Bagging (e.g., A Special Random Forest) - Larger
datasets to reduce overfitting.
- Suggested data sites:
Methodology
It is crucial to follow the logical process for developing predictive
models using logistic regression, decision trees, and neural networks,
including exploratory data analysis (EDA), feature engineering, and
model comparison via ROC analysis.
Data Description (source, background, list of
variables with descriptions/definitions)
Formulate practical questions and convert them
into analytical questions
Specify relevant candidate models to address the analytical
questions and related assumptions
EDA
- identifying new patterns to enhance modeling
- detecting abnormal patterns or potential violations of model
assumptions for feature engineering
- Missing value handling
- feature encoding and discretization
- Feature transformations
- Feature creation
- Feature selection
Model development: using a
training-validation-testing mechanism and the global and local
performance metrics (ROC-AUC, accuracy, sensitivity, specificity, and F1
scores) for model selection and hyperparameter tuning.
- Logistic regression (reference model)
- Select initial models based on relevancy
- Use ROC-AUC to select the best one to compete with other
classification algorithms
- Perceptron (single-layer neural networks)
- Use different activation functions to create candidate
perceptrons
- Best perceptron selection using ROC-AUC
- Decision tree
- create candidate models based on complexity parameters and/or
penalty of misclassification, etc.
- Select the best decision tree with ROC-AUC.
- Ensemble trees-BAGGING
- Create candidate BAGGING models using hyperparameters such as
cost-sensitive penalty and size of bagging, etc..
- Use ROC-AUC to identify the best candidate model
- Perform a comparison among the optimal models from each of the above
families using ROC-AUC.
- Final models
- Model Selection Criteria: performance,
interpretability needs, and computational requirements.
- Threshold Optimization: maximizing business metrics
and cost considerations.
Reporting and
Submission
- Report Format
- The report should follow the same structure and components as those
in project one.
LS0tDQp0aXRsZTogIlByb2plY3QgVHdvOiBTdXBlcnZpc2VkIEFsZ29yaXRobXMgZm9yIENsYXNzaWZpY2F0aW9uIGFuZCBQcmVkaWN0aW9uIg0KYXV0aG9yOiAiICINCmRhdGU6ICJTVEEgNTUxIEZvdW5kYXRpb25zIG9mIERhdGEgU2NpZW5jZSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogICAgICAgICAgICMgb3V0cHV0IGRvY3VtZW50IGZvcm1hdA0KICAgIHRvYzogeWVzICAgICAgICAgICAgICAgIyBhZGQgdGFibGUgY29udGVudHMNCiAgICB0b2NfZmxvYXQ6IHllcyAgICAgICAgICMgdG9jX3Byb3BlcnR5OiBmbG9hdGluZw0KICAgIHRvY19kZXB0aDogNCAgICAgICAgICAgIyBkZXB0aCBvZiBUT0MgaGVhZGluZ3MNCiAgICBmaWdfd2lkdGg6IDYgICAgICAgICAgICMgZ2xvYmFsIGZpZ3VyZSB3aWR0aA0KICAgIGZpZ19oZWlnaHQ6IDQgICAgICAgICAgIyBnbG9iYWwgZmlndXJlIGhlaWdodA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMgICAgICAgIyBhZGQgZmlndXJlIGNhcHRpb24NCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcyAgICMgbnVtYmVyaW5nIHNlY3Rpb24gaGVhZGluZ3MNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMgICAgICMgVE9DIHN1YmhlYWRpbmcgY2xhcHNpbmcNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUgICAgICMgZm9sZGluZy9zaG93aW5nIGNvZGUgDQogICAgY29kZV9kb3dubG9hZDogeWVzICAgICAjIGFsbG93IHRvIGRvd25sb2FkIGNvbXBsZXRlIFJNYXJrZG93biBzb3VyY2UgY29kZQ0KICAgIHNtb290aF9zY3JvbGw6IHllcyAgICAgIyBzY3JvbGxpbmcgdGV4dCBvZiB0aGUgZG9jdW1lbnQNCiAgICB0aGVtZTogbHVtZW4gICAgICAgICAgICMgdmlzdWFsIHRoZW1lIGZvciBIVE1MIGRvY3VtZW50IG9ubHkNCiAgICBoaWdobGlnaHQ6IHRhbmdvICAgICAgICMgY29kZSBzeW50YXggaGlnaHRsaWdodGluZyBzdHlsZXMNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiBubw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IG5vDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICBmaWdfd2lkdGg6IDUNCiAgICBmaWdfaGVpZ2h0OiA0DQotLS0NCg0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgxIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDIgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNXB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQp9DQpgYGANCg0KXA0KDQojIEludHJvZHVjdGlvbg0KDQpTdXBlcnZpc2VkIGNsYXNzaWZpY2F0aW9uIGFuZCBwcmVkaWN0aW9uIG1vZGVscyBhcmUgYSBjb3JlIHBhcnQgb2YgbWFjaGluZSBsZWFybmluZyAoTUwpIGFuZCBzdGF0aXN0aWNhbCBtb2RlbGluZywgd2hlcmUgdGhlIGdvYWwgaXMgdG8gbGVhcm4gYSBtYXBwaW5nIGZyb20gaW5wdXQgZmVhdHVyZXMgdG8gYW4gb3V0cHV0IGxhYmVsIGJhc2VkIG9uIGxhYmVsZWQgdHJhaW5pbmcgZGF0YS4gVGhlc2UgbW9kZWxzIGFyZSB3aWRlbHkgdXNlZCBpbiBhcHBsaWNhdGlvbnMgbGlrZSBzcGFtIGRldGVjdGlvbiwgbWVkaWNhbCBkaWFnbm9zaXMsIGNyZWRpdCBzY29yaW5nLCBhbmQgbW9yZS4NCg0KVGhlIGdvYWwgb2YgdGhpcyBwcm9qZWN0IGlzIHRvIGltcGxlbWVudCBzZXZlcmFsIGNvbW1vbmx5IHVzZWQsIHNpbXBsZSBzdXBlcnZpc2VkIGxlYXJuaW5nIGFsZ29yaXRobXMgdG8gc29sdmUgYmluYXJ5IGNsYXNzaWZpY2F0aW9uL3ByZWRpY3Rpb24gcHJvYmxlbXMuIFRoZSBzdXBlcnZpc2VkIGxlYXJuaW5nIGFsZ29yaXRobXMgc2VsZWN0ZWQgZm9yIGNsYXNzaWZpY2F0aW9uIGluIHRoaXMgcHJvamVjdCBpbmNsdWRlOg0KDQoqICoqUGVyY2VwdHJvbioqIChzaW5nbGUtbGF5ZXIgbmV1cmFsIG5ldHdvcmspDQoNCiogKipEZWNpc2lvbiB0cmVlIG1ldGhvZCoqIChpbmNsdWRpbmcgcGVuYWxpemVkIHRyZWVzKQ0KDQoqICoqRW5zZW1ibGUgdHJlZXPigJRCYWdnaW5nKiogKHdpdGggZW5jb3VyYWdlbWVudCB0byBleHBsb3JlIG90aGVyIGVuc2VtYmxlIG1ldGhvZHMpDQoNCkFkZGl0aW9uYWxseSwgYSBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsIHdpbGwgc2VydmUgYXMgYSBiYXNlbGluZSBmb3IgcGVyZm9ybWFuY2UgY29tcGFyaXNvbi4NCg0KDQojIERhdGEgUmVxdWlyZW1lbnRzDQoNClRoZSBmb2xsb3dpbmcgaXMgYSBjbGVhciBhbmQgc3RydWN0dXJlZCBicmVha2Rvd24gb2YgdGhlIGRhdGEgcmVxdWlyZW1lbnRzIG5lZWRlZCB0byBwZXJmb3JtIEVEQSwgZmVhdHVyZSBlbmdpbmVlcmluZywgYW5kIGltcGxlbWVudCB0aGUgc3BlY2lmaWVkIG1vZGVscyAobG9naXN0aWMgcmVncmVzc2lvbiwgcGVyY2VwdHJvbiwgZGVjaXNpb24gdHJlZSwgYW5kIGJhZ2dpbmcpOg0KDQoNCiogKipHZW5lcmFsIERhdGEgUmVxdWlyZW1lbnRzKioNCiAgKyAqKlN1ZmZpY2llbnQgU2FtcGxlIFNpemUqKg0KICAgIC0gQXQgbGVhc3QgMTAw4oCTMSwwMDArIHNhbXBsZXMgKGZvciByZWxpYWJsZSB0cmFpbmluZy90ZXN0aW5nIHNwbGl0cykuDQogICAgLSBNb3JlIGRhdGEgaW1wcm92ZXMgbW9kZWwgcm9idXN0bmVzcywgZXNwZWNpYWxseSBmb3IgZW5zZW1ibGUgbWV0aG9kcyBsaWtlIGJhZ2dpbmcuDQogICsgKipCaW5hcnkgVGFyZ2V0IFZhcmlhYmxlKioNCiAgICAtIENsZWFybHkgbGFiZWxlZCAwLzEgb3IgVHJ1ZS9GYWxzZSBmb3IgY2xhc3NpZmljYXRpb24gKGUuZy4sICJEZWZhdWx0L05vIERlZmF1bHQiKS4NCiAgKyAqKkZlYXR1cmUgVmFyaWV0eSoqDQogICAgLSBNaXggb2YgbnVtZXJpYyAoY29udGludW91cy9kaXNjcmV0ZSkgYW5kIGNhdGVnb3JpY2FsIGZlYXR1cmVzIChpZiBhcHBsaWNhYmxlKS4NCiAgICAtIEF2b2lkIGRhdGFzZXRzIHdpdGggb25seSBvbmUgZmVhdHVyZSB0eXBlIChsaW1pdHMgZmVhdHVyZSBlbmdpbmVlcmluZykuDQogICsgKipObyBTZXZlcmUgQ2xhc3MgSW1iYWxhbmNlKioNCiAgICAtIElkZWFsbHksIHRoZSBtaW5vcml0eSBjbGFzcyBzaG91bGQgYmUg4omlMjAlIG9mIHRoZSBkYXRhLg0KICAgIC0gSWYgaW1iYWxhbmNlZCwgZW5zdXJlIHRlY2huaXF1ZXMgbGlrZSByZXNhbXBsaW5nIG9yIGNsYXNzIHdlaWdodHMgY2FuIGJlIGFwcGxpZWQuDQoNCg0KKiAqKkRhdGEgUXVhbGl0eSBSZXF1aXJlbWVudHMqKg0KICArICoqSGFuZGxpbmcgTWlzc2luZyBWYWx1ZXMqKg0KICAgIC0gTWlzc2luZyBkYXRhIHNob3VsZCBiZSAkPCAxMFwlJCBwZXIgZmVhdHVyZSAob3IgYSBzdHJhdGVneSBmb3IgaW1wdXRhdGlvbiwgZS5nLiwgbWVhbi9tZWRpYW4pLg0KICArICoqTm8gU2V2ZXJlIE11bHRpY29sbGluZWFyaXR5KioNCiAgICAtIEhpZ2ggY29ycmVsYXRpb24gYmV0d2VlbiBmZWF0dXJlcyAoJHxyfCA+IDAuOCQpIGNhbiBkaXN0b3J0IGxvZ2lzdGljIHJlZ3Jlc3Npb24vZGVjaXNpb24gdHJlZXMuDQogICsgKipObyBMZWFrYWdlKioNCiAgICAtIEVuc3VyZSBubyBmZWF0dXJlIGRpcmVjdGx5IHJldmVhbHMgdGhlIHRhcmdldCAoZS5nLiwgIkxvYW5fQXBwcm92ZWRfRmxhZyIgaW4gZmVhdHVyZXMpLg0KDQoNCiogKipGZWF0dXJlIEVuZ2luZWVyaW5nIE5lZWRzKioNCiAgKyAqKk51bWVyaWMgRmVhdHVyZXMqKg0KICAgIC0gU2hvdWxkIGJlIHNjYWxlZCAoZS5nLiwgc3RhbmRhcmRpemF0aW9uIGZvciBwZXJjZXB0cm9uL2xvZ2lzdGljIHJlZ3Jlc3Npb24pLg0KICAgIC0gUG90ZW50aWFsIGZvciBwb2x5bm9taWFsL2ludGVyYWN0aW9uIHRlcm1zIChpZiBub25saW5lYXIgcmVsYXRpb25zaGlwcyBleGlzdCkuDQogICsgKipDYXRlZ29yaWNhbCBGZWF0dXJlcyoqDQogICAgLSBMb3cgY2FyZGluYWxpdHkgKGUuZy4sICQ8MTAkIGNhdGVnb3JpZXMpIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBkdW1teSB2YXJpYWJsZXMuDQogICAgLSBFbmNvZGluZyBvcHRpb25zOiBPbmUtSG90IChmb3IgYSBmZXcgY2F0ZWdvcmllcykgb3IgT3JkaW5hbCAoaWYgb3JkZXJlZCkuDQogICsgKipGZWF0dXJlIEltcG9ydGFuY2UgRmxleGliaWxpdHkqKg0KICAgIC0gU29tZSBmZWF0dXJlcyBzaG91bGQgYmUgcmVkdW5kYW50L25vaXN5IHRvIHRlc3QgbW9kZWwgcm9idXN0bmVzcyAoZS5nLiwgZGVjaXNpb24gdHJlZXMgdnMuIGJhZ2dpbmcpLg0KDQoNCiogKipNb2RlbC1TcGVjaWZpYyBSZXF1aXJlbWVudHMqKg0KICArICoqTG9naXN0aWMgUmVncmVzc2lvbioqIC0gTGluZWFybHkgc2VwYXJhYmxlIGZlYXR1cmVzIChvciBlbmdpbmVlcmVkIHRlcm1zKS4NCiAgKyAqKlBlcmNlcHRyb24qKiAtIFNjYWxlZCBmZWF0dXJlcyAoc2Vuc2l0aXZlIHRvIG1hZ25pdHVkZSkuDQogICsgKipEZWNpc2lvbiBUcmVlKiogLQlIYW5kbGVzIG1peGVkIGRhdGEgdHlwZXM7IGJlbmVmaXRzIGZyb20gb3V0bGllcnMuDQogICsgKipCYWdnaW5nIChlLmcuLCBBIFNwZWNpYWwgUmFuZG9tIEZvcmVzdCkqKiAtCUxhcmdlciBkYXRhc2V0cyB0byByZWR1Y2Ugb3ZlcmZpdHRpbmcuDQoNCg0KKiAqKlN1Z2dlc3RlZCBkYXRhIHNpdGVzKio6IA0KICArIE15IHRlYWNoaW5nIGRhdGEgcmVwb3NpdG9yeSAoPGh0dHBzOi8vcGVuZ2RzY2kuZ2l0aHViLmlvL2RhdGFzZXRzLz4pLCANCiAgKyBVQ0kgTWFjaGluZSBMZWFybmluZyBSZXBvc2l0b3J5ICg8aHR0cHM6Ly9hcmNoaXZlLmljcy51Y2kuZWR1Lz4pLCBhbmQgDQogICsgIEthZ2dsZSAoPGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHM/ZmlsZVR5cGU9Y3N2PikuDQoNCg0KIyBNZXRob2RvbG9neQ0KDQpJdCBpcyBjcnVjaWFsIHRvIGZvbGxvdyB0aGUgbG9naWNhbCBwcm9jZXNzIGZvciBkZXZlbG9waW5nIHByZWRpY3RpdmUgbW9kZWxzIHVzaW5nIGxvZ2lzdGljIHJlZ3Jlc3Npb24sIGRlY2lzaW9uIHRyZWVzLCBhbmQgbmV1cmFsIG5ldHdvcmtzLCBpbmNsdWRpbmcgZXhwbG9yYXRvcnkgZGF0YSBhbmFseXNpcyAoRURBKSwgZmVhdHVyZSBlbmdpbmVlcmluZywgYW5kIG1vZGVsIGNvbXBhcmlzb24gdmlhIFJPQyBhbmFseXNpcy4NCg0KKiAqKkRhdGEgRGVzY3JpcHRpb24qKiAoc291cmNlLCBiYWNrZ3JvdW5kLCBsaXN0IG9mIHZhcmlhYmxlcyB3aXRoIGRlc2NyaXB0aW9ucy9kZWZpbml0aW9ucykNCiogKipGb3JtdWxhdGUgcHJhY3RpY2FsIHF1ZXN0aW9ucyoqIGFuZCBjb252ZXJ0IHRoZW0gaW50byBhbmFseXRpY2FsIHF1ZXN0aW9ucw0KKiBTcGVjaWZ5IHJlbGV2YW50IGNhbmRpZGF0ZSBtb2RlbHMgdG8gYWRkcmVzcyB0aGUgYW5hbHl0aWNhbCBxdWVzdGlvbnMgYW5kIHJlbGF0ZWQgYXNzdW1wdGlvbnMNCg0KKiAqKkVEQSoqDQogICsgaWRlbnRpZnlpbmcgbmV3IHBhdHRlcm5zIHRvIGVuaGFuY2UgbW9kZWxpbmcNCiAgKyBkZXRlY3RpbmcgYWJub3JtYWwgcGF0dGVybnMgb3IgcG90ZW50aWFsIHZpb2xhdGlvbnMgb2YgbW9kZWwgYXNzdW1wdGlvbnMgZm9yIGZlYXR1cmUgZW5naW5lZXJpbmcNCiAgICAtIE1pc3NpbmcgdmFsdWUgaGFuZGxpbmcNCiAgICAtIGZlYXR1cmUgZW5jb2RpbmcgYW5kIGRpc2NyZXRpemF0aW9uDQogICAgLSBGZWF0dXJlIHRyYW5zZm9ybWF0aW9ucw0KICAgIC0gRmVhdHVyZSBjcmVhdGlvbg0KICAgIC0gRmVhdHVyZSBzZWxlY3Rpb24NCiAgICANCiogKipNb2RlbCBkZXZlbG9wbWVudCoqOiB1c2luZyBhIHRyYWluaW5nLXZhbGlkYXRpb24tdGVzdGluZyBtZWNoYW5pc20gYW5kIHRoZSBnbG9iYWwgYW5kIGxvY2FsIHBlcmZvcm1hbmNlIG1ldHJpY3MgKFJPQy1BVUMsIGFjY3VyYWN5LCBzZW5zaXRpdml0eSwgc3BlY2lmaWNpdHksIGFuZCBGMSBzY29yZXMpIGZvciBtb2RlbCBzZWxlY3Rpb24gYW5kIGh5cGVycGFyYW1ldGVyIHR1bmluZy4NCiAgKyBMb2dpc3RpYyByZWdyZXNzaW9uIChyZWZlcmVuY2UgbW9kZWwpDQogICAgLSBTZWxlY3QgaW5pdGlhbCBtb2RlbHMgYmFzZWQgb24gcmVsZXZhbmN5IA0KICAgIC0gVXNlIFJPQy1BVUMgdG8gc2VsZWN0IHRoZSBiZXN0IG9uZSB0byBjb21wZXRlIHdpdGggb3RoZXIgY2xhc3NpZmljYXRpb24gYWxnb3JpdGhtcw0KICArIFBlcmNlcHRyb24gKHNpbmdsZS1sYXllciBuZXVyYWwgbmV0d29ya3MpDQogICAgLSBVc2UgZGlmZmVyZW50IGFjdGl2YXRpb24gZnVuY3Rpb25zIHRvIGNyZWF0ZSBjYW5kaWRhdGUgcGVyY2VwdHJvbnMNCiAgICAtIEJlc3QgcGVyY2VwdHJvbiBzZWxlY3Rpb24gdXNpbmcgUk9DLUFVQw0KICArIERlY2lzaW9uIHRyZWUNCiAgICAtIGNyZWF0ZSBjYW5kaWRhdGUgbW9kZWxzIGJhc2VkIG9uIGNvbXBsZXhpdHkgcGFyYW1ldGVycyBhbmQvb3IgcGVuYWx0eSBvZiBtaXNjbGFzc2lmaWNhdGlvbiwgZXRjLg0KICAgIC0gU2VsZWN0IHRoZSBiZXN0IGRlY2lzaW9uIHRyZWUgd2l0aCBST0MtQVVDLg0KICArIEVuc2VtYmxlIHRyZWVzLUJBR0dJTkcNCiAgICAtIENyZWF0ZSBjYW5kaWRhdGUgQkFHR0lORyBtb2RlbHMgdXNpbmcgaHlwZXJwYXJhbWV0ZXJzIHN1Y2ggYXMgY29zdC1zZW5zaXRpdmUgcGVuYWx0eSBhbmQgc2l6ZSBvZiBiYWdnaW5nLCBldGMuLg0KICAgIC0gVXNlIFJPQy1BVUMgdG8gaWRlbnRpZnkgdGhlIGJlc3QgY2FuZGlkYXRlIG1vZGVsDQogICsgUGVyZm9ybSBhIGNvbXBhcmlzb24gYW1vbmcgdGhlIG9wdGltYWwgbW9kZWxzIGZyb20gZWFjaCBvZiB0aGUgYWJvdmUgZmFtaWxpZXMgdXNpbmcgUk9DLUFVQy4NCiAgKyBGaW5hbCBtb2RlbHMNCiAgICAtICoqTW9kZWwgU2VsZWN0aW9uIENyaXRlcmlhKio6IHBlcmZvcm1hbmNlLCBpbnRlcnByZXRhYmlsaXR5IG5lZWRzLCBhbmQgY29tcHV0YXRpb25hbCByZXF1aXJlbWVudHMuDQogICAgLSAqKlRocmVzaG9sZCBPcHRpbWl6YXRpb24qKjogbWF4aW1pemluZyBidXNpbmVzcyBtZXRyaWNzIGFuZCBjb3N0IGNvbnNpZGVyYXRpb25zLg0KICANCg0KIyBSZXBvcnRpbmcgYW5kIFN1Ym1pc3Npb24NCiAgDQoNCiogKipSZXBvcnQgRm9ybWF0KioNCiAgKyBUaGUgcmVwb3J0IHNob3VsZCBmb2xsb3cgdGhlIHNhbWUgc3RydWN0dXJlIGFuZCBjb21wb25lbnRzIGFzIHRob3NlIGluIHByb2plY3Qgb25lLg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==