1 Introduction

Regardless of the research design, statistics are a crucial component of research since it allows the researchers to summarize the collected data and give it to others for interpretation.

We need a defined analytic plan before we start collecting data. The SAP (statistical analysis plan) will direct us from the beginning to the conclusion, help us summarize and describe the data, and test our hypotheses.

The statistical analysis plan (SAP) describes the intended clinical trial analysis. The SAP is a technical document that describes the statistical methods of research analysis, as opposed to the protocol, which represents the analysis.

2 What is a statistical analysis plan?

Statistical Analysis Plan (SAP) is a detailed document specifying how data will be analyzed, ensuring transparency, reproducibility, and minimization of bias.

  • Data Collection
    • Primary Data: Clearly define the main outcome variables (e.g., clinical endpoints, survey responses).
    • Secondary Data: Specify additional variables (e.g., covariates, confounders) and their sources.
    • Data Handling: Procedures for missing data, outliers, and transformations (e.g., log-transformation for skewed data).
  • Methods of Analysis
    • Descriptive Statistics: Summarize data (means, proportions, SDs, visualizations).
    • Inferential Statistics: Hypothesis testing, confidence intervals, effect sizes.
    • Software/Tools: Specify (e.g., R, SAS, SPSS) and versions.
  • Primary Analysis
    • Define the primary outcome(s) and statistical test(s) (e.g., t-test, ANOVA, regression).
    • State how the primary hypothesis will be tested (e.g., superiority, non-inferiority).
  • Comparisons & Significance Levels
    • Predefined Comparisons: Subgroup analyses, pairwise comparisons (adjust for multiple testing if needed).
    • Alpha (Significance Level): Typically 0.05, with justification if adjusted.
    • Power Analysis: Sample size justification based on expected effect size.
  • Exploratory Data Analyses (EDA)
    • Unplanned analyses to identify patterns (e.g., trends, interactions).
    • Clarify that results are hypothesis-generating (not confirmatory).
  • Statistical Models
    • Primary Model: Specify (e.g., linear regression, logistic regression, Cox model).
    • Response Variable: Clearly defined (e.g., blood pressure, survival time).
    • Predictors/Covariates: List included variables and rationale.
    • Alternative Models: Robustness checks (e.g., sensitivity analyses, different covariate adjustments).

3 Identifying the need for an SAP

While a study protocol outlines the general research methodology, an SAP provides a deeper, technical specification of statistical procedures. Here’s when an SAP becomes essential:

  • High-Risk or Regulated Studies
    • Clinical trials (especially Phase II/III) requiring regulatory approval (FDA, EMA).
    • Studies with major clinical/public health implications (e.g., drug efficacy, policy decisions).
    • Pre-specified analyses to prevent bias (e.g., avoiding selective reporting).
  • Complex Statistical Methods
    • Advanced modeling (e.g., mixed-effects models, survival analysis, machine learning).
    • Adaptive trial designs (interim analyses, Bayesian methods).
    • Handling missing data (multiple imputation, inverse probability weighting).
  • Large or Multi-Center Studies
    • Ensures consistency across sites/analysts.
    • Prevents post-hoc decisions that could introduce bias.
  • Reproducibility & Transparency
    • Needed for peer-reviewed journals (e.g., ICMJE, CONSORT requirements).
    • Allows an independent statistician to replicate analyses without ambiguity.

4 Study Protocol vs SAP

The study protocol and SAP are complementary documents that guide different aspects of a research study. While they overlap in some areas, they serve distinct purposes and audiences.

The following table gives some comparisons of the two formal documents:

