The Analysis

The following analysis pulled geochemistry data from shells of juvenile mussels rasied in separate bays in eastern Maine in 2015 (along side the larvae from the previous analysis), and tested the effects of source (bay), and co-variance matrix prior, on the ability of the infinite mixture model (IMM) to correctly assign juvenile chemistry to sources. During analysis, each juvenile was removed from the overall data set, and the remaining juveniles used as baseline data to train the IMM. The individual juvenile removed from the data set was then assigned to a source based on the IMM, allowing for 7 possible extra, and untrained, source assignments, using each of four different co-variance matrix priors:

For each co-variance matrix prior for each juvenile, the IMM was run for an initial 1000 adaptation and 2000 burn-in iterations. The posterior distribution of source assignments for a final 3000 iterations were retained and used for further analysis.

The Data Set

Data were \(Log(x+1)\) transformed, and centered (by elemental mean) and scaled (by elemental standard deviation) prior to analysis. Together, these transformations were meant to normalize the elemental data, and then standardize the center and variance so that unknown sources could be easily modeled in the IMM. Principal Component Analysis suggested a lot of overlap in the multivariate geochemical signals among sources along the first 2 principle components (accounting for 72 and 12 percent of total variation respectively). Of all elements, Mn and Co accounted for the most variation among individual larvae, while La accounted for the least.

Importance of components:
                          PC1    PC2     PC3     PC4     PC5     PC6     PC7     PC8
Standard deviation     0.8952 0.3571 0.24539 0.19649 0.17896 0.15648 0.11961 0.08027
Proportion of Variance 0.7252 0.1154 0.05449 0.03494 0.02898 0.02216 0.01295 0.00583
Cumulative Proportion  0.7252 0.8407 0.89514 0.93008 0.95907 0.98122 0.99417 1.00000

Results by Individual

Below are the posterior distribution results of the IMM assignment for each individual juveniles (color) to each potential source (x-axis; numbers represent possible extra sources). Results are separated by the actual juvenile source (panel rows) and the co-variance matrix prior used in the IMM (panel columns).

We can see that generally, individual sources assign most frequently to one source, which is usually the correct one. Depending on the covariance used, sources like MBR, GB and DB are more multi-modal and diffuse in their assignments though.

Results by Source

To summarize assignment results by site, we take the mode source assignment for each individual and use that as the IMM predicted source assignment. Then, for each co-variance matrix prior (panels), we plot the percent of individuals from each source (Actual Source) assigned to each possible source by the IMM (Predicted Source).

Just as before, when we looked at data on an individual level, we generally see IMM assignment to correct sources, but, depending on the covariance used, MBR and GB are mostly confused with DB, and DB is confused with GB. Maximum percentage correctly assigned was ~ 88% for FBE though.

Effects of Source and Coviariance Matrix Prior on Correct Assignment

To understand what is driving misclassification by the IMM, we test the effects of Actual Source, Co-variance Prior, and their interaction with a GLM (family=binomial, link=log), using individual nested within actual source as a random effect.

Analysis of Deviance Table (Type III Wald chisquare tests)

Response: Correct
                          Chisq Df Pr(>Chisq)    
(Intercept)              0.9668  1   0.325467    
Actual_Source           17.3475  4   0.001654 ** 
Cov_Prior               15.9057  3   0.001186 ** 
Actual_Source:Cov_Prior 44.2806 12  1.368e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

We find that a juveniles’s actual source interacts with the covariance used to affect correct classifications.

We can use the regression coefficient summaries for a more in-depth look.

Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) [glmerMod]
 Family: binomial  ( logit )
Formula: Correct ~ Actual_Source * Cov_Prior + (1 | Actual_Source/Individual_Code)
   Data: leave.one.out.results.byind.assignment.table
Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 20000))

     AIC      BIC   logLik deviance df.resid 
   404.7    499.5   -180.4    360.7      526 

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-28.9230  -0.0205   0.0143   0.0461  25.5696 

Random effects:
 Groups                        Name        Variance  Std.Dev. 
 Individual_Code:Actual_Source (Intercept) 3.751e+01 6.124e+00
 Actual_Source                 (Intercept) 3.435e-15 5.861e-08
Number of obs: 548, groups:  Individual_Code:Actual_Source, 137; Actual_Source, 5

Fixed effects:
                                               Estimate Std. Error z value Pr(>|z|)    
