Wednesday, 10 December 2025

335.FITNESS DATASET CREATION AND ANALYSIS USING PROC SQL | PROC MEANS | PROC UNIVARIATE | PROC SGPLOT | PROC FREQ | PROC FORMAT | PROC RANK | PROC REPORT | PROC CORR (WITH MACROS AND DATE FUNCTIONS LIKE INTCK | INTNX)

FITNESS DATASET CREATION AND ANALYSIS USING PROC SQL | PROC MEANS | PROC UNIVARIATE | PROC SGPLOT | PROC FREQ | PROC FORMAT | PROC RANK | PROC REPORT | PROC CORR (WITH MACROS AND DATE FUNCTIONS LIKE INTCK | INTNX)

options nocenter;

1. Create raw table with explicit dates and sample values 

data work.fitness_raw;

  format Baseline_Date Measurement_Date Next_Check_Date date9.;

  /* Next_Check_Date placeholder - will derive later */

  infile datalines dsd dlm=',';

  input Person_ID :$8. Steps_Per_Day :comma32. Calories_Burned :comma32. BMI :8.2

        Heart_Rate :8. Baseline_Date :date9. Measurement_Date :date9.;

  datalines;

P001,  12000,  3200,  22.5,  62,  01JAN2024,  01JUL2025

P002,   3500,  2100,  29.8,  82,  01FEB2024,  10JUL2025

P003,   8000,  2500,  24.3,  72,  15MAR2024,  25JUN2025

P004,   4000,  2300,  27.1,  78,  01APR2024,  05JUL2025

P005,  15000,  3400,  21.0,  58,  20MAY2024,  20JUN2025

P006,   6000,  2400,  26.5,  75,  10JUN2024,  30JUN2025

P007,  10000,  3000,  23.4,  66,  01JUL2024,  01JUL2025

P008,   2000,  1900,  31.2,  88,  15JUL2024,  15JUL2025

P009,   9000,  2800,  25.0,  70,  01AUG2024,  10JUL2025

P010,  11000,  3100,  22.0,  64,  05SEP2024,  05JUL2025

P011,   4500,  2250,  28.4,  79,  10OCT2024,  10JUL2025

P012,   7000,  2600,  24.9,  71,  20NOV2024,  20JUL2025

;

run;

proc print data=work.fitness_raw ;

  title "Raw fitness_raw dataset - initial check";

run;

OUTPUT:

Raw fitness_raw dataset - initial check

ObsBaseline_DateMeasurement_DateNext_Check_DatePerson_IDSteps_Per_DayCalories_BurnedBMIHeart_Rate
101JAN202401JUL2025.P00112000320022.562
201FEB202410JUL2025.P0023500210029.882
315MAR202425JUN2025.P0038000250024.372
401APR202405JUL2025.P0044000230027.178
520MAY202420JUN2025.P00515000340021.058
610JUN202430JUN2025.P0066000240026.575
701JUL202401JUL2025.P00710000300023.466
815JUL202415JUL2025.P0082000190031.288
901AUG202410JUL2025.P0099000280025.070
1005SEP202405JUL2025.P01011000310022.064
1110OCT202410JUL2025.P0114500225028.479
1220NOV202420JUL2025.P0127000260024.971

2. Derive additional date-based and health variables using DATA step 

data work.fitness;

  set work.fitness_raw;

  /* Compute days between Baseline and Measurement (inclusive/exclusive choice: exclusive) */

  Duration_Days = intck('day', Baseline_Date, Measurement_Date);

  /* Compute Next_Check_Date as 3 months after Measurement (INTNX with 'same' alignment) */

  Next_Check_Date = intnx('month', Measurement_Date, 3, 'same');

  /* Step score: cap at 20000 for scaling */

  Steps_Capped = min(Steps_Per_Day,20000);

  Step_Score = (Steps_Capped / 10000) * 30; /* 0-60 scaled to 30 baseline */


  /* BMI score: best at 21.75-24.99 -> use gaussian-ish penalty (simple) */

  if BMI <= 18.5 then BMI_Score = 10;

  else if 18.5 < BMI <= 24.99 then BMI_Score = 30;

  else if 25 <= BMI <= 29.99 then BMI_Score = 20;

  else BMI_Score = 10; /* obese range */


  /* Heart rate score: lower is better (but not extremely low) */

  if 50 <= Heart_Rate <= 70 then HR_Score = 30;

  else if 71 <= Heart_Rate <= 80 then HR_Score = 20;

  else if Heart_Rate < 50 then HR_Score = 15;

  else HR_Score = 10;


  /* Calories score: approximate expected burn (higher with more activity) */

  Cal_Score = min((Calories_Burned / 3000) * 20, 20);


  /* Composite score out of 100 */

  Composite_Score = Step_Score + BMI_Score + HR_Score + Cal_Score;

  /* Keep composite in 0-100 boundary */

  if Composite_Score > 100 then Composite_Score = 100;


  drop Steps_Capped;

