NASAL

N_RETROPOSITION_MM

tree<-rpart::rpart(N_POSITION~N_RETROPOSITION_MM
                   
                   
                   ,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
           extra=101, box.palette="GnBu",
           branch.lty=3, shadow.col="gray", nn=TRUE
        )

rpart.rules(tree)
preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$N_POSITION))
Confusion Matrix and Statistics

          Reference
Prediction CA CP  S
        CA  6  1  0
        CP  4 46  0
        S   0  0  6

Overall Statistics
                                          
               Accuracy : 0.9206          
                 95% CI : (0.8244, 0.9737)
    No Information Rate : 0.746           
    P-Value [Acc > NIR] : 0.0004041       
                                          
                  Kappa : 0.7918          
                                          
 Mcnemar's Test P-Value : NA              

Statistics by Class:

                     Class: CA Class: CP Class: S
Sensitivity            0.60000    0.9787  1.00000
Specificity            0.98113    0.7500  1.00000
Pos Pred Value         0.85714    0.9200  1.00000
Neg Pred Value         0.92857    0.9231  1.00000
Prevalence             0.15873    0.7460  0.09524
Detection Rate         0.09524    0.7302  0.09524
Detection Prevalence   0.11111    0.7937  0.09524
Balanced Accuracy      0.79057    0.8644  1.00000
cbind(id=1:nrow(retropostion_data),retropostion_data,N_POSITION_PREDICTED=as.character(preds)) %>% as.data.frame() %>% filter(N_POSITION!=N_POSITION_PREDICTED) %>% select(NAME,N_POSITION,N_POSITION_PREDICTED)
NA
NA

N_RETROPOSITION_MM + N_RETROIRIDIAN SPACE [mm]

tree<-rpart::rpart(N_POSITION~N_RETROPOSITION_MM+`N_RETROIRIDIAN SPACE [mm]`,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
           extra=101, box.palette="GnBu",
           branch.lty=3, shadow.col="gray", nn=TRUE
        )

rpart.rules(tree)

preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$N_POSITION))
Confusion Matrix and Statistics

          Reference
Prediction CA CP  S
        CA  7  2  0
        CP  3 45  0
        S   0  0  6

Overall Statistics
                                          
               Accuracy : 0.9206          
                 95% CI : (0.8244, 0.9737)
    No Information Rate : 0.746           
    P-Value [Acc > NIR] : 0.0004041       
                                          
                  Kappa : 0.8015          
                                          
 Mcnemar's Test P-Value : NA              

Statistics by Class:

                     Class: CA Class: CP Class: S
Sensitivity             0.7000    0.9574  1.00000
Specificity             0.9623    0.8125  1.00000
Pos Pred Value          0.7778    0.9375  1.00000
Neg Pred Value          0.9444    0.8667  1.00000
Prevalence              0.1587    0.7460  0.09524
Detection Rate          0.1111    0.7143  0.09524
Detection Prevalence    0.1429    0.7619  0.09524
Balanced Accuracy       0.8311    0.8850  1.00000

N_RETROPOSITION_MM + N_HEIGHT_IOL

tree<-rpart::rpart(N_POSITION~N_RETROPOSITION_MM+N_HEIGHT_IOL,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
           extra=101, box.palette="GnBu",
           branch.lty=3, shadow.col="gray", nn=TRUE
        )

rpart.rules(tree)

preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$N_POSITION))
Confusion Matrix and Statistics

          Reference
Prediction CA CP  S
        CA  8  2  0
        CP  2 45  0
        S   0  0  6

Overall Statistics
                                          
               Accuracy : 0.9365          
                 95% CI : (0.8453, 0.9824)
    No Information Rate : 0.746           
    P-Value [Acc > NIR] : 9.454e-05       
                                          
                  Kappa : 0.8448          
                                          
 Mcnemar's Test P-Value : NA              

Statistics by Class:

                     Class: CA Class: CP Class: S
Sensitivity             0.8000    0.9574  1.00000
Specificity             0.9623    0.8750  1.00000
Pos Pred Value          0.8000    0.9574  1.00000
Neg Pred Value          0.9623    0.8750  1.00000
Prevalence              0.1587    0.7460  0.09524
Detection Rate          0.1270    0.7143  0.09524
Detection Prevalence    0.1587    0.7460  0.09524
Balanced Accuracy       0.8811    0.9162  1.00000