Types Study Protocol Statistical Analysis Plan (SAP)
Purposes
  • Describes the overall study design, objectives, and methodology.
  • Ensures ethical and scientific validity (used for approvals by IRBs, regulators).
  • Guides the conduct of the study (e.g., recruitment, interventions, data
  • Provides detailed, technical instructions for statistical analysis.
  • Ensures reproducibility, transparency, and minimization of bias.
  • Acts as a binding pre-specification to prevent data-driven decisions (e.g., p-hacking).
  • Contents
  • Research question & hypotheses
  • Study population & eligibility criteria
  • Study design (randomized trial, cohort, case-control, etc.)
  • Data collection procedures
  • General statistical approach (but not highly technical details)
  • Exact statistical models (e.g., regression formulas, survival analysis methods)
  • Handling of missing data, outliers, and covariates
  • Primary/secondary endpoint analysis (including multiplicity adjustments)
  • Sensitivity & subgroup analyses
  • Software & code specifications (if applicable)
  • Audience Investigators, ethics committees, funding agencies Statisticians, data analysts, regulatory reviewers, peer reviewers

    The protocol and SAP are interdependent: The protocol sets the rules; the SAP enforces them statistically. Here are some examples:

    • SAP Expands on the Protocol
      • The protocol states: “We will compare Group A and Group B using regression analysis.”
      • The SAP specifies: “A Cox proportional hazards model will be used with covariates X, Y, Z. Hazard ratios will be reported with 95% CIs. Missing data will be handled via multiple imputation.”
    • SAP is More Rigid (Pre-Specified)
      • The protocol may allow minor methodological flexibility.
      • The SAP locks in analysis details before data unblinding to prevent bias.
    • SAP is Often a Separate Document
      • For simple studies, statistical methods may be fully described in the protocol.
      • For complex/high-stakes studies, a standalone SAP is required (e.g., clinical trials for FDA submission).

    5 Key Information in the SAP

    The SAP should contain various sample size calculations for different statistical procedures to achieve certain statistical power and a thorough explanation of the main and any interim analyses used in the data analysis technique.

    The SAP should also thoroughly explain the procedures used to analyze and display the study results.

    • Statistical Significance – The predefined level of statistical significance (e.g., α = 0.05) and whether one-tailed or two-tailed tests will be employed.

    • Missing Data Handling – Methods for addressing missing data (e.g., imputation techniques, complete-case analysis).

    • Outlier Management – Approaches for identifying and handling outliers.

    • Estimation Methods – Techniques for point and interval estimation.

    • Composite/Derived Variables – Rules for calculating composite or derived variables, including data-driven definitions, with sufficient detail to minimize ambiguity.

    • Baseline and Covariate Data – How baseline and covariate data will be incorporated into the analysis.

    • Randomization Factors – Inclusion of randomization factors (if applicable).

    • Multi-sources Data Handling – Methods for managing data from multiple sources.

    • Multiple Comparisons & Subgroup Analysis – Methods for adjusting for multiple comparisons and conducting subgroup analyses.

    • Interim/Sequential Analyses – Details of any planned interim or sequential analyses.

    • Software Specifications – Identification of the computer systems and statistical software packages used for data analysis.

    • Assumptions & Sensitivity Analyses – Critical assumptions of the statistical models and methods for conducting sensitivity analyses to validate these assumptions.

    • Data Presentation – Guidelines for tables and figures to present study data.

    • Safety Population Definition – A clear definition of the safety population.

    • Model Validation & Alternatives – Provisions for testing the statistical model and alternative methods if model assumptions are violated.

    The SAP must include provisions for testing the statistical model, along with alternative methods to be used if the model assumptions are not met.

    LS0tDQp0aXRsZTogJ0EgQnJpZWYgRGVzY3JpcHRpb24gb2YgQmFzaWMgQ29tcG9uZW50cyBvZiBBIFNBUCcNCmF1dGhvcjogIkNoZW5nIFBlbmciDQpkYXRlOiAiICINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgdGhlbWU6IGx1bWVuDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX3dpZHRoOiAzDQogICAgZmlnX2hlaWdodDogMw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KYGBgez1odG1sfQ0KDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KDQovKiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzIChDU1MpIGlzIGEgc3R5bGVzaGVldCBsYW5ndWFnZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBwcmVzZW50YXRpb24gb2YgYSBkb2N1bWVudCB3cml0dGVuIGluIEhUTUwgb3IgWE1MLiBpdCBpcyBhIHNpbXBsZSBtZWNoYW5pc20gZm9yIGFkZGluZyBzdHlsZSAoZS5nLiwgZm9udHMsIGNvbG9ycywgc3BhY2luZykgdG8gV2ViIGRvY3VtZW50cy4gKi8NCg0KaDEudGl0bGUgeyAgLyogVGl0bGUgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIHRoZSByZXBvcnQgdGl0bGUgKi8NCiAgZm9udC1zaXplOiAyNHB4Ow0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGF1dGhvcnMgICovDQogIGZvbnQtc2l6ZTogMjBweDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBkYXRlICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDEgeyAvKiBIZWFkZXIgMSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDEgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDIycHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDIgeyAvKiBIZWFkZXIgMiAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDIgc2VjdGlvbiB0aXRsZSAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCAzIHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDQgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCg0KcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KPC9zdHlsZT4NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJNQVNTIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIk1BU1MiKQ0KICAgbGlicmFyeShNQVNTKQ0KfQ0KaWYgKCFyZXF1aXJlKCJsZWFmbGV0IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImxlYWZsZXQiKQ0KICAgbGlicmFyeShsZWFmbGV0KQ0KfQ0KaWYgKCFyZXF1aXJlKCJmYWN0b2V4dHJhIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImZhY3RvZXh0cmEiKQ0KICAgbGlicmFyeShmYWN0b2V4dHJhKQ0KfQ0KaWYgKCFyZXF1aXJlKCJUU3N0dWRpbyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJUU3N0dWRpbyIpDQogICBsaWJyYXJ5KFRTc3R1ZGlvKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwbG90cml4IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBsb3RyaXgiKQ0KbGlicmFyeShwbG90cml4KQ0KfQ0KaWYgKCFyZXF1aXJlKCJnZ3JpZGdlcyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3JpZGdlcyIpDQpsaWJyYXJ5KGdncmlkZ2VzKQ0KfQ0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KfQ0KaWYgKCFyZXF1aXJlKCJHR2FsbHkiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiR0dhbGx5IikNCmxpYnJhcnkoR0dhbGx5KQ0KfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRSVUUsICAgIA0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkENCiAgICAgICAgICAgICAgICAgICAgICApICANCmBgYA0KDQpcDQoNCiMgSW50cm9kdWN0aW9uDQoNClJlZ2FyZGxlc3Mgb2YgdGhlIHJlc2VhcmNoIGRlc2lnbiwgc3RhdGlzdGljcyBhcmUgYSBjcnVjaWFsIGNvbXBvbmVudCBvZiByZXNlYXJjaCBzaW5jZSBpdCBhbGxvd3MgdGhlIHJlc2VhcmNoZXJzIHRvIHN1bW1hcml6ZSB0aGUgY29sbGVjdGVkIGRhdGEgYW5kIGdpdmUgaXQgdG8gb3RoZXJzIGZvciBpbnRlcnByZXRhdGlvbi4gDQoNCldlIG5lZWQgYSBkZWZpbmVkIGFuYWx5dGljIHBsYW4gYmVmb3JlIHdlIHN0YXJ0IGNvbGxlY3RpbmcgZGF0YS4gVGhlIFNBUCAoc3RhdGlzdGljYWwgYW5hbHlzaXMgcGxhbikgd2lsbCBkaXJlY3QgdXMgZnJvbSB0aGUgYmVnaW5uaW5nIHRvIHRoZSBjb25jbHVzaW9uLCBoZWxwIHVzIHN1bW1hcml6ZSBhbmQgZGVzY3JpYmUgdGhlIGRhdGEsIGFuZCB0ZXN0IG91ciBoeXBvdGhlc2VzLg0KDQoNClRoZSBzdGF0aXN0aWNhbCBhbmFseXNpcyBwbGFuIChTQVApIGRlc2NyaWJlcyB0aGUgaW50ZW5kZWQgY2xpbmljYWwgdHJpYWwgYW5hbHlzaXMuIFRoZSBTQVAgaXMgYSB0ZWNobmljYWwgZG9jdW1lbnQgdGhhdCBkZXNjcmliZXMgdGhlIHN0YXRpc3RpY2FsIG1ldGhvZHMgb2YgcmVzZWFyY2ggYW5hbHlzaXMsIGFzIG9wcG9zZWQgdG8gdGhlIHByb3RvY29sLCB3aGljaCByZXByZXNlbnRzIHRoZSBhbmFseXNpcy4NCg0KIyBXaGF0IGlzIGEgc3RhdGlzdGljYWwgYW5hbHlzaXMgcGxhbj8NCg0KKipTdGF0aXN0aWNhbCBBbmFseXNpcyBQbGFuIChTQVApKiogaXMgYSBkZXRhaWxlZCBkb2N1bWVudCBzcGVjaWZ5aW5nIGhvdyBkYXRhIHdpbGwgYmUgYW5hbHl6ZWQsIGVuc3VyaW5nIHRyYW5zcGFyZW5jeSwgcmVwcm9kdWNpYmlsaXR5LCBhbmQgbWluaW1pemF0aW9uIG9mIGJpYXMuDQoNCiogKipEYXRhIENvbGxlY3Rpb24qKg0KICArICoqUHJpbWFyeSBEYXRhKio6IENsZWFybHkgZGVmaW5lIHRoZSBtYWluIG91dGNvbWUgdmFyaWFibGVzIChlLmcuLCBjbGluaWNhbCBlbmRwb2ludHMsIHN1cnZleSByZXNwb25zZXMpLg0KICArICoqU2Vjb25kYXJ5IERhdGEqKjogU3BlY2lmeSBhZGRpdGlvbmFsIHZhcmlhYmxlcyAoZS5nLiwgY292YXJpYXRlcywgY29uZm91bmRlcnMpIGFuZCB0aGVpciBzb3VyY2VzLg0KICArICoqRGF0YSBIYW5kbGluZyoqOiBQcm9jZWR1cmVzIGZvciBtaXNzaW5nIGRhdGEsIG91dGxpZXJzLCBhbmQgdHJhbnNmb3JtYXRpb25zIChlLmcuLCBsb2ctdHJhbnNmb3JtYXRpb24gZm9yIHNrZXdlZCBkYXRhKS4NCg0KKiAqKk1ldGhvZHMgb2YgQW5hbHlzaXMqKg0KICArICoqRGVzY3JpcHRpdmUgU3RhdGlzdGljcyoqOiBTdW1tYXJpemUgZGF0YSAobWVhbnMsIHByb3BvcnRpb25zLCBTRHMsIHZpc3VhbGl6YXRpb25zKS4NCiAgKyAqKkluZmVyZW50aWFsIFN0YXRpc3RpY3MqKjogSHlwb3RoZXNpcyB0ZXN0aW5nLCBjb25maWRlbmNlIGludGVydmFscywgZWZmZWN0IHNpemVzLg0KICArICoqU29mdHdhcmUvVG9vbHMqKjogU3BlY2lmeSAoZS5nLiwgUiwgU0FTLCBTUFNTKSBhbmQgdmVyc2lvbnMuDQoNCiogKipQcmltYXJ5IEFuYWx5c2lzKioNCiAgKyBEZWZpbmUgdGhlIHByaW1hcnkgb3V0Y29tZShzKSBhbmQgc3RhdGlzdGljYWwgdGVzdChzKSAoZS5nLiwgdC10ZXN0LCBBTk9WQSwgcmVncmVzc2lvbikuDQogICsgU3RhdGUgaG93IHRoZSBwcmltYXJ5IGh5cG90aGVzaXMgd2lsbCBiZSB0ZXN0ZWQgKGUuZy4sIHN1cGVyaW9yaXR5LCBub24taW5mZXJpb3JpdHkpLg0KDQoqICoqQ29tcGFyaXNvbnMgJiBTaWduaWZpY2FuY2UgTGV2ZWxzKioNCiAgKyBQcmVkZWZpbmVkIENvbXBhcmlzb25zOiBTdWJncm91cCBhbmFseXNlcywgcGFpcndpc2UgY29tcGFyaXNvbnMgKGFkanVzdCBmb3IgbXVsdGlwbGUgdGVzdGluZyBpZiBuZWVkZWQpLg0KICArIEFscGhhIChTaWduaWZpY2FuY2UgTGV2ZWwpOiBUeXBpY2FsbHkgMC4wNSwgd2l0aCBqdXN0aWZpY2F0aW9uIGlmIGFkanVzdGVkLg0KICArICoqUG93ZXIgQW5hbHlzaXMqKjogU2FtcGxlIHNpemUganVzdGlmaWNhdGlvbiBiYXNlZCBvbiBleHBlY3RlZCBlZmZlY3Qgc2l6ZS4NCg0KKiAqKkV4cGxvcmF0b3J5IERhdGEgQW5hbHlzZXMgKEVEQSkqKg0KICArIFVucGxhbm5lZCBhbmFseXNlcyB0byBpZGVudGlmeSBwYXR0ZXJucyAoZS5nLiwgdHJlbmRzLCBpbnRlcmFjdGlvbnMpLg0KICArIENsYXJpZnkgdGhhdCByZXN1bHRzIGFyZSBoeXBvdGhlc2lzLWdlbmVyYXRpbmcgKG5vdCBjb25maXJtYXRvcnkpLg0KDQoqICoqU3RhdGlzdGljYWwgTW9kZWxzKioNCiAgKyAqKlByaW1hcnkgTW9kZWwqKjogU3BlY2lmeSAoZS5nLiwgbGluZWFyIHJlZ3Jlc3Npb24sIGxvZ2lzdGljIHJlZ3Jlc3Npb24sIENveCBtb2RlbCkuDQogICsgKipSZXNwb25zZSBWYXJpYWJsZSoqOiBDbGVhcmx5IGRlZmluZWQgKGUuZy4sIGJsb29kIHByZXNzdXJlLCBzdXJ2aXZhbCB0aW1lKS4NCiAgKyAqKlByZWRpY3RvcnMvQ292YXJpYXRlcyoqOiBMaXN0IGluY2x1ZGVkIHZhcmlhYmxlcyBhbmQgcmF0aW9uYWxlLg0KICArICoqQWx0ZXJuYXRpdmUgTW9kZWxzKio6IFJvYnVzdG5lc3MgY2hlY2tzIChlLmcuLCBzZW5zaXRpdml0eSBhbmFseXNlcywgZGlmZmVyZW50IGNvdmFyaWF0ZSBhZGp1c3RtZW50cykuDQoNCg0KDQojIElkZW50aWZ5aW5nIHRoZSBuZWVkIGZvciBhbiBTQVANCg0KV2hpbGUgYSBzdHVkeSBwcm90b2NvbCBvdXRsaW5lcyB0aGUgZ2VuZXJhbCByZXNlYXJjaCBtZXRob2RvbG9neSwgYW4gU0FQIHByb3ZpZGVzIGEgZGVlcGVyLCB0ZWNobmljYWwgc3BlY2lmaWNhdGlvbiBvZiBzdGF0aXN0aWNhbCBwcm9jZWR1cmVzLiBIZXJl4oCZcyB3aGVuIGFuIFNBUCBiZWNvbWVzIGVzc2VudGlhbDoNCg0KKiAqKkhpZ2gtUmlzayBvciBSZWd1bGF0ZWQgU3R1ZGllcyoqDQogICsgKipDbGluaWNhbCB0cmlhbHMqKiAoZXNwZWNpYWxseSBQaGFzZSBJSS9JSUkpIHJlcXVpcmluZyByZWd1bGF0b3J5IGFwcHJvdmFsIChGREEsIEVNQSkuDQogICsgKipTdHVkaWVzIHdpdGggbWFqb3IgY2xpbmljYWwvcHVibGljIGhlYWx0aCBpbXBsaWNhdGlvbnMqKiAoZS5nLiwgZHJ1ZyBlZmZpY2FjeSwgcG9saWN5IGRlY2lzaW9ucykuDQogICsgKipQcmUtc3BlY2lmaWVkIGFuYWx5c2VzIHRvIHByZXZlbnQgYmlhcyoqIChlLmcuLCBhdm9pZGluZyBzZWxlY3RpdmUgcmVwb3J0aW5nKS4NCg0KKiAqKkNvbXBsZXggU3RhdGlzdGljYWwgTWV0aG9kcyoqDQogICsgKipBZHZhbmNlZCBtb2RlbGluZyoqIChlLmcuLCBtaXhlZC1lZmZlY3RzIG1vZGVscywgc3Vydml2YWwgYW5hbHlzaXMsIG1hY2hpbmUgbGVhcm5pbmcpLg0KICArICoqQWRhcHRpdmUgdHJpYWwgZGVzaWducyoqIChpbnRlcmltIGFuYWx5c2VzLCBCYXllc2lhbiBtZXRob2RzKS4NCiAgKyAqKkhhbmRsaW5nIG1pc3NpbmcgZGF0YSoqIChtdWx0aXBsZSBpbXB1dGF0aW9uLCBpbnZlcnNlIHByb2JhYmlsaXR5IHdlaWdodGluZykuDQoNCiogKipMYXJnZSBvciBNdWx0aS1DZW50ZXIgU3R1ZGllcyoqDQogICsgRW5zdXJlcyBjb25zaXN0ZW5jeSBhY3Jvc3Mgc2l0ZXMvYW5hbHlzdHMuDQogICsgUHJldmVudHMgcG9zdC1ob2MgZGVjaXNpb25zIHRoYXQgY291bGQgaW50cm9kdWNlIGJpYXMuDQoNCiogKipSZXByb2R1Y2liaWxpdHkgJiBUcmFuc3BhcmVuY3kqKg0KICArIE5lZWRlZCBmb3IgcGVlci1yZXZpZXdlZCBqb3VybmFscyAoZS5nLiwgSUNNSkUsIENPTlNPUlQgcmVxdWlyZW1lbnRzKS4NCiAgKyBBbGxvd3MgYW4gaW5kZXBlbmRlbnQgc3RhdGlzdGljaWFuIHRvIHJlcGxpY2F0ZSBhbmFseXNlcyB3aXRob3V0IGFtYmlndWl0eS4NCg0KDQoNCiMgU3R1ZHkgUHJvdG9jb2wgdnMgU0FQDQoNClRoZSBzdHVkeSBwcm90b2NvbCBhbmQgU0FQIGFyZSBjb21wbGVtZW50YXJ5IGRvY3VtZW50cyB0aGF0IGd1aWRlIGRpZmZlcmVudCBhc3BlY3RzIG9mIGEgcmVzZWFyY2ggc3R1ZHkuIFdoaWxlIHRoZXkgb3ZlcmxhcCBpbiBzb21lIGFyZWFzLCB0aGV5IHNlcnZlIGRpc3RpbmN0IHB1cnBvc2VzIGFuZCBhdWRpZW5jZXMuDQoNClRoZSBmb2xsb3dpbmcgdGFibGUgZ2l2ZXMgc29tZSBjb21wYXJpc29ucyBvZiB0aGUgdHdvIGZvcm1hbCBkb2N1bWVudHM6DQoNCmBgYHs9aHRtbH0NCjx0YWJsZSBib3JkZXI9IjEiPg0KICA8dHI+DQogICAgPHRoPiBUeXBlcyA8L3RoPg0KICAgIDx0aD5TdHVkeSBQcm90b2NvbDwvdGg+DQogICAgPHRoPlN0YXRpc3RpY2FsIEFuYWx5c2lzIFBsYW4gKFNBUCk8L3RoPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkPlB1cnBvc2VzPC90ZD4NCiAgICA8dGQ+IDxsaT4gRGVzY3JpYmVzIHRoZSBvdmVyYWxsIHN0dWR5IGRlc2lnbiwgb2JqZWN0aXZlcywgYW5kIG1ldGhvZG9sb2d5Lg0KICAgICAgICAgPGxpPiBFbnN1cmVzIGV0aGljYWwgYW5kIHNjaWVudGlmaWMgdmFsaWRpdHkgKHVzZWQgZm9yIGFwcHJvdmFscyBieSBJUkJzLCByZWd1bGF0b3JzKS4NCiAgICAgICAgIDxsaT4gR3VpZGVzIHRoZSBjb25kdWN0IG9mIHRoZSBzdHVkeSAoZS5nLiwgcmVjcnVpdG1lbnQsIGludGVydmVudGlvbnMsIGRhdGE8L3RkPg0KICAgIDx0ZD4gPGxpPiBQcm92aWRlcyBkZXRhaWxlZCwgdGVjaG5pY2FsIGluc3RydWN0aW9ucyBmb3Igc3RhdGlzdGljYWwgYW5hbHlzaXMuDQogICAgICAgICA8bGk+IEVuc3VyZXMgcmVwcm9kdWNpYmlsaXR5LCB0cmFuc3BhcmVuY3ksIGFuZCBtaW5pbWl6YXRpb24gb2YgYmlhcy4NCiAgICAgICAgIDxsaT4gQWN0cyBhcyBhIGJpbmRpbmcgcHJlLXNwZWNpZmljYXRpb24gdG8gcHJldmVudCBkYXRhLWRyaXZlbiBkZWNpc2lvbnMgKGUuZy4sIHAtaGFja2luZykuPC90ZD4NCiAgPC90cj4NCiAgDQogIDx0cj4NCiAgICA8dGQ+Q29udGVudHM8L3RkPg0KICAgIDx0ZD4gPGxpPiBSZXNlYXJjaCBxdWVzdGlvbiAmIGh5cG90aGVzZXMNCiAgICAgICAgIDxsaT4gU3R1ZHkgcG9wdWxhdGlvbiAmIGVsaWdpYmlsaXR5IGNyaXRlcmlhDQogICAgICAgICA8bGk+IFN0dWR5IGRlc2lnbiAocmFuZG9taXplZCB0cmlhbCwgY29ob3J0LCBjYXNlLWNvbnRyb2wsIGV0Yy4pDQogICAgICAgICA8bGk+IERhdGEgY29sbGVjdGlvbiBwcm9jZWR1cmVzDQogICAgICAgICA8bGk+IEdlbmVyYWwgc3RhdGlzdGljYWwgYXBwcm9hY2ggKGJ1dCBub3QgaGlnaGx5IHRlY2huaWNhbCBkZXRhaWxzKTwvdGQ+DQogICAgPHRkPiA8bGk+IEV4YWN0IHN0YXRpc3RpY2FsIG1vZGVscyAoZS5nLiwgcmVncmVzc2lvbiBmb3JtdWxhcywgc3Vydml2YWwgYW5hbHlzaXMgbWV0aG9kcykNCiAgICAgICAgIDxsaT4gSGFuZGxpbmcgb2YgbWlzc2luZyBkYXRhLCBvdXRsaWVycywgYW5kIGNvdmFyaWF0ZXMNCiAgICAgICAgIDxsaT4gUHJpbWFyeS9zZWNvbmRhcnkgZW5kcG9pbnQgYW5hbHlzaXMgKGluY2x1ZGluZyBtdWx0aXBsaWNpdHkgYWRqdXN0bWVudHMpDQogICAgICAgICA8bGk+IFNlbnNpdGl2aXR5ICYgc3ViZ3JvdXAgYW5hbHlzZXMNCiAgICAgICAgIDxsaT4gU29mdHdhcmUgJiBjb2RlIHNwZWNpZmljYXRpb25zIChpZiBhcHBsaWNhYmxlKTwvdGQ+DQogIDwvdHI+DQogIA0KICA8dHI+DQogICAgPHRkPkF1ZGllbmNlPC90ZD4NCiAgICA8dGQ+SW52ZXN0aWdhdG9ycywgZXRoaWNzIGNvbW1pdHRlZXMsIGZ1bmRpbmcgYWdlbmNpZXM8L3RkPg0KICAgIDx0ZD5TdGF0aXN0aWNpYW5zLCBkYXRhIGFuYWx5c3RzLCByZWd1bGF0b3J5IHJldmlld2VycywgcGVlciByZXZpZXdlcnMgPC90ZD4NCiAgPC90cj4NCjwvdGFibGU+DQpgYGANCg0KDQpUaGUgcHJvdG9jb2wgYW5kIFNBUCBhcmUgaW50ZXJkZXBlbmRlbnQ6IFRoZSBwcm90b2NvbCBzZXRzIHRoZSBydWxlczsgdGhlIFNBUCBlbmZvcmNlcyB0aGVtIHN0YXRpc3RpY2FsbHkuIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6DQoNCiogKipTQVAgRXhwYW5kcyBvbiB0aGUgUHJvdG9jb2wqKg0KICArICoqVGhlIHByb3RvY29sKiogc3RhdGVzOiAiV2Ugd2lsbCBjb21wYXJlIEdyb3VwIEEgYW5kIEdyb3VwIEIgdXNpbmcgcmVncmVzc2lvbiBhbmFseXNpcy4iDQogICsgKipUaGUgU0FQKiogc3BlY2lmaWVzOiAiQSBDb3ggcHJvcG9ydGlvbmFsIGhhemFyZHMgbW9kZWwgd2lsbCBiZSB1c2VkIHdpdGggY292YXJpYXRlcyBYLCBZLCBaLiBIYXphcmQgcmF0aW9zIHdpbGwgYmUgcmVwb3J0ZWQgd2l0aCA5NSUgQ0lzLiBNaXNzaW5nIGRhdGEgd2lsbCBiZSBoYW5kbGVkIHZpYSBtdWx0aXBsZSBpbXB1dGF0aW9uLiINCg0KDQoqICoqU0FQIGlzIE1vcmUgUmlnaWQgKFByZS1TcGVjaWZpZWQpKioNCiAgKyBUaGUgcHJvdG9jb2wgbWF5IGFsbG93IG1pbm9yIG1ldGhvZG9sb2dpY2FsIGZsZXhpYmlsaXR5Lg0KICArIFRoZSBTQVAgbG9ja3MgaW4gYW5hbHlzaXMgZGV0YWlscyBiZWZvcmUgZGF0YSB1bmJsaW5kaW5nIHRvIHByZXZlbnQgYmlhcy4NCg0KKiAqKlNBUCBpcyBPZnRlbiBhIFNlcGFyYXRlIERvY3VtZW50KioNCiAgKyBGb3Igc2ltcGxlIHN0dWRpZXMsIHN0YXRpc3RpY2FsIG1ldGhvZHMgbWF5IGJlIGZ1bGx5IGRlc2NyaWJlZCBpbiB0aGUgcHJvdG9jb2wuDQogICsgRm9yIGNvbXBsZXgvaGlnaC1zdGFrZXMgc3R1ZGllcywgYSBzdGFuZGFsb25lIFNBUCBpcyByZXF1aXJlZCAoZS5nLiwgY2xpbmljYWwgdHJpYWxzIGZvciBGREEgc3VibWlzc2lvbikuDQoNCg0KIyBLZXkgSW5mb3JtYXRpb24gaW4gdGhlIFNBUA0KDQpUaGUgU0FQIHNob3VsZCBjb250YWluIHZhcmlvdXMgc2FtcGxlIHNpemUgY2FsY3VsYXRpb25zIGZvciBkaWZmZXJlbnQgc3RhdGlzdGljYWwgcHJvY2VkdXJlcyB0byBhY2hpZXZlIGNlcnRhaW4gc3RhdGlzdGljYWwgcG93ZXIgYW5kIGEgdGhvcm91Z2ggZXhwbGFuYXRpb24gb2YgdGhlIG1haW4gYW5kIGFueSBpbnRlcmltIGFuYWx5c2VzIHVzZWQgaW4gdGhlIGRhdGEgYW5hbHlzaXMgdGVjaG5pcXVlLiANCg0KVGhlIFNBUCBzaG91bGQgYWxzbyB0aG9yb3VnaGx5IGV4cGxhaW4gdGhlIHByb2NlZHVyZXMgdXNlZCB0byBhbmFseXplIGFuZCBkaXNwbGF5IHRoZSBzdHVkeSByZXN1bHRzLg0KDQoqICoqU3RhdGlzdGljYWwgU2lnbmlmaWNhbmNlKiog4oCTIFRoZSBwcmVkZWZpbmVkIGxldmVsIG9mIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSAoZS5nLiwgzrEgPSAwLjA1KSBhbmQgd2hldGhlciBvbmUtdGFpbGVkIG9yIHR3by10YWlsZWQgdGVzdHMgd2lsbCBiZSBlbXBsb3llZC4NCg0KKiAqKk1pc3NpbmcgRGF0YSBIYW5kbGluZyoqIOKAkyBNZXRob2RzIGZvciBhZGRyZXNzaW5nIG1pc3NpbmcgZGF0YSAoZS5nLiwgaW1wdXRhdGlvbiB0ZWNobmlxdWVzLCBjb21wbGV0ZS1jYXNlIGFuYWx5c2lzKS4NCg0KKiAqKk91dGxpZXIgTWFuYWdlbWVudCoqIOKAkyBBcHByb2FjaGVzIGZvciBpZGVudGlmeWluZyBhbmQgaGFuZGxpbmcgb3V0bGllcnMuDQoNCiogKipFc3RpbWF0aW9uIE1ldGhvZHMqKiDigJMgVGVjaG5pcXVlcyBmb3IgcG9pbnQgYW5kIGludGVydmFsIGVzdGltYXRpb24uDQoNCiogKipDb21wb3NpdGUvRGVyaXZlZCBWYXJpYWJsZXMqKiDigJMgUnVsZXMgZm9yIGNhbGN1bGF0aW5nIGNvbXBvc2l0ZSBvciBkZXJpdmVkIHZhcmlhYmxlcywgaW5jbHVkaW5nIGRhdGEtZHJpdmVuIGRlZmluaXRpb25zLCB3aXRoIHN1ZmZpY2llbnQgZGV0YWlsIHRvIG1pbmltaXplIGFtYmlndWl0eS4NCg0KKiAqKkJhc2VsaW5lIGFuZCBDb3ZhcmlhdGUgRGF0YSoqIOKAkyBIb3cgYmFzZWxpbmUgYW5kIGNvdmFyaWF0ZSBkYXRhIHdpbGwgYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIGFuYWx5c2lzLg0KDQoqICoqUmFuZG9taXphdGlvbiBGYWN0b3JzKiog4oCTIEluY2x1c2lvbiBvZiByYW5kb21pemF0aW9uIGZhY3RvcnMgKGlmIGFwcGxpY2FibGUpLg0KDQoqICoqTXVsdGktc291cmNlcyBEYXRhIEhhbmRsaW5nKiog4oCTIE1ldGhvZHMgZm9yIG1hbmFnaW5nIGRhdGEgZnJvbSBtdWx0aXBsZSBzb3VyY2VzLg0KDQoqICoqTXVsdGlwbGUgQ29tcGFyaXNvbnMgJiBTdWJncm91cCBBbmFseXNpcyoqIOKAkyBNZXRob2RzIGZvciBhZGp1c3RpbmcgZm9yIG11bHRpcGxlIGNvbXBhcmlzb25zIGFuZCBjb25kdWN0aW5nIHN1Ymdyb3VwIGFuYWx5c2VzLg0KDQoqICoqSW50ZXJpbS9TZXF1ZW50aWFsIEFuYWx5c2VzKiog4oCTIERldGFpbHMgb2YgYW55IHBsYW5uZWQgaW50ZXJpbSBvciBzZXF1ZW50aWFsIGFuYWx5c2VzLg0KDQoqICoqU29mdHdhcmUgU3BlY2lmaWNhdGlvbnMqKiDigJMgSWRlbnRpZmljYXRpb24gb2YgdGhlIGNvbXB1dGVyIHN5c3RlbXMgYW5kIHN0YXRpc3RpY2FsIHNvZnR3YXJlIHBhY2thZ2VzIHVzZWQgZm9yIGRhdGEgYW5hbHlzaXMuDQoNCiogKipBc3N1bXB0aW9ucyAmIFNlbnNpdGl2aXR5IEFuYWx5c2VzKiog4oCTIENyaXRpY2FsIGFzc3VtcHRpb25zIG9mIHRoZSBzdGF0aXN0aWNhbCBtb2RlbHMgYW5kIG1ldGhvZHMgZm9yIGNvbmR1Y3Rpbmcgc2Vuc2l0aXZpdHkgYW5hbHlzZXMgdG8gdmFsaWRhdGUgdGhlc2UgYXNzdW1wdGlvbnMuDQoNCiogKipEYXRhIFByZXNlbnRhdGlvbioqIOKAkyBHdWlkZWxpbmVzIGZvciB0YWJsZXMgYW5kIGZpZ3VyZXMgdG8gcHJlc2VudCBzdHVkeSBkYXRhLg0KDQoqICoqU2FmZXR5IFBvcHVsYXRpb24gRGVmaW5pdGlvbioqIOKAkyBBIGNsZWFyIGRlZmluaXRpb24gb2YgdGhlIHNhZmV0eSBwb3B1bGF0aW9uLg0KDQoqICoqTW9kZWwgVmFsaWRhdGlvbiAmIEFsdGVybmF0aXZlcyoqIOKAkyBQcm92aXNpb25zIGZvciB0ZXN0aW5nIHRoZSBzdGF0aXN0aWNhbCBtb2RlbCBhbmQgYWx0ZXJuYXRpdmUgbWV0aG9kcyBpZiBtb2RlbCBhc3N1bXB0aW9ucyBhcmUgdmlvbGF0ZWQuDQoNCg0KPGZvbnQgY29sb3IgPSAicmVkIj4qXGNvbG9ye3JlZH1UaGUgU0FQIG11c3QgaW5jbHVkZSBwcm92aXNpb25zIGZvciB0ZXN0aW5nIHRoZSBzdGF0aXN0aWNhbCBtb2RlbCwgYWxvbmcgd2l0aCBhbHRlcm5hdGl2ZSBtZXRob2RzIHRvIGJlIHVzZWQgaWYgdGhlIG1vZGVsIGFzc3VtcHRpb25zIGFyZSBub3QgbWV0Lio8L2ZvbnQ+DQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==