run;

proc print data=work.fitness;

run;

OUTPUT:

ObsBaseline_DateMeasurement_DateNext_Check_DatePerson_IDSteps_Per_DayCalories_BurnedBMIHeart_RateDuration_DaysStep_ScoreBMI_ScoreHR_ScoreCal_ScoreComposite_Score
101JAN202401JUL202501OCT2025P00112000320022.56254736.0303020.0000100.000
201FEB202410JUL202510OCT2025P0023500210029.88252510.5201014.000054.500
315MAR202425JUN202525SEP2025P0038000250024.37246724.0302016.666790.667
401APR202405JUL202505OCT2025P0044000230027.17846012.0202015.333367.333
520MAY202420JUN202520SEP2025P00515000340021.05839645.0303020.0000100.000
610JUN202430JUN202530SEP2025P0066000240026.57538518.0202016.000074.000
701JUL202401JUL202501OCT2025P00710000300023.46636530.0303020.0000100.000
815JUL202415JUL202515OCT2025P0082000190031.2883656.0101012.666738.667
901AUG202410JUL202510OCT2025P0099000280025.07034327.0203018.666795.667
1005SEP202405JUL202505OCT2025P01011000310022.06430333.0303020.0000100.000
1110OCT202410JUL202510OCT2025P0114500225028.47927313.5202015.000068.500
1220NOV202420JUL202520OCT2025P0127000260024.97124221.0302017.333388.333


3. Macro for automatic classification based on Composite_Score and BMI thresholds 

%macro classify_health(in=, out=);

  /* Creates a new dataset with Fitness_Level variable assigned */

  data &out.;

    set &in.;

    length Fitness_Level $12.;


    if Composite_Score >= 80 then Fitness_Level = 'Excellent';

    else if Composite_Score >= 60 then Fitness_Level = 'Good';

    else if Composite_Score >= 40 then Fitness_Level = 'Average';

    else Fitness_Level = 'Poor';


    /* Make a short textual note for borderline cases (example of derived variable) */

    if (BMI >= 25 and Composite_Score >= 60) then Fitness_Comment = 'High BMI but good activity';

    else if (BMI < 18.5 and Composite_Score < 40) then Fitness_Comment = 'Underweight & low score';

    else Fitness_Comment = 'No major note';

    format Baseline_Date Measurement_Date Next_Check_Date date9.;

  run;

  proc print data=&out. ;

  run;

%mend classify_health;


%classify_health(in=work.fitness, out=work.fitness_final);

OUTPUT:

ObsBaseline_DateMeasurement_DateNext_Check_DatePerson_IDSteps_Per_DayCalories_BurnedBMIHeart_RateDuration_DaysStep_ScoreBMI_ScoreHR_ScoreCal_ScoreComposite_ScoreFitness_LevelFitness_Comment
101JAN202401JUL202501OCT2025P00112000320022.56254736.0303020.0000100.000ExcellentNo major note
201FEB202410JUL202510OCT2025P0023500210029.88252510.5201014.000054.500AverageNo major note
315MAR202425JUN202525SEP2025P0038000250024.37246724.0302016.666790.667ExcellentNo major note
401APR202405JUL202505OCT2025P0044000230027.17846012.0202015.333367.333GoodHigh BMI but good activity
520MAY202420JUN202520SEP2025P00515000340021.05839645.0303020.0000100.000ExcellentNo major note
610JUN202430JUN202530SEP2025P0066000240026.57538518.0202016.000074.000GoodHigh BMI but good activity
701JUL202401JUL202501OCT2025P00710000300023.46636530.0303020.0000100.000ExcellentNo major note
815JUL202415JUL202515OCT2025P0082000190031.2883656.0101012.666738.667PoorNo major note
901AUG202410JUL202510OCT2025P0099000280025.07034327.0203018.666795.667ExcellentHigh BMI but good activity
1005SEP202405JUL202505OCT2025P01011000310022.06430333.0303020.0000100.000ExcellentNo major note
1110OCT202410JUL202510OCT2025P0114500225028.47927313.5202015.000068.500GoodHigh BMI but good activity
1220NOV202420JUL202520OCT2025P0127000260024.97124221.0302017.333388.333ExcellentNo major note