N_RETROPOSITION_MM + N_HEIGHT_IOL + N_RETROIRIDIAN SPACE [mm]

tree<-rpart::rpart(N_POSITION~N_RETROPOSITION_MM+N_HEIGHT_IOL,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
           extra=101, box.palette="GnBu",
           branch.lty=3, shadow.col="gray", nn=TRUE
        )
rpart.rules(tree)

preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$N_POSITION))

TEMPORAL

T_RETROPOSITION_MM

tree<-rpart::rpart(T_POSITION~T_RETROPOSITION_MM,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
           extra=101, box.palette="GnBu",
           branch.lty=3, shadow.col="gray", nn=TRUE
        )

rpart.rules(tree)

preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$T_POSITION))
Confusion Matrix and Statistics

          Reference
Prediction CA CP  S
        CA  2  1  0
        CP  2 48  1
        S   2  0  7

Overall Statistics
                                          
               Accuracy : 0.9048          
                 95% CI : (0.8041, 0.9642)
    No Information Rate : 0.7778          
    P-Value [Acc > NIR] : 0.007371        
                                          
                  Kappa : 0.7261          
                                          
 Mcnemar's Test P-Value : 0.343030        

Statistics by Class:

                     Class: CA Class: CP Class: S
Sensitivity            0.33333    0.9796   0.8750
Specificity            0.98246    0.7857   0.9636
Pos Pred Value         0.66667    0.9412   0.7778
Neg Pred Value         0.93333    0.9167   0.9815
Prevalence             0.09524    0.7778   0.1270
Detection Rate         0.03175    0.7619   0.1111
Detection Prevalence   0.04762    0.8095   0.1429
Balanced Accuracy      0.65789    0.8827   0.9193
cbind(id=1:nrow(retropostion_data),retropostion_data,T_POSITION_PREDICTED=as.character(preds)) %>% as.data.frame() %>% filter(T_POSITION!=T_POSITION_PREDICTED) %>% select(NAME,T_POSITION,T_POSITION_PREDICTED)

T_RETROPOSITION_MM + T_RETROIRIDIAN SPACE [mm]

tree<-rpart::rpart(T_POSITION~T_RETROPOSITION_MM +`T_RETROIRIDIAN SPACE  [mm]`,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
           extra=101, box.palette="GnBu",
           branch.lty=3, shadow.col="gray", nn=TRUE
        )

rpart.rules(tree)

preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$T_POSITION))
Confusion Matrix and Statistics

          Reference
Prediction CA CP  S
        CA  2  1  0
        CP  2 48  1
        S   2  0  7

Overall Statistics
                                          
               Accuracy : 0.9048          
                 95% CI : (0.8041, 0.9642)
    No Information Rate : 0.7778          
    P-Value [Acc > NIR] : 0.007371        
                                          
                  Kappa : 0.7261          
                                          
 Mcnemar's Test P-Value : 0.343030        

Statistics by Class:

                     Class: CA Class: CP Class: S
Sensitivity            0.33333    0.9796   0.8750
Specificity            0.98246    0.7857   0.9636
Pos Pred Value         0.66667    0.9412   0.7778
Neg Pred Value         0.93333    0.9167   0.9815
Prevalence             0.09524    0.7778   0.1270
Detection Rate         0.03175    0.7619   0.1111
Detection Prevalence   0.04762    0.8095   0.1429
Balanced Accuracy      0.65789    0.8827   0.9193

T_RETROPOSITION_MM + T_HEIGHT_IOL

tree<-rpart::rpart(T_POSITION~T_RETROPOSITION_MM+T_HEIGHT_IOL,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
           extra=101, box.palette="GnBu",
           branch.lty=3, shadow.col="gray", nn=TRUE
        )

rpart.rules(tree)

preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$T_POSITION))
Confusion Matrix and Statistics

          Reference
Prediction CA CP  S
        CA  2  1  0
        CP  2 48  1
        S   2  0  7

Overall Statistics
                                          
               Accuracy : 0.9048          
                 95% CI : (0.8041, 0.9642)
    No Information Rate : 0.7778          
    P-Value [Acc > NIR] : 0.007371        
                                          
                  Kappa : 0.7261          
                                          
 Mcnemar's Test P-Value : 0.343030        

Statistics by Class:

                     Class: CA Class: CP Class: S