(Intercept)                                     -1.4624     1.4873  -0.983 0.325467    
Actual_SourceFBE                                 9.8616     3.0361   3.248 0.001162 ** 
Actual_SourceGB                                  4.4980     2.0893   2.153 0.031331 *  
Actual_SourceMBR                                 8.6472     2.5131   3.441 0.000580 ***
Actual_SourcePHB                                 7.5958     2.1069   3.605 0.000312 ***
Cov_PriorSource_and_ID                           5.8002     1.6774   3.458 0.000544 ***
Cov_PriorSource_and_Universal                    5.8002     1.6775   3.458 0.000545 ***
Cov_PriorUniversal                              -0.8929     0.9713  -0.919 0.357924    
Actual_SourceFBE:Cov_PriorSource_and_ID         -5.8002     3.0633  -1.893 0.058294 .  
Actual_SourceGB:Cov_PriorSource_and_ID         -12.9372     2.5655  -5.043 4.59e-07 ***
Actual_SourceMBR:Cov_PriorSource_and_ID        -20.8495     4.0346  -5.168 2.37e-07 ***
Actual_SourcePHB:Cov_PriorSource_and_ID         -5.1599     2.0087  -2.569 0.010207 *  
Actual_SourceFBE:Cov_PriorSource_and_Universal  -8.0393     3.1013  -2.592 0.009536 ** 
Actual_SourceGB:Cov_PriorSource_and_Universal  -12.5134     2.5307  -4.945 7.63e-07 ***
Actual_SourceMBR:Cov_PriorSource_and_Universal -20.8495     4.0349  -5.167 2.37e-07 ***
Actual_SourcePHB:Cov_PriorSource_and_Universal  -5.8002     1.9956  -2.906 0.003655 ** 
Actual_SourceFBE:Cov_PriorUniversal              0.8929     2.7411   0.326 0.744604    
Actual_SourceGB:Cov_PriorUniversal               1.3311     1.3566   0.981 0.326494    
Actual_SourceMBR:Cov_PriorUniversal             -0.3952     1.9531  -0.202 0.839635    
Actual_SourcePHB:Cov_PriorUniversal              1.5333     1.5010   1.021 0.307028    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Relative to the intercept (reflecting the DB source and using the ID co-variance matrix), it seems that, generally, using the ID co-variance matrix, or the universal covariance matrix, give better assignments than integrating source specific covariance-matrices.

Results by Covariance Matrix Prior

If we wanted to look at the effect of different co-variance matrices in more detail, we again see that, generally, using the ID or University co-variance matrices leads to the best assignments.

Taken together, the results suggest that for best assignment, we should run the IMM with ID or universal co-variance priors, which is somewhat different than what the larval data suggested (that using source-specific covariance matrices is better). Taking these IMM assignments and projecting the correct and incorrect assignments onto the PCA from before, we see that where there is multivariate overlap in geochemistry, individuals are misassigned.

Overall, we learn that ID or universal co-variance matrices produce better IMM results when assigning juveniles, and that IMM misclassifications are mostly confined to the mutivariate overlap in geochemistry.