4. Use PROC SQL to create a summary table and to demonstrate SQL skills 

proc sql noprint;

  create table work.fitness_summary_sql as

  select

    count(Person_ID) as N,

    mean(Steps_Per_Day) as Mean_Steps format=8.1,

    median(Steps_Per_Day) as Median_Steps,

    min(Steps_Per_Day) as Min_Steps,

    max(Steps_Per_Day) as Max_Steps,

    mean(BMI) as Mean_BMI format=8.2,

    mean(Heart_Rate) as Mean_HR format=8.2

  from work.fitness_final;

quit;

proc print data=work.fitness_summary_sql noobs;

  title "Summary statistics (PROC SQL)";

run;

OUTPUT:

Summary statistics (PROC SQL)

NMean_StepsMedian_StepsMin_StepsMax_StepsMean_BMIMean_HR
127666.7750020001500025.5172.08

5. PROC MEANS: numeric summaries by Fitness_Level 

proc means data=work.fitness_final n mean median std min max;

  class Fitness_Level;

  var Steps_Per_Day Calories_Burned BMI Heart_Rate Composite_Score Duration_Days;

  title "PROC MEANS by Fitness_Level";

run;

OUTPUT:

PROC MEANS by Fitness_Level

The MEANS Procedure

Fitness_LevelN ObsVariableNMeanMedianStd DevMinimumMaximum
Average1
Steps_Per_Day
Calories_Burned
BMI
Heart_Rate
Composite_Score
Duration_Days
1
1
1
1
1
1
3500.00
2100.00
29.8000000
82.0000000
54.5000000
525.0000000
3500.00
2100.00
29.8000000
82.0000000
54.5000000
525.0000000
.
.
.
.
.
.
3500.00
2100.00
29.8000000
82.0000000
54.5000000
525.0000000
3500.00
2100.00
29.8000000
82.0000000
54.5000000
525.0000000
Excellent7
Steps_Per_Day
Calories_Burned
BMI
Heart_Rate
Composite_Score
Duration_Days
7
7
7
7
7
7
10285.71
2942.86
23.3000000
66.1428571
96.3809524
380.4285714
10000.00
3000.00
23.4000000
66.0000000
100.0000000
365.0000000
2690.37
325.8688021
1.5318834
5.1777914
5.0052882
101.8820513
7000.00
2500.00
21.0000000
58.0000000
88.3333333
242.0000000
15000.00
3400.00
25.0000000
72.0000000
100.0000000
547.0000000
Good3
Steps_Per_Day
Calories_Burned
BMI
Heart_Rate
Composite_Score
Duration_Days
3
3
3
3
3
3
4833.33
2316.67
27.3333333
77.3333333
69.9444444
372.6666667
4500.00
2300.00
27.1000000
78.0000000
68.5000000
385.0000000
1040.83
76.3762616
0.9712535
2.0816660
3.5603267
94.1080939
4000.00
2250.00
26.5000000
75.0000000
67.3333333
273.0000000
6000.00
2400.00
28.4000000
79.0000000
74.0000000
460.0000000
Poor1
Steps_Per_Day
Calories_Burned
BMI
Heart_Rate
Composite_Score
Duration_Days
1
1
1
1
1
1
2000.00
1900.00
31.2000000
88.0000000
38.6666667
365.0000000
2000.00
1900.00
31.2000000
88.0000000
38.6666667
365.0000000
.
.
.
.
.
.
2000.00
1900.00
31.2000000
88.0000000
38.6666667
365.0000000
2000.00
1900.00
31.2000000
88.0000000
38.6666667
365.0000000

6. PROC UNIVARIATE: check distribution of Composite_Score and Steps 

proc univariate data=work.fitness_final cibasic;

  var Composite_Score Steps_Per_Day;

  histogram Composite_Score / normal;

  inset mean median std / pos = ne;

  title "PROC UNIVARIATE: Composite_Score and Steps distribution";