Sensitivity            0.33333    0.9796   0.8750
Specificity            0.98246    0.7857   0.9636
Pos Pred Value         0.66667    0.9412   0.7778
Neg Pred Value         0.93333    0.9167   0.9815
Prevalence             0.09524    0.7778   0.1270
Detection Rate         0.03175    0.7619   0.1111
Detection Prevalence   0.04762    0.8095   0.1429
Balanced Accuracy      0.65789    0.8827   0.9193

T_RETROPOSITION_MM + T_RETROIRIDIAN SPACE [mm] + T_HEIGHT_IOL

tree<-rpart::rpart(T_POSITION~T_RETROPOSITION_MM+`T_RETROIRIDIAN SPACE  [mm]`+T_HEIGHT_IOL,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
           extra=101, box.palette="GnBu",
           branch.lty=3, shadow.col="gray", nn=TRUE
        )

rpart.rules(tree)

preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$T_POSITION))
Confusion Matrix and Statistics

          Reference
Prediction CA CP  S
        CA  2  1  0
        CP  2 48  1
        S   2  0  7

Overall Statistics
                                          
               Accuracy : 0.9048          
                 95% CI : (0.8041, 0.9642)
    No Information Rate : 0.7778          
    P-Value [Acc > NIR] : 0.007371        
                                          
                  Kappa : 0.7261          
                                          
 Mcnemar's Test P-Value : 0.343030        

Statistics by Class:

                     Class: CA Class: CP Class: S
