Assumptions


Research question : Retailer wants to optimize his price based on the existing competition

Hypothesis: Is there any significant relationship between Sales & other variables

Null Hypothesis: There is NO significant relationship between Sales & other variables
Alternate Hypothesis: There is significant relationship between Sales & other variables

Distribution of Variables : Histogram

  • Exploratory data analysis to understand the distribution(normal/skewed) of variables

   vars    n    mean      sd median trimmed    mad  min   max range skew kurtosis     se
X1    1 2650 9694.15 5375.79   6997 8325.35 689.41 6450 28973 22523 2.17     3.93 104.43
Insigths
  • Distribution of Sales Volume is right skewed by 2.17. Higher sales volume of camera has lower density

   vars    n     mean     sd median trimmed    mad   min   max range skew kurtosis    se
X1    1 2650 26541.64 675.58  26463 26549.7 690.89 25140 27904  2764 0.02    -0.74 13.12
Insigths
  • Distribution of Own price is normally distributed. Prices of camera is symmetric

   vars    n     mean     sd median trimmed    mad     min   max  range  skew kurtosis    se
X1    1 2650 32209.15 704.84  32369 32376.9 220.91 28126.5 32609 4482.5 -3.76    14.29 13.69
Insigths
  • Distribution of Comp1 price is left skewed by -3.76. Lower price of camera has lower density

   vars    n     mean   sd  median  trimmed   mad   min   max range skew kurtosis   se
X1    1 2650 32781.58 8.45 32780.5 32781.36 11.12 32750 32805    55 0.17    -0.28 0.16
Insigths
  • Distribution of Comp2 price is normally disributes. Comp2 Prices of camera is symmetric

Distribution of Variables(Transformation) : Histogram

   vars    n    mean      sd median trimmed    mad  min   max range skew kurtosis    se
X1    1 2650 8065.11 1823.71   6997 7802.11 689.41 6450 12228  5778 0.87     -0.7 35.43
Insigths
  • Distribution of Sales Volume volume is normally disributed. Transformation successful.

   vars    n     mean     sd median  trimmed    mad   min   max range skew kurtosis   se
X1    1 2650 32382.42 148.77  32369 32385.01 220.91 32009 32609   600 -0.1    -1.32 2.89
Insigths
  • Distribution of Comp1 price is normally disributed. Transformation successful.

Relationship between Variables : Scatterplot

Insigths
  • Sales volume & Own price are weekly negatively correlated

Insigths
  • Sales volume & Comp1 price are fairly positively correlated

Insigths
  • Sales volume & Comp2 price are weekly negatively correlated

Relationship between Variables : Correlation Analysis

                      sales  own_price comp1_price comp2_price    sal_std comp1_price_std
sales            1.00000000 -0.3509908   0.1109078  -0.2072594  0.6101745     -0.02732503
own_price       -0.35099084  1.0000000   0.1895046   0.6158865 -0.1356289      0.54362935
comp1_price      0.11090783  0.1895046   1.0000000   0.1350718  0.2066278      0.49750120
comp2_price     -0.20725945  0.6158865   0.1350718   1.0000000 -0.1057077      0.34547193
sal_std          0.61017451 -0.1356289   0.2066278  -0.1057077  1.0000000      0.39029220
comp1_price_std -0.02732503  0.5436293   0.4975012   0.3454719  0.3902922      1.00000000

Linear Regression

Stratified Random Sampling

Elasticity Model

Call:
lm(formula = log(sal_std) ~ log(own_price) + log(comp1_price_std) + 
    log(comp2_price), data = Terra_Blue_XT_Aggr)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.23248 -0.13791 -0.05592  0.13321  0.62873 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)          146.7774   171.8137   0.854   0.3930    
log(own_price)        -3.8358     0.1883 -20.369   <2e-16 ***
log(comp1_price_std)  30.3929     0.8760  34.696   <2e-16 ***
log(comp2_price)     -39.8529    16.6185  -2.398   0.0165 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1737 on 2646 degrees of freedom
Multiple R-squared:  0.3253,    Adjusted R-squared:  0.3245 
F-statistic: 425.3 on 3 and 2646 DF,  p-value: < 2.2e-16