run;

OUTPUT:

PROC UNIVARIATE: Composite_Score and Steps distribution

The UNIVARIATE Procedure

Variable: Composite_Score

Moments
N12Sum Weights12
Mean81.4722222Sum Observations977.666667
Std Deviation20.6486766Variance426.367845
Skewness-0.9179529Kurtosis-0.1506143
Uncorrected SS84342.7222Corrected SS4690.0463
Coeff Variation25.3444377Std Error Mean5.9607595
Basic Statistical Measures
LocationVariability
Mean81.4722Std Deviation20.64868
Median89.5000Variance426.36785
Mode100.0000Range61.33333
  Interquartile Range32.08333
Basic Confidence Limits Assuming Normality
ParameterEstimate95% Confidence Limits
Mean81.4722268.3526894.59177
Std Deviation20.6486814.6274235.05893
Variance426.36785213.961491229
Tests for Location: Mu0=0
TestStatisticp Value
Student's tt13.66809Pr > |t|<.0001
SignM6Pr >= |M|0.0005
Signed RankS39Pr >= |S|0.0005
Quantiles (Definition 5)
LevelQuantile
100% Max100.0000
99%100.0000
95%100.0000
90%100.0000
75% Q3100.0000
50% Median89.5000
25% Q167.9167
10%54.5000
5%38.6667
1%38.6667
0% Min38.6667
Extreme Observations
LowestHighest
ValueObsValueObs
38.6667895.66679
54.50002100.00001
67.33334100.00005
68.500011100.00007
74.00006100.000010

PROC UNIVARIATE: Composite_Score and Steps distribution

The UNIVARIATE Procedure

Histogram for Composite_Score


PROC UNIVARIATE: Composite_Score and Steps distribution

The UNIVARIATE Procedure

Fitted Normal Distribution for Composite_Score

Parameters for Normal Distribution
ParameterSymbolEstimate
MeanMu81.47222
Std DevSigma20.64868
Goodness-of-Fit Tests for Normal Distribution
TestStatisticp Value
Kolmogorov-SmirnovD0.21349384Pr > D0.133
Cramer-von MisesW-Sq0.10996326Pr > W-Sq0.076
Anderson-DarlingA-Sq0.66797269Pr > A-Sq0.063
Quantiles for Normal Distribution
PercentQuantile
ObservedEstimated
1.038.666733.4362
5.038.666747.5082
10.054.500055.0099
25.067.916767.5449
50.089.500081.4722
75.0100.000095.3995
90.0100.0000107.9346
95.0100.0000115.4363
99.0100.0000129.5082

PROC UNIVARIATE: Composite_Score and Steps distribution

The UNIVARIATE Procedure

Variable: Steps_Per_Day

Moments
N12Sum Weights12
Mean7666.66667Sum Observations92000
Std Deviation3898.32909Variance15196969.7
Skewness0.34547102Kurtosis-0.6063581
Uncorrected SS872500000Corrected SS167166667
Coeff Variation50.8477707Std Error Mean1125.35067
Basic Statistical Measures
LocationVariability
Mean7666.667Std Deviation3898
Median7500.000Variance15196970
Mode.Range13000
  Interquartile Range6250
Basic Confidence Limits Assuming Normality
ParameterEstimate95% Confidence Limits
Mean7667519010144
Std Deviation389827626619
Variance15196970762619943809669
Tests for Location: Mu0=0
TestStatisticp Value
Student's tt6.812691Pr > |t|<.0001
SignM6Pr >= |M|0.0005
Signed RankS39Pr >= |S|0.0005
Quantiles (Definition 5)
LevelQuantile
100% Max15000
99%15000
95%15000
90%12000
75% Q310500
50% Median7500
25% Q14250
10%3500
5%2000
1%2000
0% Min2000
Extreme Observations
LowestHighest
ValueObsValueObs
2000890009
35002100007
400041100010
450011120001
60006150005

7. PROC FREQ for categorical distribution of Fitness_Level 

proc freq data=work.fitness_final;

  tables Fitness_Level / nocum norow nocol;

  title "Distribution of Fitness_Level (PROC FREQ)";

run;

OUTPUT:

Distribution of Fitness_Level (PROC FREQ)

The FREQ Procedure