Sensitivity            0.33333    0.9796   0.8750
Specificity            0.98246    0.7857   0.9636
Pos Pred Value         0.66667    0.9412   0.7778
Neg Pred Value         0.93333    0.9167   0.9815
Prevalence             0.09524    0.7778   0.1270
Detection Rate         0.03175    0.7619   0.1111
Detection Prevalence   0.04762    0.8095   0.1429
Balanced Accuracy      0.65789    0.8827   0.9193
LS0tCnRpdGxlOiAiSVogSUNMIFBPU0lUSU9OIEFOQUxZU0lTIE1VTFRJUExFIEZFQVRVUkVTIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jX2NvbGxhcHNlZDogdHJ1ZQotLS0KCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KHNraW1yKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KHRpYmJsZSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KFZJTSkKbGlicmFyeShyZWFkcikKbGlicmFyeShycGFydC5wbG90KQpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CnBvc3RvcF9kYXRhPC1yZWFkcjo6cmVhZF9jc3YoZmlsZSA9ICJwb3N0b3BfZGF0YV9jbGVhbmVkX25vcm1hbGl6ZWQtdmVyc2lvbjUtcmV0ZXN0LmNzdiIpCnJldHJvcG9zdGlvbl9kYXRhPC1wb3N0b3BfZGF0YSAlPiUgc2VsZWN0KE5BTUUsTk9STV9OX1JFVFJPUE9TSVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fVF9SRVRST1BPU0lUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1NJVElPTixOX1JFVFJPUE9TSVRJT05fTU0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfUkVUUk9QT1NJVElPTl9NTSxSRVRFU1RfUE9TSVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fVF9SRVRST19IQUxGX0lPTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9OX1JFVFJPX0hBTEZfSU9MLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX1RfUkVUUk9fSU9MLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX05fUkVUUk9fSU9MLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTl9SRVRST0lSSURJQU4gU1BBQ0UgW21tXWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUX1JFVFJPSVJJRElBTiBTUEFDRSAgW21tXWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfSEVJR0hUX0lPTCxOX0hFSUdIVF9JT0wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICU+JSBmaWx0ZXIoIWlzLm5hKFJFVEVTVF9QT1NJVElPTikpICU+JSBzZXBhcmF0ZShSRVRFU1RfUE9TSVRJT04saW50bz1jKCJOX1BPU0lUSU9OIiwiVF9QT1NJVElPTiIpLHNlcD0nLScpICU+JSBkcm9wX25hKFRfUE9TSVRJT04pICU+JSBkcm9wX25hKE5PUk1fVF9SRVRST1BPU0lUSU9OKQoKCnJldHJvcG9zdGlvbl9kYXRhPC1yZXRyb3Bvc3Rpb25fZGF0YSAlPiUgbXV0YXRlKFRfUE9TSVRJT049aWZlbHNlKFRfUE9TSVRJT049PSJDTSIsIkNBIixUX1BPU0lUSU9OKSxOX1BPU0lUSU9OPWlmZWxzZShOX1BPU0lUSU9OPT0iQ00iLCJDQSIsTl9QT1NJVElPTikpCnJldHJvcG9zdGlvbl9kYXRhCmBgYAoKIyBOQVNBTAojIyBOX1JFVFJPUE9TSVRJT05fTU0KCmBgYHtyfQp0cmVlPC1ycGFydDo6cnBhcnQoTl9QT1NJVElPTn5OX1JFVFJPUE9TSVRJT05fTU0KICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAsZGF0YT1yZXRyb3Bvc3Rpb25fZGF0YSxjb250cm9sID0gcnBhcnQuY29udHJvbChtaW5zcGxpdCA9IDEwKSkKcnBhcnQucGxvdCh0cmVlLHR5cGU9MSwKICAgICAgICAgICBleHRyYT0xMDEsIGJveC5wYWxldHRlPSJHbkJ1IiwKICAgICAgICAgICBicmFuY2gubHR5PTMsIHNoYWRvdy5jb2w9ImdyYXkiLCBubj1UUlVFCiAgICAgICAgKQpycGFydC5ydWxlcyh0cmVlKQpwcmVkczwtcHJlZGljdCh0cmVlLHJldHJvcG9zdGlvbl9kYXRhLHR5cGUgPSAnY2xhc3MnKQpjYXJldDo6Y29uZnVzaW9uTWF0cml4KHByZWRzLGFzLmZhY3RvcihyZXRyb3Bvc3Rpb25fZGF0YSROX1BPU0lUSU9OKSkKY2JpbmQoaWQ9MTpucm93KHJldHJvcG9zdGlvbl9kYXRhKSxyZXRyb3Bvc3Rpb25fZGF0YSxOX1BPU0lUSU9OX1BSRURJQ1RFRD1hcy5jaGFyYWN0ZXIocHJlZHMpKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSBmaWx0ZXIoTl9QT1NJVElPTiE9Tl9QT1NJVElPTl9QUkVESUNURUQpICU+JSBzZWxlY3QoTkFNRSxOX1BPU0lUSU9OLE5fUE9TSVRJT05fUFJFRElDVEVEKQoKCmBgYAoKIyMgTl9SRVRST1BPU0lUSU9OX01NICsgTl9SRVRST0lSSURJQU4gU1BBQ0UgW21tXSAKYGBge3J9CnRyZWU8LXJwYXJ0OjpycGFydChOX1BPU0lUSU9Ofk5fUkVUUk9QT1NJVElPTl9NTStgTl9SRVRST0lSSURJQU4gU1BBQ0UgW21tXWAsZGF0YT1yZXRyb3Bvc3Rpb25fZGF0YSxjb250cm9sID0gcnBhcnQuY29udHJvbChtaW5zcGxpdCA9IDEwKSkKcnBhcnQucGxvdCh0cmVlLHR5cGU9MSwKICAgICAgICAgICBleHRyYT0xMDEsIGJveC5wYWxldHRlPSJHbkJ1IiwKICAgICAgICAgICBicmFuY2gubHR5PTMsIHNoYWRvdy5jb2w9ImdyYXkiLCBubj1UUlVFCiAgICAgICAgKQpycGFydC5ydWxlcyh0cmVlKQoKcHJlZHM8LXByZWRpY3QodHJlZSxyZXRyb3Bvc3Rpb25fZGF0YSx0eXBlID0gJ2NsYXNzJykKY2FyZXQ6OmNvbmZ1c2lvbk1hdHJpeChwcmVkcyxhcy5mYWN0b3IocmV0cm9wb3N0aW9uX2RhdGEkTl9QT1NJVElPTikpCmBgYAoKIyMgTl9SRVRST1BPU0lUSU9OX01NICsgTl9IRUlHSFRfSU9MIApgYGB7cn0KdHJlZTwtcnBhcnQ6OnJwYXJ0KE5fUE9TSVRJT05+Tl9SRVRST1BPU0lUSU9OX01NK05fSEVJR0hUX0lPTCxkYXRhPXJldHJvcG9zdGlvbl9kYXRhLGNvbnRyb2wgPSBycGFydC5jb250cm9sKG1pbnNwbGl0ID0gMTApKQpycGFydC5wbG90KHRyZWUsdHlwZT0xLAogICAgICAgICAgIGV4dHJhPTEwMSwgYm94LnBhbGV0dGU9IkduQnUiLAogICAgICAgICAgIGJyYW5jaC5sdHk9Mywgc2hhZG93LmNvbD0iZ3JheSIsIG5uPVRSVUUKICAgICAgICApCnJwYXJ0LnJ1bGVzKHRyZWUpCgpwcmVkczwtcHJlZGljdCh0cmVlLHJldHJvcG9zdGlvbl9kYXRhLHR5cGUgPSAnY2xhc3MnKQpjYXJldDo6Y29uZnVzaW9uTWF0cml4KHByZWRzLGFzLmZhY3RvcihyZXRyb3Bvc3Rpb25fZGF0YSROX1BPU0lUSU9OKSkKYGBgCgojIyBOX1JFVFJPUE9TSVRJT05fTU0gKyBOX0hFSUdIVF9JT0wgKyBOX1JFVFJPSVJJRElBTiBTUEFDRSBbbW1dIApgYGB7cn0KdHJlZTwtcnBhcnQ6OnJwYXJ0KE5fUE9TSVRJT05+Tl9SRVRST1BPU0lUSU9OX01NK05fSEVJR0hUX0lPTCxkYXRhPXJldHJvcG9zdGlvbl9kYXRhLGNvbnRyb2wgPSBycGFydC5jb250cm9sKG1pbnNwbGl0ID0gMTApKQpycGFydC5wbG90KHRyZWUsdHlwZT0xLAogICAgICAgICAgIGV4dHJhPTEwMSwgYm94LnBhbGV0dGU9IkduQnUiLAogICAgICAgICAgIGJyYW5jaC5sdHk9Mywgc2hhZG93LmNvbD0iZ3JheSIsIG5uPVRSVUUKICAgICAgICApCnJwYXJ0LnJ1bGVzKHRyZWUpCgpwcmVkczwtcHJlZGljdCh0cmVlLHJldHJvcG9zdGlvbl9kYXRhLHR5cGUgPSAnY2xhc3MnKQpjYXJldDo6Y29uZnVzaW9uTWF0cml4KHByZWRzLGFzLmZhY3RvcihyZXRyb3Bvc3Rpb25fZGF0YSROX1BPU0lUSU9OKSkKYGBgCgoKCiMgVEVNUE9SQUwKCiMjIFRfUkVUUk9QT1NJVElPTl9NTQoKYGBge3J9CnRyZWU8LXJwYXJ0OjpycGFydChUX1BPU0lUSU9OflRfUkVUUk9QT1NJVElPTl9NTSxkYXRhPXJldHJvcG9zdGlvbl9kYXRhLGNvbnRyb2wgPSBycGFydC5jb250cm9sKG1pbnNwbGl0ID0gMTApKQpycGFydC5wbG90KHRyZWUsdHlwZT0xLAogICAgICAgICAgIGV4dHJhPTEwMSwgYm94LnBhbGV0dGU9IkduQnUiLAogICAgICAgICAgIGJyYW5jaC5sdHk9Mywgc2hhZG93LmNvbD0iZ3JheSIsIG5uPVRSVUUKICAgICAgICApCnJwYXJ0LnJ1bGVzKHRyZWUpCgpwcmVkczwtcHJlZGljdCh0cmVlLHJldHJvcG9zdGlvbl9kYXRhLHR5cGUgPSAnY2xhc3MnKQpjYXJldDo6Y29uZnVzaW9uTWF0cml4KHByZWRzLGFzLmZhY3RvcihyZXRyb3Bvc3Rpb25fZGF0YSRUX1BPU0lUSU9OKSkKY2JpbmQoaWQ9MTpucm93KHJldHJvcG9zdGlvbl9kYXRhKSxyZXRyb3Bvc3Rpb25fZGF0YSxUX1BPU0lUSU9OX1BSRURJQ1RFRD1hcy5jaGFyYWN0ZXIocHJlZHMpKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSBmaWx0ZXIoVF9QT1NJVElPTiE9VF9QT1NJVElPTl9QUkVESUNURUQpICU+JSBzZWxlY3QoTkFNRSxUX1BPU0lUSU9OLFRfUE9TSVRJT05fUFJFRElDVEVEKQpgYGAKCiMjIFRfUkVUUk9QT1NJVElPTl9NTSArIFRfUkVUUk9JUklESUFOIFNQQUNFIFttbV0gCgpgYGB7cn0KdHJlZTwtcnBhcnQ6OnJwYXJ0KFRfUE9TSVRJT05+VF9SRVRST1BPU0lUSU9OX01NICtgVF9SRVRST0lSSURJQU4gU1BBQ0UgIFttbV1gLGRhdGE9cmV0cm9wb3N0aW9uX2RhdGEsY29udHJvbCA9IHJwYXJ0LmNvbnRyb2wobWluc3BsaXQgPSAxMCkpCnJwYXJ0LnBsb3QodHJlZSx0eXBlPTEsCiAgICAgICAgICAgZXh0cmE9MTAxLCBib3gucGFsZXR0ZT0iR25CdSIsCiAgICAgICAgICAgYnJhbmNoLmx0eT0zLCBzaGFkb3cuY29sPSJncmF5Iiwgbm49VFJVRQogICAgICAgICkKcnBhcnQucnVsZXModHJlZSkKCnByZWRzPC1wcmVkaWN0KHRyZWUscmV0cm9wb3N0aW9uX2RhdGEsdHlwZSA9ICdjbGFzcycpCmNhcmV0Ojpjb25mdXNpb25NYXRyaXgocHJlZHMsYXMuZmFjdG9yKHJldHJvcG9zdGlvbl9kYXRhJFRfUE9TSVRJT04pKQpgYGAKCiMjIFRfUkVUUk9QT1NJVElPTl9NTSArICBUX0hFSUdIVF9JT0wKCmBgYHtyfQp0cmVlPC1ycGFydDo6cnBhcnQoVF9QT1NJVElPTn5UX1JFVFJPUE9TSVRJT05fTU0rVF9IRUlHSFRfSU9MLGRhdGE9cmV0cm9wb3N0aW9uX2RhdGEsY29udHJvbCA9IHJwYXJ0LmNvbnRyb2wobWluc3BsaXQgPSAxMCkpCnJwYXJ0LnBsb3QodHJlZSx0eXBlPTEsCiAgICAgICAgICAgZXh0cmE9MTAxLCBib3gucGFsZXR0ZT0iR25CdSIsCiAgICAgICAgICAgYnJhbmNoLmx0eT0zLCBzaGFkb3cuY29sPSJncmF5Iiwgbm49VFJVRQogICAgICAgICkKcnBhcnQucnVsZXModHJlZSkKCnByZWRzPC1wcmVkaWN0KHRyZWUscmV0cm9wb3N0aW9uX2RhdGEsdHlwZSA9ICdjbGFzcycpCmNhcmV0Ojpjb25mdXNpb25NYXRyaXgocHJlZHMsYXMuZmFjdG9yKHJldHJvcG9zdGlvbl9kYXRhJFRfUE9TSVRJT04pKQpgYGAKCiMjIFRfUkVUUk9QT1NJVElPTl9NTSArIFRfUkVUUk9JUklESUFOIFNQQUNFIFttbV0gKyBUX0hFSUdIVF9JT0wKCmBgYHtyfQp0cmVlPC1ycGFydDo6cnBhcnQoVF9QT1NJVElPTn5UX1JFVFJPUE9TSVRJT05fTU0rYFRfUkVUUk9JUklESUFOIFNQQUNFICBbbW1dYCtUX0hFSUdIVF9JT0wsZGF0YT1yZXRyb3Bvc3Rpb25fZGF0YSxjb250cm9sID0gcnBhcnQuY29udHJvbChtaW5zcGxpdCA9IDEwKSkKcnBhcnQucGxvdCh0cmVlLHR5cGU9MSwKICAgICAgICAgICBleHRyYT0xMDEsIGJveC5wYWxldHRlPSJHbkJ1IiwKICAgICAgICAgICBicmFuY2gubHR5PTMsIHNoYWRvdy5jb2w9ImdyYXkiLCBubj1UUlVFCiAgICAgICAgKQpycGFydC5ydWxlcyh0cmVlKQoKcHJlZHM8LXByZWRpY3QodHJlZSxyZXRyb3Bvc3Rpb25fZGF0YSx0eXBlID0gJ2NsYXNzJykKY2FyZXQ6OmNvbmZ1c2lvbk1hdHJpeChwcmVkcyxhcy5mYWN0b3IocmV0cm9wb3N0aW9uX2RhdGEkVF9QT1NJVElPTikpCmBgYAoK