LS0tCnRpdGxlOiAiSW5maW5pdGUgTWl4dHVyZSBNb2RlbCBMZWF2ZS1PbmUtT3V0IEFuYWx5c2lzIGZvciAqTXl0aWx1cyBlZHVsaXMqIEp1dmVuaWxlcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoInBseXIiKQpsaWJyYXJ5KCJhYmluZCIpCmxpYnJhcnkoInJlc2hhcGUiKQpsaWJyYXJ5KCJnZ3Bsb3QyIikKbGlicmFyeSgiY2FyIikKbGlicmFyeSgibG1lNCIpCmxpYnJhcnkoImdnZm9ydGlmeSIpCgojIyMgc29tZSBlbGVtZW50IGRhdGEKCklDUE1TLmFsbC4yMDE1LmRhdDwtcmVhZC5jc3YoIi9Vc2Vycy9zY290dG1vcmVsbG8vRHJvcGJveC9BcmNoaXZlcy9BY2FkZW1pYy9VTWFzcyBCb3N0b24vRXR0ZXIgTGFiL1Byb2plY3RzL1RyYWNlIEVsZW1lbnQgTXVzc2VsIENvbm5lY3Rpdml0eS8yMDE1IElDUE1TIERhdGFzZXRzLzIwMTUuQWxsLkRhdGEuY3N2IikKCklDUE1TLmFsbC4yMDE1Lmp1dmRhdDwtc3Vic2V0KElDUE1TLmFsbC4yMDE1LmRhdCxUeXBlPT0iSnV2ZW5pbGUiKQp0b3Auc291cmNlczwtbmFtZXMoc29ydChzdW1tYXJ5KElDUE1TLmFsbC4yMDE1Lmp1dmRhdCRTaXRlKSxkZWNyZWFzaW5nID0gVFJVRSkpWzE6NV0KSUNQTVMuYWxsLjIwMTUuanV2ZGF0PC1zdWJzZXQoSUNQTVMuYWxsLjIwMTUuanV2ZGF0LFNpdGU9PXRvcC5zb3VyY2VzWzFdfFNpdGU9PXRvcC5zb3VyY2VzWzJdfFNpdGU9PXRvcC5zb3VyY2VzWzNdfFNpdGU9PXRvcC5zb3VyY2VzWzRdfFNpdGU9PXRvcC5zb3VyY2VzWzVdKQpJQ1BNUy5hbGwuMjAxNS5qdXZkYXQkU2l0ZTwtZmFjdG9yKElDUE1TLmFsbC4yMDE1Lmp1dmRhdCRTaXRlKQpJQ1BNUy5hbGwuMjAxNS5qdXZkYXQuZW52PC1JQ1BNUy5hbGwuMjAxNS5qdXZkYXRbLGMoMTo0KV0KSUNQTVMuYWxsLjIwMTUuanV2ZGF0LnZhbDwtSUNQTVMuYWxsLjIwMTUuanV2ZGF0WywtYygxOjQpXQpJQ1BNUy5hbGwuMjAxNS5qdXZkYXQudmFsLnRyYW5zPC1sb2coSUNQTVMuYWxsLjIwMTUuanV2ZGF0LnZhbCsxLDEwKQoKCmxlYXZlLm9uZS5vdXQucmVzdWx0czwtcmVhZFJEUygiL1VzZXJzL3Njb3R0bW9yZWxsby9Ecm9wYm94L0FyY2hpdmVzL0FjYWRlbWljL1VNYXNzIEJvc3Rvbi9FdHRlciBMYWIvUHJvamVjdHMvVHJhY2UgRWxlbWVudCBNdXNzZWwgQ29ubmVjdGl2aXR5L1IgV29yay9JbmZpbml0ZSBNaXh0dXJlIE1vZGVsIGluIFIvSmFnc19Xb3JrL2xlYXZlb25lb3V0cmVzdWx0c0p1di5yZHMiKQoKYGBgCiMjIFRoZSBBbmFseXNpcwogIFRoZSBmb2xsb3dpbmcgYW5hbHlzaXMgcHVsbGVkIGdlb2NoZW1pc3RyeSBkYXRhIGZyb20gc2hlbGxzIG9mIGp1dmVuaWxlIG11c3NlbHMgcmFzaWVkIGluIHNlcGFyYXRlIGJheXMgaW4gZWFzdGVybiBNYWluZSBpbiAyMDE1IChhbG9uZyBzaWRlIHRoZSBsYXJ2YWUgZnJvbSB0aGUgcHJldmlvdXMgYW5hbHlzaXMpLCBhbmQgdGVzdGVkIHRoZSBlZmZlY3RzIG9mIHNvdXJjZSAoYmF5KSwgYW5kIGNvLXZhcmlhbmNlIG1hdHJpeCBwcmlvciwgb24gdGhlIGFiaWxpdHkgb2YgdGhlIGluZmluaXRlIG1peHR1cmUgbW9kZWwgKElNTSkgdG8gY29ycmVjdGx5IGFzc2lnbiBqdXZlbmlsZSBjaGVtaXN0cnkgdG8gc291cmNlcy4gRHVyaW5nIGFuYWx5c2lzLCBlYWNoIGp1dmVuaWxlIHdhcyByZW1vdmVkIGZyb20gdGhlIG92ZXJhbGwgZGF0YSBzZXQsIGFuZCB0aGUgcmVtYWluaW5nIGp1dmVuaWxlcyB1c2VkIGFzIGJhc2VsaW5lIGRhdGEgdG8gdHJhaW4gdGhlIElNTS4gVGhlIGluZGl2aWR1YWwganV2ZW5pbGUgcmVtb3ZlZCBmcm9tIHRoZSBkYXRhIHNldCB3YXMgdGhlbiBhc3NpZ25lZCB0byBhIHNvdXJjZSBiYXNlZCBvbiB0aGUgSU1NLCBhbGxvd2luZyBmb3IgNyBwb3NzaWJsZSBleHRyYSwgYW5kIHVudHJhaW5lZCwgc291cmNlIGFzc2lnbm1lbnRzLCB1c2luZyBlYWNoIG9mIGZvdXIgZGlmZmVyZW50IGNvLXZhcmlhbmNlIG1hdHJpeCBwcmlvcnM6CgoqIFRoZSBJZGVudGl0eSBNYXRyaXggZm9yIGFsbCBzb3VyY2VzCiogU291cmNlIFNwZWNpZmljIENvLXZhcmlhbmNlIE1hdHJpY2VzIGZvciBiYXNlbGluZSBzb3VyY2VzLCBhbmQgdGhlbiB0aGUgSWRlbnRpdHkgTWF0cml4IGZvciBleHRyYSBzb3VyY2VzCiogU291cmNlIFNwZWNpZmljIENvLXZhcmlhbmNlIE1hdHJpY2VzIGZvciBiYXNlbGluZSBzb3VyY2VzLCBhbmQgdGhlbiB0aGUgVW5pdmVyc2FsIENvLXZhcmlhbmNlIE1hdHJpeCBmb3IgZXh0cmEgc291cmNlcwoqIFRoZSBVbml2ZXJzYWwgQ28tdmFyaWFuY2UgTWF0cml4IGZvciBhbGwgc291cmNlcwoKRm9yIGVhY2ggY28tdmFyaWFuY2UgbWF0cml4IHByaW9yIGZvciBlYWNoIGp1dmVuaWxlLCB0aGUgSU1NIHdhcyBydW4gZm9yIGFuIGluaXRpYWwgMTAwMCBhZGFwdGF0aW9uIGFuZCAyMDAwIGJ1cm4taW4gaXRlcmF0aW9ucy4gVGhlIHBvc3RlcmlvciBkaXN0cmlidXRpb24gb2Ygc291cmNlIGFzc2lnbm1lbnRzIGZvciBhIGZpbmFsIDMwMDAgaXRlcmF0aW9ucyB3ZXJlIHJldGFpbmVkIGFuZCB1c2VkIGZvciBmdXJ0aGVyIGFuYWx5c2lzLgoKCiMjIFRoZSBEYXRhIFNldAoKICBEYXRhIHdlcmUgJExvZyh4KzEpJCB0cmFuc2Zvcm1lZCwgYW5kIGNlbnRlcmVkIChieSBlbGVtZW50YWwgbWVhbikgYW5kIHNjYWxlZCAoYnkgZWxlbWVudGFsIHN0YW5kYXJkIGRldmlhdGlvbikgcHJpb3IgdG8gYW5hbHlzaXMuIFRvZ2V0aGVyLCB0aGVzZSB0cmFuc2Zvcm1hdGlvbnMgd2VyZSBtZWFudCB0byBub3JtYWxpemUgdGhlIGVsZW1lbnRhbCBkYXRhLCBhbmQgdGhlbiBzdGFuZGFyZGl6ZSB0aGUgY2VudGVyIGFuZCB2YXJpYW5jZSBzbyB0aGF0IHVua25vd24gc291cmNlcyBjb3VsZCBiZSBlYXNpbHkgbW9kZWxlZCBpbiB0aGUgSU1NLiBQcmluY2lwYWwgQ29tcG9uZW50IEFuYWx5c2lzIHN1Z2dlc3RlZCBhIGxvdCBvZiBvdmVybGFwIGluIHRoZSBtdWx0aXZhcmlhdGUgZ2VvY2hlbWljYWwgc2lnbmFscyBhbW9uZyBzb3VyY2VzIGFsb25nIHRoZSBmaXJzdCAyIHByaW5jaXBsZSBjb21wb25lbnRzIChhY2NvdW50aW5nIGZvciA3MiBhbmQgMTIgcGVyY2VudCBvZiB0b3RhbCB2YXJpYXRpb24gcmVzcGVjdGl2ZWx5KS4gT2YgYWxsIGVsZW1lbnRzLCAqKk1uKiogYW5kICoqQ28qKiBhY2NvdW50ZWQgZm9yIHRoZSBtb3N0IHZhcmlhdGlvbiBhbW9uZyBpbmRpdmlkdWFsIGxhcnZhZSwgd2hpbGUgKipMYSoqIGFjY291bnRlZCBmb3IgdGhlIGxlYXN0LgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD0yLCBmaWcud2lkdGg9MywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCmF1dG9wbG90KHByY29tcChJQ1BNUy5hbGwuMjAxNS5qdXZkYXQudmFsLnRyYW5zKSwgCiAgICAgICAgIGRhdGEgPSBJQ1BNUy5hbGwuMjAxNS5qdXZkYXQuZW52LCAKICAgICAgICAgY29sb3VyID0gIlNpdGUiLAogICAgICAgICBsb2FkaW5ncyA9IFRSVUUsCiAgICAgICAgIGxvYWRpbmdzLmxhYmVsID0gVFJVRSwKICAgICAgICAgZnJhbWUgPSBUUlVFLCAKICAgICAgICAgZnJhbWUudHlwZSA9ICdub3JtJykrCiAgdGhlbWVfYncoKQpgYGAKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnN1bW1hcnkocHJjb21wKElDUE1TLmFsbC4yMDE1Lmp1dmRhdC52YWwudHJhbnMpKQpgYGAKCgojIyBSZXN1bHRzIGJ5IEluZGl2aWR1YWwKCiAgQmVsb3cgYXJlIHRoZSBwb3N0ZXJpb3IgZGlzdHJpYnV0aW9uIHJlc3VsdHMgb2YgdGhlIElNTSBhc3NpZ25tZW50IGZvciBlYWNoIGluZGl2aWR1YWwganV2ZW5pbGVzIChjb2xvcikgdG8gZWFjaCBwb3RlbnRpYWwgc291cmNlICh4LWF4aXM7IG51bWJlcnMgcmVwcmVzZW50IHBvc3NpYmxlIGV4dHJhIHNvdXJjZXMpLiBSZXN1bHRzIGFyZSBzZXBhcmF0ZWQgYnkgdGhlIGFjdHVhbCBqdXZlbmlsZSBzb3VyY2UgKHBhbmVsIHJvd3MpIGFuZCB0aGUgY28tdmFyaWFuY2UgbWF0cml4IHByaW9yIHVzZWQgaW4gdGhlIElNTSAocGFuZWwgY29sdW1ucykuCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD00LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQudGFibGU8LW1lbHQobGVhdmUub25lLm91dC5yZXN1bHRzLGlkLnZhcnM9YygiSW5kaXZpZHVhbCIsIkNvdl9QcmlvciIsIkFjdHVhbCIpKQpjb2xuYW1lcyhsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQudGFibGUpWzM6NV08LWMoIkFjdHVhbF9Tb3VyY2UiLCJQcmVkaWN0ZWRfU291cmNlIiwiUGVyY2VudF9Bc3NpZ25tZW50IikKCmxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC50YWJsZSRQcmVkaWN0ZWRfU291cmNlPC1mYWN0b3IobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLnRhYmxlJFByZWRpY3RlZF9Tb3VyY2UpCmxldmVscyhsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQudGFibGUkUHJlZGljdGVkX1NvdXJjZSk8LWMobGV2ZWxzKElDUE1TLmFsbC4yMDE1Lmp1dmRhdC5lbnZbc2FtcGluZCwiU2l0ZSJdKSxjKHJlZnNpdGUubisxOmV4dHJhc2l0ZS5uKSkKCmxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC50YWJsZSRBY3R1YWxfU291cmNlPC1mYWN0b3IobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLnRhYmxlJEFjdHVhbF9Tb3VyY2UpCmxldmVscyhsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQudGFibGUkQWN0dWFsX1NvdXJjZSk8LWMobGV2ZWxzKElDUE1TLmFsbC4yMDE1Lmp1dmRhdC5lbnZbc2FtcGluZCwiU2l0ZSJdKSxjKHJlZnNpdGUubisxOmV4dHJhc2l0ZS5uKSkKCgpjb2xvdXIudmVjPC1yYWluYm93KG1heChsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQudGFibGUkSW5kaXZpZHVhbCksIHM9LjYsIHY9LjkpW3NhbXBsZShjKDE6bWF4KGxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC50YWJsZSRJbmRpdmlkdWFsKSksbWF4KGxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC50YWJsZSRJbmRpdmlkdWFsKSldCmNvbG91ci52ZWM8LWNvbG91ci52ZWNbbWF0Y2gobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLnRhYmxlJEluZGl2aWR1YWwsYygxOm1heChsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQudGFibGUkSW5kaXZpZHVhbCkpKV0KCgpnZ3Bsb3QobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLnRhYmxlLGFlcyh4PVByZWRpY3RlZF9Tb3VyY2UsZ3JvdXA9SW5kaXZpZHVhbCx5PVBlcmNlbnRfQXNzaWdubWVudCxjb2xvdXI9ZmFjdG9yKEluZGl2aWR1YWwpKSkrCiAgICBmYWNldF9ncmlkKEFjdHVhbF9Tb3VyY2V+Q292X1ByaW9yKSsKICAgIGdlb21fbGluZSgpICsgCiAgICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGNvbG91ci52ZWMpKwogICAgdGhlbWVfYncoKSsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSksbGVnZW5kLnBvc2l0aW9uPSJub25lIikKYGBgCldlIGNhbiBzZWUgdGhhdCBnZW5lcmFsbHksIGluZGl2aWR1YWwgc291cmNlcyBhc3NpZ24gbW9zdCBmcmVxdWVudGx5IHRvIG9uZSBzb3VyY2UsIHdoaWNoIGlzIHVzdWFsbHkgdGhlIGNvcnJlY3Qgb25lLiBEZXBlbmRpbmcgb24gdGhlIGNvdmFyaWFuY2UgdXNlZCwgc291cmNlcyBsaWtlIE1CUiwgR0IgYW5kIERCIGFyZSBtb3JlIG11bHRpLW1vZGFsIGFuZCBkaWZmdXNlIGluIHRoZWlyIGFzc2lnbm1lbnRzIHRob3VnaC4KCgojIyBSZXN1bHRzIGJ5IFNvdXJjZQoKVG8gc3VtbWFyaXplIGFzc2lnbm1lbnQgcmVzdWx0cyBieSBzaXRlLCB3ZSB0YWtlIHRoZSBtb2RlIHNvdXJjZSBhc3NpZ25tZW50IGZvciBlYWNoIGluZGl2aWR1YWwgYW5kIHVzZSB0aGF0IGFzIHRoZSBJTU0gcHJlZGljdGVkIHNvdXJjZSBhc3NpZ25tZW50LiBUaGVuLCBmb3IgZWFjaCBjby12YXJpYW5jZSBtYXRyaXggcHJpb3IgKHBhbmVscyksIHdlIHBsb3QgdGhlIHBlcmNlbnQgb2YgaW5kaXZpZHVhbHMgZnJvbSBlYWNoIHNvdXJjZSAoQWN0dWFsIFNvdXJjZSkgYXNzaWduZWQgdG8gZWFjaCBwb3NzaWJsZSBzb3VyY2UgYnkgdGhlIElNTSAoUHJlZGljdGVkIFNvdXJjZSkuCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEsIGZpZy53aWR0aD00LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudDwtZGRwbHkobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLnRhYmxlLC4oSW5kaXZpZHVhbCxDb3ZfUHJpb3IsQWN0dWFsX1NvdXJjZSksc3VtbWFyaXplLFByZWRpY3RlZF9Tb3VyY2U9d2hpY2gubWF4KFBlcmNlbnRfQXNzaWdubWVudCkpCmxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC5hc3NpZ25tZW50JFByZWRpY3RlZF9Tb3VyY2U8LWZhY3RvcihsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudCRQcmVkaWN0ZWRfU291cmNlKQpsZXZlbHMobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLmFzc2lnbm1lbnQkUHJlZGljdGVkX1NvdXJjZSk8LWMobGV2ZWxzKElDUE1TLmFsbC4yMDE1Lmp1dmRhdC5lbnZbc2FtcGluZCwiU2l0ZSJdKSxjKHJlZnNpdGUubisxOmV4dHJhc2l0ZS5uKSlbMTpsZW5ndGgodW5pcXVlKGxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC5hc3NpZ25tZW50JFByZWRpY3RlZF9Tb3VyY2UpKV0KCiNJRApJRC5hc3NpZ24udGFibGU8LSh0YWJsZShzdWJzZXQobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLmFzc2lnbm1lbnQsQ292X1ByaW9yPT0iSUQiKVssYygzOjQpXSkvcm93U3Vtcyh0YWJsZShzdWJzZXQobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLmFzc2lnbm1lbnQsQ292X1ByaW9yPT0iSUQiKVssYygzOjQpXSkpKVtjKDE6NSksXQoKI1NvdXJjZV9hbmRfSUQKU291cmNlX2FuZF9JRC5hc3NpZ24udGFibGU8LSh0YWJsZShzdWJzZXQobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLmFzc2lnbm1lbnQsQ292X1ByaW9yPT0iU291cmNlX2FuZF9JRCIpWyxjKDM6NCldKS9yb3dTdW1zKHRhYmxlKHN1YnNldChsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudCxDb3ZfUHJpb3I9PSJTb3VyY2VfYW5kX0lEIilbLGMoMzo0KV0pKSlbYygxOjUpLF0KCiNTb3VyY2VfYW5kX1VuaXZlcnNhbApTb3VyY2VfYW5kX1VuaXZlcnNhbC5hc3NpZ24udGFibGU8LSh0YWJsZShzdWJzZXQobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLmFzc2lnbm1lbnQsQ292X1ByaW9yPT0iU291cmNlX2FuZF9Vbml2ZXJzYWwiKVssYygzOjQpXSkvcm93U3Vtcyh0YWJsZShzdWJzZXQobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLmFzc2lnbm1lbnQsQ292X1ByaW9yPT0iU291cmNlX2FuZF9Vbml2ZXJzYWwiKVssYygzOjQpXSkpKVtjKDE6NSksXQoKI1VuaXZlcnNhbApVbml2ZXJzYWwuYXNzaWduLnRhYmxlPC0odGFibGUoc3Vic2V0KGxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC5hc3NpZ25tZW50LENvdl9Qcmlvcj09IlVuaXZlcnNhbCIpWyxjKDM6NCldKS9yb3dTdW1zKHRhYmxlKHN1YnNldChsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudCxDb3ZfUHJpb3I9PSJVbml2ZXJzYWwiKVssYygzOjQpXSkpKVtjKDE6NSksXQoKbGVhdmUub25lLm91dC5yZXN1bHRzLmFsbC5hc3NpZ25tZW50PC1jYmluZChkYXRhLmZyYW1lKENvdl9Qcmlvcj1yZXAoYygiSUQiLCJTb3VyY2VfYW5kX0lEIiwiU291cmNlX2FuZF9Vbml2ZXJzYWwiLCJVbml2ZXJzYWwiKSxlYWNoPTUpLEFjdHVhbF9Tb3VyY2U9cmVwKHJvdy5uYW1lcyhJRC5hc3NpZ24udGFibGUpLDQpKSxyYmluZChJRC5hc3NpZ24udGFibGUsU291cmNlX2FuZF9JRC5hc3NpZ24udGFibGUsU291cmNlX2FuZF9Vbml2ZXJzYWwuYXNzaWduLnRhYmxlLFVuaXZlcnNhbC5hc3NpZ24udGFibGUpKQpsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYWxsLmFzc2lnbm1lbnQ8LW1lbHQobGVhdmUub25lLm91dC5yZXN1bHRzLmFsbC5hc3NpZ25tZW50KQpjb2xuYW1lcyhsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYWxsLmFzc2lnbm1lbnQpWzM6NF08LWMoIlByZWRpY3RlZF9Tb3VyY2UiLCJQZXJjZW50X0Fzc2lnbmVkIikKCgpnZ3Bsb3QobGVhdmUub25lLm91dC5yZXN1bHRzLmFsbC5hc3NpZ25tZW50LGFlcyh4PVByZWRpY3RlZF9Tb3VyY2UseT1BY3R1YWxfU291cmNlLGZpbGw9UGVyY2VudF9Bc3NpZ25lZCkpKwogIGZhY2V0X3dyYXAofkNvdl9QcmlvcixuY29sPTQpKwogIGdlb21fdGlsZShjb2xvdXIgPSAid2hpdGUiKSArIAogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gIndoaXRlIiwgaGlnaCA9ICJyZWQiLGxpbWl0cz1jKDAsMSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkKYGBgCkp1c3QgYXMgYmVmb3JlLCB3aGVuIHdlIGxvb2tlZCBhdCBkYXRhIG9uIGFuIGluZGl2aWR1YWwgbGV2ZWwsIHdlIGdlbmVyYWxseSBzZWUgSU1NIGFzc2lnbm1lbnQgdG8gY29ycmVjdCBzb3VyY2VzLCBidXQsIGRlcGVuZGluZyBvbiB0aGUgY292YXJpYW5jZSB1c2VkLCBNQlIgYW5kIEdCIGFyZSBtb3N0bHkgY29uZnVzZWQgd2l0aCBEQiwgYW5kIERCIGlzIGNvbmZ1c2VkIHdpdGggR0IuIE1heGltdW0gcGVyY2VudGFnZSBjb3JyZWN0bHkgYXNzaWduZWQgd2FzIH4gODglIGZvciBGQkUgdGhvdWdoLgoKCiMjIEVmZmVjdHMgb2YgU291cmNlIGFuZCBDb3ZpYXJpYW5jZSBNYXRyaXggUHJpb3Igb24gQ29ycmVjdCBBc3NpZ25tZW50CgpUbyB1bmRlcnN0YW5kIHdoYXQgaXMgZHJpdmluZyBtaXNjbGFzc2lmaWNhdGlvbiBieSB0aGUgSU1NLCB3ZSB0ZXN0IHRoZSBlZmZlY3RzIG9mIEFjdHVhbCBTb3VyY2UsIENvLXZhcmlhbmNlIFByaW9yLCBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gd2l0aCBhIEdMTSAoZmFtaWx5PWJpbm9taWFsLCBsaW5rPWxvZyksIHVzaW5nIGluZGl2aWR1YWwgbmVzdGVkIHdpdGhpbiBhY3R1YWwgc291cmNlIGFzIGEgcmFuZG9tIGVmZmVjdC4KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC5hc3NpZ25tZW50LnRhYmxlPC1sZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudApsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudC50YWJsZSRDb3JyZWN0PC1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudC50YWJsZSRBY3R1YWxfU291cmNlKT09YXMuY2hhcmFjdGVyKGxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC5hc3NpZ25tZW50LnRhYmxlJFByZWRpY3RlZF9Tb3VyY2UpKQpsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudC50YWJsZSRJbmRpdmlkdWFsX0NvZGU8LXBhc3RlMChsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudC50YWJsZSRBY3R1YWxfU291cmNlLGxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC5hc3NpZ25tZW50LnRhYmxlJEluZGl2aWR1YWwpCgpsZWF2ZS5vbmUub3V0LnJlc3VsdHMuY29ycmVjdC5hc3NpZ25tZW50LmxtMjwtZ2xtZXIoQ29ycmVjdH5BY3R1YWxfU291cmNlKkNvdl9QcmlvcisoMXxBY3R1YWxfU291cmNlL0luZGl2aWR1YWxfQ29kZSksZGF0YT1sZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudC50YWJsZSxmYW1pbHk9Ymlub21pYWwpCnNzIDwtIGdldE1FKGxlYXZlLm9uZS5vdXQucmVzdWx0cy5jb3JyZWN0LmFzc2lnbm1lbnQubG0yLGMoInRoZXRhIiwiZml4ZWYiKSkKbGVhdmUub25lLm91dC5yZXN1bHRzLmNvcnJlY3QuYXNzaWdubWVudC5sbTwtdXBkYXRlKGxlYXZlLm9uZS5vdXQucmVzdWx0cy5jb3JyZWN0LmFzc2lnbm1lbnQubG0yLHN0YXJ0PXNzLGNvbnRyb2w9Z2xtZXJDb250cm9sKG9wdGltaXplcj0iYm9ieXFhIixvcHRDdHJsPWxpc3QobWF4ZnVuPTJlNCkpKQpBbm92YShsZWF2ZS5vbmUub3V0LnJlc3VsdHMuY29ycmVjdC5hc3NpZ25tZW50LmxtLHR5cGU9MykKYGBgCldlIGZpbmQgdGhhdCBhIGp1dmVuaWxlcydzIGFjdHVhbCBzb3VyY2UgaW50ZXJhY3RzIHdpdGggdGhlIGNvdmFyaWFuY2UgdXNlZCB0byBhZmZlY3QgY29ycmVjdCBjbGFzc2lmaWNhdGlvbnMuCgpXZSBjYW4gdXNlIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IHN1bW1hcmllcyBmb3IgYSBtb3JlIGluLWRlcHRoIGxvb2suCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzdW1tYXJ5KGxlYXZlLm9uZS5vdXQucmVzdWx0cy5jb3JyZWN0LmFzc2lnbm1lbnQubG0pCmBgYApSZWxhdGl2ZSB0byB0aGUgaW50ZXJjZXB0IChyZWZsZWN0aW5nIHRoZSBEQiBzb3VyY2UgYW5kIHVzaW5nIHRoZSBJRCBjby12YXJpYW5jZSBtYXRyaXgpLCBpdCBzZWVtcyB0aGF0LCBnZW5lcmFsbHksIHVzaW5nIHRoZSBJRCBjby12YXJpYW5jZSBtYXRyaXgsIG9yIHRoZSB1bml2ZXJzYWwgY292YXJpYW5jZSBtYXRyaXgsIGdpdmUgYmV0dGVyIGFzc2lnbm1lbnRzIHRoYW4gaW50ZWdyYXRpbmcgc291cmNlIHNwZWNpZmljIGNvdmFyaWFuY2UtbWF0cmljZXMuCgoKIyMgUmVzdWx0cyBieSBDb3ZhcmlhbmNlIE1hdHJpeCBQcmlvcgpJZiB3ZSB3YW50ZWQgdG8gbG9vayBhdCB0aGUgZWZmZWN0IG9mIGRpZmZlcmVudCBjby12YXJpYW5jZSBtYXRyaWNlcyBpbiBtb3JlIGRldGFpbCwgd2UgYWdhaW4gc2VlIHRoYXQsIGdlbmVyYWxseSwgdXNpbmcgdGhlIElEIG9yIFVuaXZlcnNpdHkgY28tdmFyaWFuY2UgbWF0cmljZXMgbGVhZHMgdG8gdGhlIGJlc3QgYXNzaWdubWVudHMuCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTIsIGZpZy53aWR0aD00LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsZWF2ZS5vbmUub3V0LnJlc3VsdHMuY29ycmVjdC5hc3NpZ25tZW50PC1kZHBseShsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudC50YWJsZSwuKENvdl9QcmlvcixBY3R1YWxfU291cmNlKSxzdW1tYXJpemUsQ29ycmVjdGx5X0Fzc2lnbmVkPXN1bShDb3JyZWN0KSxUb3RhbD1sZW5ndGgoQ29ycmVjdCkpCmxlYXZlLm9uZS5vdXQucmVzdWx0cy5jb3JyZWN0LmFzc2lnbm1lbnQkUGVyY2VudF9Db3JyZWN0PC1sZWF2ZS5vbmUub3V0LnJlc3VsdHMuY29ycmVjdC5hc3NpZ25tZW50JENvcnJlY3RseV9Bc3NpZ25lZC9sZWF2ZS5vbmUub3V0LnJlc3VsdHMuY29ycmVjdC5hc3NpZ25tZW50JFRvdGFsCgoKZ2dwbG90KGxlYXZlLm9uZS5vdXQucmVzdWx0cy5jb3JyZWN0LmFzc2lnbm1lbnQsYWVzKHg9QWN0dWFsX1NvdXJjZSx5PVBlcmNlbnRfQ29ycmVjdCxmaWxsPUNvdl9QcmlvcikpKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iixwb3NpdGlvbj0iZG9kZ2UiKSsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lPSJDb3ZhcmlhbmNlIFByaW9yIixicmVha3M9YygiSUQiLCAiU291cmNlX2FuZF9JRCIsIlNvdXJjZV9hbmRfVW5pdmVyc2FsIiwiVW5pdmVyc2FsIiksbGFiZWxzPWMoIklkZW50aXR5IE1hdHJpeCIsICJTb3VyY2UgU3BlY2lmaWMgQ292YXJpYW5jZSxcbnRoZW4gSWRlbnRpdHkgTWF0cmljZXMiLCJTb3VyY2UgU3BlY2lmaWMgQ292YXJpYW5jZSxcbnRoZW4gVW5pdmVyc2FsIENvdmFyaWFuY2UgTWF0cmljZXMiLCJVbml2ZXJzYWwgQ292YXJpYW5jZSBNYXRyaXgiKSkrCiAgeGxhYigiQWN0dWFsIFNvdXJjZSIpKwogIHlsYWIoIlBlcmNlbnQgQ29ycmVjdGx5IEFzc2lnbmVkIikrCiAgdGhlbWVfYncoKQpgYGAKClRha2VuIHRvZ2V0aGVyLCB0aGUgcmVzdWx0cyBzdWdnZXN0IHRoYXQgZm9yIGJlc3QgYXNzaWdubWVudCwgd2Ugc2hvdWxkIHJ1biB0aGUgSU1NIHdpdGggSUQgb3IgdW5pdmVyc2FsIGNvLXZhcmlhbmNlIHByaW9ycywgd2hpY2ggaXMgc29tZXdoYXQgZGlmZmVyZW50IHRoYW4gd2hhdCB0aGUgbGFydmFsIGRhdGEgc3VnZ2VzdGVkICh0aGF0IHVzaW5nIHNvdXJjZS1zcGVjaWZpYyBjb3ZhcmlhbmNlIG1hdHJpY2VzIGlzIGJldHRlcikuIFRha2luZyB0aGVzZSBJTU0gYXNzaWdubWVudHMgYW5kIHByb2plY3RpbmcgdGhlIGNvcnJlY3QgYW5kIGluY29ycmVjdCBhc3NpZ25tZW50cyBvbnRvIHRoZSBQQ0EgZnJvbSBiZWZvcmUsIHdlIHNlZSB0aGF0IHdoZXJlIHRoZXJlIGlzIG11bHRpdmFyaWF0ZSBvdmVybGFwIGluIGdlb2NoZW1pc3RyeSwgaW5kaXZpZHVhbHMgYXJlIG1pc2Fzc2lnbmVkLgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD0yLCBmaWcud2lkdGg9MywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLmFzc2lnbm1lbnQuY29ycmVjdDwtc3Vic2V0KGxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC5hc3NpZ25tZW50LnRhYmxlLENvdl9Qcmlvcj09IlNvdXJjZV9hbmRfVW5pdmVyc2FsIikKbGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLmFzc2lnbm1lbnQuY29ycmVjdCRDb3JyZWN0W3doaWNoKGxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC5hc3NpZ25tZW50LmNvcnJlY3QkQ29ycmVjdD09MSldPC0iQ29ycmVjdCIKbGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLmFzc2lnbm1lbnQuY29ycmVjdCRDb3JyZWN0Wy13aGljaChsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudC5jb3JyZWN0JENvcnJlY3Q9PSJDb3JyZWN0IildPC0iSW5jb3JyZWN0IgoKCklDUE1TLmFsbC4yMDE1Lmp1dmRhdC5lbnYyPC1JQ1BNUy5hbGwuMjAxNS5qdXZkYXQuZW52CklDUE1TLmFsbC4yMDE1Lmp1dmRhdC5lbnYyJENvcnJlY3Q8LWZhY3RvcihsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudC5jb3JyZWN0JENvcnJlY3QpCgphdXRvcGxvdChwcmNvbXAoSUNQTVMuYWxsLjIwMTUuanV2ZGF0LnZhbC50cmFucyksIAogICAgICAgICBkYXRhID0gSUNQTVMuYWxsLjIwMTUuanV2ZGF0LmVudjIsIAogICAgICAgICBjb2xvdXIgPSAiU2l0ZSIsCiAgICAgICAgIHNoYXBlPSJDb3JyZWN0IiwKICAgICAgICAgbG9hZGluZ3MgPSBUUlVFLAogICAgICAgICBsb2FkaW5ncy5sYWJlbCA9IFRSVUUsCiAgICAgICAgIGZyYW1lID0gVFJVRSwgCiAgICAgICAgIGZyYW1lLnR5cGUgPSAnbm9ybScpKwogIHRoZW1lX2J3KCkKYGBgCgpPdmVyYWxsLCB3ZSBsZWFybiB0aGF0IElEIG9yIHVuaXZlcnNhbCBjby12YXJpYW5jZSBtYXRyaWNlcyBwcm9kdWNlIGJldHRlciBJTU0gcmVzdWx0cyB3aGVuIGFzc2lnbmluZyBqdXZlbmlsZXMsIGFuZCB0aGF0IElNTSBtaXNjbGFzc2lmaWNhdGlvbnMgYXJlIG1vc3RseSBjb25maW5lZCB0byB0aGUgbXV0aXZhcmlhdGUgb3ZlcmxhcCBpbiBnZW9jaGVtaXN0cnku