Fitness_LevelFrequencyPercent
Average18.33
Excellent758.33
Good325.00
Poor18.33

8. PROC FORMAT for nice reporting 

proc format;

  value scorefmt

    low - <40 = 'Low (<40)'

    40 - <60 = 'Below Average (40-59)'

    60 - <80 = 'Good (60-79)'

    80 - high = 'Excellent (80+)';

run;

LOG:

NOTE: Format SCOREFMT has been output.

9. PROC RANK: rank individuals by Steps_Per_Day 

proc rank data=work.fitness_final out=work.fitness_rank ties=low descending;

  var Steps_Per_Day;

  ranks Steps_Rank;

run;


proc print data=work.fitness_rank noobs;

  var Person_ID Steps_Per_Day Steps_Rank Fitness_Level Composite_Score;

  title "Ranked by Steps_Per_Day";

run;

OUTPUT:

Ranked by Steps_Per_Day

Person_IDSteps_Per_DaySteps_RankFitness_LevelComposite_Score
P001120002Excellent100.000
P002350011Average54.500
P00380006Excellent90.667
P004400010Good67.333
P005150001Excellent100.000
P00660008Good74.000
P007100004Excellent100.000
P008200012Poor38.667
P00990005Excellent95.667
P010110003Excellent100.000
P01145009Good68.500
P01270007Excellent88.333

10. PROC CORR: check correlation between Steps, Calories, BMI, HR, Composite 

proc corr data=work.fitness_final pearson nosimple;

  var Steps_Per_Day Calories_Burned BMI Heart_Rate Composite_Score;

  title "Correlation matrix (PROC CORR)";

run;

OUTPUT:

Correlation matrix (PROC CORR)

The CORR Procedure

5 Variables:Steps_Per_Day Calories_Burned BMI Heart_Rate Composite_Score

Pearson Correlation Coefficients, N = 12
Prob > |r| under H0: Rho=0
 Steps_Per_DayCalories_BurnedBMIHeart_RateComposite_Score
Steps_Per_Day
1.00000
 
0.98446
<.0001
-0.95596
<.0001
-0.98147
<.0001
0.90224
<.0001
Calories_Burned
0.98446
<.0001
1.00000
 
-0.96049
<.0001
-0.98886
<.0001
0.91810
<.0001
BMI
-0.95596
<.0001
-0.96049
<.0001
1.00000
 
0.98401
<.0001
-0.96037
<.0001
Heart_Rate
-0.98147
<.0001
-0.98886
<.0001
0.98401
<.0001
1.00000
 
-0.94707
<.0001
Composite_Score
0.90224
<.0001
0.91810
<.0001
-0.96037
<.0001
-0.94707
<.0001
1.00000
 

11. PROC SGPLOT: scatter and series to visualize Steps vs Composite_Score 

proc sgplot data=work.fitness_final;

  scatter x=Steps_Per_Day y=Composite_Score / markerattrs=(symbol=CircleFilled);

  reg x=Steps_Per_Day y=Composite_Score / cli clm; /* regression line with CI */

  xaxis label="Steps Per Day";

  yaxis label="Composite Score";

  title "Steps vs Composite Score (Scatter + Regression)";

run;

OUTPUT:

The SGPlot Procedure


12. PROC REPORT: polished report with formatted scores 

proc report data=work.fitness_final nowd;

  columns Person_ID Measurement_Date Steps_Per_Day Calories_Burned BMI Heart_Rate

          Composite_Score Fitness_Level;

  define Measurement_Date / display format=date9. 'Measurement';

  define Composite_Score / format=8.1 'Composite';

  title "Detailed fitness report (PROC REPORT)";

run;

title;

OUTPUT:

Detailed fitness report (PROC REPORT)

Person_IDMeasurementSteps_Per_DayCalories_BurnedBMIHeart_RateCompositeFitness_Level
P00101JUL202512000320022.562100.0Excellent
P00210JUL20253500210029.88254.5Average
P00325JUN20258000250024.37290.7Excellent
P00405JUL20254000230027.17867.3Good
P00520JUN20251500034002158100.0Excellent
P00630JUN20256000240026.57574.0Good
P00701JUL202510000300023.466100.0Excellent
P00815JUL20252000190031.28838.7Poor
P00910JUL202590002800257095.7Excellent
P01005JUL20251100031002264100.0Excellent
P01110JUL20254500225028.47968.5Good
P01220JUL20257000260024.97188.3Excellent