Confidence Intervals
                       2.5 %      97.5 %
(Intercept)      -397.796771 1077.619866
log(own_price)     -6.081026   -4.623187
log(comp1_price)    3.132422    4.423571
log(comp2_price) -101.742746   41.049729
Insights
  • Since p<0.05, we reject Null Hypothesis & conclude that there is a significant relationship between Sales volume, Own price, Comp1 price and Comp2 price

  • Own Price, Comp1 price & Comp2 price has significant evidence in estimating sales volume.
  • ~32% of variation is explained by the model & has significant evidence in explaining it


LS0tDQp0aXRsZTogIlByaWNlIEVsYXN0aWNpdHkgTW9kZWwiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyMgKipBc3N1bXB0aW9ucyoqDQoqIEFzc3VtZSBhIHJldGFpbGVyIGlzIHNrZXB0aWNhbCBhYm91dCBwcmljaW5nIGhpcyBwcm9kdWN0IGR1ZSB0byBoZWF2eSB0cmFmZmljICYgY29tcGV0aXRpb24gZXhpc3RzIGluIHRoZSBtYXJrZXQNCiogUmV0YWlsZXIgZXhwZWN0cyB0aGUgRGF0YS1TY2llbnRpc3QgdG8gZW5saXN0IHJlY29tbWVuZGF0aW9ucyhvcHRpbXVtIHByaWNlKSB0byBwcmljZSBoaXMgcHJvZHVjdHMuIExldHMgc2F5ICJEU0xSLUNhbWVyYSINCiogTGV0cyBjb25zaWRlciB0aGUgdW4tbmFtZWQgY29sdW1ucyBhcyAiU2FsZXMgdW5pdHMiLCJPd24gUHJpY2UiLCJDb21wZXRpdG9yLTEgcHJpY2UiLCJDb21wZXRpdG9yLTIgcHJpY2UiDQoqIERlcGVuZGVudCB2YXJpYWJsZSBhcyAiU2FsZXMiIGFuZCBJbmRlcGVuZGVudCB2YXJpYWJsZXMgYXMgIk93biBQcmljZSIsIkNvbXBldGl0b3ItMSBwcmljZSIsIkNvbXBldGl0b3ItMiBwcmljZSINCg0KLS0tDQoNCiMjIyAqKlJlc2VhcmNoIHF1ZXN0aW9uIDogUmV0YWlsZXIgd2FudHMgdG8gb3B0aW1pemUgaGlzIHByaWNlIGJhc2VkIG9uIHRoZSBleGlzdGluZyBjb21wZXRpdGlvbioqDQoNCiMjIyMgKipIeXBvdGhlc2lzOiBJcyB0aGVyZSBhbnkgc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwIGJldHdlZW4gU2FsZXMgJiBvdGhlciB2YXJpYWJsZXMqKg0KIyMjIyMgCU51bGwgSHlwb3RoZXNpczogVGhlcmUgaXMgTk8gc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwIGJldHdlZW4gU2FsZXMgJiBvdGhlciB2YXJpYWJsZXMNCiMjIyMjIAlBbHRlcm5hdGUgSHlwb3RoZXNpczogVGhlcmUgaXMgc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwIGJldHdlZW4gU2FsZXMgJiBvdGhlciB2YXJpYWJsZXMNCg0KYGBge3IsZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkobHVicmlkYXRlKQ0KIyBUZXJyYV9CbHVlX1hUX0lucHV0IDwtIA0KIyAgIHJlYWQudGFibGUoIkg6L1lhc2h3YW50aC9MZWFybmluZ3MvVGVycmEgQmx1ZSBYVC9vcGVuc2lnbmFsc18wMDA3ODA1ODlCQjNfMjAxNi0wNC0wMl8yMi0yMS0yNC50eHQiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIlx0IiwgaGVhZGVyID0gRkFMU0UpDQpUZXJyYV9CbHVlX1hUIDwtIFRlcnJhX0JsdWVfWFRfSW5wdXQNClRlcnJhX0JsdWVfWFQkVjEgPC0gTlVMTA0KVGVycmFfQmx1ZV9YVCRWMiA8LSBOVUxMDQpUZXJyYV9CbHVlX1hUJFY3IDwtIE5VTEwNCm5hbWVzKFRlcnJhX0JsdWVfWFQpIDwtIGMoInNhbGVzIiwiY29tcDFfcHJpY2UiLCJvd25fcHJpY2UiLCJjb21wMl9wcmljZSIpDQpzZXQuc2VlZCg0NTY3KQ0KVGVycmFfQmx1ZV9YVCREYXRlIDwtIChhcy5EYXRlKCIyMDE0LTEyLTMxIikgKyBzb3J0KHNhbXBsZSgxOjM2NSwgbnJvdyhUZXJyYV9CbHVlX1hUKSxyZXBsYWNlID0gVFJVRSkpKQ0KVGVycmFfQmx1ZV9YVCRXZWVrX251bSA8LSBmYWN0b3Iod2VlayhUZXJyYV9CbHVlX1hUJERhdGUpKQ0KVGVycmFfQmx1ZV9YVCRJdGVtX25vIDwtIGZhY3RvcihzYW1wbGUoMTo1MCwgbnJvdyhUZXJyYV9CbHVlX1hUKSwgcmVwbGFjZSA9IFRSVUUpKQ0KVGVycmFfQmx1ZV9YVCA8LSBUZXJyYV9CbHVlX1hUWyxjKCJEYXRlIiwiV2Vla19udW0iLCJJdGVtX25vIiwic2FsZXMiLCJvd25fcHJpY2UiLCJjb21wMV9wcmljZSIsImNvbXAyX3ByaWNlIildDQoNCiMgQWdncmVnYXRlIGRhdGEgb24gV2Vla2x5IGxldmVsDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpUZXJyYV9CbHVlX1hUIDwtIGRhdGEudGFibGUoVGVycmFfQmx1ZV9YVCkNClRlcnJhX0JsdWVfWFRfQWdnciA8LSBUZXJyYV9CbHVlX1hUWywuKHNhbGVzPW1lZGlhbihzYWxlcykpLCBieT0uKFdlZWtfbnVtLEl0ZW1fbm8pXQ0KVGVycmFfQmx1ZV9YVF9BZ2dyIDwtIGNiaW5kKHNhbGVzPVRlcnJhX0JsdWVfWFRfQWdnciRzYWxlcyxUZXJyYV9CbHVlX1hUWyxsYXBwbHkoLlNELG1lZGlhbiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnk9LihXZWVrX251bSxJdGVtX25vKSwgLlNEY29scyA9IGMoIm93bl9wcmljZSIsImNvbXAxX3ByaWNlIiwiY29tcDJfcHJpY2UiKV0pDQpUZXJyYV9CbHVlX1hUX0FnZ3IgPC0gVGVycmFfQmx1ZV9YVF9BZ2dyWyxjKCJXZWVrX251bSIsIkl0ZW1fbm8iLCJzYWxlcyIsIm93bl9wcmljZSIsImNvbXAxX3ByaWNlIiwiY29tcDJfcHJpY2UiKV0NClRlcnJhX0JsdWVfWFRfQWdnciA8LSBUZXJyYV9CbHVlX1hUX0FnZ3Jbb3JkZXIoVGVycmFfQmx1ZV9YVF9BZ2dyJFdlZWtfbnVtLFRlcnJhX0JsdWVfWFRfQWdnciRJdGVtX25vKSxdDQpUZXJyYV9CbHVlX1hUX0FnZ3IgPC0gZGF0YS5mcmFtZShUZXJyYV9CbHVlX1hUX0FnZ3IpDQpUZXJyYV9CbHVlX1hUX0FnZ3Ikcm93X2lkIDwtIHJvdy5uYW1lcyhUZXJyYV9CbHVlX1hUX0FnZ3IpDQpgYGANCg0KLS0tDQoNCiMjIyMgKipEaXN0cmlidXRpb24gb2YgVmFyaWFibGVzIDogSGlzdG9ncmFtKioNCiogRXhwbG9yYXRvcnkgZGF0YSBhbmFseXNpcyB0byB1bmRlcnN0YW5kIHRoZSBkaXN0cmlidXRpb24obm9ybWFsL3NrZXdlZCkgb2YgdmFyaWFibGVzDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KYXR0YWNoKFRlcnJhX0JsdWVfWFRfQWdncikNCmdncGxvdChUZXJyYV9CbHVlX1hUX0FnZ3IsYWVzKHg9c2FsZXMpKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSxjb2wgPSAiYmx1ZTIiLGJpbnMgPSA0MCkgKw0KICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLGFyZ3MgPSBsaXN0KG1lYW49bWVhbihzYWxlcyksc2Q9c2Qoc2FsZXMpKSxjb2xvdXIgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBTYWxlcyBWb2x1bWUiLCB4ID0gInNhbGVzIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmRldGFjaChUZXJyYV9CbHVlX1hUX0FnZ3IpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KbGlicmFyeShwc3ljaCkNCnByaW50KGRlc2NyaWJlKFRlcnJhX0JsdWVfWFRfQWdnciRzYWxlcykpDQpgYGANCg0KDQojIyMjIyAqKkluc2lndGhzKioNCiogRGlzdHJpYnV0aW9uIG9mIFNhbGVzIFZvbHVtZSBpcyByaWdodCBza2V3ZWQgYnkgMi4xNy4gSGlnaGVyIHNhbGVzIHZvbHVtZSBvZiBjYW1lcmEgaGFzIGxvd2VyIGRlbnNpdHkNCg0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KYXR0YWNoKFRlcnJhX0JsdWVfWFRfQWdncikNCmdncGxvdChUZXJyYV9CbHVlX1hUX0FnZ3IsYWVzKHg9b3duX3ByaWNlKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksY29sID0gImJsdWUyIixiaW5zID0gNDApICsNCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSxhcmdzID0gbGlzdChtZWFuPW1lYW4ob3duX3ByaWNlKSxzZD1zZChvd25fcHJpY2UpKSxjb2xvdXIgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBPd24gUHJpY2UiLCB4ID0gIk93biBQcmljZSIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpkZXRhY2goVGVycmFfQmx1ZV9YVF9BZ2dyKQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KbGlicmFyeShwc3ljaCkNCnByaW50KGRlc2NyaWJlKFRlcnJhX0JsdWVfWFRfQWdnciRvd25fcHJpY2UpKQ0KYGBgDQoNCiMjIyMjICoqSW5zaWd0aHMqKg0KKiBEaXN0cmlidXRpb24gb2YgT3duIHByaWNlIGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLiBQcmljZXMgb2YgY2FtZXJhIGlzIHN5bW1ldHJpYw0KDQotLS0NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQphdHRhY2goVGVycmFfQmx1ZV9YVF9BZ2dyKQ0KZ2dwbG90KFRlcnJhX0JsdWVfWFRfQWdncixhZXMoeD1jb21wMV9wcmljZSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9Li5kZW5zaXR5Li4pLGNvbCA9ICJibHVlMiIsYmlucyA9IDQwKSArDQogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sYXJncyA9IGxpc3QobWVhbj1tZWFuKGNvbXAxX3ByaWNlKSxzZD1zZChjb21wMV9wcmljZSkpLGNvbG91ciA9ICJyZWQiKSArDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIENvbXAxIFByaWNlIiwgeCA9ICJDb21wMSBQcmljZSIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpkZXRhY2goVGVycmFfQmx1ZV9YVF9BZ2dyKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmxpYnJhcnkocHN5Y2gpDQpwcmludChkZXNjcmliZShUZXJyYV9CbHVlX1hUX0FnZ3IkY29tcDFfcHJpY2UpKQ0KYGBgDQoNCiMjIyMjICoqSW5zaWd0aHMqKg0KKiBEaXN0cmlidXRpb24gb2YgQ29tcDEgcHJpY2UgaXMgbGVmdCBza2V3ZWQgYnkgLTMuNzYuIExvd2VyIHByaWNlIG9mIGNhbWVyYSBoYXMgbG93ZXIgZGVuc2l0eQ0KDQotLS0NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQphdHRhY2goVGVycmFfQmx1ZV9YVF9BZ2dyKQ0KZ2dwbG90KFRlcnJhX0JsdWVfWFRfQWdncixhZXMoeD1jb21wMl9wcmljZSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9Li5kZW5zaXR5Li4pLGNvbCA9ICJibHVlMiIsYmlucyA9IDQwKSArDQogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sYXJncyA9IGxpc3QobWVhbj1tZWFuKGNvbXAyX3ByaWNlKSxzZD1zZChjb21wMl9wcmljZSkpLGNvbG91ciA9ICJyZWQiKSArDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIENvbXAyIFByaWNlIiwgeCA9ICJDb21wMiBQcmljZSIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpkZXRhY2goVGVycmFfQmx1ZV9YVF9BZ2dyKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmxpYnJhcnkocHN5Y2gpDQpwcmludChkZXNjcmliZShUZXJyYV9CbHVlX1hUX0FnZ3IkY29tcDJfcHJpY2UpKQ0KYGBgDQoNCiMjIyMjICoqSW5zaWd0aHMqKg0KKiBEaXN0cmlidXRpb24gb2YgQ29tcDIgcHJpY2UgaXMgbm9ybWFsbHkgZGlzcmlidXRlcy4gQ29tcDIgUHJpY2VzIG9mIGNhbWVyYSBpcyBzeW1tZXRyaWMNCg0KLS0tDQoNCg0KIyMjIyAqKkRpc3RyaWJ1dGlvbiBvZiBWYXJpYWJsZXMoVHJhbnNmb3JtYXRpb24pIDogSGlzdG9ncmFtKioNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KVGVycmFfQmx1ZV9YVF9BZ2dyJHNhbF9zdGQgPC0gY2VpbGluZyhpZmVsc2UoVGVycmFfQmx1ZV9YVF9BZ2dyJHNhbGVzPigzKklRUihUZXJyYV9CbHVlX1hUX0FnZ3Ikc2FsZXMpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuKFRlcnJhX0JsdWVfWFRfQWdnciRzYWxlcyksVGVycmFfQmx1ZV9YVF9BZ2dyJHNhbGVzKSkNCmF0dGFjaChUZXJyYV9CbHVlX1hUX0FnZ3IpDQpnZ3Bsb3QoVGVycmFfQmx1ZV9YVF9BZ2dyLGFlcyh4PXNhbF9zdGQpKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSxjb2wgPSAiYmx1ZTIiLGJpbnMgPSA2MCkgKw0KICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLGFyZ3MgPSBsaXN0KG1lYW49bWVhbihzYWxfc3RkKSxzZD1zZChzYWxfc3RkKSksY29sb3VyID0gInJlZCIpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgU2FsZXMgVm9sdW1lIiwgeCA9ICJzYWxlcyIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpkZXRhY2goVGVycmFfQmx1ZV9YVF9BZ2dyKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCnByaW50KGRlc2NyaWJlKFRlcnJhX0JsdWVfWFRfQWdnciRzYWxfc3RkKSkNCmBgYA0KDQojIyMjIyAqKkluc2lndGhzKioNCiogRGlzdHJpYnV0aW9uIG9mIFNhbGVzIFZvbHVtZSB2b2x1bWUgaXMgbm9ybWFsbHkgZGlzcmlidXRlZC4gVHJhbnNmb3JtYXRpb24gc3VjY2Vzc2Z1bC4NCg0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KVGVycmFfQmx1ZV9YVF9BZ2dyJGNvbXAxX3ByaWNlX3N0ZCA8LSBpZmVsc2UoVGVycmFfQmx1ZV9YVF9BZ2dyJGNvbXAxX3ByaWNlPGFzLm51bWVyaWMocGFzdGUwKHF1YW50aWxlKFRlcnJhX0JsdWVfWFRfQWdnciRjb21wMV9wcmljZSlbMl0pKS0yMjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbihUZXJyYV9CbHVlX1hUX0FnZ3IkY29tcDFfcHJpY2UpLFRlcnJhX0JsdWVfWFRfQWdnciRjb21wMV9wcmljZSkNCmF0dGFjaChUZXJyYV9CbHVlX1hUX0FnZ3IpDQpnZ3Bsb3QoVGVycmFfQmx1ZV9YVF9BZ2dyLGFlcyh4PWNvbXAxX3ByaWNlX3N0ZCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9Li5kZW5zaXR5Li4pLGNvbCA9ICJibHVlMiIsYmlucyA9IDYwKSArDQogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sYXJncyA9IGxpc3QobWVhbj1tZWFuKGNvbXAxX3ByaWNlX3N0ZCksc2Q9c2QoY29tcDFfcHJpY2Vfc3RkKSksY29sb3VyID0gInJlZCIpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgQ29tcDEgcHJpY2UiLCB4ID0gIkNvbXAxIHByaWNlIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmRldGFjaChUZXJyYV9CbHVlX1hUX0FnZ3IpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KcHJpbnQoZGVzY3JpYmUoVGVycmFfQmx1ZV9YVF9BZ2dyJGNvbXAxX3ByaWNlX3N0ZCkpDQpgYGANCiMjIyMjICoqSW5zaWd0aHMqKg0KKiBEaXN0cmlidXRpb24gb2YgQ29tcDEgcHJpY2UgaXMgbm9ybWFsbHkgZGlzcmlidXRlZC4gVHJhbnNmb3JtYXRpb24gc3VjY2Vzc2Z1bC4NCg0KLS0tDQoNCiMjIyMgKipSZWxhdGlvbnNoaXAgYmV0d2VlbiBWYXJpYWJsZXMgOiBTY2F0dGVycGxvdCoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmF0dGFjaChUZXJyYV9CbHVlX1hUX0FnZ3IpDQpnZ3Bsb3QoVGVycmFfQmx1ZV9YVF9BZ2dyLCBhZXMoc2NhbGUob3duX3ByaWNlKSxzY2FsZShzYWxfc3RkKSkpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9hYmxpbmUoY29sb3IgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlPSJSZWxhdGlvbnNoaXAgYmV0d2VlbiBTYWxlcyAmIE93biBQcmljZSIsIA0KICAgICAgIHggPSAiT3duIFByaWNlIiwgeSA9ICJTYWxlcyIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpkZXRhY2goVGVycmFfQmx1ZV9YVF9BZ2dyKQ0KYGBgDQoNCiMjIyMjICoqSW5zaWd0aHMqKg0KKiBTYWxlcyB2b2x1bWUgJiBPd24gcHJpY2UgYXJlIHdlZWtseSBuZWdhdGl2ZWx5IGNvcnJlbGF0ZWQNCg0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmF0dGFjaChUZXJyYV9CbHVlX1hUX0FnZ3IpDQpnZ3Bsb3QoVGVycmFfQmx1ZV9YVF9BZ2dyLCBhZXMoc2NhbGUoY29tcDFfcHJpY2Vfc3RkKSxzY2FsZShzYWxfc3RkKSkpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9hYmxpbmUoY29sb3IgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlPSJSZWxhdGlvbnNoaXAgYmV0d2VlbiBTYWxlcyAmIENvbXAxIFByaWNlIiwgDQogICAgICAgeCA9ICJDb21wMSBQcmljZSIsIHkgPSAiU2FsZXMiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KZGV0YWNoKFRlcnJhX0JsdWVfWFRfQWdncikNCmBgYA0KIyMjIyMgKipJbnNpZ3RocyoqDQoqIFNhbGVzIHZvbHVtZSAmIENvbXAxIHByaWNlIGFyZSBmYWlybHkgcG9zaXRpdmVseSBjb3JyZWxhdGVkDQoNCi0tLQ0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZ3M9RkFMU0V9DQphdHRhY2goVGVycmFfQmx1ZV9YVF9BZ2dyKQ0KZ2dwbG90KFRlcnJhX0JsdWVfWFRfQWdnciwgYWVzKHNjYWxlKGNvbXAyX3ByaWNlKSxzY2FsZShzYWxfc3RkKSkpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9hYmxpbmUoY29sb3IgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlPSJSZWxhdGlvbnNoaXAgYmV0d2VlbiBTYWxlcyAmIGNvbXAyX3ByaWNlIiwgDQogICAgICAgeCA9ICJDb21wMiBQcmljZSIsIHkgPSAiU2FsZXMiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KZGV0YWNoKFRlcnJhX0JsdWVfWFRfQWdncikNCmBgYA0KIyMjIyMgKipJbnNpZ3RocyoqDQoqIFNhbGVzIHZvbHVtZSAmIENvbXAyIHByaWNlIGFyZSB3ZWVrbHkgbmVnYXRpdmVseSBjb3JyZWxhdGVkDQoNCi0tLQ0KDQojIyMjICoqUmVsYXRpb25zaGlwIGJldHdlZW4gVmFyaWFibGVzIDogQ29ycmVsYXRpb24gQW5hbHlzaXMqKiANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KY29yKFRlcnJhX0JsdWVfWFRfQWdncltzYXBwbHkoVGVycmFfQmx1ZV9YVF9BZ2dyLGlzLm51bWVyaWMpXSkNCmBgYA0KDQotLS0NCg0KIyMjIyAqKkxpbmVhciBSZWdyZXNzaW9uKioNCiMjIyMjICoqU3RyYXRpZmllZCBSYW5kb20gU2FtcGxpbmcqKg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZ3M9RkFMU0V9DQpsaWJyYXJ5KHNhbXBsaW5nKQ0KVGVycmFfQmx1ZV9YVF9BZ2dyX0ZUIDwtIGRhdGEuZnJhbWUodGFibGUoVGVycmFfQmx1ZV9YVF9BZ2dyJFdlZWtfbnVtKSkNClRlcnJhX0JsdWVfWFRfQWdncl9GVCRQZXIgPC0gKFRlcnJhX0JsdWVfWFRfQWdncl9GVCRGcmVxL3N1bShUZXJyYV9CbHVlX1hUX0FnZ3JfRlQkRnJlcSkpKjEwMA0KbmFtZXMoVGVycmFfQmx1ZV9YVF9BZ2dyX0ZUKVsxXSA8LSAiV2Vla19udW0iDQoNCiMgQ29uc2lkZXIgNzAlIG9mIHRoZSBkYXRhIGFzIHNhbXBsZQ0KVGVycmFfQmx1ZV9YVF9BZ2dyX0ZUJFN0cmF0YV9TaXplIDwtIGNlaWxpbmcoKFRlcnJhX0JsdWVfWFRfQWdncl9GVCRGcmVxKihjZWlsaW5nKChkaW0oVGVycmFfQmx1ZV9YVF9BZ2dyKVsxXS8xMDApKjcwKS9zdW0oVGVycmFfQmx1ZV9YVF9BZ2dyX0ZUJEZyZXEpKSkpDQpUZXJyYV9CbHVlX1hUX0FnZ3JfRlQgPC0gd2l0aChUZXJyYV9CbHVlX1hUX0FnZ3JfRlQsVGVycmFfQmx1ZV9YVF9BZ2dyX0ZUW29yZGVyKFN0cmF0YV9TaXplLGRlY3JlYXNpbmcgPSBUUlVFKSxdKQ0KDQojIFN0cmF0aWZpY2F0aW9uDQpUZXJyYV9CbHVlX1hUX0FnZ3JfU3RyYXRhIDwtIHN0cmF0YShUZXJyYV9CbHVlX1hUX0FnZ3IsYygiV2Vla19udW0iKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBUZXJyYV9CbHVlX1hUX0FnZ3JfRlQkU3RyYXRhX1NpemUsIG1ldGhvZCA9ICJzcnN3b3IiKQ0KVGVycmFfQmx1ZV9YVF9BZ2dyX1N0UlMgPC0gZ2V0ZGF0YShUZXJyYV9CbHVlX1hUX0FnZ3IsVGVycmFfQmx1ZV9YVF9BZ2dyX1N0cmF0YSkNCmhlYWQoVGVycmFfQmx1ZV9YVF9BZ2dyX1N0UlMpDQoNCiMgVGVzdGluZyBkYXRhDQpsaWJyYXJ5KHNxbGRmKQ0KVGVycmFfQmx1ZV9YVF9BZ2dyX1Rlc3QgPC0gc3FsZGYoInNlbGVjdCBhLiogZnJvbSBUZXJyYV9CbHVlX1hUX0FnZ3IgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIFRlcnJhX0JsdWVfWFRfQWdncl9TdFJTIGIgb24gYS5yb3dfaWQ9Yi5yb3dfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGIucm93X2lkIGlzIE5VTEwiKQ0KVGVycmFfQmx1ZV9YVF9BZ2dyX1Rlc3Qkcm93X2lkIDwtIE5VTEwNCmBgYA0KDQotLS0NCg0KIyMjIyMgKipFbGFzdGljaXR5IE1vZGVsKiogDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCiMgTGluZWFyIE1vZGVsDQpzdW1tYXJ5KGxtKGxvZyhzYWxfc3RkKSB+IGxvZyhvd25fcHJpY2UpK2xvZyhjb21wMV9wcmljZV9zdGQpK2xvZyhjb21wMl9wcmljZSksIGRhdGEgPSBUZXJyYV9CbHVlX1hUX0FnZ3IpKQ0KcGFyKG1mcm93ID0gYygyLDIpKQ0KcGxvdChsbShsb2coc2FsZXMpIH4gbG9nKG93bl9wcmljZSkrbG9nKGNvbXAxX3ByaWNlKStsb2coY29tcDJfcHJpY2UpLCBkYXRhID0gVGVycmFfQmx1ZV9YVF9BZ2dyKSkNCmBgYA0KDQotLS0NCg0KIyMjIyMjICoqQ29uZmlkZW5jZSBJbnRlcnZhbHMqKiANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpjb25maW50KGxtKGxvZyhzYWxlcykgfiBsb2cob3duX3ByaWNlKStsb2coY29tcDFfcHJpY2UpK2xvZyhjb21wMl9wcmljZSksIGRhdGEgPSBUZXJyYV9CbHVlX1hUX0FnZ3IpKQ0KYGBgDQoNCiMjIyMjICoqSW5zaWdodHMqKg0KKiBTaW5jZSBwPDAuMDUsIHdlIHJlamVjdCBOdWxsIEh5cG90aGVzaXMgJiBjb25jbHVkZSB0aGF0IHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwIGJldHdlZW4gU2FsZXMgdm9sdW1lLCBPd24gcHJpY2UsIENvbXAxIHByaWNlIGFuZCBDb21wMiBwcmljZQ0KDQoqIE93biBQcmljZSwgQ29tcDEgcHJpY2UgJiBDb21wMiBwcmljZSBoYXMgc2lnbmlmaWNhbnQgZXZpZGVuY2UgaW4gZXN0aW1hdGluZyBzYWxlcyB2b2x1bWUuDQoqIH4zMiUgb2YgdmFyaWF0aW9uIGlzIGV4cGxhaW5lZCBieSB0aGUgbW9kZWwgJiBoYXMgc2lnbmlmaWNhbnQgZXZpZGVuY2UgaW4gZXhwbGFpbmluZyBpdA0KDQotLS0NCg==