1 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.

2 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:

3 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.

4 Reporting and Submission

  • Report Format
    • The report should follow the same structure and components as those in project one.
LS0tDQp0aXRsZTogIlByb2plY3QgVHdvOiBTdXBlcnZpc2VkIEFsZ29yaXRobXMgZm9yIENsYXNzaWZpY2F0aW9uIGFuZCBQcmVkaWN0aW9uIg0KYXV0aG9yOiAiICINCmRhdGU6ICJTVEEgNTUxIEZvdW5kYXRpb25zIG9mIERhdGEgU2NpZW5jZSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogICAgICAgICAgICMgb3V0cHV0IGRvY3VtZW50IGZvcm1hdA0KICAgIHRvYzogeWVzICAgICAgICAgICAgICAgIyBhZGQgdGFibGUgY29udGVudHMNCiAgICB0b2NfZmxvYXQ6IHllcyAgICAgICAgICMgdG9jX3Byb3BlcnR5OiBmbG9hdGluZw0KICAgIHRvY19kZXB0aDogNCAgICAgICAgICAgIyBkZXB0aCBvZiBUT0MgaGVhZGluZ3MNCiAgICBmaWdfd2lkdGg6IDYgICAgICAgICAgICMgZ2xvYmFsIGZpZ3VyZSB3aWR0aA0KICAgIGZpZ19oZWlnaHQ6IDQgICAgICAgICAgIyBnbG9iYWwgZmlndXJlIGhlaWdodA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMgICAgICAgIyBhZGQgZmlndXJlIGNhcHRpb24NCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcyAgICMgbnVtYmVyaW5nIHNlY3Rpb24gaGVhZGluZ3MNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMgICAgICMgVE9DIHN1YmhlYWRpbmcgY2xhcHNpbmcNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUgICAgICMgZm9sZGluZy9zaG93aW5nIGNvZGUgDQogICAgY29kZV9kb3dubG9hZDogeWVzICAgICAjIGFsbG93IHRvIGRvd25sb2FkIGNvbXBsZXRlIFJNYXJrZG93biBzb3VyY2UgY29kZQ0KICAgIHNtb290aF9zY3JvbGw6IHllcyAgICAgIyBzY3JvbGxpbmcgdGV4dCBvZiB0aGUgZG9jdW1lbnQNCiAgICB0aGVtZTogbHVtZW4gICAgICAgICAgICMgdmlzdWFsIHRoZW1lIGZvciBIVE1MIGRvY3VtZW50IG9ubHkNCiAgICBoaWdobGlnaHQ6IHRhbmdvICAgICAgICMgY29kZSBzeW50YXggaGlnaHRsaWdodGluZyBzdHlsZXMNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiBubw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IG5vDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICBmaWdfd2lkdGg6IDUNCiAgICBmaWdfaGVpZ2h0OiA0DQotLS0NCg0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgxIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDIgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNXB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQp9DQpgYGANCg0KXA0KDQojIEludHJvZHVjdGlvbg0KDQpTdXBlcnZpc2VkIGNsYXNzaWZpY2F0aW9uIGFuZCBwcmVkaWN0aW9uIG1vZGVscyBhcmUgYSBjb3JlIHBhcnQgb2YgbWFjaGluZSBsZWFybmluZyAoTUwpIGFuZCBzdGF0aXN0aWNhbCBtb2RlbGluZywgd2hlcmUgdGhlIGdvYWwgaXMgdG8gbGVhcm4gYSBtYXBwaW5nIGZyb20gaW5wdXQgZmVhdHVyZXMgdG8gYW4gb3V0cHV0IGxhYmVsIGJhc2VkIG9uIGxhYmVsZWQgdHJhaW5pbmcgZGF0YS4gVGhlc2UgbW9kZWxzIGFyZSB3aWRlbHkgdXNlZCBpbiBhcHBsaWNhdGlvbnMgbGlrZSBzcGFtIGRldGVjdGlvbiwgbWVkaWNhbCBkaWFnbm9zaXMsIGNyZWRpdCBzY29yaW5nLCBhbmQgbW9yZS4NCg0KVGhlIGdvYWwgb2YgdGhpcyBwcm9qZWN0IGlzIHRvIGltcGxlbWVudCBzZXZlcmFsIGNvbW1vbmx5IHVzZWQsIHNpbXBsZSBzdXBlcnZpc2VkIGxlYXJuaW5nIGFsZ29yaXRobXMgdG8gc29sdmUgYmluYXJ5IGNsYXNzaWZpY2F0aW9uL3ByZWRpY3Rpb24gcHJvYmxlbXMuIFRoZSBzdXBlcnZpc2VkIGxlYXJuaW5nIGFsZ29yaXRobXMgc2VsZWN0ZWQgZm9yIGNsYXNzaWZpY2F0aW9uIGluIHRoaXMgcHJvamVjdCBpbmNsdWRlOg0KDQoqICoqUGVyY2VwdHJvbioqIChzaW5nbGUtbGF5ZXIgbmV1cmFsIG5ldHdvcmspDQoNCiogKipEZWNpc2lvbiB0cmVlIG1ldGhvZCoqIChpbmNsdWRpbmcgcGVuYWxpemVkIHRyZWVzKQ0KDQoqICoqRW5zZW1ibGUgdHJlZXPigJRCYWdnaW5nKiogKHdpdGggZW5jb3VyYWdlbWVudCB0byBleHBsb3JlIG90aGVyIGVuc2VtYmxlIG1ldGhvZHMpDQoNCkFkZGl0aW9uYWxseSwgYSBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsIHdpbGwgc2VydmUgYXMgYSBiYXNlbGluZSBmb3IgcGVyZm9ybWFuY2UgY29tcGFyaXNvbi4NCg0KDQojIERhdGEgUmVxdWlyZW1lbnRzDQoNClRoZSBmb2xsb3dpbmcgaXMgYSBjbGVhciBhbmQgc3RydWN0dXJlZCBicmVha2Rvd24gb2YgdGhlIGRhdGEgcmVxdWlyZW1lbnRzIG5lZWRlZCB0byBwZXJmb3JtIEVEQSwgZmVhdHVyZSBlbmdpbmVlcmluZywgYW5kIGltcGxlbWVudCB0aGUgc3BlY2lmaWVkIG1vZGVscyAobG9naXN0aWMgcmVncmVzc2lvbiwgcGVyY2VwdHJvbiwgZGVjaXNpb24gdHJlZSwgYW5kIGJhZ2dpbmcpOg0KDQoNCiogKipHZW5lcmFsIERhdGEgUmVxdWlyZW1lbnRzKioNCiAgKyAqKlN1ZmZpY2llbnQgU2FtcGxlIFNpemUqKg0KICAgIC0gQXQgbGVhc3QgMTAw4oCTMSwwMDArIHNhbXBsZXMgKGZvciByZWxpYWJsZSB0cmFpbmluZy90ZXN0aW5nIHNwbGl0cykuDQogICAgLSBNb3JlIGRhdGEgaW1wcm92ZXMgbW9kZWwgcm9idXN0bmVzcywgZXNwZWNpYWxseSBmb3IgZW5zZW1ibGUgbWV0aG9kcyBsaWtlIGJhZ2dpbmcuDQogICsgKipCaW5hcnkgVGFyZ2V0IFZhcmlhYmxlKioNCiAgICAtIENsZWFybHkgbGFiZWxlZCAwLzEgb3IgVHJ1ZS9GYWxzZSBmb3IgY2xhc3NpZmljYXRpb24gKGUuZy4sICJEZWZhdWx0L05vIERlZmF1bHQiKS4NCiAgKyAqKkZlYXR1cmUgVmFyaWV0eSoqDQogICAgLSBNaXggb2YgbnVtZXJpYyAoY29udGludW91cy9kaXNjcmV0ZSkgYW5kIGNhdGVnb3JpY2FsIGZlYXR1cmVzIChpZiBhcHBsaWNhYmxlKS4NCiAgICAtIEF2b2lkIGRhdGFzZXRzIHdpdGggb25seSBvbmUgZmVhdHVyZSB0eXBlIChsaW1pdHMgZmVhdHVyZSBlbmdpbmVlcmluZykuDQogICsgKipObyBTZXZlcmUgQ2xhc3MgSW1iYWxhbmNlKioNCiAgICAtIElkZWFsbHksIHRoZSBtaW5vcml0eSBjbGFzcyBzaG91bGQgYmUg4omlMjAlIG9mIHRoZSBkYXRhLg0KICAgIC0gSWYgaW1iYWxhbmNlZCwgZW5zdXJlIHRlY2huaXF1ZXMgbGlrZSByZXNhbXBsaW5nIG9yIGNsYXNzIHdlaWdodHMgY2FuIGJlIGFwcGxpZWQuDQoNCg0KKiAqKkRhdGEgUXVhbGl0eSBSZXF1aXJlbWVudHMqKg0KICArICoqSGFuZGxpbmcgTWlzc2luZyBWYWx1ZXMqKg0KICAgIC0gTWlzc2luZyBkYXRhIHNob3VsZCBiZSAkPCAxMFwlJCBwZXIgZmVhdHVyZSAob3IgYSBzdHJhdGVneSBmb3IgaW1wdXRhdGlvbiwgZS5nLiwgbWVhbi9tZWRpYW4pLg0KICArICoqTm8gU2V2ZXJlIE11bHRpY29sbGluZWFyaXR5KioNCiAgICAtIEhpZ2ggY29ycmVsYXRpb24gYmV0d2VlbiBmZWF0dXJlcyAoJHxyfCA+IDAuOCQpIGNhbiBkaXN0b3J0IGxvZ2lzdGljIHJlZ3Jlc3Npb24vZGVjaXNpb24gdHJlZXMuDQogICsgKipObyBMZWFrYWdlKioNCiAgICAtIEVuc3VyZSBubyBmZWF0dXJlIGRpcmVjdGx5IHJldmVhbHMgdGhlIHRhcmdldCAoZS5nLiwgIkxvYW5fQXBwcm92ZWRfRmxhZyIgaW4gZmVhdHVyZXMpLg0KDQoNCiogKipGZWF0dXJlIEVuZ2luZWVyaW5nIE5lZWRzKioNCiAgKyAqKk51bWVyaWMgRmVhdHVyZXMqKg0KICAgIC0gU2hvdWxkIGJlIHNjYWxlZCAoZS5nLiwgc3RhbmRhcmRpemF0aW9uIGZvciBwZXJjZXB0cm9uL2xvZ2lzdGljIHJlZ3Jlc3Npb24pLg0KICAgIC0gUG90ZW50aWFsIGZvciBwb2x5bm9taWFsL2ludGVyYWN0aW9uIHRlcm1zIChpZiBub25saW5lYXIgcmVsYXRpb25zaGlwcyBleGlzdCkuDQogICsgKipDYXRlZ29yaWNhbCBGZWF0dXJlcyoqDQogICAgLSBMb3cgY2FyZGluYWxpdHkgKGUuZy4sICQ8MTAkIGNhdGVnb3JpZXMpIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBkdW1teSB2YXJpYWJsZXMuDQogICAgLSBFbmNvZGluZyBvcHRpb25zOiBPbmUtSG90IChmb3IgYSBmZXcgY2F0ZWdvcmllcykgb3IgT3JkaW5hbCAoaWYgb3JkZXJlZCkuDQogICsgKipGZWF0dXJlIEltcG9ydGFuY2UgRmxleGliaWxpdHkqKg0KICAgIC0gU29tZSBmZWF0dXJlcyBzaG91bGQgYmUgcmVkdW5kYW50L25vaXN5IHRvIHRlc3QgbW9kZWwgcm9idXN0bmVzcyAoZS5nLiwgZGVjaXNpb24gdHJlZXMgdnMuIGJhZ2dpbmcpLg0KDQoNCiogKipNb2RlbC1TcGVjaWZpYyBSZXF1aXJlbWVudHMqKg0KICArICoqTG9naXN0aWMgUmVncmVzc2lvbioqIC0gTGluZWFybHkgc2VwYXJhYmxlIGZlYXR1cmVzIChvciBlbmdpbmVlcmVkIHRlcm1zKS4NCiAgKyAqKlBlcmNlcHRyb24qKiAtIFNjYWxlZCBmZWF0dXJlcyAoc2Vuc2l0aXZlIHRvIG1hZ25pdHVkZSkuDQogICsgKipEZWNpc2lvbiBUcmVlKiogLQlIYW5kbGVzIG1peGVkIGRhdGEgdHlwZXM7IGJlbmVmaXRzIGZyb20gb3V0bGllcnMuDQogICsgKipCYWdnaW5nIChlLmcuLCBBIFNwZWNpYWwgUmFuZG9tIEZvcmVzdCkqKiAtCUxhcmdlciBkYXRhc2V0cyB0byByZWR1Y2Ugb3ZlcmZpdHRpbmcuDQoNCg0KKiAqKlN1Z2dlc3RlZCBkYXRhIHNpdGVzKio6IA0KICArIE15IHRlYWNoaW5nIGRhdGEgcmVwb3NpdG9yeSAoPGh0dHBzOi8vcGVuZ2RzY2kuZ2l0aHViLmlvL2RhdGFzZXRzLz4pLCANCiAgKyBVQ0kgTWFjaGluZSBMZWFybmluZyBSZXBvc2l0b3J5ICg8aHR0cHM6Ly9hcmNoaXZlLmljcy51Y2kuZWR1Lz4pLCBhbmQgDQogICsgIEthZ2dsZSAoPGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHM/ZmlsZVR5cGU9Y3N2PikuDQoNCg0KIyBNZXRob2RvbG9neQ0KDQpJdCBpcyBjcnVjaWFsIHRvIGZvbGxvdyB0aGUgbG9naWNhbCBwcm9jZXNzIGZvciBkZXZlbG9waW5nIHByZWRpY3RpdmUgbW9kZWxzIHVzaW5nIGxvZ2lzdGljIHJlZ3Jlc3Npb24sIGRlY2lzaW9uIHRyZWVzLCBhbmQgbmV1cmFsIG5ldHdvcmtzLCBpbmNsdWRpbmcgZXhwbG9yYXRvcnkgZGF0YSBhbmFseXNpcyAoRURBKSwgZmVhdHVyZSBlbmdpbmVlcmluZywgYW5kIG1vZGVsIGNvbXBhcmlzb24gdmlhIFJPQyBhbmFseXNpcy4NCg0KKiAqKkRhdGEgRGVzY3JpcHRpb24qKiAoc291cmNlLCBiYWNrZ3JvdW5kLCBsaXN0IG9mIHZhcmlhYmxlcyB3aXRoIGRlc2NyaXB0aW9ucy9kZWZpbml0aW9ucykNCiogKipGb3JtdWxhdGUgcHJhY3RpY2FsIHF1ZXN0aW9ucyoqIGFuZCBjb252ZXJ0IHRoZW0gaW50byBhbmFseXRpY2FsIHF1ZXN0aW9ucw0KKiBTcGVjaWZ5IHJlbGV2YW50IGNhbmRpZGF0ZSBtb2RlbHMgdG8gYWRkcmVzcyB0aGUgYW5hbHl0aWNhbCBxdWVzdGlvbnMgYW5kIHJlbGF0ZWQgYXNzdW1wdGlvbnMNCg0KKiAqKkVEQSoqDQogICsgaWRlbnRpZnlpbmcgbmV3IHBhdHRlcm5zIHRvIGVuaGFuY2UgbW9kZWxpbmcNCiAgKyBkZXRlY3RpbmcgYWJub3JtYWwgcGF0dGVybnMgb3IgcG90ZW50aWFsIHZpb2xhdGlvbnMgb2YgbW9kZWwgYXNzdW1wdGlvbnMgZm9yIGZlYXR1cmUgZW5naW5lZXJpbmcNCiAgICAtIE1pc3NpbmcgdmFsdWUgaGFuZGxpbmcNCiAgICAtIGZlYXR1cmUgZW5jb2RpbmcgYW5kIGRpc2NyZXRpemF0aW9uDQogICAgLSBGZWF0dXJlIHRyYW5zZm9ybWF0aW9ucw0KICAgIC0gRmVhdHVyZSBjcmVhdGlvbg0KICAgIC0gRmVhdHVyZSBzZWxlY3Rpb24NCiAgICANCiogKipNb2RlbCBkZXZlbG9wbWVudCoqOiB1c2luZyBhIHRyYWluaW5nLXZhbGlkYXRpb24tdGVzdGluZyBtZWNoYW5pc20gYW5kIHRoZSBnbG9iYWwgYW5kIGxvY2FsIHBlcmZvcm1hbmNlIG1ldHJpY3MgKFJPQy1BVUMsIGFjY3VyYWN5LCBzZW5zaXRpdml0eSwgc3BlY2lmaWNpdHksIGFuZCBGMSBzY29yZXMpIGZvciBtb2RlbCBzZWxlY3Rpb24gYW5kIGh5cGVycGFyYW1ldGVyIHR1bmluZy4NCiAgKyBMb2dpc3RpYyByZWdyZXNzaW9uIChyZWZlcmVuY2UgbW9kZWwpDQogICAgLSBTZWxlY3QgaW5pdGlhbCBtb2RlbHMgYmFzZWQgb24gcmVsZXZhbmN5IA0KICAgIC0gVXNlIFJPQy1BVUMgdG8gc2VsZWN0IHRoZSBiZXN0IG9uZSB0byBjb21wZXRlIHdpdGggb3RoZXIgY2xhc3NpZmljYXRpb24gYWxnb3JpdGhtcw0KICArIFBlcmNlcHRyb24gKHNpbmdsZS1sYXllciBuZXVyYWwgbmV0d29ya3MpDQogICAgLSBVc2UgZGlmZmVyZW50IGFjdGl2YXRpb24gZnVuY3Rpb25zIHRvIGNyZWF0ZSBjYW5kaWRhdGUgcGVyY2VwdHJvbnMNCiAgICAtIEJlc3QgcGVyY2VwdHJvbiBzZWxlY3Rpb24gdXNpbmcgUk9DLUFVQw0KICArIERlY2lzaW9uIHRyZWUNCiAgICAtIGNyZWF0ZSBjYW5kaWRhdGUgbW9kZWxzIGJhc2VkIG9uIGNvbXBsZXhpdHkgcGFyYW1ldGVycyBhbmQvb3IgcGVuYWx0eSBvZiBtaXNjbGFzc2lmaWNhdGlvbiwgZXRjLg0KICAgIC0gU2VsZWN0IHRoZSBiZXN0IGRlY2lzaW9uIHRyZWUgd2l0aCBST0MtQVVDLg0KICArIEVuc2VtYmxlIHRyZWVzLUJBR0dJTkcNCiAgICAtIENyZWF0ZSBjYW5kaWRhdGUgQkFHR0lORyBtb2RlbHMgdXNpbmcgaHlwZXJwYXJhbWV0ZXJzIHN1Y2ggYXMgY29zdC1zZW5zaXRpdmUgcGVuYWx0eSBhbmQgc2l6ZSBvZiBiYWdnaW5nLCBldGMuLg0KICAgIC0gVXNlIFJPQy1BVUMgdG8gaWRlbnRpZnkgdGhlIGJlc3QgY2FuZGlkYXRlIG1vZGVsDQogICsgUGVyZm9ybSBhIGNvbXBhcmlzb24gYW1vbmcgdGhlIG9wdGltYWwgbW9kZWxzIGZyb20gZWFjaCBvZiB0aGUgYWJvdmUgZmFtaWxpZXMgdXNpbmcgUk9DLUFVQy4NCiAgKyBGaW5hbCBtb2RlbHMNCiAgICAtICoqTW9kZWwgU2VsZWN0aW9uIENyaXRlcmlhKio6IHBlcmZvcm1hbmNlLCBpbnRlcnByZXRhYmlsaXR5IG5lZWRzLCBhbmQgY29tcHV0YXRpb25hbCByZXF1aXJlbWVudHMuDQogICAgLSAqKlRocmVzaG9sZCBPcHRpbWl6YXRpb24qKjogbWF4aW1pemluZyBidXNpbmVzcyBtZXRyaWNzIGFuZCBjb3N0IGNvbnNpZGVyYXRpb25zLg0KICANCg0KIyBSZXBvcnRpbmcgYW5kIFN1Ym1pc3Npb24NCiAgDQoNCiogKipSZXBvcnQgRm9ybWF0KioNCiAgKyBUaGUgcmVwb3J0IHNob3VsZCBmb2xsb3cgdGhlIHNhbWUgc3RydWN0dXJlIGFuZCBjb21wb25lbnRzIGFzIHRob3NlIGluIHByb2plY3Qgb25lLg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==