13. Example QC: flag outliers in steps (simple rule: <2500 or >20000) 

data work.fitness_qc;

  set work.fitness_final;

  if Steps_Per_Day < 2500 or Steps_Per_Day > 20000 then Steps_Flag = 'Outlier';

  else Steps_Flag = 'OK';

run;

proc print data=work.fitness_qc;

run;

OUTPUT:

ObsBaseline_DateMeasurement_DateNext_Check_DatePerson_IDSteps_Per_DayCalories_BurnedBMIHeart_RateDuration_DaysStep_ScoreBMI_ScoreHR_ScoreCal_ScoreComposite_ScoreFitness_LevelFitness_CommentSteps_Flag
101JAN202401JUL202501OCT2025P00112000320022.56254736.0303020.0000100.000ExcellentNo major noteOK
201FEB202410JUL202510OCT2025P0023500210029.88252510.5201014.000054.500AverageNo major noteOK
315MAR202425JUN202525SEP2025P0038000250024.37246724.0302016.666790.667ExcellentNo major noteOK
401APR202405JUL202505OCT2025P0044000230027.17846012.0202015.333367.333GoodHigh BMI but good activityOK
520MAY202420JUN202520SEP2025P00515000340021.05839645.0303020.0000100.000ExcellentNo major noteOK
610JUN202430JUN202530SEP2025P0066000240026.57538518.0202016.000074.000GoodHigh BMI but good activityOK
701JUL202401JUL202501OCT2025P00710000300023.46636530.0303020.0000100.000ExcellentNo major noteOK
815JUL202415JUL202515OCT2025P0082000190031.2883656.0101012.666738.667PoorNo major noteOutlier
901AUG202410JUL202510OCT2025P0099000280025.07034327.0203018.666795.667ExcellentHigh BMI but good activityOK
1005SEP202405JUL202505OCT2025P01011000310022.06430333.0303020.0000100.000ExcellentNo major noteOK
1110OCT202410JUL202510OCT2025P0114500225028.47927313.5202015.000068.500GoodHigh BMI but good activityOK
1220NOV202420JUL202520OCT2025P0127000260024.97124221.0302017.333388.333ExcellentNo major noteOK


14. Average of  Steps_Per_Day

proc avg data=work.fitness_final;

  var Steps_Per_Day;

run;

OUTPUT:

Obs_TYPE__FREQ_Avg_Steps
10127666.67

/* Note: In practice above there is an Invalid in this code Find it,Correct it and Use it /*


YESTERDAY INVALID CODE ANSWER

9) Utility macro to list top N by a chosen metric 

%macro top_n(data=work.startups_cat, var=Growth_Rate, n=5);

  proc sort data=&data out=_top descending;

    by descending &var;

  run;


Descending has to place in by statement in PROC SORT;


  title "Top &n Startups by &var";

  proc print data=_top (obs=&n);

    var Startup_Name Industry &var Country Funding Employees Growth_Rate;

  run;

%mend top_n;


%top_n(data=work.startups_cat, var=Growth_Rate, n=5);

OUTPUT:

Top 5 Startups by Growth_Rate

ObsStartup_NameIndustryGrowth_RateCountryFundingEmployeesGrowth_Rate
1NanoHealth BioBiotech38.90Germany$25,000,00020038.90
2MediSoft LabsHealthcare IT32.10Canada$12,000,00012032.10
3BlockWave SystemsBlockchain27.00Singapore$4,600,0003527.00
4AeroScale InnovationsAerospace24.50United States$5,500,0004524.50
5CyberGuard AICybersecurity23.20Israel$6,100,0005223.20
/* Note: In practice above there is an Invalid in this code Find it,Correct it and Use it /*


To Visit My Previous Different Types Of Oils Dataset:Click Here
To Visit My Previous Different Types Of Series 2025 Dataset:Click Here
To Visit My Previous Analyzing Yoga Asanas Worldwide Dataset:Click Here
To Visit My Previous Analyzing Indian Languages Dataset:Click Here  



Follow Us On : 


 


--- FOLLOW OUR BLOG FOR MORE INFORMATION.

--->PLEASE DO COMMENTS AND SHARE OUR BLOG.




No comments:

Post a Comment