The Takeaway Assets Data TEST (do not delete)

eyJjc3MiOiAiLypcbiAgVGhlIFRha2Vhd2F5IC0gd2lkZ2V0IHN0eWxlcy5cblxuICBTb3VyY2Ugb2YgdHJ1dGggbGl2ZXMgaGVyZSwgTk9UIGluIENvcm5lcnN0b25lLiBQdWJsaXNoZWQgKGJhc2U2NC1lbmNvZGVkLFxuICBidW5kbGVkIHdpdGggdGhlIEpTKSB0byBpdHMgb3duIHVubGlzdGVkIFdvcmRQcmVzcyBkYXRhIHBhZ2UgdmlhXG4gIHRoZV90YWtlYXdheV9wdWJsaXNoLnB5LCBhbmQgZmV0Y2hlZC9pbmplY3RlZCBhdCBydW50aW1lIGJ5IHRoZSB0aW55IHN0dWJcbiAgKHRoZS10YWtlYXdheS1zdHViLmh0bWwpIHRoYXQncyB0aGUgb25seSB0aGluZyBhY3R1YWxseSBwYXN0ZWQgaW50b1xuICBDb3JuZXJzdG9uZS4gRWRpdCB0aGlzIGZpbGUgKyByZS1ydW4gdGhlIHB1Ymxpc2ggc2NyaXB0IHRvIHNoaXAgY2hhbmdlcy5cblxuICAyMDI2LTA4LTAzIHJlZGVzaWduIGFnYWluc3QgdGhlIENsYXVkZSBEZXNpZ24gXCJDYW1wcyBSZXNvdXJjZXMgSHViXCIgY29tcC5cbiAgQ29sb3JzL2ZvbnRzIG1hdGNoIHRoYXQgY29tcCdzIG93biBXT0wgZGVzaWduLXN5c3RlbSB0b2tlbnMgZXhhY3RseVxuICAoY29uZmlybWVkIGFnYWluc3QgX2RzLy4uLi9jb2xvcnNfYW5kX3R5cGUuY3NzKSAtIHRoZSBsaXZlIHNpdGUgZG9lc24ndFxuICBleHBvc2UgdGhlc2UgYXMgQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzIGdsb2JhbGx5LCBzbyB2YWx1ZXMgYXJlIGhhcmRjb2RlZFxuICBoZXJlIHJhdGhlciB0aGFuIGFzc3VtaW5nIGB2YXIoLS13b2wtZGFyay1ibHVlKWAgZXRjLiBleGlzdCBwYWdlLXdpZGUuXG4gIFRoZSBjb21wJ3MgY29uZGVuc2VkIGxpY2Vuc2VkIGRpc3BsYXkgZm9udCAoXCJIZWx2ZXRpY2EgTmV1ZSBMVCBTdGQgQ25cIilcbiAgaXNuJ3QgaG9zdGVkIG9uIHRoaXMgc2l0ZSAtIHRoZSBoZXJvIGhlYWRsaW5lIHVzZXMgYSBjb25kZW5zZWQgc3lzdGVtLWZvbnRcbiAgZmFsbGJhY2sgc3RhY2sgaW5zdGVhZCByYXRoZXIgdGhhbiByZWRpc3RyaWJ1dGluZyBXT0wncyBsaWNlbnNlZCBmb250XG4gIGZpbGVzIGludG8gdGhpcyB3aWRnZXQuXG4qL1xuXG4jdHRhLWFwcCB7XG4gIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFwiSGVsdmV0aWNhIE5ldWVcIiwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGNvbG9yOiAjNDE0MDQyO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuI3R0YS1hcHAgKiwgI3R0YS1hcHAgKjo6YmVmb3JlLCAjdHRhLWFwcCAqOjphZnRlciB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi50dGEtY29udGFpbmVyIHtcbiAgbWF4LXdpZHRoOiAxMTYwcHg7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBwYWRkaW5nOiAwIDE2cHg7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA2NDBweCkge1xuICAudHRhLWNvbnRhaW5lciB7IHBhZGRpbmc6IDAgMjRweDsgfVxufVxuXG4vKiAtLS0tIEhlcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnR0YS1oZXJvIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtaW4taGVpZ2h0OiA1NjBweDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sb3I6ICNmZmY7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIC8qIEZ1bGwtYmxlZWQgYnJlYWstb3V0OiB0aGUgQ29ybmVyc3RvbmUgcm93IHRoaXMgd2lkZ2V0IGxpdmVzIGluIGlzIGFcbiAgICAgYm94ZWQgKG1heC13aWR0aDogMTIwMHB4KSBjb250YWluZXIsIG5vdCBhIHRydWUgZnVsbC13aWR0aCBvbmUgLVxuICAgICBjb25maXJtZWQgbGl2ZSAyMDI2LTA4LTAzICh0aGUgcm93J3Mgb3duIGNsYXNzIGlzIGxpdGVyYWxseVxuICAgICBcIngtY29udGFpbmVyIG1heCB3aWR0aFwiKS4gUmF0aGVyIHRoYW4gcmUtb3BlbmluZyBDb3JuZXJzdG9uZSB0b1xuICAgICBjaGFuZ2UgdGhlIHJvdydzIHdpZHRoIHNldHRpbmcgKHRvdWNoaW5nIHRoZSBSYXcgQ29udGVudCBlbGVtZW50XG4gICAgIHJpc2tzIHJlLXRyaWdnZXJpbmcgdGhlIGRvY3VtZW50ZWQgW2NzX2NvbnRlbnRfc2VvXSBsZWFrIGJ1ZyksIGJyZWFrXG4gICAgIHRoZSBoZXJvIG91dCBvZiB3aGF0ZXZlciBhbmNlc3RvciB3aWR0aCBjb25zdHJhaW50IGV4aXN0cyB2aWEgdGhlXG4gICAgIHN0YW5kYXJkIDEwMHZ3L25lZ2F0aXZlLW1hcmdpbiBmdWxsLWJsZWVkIHRlY2huaXF1ZS4gU2VsZi1jb250YWluZWRcbiAgICAgaW4gdGhpcyBzdHlsZXNoZWV0LCByb2J1c3QgcmVnYXJkbGVzcyBvZiB0aGUgY29udGFpbmVyJ3MgYWN0dWFsIHdpZHRoLiAqL1xuICB3aWR0aDogMTAwdnc7XG4gIGxlZnQ6IDUwJTtcbiAgcmlnaHQ6IDUwJTtcbiAgbWFyZ2luLWxlZnQ6IC01MHZ3O1xuICBtYXJnaW4tcmlnaHQ6IC01MHZ3O1xufVxuXG4vKiBUaGUgQ29ybmVyc3RvbmUgc2VjdGlvbiB3cmFwcGluZyB0aGlzIHdpZGdldCBjYXJyaWVzIGl0cyBvd24gZGVmYXVsdFxuICAgMTIwcHggdG9wIHBhZGRpbmcgLSBpbnZpc2libGUgd2hlbiB0aGUgaGVybyB3YXMgYm94ZWQvY2VudGVyZWQsIGJ1dCBhXG4gICBzdGFyayB3aGl0ZSBnYXAgbm93IHRoYXQgdGhlIGhlcm8gaXMgZnVsbC1ibGVlZCBhYm92ZS4gWmVybyBpdCBvdXRcbiAgIHNwZWNpZmljYWxseSBmb3IgdGhlIHNlY3Rpb24gY29udGFpbmluZyBvdXIgaGVybyAoOmhhcygpIGtlZXBzIHRoaXMgZnJvbVxuICAgdG91Y2hpbmcgYW55IG90aGVyIHNlY3Rpb24gb24gdGhlIHNpdGUpIHJhdGhlciB0aGFuIHJlb3BlbmluZyBDb3JuZXJzdG9uZSxcbiAgIGZvciB0aGUgc2FtZSBbY3NfY29udGVudF9zZW9dIGxlYWstYnVnIHJlYXNvbiBhcyB0aGUgZnVsbC1ibGVlZCBmaXggYWJvdmUuXG4gICBDb25maXJtZWQgbGl2ZSAyMDI2LTA4LTA0LiAqL1xuLngtc2VjdGlvbjpoYXMoI3R0YS1oZXJvKSB7XG4gIHBhZGRpbmctdG9wOiAwICFpbXBvcnRhbnQ7XG4gIC8qIHBhZGRpbmctYm90dG9tIGxlZnQgYWxvbmUgb24gMjAyNi0wOC0wMyBvbiB0aGUgYXNzdW1wdGlvbiBpdCB3b3VsZG4ndFxuICAgICBtYXR0ZXIgLSB3cm9uZy4gQ29uZmlybWVkIDIwMjYtMDgtMDQgKEpvaG4gY2F1Z2h0IGl0IGxpdmUpOiBpdCBsZWF2ZXMgYVxuICAgICAxMjhweCB3aGl0ZSBnYXAgYmV0d2VlbiB0aGUgbmV3c2xldHRlciBtb2R1bGUgYW5kIHRoZSByZWFsIHNpdGUgZm9vdGVyLFxuICAgICBzYW1lIG1lY2hhbmlzbSBhcyB0aGUgdG9wLXBhZGRpbmcgaGVybyBnYXAuIFplcm8gaXQgdG9vLiAqL1xuICBwYWRkaW5nLWJvdHRvbTogMCAhaW1wb3J0YW50O1xufVxuXG4vKiBVbmNvbmRpdGlvbmFsIGBkaXNwbGF5YCBoZXJlIHdvdWxkIG92ZXJyaWRlIHRoZSBbaGlkZGVuXSBhdHRyaWJ1dGUgYXRcbiAgIGVxdWFsIHNwZWNpZmljaXR5IChjb25maXJtZWQgdGhlIGhhcmQgd2F5IG9uY2UgYWxyZWFkeSBvblxuICAgLnR0YS10cmFuc2NyaXB0LWJvZHkpIC0gZ3VhcmQgaXQgc28gc2hvd0RldGFpbCgpJ3MgaGVyby5oaWRkZW49dHJ1ZVxuICAgYWN0dWFsbHkgaGlkZXMgdGhlIGhlcm8gaW5zdGVhZCBvZiBqdXN0IHRvZ2dsaW5nIHRoZSBhdHRyaWJ1dGUuICovXG4udHRhLWhlcm86bm90KFtoaWRkZW5dKSB7XG4gIGRpc3BsYXk6IGZsZXg7XG59XG5cbi50dGEtaGVyby1iZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIGJhY2tncm91bmQtc2l6ZTogY292ZXI7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gIC8qIEZvY2FsIHBvaW50IHR1bmVkIHNvIHRoZSBzcGVha2VyJ3MgaGVhZC90b3JzbyBzdGF5IHZpc2libGUgcmVnYXJkbGVzc1xuICAgICBvZiB2aWV3cG9ydCB3aWR0aCAtIGJhY2tncm91bmQtc2l6ZTpjb3ZlciBjcm9wcyByZXNwb25zaXZlbHkgYXJvdW5kXG4gICAgIHRoaXMgYW5jaG9yIGluc3RlYWQgb2YgYSBmaXhlZCBwaXhlbCBjcm9wLiAqL1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA3MCUgMjQlO1xufVxuXG4udHRhLWhlcm8tdGludCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgNzksIDEwNCwgMC43OCk7XG59XG5cbi50dGEtaGVyby1pbm5lciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWF4LXdpZHRoOiAxMTYwcHg7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXJnaW46IDAgYXV0bztcbiAgcGFkZGluZzogODhweCAyNHB4IDcycHg7XG59XG5cbi50dGEtaGVyby1leWVicm93IHtcbiAgY29sb3I6ICNmZmY7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGxldHRlci1zcGFjaW5nOiAwLjE4ZW07XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3BhY2l0eTogMC45O1xuICBtYXJnaW46IDAgMCAxNHB4O1xufVxuXG4udHRhLWhlcm8tdGl0bGUge1xuICBjb2xvcjogI2ZmZjtcbiAgZm9udC1mYW1pbHk6IFwiQXJpYWwgTmFycm93XCIsIFwiSGVsdmV0aWNhIE5ldWUgQ29uZGVuc2VkXCIsIFwiSGVsdmV0aWNhIE5ldWVcIiwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGZvbnQtd2VpZ2h0OiA4MDA7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGZvbnQtc2l6ZTogY2xhbXAoNDBweCwgNnZ3LCA3MnB4KTtcbiAgbGluZS1oZWlnaHQ6IDAuOTg7XG4gIG1hcmdpbjogMCAwIDIwcHg7XG4gIG1heC13aWR0aDogODIwcHg7XG4gIGxldHRlci1zcGFjaW5nOiAwLjAxZW07XG59XG5cbi50dGEtaGVyby1zdWJ0aXRsZSB7XG4gIGNvbG9yOiAjZmZmO1xuICBmb250LXdlaWdodDogMzAwO1xuICBmb250LXNpemU6IGNsYW1wKDE3cHgsIDJ2dywgMjBweCk7XG4gIGxpbmUtaGVpZ2h0OiAxLjU7XG4gIG1heC13aWR0aDogNjQwcHg7XG4gIG1hcmdpbjogMDtcbn1cblxuLyogLS0tLSBGaWx0ZXIgYmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnR0YS1maWx0ZXJzIHtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNmU3ZTg7XG4gIGJhY2tncm91bmQ6ICNmZmY7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIHRvcDogMDtcbiAgei1pbmRleDogMjA7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgZ2FwOiAxNHB4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBwYWRkaW5nOiAxOHB4IDE2cHg7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA2NDBweCkge1xuICAudHRhLWZpbHRlcnMgeyBwYWRkaW5nOiAxOHB4IDI0cHg7IH1cbn1cblxuLnR0YS1maWx0ZXJzLWxhYmVsIHtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjb2xvcjogIzZkNmU3MTsgLyogd2FzICM5Mzk1OTggLSBmYWlsZWQgV0NBRyBBQSA0LjU6MSBvbiB3aGl0ZSAofjMuMDoxKTsgZGFya2VuZWQgMjAyNi0wOC0wOCAqL1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICBsZXR0ZXItc3BhY2luZzogMC4wNmVtO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4udHRhLWZpbHRlcnMgc2VsZWN0LFxuLnR0YS1maWx0ZXJzIGlucHV0W3R5cGU9XCJzZWFyY2hcIl0ge1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIHBhZGRpbmc6IDEwcHggMTRweDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2U2ZTdlODtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICBjb2xvcjogIzQxNDA0MjtcbiAgbWluLWhlaWdodDogNDRweDtcbn1cblxuLnR0YS1maWx0ZXJzIHNlbGVjdCB7XG4gIGZsZXg6IDAgMCBhdXRvO1xufVxuXG4udHRhLWZpbHRlcnMgaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gIGZsZXg6IDEgMSAyMDBweDtcbiAgbWluLXdpZHRoOiAwO1xuICBmb250LXdlaWdodDogNDAwO1xuICBmb250LXNpemU6IDE2cHg7IC8qIHByZXZlbnRzIGlPUyBhdXRvLXpvb20gb24gZm9jdXMgKi9cbn1cblxuLyogRm9jdXMgaW5kaWNhdG9ycyAoMjAyNi0wOC0wOCBjb250cmFzdCBwYXNzKTogIzczRDFGNSBvbiB3aGl0ZSBpcyB+MS43OjEgLVxuICAgYmVsb3cgdGhlIDM6MSBXQ0FHIG5vbi10ZXh0IG1pbmltdW0sIHNvIGtleWJvYXJkIGZvY3VzIHdhcyBuZWFybHlcbiAgIGludmlzaWJsZSBvbiBldmVyeSBsaWdodCBzdXJmYWNlLiBEYXJrIGJsdWUgb24gbGlnaHQgc3VyZmFjZXM7IHRoZSBsaWdodFxuICAgYmx1ZSBzdXJ2aXZlcyBvbmx5IG9uIGRhcmsgc3VyZmFjZXMgKG5ld3NsZXR0ZXIsIHZpZGVvIGZhY2FkZSwgY2FtcFxuICAgY2FyZHMpIHdoZXJlIGl0IGFjdHVhbGx5IGNvbnRyYXN0cy4gKi9cbi50dGEtZmlsdGVycyBzZWxlY3Q6Zm9jdXMsXG4udHRhLWZpbHRlcnMgaW5wdXRbdHlwZT1cInNlYXJjaFwiXTpmb2N1cyB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCAjMDA0ZjY4O1xuICBvdXRsaW5lLW9mZnNldDogMXB4O1xufVxuXG4udHRhLXNlZS1hbGw6Zm9jdXMtdmlzaWJsZSxcbi50dGEtYnJlYWRjcnVtYiBidXR0b246Zm9jdXMtdmlzaWJsZSxcbi50dGEtYWN0aW9uYnRuOmZvY3VzLXZpc2libGUsXG4udHRhLXBpbGxidG46Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCAjMDA0ZjY4O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxuXG4udHRhLW5ld3NsZXR0ZXItZm9ybSBpbnB1dDpmb2N1cy12aXNpYmxlLFxuLnR0YS1uZXdzbGV0dGVyLWZvcm0gYnV0dG9uOmZvY3VzLXZpc2libGUsXG4udHRhLXZpZGVvLWZhY2FkZTpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkICM3M0QxRjU7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XG5cbi50dGEtc29ydC1ncm91cCB7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IDEwcHg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi8qIE1vYmlsZSBmaWx0ZXIgYmFyICgyMDI2LTA4LTA4IFVYIHBhc3MpOiBzaXggd3JhcHBlZCBjb250cm9scyBtYWRlIHRoZVxuICAgc3RpY2t5IGJhciBlYXQgYSB0aGlyZCBvZiBhIHBob25lIHZpZXdwb3J0IG9uIGV2ZXJ5IHNjcm9sbC4gQmVsb3cgNjQwcHhcbiAgIHRoZSBiYXIgYmVjb21lcyBPTkUgaG9yaXpvbnRhbGx5LXNjcm9sbGFibGUgcm93IC0gc3RpbGwgc3RpY2t5LCB+NzBweFxuICAgdGFsbCwgd2l0aCB0aGUgbmV4dCBjb250cm9sIHBlZWtpbmcgaW4gZnJvbSB0aGUgZWRnZSBhcyB0aGUgc2Nyb2xsXG4gICBhZmZvcmRhbmNlLiBTZWxlY3RzIGFsc28gYnVtcCB0byAxNnB4IGhlcmU6IGlPUyBhdXRvLXpvb21zIG9uIGZvY3VzIGZvclxuICAgYW55IGZvcm0gY29udHJvbCBiZWxvdyAxNnB4ICh0aGUgc2VhcmNoIGlucHV0IGFscmVhZHkgaGFkIHRoaXMgZml4O1xuICAgc2VsZWN0cyBkaWRuJ3QpLiAqL1xuQG1lZGlhIChtYXgtd2lkdGg6IDYzOXB4KSB7XG4gIC50dGEtZmlsdGVycyB7XG4gICAgZmxleC13cmFwOiBub3dyYXA7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7XG4gICAgZ2FwOiAxMHB4O1xuICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjtcbiAgfVxuICAudHRhLWZpbHRlcnMgc2VsZWN0IHtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gICAgZmxleDogMCAwIGF1dG87XG4gIH1cbiAgLnR0YS1maWx0ZXJzIGlucHV0W3R5cGU9XCJzZWFyY2hcIl0ge1xuICAgIGZsZXg6IDAgMCAyMjBweDtcbiAgfVxuICAudHRhLXNvcnQtZ3JvdXAge1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIGZsZXg6IDAgMCBhdXRvO1xuICB9XG59XG5cbi50dGEtcmVzdWx0LWNvdW50IHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBjb2xvcjogIzZkNmU3MTsgLyogd2FzICM5Mzk1OTggLSBmYWlsZWQgV0NBRyBBQSA0LjU6MSBvbiB3aGl0ZSAofjMuMDoxKTsgZGFya2VuZWQgMjAyNi0wOC0wOCAqL1xuICBtYXJnaW46IDI0cHggMCAyMHB4O1xufVxuXG4vKiAtLS0tIFRhZ3MgLyBwaWxscyBzaGFyZWQgYWNyb3NzIGNhcmRzICsgZGV0YWlsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnR0YS10YWctcm93IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiA4cHg7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgbWFyZ2luLWJvdHRvbTogMTJweDtcbn1cblxuLnR0YS10YWcge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDhlbTtcbiAgcGFkZGluZzogNXB4IDEycHg7XG4gIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xufVxuXG4udHRhLXRhZy0tY2FtcCB7XG4gIGJhY2tncm91bmQ6ICMwMDRmNjg7XG4gIGNvbG9yOiAjZmZmO1xufVxuXG4udHRhLXRhZy0tc2VyaWVzIHtcbiAgYmFja2dyb3VuZDogI2U2ZTdlODtcbiAgY29sb3I6ICM0MTQwNDI7XG59XG5cbi50dGEtdG9waWMtcGlsbCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogIzQxNDA0MjtcbiAgYmFja2dyb3VuZDogI2Y3ZjhmODtcbiAgYm9yZGVyOiAxcHggc29saWQgI2U2ZTdlODtcbiAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gIHBhZGRpbmc6IDNweCAxMHB4O1xuICBtYXJnaW46IDAgNnB4IDZweCAwO1xufVxuXG4udHRhLWNhcmQtdG9waWNzLFxuLnR0YS1kZXRhaWwtdG9waWNzIHtcbiAgbWFyZ2luOiA4cHggMCAwO1xufVxuXG4udHRhLXdhdGNoLWxpbmsge1xuICBmb250LXdlaWdodDogNzAwO1xuICBmb250LXNpemU6IDEzcHg7XG4gIGNvbG9yOiAjMDA0ZjY4O1xuICBtYXJnaW4tdG9wOiA0cHg7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLyogLS0tLSBQbGF5IGJhZGdlIChzaGFyZWQgYnkgZmVhdHVyZWQvc2VyaWVzL2dyaWQgdGh1bWJzKSAtLS0tLS0tLS0tLS0tLS0tICovXG5cbi50dGEtcGxheS1iYWRnZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLnR0YS1wbGF5LWJhZGdlIHNwYW4ge1xuICB3aWR0aDogNDRweDtcbiAgaGVpZ2h0OiA0NHB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbi50dGEtcGxheS1iYWRnZSBzcGFuOjphZnRlciB7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIHdpZHRoOiAwO1xuICBoZWlnaHQ6IDA7XG4gIGJvcmRlci10b3A6IDhweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLWJvdHRvbTogOHB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItbGVmdDogMTNweCBzb2xpZCAjZmZmO1xuICBtYXJnaW4tbGVmdDogM3B4O1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLnR0YS1wbGF5LWJhZGdlLS1sZyBzcGFuIHtcbiAgd2lkdGg6IDY0cHg7XG4gIGhlaWdodDogNjRweDtcbn1cblxuLnR0YS1wbGF5LWJhZGdlLS1sZyBzcGFuOjphZnRlciB7XG4gIGJvcmRlci10b3Atd2lkdGg6IDEycHg7XG4gIGJvcmRlci1ib3R0b20td2lkdGg6IDEycHg7XG4gIGJvcmRlci1sZWZ0LXdpZHRoOiAyMHB4O1xuICBtYXJnaW4tbGVmdDogNXB4O1xufVxuXG4vKiBSZW5hbWVkIGZyb20gLnR0YS1uZXdlc3QtYmFkZ2UgMjAyNi0wOC0wOTogdGhlIGZlYXR1cmVkIHNsb3Qgcm90YXRlc1xuICAgZGFpbHkgbm93IChzZWUgdGhlLXRha2Vhd2F5LmpzIGxvYWRSb3RhdGluZ0ZlYXR1cmVkKSwgc28gXCJOZXdlc3RcIiB3b3VsZFxuICAgYmUgZGlzaG9uZXN0IC0gdGhlIGJhZGdlIHNheXMgXCJGZWF0dXJlZFwiLiAqL1xuLnR0YS1mZWF0dXJlZC1iYWRnZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAxNnB4O1xuICBsZWZ0OiAxNnB4O1xuICBiYWNrZ3JvdW5kOiAjNzNEMUY1O1xuICBjb2xvcjogIzAwNGY2ODsgLyogd2FzICNmZmYgLSB+MS43OjEgb24gdGhlIGxpZ2h0LWJsdWUgYmFkZ2UsIGVmZmVjdGl2ZWx5IHVucmVhZGFibGU7IGRhcmsgYmx1ZSBoaXRzIH41Ljg6MSAoMjAyNi0wOC0wOCkuIFNhbWUgcGFpcmluZyB0aGUgbmV3c2xldHRlciBidXR0b24gYWxyZWFkeSB1c2VkLiAqL1xuICBmb250LXdlaWdodDogNzAwO1xuICBmb250LXNpemU6IDExcHg7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGxldHRlci1zcGFjaW5nOiAwLjA4ZW07XG4gIHBhZGRpbmc6IDVweCAxMnB4O1xuICBib3JkZXItcmFkaXVzOiA5OTlweDtcbn1cblxuLyogLS0tLSBDYXJkIGxpbmtzIChzaGFyZWQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLyogRmVhdHVyZWQvZ3JpZC9zZXJpZXMgY2FyZHMgYmVjYW1lIHJlYWwgPGE+IGVsZW1lbnRzIDIwMjYtMDgtMDggKHdlcmVcbiAgIDxidXR0b24+cyAtIGludmFsaWQgSFRNTCBhcm91bmQgaGVhZGluZ3MsIG5vIG1pZGRsZS1jbGljaywgbm8gY3Jhd2xhYmxlXG4gICBsaW5rcykuIFRoZSB0aGVtZSBzdHlsZXMgYmFyZSBsaW5rcyBzaXRlLXdpZGUsIHNvIHBpbiBjb2xvciBhbmRcbiAgIGRlY29yYXRpb24gYWNyb3NzIGV2ZXJ5IGxpbmsgc3RhdGUgLSBgY29sb3I6IGluaGVyaXRgIG9uIHRoZSBlbGVtZW50XG4gICBhbG9uZSBsb3NlcyB0byB0aGUgdGhlbWUncyBhOmhvdmVyIHJ1bGVzIG90aGVyd2lzZS4gKi9cbi50dGEtZmVhdHVyZWQsIC50dGEtZmVhdHVyZWQ6bGluaywgLnR0YS1mZWF0dXJlZDp2aXNpdGVkLCAudHRhLWZlYXR1cmVkOmhvdmVyLCAudHRhLWZlYXR1cmVkOmFjdGl2ZSxcbi50dGEtY2FyZCwgLnR0YS1jYXJkOmxpbmssIC50dGEtY2FyZDp2aXNpdGVkLCAudHRhLWNhcmQ6aG92ZXIsIC50dGEtY2FyZDphY3RpdmUsXG4udHRhLXNlcmllcy1jYXJkLCAudHRhLXNlcmllcy1jYXJkOmxpbmssIC50dGEtc2VyaWVzLWNhcmQ6dmlzaXRlZCwgLnR0YS1zZXJpZXMtY2FyZDpob3ZlciwgLnR0YS1zZXJpZXMtY2FyZDphY3RpdmUge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiAjNDE0MDQyO1xufVxuXG4vKiAtLS0tIEZlYXR1cmVkIHRhbGsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnR0YS1mZWF0dXJlZCB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyO1xuICB3aWR0aDogMTAwJTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgYmFja2dyb3VuZDogI2ZmZjtcbiAgYm9yZGVyOiBub25lO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJveC1zaGFkb3c6IDAgOHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjE0KTtcbiAgbWFyZ2luOiAwIDAgNTZweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwYWRkaW5nOiAwO1xuICBmb250OiBpbmhlcml0O1xuICBjb2xvcjogaW5oZXJpdDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDgwMHB4KSB7XG4gIC50dGEtZmVhdHVyZWQgeyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDEuMmZyIDFmcjsgYWxpZ24taXRlbXM6IHN0cmV0Y2g7IH1cbn1cblxuLnR0YS1mZWF0dXJlZC10aHVtYiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGFzcGVjdC1yYXRpbzogMTYgLyA5O1xuICBiYWNrZ3JvdW5kOiAjMDAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICAvKiBHcmlkIGl0ZW1zIGRlZmF1bHQgdG8gbWluLXdpZHRoOmF1dG8vbWluLWhlaWdodDphdXRvLCB3aGljaCBsZXRzIGFcbiAgICAgY2hpbGQgd2l0aCBpbnRyaW5zaWMgc2l6aW5nICh0aGlzIDxpbWc+LCBuYXR1cmFsIDE5MjB4MTA4MCkgcmVmdXNlIHRvXG4gICAgIHNocmluayBiZWxvdyBpdHMgb3duIGNvbnRlbnQgc2l6ZSAtIG92ZXJyaWRpbmcgdGhlIDEuMmZyIGdyaWQgdHJhY2tcbiAgICAgYW5kIHNwaWxsaW5nIGludG8gdGhlIGJvZHkgY29sdW1uIG5leHQgdG8gaXQuIENvbmZpcm1lZCBsaXZlXG4gICAgIDIwMjYtMDgtMDMgKHRodW1iIHJlbmRlcmVkIHdpZGVyL3RhbGxlciB0aGFuIGl0cyBvd24gZ3JpZCBjZWxsKS5cbiAgICAgbWluLXdpZHRoL21pbi1oZWlnaHQ6IDAgaXMgdGhlIHN0YW5kYXJkIGZpeC4gKi9cbiAgbWluLXdpZHRoOiAwO1xuICBtaW4taGVpZ2h0OiAwO1xufVxuLyogQSBzZWNvbmQsIGRpc3RpbmN0IG92ZXJmbG93IGZvdW5kIDIwMjYtMDgtMDQ6IHdpdGggYGFsaWduLWl0ZW1zOiBzdHJldGNoYFxuICAgZ2l2aW5nIHRoaXMgZ3JpZCBpdGVtIGEgZGVmaW5pdGUgaGVpZ2h0IGFuZCBubyBleHBsaWNpdCB3aWR0aCwgdGhlXG4gICBgYXNwZWN0LXJhdGlvYCByZXNvbHZlcyB3aWR0aCBGUk9NIHRoYXQgc3RyZXRjaGVkIGhlaWdodCAoMzkwLjdweCB0YWxsIHhcbiAgIDE2LzkgPSA2OTQuNnB4IHdpZGUpIGluc3RlYWQgb2YgZnJvbSB0aGUgMS4yZnIgZ3JpZCB0cmFjayAoNTAxLjhweCkgLVxuICAgY29uZmlybWVkIGxpdmUgdmlhIG1lYXN1cmVtZW50LCBleGFjdCBtYXRoIG1hdGNoLiBgd2lkdGg6IDEwMCVgIGFib3ZlXG4gICBwaW5zIGl0IHRvIHRoZSB0cmFjayBzbyBhc3BlY3QtcmF0aW8gb25seSBldmVyIGRlcml2ZXMgaGVpZ2h0LCBuZXZlclxuICAgd2lkdGgsIHJlbW92aW5nIHRoZSBhbWJpZ3VpdHkuICovXG5cbi50dGEtZmVhdHVyZWQtdGh1bWIgaW1nIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgb2JqZWN0LWZpdDogY292ZXI7XG4gIG9iamVjdC1wb3NpdGlvbjogbGVmdCBjZW50ZXI7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuLyogb2JqZWN0LXBvc2l0aW9uOiBsZWZ0IGNlbnRlciAoZm91bmQgMjAyNi0wOC0wNSkgLSBiZWNhdXNlIGFsaWduLWl0ZW1zOlxuICAgc3RyZXRjaCAoYWJvdmUpIG1ha2VzIHRoaXMgYm94IHRhbGxlciByZWxhdGl2ZSB0byBpdHMgd2lkdGggdGhhbiB0aGVcbiAgIGltYWdlJ3MgcmVhbCAxNjo5LCBvYmplY3QtZml0OmNvdmVyIG11c3QgY3JvcCBzb21lIHdpZHRoIHRvIGZpbGwgaXQuXG4gICBFdmVyeSB0YWxrJ3MgdGh1bWJuYWlsIGhhcyBhIGJ1cm5lZC1pbiBzcGVha2VyLW5hbWUvdGl0bGUgYmFyIGFuY2hvcmVkIHRvXG4gICB0aGUgbGVmdCBlZGdlICh0aHVtYl90aXRsZXIucHkpIC0gYSBjZW50ZXJlZCBjcm9wICh0aGUgb2JqZWN0LXBvc2l0aW9uXG4gICBkZWZhdWx0KSBjbGlwcyBpdCBzeW1tZXRyaWNhbGx5LCBjdXR0aW5nIHRoZSBsZWFkaW5nIGxldHRlciBvZiB0aGUgdGl0bGVcbiAgIHRleHQgc3BlY2lmaWNhbGx5IGJlY2F1c2UgdGhhdCdzIHdoYXQgc2l0cyBhdCB0aGUgZWRnZSwgd2hpbGUgdGhlIHJpZ2h0XG4gICBzaWRlIGNyb3BzIGVtcHR5IGJhY2tncm91bmQuIEFuY2hvcmluZyBsZWZ0IGtlZXBzIHRoZSBmdWxsIHRleHQgaW50YWN0XG4gICByZWdhcmRsZXNzIG9mIGV4YWN0bHkgaG93IG11Y2ggdGhlIHN0cmV0Y2ggZW5kcyB1cCBjcm9wcGluZy4gU2FtZVxuICAgdGVjaG5pcXVlIGFscmVhZHkgdXNlZCBmb3IgdGhlIGhlcm8gcGhvdG8ncyBiYWNrZ3JvdW5kLXBvc2l0aW9uLiAqL1xuXG4udHRhLWZlYXR1cmVkLWJvZHkge1xuICBwYWRkaW5nOiAzMnB4IDI4cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBnYXA6IDEwcHg7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA2NDBweCkge1xuICAudHRhLWZlYXR1cmVkLWJvZHkgeyBwYWRkaW5nOiA0MHB4IDQ0cHg7IH1cbn1cblxuLnR0YS1mZWF0dXJlZC10aXRsZSB7XG4gIG1hcmdpbjogMDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgZm9udC1zaXplOiBjbGFtcCgyNHB4LCAzdncsIDM0cHgpO1xuICBjb2xvcjogIzQxNDA0MjtcbiAgbGluZS1oZWlnaHQ6IDEuMTtcbn1cblxuLnR0YS1mZWF0dXJlZC1tZXRhIHtcbiAgbWFyZ2luOiAwO1xuICBmb250LXNpemU6IDE1cHg7XG4gIGNvbG9yOiAjNmQ2ZTcxOyAvKiB3YXMgIzkzOTU5OCAtIGZhaWxlZCBXQ0FHIEFBIDQuNToxIG9uIHdoaXRlICh+My4wOjEpOyBkYXJrZW5lZCAyMDI2LTA4LTA4ICovXG59XG5cbi50dGEtZmVhdHVyZWQtZXhjZXJwdCB7XG4gIG1hcmdpbjogMDtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBsaW5lLWhlaWdodDogMS41NTtcbiAgY29sb3I6ICM0MTQwNDI7XG59XG5cbi8qIC0tLS0gU2VjdGlvbiBoZWFkaW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnR0YS1zZWN0aW9uLWhlYWRpbmcsXG4udHRhLXNwZWFrZXItc2VjdGlvbiBoMixcbi50dGEtY2FtcC1zZWN0aW9uIGgyIHtcbiAgbWFyZ2luOiAwIDAgMThweDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgZm9udC1zaXplOiAyMnB4O1xuICBjb2xvcjogIzQxNDA0MjtcbiAgc2Nyb2xsLW1hcmdpbi10b3A6IDkwcHg7XG59XG5cbi8qIFNlcmllcy1yb3cgbmFtZXMgZGVtb3RlZCB0byBoMyAyMDI2LTA4LTA5ICh0aGV5IG5vdyBzaXQgdW5kZXIgYVxuICAgXCJGZWF0dXJlZCBTZXJpZXNcIiBoMiBzZWN0aW9uIGhlYWRpbmcpIC0gdmlzdWFsbHkgb25lIHN0ZXAgc21hbGxlciB0aGFuXG4gICB0aGUgc2VjdGlvbiBoZWFkaW5nIHNvIHRoZSBoaWVyYXJjaHkgcmVhZHMuICovXG4udHRhLXNlcmllcy1oZWFkIGgzIHtcbiAgbWFyZ2luOiAwIDAgMThweDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgZm9udC1zaXplOiAxOXB4O1xuICBjb2xvcjogIzQxNDA0MjtcbiAgc2Nyb2xsLW1hcmdpbi10b3A6IDkwcHg7XG59XG5cbi8qIC0tLS0gU2VyaWVzIHJvd3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi50dGEtc2VyaWVzLXNlY3Rpb24ge1xuICBtYXJnaW4tYm90dG9tOiA1NnB4O1xufVxuXG4udHRhLXNlcmllcy1oZWFkIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGJhc2VsaW5lO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGdhcDogMTJweDtcbiAgbWFyZ2luLWJvdHRvbTogMThweDtcbn1cblxuLnR0YS1zZXJpZXMtaGVhZCBoMyB7IG1hcmdpbjogMDsgfVxuXG4udHRhLXNlZS1hbGwge1xuICBmb250LXdlaWdodDogNzAwO1xuICBmb250LXNpemU6IDEzcHg7XG4gIGNvbG9yOiAjMDA0ZjY4O1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBib3JkZXI6IG5vbmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgcGFkZGluZzogOHB4IDA7XG4gIG1pbi1oZWlnaHQ6IDQ0cHg7XG59XG5cbi50dGEtc2VyaWVzLWdyaWQge1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgyNDBweCwgMWZyKSk7XG4gIGdhcDogMjBweDtcbn1cblxuLyogLS0tLSBTZXJpZXMgZGlyZWN0b3J5ICgyMDI2LTA4LTA5KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgVGhlIHN0YWJsZSwgemVyby1yZXF1ZXN0IG1hcCBvZiBFVkVSWSBwdWJsaXNoZWQgc2VyaWVzIHVuZGVyIHRoZSA0XG4gICByb3RhdGluZyBzaG93Y2FzZSByb3dzIC0gc21hbGwgdGV4dCB0aWxlcywgbm8gdGh1bWJuYWlscy4gKi9cblxuLnR0YS1zZXJpZXMtZGlyZWN0b3J5IHtcbiAgbWFyZ2luLWJvdHRvbTogNjRweDtcbn1cblxuLnR0YS1zZXJpZXMtdGlsZS1ncmlkIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMjIwcHgsIDFmcikpO1xuICBnYXA6IDEycHg7XG59XG5cbi50dGEtc2VyaWVzLXRpbGUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGFsaWduLWl0ZW1zOiBiYXNlbGluZTtcbiAgZ2FwOiAxMHB4O1xuICB3aWR0aDogMTAwJTtcbiAgYmFja2dyb3VuZDogI2ZmZjtcbiAgYm9yZGVyOiBub25lO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gIHBhZGRpbmc6IDE0cHggMTZweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250OiBpbmhlcml0O1xuICBjb2xvcjogaW5oZXJpdDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgbWluLWhlaWdodDogNDRweDtcbn1cblxuLnR0YS1zZXJpZXMtdGlsZS1uYW1lIHtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBjb2xvcjogIzQxNDA0MjtcbiAgbGluZS1oZWlnaHQ6IDEuMztcbn1cblxuLnR0YS1zZXJpZXMtdGlsZS1jb3VudCB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6ICM2ZDZlNzE7IC8qIEFBLXNhZmUgbWV0YSBncmF5LCBzYW1lIHRva2VuIGFzIGNhcmQgbWV0YSB0ZXh0ICovXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi50dGEtc2VyaWVzLXRpbGU6Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCAjMDA0ZjY4O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxuXG4udHRhLXNlcmllcy1jYXJkIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgd2lkdGg6IDEwMCU7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGJhY2tncm91bmQ6ICNmZmY7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEpO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBhZGRpbmc6IDA7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGNvbG9yOiBpbmhlcml0O1xufVxuXG4udHRhLXNlcmllcy1jYXJkLXRodW1iIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBhc3BlY3QtcmF0aW86IDE2IC8gOTtcbiAgYmFja2dyb3VuZDogIzAwMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgbWluLXdpZHRoOiAwO1xufVxuXG4udHRhLXNlcmllcy1jYXJkLXRodW1iIGltZyB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIG9iamVjdC1maXQ6IGNvdmVyO1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLnR0YS1zZXJpZXMtY2FyZC1ib2R5IHtcbiAgcGFkZGluZzogMTZweDtcbn1cblxuLnR0YS1zZXJpZXMtY2FyZC1ib2R5IGgzIHtcbiAgbWFyZ2luOiAwO1xuICBmb250LXdlaWdodDogNzAwO1xuICBmb250LXNpemU6IDE2cHg7XG4gIGNvbG9yOiAjNDE0MDQyO1xuICBsaW5lLWhlaWdodDogMS4yNTtcbn1cblxuLnR0YS1zZXJpZXMtY2FyZC1ib2R5IHAge1xuICBtYXJnaW46IDRweCAwIDA7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY29sb3I6ICM2ZDZlNzE7IC8qIHdhcyAjOTM5NTk4IC0gZmFpbGVkIFdDQUcgQUEgNC41OjEgb24gd2hpdGUgKH4zLjA6MSk7IGRhcmtlbmVkIDIwMjYtMDgtMDggKi9cbn1cblxuLyogLS0tLSBTcGVha2VyIHNwb3RsaWdodCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnR0YS1zcGVha2VyLXNlY3Rpb24ge1xuICBtYXJnaW4tYm90dG9tOiA2NHB4O1xufVxuXG4vKiBEZW5zaWZpZWQgMjAyNi0wOC0wOSAoY3VyYXRpb24gbW9kZWwpOiBjaGlwcyBpbnN0ZWFkIG9mIGNhcmRzIC0gc21hbGxlclxuICAgYXZhdGFyLCB0aWdodGVyIHBhZGRpbmcsIG5hcnJvd2VyIGdyaWQgdHJhY2sgLSBzbyBhIDE5KyByb3N0ZXIgcmVhZHMgYXNcbiAgIGEgZGlyZWN0b3J5LCBub3QgYSBwYWdlIG9mIGhlcm8gY2FyZHMuIE5hbWUvY291bnQgYXJlIHNwYW5zIG5vdywgbm90XG4gICBoMy9wIChoZWFkaW5ncyBpbnNpZGUgPGJ1dHRvbj4gYXJlIGludmFsaWQgSFRNTCAtIHNhbWUgcmVhc29uaW5nIGFzIHRoZVxuICAgMjAyNi0wOC0wOCBjYXJkLWxpbmsgY2hhbmdlOyB0aGVzZSBzdGF5IGJ1dHRvbnMgYmVjYXVzZSB0aGV5IGZpbHRlclxuICAgcmF0aGVyIHRoYW4gbmF2aWdhdGUpLiAqL1xuLnR0YS1zcGVha2VyLWdyaWQge1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgxOTBweCwgMWZyKSk7XG4gIGdhcDogMTRweDtcbn1cblxuLnR0YS1zcGVha2VyLWNhcmQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDEycHg7XG4gIHdpZHRoOiAxMDAlO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICBib3JkZXI6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcbiAgcGFkZGluZzogMTJweCAxNHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGNvbG9yOiBpbmhlcml0O1xufVxuXG4udHRhLXNwZWFrZXItYXZhdGFyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogNTJweDtcbiAgaGVpZ2h0OiA1MnB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGZsZXg6IG5vbmU7XG4gIGJhY2tncm91bmQ6ICNlNmU3ZTg7XG59XG5cbi50dGEtc3BlYWtlci1hdmF0YXIgaW1nIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgb2JqZWN0LWZpdDogY292ZXI7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4udHRhLXNwZWFrZXItbmFtZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW46IDAgMCAycHg7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgY29sb3I6ICM0MTQwNDI7XG4gIGxpbmUtaGVpZ2h0OiAxLjI1O1xufVxuXG4udHRhLXNwZWFrZXItY291bnQge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luOiAwO1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiAjNmQ2ZTcxOyAvKiB3YXMgIzkzOTU5OCAtIGZhaWxlZCBXQ0FHIEFBIDQuNToxIG9uIHdoaXRlICh+My4wOjEpOyBkYXJrZW5lZCAyMDI2LTA4LTA4ICovXG59XG5cbi50dGEtc3BlYWtlci10b2dnbGUge1xuICBtYXJnaW4tdG9wOiAxNnB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBmb250LXNpemU6IDEzcHg7XG4gIGNvbG9yOiAjMDA0ZjY4O1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBib3JkZXI6IG5vbmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcGFkZGluZzogOHB4IDA7XG4gIG1pbi1oZWlnaHQ6IDQ0cHg7XG59XG5cbi50dGEtc3BlYWtlci10b2dnbGU6Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCAjMDA0ZjY4O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxuXG4vKiAtLS0tIFNwZWFrZXIgbGFuZGluZyBoZWFkZXIgKDIwMjYtMDgtMDkpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBSZW5kZXJlZCBhYm92ZSBhIHNwZWFrZXIncyB0YWxrcyB3aGVuIHRoZWlyIGNoaXAgKG9yIHRoZSBkcm9wZG93bilcbiAgIHNlbGVjdHMgdGhlbSBhbG9uZSAtIHBob3RvLCBuYW1lLCBjb3VudCwgYW5kIHRoZSBiaW8gZnJvbSB0aGUgV1AgdGVybVxuICAgZGVzY3JpcHRpb24gb25jZSB3cml0dGVuLiAqL1xuXG4udHRhLXNwZWFrZXItaGVybyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogMjBweDtcbiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gIGJhY2tncm91bmQ6ICNmZmY7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcbiAgcGFkZGluZzogMjRweDtcbiAgbWFyZ2luLWJvdHRvbTogNDBweDtcbn1cblxuLnR0YS1zcGVha2VyLWhlcm8tYXZhdGFyIHtcbiAgd2lkdGg6IDk2cHg7XG4gIGhlaWdodDogOTZweDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBmbGV4OiBub25lO1xuICBiYWNrZ3JvdW5kOiAjZTZlN2U4O1xufVxuXG4udHRhLXNwZWFrZXItaGVyby1hdmF0YXIgaW1nIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgb2JqZWN0LWZpdDogY292ZXI7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4udHRhLXNwZWFrZXItaGVyby1ib2R5IGgyIHtcbiAgbWFyZ2luOiAwIDAgMnB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBmb250LXNpemU6IDI0cHg7XG4gIGNvbG9yOiAjNDE0MDQyO1xufVxuXG4udHRhLXNwZWFrZXItaGVyby1tZXRhIHtcbiAgbWFyZ2luOiAwIDAgMTBweDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjb2xvcjogIzZkNmU3MTtcbn1cblxuLnR0YS1zcGVha2VyLWhlcm8tYmlvIHtcbiAgbWFyZ2luOiAwIDAgOHB4O1xuICBmb250LXNpemU6IDE1cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjY7XG4gIGNvbG9yOiAjNDE0MDQyO1xufVxuXG4udHRhLXNwZWFrZXItaGVyby1iaW86bGFzdC1jaGlsZCB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA2MzlweCkge1xuICAudHRhLXNwZWFrZXItaGVybyB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgfVxufVxuXG4vKiAtLS0tIENhbXAgc3BvdGxpZ2h0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4udHRhLWNhbXAtc2VjdGlvbiB7XG4gIG1hcmdpbi1ib3R0b206IDY0cHg7XG59XG5cbi50dGEtY2FtcC1ncmlkIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMDBweCwgMWZyKSk7XG4gIGdhcDogMjBweDtcbn1cblxuLnR0YS1jYW1wLWNhcmQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIC8qIEZpeGVkIGhlaWdodCwgTk9UIGFzcGVjdC1yYXRpbyAoSm9obidzIGNhbGwgMjAyNi0wOC0wOSk6IHRoZSBncmlkJ3NcbiAgICAgYXV0by1maXQgc3RyZXRjaGVzIGhvd2V2ZXIgbWFueSBjYXJkcyByZW5kZXIgYWNyb3NzIHRoZSBmdWxsIHJvdywgYW5kXG4gICAgIGEgcmF0aW8tZGVyaXZlZCBoZWlnaHQgYmFsbG9vbmVkIHdpdGggYnJvd3NlciB3aWR0aCAtIHR3byBjYW1wcyBvbiBhXG4gICAgIHdpZGUgbW9uaXRvciBtZWFudCB+NDUwcHgtdGFsbCBjYXJkcyBlYXRpbmcgdGhlIHZpZXdwb3J0LiBBIGZpeGVkXG4gICAgIGhlaWdodCBzdGF5cyBjb25zdGFudCByZWdhcmRsZXNzIG9mIHdpZHRoIG9yIGhvdyBtYW55IGNhbXBzIGN1cnJlbnRseVxuICAgICBoYXZlIHB1Ymxpc2hlZCBjb250ZW50LiAqL1xuICBoZWlnaHQ6IDE2MHB4O1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcbiAgcGFkZGluZzogMThweDtcbiAgYm9yZGVyOiBub25lO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGZvbnQ6IGluaGVyaXQ7XG59XG5cbi50dGEtY2FtcC1jYXJkIGltZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAxOHB4O1xuICBsZWZ0OiAxOHB4O1xuICB3aWR0aDogNDhweDtcbiAgaGVpZ2h0OiA0OHB4O1xuICBvYmplY3QtZml0OiBjb250YWluO1xufVxuXG4udHRhLWNhbXAtY2FyZCBoMyB7XG4gIG1hcmdpbjogMDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBjb2xvcjogI2ZmZjtcbn1cblxuLyogTW9iaWxlIGhvbWVwYWdlIHNlY3Rpb25zICgyMDI2LTA4LTA5IGN1cmF0aW9uIG1vZGVsKTogYmVsb3cgNjQwcHgsIHNlcmllc1xuICAgcm93cyAvIHNwZWFrZXIgY2hpcHMgLyBjYW1wIGNhcmRzIGVhY2ggYmVjb21lIE9ORSBob3Jpem9udGFsbHkgc3dpcGVhYmxlXG4gICByb3cgKHNjcm9sbC1zbmFwLCBuZXh0IGNhcmQgcGVla2luZyBpbiBmcm9tIHRoZSBlZGdlIGFzIHRoZSBzY3JvbGxcbiAgIGFmZm9yZGFuY2UgLSB0aGUgc2FtZSBjb252ZW50aW9uIHRoZSBzdGlja3kgZmlsdGVyIGJhciBlc3RhYmxpc2hlZFxuICAgMjAyNi0wOC0wOCkgaW5zdGVhZCBvZiBzdGFja2luZyBldmVyeSBjYXJkIHZlcnRpY2FsbHkuIEF0IDE4KyBzZXJpZXMgdGhlXG4gICBvbGQgc3RhY2tpbmcgbWVhbnQgfjcwIHN0YWNrZWQgY2FyZHMgYmVmb3JlIHRoZSBzcGVha2VyIHNlY3Rpb24gb24gYVxuICAgcGhvbmUuIENhcmRzIHN0YXkgcmVhbCBsaW5rcy9idXR0b25zIC0ga2V5Ym9hcmQgYW5kIHNjcmVlbi1yZWFkZXJcbiAgIHRyYXZlcnNhbCBpcyB1bmNoYW5nZWQsIHRoaXMgaXMgbGF5b3V0IG9ubHkuICovXG5AbWVkaWEgKG1heC13aWR0aDogNjM5cHgpIHtcbiAgLnR0YS1zZXJpZXMtZ3JpZCxcbiAgLnR0YS1zcGVha2VyLWdyaWQsXG4gIC50dGEtY2FtcC1ncmlkIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoO1xuICAgIHNjcm9sbC1zbmFwLXR5cGU6IHggcHJveGltaXR5O1xuICAgIGdhcDogMTJweDtcbiAgICBwYWRkaW5nLWJvdHRvbTogOHB4O1xuICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjtcbiAgfVxuICAudHRhLXNlcmllcy1jYXJkIHtcbiAgICBmbGV4OiAwIDAgNzglO1xuICAgIHNjcm9sbC1zbmFwLWFsaWduOiBzdGFydDtcbiAgfVxuICAudHRhLXNwZWFrZXItY2FyZCB7XG4gICAgZmxleDogMCAwIDIxMHB4O1xuICAgIHNjcm9sbC1zbmFwLWFsaWduOiBzdGFydDtcbiAgfVxuICAudHRhLWNhbXAtY2FyZCB7XG4gICAgZmxleDogMCAwIDQ1JTtcbiAgICBzY3JvbGwtc25hcC1hbGlnbjogc3RhcnQ7XG4gICAgaGVpZ2h0OiAxMjBweDsgLyogZGVza3RvcCdzIDE2MHB4IHJlYWRzIGFzIGEgY2h1bmt5IHBvcnRyYWl0IGF0IH4xNTVweC13aWRlIG1vYmlsZSBjYXJkcyAqL1xuICB9XG4gIC50dGEtc2VyaWVzLXRpbGUtZ3JpZCB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMTUwcHgsIDFmcikpO1xuICB9XG59XG5cbi8qIC0tLS0gR3JpZCAvIGNhcmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnR0YS1ncmlkIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7XG4gIGdhcDogMjRweDtcbiAgbWFyZ2luLWJvdHRvbTogMjRweDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDY0MHB4KSB7XG4gIC50dGEtZ3JpZCB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIDFmcik7IH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk2MHB4KSB7XG4gIC50dGEtZ3JpZCB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDMsIDFmcik7IH1cbn1cblxuLnR0YS1jYXJkIHtcbiAgLyogV2FzIGBkaXNwbGF5OiBibG9ja2AgLSBvbiBhIDxidXR0b24+LCB0aGF0J3Mgbm90IGVub3VnaCB0byBmdWxseVxuICAgICBvdmVycmlkZSB0aGUgYnJvd3NlcidzIG5hdGl2ZSBmb3JtLWNvbnRyb2wgY29udGVudCBsYXlvdXQsIHdoaWNoIGNhblxuICAgICBzdGlsbCB2ZXJ0aWNhbGx5IENFTlRFUiB0aGUgYnV0dG9uJ3MgY29udGVudCB3aGVuIHRoZSBidXR0b24gKHN0cmV0Y2hlZFxuICAgICB0YWxsZXIgYnkgLnR0YS1ncmlkJ3MgZGVmYXVsdCBncmlkIHJvdyBgYWxpZ24taXRlbXM6IHN0cmV0Y2hgKSBpc1xuICAgICB0YWxsZXIgdGhhbiBpdHMgb3duIGNvbnRlbnQuIENvbmZpcm1lZCBsaXZlIDIwMjYtMDgtMDQ6IGNhcmRzIHdpdGhcbiAgICAgc2hvcnRlciBleGNlcnB0IHRleHQgKGZld2VyIHdyYXBwZWQgbGluZXMpIHNob3dlZCBlcXVhbCBlbXB0eSBzcGFjZVxuICAgICBhYm92ZSB0aGUgdGh1bWJuYWlsIGFuZCBiZWxvdyB0aGUgYm9keSwgc3BsaXQgc3ltbWV0cmljYWxseSBhcm91bmQgdGhlXG4gICAgIGNvbnRlbnQgLSBlLmcuIGV4YWN0bHkgMjguMnB4IHRvcCBhbmQgMjguMnB4IGJvdHRvbSBvbiBhIGNhcmQgfjU2cHhcbiAgICAgc2hvcnQgb2YgdGhlIHJvdydzIHN0cmV0Y2hlZCBoZWlnaHQuIE5laXRoZXIgYGFwcGVhcmFuY2U6IG5vbmVgIG5vciBhblxuICAgICBleHBsaWNpdCBganVzdGlmeS1jb250ZW50YC9gYWxpZ24taXRlbXNgIG92ZXJyaWRlIGZpeGVkIGl0IHdoaWxlXG4gICAgIGBkaXNwbGF5YCBzdGF5ZWQgYGJsb2NrYCAodGhvc2UgcHJvcGVydGllcyBhcmUgc2ltcGx5IG5vLW9wcyBvbiBhIGJsb2NrXG4gICAgIGZvcm1hdHRpbmcgY29udGV4dCwgc28gYm90aCBcInRlc3RzXCIgd2VyZSBzdHJ1Y3R1cmFsbHkgdW5hYmxlIHRvIGRvXG4gICAgIGFueXRoaW5nIGVpdGhlciB3YXkpIC0gb25seSBzd2l0Y2hpbmcgdG8gYSByZWFsIGBkaXNwbGF5OiBmbGV4YCB3b3JrZWQuXG4gICAgIGAudHRhLXNlcmllcy1jYXJkYCBhbHJlYWR5IHVzZWQgZmxleCBmb3IgdGhpcyBleGFjdCByZWFzb24sIHdoaWNoIGlzXG4gICAgIHdoeSBzZXJpZXMtcm93IGNhcmRzIG5ldmVyIHNob3dlZCB0aGlzIGJ1ZyAtIG9ubHkgdGhlIG1haW4gZ3JpZCBjYXJkc1xuICAgICAod2hpY2ggdXNlZCBwbGFpbiBgYmxvY2tgKSBkaWQuICovXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbiAgd2lkdGg6IDEwMCU7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGJhY2tncm91bmQ6ICNmZmY7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEpO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBhZGRpbmc6IDA7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGNvbG9yOiBpbmhlcml0O1xuICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuMTVzIGVhc2UsIHRyYW5zZm9ybSAwLjE1cyBlYXNlO1xufVxuXG4udHRhLWNhcmQ6aG92ZXIsXG4udHRhLWNhcmQ6Zm9jdXMtdmlzaWJsZSB7XG4gIGJveC1zaGFkb3c6IDAgNHB4IDE2cHggcmdiYSgwLCAwLCAwLCAwLjE0KTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpO1xufVxuXG4udHRhLWNhcmQ6Zm9jdXMtdmlzaWJsZSxcbi50dGEtZmVhdHVyZWQ6Zm9jdXMtdmlzaWJsZSxcbi50dGEtc2VyaWVzLWNhcmQ6Zm9jdXMtdmlzaWJsZSxcbi50dGEtc3BlYWtlci1jYXJkOmZvY3VzLXZpc2libGUge1xuICBvdXRsaW5lOiAycHggc29saWQgIzAwNGY2ODsgLyogc2VlIGZvY3VzLWluZGljYXRvciBub3RlIGluIHRoZSBmaWx0ZXItYmFyIHNlY3Rpb24gKi9cbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cblxuLnR0YS1jYW1wLWNhcmQ6Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCAjZmZmOyAvKiBjYW1wIGNhcmRzIHNpdCBvbiB0aGVpciBvd24gbWlkLWRhcmsgYnJhbmQgY29sb3JzIC0gd2hpdGUgaXMgdGhlIHJlbGlhYmxlIGNvbnRyYXN0IHRoZXJlICovXG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XG5cbi50dGEtY2FyZC10aHVtYiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGFzcGVjdC1yYXRpbzogMTYgLyA5O1xuICBiYWNrZ3JvdW5kOiAjZTZlN2U4IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMjQgMjQnIHdpZHRoPSc0MCcgaGVpZ2h0PSc0MCclM0UlM0NwYXRoIGZpbGw9JyUyMzkzOTU5OCcgZD0nTTggNXYxNGwxMS03eicvJTNFJTNDL3N2ZyUzRVwiKSBjZW50ZXIgLyA0MHB4IG5vLXJlcGVhdDtcbn1cblxuLnR0YS1jYXJkLXRodW1iIGltZyB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIG9iamVjdC1maXQ6IGNvdmVyO1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLnR0YS1jYXJkLWJvZHkge1xuICBwYWRkaW5nOiAyMHB4IDI0cHggMjRweDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiA2cHg7XG59XG5cbi50dGEtY2FyZC1ib2R5IC50dGEtdGFnIHtcbiAgYWxpZ24tc2VsZjogZmxleC1zdGFydDtcbn1cblxuLnR0YS1jYXJkLXRpdGxlIHtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBtYXJnaW46IDRweCAwIDA7XG4gIGxpbmUtaGVpZ2h0OiAxLjM7XG4gIGNvbG9yOiAjNDE0MDQyO1xufVxuXG4udHRhLWNhcmQtZXhjZXJwdCB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDEuNTtcbiAgY29sb3I6ICM0MTQwNDI7XG4gIG1hcmdpbjogMDtcbn1cblxuLnR0YS1jYXJkLXNwZWFrZXIge1xuICBmb250LXNpemU6IDEzcHg7XG4gIGNvbG9yOiAjNmQ2ZTcxOyAvKiB3YXMgIzkzOTU5OCAtIGZhaWxlZCBXQ0FHIEFBIDQuNToxIG9uIHdoaXRlICh+My4wOjEpOyBkYXJrZW5lZCAyMDI2LTA4LTA4ICovXG4gIG1hcmdpbjogNHB4IDAgMDtcbn1cblxuLnR0YS1sb2FkbW9yZS1idG4ge1xuICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBjb2xvcjogIzAwNGY2ODtcbiAgYmFja2dyb3VuZDogI2ZmZjtcbiAgYm9yZGVyOiAxcHggc29saWQgI2U2ZTdlODtcbiAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gIHBhZGRpbmc6IDEycHggMjhweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBtaW4taGVpZ2h0OiA0NHB4O1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luOiAxNnB4IGF1dG8gNDBweDtcbn1cblxuLnR0YS1sb2FkbW9yZS1idG46Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCAjMDA0ZjY4OyAvKiBzZWUgZm9jdXMtaW5kaWNhdG9yIG5vdGUgaW4gdGhlIGZpbHRlci1iYXIgc2VjdGlvbiAqL1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxuXG4vKiAtLS0tIEVtcHR5IC8gbG9hZGluZyAvIGVycm9yIHN0YXRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4udHRhLWVtcHR5LFxuLnR0YS1zdGF0dXMge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDY0cHggMjBweDtcbiAgY29sb3I6ICM2ZDZlNzE7IC8qIHdhcyAjOTM5NTk4IC0gZmFpbGVkIFdDQUcgQUEgNC41OjEgb24gd2hpdGUgKH4zLjA6MSk7IGRhcmtlbmVkIDIwMjYtMDgtMDggKi9cbiAgZm9udC1zaXplOiAxNnB4O1xufVxuXG4vKiBDTFMgcGxhY2Vob2xkZXIgKDIwMjYtMDgtMDggVVggcGFzcyk6IHNlcmllcyByb3dzICsgc3BlYWtlciBzcG90bGlnaHRcbiAgIHJlc29sdmUgYWZ0ZXIgdGhlIGdyaWQgYW5kIGluamVjdCBBQk9WRSBpdCAtIEpTIHJlc2VydmVzIGFuIGVzdGltYXRlZFxuICAgbWluLWhlaWdodCBvbiB0aGVpciBjb250YWluZXJzIHVudGlsIHRoZXkgbGFuZCAoc2VlXG4gICBob21lcGFnZVBsYWNlaG9sZGVycygpIGluIHRoZS10YWtlYXdheS5qcyk7IHRoaXMganVzdCBtYWtlcyB0aGUgcmVzZXJ2ZWRcbiAgIHNwYWNlIHJlYWQgYXMgXCJjb250ZW50IGNvbWluZ1wiIGluc3RlYWQgb2YgYSBibGFuayBob2xlLiAqL1xuLnR0YS1zZWN0aW9uLXNrZWxldG9uIHtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTAwZGVnLCAjZjJmM2YzIDQwJSwgI2ZhZmJmYiA1MCUsICNmMmYzZjMgNjAlKTtcbiAgYmFja2dyb3VuZC1zaXplOiAyMDAlIDEwMCU7XG4gIGFuaW1hdGlvbjogdHRhLXNoaW1tZXIgMS40cyBlYXNlIGluZmluaXRlO1xuICBtYXJnaW4tYm90dG9tOiA1NnB4O1xufVxuXG5Aa2V5ZnJhbWVzIHR0YS1zaGltbWVyIHtcbiAgdG8geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTAwJSAwOyB9XG59XG5cbkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7XG4gIC50dGEtc2VjdGlvbi1za2VsZXRvbiB7IGFuaW1hdGlvbjogbm9uZTsgfVxufVxuXG4vKiAtLS0tIE5ld3NsZXR0ZXIgbW9kdWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi50dGEtbmV3c2xldHRlciB7XG4gIGJhY2tncm91bmQ6ICMwMDRmNjg7XG4gIGNvbG9yOiAjZmZmO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDU2cHggMjRweDtcbiAgbWFyZ2luOiAwO1xuICAvKiBTYW1lIENvcm5lcnN0b25lIHJvdy1ib3hpbmcgY29uc3RyYWludCBhcyAudHRhLWhlcm8gKGZvdW5kIDIwMjYtMDgtMDMsXG4gICAgIG5ldmVyIGFwcGxpZWQgaGVyZSB1bnRpbCAyMDI2LTA4LTA0IC0gSm9obiBjYXVnaHQgdGhpcyBvbmUgbGl2ZTogdGhlXG4gICAgIG1vZHVsZSBzdGF5ZWQgYm94ZWQgYXQgfjEyMDBweCBpbnN0ZWFkIG9mIHJ1bm5pbmcgZWRnZSB0byBlZGdlIGxpa2VcbiAgICAgdGhlIHJlc3Qgb2YgdGhlIGZ1bGwtYmxlZWQgc2VjdGlvbnMpLiBTYW1lIHN0YW5kYXJkIGZpeCAtIGFuZCBub3RlXG4gICAgIGBwb3NpdGlvbjogcmVsYXRpdmVgIGlzIHJlcXVpcmVkIGZvciBgbGVmdGAvYHJpZ2h0YCB0byBoYXZlIGFueSBlZmZlY3RcbiAgICAgYXQgYWxsOyBvbWl0dGluZyBpdCAoYXMgdGhpcyBydWxlIG9yaWdpbmFsbHkgZGlkKSBzaWxlbnRseSBkcm9wcyBqdXN0XG4gICAgIHRob3NlIHR3byBwcm9wZXJ0aWVzLCBsZWF2aW5nIHRoZSBlbGVtZW50IHNoaWZ0ZWQgb2ZmLXNjcmVlbiB2aWEgdGhlXG4gICAgIG1hcmdpbiB2YWx1ZXMgYWxvbmUgaW5zdGVhZCBvZiBwcm9wZXJseSBmdWxsLWJsZWVkLiAqL1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiAxMDB2dztcbiAgbGVmdDogNTAlO1xuICByaWdodDogNTAlO1xuICBtYXJnaW4tbGVmdDogLTUwdnc7XG4gIG1hcmdpbi1yaWdodDogLTUwdnc7XG59XG5cbi50dGEtbmV3c2xldHRlci0tZm9vdGVyIHtcbiAgLyogV2FzIGRlbGliZXJhdGVseSBib3hlZC9jZW50ZXJlZCAoc2VlIGdpdCBoaXN0b3J5L2NvbnRlbnQtbW9kZWwgZG9jIGZvclxuICAgICB0aGUgcHJpb3IgcmVhc29uaW5nKSAtIGNoYW5nZWQgMjAyNi0wOC0wNSBwZXIgSm9obidzIHJlcXVlc3QgdG8gcnVuXG4gICAgIGZ1bGwtYmxlZWQgbGlrZSB0aGUgbWFpbiAudHRhLW5ld3NsZXR0ZXIgc2VjdGlvbiBpbnN0ZWFkLiBGb3VuZFxuICAgICAyMDI2LTA4LTA2OiB0aGUgcHJldmlvdXMgYG1hcmdpbjogNTZweCAwIDA7YCBzaG9ydGhhbmQgc2V0XG4gICAgIG1hcmdpbi1sZWZ0IEFORCBtYXJnaW4tcmlnaHQgdG8gMCB0b28gKDMtdmFsdWUgc2hvcnRoYW5kIGlzXG4gICAgIHRvcC9sZWZ0LXJpZ2h0L2JvdHRvbSkgLSBkaXJlY3RseSBjb250cmFkaWN0aW5nIHRoaXMgcnVsZSdzIG93blxuICAgICBjb21tZW50IGNsYWltaW5nIHRoZXknZCBpbmhlcml0IHVuY29udGVzdGVkLCBhbmQgc2lsZW50bHkgemVyb2luZ1xuICAgICB0aGUgYmFzZSBydWxlJ3MgLTUwdncgbGVmdC9yaWdodCBtYXJnaW5zIHRoZSBmdWxsLWJsZWVkIHRyaWNrXG4gICAgIGRlcGVuZHMgb24uIENhdXNlZCBhIHJlYWwsIGNvbmZpcm1lZCBob3Jpem9udGFsLW92ZXJmbG93IGJ1ZyBvblxuICAgICBldmVyeSB0YWxrIGRldGFpbCB2aWV3J3MgZm9vdGVyIG5ld3NsZXR0ZXIgc2VjdGlvbiAoYm90aCB0aGUgaHViIGFuZFxuICAgICB0aGUgc2luZ2xlLXRhbGsgcGVybWFsaW5rIHRlbXBsYXRlKSAtIHRoZSBzZWN0aW9uIHJlbmRlcmVkIHNoaWZ0ZWRcbiAgICAgfjUwJSBvZiB0aGUgdmlld3BvcnQgd2lkdGggb2ZmIHRvIHRoZSByaWdodCBpbnN0ZWFkIG9mIGZ1bGwtYmxlZWQuXG4gICAgIFVzaW5nIHRoZSBzaW5nbGUgbWFyZ2luLXRvcCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIHRoZSBtYXJnaW5cbiAgICAgc2hvcnRoYW5kIGFjdHVhbGx5IGFjaGlldmVzIHRoZSBcIm9ubHkgb3ZlcnJpZGUgdG9wXCIgaW50ZW50IHRoZVxuICAgICBvcmlnaW5hbCBjb21tZW50IGRlc2NyaWJlZC4gKi9cbiAgbWFyZ2luLXRvcDogNTZweDtcbn1cblxuLnR0YS1uZXdzbGV0dGVyIGgyIHtcbiAgY29sb3I6ICNmZmY7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGZvbnQtc2l6ZTogMjhweDtcbiAgbWFyZ2luOiAwIDAgMTJweDtcbn1cblxuLnR0YS1uZXdzbGV0dGVyIHAge1xuICBjb2xvcjogI2ZmZjtcbiAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBsaW5lLWhlaWdodDogMS41O1xuICBtYXgtd2lkdGg6IDQ4MHB4O1xuICBtYXJnaW46IDAgYXV0byAyNHB4O1xuICBvcGFjaXR5OiAwLjk7XG59XG5cbi50dGEtbmV3c2xldHRlci1mb3JtIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiAxMHB4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBtYXgtd2lkdGg6IDQ0MHB4O1xuICBtYXJnaW46IDAgYXV0bztcbn1cblxuLnR0YS1uZXdzbGV0dGVyLWZvcm0gaW5wdXQge1xuICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBwYWRkaW5nOiAxMnB4IDE2cHg7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQpO1xuICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpO1xuICBjb2xvcjogI2ZmZjtcbiAgZmxleDogMTtcbiAgbWluLXdpZHRoOiAyMjBweDtcbiAgbWluLWhlaWdodDogNDRweDtcbn1cblxuLnR0YS1uZXdzbGV0dGVyLWZvcm0gaW5wdXQ6OnBsYWNlaG9sZGVyIHtcbiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTtcbn1cblxuLnR0YS1uZXdzbGV0dGVyLWZvcm0gYnV0dG9uIHtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgcGFkZGluZzogMTJweCAyOHB4O1xuICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgYm9yZGVyOiBub25lO1xuICBiYWNrZ3JvdW5kOiAjNzNEMUY1O1xuICBjb2xvcjogIzAwNGY2ODtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBtaW4taGVpZ2h0OiA0NHB4O1xufVxuXG4udHRhLW5ld3NsZXR0ZXItbm90ZSB7XG4gIG1hcmdpbjogMTZweCAwIDA7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgb3BhY2l0eTogMC45O1xufVxuXG4vKiAtLS0tIERldGFpbCB2aWV3IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuI3R0YS1kZXRhaWwge1xuICBwYWRkaW5nLXRvcDogMzJweDtcbn1cblxuLnR0YS1kZXRhaWwtY29udGFpbmVyIHtcbiAgbWF4LXdpZHRoOiA4NjBweDtcbn1cblxuLyogOm5vdChbaGlkZGVuXSkgaXMgUkVRVUlSRUQsIG5vdCBkZWNvcmF0aW9uIC0gdGhpcyBlbGVtZW50IGlzIHRvZ2dsZWQgdmlhXG4gICB0aGUgYGhpZGRlbmAgRE9NIHByb3BlcnR5LCBhbmQgYW4gdW5jb25kaXRpb25hbCBgZGlzcGxheTogZmxleGAgb3ZlcnJpZGVzXG4gICB0aGUgW2hpZGRlbl0gYXR0cmlidXRlIGF0IGVxdWFsIHNwZWNpZmljaXR5ICh0aGUgcmVjdXJyaW5nIGdvdGNoYSBpblxuICAgdGhlLXRha2Vhd2F5LWNvbnRlbnQtbW9kZWwubWQsIHRoaXJkIG9jY3VycmVuY2U6IC50dGEtdHJhbnNjcmlwdC1ib2R5XG4gICAyMDI2LTA4LTAyLCAudHRhLWhlcm8gMjAyNi0wOC0wMywgdGhpcyBicmVhZGNydW1iIDIwMjYtMDgtMDkgLSBmb3VuZCBieVxuICAgSm9obiBhcyBhIHN0YWxlIFwiVGhlIFRha2Vhd2F5IC8gUGhpbCBNb3NlclwiIGNydW1iIHJlbmRlcmluZyBvbiB0aGVcbiAgIGRlZmF1bHQgaHViIGluIGV2ZXJ5IGJyb3dzZXIgd2hpbGUgYmMuaGlkZGVuIHdhcyB2ZXJpZmlhYmx5IHRydWUpLiAqL1xuLnR0YS1icmVhZGNydW1iOm5vdChbaGlkZGVuXSkge1xuICBmb250LXNpemU6IDEzcHg7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGNvbG9yOiAjNmQ2ZTcxOyAvKiB3YXMgIzkzOTU5OCAtIGZhaWxlZCBXQ0FHIEFBIDQuNToxIG9uIHdoaXRlICh+My4wOjEpOyBkYXJrZW5lZCAyMDI2LTA4LTA4ICovXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogOHB4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAvKiBNb3ZlZCB0byB0aGUgdG9wIG9mIHRoZSBjb250YWluZXIgMjAyNi0wOC0wOSAod2FzIGFib3ZlIEFsbCBUYWxrcyk6XG4gICAgIHRvcCBtYXJnaW4gY2xlYXJzIHRoZSBzdGlja3kgZmlsdGVyIGJhcjsgdGhlIHJlc3VsdCBjb3VudCBiZWxvdyBicmluZ3NcbiAgICAgaXRzIG93biBjb2xsYXBzaW5nIDI0cHggdG9wIG1hcmdpbi4gKi9cbiAgbWFyZ2luOiAyNHB4IDAgMDtcbn1cblxuLnR0YS1icmVhZGNydW1iIGJ1dHRvbiB7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGNvbG9yOiAjMDA0ZjY4O1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBib3JkZXI6IG5vbmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcGFkZGluZzogMDtcbn1cblxuLnR0YS1icmVhZGNydW1iIHNwYW46bGFzdC1jaGlsZCB7XG4gIGNvbG9yOiAjNDE0MDQyO1xufVxuXG4jdHRhLWRldGFpbC10aXRsZSB7XG4gIGZvbnQtc2l6ZTogY2xhbXAoMjhweCwgNHZ3LCA0MHB4KTtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgbWFyZ2luOiAwIDAgMTJweDtcbiAgY29sb3I6ICM0MTQwNDI7XG4gIGxpbmUtaGVpZ2h0OiAxLjI7XG59XG5cbi50dGEtZGV0YWlsLW1ldGEge1xuICBmb250LXNpemU6IDE1cHg7XG4gIGNvbG9yOiAjNmQ2ZTcxOyAvKiB3YXMgIzkzOTU5OCAtIGZhaWxlZCBXQ0FHIEFBIDQuNToxIG9uIHdoaXRlICh+My4wOjEpOyBkYXJrZW5lZCAyMDI2LTA4LTA4ICovXG4gIG1hcmdpbjogMCAwIDEycHg7XG59XG5cbi50dGEtdmlkZW8td3JhcCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGFzcGVjdC1yYXRpbzogMTYgLyA5O1xuICBiYWNrZ3JvdW5kOiAjMDAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4udHRhLXZpZGVvLXdyYXAgaWZyYW1lIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBpbnNldDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyOiAwO1xufVxuXG4udHRhLXZpZGVvLWZhY2FkZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJvcmRlcjogMDtcbiAgcGFkZGluZzogMDtcbiAgbWFyZ2luOiAwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJhY2tncm91bmQ6ICMwMDA7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4udHRhLXZpZGVvLWZhY2FkZSBpbWcge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBvYmplY3QtZml0OiBjb3ZlcjtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi50dGEtdmlkZW8tbWlzc2luZyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGNvbG9yOiAjNDE0MDQyOyAvKiBvbiB0aGUgI2U2ZTdlOCBiYWNrZ3JvdW5kIGV2ZW4gIzZkNmU3MSBvbmx5IGhpdHMgfjQ6MSBhdCB0aGlzIDE0cHggc2l6ZSAtIGZ1bGwgYm9keSBjb2xvciBuZWVkZWQgKDIwMjYtMDgtMDgpICovXG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgYmFja2dyb3VuZDogI2U2ZTdlODtcbn1cblxuLnR0YS1xdWljay1hY3Rpb25zIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiAxMHB4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDIwcHggMCA0MHB4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U2ZTdlODtcbiAgbWFyZ2luLWJvdHRvbTogNDBweDtcbn1cblxuLnR0YS1xdWljay1hY3Rpb25zLXNwYWNlciB7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xufVxuXG4udHRhLWFjdGlvbmJ0biB7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICBmb250LXdlaWdodDogNzAwO1xuICBjb2xvcjogIzAwNGY2ODtcbiAgYmFja2dyb3VuZDogI2ZmZjtcbiAgYm9yZGVyOiAxcHggc29saWQgI2U2ZTdlODtcbiAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gIHBhZGRpbmc6IDEwcHggMTZweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtaW4taGVpZ2h0OiA0NHB4O1xuICBsaW5lLWhlaWdodDogMjRweDtcbn1cblxuLnR0YS1zaGFyZS1ub3RlIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjb2xvcjogIzZkNmU3MTsgLyogd2FzICM5Mzk1OTggLSBmYWlsZWQgV0NBRyBBQSA0LjU6MSBvbiB3aGl0ZSAofjMuMDoxKTsgZGFya2VuZWQgMjAyNi0wOC0wOCAqL1xufVxuXG4udHRhLXBpbGxidG4ge1xuICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZDogIzAwNGY2ODtcbiAgYm9yZGVyOiBub25lO1xuICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgcGFkZGluZzogMTJweCAyNHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtaW4taGVpZ2h0OiA0NHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbn1cblxuLnR0YS1zZWN0aW9uLXRpdGxlIHtcbiAgZm9udC1zaXplOiAxNXB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICBsZXR0ZXItc3BhY2luZzogMC4wNGVtO1xuICBjb2xvcjogIzAwNGY2ODtcbiAgbWFyZ2luOiAyNHB4IDAgMTBweDtcbn1cblxuLnR0YS1oMyB7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgY29sb3I6ICM0MTQwNDI7XG4gIG1hcmdpbjogMCAwIDIwcHg7XG59XG5cbi50dGEtbm90ZXMtbGlzdCB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMCAwIDAgMjJweDtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ2FwOiAxMnB4O1xufVxuXG4udHRhLW5vdGVzLWxpc3QgbGkge1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjY7XG4gIGNvbG9yOiAjNDE0MDQyO1xufVxuXG4udHRhLXF1b3RlIHtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBsaW5lLWhlaWdodDogMS42O1xuICBjb2xvcjogIzQxNDA0MjtcbiAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjNzNEMUY1O1xuICBwYWRkaW5nOiA0cHggMCA0cHggMTZweDtcbiAgbWFyZ2luOiAwIDAgMTZweDtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuXG4vKiAtLS0tIEZ1bGwgdHJhbnNjcmlwdCAoY29sbGFwc2libGUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4udHRhLXRyYW5zY3JpcHQtdG9nZ2xlIHtcbiAgZGlzcGxheTogZmxleDtcbiAgd2lkdGg6IDEwMCU7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYmFja2dyb3VuZDogbm9uZTtcbiAgYm9yZGVyOiBub25lO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2U2ZTdlODtcbiAgcGFkZGluZzogMThweCAwO1xuICBtYXJnaW4tdG9wOiAyNHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIG1pbi1oZWlnaHQ6IDQ0cHg7XG59XG5cbi50dGEtdHJhbnNjcmlwdC10b2dnbGU6Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCAjMDA0ZjY4OyAvKiBzZWUgZm9jdXMtaW5kaWNhdG9yIG5vdGUgaW4gdGhlIGZpbHRlci1iYXIgc2VjdGlvbiAqL1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxuXG4udHRhLXRyYW5zY3JpcHQtdG9nZ2xlLWljb24ge1xuICBmb250LXNpemU6IDIycHg7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGNvbG9yOiAjMDA0ZjY4O1xuICBsaW5lLWhlaWdodDogMTtcbn1cblxuLnR0YS10cmFuc2NyaXB0LWJvZHk6bm90KFtoaWRkZW5dKSB7XG4gIHBhZGRpbmctdG9wOiA0cHg7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdhcDogMTZweDtcbn1cblxuLnR0YS10cmFuc2NyaXB0LXBhcmEge1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjc7XG4gIGNvbG9yOiAjNDE0MDQyO1xuICBtYXJnaW46IDA7XG59XG5cbi8qIC0tLS0gUXVvdGUgZ3JhcGhpY3MgJiBjbGlwcyAvIHJlbGF0ZWQgdGFsa3MgKGRldGFpbCB2aWV3KSAtLS0tLS0tLS0tLS0tLSAqL1xuXG4udHRhLWRldGFpbC1zZWN0aW9uIHtcbiAgbWF4LXdpZHRoOiAxMTYwcHg7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBwYWRkaW5nOiAwIDE2cHggNTZweDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDY0MHB4KSB7XG4gIC50dGEtZGV0YWlsLXNlY3Rpb24geyBwYWRkaW5nOiAwIDI0cHggNTZweDsgfVxufVxuXG4udHRhLXF1b3RlY2xpcC1ncmlkIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMjBweCwgMWZyKSk7XG4gIGdhcDogMjBweDtcbn1cblxuLnR0YS1xdW90ZWNhcmQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGFzcGVjdC1yYXRpbzogNCAvIDU7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwNGY2ODtcbiAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgcGFkZGluZzogMjBweDtcbn1cblxuLnR0YS1xdW90ZWNhcmQtdGludCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgNzksIDEwNCwgMC41NSk7XG59XG5cbi50dGEtcXVvdGVjYXJkIHAge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY29sb3I6ICNmZmY7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGZvbnQtc2l6ZTogMThweDtcbiAgbGluZS1oZWlnaHQ6IDEuMztcbiAgbWFyZ2luOiAwO1xufVxuXG4udHRhLWNsaXBjYXJkIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBhc3BlY3QtcmF0aW86IDQgLyA1O1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJhY2tncm91bmQ6ICMwMDA7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuIiwgImpzIjogIi8qXG4gIFRoZSBUYWtlYXdheSAtIGFwcGxpY2F0aW9uIGxvZ2ljLlxuXG4gIFNvdXJjZSBvZiB0cnV0aCBsaXZlcyBoZXJlLCBOT1QgaW4gQ29ybmVyc3RvbmUuIFB1Ymxpc2hlZCAoYmFzZTY0LWVuY29kZWQsXG4gIGJ1bmRsZWQgd2l0aCB0aGUgQ1NTKSB0byBpdHMgb3duIHVubGlzdGVkIFdvcmRQcmVzcyBkYXRhIHBhZ2UgdmlhXG4gIHRoZV90YWtlYXdheV9wdWJsaXNoLnB5LCBhbmQgZmV0Y2hlZC9pbmplY3RlZCBhdCBydW50aW1lIGJ5IHRoZSB0aW55IHN0dWJcbiAgKHRoZS10YWtlYXdheS1zdHViLmh0bWwpIHRoYXQncyB0aGUgb25seSB0aGluZyBhY3R1YWxseSBwYXN0ZWQgaW50b1xuICBDb3JuZXJzdG9uZS4gRWRpdCB0aGlzIGZpbGUgKyByZS1ydW4gdGhlIHB1Ymxpc2ggc2NyaXB0IHRvIHNoaXAgY2hhbmdlcyAtXG4gIG5vIENvcm5lcnN0b25lIHNhdmUgcmVxdWlyZWQuXG5cbiAgQ29udGVudCBtb2RlbCAocmVhbCwgbGl2ZSBvbiBjYW1wcy53b2wub3JnKTogZW50cmllcyBhcmUgYSByZWFsIGB0YWxrYFxuICBjdXN0b20gcG9zdCB0eXBlLCB3aXRoIGBjYW1wYC9gc3BlYWtlcmAvYHNlcmllc2AvYHRvcGljc2AgdGF4b25vbWllcyBhbmQgYW5cbiAgQUNGIFBybyBcIlRhbGsgRGV0YWlsc1wiIGZpZWxkIGdyb3VwLiBTZWVcbiAgcHJvamVjdHMvY2FtcHMvdGhlLXRha2Vhd2F5L29wcy90aGUtdGFrZWF3YXktY29udGVudC1tb2RlbC5tZCBmb3IgdGhlIGZ1bGxcbiAgZmllbGQgbGlzdC5cblxuICAyMDI2LTA4LTA1IHBhZ2luYXRpb24gcmV3b3JrIChQaGFzZSAxIG9mXG4gIG9wcy90aGUtdGFrZWF3YXktcGFnaW5hdGlvbi1yZWRlc2lnbi5tZCk6IHJlcGxhY2VkIHRoZSBvbGQgXCJmZXRjaCBhbGxcbiAgdGFsa3Mgb25jZSwgZmlsdGVyL3BhZ2luYXRlIGluIG1lbW9yeVwiIGFyY2hpdGVjdHVyZSB3aXRoIHJlYWwgc2VydmVyLXNpZGVcbiAgcGFnaW5hdGlvbiBhbmQgdGF4b25vbXktSUQtYmFzZWQgZmlsdGVyaW5nLCBzbyBodWIgbG9hZCB0aW1lIHN0YXlzIHJvdWdobHlcbiAgZmxhdCBhcyB0YWxrIGNvdW50IGdyb3dzIGluc3RlYWQgb2Ygc2NhbGluZyB3aXRoIGl0LiBDb25jcmV0ZWx5OlxuICAgIC0gVGhlIG1haW4gZ3JpZCBmZXRjaGVzIG9uZSBwYWdlIGF0IGEgdGltZSAoP3BhZ2U9TiZwZXJfcGFnZT02Jjx0YXhvbm9teVxuICAgICAgcGFyYW1zPikgaW5zdGVhZCBvZiBldmVyeXRoaW5nIHVwIGZyb250LlxuICAgIC0gQ2FtcC9TcGVha2VyL1Nlcmllcy9Ub3BpY3MgZmlsdGVyIGRyb3Bkb3ducyBhcmUgcG9wdWxhdGVkIGZyb20gdGhlXG4gICAgICB0YXhvbm9teSB0ZXJtLWxpc3QgZW5kcG9pbnRzICh3aXRoIHJlYWwgdGVybSBJRHMgKyBwZXItdGVybSBjb3VudHMpLFxuICAgICAgbm90IGRlcml2ZWQgZnJvbSBhbiBpbi1tZW1vcnkgbGlzdC5cbiAgICAtIEZlYXR1cmVkIHRhbGssIHNlcmllcyByb3dzLCBhbmQgc3BlYWtlciBzcG90bGlnaHQgZWFjaCBnZXQgdGhlaXIgb3duXG4gICAgICBzbWFsbCBkZWRpY2F0ZWQgcXVlcmllcywgZmlyZWQgb25jZSBhdCBsb2FkIC0gdGhleSBubyBsb25nZXIgYXNzdW1lXG4gICAgICB0aGUgZnVsbCB0YWxrIGxpc3QgaXMgYWxyZWFkeSBpbiBtZW1vcnkuXG4gICAgLSBSZWxhdGVkIFRhbGtzIChkZXRhaWwgdmlldykgaXMgbm93IGEgZGVkaWNhdGVkIHBlci1zcGVha2VyL3Blci1zZXJpZXNcbiAgICAgIHF1ZXJ5IGZpcmVkIHdoZW4gYSB0YWxrIGlzIG9wZW5lZCwgbm90IGEgZmlsdGVyIG92ZXIgdGhlIGZ1bGwgbGlzdC5cbiAgICAtIFNlYXJjaCAoSm9obidzIGNhbGwsIDIwMjYtMDgtMDU6IGtlZXAgZnVsbCB0aXRsZStzcGVha2VyIHBhcml0eSkgaXNcbiAgICAgIHRoZSBvbmUgZGVsaWJlcmF0ZSBleGNlcHRpb24gdG8gcmVhbCBzZXJ2ZXIgcGFnaW5hdGlvbiAtIHNlZSB0aGVcbiAgICAgIGNvbW1lbnQgYWJvdmUgcnVuU2VhcmNoKCkgZm9yIHdoeSBhbmQgaG93IGl0J3MgYm91bmRlZC5cblxuICAyMDI2LTA4LTA5IGhvbWVwYWdlIGN1cmF0aW9uIG1vZGVsIChhcHByb3ZlZCBieSBKb2huIC0gc2VlXG4gIG9wcy9ob21lcGFnZS1jdXJhdGlvbi1kZXNpZ24tYnJpZWYubWQgZm9yIHRoZSBhZ3JlZWQgZGVzaWduKTpcbiAgICAtIFRoZSBob21lcGFnZSBzZWN0aW9ucyBzdG9wcGVkIHNjYWxpbmcgd2l0aCBsaWJyYXJ5IHNpemUuIFRoZSBmZWF0dXJlZFxuICAgICAgdGFsaywgdGhlIDQgdmlzaWJsZSBzZXJpZXMgcm93cywgYW5kIHRoZSBjb2xsYXBzZWQgc3BlYWtlciBjaGlwcyBhbGxcbiAgICAgIHJvdGF0ZSBkZXRlcm1pbmlzdGljYWxseSBvbmNlIHBlciBVVEMgZGF5IChzZWUgdGhlIFJvdGF0aW9uIGhlbHBlcnMpIC1cbiAgICAgIGNob3NlbiBvdmVyIFwibmV3ZXN0XCIgYmVjYXVzZSBjb250ZW50IGxhbmRzIGluIHNlYXNvbmFsIG1hc3MgdXBsb2FkcyxcbiAgICAgIHNvIGRhdGUtb3JkZXJpbmcgd291bGQgc2l0IG9uIG9uZSBjYW1wJ3Mgd2F2ZSBmb3IgbW9udGhzIGFuZCBmcmVlemVcbiAgICAgIGVudGlyZWx5IG9mZi1zZWFzb24uXG4gICAgLSBBbiBcIkFsbCBTZXJpZXNcIiBkaXJlY3RvcnkgKHplcm8tcmVxdWVzdCB0ZXh0IHRpbGVzIGJ1aWx0IGZyb20gdGhlXG4gICAgICBhbHJlYWR5LWxvYWRlZCB0ZXJtIGxpc3QpIGNvdmVycyBldmVyeSBzZXJpZXMgdGhlIHJvdGF0aW5nIHJvd3MgZG9uJ3QuXG4gICAgLSBUaGUgY2FtcCBzcG90bGlnaHQgbW92ZWQgdXAgdW5kZXIgdGhlIGZlYXR1cmVkIHRhbGsgYXMgdGhlIHByaW1hcnlcbiAgICAgIGJyb3dzZS1ieS1jYW1wIGVudHJ5LCBhbmQgYSBjYW1wLW9ubHkgZmlsdGVyIHN0YXRlIG5vdyByZW5kZXJzIGEgY2FtcFxuICAgICAgbGFuZGluZzogdGhhdCBjYW1wJ3Mgb3duIHNlcmllcyByb3dzICsgc3BlYWtlciBjaGlwcywgdmlhIG9uZSB0cmltbWVkXG4gICAgICBwcm9iZSBmZXRjaCArIHVwIHRvIFNFUklFU19ST1dTX1NIT1dOIHBlci1zZXJpZXMgZmV0Y2hlcy5cbiAgICAtIFJlcXVlc3QgY291bnQgc3RheXMgYm91bmRlZCBieSBESVNQTEFZRUQgc2VjdGlvbiBjb3VudCwgbmV2ZXIgYnlcbiAgICAgIHRvdGFsIHNlcmllcy9zcGVha2VyL3RhbGsgY291bnQuXG5cbiAgS25vd24gbGltaXRhdGlvbiBmcm9tIHRoaXMgcmV3b3JrOiB0aGUgbG9jYWwgaHR0cC5zZXJ2ZXIgbW9jay1wcmV2aWV3IHBhdGhcbiAgKHdpbmRvdy5UVEFfTU9DS19EQVRBX1VSTCkgb25seSBldmVyIG1pcnJvcmVkIHRoZSBzaW5nbGUgXCJmZXRjaCBldmVyeXRoaW5nXCJcbiAgbGlzdCByZXNwb25zZSwgbm90IHRoZSB0YXhvbm9teSB0ZXJtLWxpc3QgLyBwZXItc2VyaWVzIC8gcGVyLXNwZWFrZXJcbiAgZW5kcG9pbnRzIHRoaXMgZmlsZSBub3cgYWxzbyBkZXBlbmRzIG9uIC0gbG9jYWwgbW9jayBwcmV2aWV3IG5vIGxvbmdlclxuICByZWZsZWN0cyByZWFsIGJlaGF2aW9yIGJleW9uZCB0aGUgdmVyeSBmaXJzdCBncmlkIHBhZ2UuIFJlYWwgdmVyaWZpY2F0aW9uXG4gIGZvciB0aGlzIHJld29yayBoYXBwZW5zIGFnYWluc3QgdGhlIGxpdmUgV1AgdGVzdCBwYWdlIChzZWVcbiAgb3BzL3RoZS10YWtlYXdheS10ZWFtLXdvcmtmbG93Lm1kKSwgbm90IGxvY2FsIG1vY2sgcHJldmlldy5cblxuICAyMDI2LTA4LTAzIHJlZGVzaWduOiByZWJ1aWx0IGFnYWluc3QgdGhlIENsYXVkZSBEZXNpZ24gXCJDYW1wcyBSZXNvdXJjZXNcbiAgSHViXCIgY29tcCAoaGVybyBiYW5uZXIsIGZlYXR1cmVkIHRhbGssIHNlcmllcyByb3dzLCBzcGVha2VyIHNwb3RsaWdodCxcbiAgY2FtcCBzcG90bGlnaHQsIHBhZ2luYXRlZCBncmlkLCByZWRlc2lnbmVkIHRhbGsgZGV0YWlsKS4gVGhlIGNvbXAncyBvd25cbiAgVEFMS1MgYXJyYXkgaXMgMTAwJSBwbGFjZWhvbGRlciBjb250ZW50IGZvciBkZXNpZ24gcHVycG9zZXMgLSBpbnRlbnRpb25hbGx5XG4gIGlnbm9yZWQgaGVyZTsgdGhpcyBmaWxlIG9ubHkgZXZlciByZWFkcyByZWFsIGRhdGEgZnJvbSB0aGUgUkVTVCBlbmRwb2ludFxuICAob3IgdGhlIGxvY2FsIG1vY2sgZmlsZSBiZWxvdykuIFR3byB0aGluZ3MgZnJvbSB0aGUgY29tcCBhcmUgZGVsaWJlcmF0ZWx5XG4gIE5PVCBpbXBsZW1lbnRlZCBhcyBzaG93bjpcbiAgICAtIFRoZSBlbWFpbC1nYXRlZCBzdHVkeSBub3RlcyBtb2RhbCBhbmQgYm90aCBuZXdzbGV0dGVyIHNpZ251cCBmb3Jtc1xuICAgICAgaGF2ZSBubyByZWFsIGJhY2tlbmQgKG5vIFBhcmRvdC9Gb3Jtc3RhY2sgaW50ZWdyYXRpb24gZXhpc3RzIHlldCkuXG4gICAgICBTdHVkeSBub3RlcyBzdGF5IGEgcGxhaW4sIG9wZW4gZG93bmxvYWQgbGluay4gVGhlIG5ld3NsZXR0ZXIgZm9ybXNcbiAgICAgIHJlbmRlciBmb3IgdmlzdWFsIHBhcml0eSBidXQgdGhlaXIgc3VibWl0IGhhbmRsZXJzIHNheSBzbyBob25lc3RseVxuICAgICAgcmF0aGVyIHRoYW4gZmFraW5nIGEgXCJ5b3UncmUgaW5cIiBzdWNjZXNzIHN0YXRlIC0gc2VlXG4gICAgICBORVdTTEVUVEVSX05PVF9DT05ORUNURURfTVNHIGJlbG93LlxuICAgIC0gRmlsdGVyaW5nIGtlZXBzIHRoZSBhbHJlYWR5LWxpdmUgVG9waWNzIGZpbHRlciAqaW4gYWRkaXRpb24gdG8qIHRoZVxuICAgICAgY29tcCdzIENhbXAvU3BlYWtlci9TZXJpZXMvU29ydCBjb250cm9scywgcGVyIEpvaG4ncyBleHBsaWNpdCBjYWxsXG4gICAgICAoMjAyNi0wOC0wMykgLSB0aGUgY29tcCdzIG93biBmaWx0ZXIgc2V0IGRvZXNuJ3QgaW5jbHVkZSB0b3BpY3MgYXRcbiAgICAgIGFsbCwgYnV0IGRyb3BwaW5nIGEgd29ya2luZyBmZWF0dXJlIHRvIG1hdGNoIGEgZGVzaWduIGNvbXAgaXNuJ3QgdGhlXG4gICAgICByaWdodCB0cmFkZS5cbiovXG4oZnVuY3Rpb24gKCkge1xuICAvLyAtLS0tIEVhc3ktdG8tZWRpdCBjb25maWcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICB2YXIgU0lURV9VUkwgPSB3aW5kb3cuVFRBX1NJVEVfVVJMIHx8IFwiXCI7XG4gIHZhciBNT0NLX0RBVEFfVVJMID0gd2luZG93LlRUQV9NT0NLX0RBVEFfVVJMIHx8IG51bGw7IC8vIGxvY2FsIHByZXZpZXcgb25seSwgbmV2ZXIgc2V0IGluIHByb2R1Y3Rpb24gLSBzZWUgZmlsZSBoZWFkZXIgcmU6IHBvc3QtcmV3b3JrIGxpbWl0YXRpb25cbiAgdmFyIFBBR0VfU0laRSA9IDY7XG4gIHZhciBTRUFSQ0hfREVCT1VOQ0VfTVMgPSAzMDA7XG4gIHZhciBORVdTTEVUVEVSX05PVF9DT05ORUNURURfTVNHID0gXCJFbWFpbCBzaWdudXAgaXNuJ3QgY29ubmVjdGVkIHlldCAtIGNoZWNrIGJhY2sgc29vbi5cIjtcblxuICAvLyAtLS0tIEhvbWVwYWdlIGN1cmF0aW9uICgyMDI2LTA4LTA5LCBKb2huLWFwcHJvdmVkIGRlc2lnbikgLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFNldCB0byBhIHRhbGsncyBzbHVnIHRvIFBJTiB0aGUgZmVhdHVyZWQgc2xvdCAobGF1bmNoIHdlZWssIHNlYXNvbmFsXG4gIC8vIHB1c2gpIC0gZW1wdHkgc3RyaW5nIG1lYW5zIGRhaWx5IHJvdGF0aW9uLiBBIGJhZC91bnB1Ymxpc2hlZCBzbHVnIGZhbGxzXG4gIC8vIGJhY2sgdG8gcm90YXRpb24gcmF0aGVyIHRoYW4gYmxhbmtpbmcgdGhlIHNsb3QuXG4gIHZhciBGRUFUVVJFRF9QSU5fU0xVRyA9IFwiXCI7XG4gIC8vIEhvdyBtYW55IHNlcmllcyByb3dzIHRoZSBob21lcGFnZSBzaG93cyAocm90YXRpbmcgZGFpbHkpLiBOb3QgYSBsb2NrZWRcbiAgLy8gdmFsdWUgLSBKb2huJ3Mgc3RhbmRpbmcgcnVsZSBpcyB0byB0dW5lIGZvciB2aXNpdG9yIGV4cGVyaWVuY2UuXG4gIHZhciBTRVJJRVNfUk9XU19TSE9XTiA9IDQ7XG4gIC8vIFNwZWFrZXIgc2VjdGlvbjogc2hvdyBldmVyeW9uZSB1bnRpbCB0aGUgcm9zdGVyIHBhc3NlcyB0aGUgdGhyZXNob2xkLFxuICAvLyB0aGVuIGNvbGxhcHNlIHRvIGEgcm90YXRpbmcgc3Vic2V0IGJlaGluZCBhIFwiU2hvdyBhbGxcIiB0b2dnbGUuXG4gIHZhciBTUEVBS0VSX0NPTExBUFNFX1RIUkVTSE9MRCA9IDEyO1xuICB2YXIgU1BFQUtFUl9DSElQU19TSE9XTiA9IDg7XG4gIC8vIEZlYXR1cmVkLXRhbGsgcm90YXRpb24gaG9wLiBDb25zZWN1dGl2ZSBVVEMgZGF5cyBqdW1wIH4xNyByYW5rcyB0aHJvdWdoXG4gIC8vIHRoZSBkYXRlLW9yZGVyZWQgbGlicmFyeSBpbnN0ZWFkIG9mIG1hcmNoaW5nIHRocm91Z2ggb25lIHNwZWFrZXIncyB3ZWVrXG4gIC8vIG9mIHRhbGtzIC0gdGhlIHdob2xlIHBvaW50IG9mIHJvdGF0aW5nIGlzIGNyb3NzLWNhbXAvc3BlYWtlciB2YXJpZXR5LlxuICB2YXIgUk9UQVRJT05fU1RSSURFID0gMTc7XG4gIC8vIENhbXAtbGFuZGluZyBwcm9iZSBzaXplOiBob3cgbWFueSBvZiBhIGNhbXAncyBuZXdlc3QgdGFsa3MgYXJlIHNjYW5uZWRcbiAgLy8gdG8gZGlzY292ZXIgd2hpY2ggc2VyaWVzL3NwZWFrZXJzIGJlbG9uZyB0byB0aGF0IGNhbXAuIEEgZml4ZWQgY29uc3RhbnRcbiAgLy8gKGJvdW5kZWQpLCBub3QgYSBmdW5jdGlvbiBvZiBsaWJyYXJ5IHNpemUuXG4gIHZhciBDQU1QX1BST0JFX1NJWkUgPSAyNDtcblxuICAvLyBSZWFsIFdvcmRQcmVzcyBjYW1wLXRheG9ub215IHRlcm0gbmFtZXMgZGlmZmVyIGZyb20gdGhlIGNvbXAncyBzaG9ydFxuICAvLyBkaXNwbGF5IG5hbWVzIGluIG9uZSBjYXNlIChzZWUgQ0FNUF9OQU1FX0FMSUFTRVMgaW5cbiAgLy8gdGhlX3Rha2Vhd2F5X21pZ3JhdGUucHkgZm9yIHRoZSBzYW1lIG1hcHBpbmcgb24gdGhlIHdyaXRlIHNpZGUpLlxuICB2YXIgQ0FNUF9ESVNQTEFZX1RPX1JFQUwgPSB7IFwiVGhlIFBpbmVzXCI6IFwiVGhlIFBpbmVzIENhbXBncm91bmRcIiB9O1xuXG4gIC8vIFJlYWwsIHdlbGwtc2hvdCBoZWFkc2hvdHMgdG8gdXNlIGluIHBsYWNlIG9mIHRoZSBtb3N0LXJlY2VudC10YWxrXG4gIC8vIHRodW1ibmFpbCBzdGFuZC1pbiBhdmF0YXIgLSBhZGRlZCBhcyBlYWNoIHNwZWFrZXIncyBwaG90byBpcyBwcm92aWRlZC5cbiAgLy8gRmFsbHMgYmFjayB0byB0aGUgdGh1bWJuYWlsIHN0YW5kLWluIGZvciBhbnkgc3BlYWtlciBub3QgeWV0IGluIGhlcmUuXG4gIC8vIDIwMjYtMDgtMDg6IGZhY2UtZGV0ZWN0ZWQgMTA4MHgxMDgwIHNxdWFyZXMgZ2VuZXJhdGVkIGZyb20gSm9obidzXG4gIC8vIGhlYWRzaG90cyBpbiBEb3dubG9hZHMvVGhlIFRha2Vhd2F5IChvcmlnaW5hbHMgdW50b3VjaGVkOyBzcXVhcmVzIGluXG4gIC8vIHNwZWFrZXItc3F1YXJlcy0xMDgwLyB0aGVyZSkuIENvcmV5IEFibmV5J3Mgc291cmNlIGlzIGEgdmlkZW8gc3RpbGwsXG4gIC8vIG5vdCBhIHBvcnRyYWl0IC0gcmVwbGFjZSB3aGVuIGEgcmVhbCBoZWFkc2hvdCBleGlzdHMuIFNxdWFyZXMgZm9yXG4gIC8vIHVwY29taW5nIFBpbmVzIHNwZWFrZXJzIChQYXVsIERhdmlzLCBFcndpbiBMdXR6ZXIsIFRvbSBNZXNzZXIpIGFyZVxuICAvLyBhbHJlYWR5IGdlbmVyYXRlZCBpbiB0aGUgc2FtZSBmb2xkZXIsIHJlYWR5IHRvIHdpcmUgd2hlbiB0aGVpciB0YWxrc1xuICAvLyBsYW5kLlxuICB2YXIgU1BFQUtFUl9QSE9UT1MgPSB7XG4gICAgXCJBbGVqYW5kcm8gTnVlc2NoXCI6IFwiaHR0cHM6Ly9jYW1wcy53b2wub3JnL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L3NwZWFrZXItYWxlamFuZHJvLW51ZXNjaC0xMDgwc3EuanBnXCIsXG4gICAgXCJCcmFuZG9uIEFybm9sZFwiOiBcImh0dHBzOi8vY2FtcHMud29sLm9yZy93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9zcGVha2VyLWJyYW5kb24tYXJub2xkLTEwODBzcS5qcGdcIixcbiAgICBcIkJyZW50IEZpbmNodW1cIjogXCJodHRwczovL2NhbXBzLndvbC5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvc3BlYWtlci1icmVudC1maW5jaHVtLTEwODBzcS5qcGdcIixcbiAgICBcIkNvcmV5IEFibmV5XCI6IFwiaHR0cHM6Ly9jYW1wcy53b2wub3JnL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L3NwZWFrZXItY29yZXktYWJuZXktMTA4MHNxLmpwZ1wiLFxuICAgIFwiRXRoYW4gV2FycmVuXCI6IFwiaHR0cHM6Ly9jYW1wcy53b2wub3JnL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L3NwZWFrZXItZXRoYW4td2FycmVuLTEwODBzcS5qcGdcIixcbiAgICBcIkdhdnluIEFuZHJld3NcIjogXCJodHRwczovL2NhbXBzLndvbC5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvc3BlYWtlci1nYXZ5bi1hbmRyZXdzLTEwODBzcS5qcGdcIixcbiAgICBcIkpvZSBTdG93ZWxsXCI6IFwiaHR0cHM6Ly9jYW1wcy53b2wub3JnL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L3NwZWFrZXItam9lLXN0b3dlbGwtMTA4MHNxLmpwZ1wiLFxuICAgIFwiS3lsZSBHcmF5XCI6IFwiaHR0cHM6Ly9jYW1wcy53b2wub3JnL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L3NwZWFrZXIta3lsZS1ncmF5LTEwODBzcS5qcGdcIixcbiAgICBcIk1pa2UgQnJlYW1cIjogXCJodHRwczovL2NhbXBzLndvbC5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvc3BlYWtlci1taWtlLWJyZWFtLTEwODBzcS5qcGdcIixcbiAgICBcIk5hdGhhbiBMaW5vXCI6IFwiaHR0cHM6Ly9jYW1wcy53b2wub3JnL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L3NwZWFrZXItbmF0aGFuLWxpbm8tMTA4MHNxLmpwZ1wiLFxuICAgIFwiUGhpbCBNb3NlclwiOiBcImh0dHBzOi8vY2FtcHMud29sLm9yZy93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9zcGVha2VyLXBoaWwtbW9zZXItMTA4MHNxLmpwZ1wiLFxuICAgIFwiUGhpbCBUdXR0bGVcIjogXCJodHRwczovL2NhbXBzLndvbC5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvc3BlYWtlci1waGlsLXR1dHRsZS0xMDgwc3EuanBnXCIsXG4gICAgXCJSYXkgUHJpdGNoYXJkXCI6IFwiaHR0cHM6Ly9jYW1wcy53b2wub3JnL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L3NwZWFrZXItcmF5LXByaXRjaGFyZC0xMDgwc3EuanBnXCIsXG4gICAgXCJSaWNoIEFuZHJld3NcIjogXCJodHRwczovL2NhbXBzLndvbC5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvc3BlYWtlci1yaWNoLWFuZHJld3MtMTA4MHNxLmpwZ1wiLFxuICB9O1xuXG4gIC8vIEJyb3dzZSBieSBDYW1wIGNhbmRpZGF0ZXMuIE9ubHkgY2FtcHMgd2l0aCBhdCBsZWFzdCBvbmUgUFVCTElTSEVEIHRhbGtcbiAgLy8gYWN0dWFsbHkgcmVuZGVyIChKb2huJ3MgY2FsbCAyMDI2LTA4LTA5OyBzZWUgbG9hZENhbXBTcG90bGlnaHQpIC0gc29cbiAgLy8gcHJlLWxpc3RpbmcgZXZlcnkgY2FtcCBoZXJlIGlzIHNhZmUsIGNhcmRzIGFwcGVhciBieSB0aGVtc2VsdmVzIHRoZSBkYXlcbiAgLy8gYSBjYW1wJ3MgZmlyc3QgdGFsayBwdWJsaXNoZXMuIGBuYW1lYCBtdXN0IHJlc29sdmUgdG8gdGhlIFdQIGNhbXAgdGVybVxuICAvLyAoZGlyZWN0bHkgb3IgdmlhIENBTVBfRElTUExBWV9UT19SRUFMKTsgUGFsbSBHcm92ZSBhbmQgSmVubmVzcyBQYXJrXG4gIC8vIGhhdmUgTk8gY2FtcCB0ZXJtIHlldCAtIGlmIHRoZWlyIHRlcm1zIGdldCBjcmVhdGVkIHVuZGVyIGxvbmdlciBuYW1lc1xuICAvLyAoZS5nLiBcIlBhbG0gR3JvdmUgUmV0cmVhdCBDZW50ZXJcIiksIGFkZCBhIENBTVBfRElTUExBWV9UT19SRUFMIGFsaWFzLlxuICAvLyBDb2xvcnMgYXJlIHRoZSByZWFsIGJyYW5kIGNvbG9ycyBmcm9tIHRoZSBicmFuZCBndWlkZSdzIFwiT3RoZXIgQ29sb3JzXCJcbiAgLy8gcGFnZXMgKHByb3ZpZGVkIGJ5IEpvaG4gMjAyNi0wOC0wOSk7IGFsbCBsb2dvcyB2ZXJpZmllZCBsaXZlIGluIHRoZSBXUFxuICAvLyBtZWRpYSBsaWJyYXJ5ICh0aGUgMjAyNi8wNCBgKl93aGl0ZS5wbmdgIHNldCwgSFRUUCAyMDAgY2hlY2tlZCkuXG4gIC8vIE5vdGU6IFBhbG0gR3JvdmUgYW5kIFRoZSBDb2FzdCBnZW51aW5lbHkgc2hhcmUgIzJmYjlhYyBpbiB0aGUgZ3VpZGUuXG4gIC8vIFRPRE86IEludGVyc2VjdCBpcyBkZWxpYmVyYXRlbHkgTk9UIGxpc3RlZCAtIGl0IGlzIDMgc2VwYXJhdGUgV1AgdGVybXNcbiAgLy8gKENBL05IL09IKSBhbmQgMiBicmFuZCBjb2xvcnMgKEJsdWUgIzAwOWVjYyAvIFJlZCAjZWQxYzI5KTsgbmVlZHNcbiAgLy8gSm9obidzIGNhbGwgb24gY2FyZCBzaGFwZSAob25lIGNhcmQgb3IgdGhyZWUsIHdoaWNoIGNvbG9yKSB3aGVuXG4gIC8vIEludGVyc2VjdCBjb250ZW50IGlzIGFjdHVhbGx5IHBsYW5uZWQuXG4gIHZhciBDQU1QX1NQT1RMSUdIVCA9IFtcbiAgICB7IG5hbWU6IFwiVGhlIFBpbmVzXCIsIGNvbG9yOiBcIiM0ZjVlMzVcIiwgbG9nbzogXCJodHRwczovL2NhbXBzLndvbC5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvY2FtcC1waW5lcy13aGl0ZS5wbmdcIiB9LFxuICAgIHsgbmFtZTogXCJUaGUgQ29hc3RcIiwgY29sb3I6IFwiIzJmYjlhY1wiLCBsb2dvOiBcImh0dHBzOi8vY2FtcHMud29sLm9yZy93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9jYW1wLWNvYXN0LXdoaXRlLnBuZ1wiIH0sXG4gICAgeyBuYW1lOiBcIlRoZSBJc2xhbmRcIiwgY29sb3I6IFwiIzI0OGE5NlwiLCBsb2dvOiBcImh0dHBzOi8vY2FtcHMud29sLm9yZy93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9jYW1wLWlzbGFuZC13aGl0ZS5wbmdcIiB9LFxuICAgIHsgbmFtZTogXCJUaGUgUmlkZ2VcIiwgY29sb3I6IFwiIzcwNzU0MFwiLCBsb2dvOiBcImh0dHBzOi8vY2FtcHMud29sLm9yZy93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9jYW1wLXJpZGdlLXdoaXRlLnBuZ1wiIH0sXG4gICAgeyBuYW1lOiBcIlRoZSBSYW5jaFwiLCBjb2xvcjogXCIjZDkyZTNhXCIsIGxvZ286IFwiaHR0cHM6Ly9jYW1wcy53b2wub3JnL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA0L1JhbmNoX3doaXRlLnBuZ1wiIH0sXG4gICAgeyBuYW1lOiBcIlNub3djYW1wXCIsIGNvbG9yOiBcIiM4MzE1MWZcIiwgbG9nbzogXCJodHRwczovL2NhbXBzLndvbC5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDQvU25vd2NhbXBfd2hpdGUucG5nXCIgfSxcbiAgICB7IG5hbWU6IFwiUHVyc3VpdCBDYW1wXCIsIGNvbG9yOiBcIiM3NTRmOGJcIiwgbG9nbzogXCJodHRwczovL2NhbXBzLndvbC5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDQvUHVyc3VpdF93aGl0ZS5wbmdcIiB9LFxuICAgIHsgbmFtZTogXCJQYWxtIEdyb3ZlXCIsIGNvbG9yOiBcIiMyZmI5YWNcIiwgbG9nbzogXCJodHRwczovL2NhbXBzLndvbC5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDQvUGFsbS1Hcm92ZV93aGl0ZS5wbmdcIiB9LFxuICAgIHsgbmFtZTogXCJKZW5uZXNzIFBhcmtcIiwgY29sb3I6IFwiI2JiOGQyZFwiLCBsb2dvOiBcImh0dHBzOi8vY2FtcHMud29sLm9yZy93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wNC9KZW5uZXNzLVBhcmtfd2hpdGUucG5nXCIgfSxcbiAgXTtcbiAgdmFyIEhFUk9fSU1BR0VfVVJMID0gXCJodHRwczovL2NhbXBzLndvbC5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvaGVyby13b3JzaGlwLWJ3LnBuZ1wiO1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgdmFyIHN0YXRlID0ge1xuICAgIHZpZXc6IFwibGlzdFwiLCAvLyBcImxpc3RcIiB8IFwiZGV0YWlsXCJcbiAgICBzaW5nbGVNb2RlOiBmYWxzZSwgLy8gdHJ1ZSB3aGVuIHJ1bm5pbmcgb24gYSB0YWxrJ3Mgb3duIHBlcm1hbGluayAoY2FtcHMud29sLm9yZy90YWxrLzxzbHVnPi8pIHJhdGhlciB0aGFuIHRoZSBodWIgLSBzZWUgaW5pdFNpbmdsZSgpXG4gICAgY3VycmVudElkOiBudWxsLFxuICAgIGZpbHRlcmVkQ2FtcElkOiBcIlwiLFxuICAgIGZpbHRlcmVkU3BlYWtlcklkOiBcIlwiLFxuICAgIGZpbHRlcmVkU2VyaWVzSWQ6IFwiXCIsXG4gICAgZmlsdGVyZWRUb3BpY0lkOiBcIlwiLFxuICAgIHNlYXJjaDogXCJcIixcbiAgICBzb3J0OiBcIm5ld2VzdFwiLFxuICAgIHRlcm1zOiB7IGNhbXA6IFtdLCBzcGVha2VyOiBbXSwgc2VyaWVzOiBbXSwgdG9waWNzOiBbXSB9LFxuICAgIGZlYXR1cmVkOiBudWxsLFxuICAgIHNlcmllc1Jvd3NIdG1sOiBcIlwiLFxuICAgIHNwZWFrZXJTcG90bGlnaHRIdG1sOiBcIlwiLFxuICAgIGNhbXBTcG90bGlnaHRIdG1sOiBcIlwiLFxuICAgIHNwZWFrZXJQb29sOiBbXSwgICAgICAgICAgLy8gcHVibGlzaGVkIHNwZWFrZXIgdGVybXMgLSBzb3VyY2UgZm9yIGNoaXBzICsgdGhlIFNob3cgYWxsIHRvZ2dsZVxuICAgIHNwZWFrZXJGYWxsYmFja1Bob3Rvczoge30sIC8vIHRlcm0gaWQgLT4gbGF0ZXN0LXRhbGsgdGh1bWJuYWlsLCBmZXRjaGVkIE9OTFkgZm9yIHNwZWFrZXJzIG1pc3NpbmcgZnJvbSBTUEVBS0VSX1BIT1RPU1xuICAgIHNwZWFrZXJTaG93QWxsOiBmYWxzZSwgICAgIC8vIFNob3cgYWxsIE4gc3BlYWtlcnMgdG9nZ2xlIHN0YXRlXG4gICAgY2FtcExhbmRpbmc6IHsgICAgICAgICAgICAgLy8gY2FtcC1vbmx5IGZpbHRlciBzdGF0ZSByZW5kZXJzIHRoYXQgY2FtcCdzIG93biBzZXJpZXMgcm93cyArIHNwZWFrZXIgY2hpcHNcbiAgICAgIGNhbXBJZDogbnVsbCxcbiAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgIHNlcmllc0h0bWw6IFwiXCIsXG4gICAgICBzcGVha2Vyc0h0bWw6IFwiXCIsXG4gICAgICB0b2tlbjogMCAgICAgICAgICAgICAgICAgLy8gc2FtZSBtb25vdG9uaWMgcmFjZS1ndWFyZCBwYXR0ZXJuIGFzIGdyaWQucmVxdWVzdFRva2VuXG4gICAgfSxcbiAgICBlbnRyeUNhY2hlOiB7fSwgLy8gaWQgLT4gbm9ybWFsaXplZCBlbnRyeSwgcG9wdWxhdGVkIGJ5IG5vcm1hbGl6ZSgpIG5vIG1hdHRlciB3aGljaCBmZXRjaCBpdCBjYW1lIGZyb21cbiAgICBob21lcGFnZVNlY3Rpb25zTG9hZGVkOiBmYWxzZSwgLy8gc2VyaWVzIHJvd3MgKyBzcGVha2VyIHNwb3RsaWdodCByZXNvbHZlZCAob3IgZmFpbGVkKSAtIHJlbGVhc2VzIHRoZSBDTFMgcGxhY2Vob2xkZXIgc3BhY2VcbiAgICBiYXNlRG9jVGl0bGU6IFwiXCIsIC8vIHRoZSBodWIgcGFnZSdzIG93biBkb2N1bWVudC50aXRsZSwgY2FwdHVyZWQgYXQgaW5pdCAtIHJlc3RvcmVkIGJ5IHNob3dMaXN0KClcbiAgICBncmlkOiB7XG4gICAgICBsb2FkaW5nOiBmYWxzZSwgICAgICAvLyBmdWxsIHJlbG9hZCAocGFnZSAxIC8gZmlsdGVyIC8gc29ydCAvIHNlYXJjaCBjaGFuZ2UpXG4gICAgICBhcHBlbmRMb2FkaW5nOiBmYWxzZSwgLy8gYSBcIkxvYWQgTW9yZVwiIGZldGNoIGlzIGluIGZsaWdodFxuICAgICAgcGFnZTogMSxcbiAgICAgIHRvdGFsUGFnZXM6IDEsXG4gICAgICB0b3RhbDogMCxcbiAgICAgIGVycm9yOiBcIlwiLCAgICAgICAgICAvLyBub24tZW1wdHkgPSB0aGUgbGFzdCBncmlkL3NlYXJjaCBmZXRjaCBmYWlsZWQ7IHJlbmRlcmVkIGJ5IHJlbmRlckdyaWREb20gaW5zdGVhZCBvZiB0aGUgbWlzbGVhZGluZyBcIm5vIHRhbGtzIG1hdGNoXCIgZW1wdHkgdGV4dFxuICAgICAgcmVxdWVzdFRva2VuOiAwLCAgICAvLyBtb25vdG9uaWMgZmV0Y2ggZ3VhcmQgLSBhIHJlc3BvbnNlIG9ubHkgY29tbWl0cyBpZiBpdHMgdG9rZW4gaXMgc3RpbGwgY3VycmVudCwgc28gYSBzbG93IG9sZGVyIGZpbHRlci9zZWFyY2ggcmVzcG9uc2UgY2FuIG5ldmVyIG92ZXJ3cml0ZSBhIG5ld2VyIG9uZSdzIHJlc3VsdHMgKDIwMjYtMDgtMDggVVggcGFzcylcbiAgICAgIGl0ZW1zOiBbXSwgICAgICAgICAgLy8gYWNjdW11bGF0ZWQgcGFnZXMsIHNlcnZlci1wYWdpbmF0ZWQgbW9kZSAobm8gYWN0aXZlIHNlYXJjaClcbiAgICAgIHNlYXJjaEl0ZW1zOiBudWxsLCAgLy8gbWVyZ2VkIHJlc3VsdCBzZXQsIGNsaWVudC1wYWdpbmF0ZWQgLSBvbmx5IHdoaWxlIHN0YXRlLnNlYXJjaCBpcyBub24tZW1wdHlcbiAgICAgIHZpc2libGVDb3VudDogUEFHRV9TSVpFIC8vIGNsaWVudC1zaWRlIHJldmVhbCBjb3VudCwgdXNlZCBvbmx5IGluIHNlYXJjaCBtb2RlXG4gICAgfSxcbiAgICBoYW5kbGluZ1BvcHN0YXRlOiBmYWxzZSAvLyB0cnVlIHdoaWxlIGluc2lkZSBhIHBvcHN0YXRlIGhhbmRsZXIgLSBzdXBwcmVzc2VzIHB1c2hTdGF0ZSBzbyB3ZSBkb24ndCBkb3VibGUtcHVzaFxuICB9O1xuXG4gIC8vIC0tLS0gQnVpbGQgdGhlIHdpZGdldCdzIERPTSBpbnRvICN0dGEtcm9vdCAobW91bnQgcG9pbnQgZnJvbSB0aGUgc3R1YikgLS1cbiAgZnVuY3Rpb24gYnVpbGRTa2VsZXRvbihyb290KSB7XG4gICAgcm9vdC5pbm5lckhUTUwgPVxuICAgICAgJzxkaXYgaWQ9XCJ0dGEtYXBwXCI+JyArXG5cbiAgICAgICAgJzxkaXYgY2xhc3M9XCJ0dGEtaGVyb1wiIGlkPVwidHRhLWhlcm9cIj4nICtcbiAgICAgICAgICAnPGRpdiBjbGFzcz1cInR0YS1oZXJvLWJnXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWltYWdlOnVybCgmcXVvdDsnICsgSEVST19JTUFHRV9VUkwgKyAnJnF1b3Q7KVwiPjwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IGNsYXNzPVwidHRhLWhlcm8tdGludFwiPjwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IGNsYXNzPVwidHRhLWhlcm8taW5uZXJcIj4nICtcbiAgICAgICAgICAgICc8cCBjbGFzcz1cInR0YS1oZXJvLWV5ZWJyb3dcIj5Zb3V0aCAmYW1wOyBGYW1pbHkgQ2FtcHM8L3A+JyArXG4gICAgICAgICAgICAnPGgxIGNsYXNzPVwidHRhLWhlcm8tdGl0bGVcIiBpZD1cInR0YS1oZXJvLXRpdGxlXCIgdGFiaW5kZXg9XCItMVwiPlRoZSBUYWtlYXdheTwvaDE+JyArXG4gICAgICAgICAgICAnPHAgY2xhc3M9XCJ0dGEtaGVyby1zdWJ0aXRsZVwiPkZ1bGwgbWVzc2FnZXMgZnJvbSB5b3VyIHdlZWsgYXQgY2FtcCAmbWRhc2g7IHZpZGVvLCBzdHVkeSBub3RlcywgYW5kIHRyYW5zY3JpcHRzIGZyb20gdGhlIHNwZWFrZXJzIHdobyB3ZXJlIHRoZXJlIHdpdGggeW91LiBLZWVwIHRha2luZyB5b3VyIG5leHQgc3RlcCB3aXRoIEplc3VzLjwvcD4nICtcbiAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICc8L2Rpdj4nICtcblxuICAgICAgICAnPGRpdiBpZD1cInR0YS1saXN0LXZpZXdcIj4nICtcblxuICAgICAgICAgICc8ZGl2IGNsYXNzPVwidHRhLWZpbHRlcnNcIj4nICtcbiAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInR0YS1maWx0ZXJzLWxhYmVsXCI+RmlsdGVyPC9zcGFuPicgK1xuICAgICAgICAgICAgJzxzZWxlY3QgaWQ9XCJ0dGEtY2FtcC1maWx0ZXJcIiBhcmlhLWxhYmVsPVwiRmlsdGVyIGJ5IGNhbXBcIj48b3B0aW9uIHZhbHVlPVwiXCI+QWxsIENhbXAgUHJvcGVydGllczwvb3B0aW9uPjwvc2VsZWN0PicgK1xuICAgICAgICAgICAgJzxzZWxlY3QgaWQ9XCJ0dGEtc3BlYWtlci1maWx0ZXJcIiBhcmlhLWxhYmVsPVwiRmlsdGVyIGJ5IHNwZWFrZXJcIj48b3B0aW9uIHZhbHVlPVwiXCI+QWxsIFNwZWFrZXJzPC9vcHRpb24+PC9zZWxlY3Q+JyArXG4gICAgICAgICAgICAnPHNlbGVjdCBpZD1cInR0YS1zZXJpZXMtZmlsdGVyXCIgYXJpYS1sYWJlbD1cIkZpbHRlciBieSBzZXJpZXNcIj48b3B0aW9uIHZhbHVlPVwiXCI+QWxsIFNlcmllczwvb3B0aW9uPjwvc2VsZWN0PicgK1xuICAgICAgICAgICAgJzxzZWxlY3QgaWQ9XCJ0dGEtdG9waWMtZmlsdGVyXCIgYXJpYS1sYWJlbD1cIkZpbHRlciBieSB0b3BpY1wiPjxvcHRpb24gdmFsdWU9XCJcIj5BbGwgVG9waWNzPC9vcHRpb24+PC9zZWxlY3Q+JyArXG4gICAgICAgICAgICAnPGlucHV0IHR5cGU9XCJzZWFyY2hcIiBpZD1cInR0YS1zZWFyY2hcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBieSBzcGVha2VyIG9yIHRpdGxlJmhlbGxpcDtcIiBhcmlhLWxhYmVsPVwiU2VhcmNoIHRhbGtzXCI+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInR0YS1zb3J0LWdyb3VwXCI+JyArXG4gICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInR0YS1maWx0ZXJzLWxhYmVsXCI+U29ydDwvc3Bhbj4nICtcbiAgICAgICAgICAgICAgJzxzZWxlY3QgaWQ9XCJ0dGEtc29ydFwiIGFyaWEtbGFiZWw9XCJTb3J0IHRhbGtzXCI+JyArXG4gICAgICAgICAgICAgICAgJzxvcHRpb24gdmFsdWU9XCJuZXdlc3RcIj5OZXdlc3QgRmlyc3Q8L29wdGlvbj4nICtcbiAgICAgICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT1cIm9sZGVzdFwiPk9sZGVzdCBGaXJzdDwvb3B0aW9uPicgK1xuICAgICAgICAgICAgICAnPC9zZWxlY3Q+JyArXG4gICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgJzwvZGl2PicgK1xuXG4gICAgICAgICAgJzxkaXYgY2xhc3M9XCJ0dGEtY29udGFpbmVyXCI+JyArXG4gICAgICAgICAgICAvLyBCcmVhZGNydW1iIG1vdmVkIHRvIHRoZSB0b3Agb2YgdGhlIGNvbnRhaW5lciAyMDI2LTA4LTA5XG4gICAgICAgICAgICAvLyAoSm9obidzIGNhbGwpOiBvbiBhIGNhbXAvc3BlYWtlciBsYW5kaW5nIHRoZSB3YXkgYmFjayB0byB0aGVcbiAgICAgICAgICAgIC8vIGh1YiBiZWxvbmdzIHJpZ2h0IHVuZGVyIHRoZSBmaWx0ZXIgYmFyLCBub3QgYnVyaWVkIGFib3ZlIHRoZVxuICAgICAgICAgICAgLy8gQWxsIFRhbGtzIGdyaWQgd2hlcmUgaXQgb3JpZ2luYWxseSBzYXQuXG4gICAgICAgICAgICAnPGRpdiBpZD1cInR0YS1maWx0ZXItYnJlYWRjcnVtYlwiIGNsYXNzPVwidHRhLWJyZWFkY3J1bWJcIiBoaWRkZW4+JyArXG4gICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cInR0YS1maWx0ZXItYnJlYWRjcnVtYi1ob21lXCI+VGhlIFRha2Vhd2F5PC9idXR0b24+JyArXG4gICAgICAgICAgICAgICc8c3Bhbj4vPC9zcGFuPicgK1xuICAgICAgICAgICAgICAnPHNwYW4gaWQ9XCJ0dGEtZmlsdGVyLWJyZWFkY3J1bWItbGFiZWxcIj48L3NwYW4+JyArXG4gICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAvLyBhcmlhLWxpdmUgcmVnaW9ucyAoMjAyNi0wOC0wOCBVWCBwYXNzKTogcmVzdWx0IGNvdW50LCBsb2FkXG4gICAgICAgICAgICAvLyBzdGF0dXMsIGFuZCBlbXB0eS1zdGF0ZSB0ZXh0IGFsbCB1cGRhdGUgc2lsZW50bHkgb3RoZXJ3aXNlIC1cbiAgICAgICAgICAgIC8vIHBvbGl0ZSBsaXZlIHJlZ2lvbnMgYW5ub3VuY2UgdGhlbSB0byBzY3JlZW4gcmVhZGVycy4gVGhlc2VcbiAgICAgICAgICAgIC8vIGVsZW1lbnRzIGV4aXN0IGZyb20gc2tlbGV0b24tYnVpbGQgdGltZSAoY29udGVudCBzd2FwcGVkLCB0aGVcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgaXRzZWxmIG5ldmVyIHJlLWNyZWF0ZWQpLCB3aGljaCBpcyB3aGF0IG1ha2VzIGxpdmVcbiAgICAgICAgICAgIC8vIHJlZ2lvbnMgYWN0dWFsbHkgZmlyZS5cbiAgICAgICAgICAgICc8cCBjbGFzcz1cInR0YS1yZXN1bHQtY291bnRcIiBpZD1cInR0YS1yZXN1bHQtY291bnRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj48L3A+JyArXG4gICAgICAgICAgICAnPGRpdiBpZD1cInR0YS1zdGF0dXNcIiBjbGFzcz1cInR0YS1zdGF0dXNcIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwicG9saXRlXCIgaGlkZGVuPjwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgaWQ9XCJ0dGEtZW1wdHlcIiBjbGFzcz1cInR0YS1lbXB0eVwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGhpZGRlbj48L2Rpdj4nICtcblxuICAgICAgICAgICAgJzxkaXYgaWQ9XCJ0dGEtZmVhdHVyZWRcIj48L2Rpdj4nICtcbiAgICAgICAgICAgIC8vIENhbXAgc3BvdGxpZ2h0IHNpdHMgZGlyZWN0bHkgdW5kZXIgRmVhdHVyZWQgYXMgb2YgMjAyNi0wOC0wOSAtXG4gICAgICAgICAgICAvLyBjYW1wIGlzIHRoZSBwcmltYXJ5IHdheWZpbmRpbmcgY2hvaWNlIChcIm15IGtpZCB3YXMgYXQgVGhlXG4gICAgICAgICAgICAvLyBJc2xhbmRcIiksIHNvIGJyb3dzZS1ieS1jYW1wIGNvbWVzIGJlZm9yZSB0aGUgc2VyaWVzIHNob3djYXNlLlxuICAgICAgICAgICAgJzxkaXYgaWQ9XCJ0dGEtY2FtcC1zcG90bGlnaHRcIj48L2Rpdj4nICtcbiAgICAgICAgICAgICc8ZGl2IGlkPVwidHRhLXNlcmllcy1yb3dzXCI+PC9kaXY+JyArXG5cbiAgICAgICAgICAgICc8ZGl2IGlkPVwidHRhLXNwZWFrZXItc3BvdGxpZ2h0XCI+PC9kaXY+JyArXG5cbiAgICAgICAgICAgICc8aDIgY2xhc3M9XCJ0dGEtc2VjdGlvbi1oZWFkaW5nXCIgaWQ9XCJhbGwtdGFsa3NcIj5BbGwgVGFsa3M8L2gyPicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ0dGEtZ3JpZFwiIGlkPVwidHRhLWdyaWRcIj48L2Rpdj4nICtcbiAgICAgICAgICAgICc8ZGl2IGlkPVwidHRhLWxvYWQtbW9yZVwiPjwvZGl2PicgK1xuICAgICAgICAgICc8L2Rpdj4nICtcblxuICAgICAgICAgICc8ZGl2IGNsYXNzPVwidHRhLW5ld3NsZXR0ZXJcIj4nICtcbiAgICAgICAgICAgICc8aDI+TmV2ZXIgTWlzcyBhIE1lc3NhZ2U8L2gyPicgK1xuICAgICAgICAgICAgJzxwPk9uZSBlbWFpbCBhIG1vbnRoIHdpdGggdGhlIG5ld2VzdCB0YWxrcywgcGx1cyB0aGUgc3R1ZHkgbm90ZXMgUERGIGFzIHNvb24gYXMgaXRcdTIwMTlzIHBvc3RlZC48L3A+JyArXG4gICAgICAgICAgICAnPGZvcm0gaWQ9XCJ0dGEtbmV3c2xldHRlci1mb3JtXCIgY2xhc3M9XCJ0dGEtbmV3c2xldHRlci1mb3JtXCI+JyArXG4gICAgICAgICAgICAgICc8aW5wdXQgdHlwZT1cImVtYWlsXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XCJ5b3VAZXhhbXBsZS5jb21cIiBhcmlhLWxhYmVsPVwiRW1haWwgYWRkcmVzc1wiPicgK1xuICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwic3VibWl0XCI+U2lnbiBVcDwvYnV0dG9uPicgK1xuICAgICAgICAgICAgJzwvZm9ybT4nICtcbiAgICAgICAgICAgICc8cCBjbGFzcz1cInR0YS1uZXdzbGV0dGVyLW5vdGVcIiBpZD1cInR0YS1uZXdzbGV0dGVyLW5vdGVcIiByb2xlPVwic3RhdHVzXCIgaGlkZGVuPjwvcD4nICtcbiAgICAgICAgICAnPC9kaXY+JyArXG5cbiAgICAgICAgJzwvZGl2PicgK1xuXG4gICAgICAgICc8ZGl2IGlkPVwidHRhLWRldGFpbFwiIGhpZGRlbj48L2Rpdj4nICtcblxuICAgICAgJzwvZGl2Pic7XG4gIH1cblxuICAvLyAtLS0tIERhdGEgZmV0Y2ggKyBub3JtYWxpemUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBFdmVyeSBmaWVsZCB0aGUgbGlzdCB2aWV3IEFORCB0aGUgZGV0YWlsIHZpZXcgbmVlZCwgRVhDRVBUIHRoZSBmdWxsXG4gIC8vIHRyYW5zY3JpcHQgLSB0aGF0IG9uZSBmaWVsZCBhbG9uZSB3YXMgfjkwMEtCIG9mIGEgfjIuMk1CIHBheWxvYWQgYWNyb3NzXG4gIC8vIDMwIHRhbGtzIChtZWFzdXJlZCBsaXZlIDIwMjYtMDgtMDUpLCBmZXRjaGVkIG9uIGV2ZXJ5IHNpbmdsZSBodWIgdmlzaXRcbiAgLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueW9uZSByZWFkIGl0LiBUaGUgdHJhbnNjcmlwdCBpdHNlbGYgbG9hZHNcbiAgLy8gc2VwYXJhdGVseSwgb24gZGVtYW5kLCBvbmx5IGlmIGEgdmlzaXRvciBhY3R1YWxseSBleHBhbmRzIFwiRnVsbFxuICAvLyBUcmFuc2NyaXB0XCIgLSBzZWUgZmV0Y2hUcmFuc2NyaXB0KCkgYmVsb3cuXG4gIC8vXG4gIC8vIGBjYW1wYC9gc3BlYWtlcmAvYHNlcmllc2AvYHRvcGljc2AgaGVyZSBhcmUgdGhlIHRheG9ub215IGZpZWxkcyBXUCBSRVNUXG4gIC8vIGV4cG9zZXMgZGlyZWN0bHkgb24gdGhlIHBvc3QgKGFycmF5cyBvZiB0ZXJtIElEcywgZS5nLiBgc3BlYWtlcjogWzEyM11gKVxuICAvLyAtIHNlcGFyYXRlIGZyb20gYF9lbWJlZGRlZFsnd3A6dGVybSddYCAoZnVsbCB0ZXJtIG9iamVjdHMgaW5jbC4gbmFtZSxcbiAgLy8gcmVxdWlyZXMgYF9lbWJlZGApLiBUaGlzIGZpbGUgdXNlcyB0aGUgSUQgYXJyYXlzIGZvciBmaWx0ZXJpbmcvcXVlcnlcbiAgLy8gcGFyYW1zIGFuZCBgX2VtYmVkZGVkWyd3cDp0ZXJtJ11gIGZvciBkaXNwbGF5IG5hbWVzLlxuICB2YXIgTElTVF9GSUVMRFMgPSBcImlkLHNsdWcsbGluayx0aXRsZSxjYW1wLHNwZWFrZXIsc2VyaWVzLHRvcGljcyxmZWF0dXJlZF9tZWRpYSxfbGlua3MsX2VtYmVkZGVkLFwiICtcbiAgICBcImFjZi5ldmVudF9kYXRlX29yX3dlZWssYWNmLnNjcmlwdHVyZSxhY2Yub3V0bGluZSxhY2YudmlkZW9fZW1iZWRfdXJsLFwiICtcbiAgICBcImFjZi5xdW90ZXMsYWNmLnF1b3RlX2dyYXBoaWNzLGFjZi5jbGlwX3ZpZGVvX3VybCxhY2Yuc3R1ZHlfbm90ZXNfcGRmLGFjZi5jYXRlZ29yeVwiO1xuXG4gIC8vIE1pbmltYWwgZmllbGQgc2V0IGZvciB0aGUgaG9tZXBhZ2Utc2VjdGlvbnMgcXVlcmllcyAoc2VlIGxvYWRTZXJpZXNSb3dzXG4gIC8vIC8gbG9hZFNwZWFrZXJTcG90bGlnaHQgYmVsb3cpIC0ganVzdCBlbm91Z2ggZm9yIGEgc2VyaWVzL3NwZWFrZXIgY2FyZFxuICAvLyAoaWQsIHRpdGxlLCBkYXRlLCB0aHVtYm5haWwsIHRheG9ub215IG5hbWVzK0lEcykuIERlbGliZXJhdGVseSBleGNsdWRlc1xuICAvLyBvdXRsaW5lLCBxdW90ZXMsIHNjcmlwdHVyZSwgdmlkZW8sIHN0dWR5IG5vdGVzLCB0cmFuc2NyaXB0IC0gbm9uZSBvZlxuICAvLyB0aG9zZSByZW5kZXIgb24gYSBzZXJpZXMvc3BlYWtlciBjYXJkLlxuICAvLyBgbGlua2AgYWRkZWQgMjAyNi0wOC0wODogY2FyZHMgYXJlIG5vdyByZWFsIDxhIGhyZWY+IGVsZW1lbnRzIChzZWVcbiAgLy8gY2FyZEh0bWwvc2VyaWVzQ2FyZEh0bWwpLCBzbyBldmVyeSBmZXRjaCB0aGF0IGZlZWRzIGEgY2FyZCBuZWVkcyB0aGVcbiAgLy8gdGFsaydzIHBlcm1hbGluayAtIGl0IGNvc3RzIGEgZmV3IGJ5dGVzIGFuZCBidXlzIG1pZGRsZS1jbGljay9uZXctdGFiXG4gIC8vIGFuZCBjcmF3bGFibGUgaHViLXRvLXRhbGsgbGlua3MuXG4gIHZhciBIT01FUEFHRV9CQVRDSF9GSUVMRFMgPSBcImlkLHNsdWcsbGluayx0aXRsZSxjYW1wLHNwZWFrZXIsc2VyaWVzLHRvcGljcyxmZWF0dXJlZF9tZWRpYSxfbGlua3MsX2VtYmVkZGVkLGFjZi5ldmVudF9kYXRlX29yX3dlZWtcIjtcblxuICAvLyBCdWlsZHMgYSBgL3dwLWpzb24vd3AvdjIvdGFsa2AgVVJMIGZyb20gYSBwbGFpbiBwYXJhbXMgb2JqZWN0IC0gYXJyYXlcbiAgLy8gdmFsdWVzIGFyZSBqb2luZWQgd2l0aCBjb21tYXMgKFdQIFJFU1QncyBcIm1hdGNoIGFueSBvZiB0aGVzZSBJRHNcIlxuICAvLyBzeW50YXggZm9yIHRheG9ub215IHBhcmFtcyBhbmQgYGV4Y2x1ZGVgKSwgdW5kZWZpbmVkL251bGwvXCJcIiB2YWx1ZXMgYXJlXG4gIC8vIG9taXR0ZWQgZW50aXJlbHkgc28gY2FsbGVycyBjYW4gcGFzcyBlLmcuIGBjYW1wOiBzdGF0ZS5maWx0ZXJlZENhbXBJZCB8fFxuICAvLyB1bmRlZmluZWRgIHdpdGhvdXQgYSBzZXBhcmF0ZSBwcmVzZW5jZSBjaGVjay4gYGZpZWxkc2AgZGVmYXVsdHMgdG8gdGhlXG4gIC8vIGZ1bGwgTElTVF9GSUVMRFM7IHBhc3MgSE9NRVBBR0VfQkFUQ0hfRklFTERTIChvciBhbnkgb3RoZXIgdHJpbW1lZCBzZXQpXG4gIC8vIGZvciBhIGZldGNoIHRoYXQgZG9lc24ndCBuZWVkIGV2ZXJ5IGZpZWxkLlxuICBmdW5jdGlvbiBidWlsZExpc3RVcmwocGFyYW1zLCBmaWVsZHMpIHtcbiAgICBpZiAoTU9DS19EQVRBX1VSTCkgcmV0dXJuIE1PQ0tfREFUQV9VUkw7IC8vIGxvY2FsIHByZXZpZXcgZml4dHVyZSAtIGlnbm9yZXMgcGFyYW1zLCBzZWUgZmlsZSBoZWFkZXJcbiAgICB2YXIgZiA9IGZpZWxkcyB8fCBMSVNUX0ZJRUxEUztcbiAgICAvLyBPbmx5IGFzayBXUCB0byByZXNvbHZlIGVtYmVkcyB3aGVuIHRoZSBmaWVsZCBzZXQgYWN0dWFsbHkga2VlcHMgdGhlbSAtXG4gICAgLy8gYF9lbWJlZGAgdHJpZ2dlcnMgcmVhbCBwZXItcG9zdCBzZXJ2ZXIgd29yayAoaW5uZXIgc3ViLXJlcXVlc3RzIHBlclxuICAgIC8vIGVtYmVkZGVkIHJlc291cmNlKSBldmVuIGlmIGBfZmllbGRzYCB0aGVuIHN0cmlwcyB0aGUgcmVzdWx0IGZyb20gdGhlXG4gICAgLy8gcmVzcG9uc2UuIFRoZSBjYW1wLWxhbmRpbmcgcHJvYmUgKGlkLHNlcmllcyxzcGVha2VyKSBza2lwcyBpdCBlbnRpcmVseS5cbiAgICB2YXIgcGFydHMgPSBbXCJfZmllbGRzPVwiICsgZiwgXCJhY2ZfZm9ybWF0PXN0YW5kYXJkXCIsIFwiXz1cIiArIERhdGUubm93KCldO1xuICAgIGlmIChmLmluZGV4T2YoXCJfZW1iZWRkZWRcIikgIT09IC0xKSBwYXJ0cy5wdXNoKFwiX2VtYmVkXCIpO1xuICAgIGZvciAodmFyIGtleSBpbiBwYXJhbXMpIHtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcmFtcywga2V5KSkgY29udGludWU7XG4gICAgICB2YXIgdiA9IHBhcmFtc1trZXldO1xuICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBudWxsIHx8IHYgPT09IFwiXCIpIGNvbnRpbnVlO1xuICAgICAgLy8gZW5jb2RlVVJJQ29tcG9uZW50IHBlciB2YWx1ZTogZnJlZS10ZXh0IHBhcmFtcyAoc2VhcmNoKSBjYW4gY2FycnlcbiAgICAgIC8vIGAmYC9gI2AvYCtgLCB3aGljaCBzaWxlbnRseSB0cnVuY2F0ZSBvciBjb3JydXB0IHRoZSBxdWVyeSBzdHJpbmdcbiAgICAgIC8vIHdoZW4gdW5lbmNvZGVkLiBBcnJheSB2YWx1ZXMgKHRheG9ub215L2V4Y2x1ZGUgSUQgbGlzdHMpIGVuY29kZVxuICAgICAgLy8gZWFjaCBlbGVtZW50LCBqb2luZWQgd2l0aCBhIGxpdGVyYWwgY29tbWEgLSBXUCBSRVNUJ3MgXCJhbnkgb2ZcbiAgICAgIC8vIHRoZXNlIElEc1wiIHN5bnRheC5cbiAgICAgIHZhciBlbmMgPSBBcnJheS5pc0FycmF5KHYpXG4gICAgICAgID8gdi5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChpdGVtKTsgfSkuam9pbihcIixcIilcbiAgICAgICAgOiBlbmNvZGVVUklDb21wb25lbnQodik7XG4gICAgICBwYXJ0cy5wdXNoKGtleSArIFwiPVwiICsgZW5jKTtcbiAgICB9XG4gICAgcmV0dXJuIFNJVEVfVVJMICsgXCIvd3AtanNvbi93cC92Mi90YWxrP1wiICsgcGFydHMuam9pbihcIiZcIik7XG4gIH1cblxuICAvLyBMaWtlIGZldGNoKCkudGhlbihyID0+IHIuanNvbigpKSwgYnV0IGFsc28gc3VyZmFjZXMgdGhlIFgtV1AtVG90YWwgL1xuICAvLyBYLVdQLVRvdGFsUGFnZXMgaGVhZGVycyBXb3JkUHJlc3MncyBSRVNUIEFQSSByZXR1cm5zIG9uIGV2ZXJ5IGNvbGxlY3Rpb25cbiAgLy8gcmVzcG9uc2UgLSBuZWVkZWQgZm9yIHJlYWwgcGFnaW5hdGlvbiAoa25vd2luZyB3aGV0aGVyIFwiTG9hZCBNb3JlXCIgaGFzXG4gIC8vIGFueXRoaW5nIGxlZnQgdG8gZmV0Y2ggd2l0aG91dCBsb2FkaW5nIGV2ZXJ5dGhpbmcgZmlyc3QpLlxuICBmdW5jdGlvbiBmZXRjaEpzb24odXJsKSB7XG4gICAgcmV0dXJuIGZldGNoKHVybCkudGhlbihmdW5jdGlvbiAocikge1xuICAgICAgaWYgKCFyLm9rKSB0aHJvdyBuZXcgRXJyb3IoXCJIVFRQIFwiICsgci5zdGF0dXMpO1xuICAgICAgcmV0dXJuIHIuanNvbigpLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgIHRvdGFsOiBwYXJzZUludChyLmhlYWRlcnMuZ2V0KFwiWC1XUC1Ub3RhbFwiKSB8fCBcIjBcIiwgMTApLFxuICAgICAgICAgIHRvdGFsUGFnZXM6IHBhcnNlSW50KHIuaGVhZGVycy5nZXQoXCJYLVdQLVRvdGFsUGFnZXNcIikgfHwgXCIxXCIsIDEwKVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBPbi1kZW1hbmQgZmV0Y2ggZm9yIHRoZSBvbmUgZmllbGQgdGhlIGxpc3QgZmV0Y2ggZGVsaWJlcmF0ZWx5IGV4Y2x1ZGVzIC1cbiAgLy8gY2FsbGVkIG9ubHkgd2hlbiBhIHZpc2l0b3IgYWN0dWFsbHkgZXhwYW5kcyBcIkZ1bGwgVHJhbnNjcmlwdFwiIG9uIGFcbiAgLy8gc3BlY2lmaWMgdGFsaywgbm90IG9uIGV2ZXJ5IGh1YiB2aXNpdCBmb3IgZXZlcnkgdGFsay5cbiAgZnVuY3Rpb24gZmV0Y2hUcmFuc2NyaXB0KHNsdWcpIHtcbiAgICB2YXIgdXJsID0gU0lURV9VUkwgKyBcIi93cC1qc29uL3dwL3YyL3RhbGs/c2x1Zz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChzbHVnKSArXG4gICAgICBcIiZhY2ZfZm9ybWF0PXN0YW5kYXJkJl9maWVsZHM9YWNmLnRyYW5zY3JpcHRfdGV4dCZfPVwiICsgRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gZmV0Y2godXJsKS50aGVuKGZ1bmN0aW9uIChyKSB7XG4gICAgICBpZiAoIXIub2spIHRocm93IG5ldyBFcnJvcihcIkhUVFAgXCIgKyByLnN0YXR1cyk7XG4gICAgICByZXR1cm4gci5qc29uKCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgcmV0dXJuIChkYXRhWzBdICYmIGRhdGFbMF0uYWNmICYmIGRhdGFbMF0uYWNmLnRyYW5zY3JpcHRfdGV4dCkgfHwgXCJcIjtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRheG9ub215IHRlcm0tbGlzdCBlbmRwb2ludHMgKGAvd3AtanNvbi93cC92Mi88dGF4b25vbXk+YCkgLSB1c2VkIHRvXG4gIC8vIHBvcHVsYXRlIGZpbHRlciBkcm9wZG93bnMgd2l0aCByZWFsIHRlcm0gSURzICsgYWNjdXJhdGUgcGVyLXRlcm0gY291bnRzXG4gIC8vIHdpdGhvdXQgbG9hZGluZyBhbnkgdGFsa3MgYXQgYWxsLCBhbmQgYXMgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3JcbiAgLy8gcmVzb2x2aW5nIGEgZGlzcGxheSBuYW1lIGJhY2sgdG8gYSB0ZXJtIElEIChzZWFyY2gtYnktc3BlYWtlci1uYW1lLFxuICAvLyBjYW1wLXNwb3RsaWdodCBjbGlja3MpLlxuICBmdW5jdGlvbiBmZXRjaFRlcm1zKHRheG9ub215KSB7XG4gICAgLy8gYGRlc2NyaXB0aW9uYCBhZGRlZCAyMDI2LTA4LTA5OiBzcGVha2VyIGJpb3MgbGl2ZSBpbiB0aGUgV1AgdGVybSdzXG4gICAgLy8gbmF0aXZlIGRlc2NyaXB0aW9uIGZpZWxkICh3cC1hZG1pbiAtPiBUYWxrcyAtPiBTcGVha2VycyAtPiBlZGl0KSBhbmRcbiAgICAvLyByZW5kZXIgb24gdGhhdCBzcGVha2VyJ3MgbGFuZGluZyB2aWV3IC0gc2VlIHNwZWFrZXJMYW5kaW5nSHRtbCgpLiBOb1xuICAgIC8vIHNjaGVtYSBjaGFuZ2UsIG5vIGV4dHJhIHJlcXVlc3Q7IGVtcHR5IGRlc2NyaXB0aW9ucyByZW5kZXIgbm90aGluZy5cbiAgICB2YXIgdXJsID0gU0lURV9VUkwgKyBcIi93cC1qc29uL3dwL3YyL1wiICsgdGF4b25vbXkgKyBcIj9wZXJfcGFnZT0xMDAmb3JkZXJieT1uYW1lJm9yZGVyPWFzYyZfZmllbGRzPWlkLG5hbWUsc2x1Zyxjb3VudCxkZXNjcmlwdGlvbiZfPVwiICsgRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gZmV0Y2godXJsKS50aGVuKGZ1bmN0aW9uIChyKSB7XG4gICAgICBpZiAoIXIub2spIHRocm93IG5ldyBFcnJvcihcIkhUVFAgXCIgKyByLnN0YXR1cyk7XG4gICAgICByZXR1cm4gci5qc29uKCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBsb2FkQWxsVGVybXMoKSB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFtcImNhbXBcIiwgXCJzcGVha2VyXCIsIFwic2VyaWVzXCIsIFwidG9waWNzXCJdLm1hcChmZXRjaFRlcm1zKSkudGhlbihmdW5jdGlvbiAocmVzdWx0cykge1xuICAgICAgc3RhdGUudGVybXMuY2FtcCA9IHJlc3VsdHNbMF07XG4gICAgICBzdGF0ZS50ZXJtcy5zcGVha2VyID0gcmVzdWx0c1sxXTtcbiAgICAgIHN0YXRlLnRlcm1zLnNlcmllcyA9IHJlc3VsdHNbMl07XG4gICAgICBzdGF0ZS50ZXJtcy50b3BpY3MgPSByZXN1bHRzWzNdO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZmluZFRlcm1CeU5hbWUobGlzdCwgbmFtZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGxpc3RbaV0ubmFtZSA9PT0gbmFtZSkgcmV0dXJuIGxpc3RbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdGVybUJ5SWQobGlzdCwgaWQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0W2ldLmlkID09PSBpZCkgcmV0dXJuIGxpc3RbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQ2FtcCBkaXNwbGF5IG5hbWUgLT4gV1AgY2FtcCB0ZXJtLiBUcmllcyB0aGUgQ0FNUF9ESVNQTEFZX1RPX1JFQUwgYWxpYXNcbiAgLy8gZmlyc3QsIHRoZW4gdGhlIGRpc3BsYXkgbmFtZSBpdHNlbGYgLSB0ZXJtIG5hbWVzIGRyaWZ0IHVwc3RyZWFtIChcIlRoZVxuICAvLyBQaW5lcyBDYW1wZ3JvdW5kXCIgd2FzIHJlbmFtZWQgdG8gcGxhaW4gXCJUaGUgUGluZXNcIiksIHdoaWNoIG1hZGUgdGhlXG4gIC8vIGFsaWFzLW9ubHkgbG9va3VwIHNpbGVudGx5IG1pc3MgKGZvdW5kIDIwMjYtMDgtMDk7IHRoZSBQaW5lcyBjYW1wIGNhcmRcbiAgLy8gaGFkIGJlZW4gYSBkZWFkIGNsaWNrIG9uIGxpdmUpLlxuICBmdW5jdGlvbiByZXNvbHZlQ2FtcFRlcm0oZGlzcGxheSkge1xuICAgIHJldHVybiBmaW5kVGVybUJ5TmFtZShzdGF0ZS50ZXJtcy5jYW1wLCBDQU1QX0RJU1BMQVlfVE9fUkVBTFtkaXNwbGF5XSB8fCBkaXNwbGF5KSB8fFxuICAgICAgZmluZFRlcm1CeU5hbWUoc3RhdGUudGVybXMuY2FtcCwgZGlzcGxheSk7XG4gIH1cblxuICAvLyBUZXJtcyB3aXRoIGF0IGxlYXN0IG9uZSBQVUJMSVNIRUQgdGFsay4gVGF4b25vbXkgdGVybXMgZXhpc3QgYXMgc29vbiBhc1xuICAvLyBhIERSQUZUIGlzIG1pZ3JhdGVkICh0ZXJtLmNvdW50IG9ubHkgY291bnRzIHB1Ymxpc2hlZCBwb3N0cyksIHNvIGV2ZXJ5XG4gIC8vIGhvbWVwYWdlIHN1cmZhY2UgYnVpbHQgZnJvbSBhIHRlcm0gbGlzdCBtdXN0IGZpbHRlciB0aHJvdWdoIHRoaXMgb3JcbiAgLy8gbm90LXlldC1yZXZpZXdlZCBzcGVha2Vycy9zZXJpZXMgbGVhayBvbnRvIHRoZSBsaXZlIGh1YiAtIHRoZSBleGFjdCBidWdcbiAgLy8gSm9obiBjYXVnaHQgb24gdGhlIHNwZWFrZXIgc3BvdGxpZ2h0IDIwMjYtMDgtMDguXG4gIGZ1bmN0aW9uIHB1Ymxpc2hlZFRlcm1zKGxpc3QpIHtcbiAgICByZXR1cm4gKGxpc3QgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAodCkgeyByZXR1cm4gdC5jb3VudCA+IDA7IH0pO1xuICB9XG5cbiAgLy8gLS0tLSBEYWlseSByb3RhdGlvbiAoMjAyNi0wOC0wOSBob21lcGFnZSBjdXJhdGlvbikgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBDb250ZW50IGxhbmRzIGluIHNlYXNvbmFsIG1hc3MgdXBsb2FkcyAoZml2ZSBjYW1wcyB4IHNldmVyYWwgdGFsa3MgcGVyXG4gIC8vIHdlZWsgYWxsIHN1bW1lciwgdGhlbiBub3RoaW5nIGZvciBtb250aHMpLCBzbyBhbnkgXCJuZXdlc3QgZmlyc3RcIlxuICAvLyBob21lcGFnZSBzZWN0aW9uIHdvdWxkIHNpdCBvbiBvbmUgY2FtcCdzIHVwbG9hZCB3YXZlIGFuZCB0aGVuIGZyZWV6ZVxuICAvLyBhbGwgb2ZmLXNlYXNvbi4gSW5zdGVhZCwgcm90YXRpbmcgc2VjdGlvbnMgcGljayBERVRFUk1JTklTVElDQUxMWSBmcm9tXG4gIC8vIHRoZSBVVEMgZGF5IG51bWJlcjogZXZlcnkgdmlzaXRvciBzZWVzIHRoZSBzYW1lIHBpY2tzIG9uIHRoZSBzYW1lIGRheVxuICAvLyAoY29oZXJlbnQgUUEsIGNvaGVyZW50IHN1cHBvcnQsIGNhY2hlLWZyaWVuZGx5IC0gZWFjaCBkYXkncyBwZXItdGVybVxuICAvLyBxdWVyaWVzIHNoYXJlIHRoZSBzYW1lIHNlcnZlci1zaWRlIHJlc3BvbnNlLWNhY2hlIGtleXMpLCBhbmQgdGhlIHBpY2tzXG4gIC8vIGNoYW5nZSBieSB0aGVtc2VsdmVzIGF0IG1pZG5pZ2h0IFVUQyB3aXRoIHplcm8gYmFja2VuZCBpbnZvbHZlbWVudC5cbiAgZnVuY3Rpb24gcm90YXRpb25EYXkoKSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDg2NDAwMDAwKTtcbiAgfVxuXG4gIC8vIERldGVybWluaXN0aWMgRmlzaGVyLVlhdGVzIHZpYSBhIG11bGJlcnJ5MzItc2VlZGVkIFBSTkcgLSBzYW1lIHNlZWQsXG4gIC8vIHNhbWUgb3JkZXIsIG9uIGV2ZXJ5IGJyb3dzZXIgKG5vIHJlbGlhbmNlIG9uIGVuZ2luZSBzb3J0IHF1aXJrcykuXG4gIGZ1bmN0aW9uIHNlZWRlZFNodWZmbGUobGlzdCwgc2VlZCkge1xuICAgIHZhciBhID0gbGlzdC5zbGljZSgpO1xuICAgIHZhciBzID0gc2VlZCA+Pj4gMDtcbiAgICBmdW5jdGlvbiBybmQoKSB7XG4gICAgICBzID0gKHMgKyAweDZEMkI3OUY1KSA+Pj4gMDtcbiAgICAgIHZhciB0ID0gcztcbiAgICAgIHQgPSBNYXRoLmltdWwodCBeICh0ID4+PiAxNSksIHQgfCAxKTtcbiAgICAgIHQgXj0gdCArIE1hdGguaW11bCh0IF4gKHQgPj4+IDcpLCB0IHwgNjEpO1xuICAgICAgcmV0dXJuICgodCBeICh0ID4+PiAxNCkpID4+PiAwKSAvIDQyOTQ5NjcyOTY7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSBhLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgIHZhciBqID0gTWF0aC5mbG9vcihybmQoKSAqIChpICsgMSkpO1xuICAgICAgdmFyIHRtcCA9IGFbaV07IGFbaV0gPSBhW2pdOyBhW2pdID0gdG1wO1xuICAgIH1cbiAgICByZXR1cm4gYTtcbiAgfVxuXG4gIC8vIFRvZGF5J3MgbiBwaWNrcyBmcm9tIGEgbGlzdCAtIGEgZnJlc2ggc2VlZGVkIHNhbXBsZSBlYWNoIFVUQyBkYXksIHRoZVxuICAvLyB3aG9sZSBsaXN0IHdoZW4gaXQncyBhbHJlYWR5IHNtYWxsIGVub3VnaC5cbiAgZnVuY3Rpb24gcm90YXRpb25QaWNrKGxpc3QsIG4pIHtcbiAgICBpZiAobGlzdC5sZW5ndGggPD0gbikgcmV0dXJuIGxpc3Quc2xpY2UoKTtcbiAgICByZXR1cm4gc2VlZGVkU2h1ZmZsZShsaXN0LCByb3RhdGlvbkRheSgpKS5zbGljZSgwLCBuKTtcbiAgfVxuXG4gIC8vIEZvdW5kIDIwMjYtMDgtMDY6IG9uIHRoaXMgc3RhY2ssIGEgYHRhbGtgIENPTExFQ1RJT04gcmVxdWVzdCdzXG4gIC8vIGBfZW1iZWRkZWRbJ3dwOnRlcm0nXWAgaXMgdW5yZWxpYWJsZSAtIGV2ZXJ5IGl0ZW0gaW4gdGhlIHJlc3BvbnNlIGNvbWVzXG4gIC8vIGJhY2sgd2l0aCB0aGUgRklSU1QgaXRlbSdzIGVtYmVkZGVkIHRlcm1zIGluc3RlYWQgb2YgaXRzIG93biAoY29uZmlybWVkXG4gIC8vIHZpYSBkaXJlY3QgUkVTVCBjYWxsczogYSBQaGlsIE1vc2VyIHRhbGsncyByYXcgYHNwZWFrZXJgIHRlcm0tSUQgZmllbGRcbiAgLy8gY29ycmVjdGx5IGhlbGQgUGhpbCBNb3NlcidzIElELCBidXQgaXRzIGBfZW1iZWRkZWRbJ3dwOnRlcm0nXWAgc3BlYWtlclxuICAvLyBncm91cCBuYW1lZCBDb3JleSBBYm5leSwgYmVjYXVzZSBhIENvcmV5IEFibmV5IHRhbGsgc29ydGVkIGZpcnN0IGluXG4gIC8vIHRoYXQgcmVzcG9uc2UpLiBUaGlzIGlzIGEgcGVyLWl0ZW0gZW1iZWQgYnVnIHNwZWNpZmljIHRvIGxpc3QvY29sbGVjdGlvblxuICAvLyByZXNwb25zZXMgb24gdGhpcyBXUC9wbHVnaW4gc3RhY2sgLSBzaW5nbGUtaXRlbSB0YWxrIGZldGNoZXMgKGRldGFpbFxuICAvLyB2aWV3KSBhcmUgdW5hZmZlY3RlZCwgYW5kIGBfZW1iZWRkZWRbJ3dwOmZlYXR1cmVkbWVkaWEnXWAgKHRodW1ibmFpbHMpXG4gIC8vIGlzIHVuYWZmZWN0ZWQgdG9vLCBvbmx5IGB3cDp0ZXJtYCBpbiBhIGxpc3QgY29udGV4dC4gU2lsZW50bHkgd3Jvbmcgb25cbiAgLy8gZXZlcnkgY2FyZCBmZWQgYnkgYSBjb2xsZWN0aW9uIGZldGNoOiB0aGUgbWFpbiBncmlkLCBzZXJpZXMgcm93cywgYW5kXG4gIC8vIHNwZWFrZXIgc3BvdGxpZ2h0IGFsbCByZW5kZXIgdGhpcy4gRml4OiBuZXZlciB0cnVzdCB0aGUgcGVyLWl0ZW1cbiAgLy8gZW1iZWRkZWQgdGVybSBOQU1FIGZyb20gYSBjb2xsZWN0aW9uIHJlc3BvbnNlIC0gcmVzb2x2ZSB0aGUgcmF3IHRlcm0gSURcbiAgLy8gKGFsd2F5cyBjb3JyZWN0LCBjb21lcyBmcm9tIHRoZSBwbGFpbiB0YXhvbm9teSBmaWVsZCwgbm90IHRoZSBlbWJlZClcbiAgLy8gYWdhaW5zdCB0aGUgYXV0aG9yaXRhdGl2ZSBpZC0+bmFtZSB0YWJsZSBpbiBzdGF0ZS50ZXJtcywgd2hpY2ggaXNcbiAgLy8gZmV0Y2hlZCBvbmNlIHZpYSB0aGUgZGVkaWNhdGVkIHBlci10YXhvbm9teSBsaXN0IGVuZHBvaW50c1xuICAvLyAoL3dwLWpzb24vd3AvdjIvc3BlYWtlciBldGMuLCBhIGdlbnVpbmUgc2luZ2xlLWNvbGxlY3Rpb24tb2YtdGVybXNcbiAgLy8gcmVxdWVzdCwgbm90IHN1YmplY3QgdG8gdGhpcyBidWcpIC0gc2VlIGxvYWRBbGxUZXJtcygpLlxuICBmdW5jdGlvbiB0ZXJtTmFtZUJ5SWQobGlzdCwgaWQpIHtcbiAgICBpZiAoIWlkIHx8ICFsaXN0KSByZXR1cm4gXCJcIjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0W2ldLmlkID09PSBpZCkgcmV0dXJuIGxpc3RbaV0ubmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICAvLyBFbWJlZGRlZC10ZXJtIGZhbGxiYWNrIChyZXN0b3JlZCAyMDI2LTA4LTA4KTogdGVybU5hbWVCeUlkKCkgcmVzb2x2ZXNcbiAgLy8gYWdhaW5zdCBzdGF0ZS50ZXJtcywgd2hpY2ggbG9hZEFsbFRlcm1zKCkgcG9wdWxhdGVzIG9uIHRoZSBIVUIgb25seSAtXG4gIC8vIHNpbmdsZS10YWxrIHBlcm1hbGluayBtb2RlIChpbml0U2luZ2xlKSBkZWxpYmVyYXRlbHkgbmV2ZXIgZmV0Y2hlcyB0aGVcbiAgLy8gdGF4b25vbXkgbGlzdHMuIFdoZW4gdGhlIDIwMjYtMDgtMDYgaW5jaWRlbnQgd29ya2Fyb3VuZCBzd2l0Y2hlZFxuICAvLyBub3JtYWxpemUoKSB0byB0ZXJtTmFtZUJ5SWQoKSBleGNsdXNpdmVseSwgZXZlcnkgdGFsayBwZXJtYWxpbmtcbiAgLy8gc2lsZW50bHkgbG9zdCBpdHMgc3BlYWtlci9jYW1wL3NlcmllcyBuYW1lcyBhbmQgdG9waWMgcGlsbHMgKGZvdW5kXG4gIC8vIDIwMjYtMDgtMDggYnkgdGhlIGluZ2VzdCB2ZXJpZnkgcGFzcyBvbiBNaWtlIEJyZWFtJ3MgdGFsa3M7IGNvbmZpcm1lZFxuICAvLyBvbiBvbGRlciB0YWxrcyB0b28pLiBGaXg6IGZhbGwgYmFjayB0byB0aGUgYF9lbWJlZGRlZFsnd3A6dGVybSddYFxuICAvLyBuYW1lcyB3aGVuIHRoZSBzdGF0ZS50ZXJtcyBsb29rdXAgY29tZXMgdXAgZW1wdHkuIFNhZmUgYWdhaW4gbm93IHRoYXRcbiAgLy8gdGhlIFJFU1QgY2FjaGUncyBlbWJlZCBwb2lzb25pbmcgaXMgZml4ZWQgKHNlZVxuICAvLyBvcHMvd3Bjb2RlLXNuaXBwZXRzL3Jlc3QtcmVzcG9uc2UtY2FjaGUucGhwLCAyMDI2LTA4LTA3IG5vdGUpIC0gYW5kXG4gIC8vIHNpbmdsZS1zbHVnIGZldGNoZXMgYXJlIG9uZS1pdGVtIGNvbGxlY3Rpb25zLCB3aGljaCB3ZXJlIG5ldmVyXG4gIC8vIGFmZmVjdGVkIGJ5IHRoZSBvbGQgY3Jvc3MtaXRlbSBjb2xsaXNpb24gYW55d2F5LiBPbiB0aGUgaHViLCB3aGVyZVxuICAvLyBzdGF0ZS50ZXJtcyBpcyBwb3B1bGF0ZWQsIHRoaXMgZmFsbGJhY2sgbmV2ZXIgZmlyZXMuXG4gIGZ1bmN0aW9uIGVtYmVkZGVkVGVybU5hbWVzKGVudHJ5LCB0YXhvbm9teSkge1xuICAgIHZhciBncm91cHMgPSAoZW50cnkuX2VtYmVkZGVkICYmIGVudHJ5Ll9lbWJlZGRlZFtcIndwOnRlcm1cIl0pIHx8IFtdO1xuICAgIHZhciBuYW1lcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGdyb3Vwc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoZ3JvdXBzW2ldW2pdLnRheG9ub215ID09PSB0YXhvbm9teSkgbmFtZXMucHVzaChncm91cHNbaV1bal0ubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuYW1lcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHRlcm1OYW1lKGVudHJ5LCB0YXhvbm9teSwgaWQpIHtcbiAgICByZXR1cm4gdGVybU5hbWVCeUlkKHN0YXRlLnRlcm1zW3RheG9ub215ID09PSBcInRvcGljc1wiID8gXCJ0b3BpY3NcIiA6IHRheG9ub215XSwgaWQpIHx8XG4gICAgICBlbWJlZGRlZFRlcm1OYW1lcyhlbnRyeSwgdGF4b25vbXkpWzBdIHx8IFwiXCI7XG4gIH1cblxuICAvLyBSaWdodC1zaXplZCB0aHVtYm5haWxzICgyMDI2LTA4LTA4IFVYIHBhc3MpOiB0aGUgb3JpZ2luYWwgdXBsb2FkcyBhcmVcbiAgLy8gZnVsbCAxOTIweDEwODAgc3RpbGxzLCBidXQgZ3JpZC9zZXJpZXMgY2FyZHMgcmVuZGVyIGF0IH4yNTAtNDAwcHggYW5kXG4gIC8vIGF2YXRhcnMgYXQgNzJweCAtIHNlcnZpbmcgdGhlIG9yaWdpbmFsIHRvIGV2ZXJ5IGNhcmQgd2FzIGVhc2lseSBzZXZlcmFsXG4gIC8vIE1CIHBlciBwYWdlIG9uIGEgcGhvbmUuIGBfZW1iZWRkZWRbJ3dwOmZlYXR1cmVkbWVkaWEnXWAgYWxyZWFkeSBjYXJyaWVzXG4gIC8vIFdQJ3MgZ2VuZXJhdGVkIGludGVybWVkaWF0ZSBzaXplcyBpbiBtZWRpYV9kZXRhaWxzLnNpemVzIChubyBleHRyYVxuICAvLyByZXF1ZXN0KSwgc28gcGljayB0aGUgc21hbGxlc3Qgc2l6ZSB0aGF0IHN0aWxsIGxvb2tzIHNoYXJwIGF0IH4yeCBEUFJcbiAgLy8gZm9yIHRoZSBzbG90LCBmYWxsaW5nIGJhY2sgdXAgdGhlIGNoYWluIChvbGRlci9pbXBvcnRlZCBtZWRpYSBtYXkgbGFja1xuICAvLyBzb21lIHNpemVzKSBhbmQgZmluYWxseSB0byB0aGUgb3JpZ2luYWwuXG4gIGZ1bmN0aW9uIHBpY2tNZWRpYVNpemUobWVkaWEsIHByZWZlcnJlZCkge1xuICAgIGlmICghbWVkaWEgfHwgIW1lZGlhWzBdIHx8IG1lZGlhWzBdLmNvZGUpIHJldHVybiBcIlwiOyAvLyBjb2RlID0gZW1iZWQgZmFpbGVkIChlLmcuIG1lZGlhIGRlbGV0ZWQpXG4gICAgdmFyIHNpemVzID0gKG1lZGlhWzBdLm1lZGlhX2RldGFpbHMgJiYgbWVkaWFbMF0ubWVkaWFfZGV0YWlscy5zaXplcykgfHwge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVmZXJyZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzID0gc2l6ZXNbcHJlZmVycmVkW2ldXTtcbiAgICAgIGlmIChzICYmIHMuc291cmNlX3VybCkgcmV0dXJuIHMuc291cmNlX3VybDtcbiAgICB9XG4gICAgcmV0dXJuIG1lZGlhWzBdLnNvdXJjZV91cmwgfHwgXCJcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZlYXR1cmVkSW1hZ2VVcmwoZW50cnkpIHsgLy8gY2FyZCB0aHVtYnMgKH4yNTAtNDAwcHggd2lkZSlcbiAgICB2YXIgbWVkaWEgPSBlbnRyeS5fZW1iZWRkZWQgJiYgZW50cnkuX2VtYmVkZGVkW1wid3A6ZmVhdHVyZWRtZWRpYVwiXTtcbiAgICByZXR1cm4gcGlja01lZGlhU2l6ZShtZWRpYSwgW1wibWVkaXVtX2xhcmdlXCIsIFwibGFyZ2VcIl0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZmVhdHVyZWRJbWFnZVVybExhcmdlKGVudHJ5KSB7IC8vIGZlYXR1cmVkIGNhcmQgKyBkZXRhaWwgdmlkZW8gZmFjYWRlICh1cCB0byB+ODYwcHggd2lkZSlcbiAgICB2YXIgbWVkaWEgPSBlbnRyeS5fZW1iZWRkZWQgJiYgZW50cnkuX2VtYmVkZGVkW1wid3A6ZmVhdHVyZWRtZWRpYVwiXTtcbiAgICByZXR1cm4gcGlja01lZGlhU2l6ZShtZWRpYSwgW1wibGFyZ2VcIiwgXCJtZWRpdW1fbGFyZ2VcIl0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZmVhdHVyZWRJbWFnZVVybFNtYWxsKGVudHJ5KSB7IC8vIDcycHggc3BlYWtlciBhdmF0YXJzXG4gICAgdmFyIG1lZGlhID0gZW50cnkuX2VtYmVkZGVkICYmIGVudHJ5Ll9lbWJlZGRlZFtcIndwOmZlYXR1cmVkbWVkaWFcIl07XG4gICAgcmV0dXJuIHBpY2tNZWRpYVNpemUobWVkaWEsIFtcIm1lZGl1bVwiLCBcIm1lZGl1bV9sYXJnZVwiLCBcImxhcmdlXCJdKTtcbiAgfVxuXG4gIC8vIE5vIGRlZGljYXRlZCBcImV4Y2VycHRcIiBmaWVsZCBleGlzdHMgaW4gdGhlIHJlYWwgY29udGVudCBtb2RlbCAtIGRlcml2ZWRcbiAgLy8gZnJvbSB0aGUgb3V0bGluZSdzIGZpcnN0IGJ1bGxldCwgd2hpY2ggaXMgcmVhbCwgYWxyZWFkeS13cml0dGVuIGNvbnRlbnRcbiAgLy8gZm9yIGFsbCByZWFsIHRhbGtzLCBub3QgZmFicmljYXRlZCBmaWxsZXIuXG4gIGZ1bmN0aW9uIGRlcml2ZUV4Y2VycHQob3V0bGluZSkge1xuICAgIGlmICghb3V0bGluZSkgcmV0dXJuIFwiXCI7XG4gICAgdmFyIGZpcnN0TGluZSA9IG91dGxpbmUuc3BsaXQoXCJcXG5cIilbMF0gfHwgXCJcIjtcbiAgICByZXR1cm4gZmlyc3RMaW5lLnRyaW0oKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlRGF0ZU1zKGRhdGVTdHIpIHtcbiAgICB2YXIgbXMgPSBEYXRlLnBhcnNlKGRhdGVTdHIgfHwgXCJcIik7XG4gICAgcmV0dXJuIGlzTmFOKG1zKSA/IDAgOiBtcztcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZShlbnRyeSkge1xuICAgIHZhciBhY2YgPSBlbnRyeS5hY2YgfHwge307XG4gICAgdmFyIHF1b3RlcyA9IChhY2YucXVvdGVzIHx8IFtdKVxuICAgICAgLm1hcChmdW5jdGlvbiAocSkgeyByZXR1cm4gcS5xdW90ZV90ZXh0OyB9KVxuICAgICAgLmZpbHRlcihmdW5jdGlvbiAocSkgeyByZXR1cm4gcSAmJiBTdHJpbmcocSkudHJpbSgpLmxlbmd0aDsgfSk7XG4gICAgdmFyIHF1b3RlR3JhcGhpY3MgPSAoYWNmLnF1b3RlX2dyYXBoaWNzIHx8IFtdKVxuICAgICAgLm1hcChmdW5jdGlvbiAoaW1nKSB7IHJldHVybiAoaW1nICYmIChpbWcudXJsIHx8IChpbWcuc2l6ZXMgJiYgaW1nLnNpemVzLm1lZGl1bSkpKSB8fCBcIlwiOyB9KVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICB2YXIgb3V0bGluZSA9IGFjZi5vdXRsaW5lIHx8IFwiXCI7XG4gICAgdmFyIG5vcm1hbGl6ZWQgPSB7XG4gICAgICBpZDogZW50cnkuaWQsXG4gICAgICBzbHVnOiBlbnRyeS5zbHVnIHx8IFwiXCIsXG4gICAgICBzcGVha2VyOiB0ZXJtTmFtZShlbnRyeSwgXCJzcGVha2VyXCIsIChlbnRyeS5zcGVha2VyICYmIGVudHJ5LnNwZWFrZXJbMF0pIHx8IG51bGwpLFxuICAgICAgc3BlYWtlcklkOiAoZW50cnkuc3BlYWtlciAmJiBlbnRyeS5zcGVha2VyWzBdKSB8fCBudWxsLFxuICAgICAgY2FtcDogdGVybU5hbWUoZW50cnksIFwiY2FtcFwiLCAoZW50cnkuY2FtcCAmJiBlbnRyeS5jYW1wWzBdKSB8fCBudWxsKSxcbiAgICAgIGNhbXBJZDogKGVudHJ5LmNhbXAgJiYgZW50cnkuY2FtcFswXSkgfHwgbnVsbCxcbiAgICAgIHNlcmllczogdGVybU5hbWUoZW50cnksIFwic2VyaWVzXCIsIChlbnRyeS5zZXJpZXMgJiYgZW50cnkuc2VyaWVzWzBdKSB8fCBudWxsKSxcbiAgICAgIHNlcmllc0lkOiAoZW50cnkuc2VyaWVzICYmIGVudHJ5LnNlcmllc1swXSkgfHwgbnVsbCxcbiAgICAgIC8vIEh1YjogcmVzb2x2ZSBlYWNoIHRvcGljIElEIGFnYWluc3Qgc3RhdGUudGVybXMuIFBlcm1hbGluayBtb2RlXG4gICAgICAvLyAoZW1wdHkgc3RhdGUudGVybXMpOiBmYWxsIGJhY2sgdG8gdGhlIGVtYmVkZGVkIHRvcGljIG5hbWVzLlxuICAgICAgdG9waWNzOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnlJZCA9IChlbnRyeS50b3BpY3MgfHwgW10pLm1hcChmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIHRlcm1OYW1lQnlJZChzdGF0ZS50ZXJtcy50b3BpY3MsIGlkKTsgfSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICByZXR1cm4gYnlJZC5sZW5ndGggPyBieUlkIDogZW1iZWRkZWRUZXJtTmFtZXMoZW50cnksIFwidG9waWNzXCIpO1xuICAgICAgfSkoKSxcbiAgICAgIHRpdGxlOiBkZWNvZGVIdG1sRW50aXRpZXMoKGVudHJ5LnRpdGxlICYmIGVudHJ5LnRpdGxlLnJlbmRlcmVkKSB8fCBcIlVudGl0bGVkIHRhbGtcIiksXG4gICAgICBkYXRlOiBhY2YuZXZlbnRfZGF0ZV9vcl93ZWVrIHx8IFwiXCIsXG4gICAgICBkYXRlTXM6IHBhcnNlRGF0ZU1zKGFjZi5ldmVudF9kYXRlX29yX3dlZWspLFxuICAgICAgc2NyaXB0dXJlOiBhY2Yuc2NyaXB0dXJlIHx8IFwiXCIsXG4gICAgICB2aWRlb1VybDogYWNmLnZpZGVvX2VtYmVkX3VybCB8fCBcIlwiLFxuICAgICAgdGh1bWJuYWlsOiBmZWF0dXJlZEltYWdlVXJsKGVudHJ5KSxcbiAgICAgIHRodW1ibmFpbExhcmdlOiBmZWF0dXJlZEltYWdlVXJsTGFyZ2UoZW50cnkpLFxuICAgICAgdGh1bWJuYWlsU21hbGw6IGZlYXR1cmVkSW1hZ2VVcmxTbWFsbChlbnRyeSksXG4gICAgICB0cmFuc2NyaXB0VGV4dDogYWNmLnRyYW5zY3JpcHRfdGV4dCB8fCBcIlwiLFxuICAgICAgc3R1ZHlOb3Rlc1BkZlVybDogYWNmLnN0dWR5X25vdGVzX3BkZiB8fCBcIlwiLCAvLyBSZXR1cm4gVmFsdWUgPSBGaWxlIFVSTCBvbiB0aGlzIEFDRiBmaWVsZFxuICAgICAgb3V0bGluZTogb3V0bGluZSxcbiAgICAgIGV4Y2VycHQ6IGRlcml2ZUV4Y2VycHQob3V0bGluZSksXG4gICAgICBsaW5rOiBlbnRyeS5saW5rIHx8IFwiXCIsIC8vIHJlYWwgV1AgcGVybWFsaW5rIChjYW1wcy53b2wub3JnL3RhbGsvPHNsdWc+LykgLSB1c2VkIGJ5IGNvcHlMaW5rKCkvZW1haWxTaGFyZUhyZWYoKSBzbyBzaGFyZSBsaW5rcyBwb2ludCBhdCB0aGUgdGFsayBpdHNlbGYsIG5vdCB0aGUgY3VycmVudCB0YWIncyBVUkxcbiAgICAgIHF1b3RlczogcXVvdGVzLFxuICAgICAgcXVvdGVHcmFwaGljczogcXVvdGVHcmFwaGljcyxcbiAgICAgIGNsaXBWaWRlb1VybDogYWNmLmNsaXBfdmlkZW9fdXJsIHx8IFwiXCIsXG4gICAgICBjYXRlZ29yeTogYWNmLmNhdGVnb3J5IHx8IFwiXCIsXG4gICAgICAvLyBEZXRhaWwtdmlldyBmaWVsZHMgKHZpZGVvL291dGxpbmUvcXVvdGVzL2V0Yy4pIGFyZSBvbmx5IHByZXNlbnQgd2hlblxuICAgICAgLy8gdGhpcyBlbnRyeSBjYW1lIGZyb20gYSBMSVNUX0ZJRUxEUyBmZXRjaCwgbm90IHRoZSB0cmltbWVkXG4gICAgICAvLyBIT01FUEFHRV9CQVRDSF9GSUVMRFMgYmF0Y2ggKHNlcmllcyByb3dzL3NwZWFrZXIgc3BvdGxpZ2h0KSAtIGRldGVjdFxuICAgICAgLy8gdmlhIGtleSBwcmVzZW5jZSAoV1AncyBgX2ZpZWxkc2AgdHJpbW1pbmcgZ2VudWluZWx5IG9taXRzIHRoZSBrZXksXG4gICAgICAvLyBub3QganVzdCBlbXB0aWVzIGl0KSwgbm90IHRydXRoaW5lc3MsIHNvIGEgdGFsayB3aXRoIGEgcmVhbCBidXRcbiAgICAgIC8vIGVtcHR5IG91dGxpbmUgc3RpbGwgY291bnRzIGFzIFwiZnVsbFwiLlxuICAgICAgX2Z1bGw6IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhY2YsIFwib3V0bGluZVwiKVxuICAgIH07XG4gICAgLy8gRm91bmQgMjAyNi0wOC0wNTogbm9ybWFsaXplKCkgaXMgY2FsbGVkIGZyb20gYm90aCB0aGUgZnVsbCBncmlkL2RldGFpbFxuICAgIC8vIGZldGNoZXMgQU5EIHRoZSB0cmltbWVkIGhvbWVwYWdlLWJhdGNoIGZldGNoLCB3cml0aW5nIGludG8gdGhlIFNBTUVcbiAgICAvLyBlbnRyeUNhY2hlLiBUaGUgYmF0Y2ggcnVucyBpbmRlcGVuZGVudGx5LCBpbiBwYXJhbGxlbCB3aXRoIHRoZSBncmlkLFxuICAgIC8vIGZvciBsYXRlbmN5IHJlYXNvbnMgLSBpZiBpdHMgbm9ybWFsaXplKCkgY2FsbHMgaGFwcGVuZWQgdG8gbGFuZCBhZnRlclxuICAgIC8vIHRoZSBncmlkJ3MgZm9yIHRoZSBzYW1lIHRhbGsgSUQsIGEgZnVsbCBjYWNoZWQgZW50cnkgd2FzIHNpbGVudGx5XG4gICAgLy8gcmVwbGFjZWQgYnkgb25lIG1pc3NpbmcgdmlkZW8vb3V0bGluZS9xdW90ZXMvc3R1ZHkgbm90ZXMsIGFuZFxuICAgIC8vIHNob3dEZXRhaWwoKSBoYWQgbm8gd2F5IHRvIGtub3cgaXQgd2FzIGxvb2tpbmcgYXQgcGFydGlhbCBkYXRhLiBOZXZlclxuICAgIC8vIGxldCBhIHBhcnRpYWwgd3JpdGUgY2xvYmJlciBhbiBleGlzdGluZyBmdWxsIGVudHJ5LlxuICAgIHZhciBjYWNoZWQgPSBzdGF0ZS5lbnRyeUNhY2hlW25vcm1hbGl6ZWQuaWRdO1xuICAgIGlmICghY2FjaGVkIHx8IG5vcm1hbGl6ZWQuX2Z1bGwgfHwgIWNhY2hlZC5fZnVsbCkge1xuICAgICAgc3RhdGUuZW50cnlDYWNoZVtub3JtYWxpemVkLmlkXSA9IG5vcm1hbGl6ZWQ7XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVkO1xuICB9XG5cbiAgLy8gLS0tLSBTbWFsbCBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBXb3JkUHJlc3MncyB0aXRsZS5yZW5kZXJlZCBjb21lcyBiYWNrIGFscmVhZHkgSFRNTC1lbnRpdHktZW5jb2RlZFxuICAvLyAoZS5nLiBcIldoZW4gWW91JiM4MjE3O3JlIFNoYWtlblwiKSAtIG1lYW50IHRvIGJlIGluc2VydGVkIGFzIGlubmVySFRNTFxuICAvLyBkaXJlY3RseSwgbm90IHJlLWVzY2FwZWQuIFJ1bm5pbmcgaXQgdGhyb3VnaCBlc2NhcGVIdG1sKCkgd2l0aG91dFxuICAvLyBkZWNvZGluZyBmaXJzdCBkb3VibGUtZW5jb2RlcyB0aGUgXCImXCIsIHNvIHRoZSBhcG9zdHJvcGhlIHJlbmRlcnMgYXNcbiAgLy8gbGl0ZXJhbCB2aXNpYmxlIHRleHQgXCImIzgyMTc7XCIgaW5zdGVhZCBvZiBhbiBhcG9zdHJvcGhlLiBEZWNvZGUgb25jZVxuICAvLyBoZXJlIHNvIGRvd25zdHJlYW0gZXNjYXBlSHRtbCgpIGNhbGxzIHRyZWF0IGl0IGFzIHBsYWluIHRleHQuXG4gIGZ1bmN0aW9uIGRlY29kZUh0bWxFbnRpdGllcyhzdHIpIHtcbiAgICB2YXIgdGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG4gICAgdGEuaW5uZXJIVE1MID0gc3RyIHx8IFwiXCI7XG4gICAgcmV0dXJuIHRhLnZhbHVlO1xuICB9XG5cbiAgZnVuY3Rpb24gZXNjYXBlSHRtbChzdHIpIHtcbiAgICByZXR1cm4gU3RyaW5nKHN0ciB8fCBcIlwiKS5yZXBsYWNlKC9bJjw+XCInXS9nLCBmdW5jdGlvbiAoYykge1xuICAgICAgcmV0dXJuIHsgXCImXCI6IFwiJmFtcDtcIiwgXCI8XCI6IFwiJmx0O1wiLCBcIj5cIjogXCImZ3Q7XCIsICdcIic6IFwiJnF1b3Q7XCIsIFwiJ1wiOiBcIiYjMzk7XCIgfVtjXTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvRW1iZWRVcmwodXJsKSB7XG4gICAgaWYgKCF1cmwpIHJldHVybiBudWxsO1xuICAgIHZhciB5dCA9IHVybC5tYXRjaCgvKD86eW91dHVcXC5iZVxcL3x5b3V0dWJlXFwuY29tXFwvKD86d2F0Y2hcXD92PXxlbWJlZFxcL3xzaG9ydHNcXC8pKShbXFx3LV17MTF9KS8pO1xuICAgIGlmICh5dCkgcmV0dXJuIFwiaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvXCIgKyB5dFsxXTtcbiAgICB2YXIgdmltZW8gPSB1cmwubWF0Y2goL3ZpbWVvXFwuY29tXFwvKD86dmlkZW9cXC8pPyhcXGQrKS8pO1xuICAgIGlmICh2aW1lbykgcmV0dXJuIFwiaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvL1wiICsgdmltZW9bMV07XG4gICAgcmV0dXJuIG51bGw7IC8vIHVucmVjb2duaXplZCBob3N0IC0gZGV0YWlsIHZpZXcgZmFsbHMgYmFjayB0byBhIHBsYWluIGxpbmsgcmF0aGVyIHRoYW4gZ3Vlc3NpbmdcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjcm9sbFRvSWQoaWQpIHtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIHZhciB0b3AgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB3aW5kb3cuc2Nyb2xsWSAtIDkwO1xuICAgIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogdG9wLCBiZWhhdmlvcjogXCJzbW9vdGhcIiB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlYm91bmNlKGZuLCB3YWl0KSB7XG4gICAgdmFyIHRpbWVyO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBmbi5hcHBseShudWxsLCBhcmdzKTsgfSwgd2FpdCk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIC0tLS0gRmlsdGVyIHN0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGZ1bmN0aW9uIHBvcHVsYXRlRmlsdGVyU2VsZWN0cygpIHtcbiAgICBmdW5jdGlvbiBmaWxsKHNlbGVjdElkLCB0ZXJtcykge1xuICAgICAgdmFyIHNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGVjdElkKTtcbiAgICAgIHRlcm1zLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKCF0LmNvdW50KSByZXR1cm47IC8vIGRyYWZ0LW9ubHkgdGVybXMgKGNvdW50ID0gcHVibGlzaGVkIHBvc3RzKSB3b3VsZCBmaWx0ZXIgdG8gYW4gZW1wdHkgZ3JpZCAtIGhpZGUgdW50aWwgc29tZXRoaW5nIHB1Ymxpc2hlcyAoMjAyNi0wOC0wOClcbiAgICAgICAgdmFyIG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICAgIG9wdC52YWx1ZSA9IHQuaWQ7XG4gICAgICAgIG9wdC50ZXh0Q29udGVudCA9IHQubmFtZTtcbiAgICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZmlsbChcInR0YS1jYW1wLWZpbHRlclwiLCBzdGF0ZS50ZXJtcy5jYW1wKTtcbiAgICBmaWxsKFwidHRhLXNwZWFrZXItZmlsdGVyXCIsIHN0YXRlLnRlcm1zLnNwZWFrZXIpO1xuICAgIGZpbGwoXCJ0dGEtc2VyaWVzLWZpbHRlclwiLCBzdGF0ZS50ZXJtcy5zZXJpZXMpO1xuICAgIGZpbGwoXCJ0dGEtdG9waWMtZmlsdGVyXCIsIHN0YXRlLnRlcm1zLnRvcGljcyk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0RlZmF1bHRGaWx0ZXJTdGF0ZSgpIHtcbiAgICByZXR1cm4gIXN0YXRlLmZpbHRlcmVkQ2FtcElkICYmICFzdGF0ZS5maWx0ZXJlZFNwZWFrZXJJZCAmJiAhc3RhdGUuZmlsdGVyZWRTZXJpZXNJZCAmJiAhc3RhdGUuZmlsdGVyZWRUb3BpY0lkICYmICFzdGF0ZS5zZWFyY2ggJiYgc3RhdGUuc29ydCA9PT0gXCJuZXdlc3RcIjtcbiAgfVxuXG4gIC8vIFJlc2V0cyBwYWdpbmF0aW9uIGFuZCByZS1mZXRjaGVzIHRoZSBncmlkIChzZXJ2ZXItcGFnaW5hdGVkKSBvciByZS1ydW5zXG4gIC8vIHRoZSBzZWFyY2ggKGNsaWVudC1wYWdpbmF0ZWQpIC0gY2FsbGVkIGFmdGVyIGFueSBmaWx0ZXIvc29ydC9zZWFyY2hcbiAgLy8gY2hhbmdlLiBGZWF0dXJlZC9zZXJpZXMtcm93cy9zcGVha2VyLXNwb3RsaWdodCB2aXNpYmlsaXR5IGlzIGhhbmRsZWRcbiAgLy8gZGVjbGFyYXRpdmVseSBpbiByZW5kZXJHcmlkRG9tKCkgdmlhIGlzRGVmYXVsdEZpbHRlclN0YXRlKCksIG5vIHNlcGFyYXRlXG4gIC8vIGFjdGlvbiBuZWVkZWQgaGVyZS5cbiAgZnVuY3Rpb24gdXBkYXRlRmlsdGVyQnJlYWRjcnVtYigpIHtcbiAgICB2YXIgYmMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1maWx0ZXItYnJlYWRjcnVtYlwiKTtcbiAgICBpZiAoIWJjKSByZXR1cm47XG4gICAgdmFyIGxhYmVsID0gXCJcIjtcbiAgICBpZiAoc3RhdGUuZmlsdGVyZWRTZXJpZXNJZCkge1xuICAgICAgdmFyIHQgPSBzdGF0ZS50ZXJtcy5zZXJpZXMuZmluZChmdW5jdGlvbiAoeCkgeyByZXR1cm4gU3RyaW5nKHguaWQpID09PSBTdHJpbmcoc3RhdGUuZmlsdGVyZWRTZXJpZXNJZCk7IH0pO1xuICAgICAgbGFiZWwgPSB0ID8gdC5uYW1lIDogXCJcIjtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmZpbHRlcmVkU3BlYWtlcklkKSB7XG4gICAgICB2YXIgdCA9IHN0YXRlLnRlcm1zLnNwZWFrZXIuZmluZChmdW5jdGlvbiAoeCkgeyByZXR1cm4gU3RyaW5nKHguaWQpID09PSBTdHJpbmcoc3RhdGUuZmlsdGVyZWRTcGVha2VySWQpOyB9KTtcbiAgICAgIGxhYmVsID0gdCA/IHQubmFtZSA6IFwiXCI7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5maWx0ZXJlZENhbXBJZCkge1xuICAgICAgdmFyIHQgPSBzdGF0ZS50ZXJtcy5jYW1wLmZpbmQoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIFN0cmluZyh4LmlkKSA9PT0gU3RyaW5nKHN0YXRlLmZpbHRlcmVkQ2FtcElkKTsgfSk7XG4gICAgICBsYWJlbCA9IHQgPyB0Lm5hbWUgOiBcIlwiO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZmlsdGVyZWRUb3BpY0lkKSB7XG4gICAgICB2YXIgdCA9IHN0YXRlLnRlcm1zLnRvcGljcy5maW5kKGZ1bmN0aW9uICh4KSB7IHJldHVybiBTdHJpbmcoeC5pZCkgPT09IFN0cmluZyhzdGF0ZS5maWx0ZXJlZFRvcGljSWQpOyB9KTtcbiAgICAgIGxhYmVsID0gdCA/IHQubmFtZSA6IFwiXCI7XG4gICAgfVxuICAgIGlmIChsYWJlbCkge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0dGEtZmlsdGVyLWJyZWFkY3J1bWItbGFiZWxcIikudGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgICAgIGJjLmhpZGRlbiA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYy5oaWRkZW4gPSB0cnVlO1xuICAgICAgLy8gQWxzbyBjbGVhciB0aGUgc3RhbGUgbGFiZWwgdGV4dCAoMjAyNi0wOC0wOSk6IGhpZGluZyBhbG9uZSBwcm92ZWRcbiAgICAgIC8vIGZyYWdpbGUgb25jZSBhbHJlYWR5IC0gYW4gdW5jb25kaXRpb25hbCBDU1MgYGRpc3BsYXlgIHJ1bGUgc2lsZW50bHlcbiAgICAgIC8vIGRlZmVhdGVkIFtoaWRkZW5dIGFuZCByZW5kZXJlZCB0aGUgbGVmdG92ZXIgbGFiZWwgKHNlZSB0aGVcbiAgICAgIC8vIC50dGEtYnJlYWRjcnVtYjpub3QoW2hpZGRlbl0pIG5vdGUgaW4gdGhlIENTUykuIEJlbHQgYW5kIHN1c3BlbmRlcnM6XG4gICAgICAvLyBldmVuIGlmIGhpZGluZyBldmVyIHJlZ3Jlc3NlcyBhZ2FpbiwgdGhlcmUncyBubyBzdGFsZSBuYW1lIHRvIHNob3cuXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1maWx0ZXItYnJlYWRjcnVtYi1sYWJlbFwiKS50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXJBbGxGaWx0ZXJzKCkge1xuICAgIHN0YXRlLmZpbHRlcmVkQ2FtcElkID0gXCJcIjtcbiAgICBzdGF0ZS5maWx0ZXJlZFNwZWFrZXJJZCA9IFwiXCI7XG4gICAgc3RhdGUuZmlsdGVyZWRTZXJpZXNJZCA9IFwiXCI7XG4gICAgc3RhdGUuZmlsdGVyZWRUb3BpY0lkID0gXCJcIjtcbiAgICBzdGF0ZS5zZWFyY2ggPSBcIlwiO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidHRhLWNhbXAtZmlsdGVyXCIpLnZhbHVlID0gXCJcIjtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1zcGVha2VyLWZpbHRlclwiKS52YWx1ZSA9IFwiXCI7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0dGEtc2VyaWVzLWZpbHRlclwiKS52YWx1ZSA9IFwiXCI7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0dGEtdG9waWMtZmlsdGVyXCIpLnZhbHVlID0gXCJcIjtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1zZWFyY2hcIikudmFsdWUgPSBcIlwiO1xuICAgIGFwcGx5RmlsdGVyQ2hhbmdlKCk7XG4gICAgd2luZG93LnNjcm9sbFRvKDAsIDApO1xuICB9XG5cbiAgZnVuY3Rpb24gYXBwbHlGaWx0ZXJDaGFuZ2UoKSB7XG4gICAgc3RhdGUuZ3JpZC5wYWdlID0gMTtcbiAgICBzdGF0ZS5ncmlkLml0ZW1zID0gW107XG4gICAgc3RhdGUuZ3JpZC5zZWFyY2hJdGVtcyA9IG51bGw7XG4gICAgc3RhdGUuZ3JpZC52aXNpYmxlQ291bnQgPSBQQUdFX1NJWkU7XG4gICAgc3RhdGUuZ3JpZC5hcHBlbmRMb2FkaW5nID0gZmFsc2U7XG4gICAgLy8gQnJlYWRjcnVtYiBpcyBOT1QgdXBkYXRlZCBoZXJlIGFueW1vcmUgLSByZW5kZXJHcmlkRG9tKCkgZGVyaXZlcyBpdFxuICAgIC8vIGZyb20gZmlsdGVyIHN0YXRlIG9uIGV2ZXJ5IHJlbmRlciAoMjAyNi0wOC0wOTsgSm9obiBjYXVnaHQgYSBzdGFsZVxuICAgIC8vIFwiVGhlIFRha2Vhd2F5IC8gSm9lIFN0b3dlbGxcIiBicmVhZGNydW1iIHNpdHRpbmcgb24gdGhlIGRlZmF1bHQgaHViKS5cbiAgICAvLyBFdmVudC1kcml2ZW4gdXBkYXRlcyBvbmx5IGNvdmVyIHBhdGhzIHRoYXQgZ28gdGhyb3VnaCB0aGlzIGZ1bmN0aW9uO1xuICAgIC8vIGRlY2xhcmF0aXZlIHJlbmRlcmluZyBjb3ZlcnMgZXZlcnkgcGF0aCB0aGF0IHJlbmRlcnMsIHBlcmlvZC5cbiAgICBpZiAoaXNDYW1wTGFuZGluZ1N0YXRlKCkpIGVuc3VyZUNhbXBMYW5kaW5nKCk7IC8vIGNhbXAtb25seSBmaWx0ZXIgPSBsYW5kaW5nIHZpZXc7IGZldGNoZXMgb25seSB3aGVuIHRoZSBjYW1wIGFjdHVhbGx5IGNoYW5nZWRcbiAgICBpZiAoc3RhdGUuc2VhcmNoKSB7XG4gICAgICBydW5TZWFyY2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZEdyaWRQYWdlKDEsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvLyAtLS0tIEZlYXR1cmVkIHRhbGsgKGZldGNoZWQgb25jZSwgc2hvd24gb25seSBpbiBkZWZhdWx0IGZpbHRlciBzdGF0ZSkgLS1cbiAgLy8gQ2FyZHMgYXJlIHJlYWwgPGEgaHJlZj1cInRhbGsgcGVybWFsaW5rXCI+IGVsZW1lbnRzIGFzIG9mIDIwMjYtMDgtMDggKHdhc1xuICAvLyA8YnV0dG9uPik6IHZhbGlkIEhUTUwgKGhlYWRpbmdzIGFyZSBub3QgcGVybWl0dGVkIGluc2lkZSA8YnV0dG9uPiksXG4gIC8vIG1pZGRsZS1jbGljay9jbWQtY2xpY2sgb3Blbi1pbi1uZXctdGFiIHdvcmtzLCBhbmQgdGhlIGh1YiBub3cgaGFzIHJlYWwsXG4gIC8vIGNyYXdsYWJsZSBsaW5rcyB0byBldmVyeSB0YWxrIHBlcm1hbGluayAodGhlIHRyYW5zY3JpcHQgU0VPIHN0cmF0ZWd5XG4gIC8vIGRlcGVuZHMgb24gY3Jhd2xlcnMgZmluZGluZyB0aG9zZSBwYWdlcykuIEEgcGxhaW4gbGVmdCBjbGljayBpcyBzdGlsbFxuICAvLyBpbnRlcmNlcHRlZCBpbiBoYW5kbGVHcmlkQ2xpY2soKSBmb3IgdGhlIGZhc3QgaW4tcGFnZSBkZXRhaWwgc3dhcC5cbiAgZnVuY3Rpb24gZmVhdHVyZWRIdG1sKGVudHJ5KSB7XG4gICAgdmFyIGltZyA9IGVudHJ5LnRodW1ibmFpbExhcmdlIHx8IGVudHJ5LnRodW1ibmFpbDtcbiAgICB2YXIgdGh1bWIgPSBpbWcgPyAnPGltZyBzcmM9XCInICsgZXNjYXBlSHRtbChpbWcpICsgJ1wiIGFsdD1cIlwiIGxvYWRpbmc9XCJsYXp5XCI+JyA6IFwiXCI7XG4gICAgcmV0dXJuIChcbiAgICAgICc8YSBjbGFzcz1cInR0YS1mZWF0dXJlZFwiIGhyZWY9XCInICsgZXNjYXBlSHRtbChlbnRyeS5saW5rIHx8IFwiI1wiKSArICdcIiBkYXRhLWlkPVwiJyArIGVudHJ5LmlkICsgJ1wiPicgK1xuICAgICAgICAnPGRpdiBjbGFzcz1cInR0YS1mZWF0dXJlZC10aHVtYlwiPicgKyB0aHVtYiArXG4gICAgICAgICAgJzxkaXYgY2xhc3M9XCJ0dGEtcGxheS1iYWRnZSB0dGEtcGxheS1iYWRnZS0tbGdcIj48c3Bhbj48L3NwYW4+PC9kaXY+JyArXG4gICAgICAgICAgJzxzcGFuIGNsYXNzPVwidHRhLWZlYXR1cmVkLWJhZGdlXCI+RmVhdHVyZWQ8L3NwYW4+JyArXG4gICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJ0dGEtZmVhdHVyZWQtYm9keVwiPicgK1xuICAgICAgICAgICc8ZGl2IGNsYXNzPVwidHRhLXRhZy1yb3dcIj4nICtcbiAgICAgICAgICAgIChlbnRyeS5jYW1wID8gJzxzcGFuIGNsYXNzPVwidHRhLXRhZyB0dGEtdGFnLS1jYW1wXCI+JyArIGVzY2FwZUh0bWwoZW50cnkuY2FtcCkgKyAnPC9zcGFuPicgOiBcIlwiKSArXG4gICAgICAgICAgICAoZW50cnkuc2VyaWVzID8gJzxzcGFuIGNsYXNzPVwidHRhLXRhZyB0dGEtdGFnLS1zZXJpZXNcIj4nICsgZXNjYXBlSHRtbChlbnRyeS5zZXJpZXMpICsgJzwvc3Bhbj4nIDogXCJcIikgK1xuICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAnPGgyIGNsYXNzPVwidHRhLWZlYXR1cmVkLXRpdGxlXCI+JyArIGVzY2FwZUh0bWwoZW50cnkudGl0bGUpICsgJzwvaDI+JyArXG4gICAgICAgICAgJzxwIGNsYXNzPVwidHRhLWZlYXR1cmVkLW1ldGFcIj4nICsgZXNjYXBlSHRtbChlbnRyeS5zcGVha2VyKSArIChlbnRyeS5kYXRlID8gXCIgJm1pZGRvdDsgXCIgKyBlc2NhcGVIdG1sKGVudHJ5LmRhdGUpIDogXCJcIikgKyAnPC9wPicgK1xuICAgICAgICAgIChlbnRyeS5leGNlcnB0ID8gJzxwIGNsYXNzPVwidHRhLWZlYXR1cmVkLWV4Y2VycHRcIj4nICsgZXNjYXBlSHRtbChlbnRyeS5leGNlcnB0KSArICc8L3A+JyA6IFwiXCIpICtcbiAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJ0dGEtd2F0Y2gtbGlua1wiPldhdGNoIHRoZSBUYWxrICZyYXJyOzwvc3Bhbj4nICtcbiAgICAgICAgJzwvZGl2PicgK1xuICAgICAgJzwvYT4nXG4gICAgKTtcbiAgfVxuXG4gIC8vIEZlYXR1cmVkIHJvdGF0ZXMgZGFpbHkgaW5zdGVhZCBvZiBzaG93aW5nIHRoZSBuZXdlc3QgdGFsayAoSm9obidzIGNhbGwsXG4gIC8vIDIwMjYtMDgtMDkgLSBzZWUgdGhlIGZpbGUtaGVhZGVyIGN1cmF0aW9uIG5vdGUgZm9yIHdoeSBcIm5ld2VzdFwiIGZhaWxzXG4gIC8vIHVuZGVyIHNlYXNvbmFsIG1hc3MgdXBsb2FkcykuIFBpY2sgPSBhIHJvdGF0aW5nIHJhbmsgaW50byB0aGVcbiAgLy8gZGF0ZS1vcmRlcmVkIGxpYnJhcnkgdmlhIFdQJ3MgbmF0aXZlIGBvZmZzZXRgIHBhcmFtOiBvbmUgcmVxdWVzdCwgc2FtZVxuICAvLyBhcyBiZWZvcmUuIEZFQVRVUkVEX1BJTl9TTFVHIChjb25maWcsIHRvcCBvZiBmaWxlKSBvdmVycmlkZXMgcm90YXRpb25cbiAgLy8gZW50aXJlbHkgZm9yIGxhdW5jaCB3ZWVrcy9zZWFzb25hbCBwdXNoZXMuXG4gIGZ1bmN0aW9uIGxvYWRGZWF0dXJlZCgpIHtcbiAgICBpZiAoRkVBVFVSRURfUElOX1NMVUcpIHtcbiAgICAgIHJldHVybiBmZXRjaEpzb24oYnVpbGRMaXN0VXJsKHsgc2x1ZzogRkVBVFVSRURfUElOX1NMVUcgfSkpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICBzdGF0ZS5mZWF0dXJlZCA9IHJlcy5kYXRhLm1hcChub3JtYWxpemUpWzBdIHx8IG51bGw7XG4gICAgICAgIGlmICghc3RhdGUuZmVhdHVyZWQpIHJldHVybiBsb2FkUm90YXRpbmdGZWF0dXJlZCgpOyAvLyBwaW5uZWQgc2x1ZyBtaXNzaW5nL3VucHVibGlzaGVkIC0gcm90YXRlIHJhdGhlciB0aGFuIGJsYW5rIHRoZSBzbG90XG4gICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBsb2FkUm90YXRpbmdGZWF0dXJlZCgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsb2FkUm90YXRpbmdGZWF0dXJlZCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9hZFJvdGF0aW5nRmVhdHVyZWQoKSB7XG4gICAgLy8gVG90YWwgcHVibGlzaGVkIHRhbGtzLCBzdW1tZWQgZnJvbSBzZXJpZXMgdGVybSBjb3VudHMgKGFscmVhZHlcbiAgICAvLyBsb2FkZWQsIHplcm8gcmVxdWVzdHMpLiBJZiBzb21lIHRhbGtzIGNhcnJ5IG5vIHNlcmllcyB0ZXJtIHRoaXMgY2FuXG4gICAgLy8gdW5kZXJzaG9vdCB0aGUgcmVhbCB0b3RhbCAtIGhhcm1sZXNzLCBvZmZzZXQgc3RheXMgaW4gcmFuZ2UuIFRoZVxuICAgIC8vIHJlcy5kYXRhLmxlbmd0aCBjaGVjayBiZWxvdyBjb3ZlcnMgdGhlIG9wcG9zaXRlIChvdmVyc2hvb3QpIGNhc2UuXG4gICAgdmFyIHRvdGFsID0gMDtcbiAgICBwdWJsaXNoZWRUZXJtcyhzdGF0ZS50ZXJtcy5zZXJpZXMpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsgdG90YWwgKz0gdC5jb3VudDsgfSk7XG4gICAgdmFyIG9mZnNldCA9IHRvdGFsID4gMCA/IChyb3RhdGlvbkRheSgpICogUk9UQVRJT05fU1RSSURFKSAlIHRvdGFsIDogMDtcbiAgICByZXR1cm4gZmV0Y2hKc29uKGJ1aWxkTGlzdFVybCh7IHBlcl9wYWdlOiAxLCBvZmZzZXQ6IG9mZnNldCwgb3JkZXJieTogXCJkYXRlXCIsIG9yZGVyOiBcImRlc2NcIiB9KSkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICBpZiAoIXJlcy5kYXRhLmxlbmd0aCAmJiBvZmZzZXQgPiAwKSB7XG4gICAgICAgIC8vIE9mZnNldCBwYXN0IHRoZSByZWFsIGVuZCAodGVybS1jb3VudCBzdW0gb3ZlcnNob3QsIGUuZy4gYSB0YWxrXG4gICAgICAgIC8vIGNvdW50ZWQgdW5kZXIgdHdvIHNlcmllcykgLSByZS1kZXJpdmUgZnJvbSB0aGUgcmVzcG9uc2UncyBvd25cbiAgICAgICAgLy8gWC1XUC1Ub3RhbCBhbmQgcmV0cnkgb25jZS5cbiAgICAgICAgdmFyIHJlYWxUb3RhbCA9IHJlcy50b3RhbCB8fCAwO1xuICAgICAgICB2YXIgc2FmZSA9IHJlYWxUb3RhbCA+IDAgPyAocm90YXRpb25EYXkoKSAqIFJPVEFUSU9OX1NUUklERSkgJSByZWFsVG90YWwgOiAwO1xuICAgICAgICByZXR1cm4gZmV0Y2hKc29uKGJ1aWxkTGlzdFVybCh7IHBlcl9wYWdlOiAxLCBvZmZzZXQ6IHNhZmUsIG9yZGVyYnk6IFwiZGF0ZVwiLCBvcmRlcjogXCJkZXNjXCIgfSkpLnRoZW4oZnVuY3Rpb24gKHJlczIpIHtcbiAgICAgICAgICBzdGF0ZS5mZWF0dXJlZCA9IHJlczIuZGF0YS5tYXAobm9ybWFsaXplKVswXSB8fCBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmZlYXR1cmVkID0gcmVzLmRhdGEubWFwKG5vcm1hbGl6ZSlbMF0gfHwgbnVsbDtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC0tLS0gU2VyaWVzIHJvd3MgKyBTcGVha2VyIHNwb3RsaWdodCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUHJldmlvdXNseSBvbmUgc2hhcmVkIHBlcl9wYWdlPTEwMCBcInJlY2VudCB0YWxrc1wiIGJhdGNoLCBjYXBwZWQgdG8gdGhlXG4gIC8vIDEwMCBuZXdlc3QgdGFsa3MgYW5kIGRlcml2aW5nIGJvdGggc2VjdGlvbnMgZnJvbSBpdCBjbGllbnQtc2lkZSAtXG4gIC8vIHJlamVjdGVkIGluIGZhdm9yIG9mIE4gZGVkaWNhdGVkIHBlci10ZXJtIHJlcXVlc3RzIGJhY2sgb24gMjAyNi0wOC0wNVxuICAvLyBiZWNhdXNlLCB1bmNhY2hlZCwgTiByZXF1ZXN0cyBhdCB0aGlzIFdQL0FDRiBzdGFjaydzIH4xLjhzIGZpeGVkXG4gIC8vIHBlci1yZXF1ZXN0IGNvc3Qgcmlza2VkIGJlaW5nIHNsb3dlciB0aGFuIG9uZSBiYXRjaCBjYWxsLiBUaGF0XG4gIC8vIDEwMC10YWxrIGNhcCB0dXJuZWQgaW50byBhIHJlYWwgY29ycmVjdG5lc3MgYnVnLCBub3QganVzdCBhIHBlcmZcbiAgLy8gY2VpbGluZywgb25jZSB0YWxrIGNvdW50IGdyZXcgcGFzdCBpdDogYW55IHNlcmllcyAob3Igc3BlYWtlciwgZm9yIGl0c1xuICAvLyBwaG90byBmYWxsYmFjaykgd2hvc2UgdGFsa3Mgd2VyZSBhbGwgb2xkZXIgdGhhbiB0aGUgbmV3ZXN0IDEwMCB3b3VsZFxuICAvLyBzaWxlbnRseSB2YW5pc2ggZnJvbSB0aGUgaG9tZXBhZ2UuIFJldmVydGVkIHRvIE4gZGVkaWNhdGVkIHJlcXVlc3RzXG4gIC8vIDIwMjYtMDgtMDcgbm93IHRoYXQgdGhlIFBoYXNlIDIgUkVTVCByZXNwb25zZSBjYWNoZSAoc2hpcHBlZFxuICAvLyAyMDI2LTA4LTA2LCBzZWUgb3BzL3dwY29kZS1zbmlwcGV0cy9yZXN0LXJlc3BvbnNlLWNhY2hlLnBocCkgcmVtb3Zlc1xuICAvLyB0aGUgb3JpZ2luYWwgb2JqZWN0aW9uOiBlYWNoIHBlci10ZXJtIHF1ZXJ5IGlzIGl0cyBvd24gY2FjaGUga2V5LCBzb1xuICAvLyBvbmx5IHRoZSBmaXJzdCB2aXNpdG9yIHBlciAxMC1taW51dGUgVFRMIHdpbmRvdyBwZXIgdGVybSBwYXlzIHRoZVxuICAvLyB+MS44cyBjb3N0IC0gZXZlcnlvbmUgZWxzZSBnZXRzIGEgY2FjaGUgSElULiBOIG5vdyBzY2FsZXMgd2l0aCBzZXJpZXNcbiAgLy8gY291bnQgKDUgdG9kYXkpIGFuZCBzcGVha2VyIGNvdW50ICg2IHRvZGF5KSwgbm90IHRhbGsgY291bnQgKDEyOCsgYW5kXG4gIC8vIGNsaW1iaW5nKSAtIHRoZSBhY3R1YWwgYm91bmRlZCBxdWFudGl0eSAtIHNvIHRoaXMgZG9lc24ndCByZWludHJvZHVjZVxuICAvLyB0aGUgcmVxdWVzdC1mYW4tb3V0IHByb2JsZW0gdGhhdCBnb3QgdGhpcyBkZXNpZ24gcG9pbnQgcmVqZWN0ZWQgdGhlXG4gIC8vIGZpcnN0IHRpbWUuIFNlZSBvcHMvdGhlLXRha2Vhd2F5LXBhZ2luYXRpb24tcmVkZXNpZ24ubWQuXG4gIGZ1bmN0aW9uIHNlcmllc0NhcmRIdG1sKGVudHJ5KSB7XG4gICAgdmFyIHRodW1iID0gZW50cnkudGh1bWJuYWlsID8gJzxpbWcgc3JjPVwiJyArIGVzY2FwZUh0bWwoZW50cnkudGh1bWJuYWlsKSArICdcIiBhbHQ9XCJcIiBsb2FkaW5nPVwibGF6eVwiPicgOiBcIlwiO1xuICAgIHJldHVybiAoXG4gICAgICAnPGEgY2xhc3M9XCJ0dGEtc2VyaWVzLWNhcmRcIiBocmVmPVwiJyArIGVzY2FwZUh0bWwoZW50cnkubGluayB8fCBcIiNcIikgKyAnXCIgZGF0YS1pZD1cIicgKyBlbnRyeS5pZCArICdcIj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJ0dGEtc2VyaWVzLWNhcmQtdGh1bWJcIj4nICsgdGh1bWIgKyAnPGRpdiBjbGFzcz1cInR0YS1wbGF5LWJhZGdlXCI+PHNwYW4+PC9zcGFuPjwvZGl2PjwvZGl2PicgK1xuICAgICAgICAnPGRpdiBjbGFzcz1cInR0YS1zZXJpZXMtY2FyZC1ib2R5XCI+JyArXG4gICAgICAgICAgJzxoMz4nICsgZXNjYXBlSHRtbChlbnRyeS50aXRsZSkgKyAnPC9oMz4nICtcbiAgICAgICAgICAnPHA+JyArIGVzY2FwZUh0bWwoZW50cnkuc3BlYWtlcikgKyAoZW50cnkuZGF0ZSA/IFwiICZtaWRkb3Q7IFwiICsgZXNjYXBlSHRtbChlbnRyeS5kYXRlKSA6IFwiXCIpICsgJzwvcD4nICtcbiAgICAgICAgJzwvZGl2PicgK1xuICAgICAgJzwvYT4nXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlcmllc1Jvd1NlY3Rpb25IdG1sKHRlcm0sIHRhbGtzKSB7XG4gICAgaWYgKCF0YWxrcy5sZW5ndGgpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiAoXG4gICAgICAnPHNlY3Rpb24gY2xhc3M9XCJ0dGEtc2VyaWVzLXNlY3Rpb25cIj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJ0dGEtc2VyaWVzLWhlYWRcIj4nICtcbiAgICAgICAgICAvLyBoMywgbm90IGgyOiByb3dzIHNpdCB1bmRlciB0aGUgXCJGZWF0dXJlZCBTZXJpZXNcIiAvIGNhbXAtbGFuZGluZ1xuICAgICAgICAgIC8vIHNlY3Rpb24gaGVhZGluZyAoaDIpIGFzIG9mIDIwMjYtMDgtMDkuXG4gICAgICAgICAgJzxoMz4nICsgZXNjYXBlSHRtbCh0ZXJtLm5hbWUpICsgJzwvaDM+JyArXG4gICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidHRhLXNlZS1hbGxcIiBkYXRhLXNlcmllcy1pZD1cIicgKyB0ZXJtLmlkICsgJ1wiPlNlZSBhbGwgJnJhcnI7PC9idXR0b24+JyArXG4gICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJ0dGEtc2VyaWVzLWdyaWRcIj4nICsgdGFsa3MubWFwKHNlcmllc0NhcmRIdG1sKS5qb2luKFwiXCIpICsgJzwvZGl2PicgK1xuICAgICAgJzwvc2VjdGlvbj4nXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBzdGFibGUgbWFwIHVuZGVyIHRoZSByb3RhdGluZyBzaG93Y2FzZTogb25lIHNtYWxsIHRleHQgdGlsZSBwZXJcbiAgLy8gcHVibGlzaGVkIHNlcmllcyAobmFtZSArIHRhbGsgY291bnQsIHN0cmFpZ2h0IGZyb20gdGhlIGFscmVhZHktbG9hZGVkXG4gIC8vIHRlcm0gbGlzdCAtIFpFUk8gcmVxdWVzdHMsIG5vIHRodW1ibmFpbHMgdG8gZmV0Y2gpLiBDbGlja2luZyBhIHRpbGVcbiAgLy8gYXBwbGllcyB0aGUgZXhpc3Rpbmcgc2VyaWVzIGZpbHRlciB2aWEgdGhlIHNhbWUgW2RhdGEtc2VyaWVzLWlkXVxuICAvLyBkZWxlZ2F0aW9uIHRoZSBwZXItcm93IFwiU2VlIGFsbFwiIGJ1dHRvbnMgdXNlLiBPbmx5IHJlbmRlcmVkIHdoZW4gdGhlXG4gIC8vIHJvdGF0aW5nIHJvd3MgZG9uJ3QgYWxyZWFkeSBjb3ZlciBldmVyeSBzZXJpZXMuXG4gIGZ1bmN0aW9uIHNlcmllc0RpcmVjdG9yeUh0bWwocG9vbCwgc2hvd25Db3VudCkge1xuICAgIGlmIChwb29sLmxlbmd0aCA8PSBzaG93bkNvdW50KSByZXR1cm4gXCJcIjtcbiAgICB2YXIgdGlsZXMgPSBwb29sLm1hcChmdW5jdGlvbiAodGVybSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidHRhLXNlcmllcy10aWxlXCIgZGF0YS1zZXJpZXMtaWQ9XCInICsgdGVybS5pZCArICdcIj4nICtcbiAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJ0dGEtc2VyaWVzLXRpbGUtbmFtZVwiPicgKyBlc2NhcGVIdG1sKHRlcm0ubmFtZSkgKyAnPC9zcGFuPicgK1xuICAgICAgICAgICc8c3BhbiBjbGFzcz1cInR0YS1zZXJpZXMtdGlsZS1jb3VudFwiPicgKyB0ZXJtLmNvdW50ICsgKHRlcm0uY291bnQgPT09IDEgPyBcIiB0YWxrXCIgOiBcIiB0YWxrc1wiKSArICc8L3NwYW4+JyArXG4gICAgICAgICc8L2J1dHRvbj4nXG4gICAgICApO1xuICAgIH0pLmpvaW4oXCJcIik7XG4gICAgcmV0dXJuIChcbiAgICAgICc8c2VjdGlvbiBjbGFzcz1cInR0YS1zZXJpZXMtZGlyZWN0b3J5XCI+JyArXG4gICAgICAgICc8aDIgY2xhc3M9XCJ0dGEtc2VjdGlvbi1oZWFkaW5nXCI+QWxsIFNlcmllczwvaDI+JyArXG4gICAgICAgICc8ZGl2IGNsYXNzPVwidHRhLXNlcmllcy10aWxlLWdyaWRcIj4nICsgdGlsZXMgKyAnPC9kaXY+JyArXG4gICAgICAnPC9zZWN0aW9uPidcbiAgICApO1xuICB9XG5cbiAgLy8gU0VSSUVTX1JPV1NfU0hPV04gcm93cywgY2hvc2VuIGJ5IGRhaWx5IHJvdGF0aW9uICgyMDI2LTA4LTA5IC0gd2FzOiBvbmVcbiAgLy8gcm93IHBlciBzZXJpZXMsIHdoaWNoIHN0b3BwZWQgc2NhbGluZyBwYXN0IH4xMCBzZXJpZXMpLiBPbmUgZGVkaWNhdGVkLFxuICAvLyBjYWNoZWQgcmVxdWVzdCBwZXIgRElTUExBWUVEIHJvdyAocGVyX3BhZ2U9NCZvcmRlcmJ5PWRhdGUmb3JkZXI9ZGVzYykgLVxuICAvLyByZXF1ZXN0IGNvdW50IGlzIGJvdW5kZWQgYnkgdGhlIGNvbnN0YW50LCBub3QgYnkgaG93IG1hbnkgc2VyaWVzIGV4aXN0LlxuICBmdW5jdGlvbiBsb2FkU2VyaWVzUm93cygpIHtcbiAgICB2YXIgcG9vbCA9IHB1Ymxpc2hlZFRlcm1zKHN0YXRlLnRlcm1zLnNlcmllcyk7XG4gICAgdmFyIGNob3NlbiA9IHJvdGF0aW9uUGljayhwb29sLCBTRVJJRVNfUk9XU19TSE9XTik7XG4gICAgdmFyIHJlcXVlc3RzID0gY2hvc2VuLm1hcChmdW5jdGlvbiAodGVybSkge1xuICAgICAgdmFyIHVybCA9IGJ1aWxkTGlzdFVybCh7IHNlcmllczogdGVybS5pZCwgcGVyX3BhZ2U6IDQsIG9yZGVyYnk6IFwiZGF0ZVwiLCBvcmRlcjogXCJkZXNjXCIgfSwgSE9NRVBBR0VfQkFUQ0hfRklFTERTKTtcbiAgICAgIHJldHVybiBmZXRjaEpzb24odXJsKS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgcmV0dXJuIHsgdGVybTogdGVybSwgdGFsa3M6IHJlcy5kYXRhLm1hcChub3JtYWxpemUpIH07XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocmVxdWVzdHMpLnRoZW4oZnVuY3Rpb24gKHJvd3MpIHtcbiAgICAgIHZhciByb3dzSHRtbCA9IHJvd3MubWFwKGZ1bmN0aW9uIChyb3cpIHsgcmV0dXJuIHNlcmllc1Jvd1NlY3Rpb25IdG1sKHJvdy50ZXJtLCByb3cudGFsa3MpOyB9KS5qb2luKFwiXCIpO1xuICAgICAgdmFyIGhlYWRpbmcgPSByb3dzSHRtbFxuICAgICAgICA/ICc8aDIgY2xhc3M9XCJ0dGEtc2VjdGlvbi1oZWFkaW5nXCI+JyArIChwb29sLmxlbmd0aCA+IGNob3Nlbi5sZW5ndGggPyBcIkZlYXR1cmVkIFNlcmllc1wiIDogXCJTZXJpZXNcIikgKyAnPC9oMj4nXG4gICAgICAgIDogXCJcIjtcbiAgICAgIHN0YXRlLnNlcmllc1Jvd3NIdG1sID0gaGVhZGluZyArIHJvd3NIdG1sICsgc2VyaWVzRGlyZWN0b3J5SHRtbChwb29sLCBjaG9zZW4ubGVuZ3RoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIE9uZSBjb21wYWN0IGNoaXAgcGVyIHNwZWFrZXIuIGBzaG93Q291bnQ6IGZhbHNlYCBpbiBjYW1wLWxhbmRpbmcgbW9kZSAtXG4gIC8vIHRlcm0uY291bnQgaXMgdGhlIHNwZWFrZXIncyBHTE9CQUwgcHVibGlzaGVkLXRhbGsgY291bnQsIHdoaWNoIHdvdWxkXG4gIC8vIHJlYWQgYXMgXCJ0YWxrcyBhdCB0aGlzIGNhbXBcIiB0aGVyZSBhbmQgYmUgd3JvbmcuXG4gIGZ1bmN0aW9uIHNwZWFrZXJDaGlwSHRtbCh0ZXJtLCBzaG93Q291bnQpIHtcbiAgICB2YXIgcGhvdG9VcmwgPSBTUEVBS0VSX1BIT1RPU1t0ZXJtLm5hbWVdIHx8IHN0YXRlLnNwZWFrZXJGYWxsYmFja1Bob3Rvc1t0ZXJtLmlkXSB8fCBcIlwiO1xuICAgIHZhciBhdmF0YXIgPSBwaG90b1VybCA/ICc8aW1nIHNyYz1cIicgKyBlc2NhcGVIdG1sKHBob3RvVXJsKSArICdcIiBhbHQ9XCJcIiBsb2FkaW5nPVwibGF6eVwiPicgOiBcIlwiO1xuICAgIHJldHVybiAoXG4gICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0dGEtc3BlYWtlci1jYXJkXCIgZGF0YS1zcGVha2VyLWlkPVwiJyArIHRlcm0uaWQgKyAnXCI+JyArXG4gICAgICAgICc8ZGl2IGNsYXNzPVwidHRhLXNwZWFrZXItYXZhdGFyXCI+JyArIGF2YXRhciArICc8L2Rpdj4nICtcbiAgICAgICAgJzxkaXY+JyArXG4gICAgICAgICAgJzxzcGFuIGNsYXNzPVwidHRhLXNwZWFrZXItbmFtZVwiPicgKyBlc2NhcGVIdG1sKHRlcm0ubmFtZSkgKyAnPC9zcGFuPicgK1xuICAgICAgICAgIChzaG93Q291bnQgPT09IGZhbHNlID8gXCJcIiA6ICc8c3BhbiBjbGFzcz1cInR0YS1zcGVha2VyLWNvdW50XCI+JyArIHRlcm0uY291bnQgKyAodGVybS5jb3VudCA9PT0gMSA/IFwiIHRhbGtcIiA6IFwiIHRhbGtzXCIpICsgJzwvc3Bhbj4nKSArXG4gICAgICAgICc8L2Rpdj4nICtcbiAgICAgICc8L2J1dHRvbj4nXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlY29tcHV0ZWQgb24gZXZlcnkgcmVuZGVyL3RvZ2dsZSBmcm9tIHN0YXRlLnNwZWFrZXJQb29sIC0gd2hpbGUgdGhlXG4gIC8vIHJvc3RlciBpcyBhdCBvciB1bmRlciBTUEVBS0VSX0NPTExBUFNFX1RIUkVTSE9MRCBldmVyeW9uZSBzaG93czsgcGFzdFxuICAvLyBpdCwgU1BFQUtFUl9DSElQU19TSE9XTiBjaGlwcyByb3RhdGUgZGFpbHkgKHNhbWUgZGl2ZXJzaXR5IHJlYXNvbmluZyBhc1xuICAvLyB0aGUgc2VyaWVzIHJvd3MpIGJlaGluZCBhIFwiU2hvdyBhbGxcIiB0b2dnbGUgdGhhdCBleHBhbmRzIGluIHBsYWNlLlxuICBmdW5jdGlvbiBzcGVha2VyU3BvdGxpZ2h0SHRtbCgpIHtcbiAgICB2YXIgcG9vbCA9IHN0YXRlLnNwZWFrZXJQb29sO1xuICAgIGlmICghcG9vbC5sZW5ndGgpIHJldHVybiBcIlwiO1xuICAgIHZhciBjb2xsYXBzaWJsZSA9IHBvb2wubGVuZ3RoID4gU1BFQUtFUl9DT0xMQVBTRV9USFJFU0hPTEQ7XG4gICAgdmFyIHNob3duID0gKGNvbGxhcHNpYmxlICYmICFzdGF0ZS5zcGVha2VyU2hvd0FsbCkgPyByb3RhdGlvblBpY2socG9vbCwgU1BFQUtFUl9DSElQU19TSE9XTikgOiBwb29sO1xuICAgIHZhciBjaGlwcyA9IHNob3duLm1hcChmdW5jdGlvbiAodGVybSkgeyByZXR1cm4gc3BlYWtlckNoaXBIdG1sKHRlcm0sIHRydWUpOyB9KS5qb2luKFwiXCIpO1xuICAgIHZhciB0b2dnbGUgPSBjb2xsYXBzaWJsZVxuICAgICAgPyAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0dGEtc3BlYWtlci10b2dnbGVcIiBpZD1cInR0YS1zcGVha2VyLXRvZ2dsZVwiIGFyaWEtZXhwYW5kZWQ9XCInICsgKHN0YXRlLnNwZWFrZXJTaG93QWxsID8gXCJ0cnVlXCIgOiBcImZhbHNlXCIpICsgJ1wiPicgK1xuICAgICAgICAgIChzdGF0ZS5zcGVha2VyU2hvd0FsbCA/IFwiU2hvdyBmZXdlciBzcGVha2Vyc1wiIDogXCJTaG93IGFsbCBcIiArIHBvb2wubGVuZ3RoICsgXCIgc3BlYWtlcnNcIikgK1xuICAgICAgICAnPC9idXR0b24+J1xuICAgICAgOiBcIlwiO1xuICAgIHJldHVybiAnPHNlY3Rpb24gY2xhc3M9XCJ0dGEtc3BlYWtlci1zZWN0aW9uXCI+PGgyPlNwZWFrZXJzPC9oMj48ZGl2IGNsYXNzPVwidHRhLXNwZWFrZXItZ3JpZFwiPicgKyBjaGlwcyArICc8L2Rpdj4nICsgdG9nZ2xlICsgJzwvc2VjdGlvbj4nO1xuICB9XG5cbiAgLy8gU3BlYWtlciBjaGlwcyBuZWVkIG9ubHkgbmFtZSArIGNvdW50ICh0ZXJtIGxpc3QsIGFscmVhZHkgbG9hZGVkKSBhbmQgYVxuICAvLyBwaG90by4gRXZlcnkgcHVibGlzaGVkIHNwZWFrZXIgbm9ybWFsbHkgaGFzIGEgc3RhdGljIFNQRUFLRVJfUEhPVE9TXG4gIC8vIGVudHJ5LCBzbyB0aGUgbGF0ZXN0LXRhbGsgYXZhdGFyLWZhbGxiYWNrIGZldGNoIGZpcmVzIE9OTFkgZm9yIHNwZWFrZXJzXG4gIC8vIG1pc3NpbmcgZnJvbSB0aGF0IG1hcCAoMjAyNi0wOC0wOSAtIHdhczogb25lIHJlcXVlc3QgcGVyIHNwZWFrZXIsXG4gIC8vIHVuY29uZGl0aW9uYWxseSkuIFR5cGljYWwgcmVxdWVzdCBjb3VudCBmb3IgdGhpcyBzZWN0aW9uOiB6ZXJvLlxuICAvLyBEcmFmdC1vbmx5IHNwZWFrZXJzIGFyZSBleGNsdWRlZCB2aWEgcHVibGlzaGVkVGVybXMoKSAtIHRoZSAyMDI2LTA4LTA4XG4gIC8vIFwiMCB0YWxrcyBjYXJkXCIgYnVnOyBzZWUgdGhhdCBoZWxwZXIncyBjb21tZW50LlxuICBmdW5jdGlvbiBsb2FkU3BlYWtlclNwb3RsaWdodCgpIHtcbiAgICB2YXIgdmlzaWJsZSA9IHB1Ymxpc2hlZFRlcm1zKHN0YXRlLnRlcm1zLnNwZWFrZXIpO1xuICAgIHN0YXRlLnNwZWFrZXJQb29sID0gdmlzaWJsZTtcbiAgICB2YXIgbmVlZEZhbGxiYWNrID0gdmlzaWJsZS5maWx0ZXIoZnVuY3Rpb24gKHRlcm0pIHsgcmV0dXJuICFTUEVBS0VSX1BIT1RPU1t0ZXJtLm5hbWVdOyB9KTtcbiAgICB2YXIgcmVxdWVzdHMgPSBuZWVkRmFsbGJhY2subWFwKGZ1bmN0aW9uICh0ZXJtKSB7XG4gICAgICB2YXIgdXJsID0gYnVpbGRMaXN0VXJsKHsgc3BlYWtlcjogdGVybS5pZCwgcGVyX3BhZ2U6IDEsIG9yZGVyYnk6IFwiZGF0ZVwiLCBvcmRlcjogXCJkZXNjXCIgfSwgSE9NRVBBR0VfQkFUQ0hfRklFTERTKTtcbiAgICAgIHJldHVybiBmZXRjaEpzb24odXJsKS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgcmV0dXJuIHsgdGVybTogdGVybSwgbGF0ZXN0OiByZXMuZGF0YS5sZW5ndGggPyBub3JtYWxpemUocmVzLmRhdGFbMF0pIDogbnVsbCB9O1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHJlcXVlc3RzKS50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICByZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgaWYgKHIubGF0ZXN0KSBzdGF0ZS5zcGVha2VyRmFsbGJhY2tQaG90b3Nbci50ZXJtLmlkXSA9IHIubGF0ZXN0LnRodW1ibmFpbFNtYWxsIHx8IHIubGF0ZXN0LnRodW1ibmFpbCB8fCBcIlwiO1xuICAgICAgfSk7XG4gICAgICBzdGF0ZS5zcGVha2VyU3BvdGxpZ2h0SHRtbCA9IHNwZWFrZXJTcG90bGlnaHRIdG1sKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyAtLS0tIENhbXAgc3BvdGxpZ2h0IChjb25maWcgbGlzdCwgZmlsdGVyZWQgdG8gY2FtcHMgd2l0aCBjb250ZW50KSAtLS0tLS1cbiAgLy8gT25seSBjYW1wcyB3aXRoIGF0IGxlYXN0IG9uZSBQVUJMSVNIRUQgdGFsayByZW5kZXIgKEpvaG4ncyBjYWxsXG4gIC8vIDIwMjYtMDgtMDkpIC0gdGhlIGNhbXAgdGVybSdzIG93biBgY291bnRgIGNhbid0IGFuc3dlciB0aGlzIGJlY2F1c2UgdGhlXG4gIC8vIGBjYW1wYCB0YXhvbm9teSBpcyBzaGFyZWQgd2l0aCB0aGUgaW5kLXNwZWFrZXIvZWxlY3RpdmUgcG9zdCB0eXBlcywgc29cbiAgLy8gaXRzIGNvdW50cyBpbmNsdWRlIG5vbi10YWxrIHBvc3RzIChUaGUgSXNsYW5kIGNvdW50cyAxMiB3aXRoIHplcm9cbiAgLy8gdGFsa3MpLiBJbnN0ZWFkOiBvbmUgdGlueSBleGlzdGVuY2UgcHJvYmUgcGVyIENPTkZJR1VSRUQgY2FtcFxuICAvLyAocGVyX3BhZ2U9MSwgYF9maWVsZHM9aWRgLCBubyBfZW1iZWQpIC0gYm91bmRlZCBieSB0aGUgY29uZmlnIGxpc3Qnc1xuICAvLyBsZW5ndGgsIGNhY2hlZCBzZXJ2ZXItc2lkZSBsaWtlIGV2ZXJ5IG90aGVyIHBlci10ZXJtIHF1ZXJ5LlxuICBmdW5jdGlvbiBjYW1wQ2FyZEh0bWwoYykge1xuICAgIHJldHVybiAoXG4gICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0dGEtY2FtcC1jYXJkXCIgZGF0YS1jYW1wPVwiJyArIGVzY2FwZUh0bWwoYy5uYW1lKSArICdcIiBzdHlsZT1cImJhY2tncm91bmQ6JyArIGMuY29sb3IgKyAnXCI+JyArXG4gICAgICAgICc8aW1nIHNyYz1cIicgKyBlc2NhcGVIdG1sKGMubG9nbykgKyAnXCIgYWx0PVwiXCI+JyArXG4gICAgICAgICc8aDM+JyArIGVzY2FwZUh0bWwoYy5uYW1lKSArICc8L2gzPicgK1xuICAgICAgJzwvYnV0dG9uPidcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9hZENhbXBTcG90bGlnaHQoKSB7XG4gICAgdmFyIHJlcXVlc3RzID0gQ0FNUF9TUE9UTElHSFQubWFwKGZ1bmN0aW9uIChjKSB7XG4gICAgICB2YXIgdGVybSA9IHJlc29sdmVDYW1wVGVybShjLm5hbWUpO1xuICAgICAgaWYgKCF0ZXJtKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOyAvLyBubyBXUCB0ZXJtIGF0IGFsbCB5ZXQgLSBkZWZpbml0ZWx5IG5vIHRhbGtzXG4gICAgICB2YXIgdXJsID0gYnVpbGRMaXN0VXJsKHsgY2FtcDogdGVybS5pZCwgcGVyX3BhZ2U6IDEgfSwgXCJpZFwiKTtcbiAgICAgIHJldHVybiBmZXRjaEpzb24odXJsKS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5kYXRhLmxlbmd0aCA/IGMgOiBudWxsO1xuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYzsgLy8gZW5oYW5jZW1lbnQsIG5vdCBnYXRlOiBhbiBlcnJvcmVkIHByb2JlIGtlZXBzIHRoZSBjYXJkICh0aGUgcHJlLTIwMjYtMDgtMDkgYmVoYXZpb3IpIHJhdGhlciB0aGFuIGhpZGluZyBhIGNhbXAgdGhhdCBtYXkgaGF2ZSBjb250ZW50XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocmVxdWVzdHMpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgIHZhciBjYXJkcyA9IHJlc3VsdHMuZmlsdGVyKEJvb2xlYW4pLm1hcChjYW1wQ2FyZEh0bWwpLmpvaW4oXCJcIik7XG4gICAgICBzdGF0ZS5jYW1wU3BvdGxpZ2h0SHRtbCA9IGNhcmRzXG4gICAgICAgID8gJzxzZWN0aW9uIGNsYXNzPVwidHRhLWNhbXAtc2VjdGlvblwiPjxoMj5Ccm93c2UgYnkgQ2FtcDwvaDI+PGRpdiBjbGFzcz1cInR0YS1jYW1wLWdyaWRcIj4nICsgY2FyZHMgKyAnPC9kaXY+PC9zZWN0aW9uPidcbiAgICAgICAgOiBcIlwiO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLS0tLSBTcGVha2VyIGxhbmRpbmcgKDIwMjYtMDgtMDksIEpvaG4ncyBhc2s6IGJpb3MpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBBIHNwZWFrZXItb25seSBmaWx0ZXIgc3RhdGUgKGNoaXAgY2xpY2sgb3IgZHJvcGRvd24pIHJlbmRlcnMgYSBoZWFkZXJcbiAgLy8gY2FyZCBhYm92ZSB0aGF0IHNwZWFrZXIncyB0YWxrczogcGhvdG8sIG5hbWUsIHRhbGsgY291bnQsIGFuZCAtIG9uY2VcbiAgLy8gSm9obiB3cml0ZXMgdGhlbSAtIGEgYmlvLiBCaW9zIGxpdmUgaW4gdGhlIHNwZWFrZXIgdGVybSdzIG5hdGl2ZSBXUFxuICAvLyBkZXNjcmlwdGlvbiBmaWVsZCAoZWRpdCBhdCB3cC1hZG1pbiAtPiBUYWxrcyAtPiBTcGVha2VycyksIGFscmVhZHkgcGFydFxuICAvLyBvZiB0aGUgdGVybSBmZXRjaCAoc2VlIGZldGNoVGVybXMpLCBzbyB0aGlzIGNvc3RzIHplcm8gcmVxdWVzdHMgYW5kIG5vXG4gIC8vIHNjaGVtYSB3b3JrLiBBbiBlbXB0eSBkZXNjcmlwdGlvbiBzaW1wbHkgcmVuZGVycyBubyBiaW8gcGFyYWdyYXBoIC1cbiAgLy8gbmV2ZXIgcGxhY2Vob2xkZXIgdGV4dC5cbiAgZnVuY3Rpb24gaXNTcGVha2VyTGFuZGluZ1N0YXRlKCkge1xuICAgIHJldHVybiAhIXN0YXRlLmZpbHRlcmVkU3BlYWtlcklkICYmICFzdGF0ZS5maWx0ZXJlZENhbXBJZCAmJiAhc3RhdGUuZmlsdGVyZWRTZXJpZXNJZCAmJlxuICAgICAgIXN0YXRlLmZpbHRlcmVkVG9waWNJZCAmJiAhc3RhdGUuc2VhcmNoICYmIHN0YXRlLnNvcnQgPT09IFwibmV3ZXN0XCI7XG4gIH1cblxuICBmdW5jdGlvbiBzcGVha2VyTGFuZGluZ0h0bWwoKSB7XG4gICAgdmFyIHRlcm0gPSB0ZXJtQnlJZChzdGF0ZS50ZXJtcy5zcGVha2VyLCBwYXJzZUludChzdGF0ZS5maWx0ZXJlZFNwZWFrZXJJZCwgMTApKTtcbiAgICBpZiAoIXRlcm0pIHJldHVybiBcIlwiO1xuICAgIHZhciBwaG90b1VybCA9IFNQRUFLRVJfUEhPVE9TW3Rlcm0ubmFtZV0gfHwgc3RhdGUuc3BlYWtlckZhbGxiYWNrUGhvdG9zW3Rlcm0uaWRdIHx8IFwiXCI7XG4gICAgdmFyIGF2YXRhciA9IHBob3RvVXJsID8gJzxpbWcgc3JjPVwiJyArIGVzY2FwZUh0bWwocGhvdG9VcmwpICsgJ1wiIGFsdD1cIlwiIGxvYWRpbmc9XCJsYXp5XCI+JyA6IFwiXCI7XG4gICAgdmFyIGJpbyA9ICh0ZXJtLmRlc2NyaXB0aW9uIHx8IFwiXCIpLnRyaW0oKTtcbiAgICB2YXIgYmlvSHRtbCA9IGJpb1xuICAgICAgPyBiaW8uc3BsaXQoL1xcbisvKS5tYXAoZnVuY3Rpb24gKHApIHsgcmV0dXJuICc8cCBjbGFzcz1cInR0YS1zcGVha2VyLWhlcm8tYmlvXCI+JyArIGVzY2FwZUh0bWwocCkgKyAnPC9wPic7IH0pLmpvaW4oXCJcIilcbiAgICAgIDogXCJcIjtcbiAgICByZXR1cm4gKFxuICAgICAgJzxzZWN0aW9uIGNsYXNzPVwidHRhLXNwZWFrZXItaGVyb1wiPicgK1xuICAgICAgICAnPGRpdiBjbGFzcz1cInR0YS1zcGVha2VyLWhlcm8tYXZhdGFyXCI+JyArIGF2YXRhciArICc8L2Rpdj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJ0dGEtc3BlYWtlci1oZXJvLWJvZHlcIj4nICtcbiAgICAgICAgICAnPGgyPicgKyBlc2NhcGVIdG1sKHRlcm0ubmFtZSkgKyAnPC9oMj4nICtcbiAgICAgICAgICAnPHAgY2xhc3M9XCJ0dGEtc3BlYWtlci1oZXJvLW1ldGFcIj4nICsgdGVybS5jb3VudCArICh0ZXJtLmNvdW50ID09PSAxID8gXCIgdGFsa1wiIDogXCIgdGFsa3NcIikgKyAnPC9wPicgK1xuICAgICAgICAgIGJpb0h0bWwgK1xuICAgICAgICAnPC9kaXY+JyArXG4gICAgICAnPC9zZWN0aW9uPidcbiAgICApO1xuICB9XG5cbiAgLy8gLS0tLSBDYW1wIGxhbmRpbmcgKDIwMjYtMDgtMDkpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBBIGNhbXAtb25seSBmaWx0ZXIgc3RhdGUgKGNhbXAgY2hvc2VuLCBub3RoaW5nIGVsc2UpIGlzIGEgbGFuZGluZyBwYWdlLFxuICAvLyBub3QganVzdCBhIGZpbHRlcmVkIGdyaWQ6IHRoYXQgY2FtcCdzIG93biBzZXJpZXMgcm93cyArIHNwZWFrZXIgY2hpcHNcbiAgLy8gcmVuZGVyIGFib3ZlIHRoZSBjYW1wLXNjb3BlZCBBbGwgVGFsa3MgZ3JpZC4gTWVjaGFuaXNtOiBvbmUgdHJpbW1lZFxuICAvLyBwcm9iZSBmZXRjaCAoaWQsc2VyaWVzLHNwZWFrZXIgLSBubyBfZW1iZWQsIG5vIEFDRiBmaWVsZHMpIG9mIHRoZVxuICAvLyBjYW1wJ3MgbmV3ZXN0IENBTVBfUFJPQkVfU0laRSB0YWxrcyBkaXNjb3ZlcnMgd2hpY2ggc2VyaWVzL3NwZWFrZXJzXG4gIC8vIGJlbG9uZyB0byB0aGUgY2FtcCwgdGhlbiB1cCB0byBTRVJJRVNfUk9XU19TSE9XTiBjYW1wLXNjb3BlZCBwZXItc2VyaWVzXG4gIC8vIGZldGNoZXMgYnVpbGQgdGhlIHJvd3MgKGRhaWx5IHJvdGF0aW9uIHdoZW4gdGhlIGNhbXAgaGFzIG1vcmUpLiBTcGVha2VyXG4gIC8vIGNoaXBzIGNvc3QgemVybyBmdXJ0aGVyIHJlcXVlc3RzICh0ZXJtIG5hbWVzIGFscmVhZHkgbG9hZGVkLCBwaG90b3NcbiAgLy8gZnJvbSBTUEVBS0VSX1BIT1RPUykuIDEgKyB1cCB0byA0IHJlcXVlc3RzIHBlciBjYW1wIHZpZXcsIGFsbCBjb3ZlcmVkXG4gIC8vIGJ5IHRoZSBzZXJ2ZXItc2lkZSByZXNwb25zZSBjYWNoZS5cbiAgZnVuY3Rpb24gaXNDYW1wTGFuZGluZ1N0YXRlKCkge1xuICAgIHJldHVybiAhIXN0YXRlLmZpbHRlcmVkQ2FtcElkICYmICFzdGF0ZS5maWx0ZXJlZFNwZWFrZXJJZCAmJiAhc3RhdGUuZmlsdGVyZWRTZXJpZXNJZCAmJlxuICAgICAgIXN0YXRlLmZpbHRlcmVkVG9waWNJZCAmJiAhc3RhdGUuc2VhcmNoICYmIHN0YXRlLnNvcnQgPT09IFwibmV3ZXN0XCI7XG4gIH1cblxuICBmdW5jdGlvbiBlbnN1cmVDYW1wTGFuZGluZygpIHtcbiAgICB2YXIgY2FtcElkID0gc3RhdGUuZmlsdGVyZWRDYW1wSWQ7XG4gICAgaWYgKFN0cmluZyhzdGF0ZS5jYW1wTGFuZGluZy5jYW1wSWQpID09PSBTdHJpbmcoY2FtcElkKSAmJiAoc3RhdGUuY2FtcExhbmRpbmcubG9hZGVkIHx8IHN0YXRlLmNhbXBMYW5kaW5nLmxvYWRpbmcpKSByZXR1cm47XG4gICAgbG9hZENhbXBMYW5kaW5nKGNhbXBJZCk7XG4gIH1cblxuICBmdW5jdGlvbiBsb2FkQ2FtcExhbmRpbmcoY2FtcElkKSB7XG4gICAgdmFyIHRva2VuID0gKytzdGF0ZS5jYW1wTGFuZGluZy50b2tlbjtcbiAgICBzdGF0ZS5jYW1wTGFuZGluZy5jYW1wSWQgPSBjYW1wSWQ7XG4gICAgc3RhdGUuY2FtcExhbmRpbmcubG9hZGluZyA9IHRydWU7XG4gICAgc3RhdGUuY2FtcExhbmRpbmcubG9hZGVkID0gZmFsc2U7XG4gICAgc3RhdGUuY2FtcExhbmRpbmcuc2VyaWVzSHRtbCA9IFwiXCI7XG4gICAgc3RhdGUuY2FtcExhbmRpbmcuc3BlYWtlcnNIdG1sID0gXCJcIjtcbiAgICAvLyBQcm9iZSByZXN1bHRzIGFyZSByYXcgdGVybS1JRCByb3dzIC0gZGVsaWJlcmF0ZWx5IE5PVCBub3JtYWxpemUoKWQ6XG4gICAgLy8gdGhleSBjYXJyeSBubyB0aXRsZS9BQ0YvZW1iZWQgZmllbGRzLCBhbmQgbm9ybWFsaXplKCkgd291bGQgd3JpdGVcbiAgICAvLyBqdW5rIHBhcnRpYWwgZW50cmllcyBpbnRvIGVudHJ5Q2FjaGUuXG4gICAgdmFyIHByb2JlVXJsID0gYnVpbGRMaXN0VXJsKHsgY2FtcDogY2FtcElkLCBwZXJfcGFnZTogQ0FNUF9QUk9CRV9TSVpFLCBvcmRlcmJ5OiBcImRhdGVcIiwgb3JkZXI6IFwiZGVzY1wiIH0sIFwiaWQsc2VyaWVzLHNwZWFrZXJcIik7XG4gICAgZmV0Y2hKc29uKHByb2JlVXJsKS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIGlmICh0b2tlbiAhPT0gc3RhdGUuY2FtcExhbmRpbmcudG9rZW4pIHJldHVybjtcbiAgICAgIHZhciBzZXJpZXNJZHMgPSBbXSwgc3BlYWtlcklkcyA9IFtdLCBzZWVuU2VyaWVzID0ge30sIHNlZW5TcGVha2VycyA9IHt9O1xuICAgICAgcmVzLmRhdGEuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAodC5zZXJpZXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7IGlmICghc2VlblNlcmllc1tpZF0pIHsgc2VlblNlcmllc1tpZF0gPSB0cnVlOyBzZXJpZXNJZHMucHVzaChpZCk7IH0gfSk7XG4gICAgICAgICh0LnNwZWFrZXIgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7IGlmICghc2VlblNwZWFrZXJzW2lkXSkgeyBzZWVuU3BlYWtlcnNbaWRdID0gdHJ1ZTsgc3BlYWtlcklkcy5wdXNoKGlkKTsgfSB9KTtcbiAgICAgIH0pO1xuICAgICAgdmFyIHNlcmllc1Rlcm1zID0gc2VyaWVzSWRzLm1hcChmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIHRlcm1CeUlkKHN0YXRlLnRlcm1zLnNlcmllcywgaWQpOyB9KS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICB2YXIgY2hvc2VuID0gcm90YXRpb25QaWNrKHNlcmllc1Rlcm1zLCBTRVJJRVNfUk9XU19TSE9XTik7XG4gICAgICB2YXIgcm93UmVxdWVzdHMgPSBjaG9zZW4ubWFwKGZ1bmN0aW9uICh0ZXJtKSB7XG4gICAgICAgIC8vIGNhbXAgcGFyYW0ga2VlcHMgZWFjaCByb3cgc2NvcGVkIHRvIFRISVMgY2FtcCdzIHRhbGtzIGluIHRoZVxuICAgICAgICAvLyBzZXJpZXMsIGFuZCBcIlNlZSBhbGxcIiBzdGF5cyBjb25zaXN0ZW50OiB0aGUgc2VyaWVzIGZpbHRlciBpdFxuICAgICAgICAvLyBhcHBsaWVzIGNvbWJpbmVzIHdpdGggdGhlIHN0aWxsLWFjdGl2ZSBjYW1wIGZpbHRlciBpbiB0aGUgZ3JpZC5cbiAgICAgICAgdmFyIHVybCA9IGJ1aWxkTGlzdFVybCh7IHNlcmllczogdGVybS5pZCwgY2FtcDogY2FtcElkLCBwZXJfcGFnZTogNCwgb3JkZXJieTogXCJkYXRlXCIsIG9yZGVyOiBcImRlc2NcIiB9LCBIT01FUEFHRV9CQVRDSF9GSUVMRFMpO1xuICAgICAgICByZXR1cm4gZmV0Y2hKc29uKHVybCkudGhlbihmdW5jdGlvbiAocikge1xuICAgICAgICAgIHJldHVybiB7IHRlcm06IHRlcm0sIHRhbGtzOiByLmRhdGEubWFwKG5vcm1hbGl6ZSkgfTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChyb3dSZXF1ZXN0cykudGhlbihmdW5jdGlvbiAocm93cykge1xuICAgICAgICBpZiAodG9rZW4gIT09IHN0YXRlLmNhbXBMYW5kaW5nLnRva2VuKSByZXR1cm47XG4gICAgICAgIHZhciByb3dzSHRtbCA9IHJvd3MubWFwKGZ1bmN0aW9uIChyb3cpIHsgcmV0dXJuIHNlcmllc1Jvd1NlY3Rpb25IdG1sKHJvdy50ZXJtLCByb3cudGFsa3MpOyB9KS5qb2luKFwiXCIpO1xuICAgICAgICBzdGF0ZS5jYW1wTGFuZGluZy5zZXJpZXNIdG1sID0gcm93c0h0bWxcbiAgICAgICAgICA/ICc8aDIgY2xhc3M9XCJ0dGEtc2VjdGlvbi1oZWFkaW5nXCI+JyArIChzZXJpZXNUZXJtcy5sZW5ndGggPiBjaG9zZW4ubGVuZ3RoID8gXCJGZWF0dXJlZCBTZXJpZXNcIiA6IFwiU2VyaWVzXCIpICsgJzwvaDI+JyArIHJvd3NIdG1sXG4gICAgICAgICAgOiBcIlwiO1xuICAgICAgICB2YXIgc3BlYWtlclRlcm1zID0gc3BlYWtlcklkc1xuICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGlkKSB7IHJldHVybiB0ZXJtQnlJZChzdGF0ZS50ZXJtcy5zcGVha2VyLCBpZCk7IH0pXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHQpIHsgcmV0dXJuIHQuY291bnQgPiAwOyB9KTtcbiAgICAgICAgc3RhdGUuY2FtcExhbmRpbmcuc3BlYWtlcnNIdG1sID0gc3BlYWtlclRlcm1zLmxlbmd0aFxuICAgICAgICAgID8gJzxzZWN0aW9uIGNsYXNzPVwidHRhLXNwZWFrZXItc2VjdGlvblwiPjxoMj5TcGVha2VyczwvaDI+PGRpdiBjbGFzcz1cInR0YS1zcGVha2VyLWdyaWRcIj4nICtcbiAgICAgICAgICAgICAgc3BlYWtlclRlcm1zLm1hcChmdW5jdGlvbiAodGVybSkgeyByZXR1cm4gc3BlYWtlckNoaXBIdG1sKHRlcm0sIGZhbHNlKTsgfSkuam9pbihcIlwiKSArXG4gICAgICAgICAgICAnPC9kaXY+PC9zZWN0aW9uPidcbiAgICAgICAgICA6IFwiXCI7XG4gICAgICAgIHN0YXRlLmNhbXBMYW5kaW5nLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUuY2FtcExhbmRpbmcubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgcmVuZGVyR3JpZERvbSgpO1xuICAgICAgfSk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKHRva2VuICE9PSBzdGF0ZS5jYW1wTGFuZGluZy50b2tlbikgcmV0dXJuO1xuICAgICAgY29uc29sZS5lcnJvcihcIlRoZSBUYWtlYXdheTogY2FtcCBsYW5kaW5nIHNlY3Rpb25zIGZhaWxlZCB0byBsb2FkXCIsIGVycik7XG4gICAgICAvLyBSZWxlYXNlIHRoZSBwbGFjZWhvbGRlciBzcGFjZSBhbmQgZmFsbCBiYWNrIHRvIHRoZSBwbGFpbiBmaWx0ZXJlZFxuICAgICAgLy8gZ3JpZCAtIHRoZSBsYW5kaW5nIHNlY3Rpb25zIGFyZSBlbmhhbmNlbWVudCwgbmV2ZXIgYSBnYXRlLlxuICAgICAgc3RhdGUuY2FtcExhbmRpbmcubG9hZGluZyA9IGZhbHNlO1xuICAgICAgc3RhdGUuY2FtcExhbmRpbmcubG9hZGVkID0gdHJ1ZTtcbiAgICAgIHJlbmRlckdyaWREb20oKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC0tLS0gR3JpZCByZW5kZXJpbmcgKHNlcnZlci1wYWdpbmF0ZWQsIG9yIGNsaWVudC1wYWdpbmF0ZWQgd2hpbGUgYVxuICAvLyBzZWFyY2ggaXMgYWN0aXZlIC0gc2VlIHJ1blNlYXJjaCgpKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgZnVuY3Rpb24gY2FyZEh0bWwoZW50cnkpIHtcbiAgICB2YXIgdGh1bWIgPSBlbnRyeS50aHVtYm5haWxcbiAgICAgID8gJzxpbWcgc3JjPVwiJyArIGVzY2FwZUh0bWwoZW50cnkudGh1bWJuYWlsKSArICdcIiBhbHQ9XCJcIiBsb2FkaW5nPVwibGF6eVwiPidcbiAgICAgIDogXCJcIjtcbiAgICByZXR1cm4gKFxuICAgICAgJzxhIGNsYXNzPVwidHRhLWNhcmRcIiBocmVmPVwiJyArIGVzY2FwZUh0bWwoZW50cnkubGluayB8fCBcIiNcIikgKyAnXCIgZGF0YS1pZD1cIicgKyBlbnRyeS5pZCArICdcIj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJ0dGEtY2FyZC10aHVtYlwiPicgKyB0aHVtYiArICc8ZGl2IGNsYXNzPVwidHRhLXBsYXktYmFkZ2VcIj48c3Bhbj48L3NwYW4+PC9kaXY+PC9kaXY+JyArXG4gICAgICAgICc8ZGl2IGNsYXNzPVwidHRhLWNhcmQtYm9keVwiPicgK1xuICAgICAgICAgIChlbnRyeS5zZXJpZXMgPyAnPHNwYW4gY2xhc3M9XCJ0dGEtdGFnIHR0YS10YWctLXNlcmllc1wiPicgKyBlc2NhcGVIdG1sKGVudHJ5LnNlcmllcykgKyAnPC9zcGFuPicgOiBcIlwiKSArXG4gICAgICAgICAgJzxoMyBjbGFzcz1cInR0YS1jYXJkLXRpdGxlXCI+JyArIGVzY2FwZUh0bWwoZW50cnkudGl0bGUpICsgJzwvaDM+JyArXG4gICAgICAgICAgKGVudHJ5LmV4Y2VycHQgPyAnPHAgY2xhc3M9XCJ0dGEtY2FyZC1leGNlcnB0XCI+JyArIGVzY2FwZUh0bWwoZW50cnkuZXhjZXJwdCkgKyAnPC9wPicgOiBcIlwiKSArXG4gICAgICAgICAgJzxwIGNsYXNzPVwidHRhLWNhcmQtc3BlYWtlclwiPicgKyBlc2NhcGVIdG1sKGVudHJ5LnNwZWFrZXIpICsgKGVudHJ5LmRhdGUgPyBcIiAmbWlkZG90OyBcIiArIGVzY2FwZUh0bWwoZW50cnkuZGF0ZSkgOiBcIlwiKSArIChlbnRyeS5jYW1wID8gXCIgJm1pZGRvdDsgXCIgKyBlc2NhcGVIdG1sKGVudHJ5LmNhbXApIDogXCJcIikgKyAnPC9wPicgK1xuICAgICAgICAgIChlbnRyeS50b3BpY3MubGVuZ3RoXG4gICAgICAgICAgICA/ICc8cCBjbGFzcz1cInR0YS1jYXJkLXRvcGljc1wiPicgKyBlbnRyeS50b3BpY3MubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz1cInR0YS10b3BpYy1waWxsXCI+JyArIGVzY2FwZUh0bWwodCkgKyAnPC9zcGFuPic7XG4gICAgICAgICAgICAgIH0pLmpvaW4oXCJcIikgKyAnPC9wPidcbiAgICAgICAgICAgIDogXCJcIikgK1xuICAgICAgICAgICc8c3BhbiBjbGFzcz1cInR0YS13YXRjaC1saW5rXCI+V2F0Y2ggJnJhcnI7PC9zcGFuPicgK1xuICAgICAgICAnPC9kaXY+JyArXG4gICAgICAnPC9hPidcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gY3VycmVudEdyaWRJdGVtcygpIHtcbiAgICByZXR1cm4gc3RhdGUuc2VhcmNoID8gKHN0YXRlLmdyaWQuc2VhcmNoSXRlbXMgfHwgW10pLnNsaWNlKDAsIHN0YXRlLmdyaWQudmlzaWJsZUNvdW50KSA6IHN0YXRlLmdyaWQuaXRlbXM7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNNb3JlR3JpZEl0ZW1zKCkge1xuICAgIGlmIChzdGF0ZS5zZWFyY2gpIHJldHVybiAoc3RhdGUuZ3JpZC5zZWFyY2hJdGVtcyB8fCBbXSkubGVuZ3RoID4gc3RhdGUuZ3JpZC52aXNpYmxlQ291bnQ7XG4gICAgcmV0dXJuIHN0YXRlLmdyaWQucGFnZSA8IHN0YXRlLmdyaWQudG90YWxQYWdlcztcbiAgfVxuXG4gIC8vIENMUyBndWFyZCAoMjAyNi0wOC0wOCBVWCBwYXNzKTogc2VyaWVzIHJvd3MgKyBzcGVha2VyIHNwb3RsaWdodCByZXNvbHZlXG4gIC8vIEFGVEVSIHRoZSBncmlkICh0aGVpciBwZXItdGVybSBmYW4tb3V0IGlzIHNsb3dlciB0aGFuIHRoZSBncmlkJ3Mgc2luZ2xlXG4gIC8vIHBhZ2UtMSBmZXRjaCwgYnkgZGVzaWduIC0gc2VlIGluaXQoKSkuIFRoZXkgaW5qZWN0IEFCT1ZFIFwiQWxsIFRhbGtzXCIsIHNvXG4gIC8vIHdpdGhvdXQgcmVzZXJ2ZWQgc3BhY2UgdGhlIGdyaWQgYSB2aXNpdG9yIG1heSBhbHJlYWR5IGJlIHJlYWRpbmcganVtcHNcbiAgLy8gZG93biBieSBodW5kcmVkcyBvZiBwaXhlbHMgd2hlbiB0aGV5IGxhbmQuIFRlcm0gY291bnRzIGFyZSBrbm93biB1cFxuICAvLyBmcm9udCAobG9hZEFsbFRlcm1zIHJlc29sdmVzIGJlZm9yZSBhbnkgb2YgdGhpcyByZW5kZXJzKSwgc28gcmVzZXJ2ZSBhblxuICAvLyBlc3RpbWF0ZSBvZiB0aGUgZmluYWwgaGVpZ2h0IHBlciBzZWN0aW9uIGFuZCByZWxlYXNlIGl0IHdoZW4gdGhlIHJlYWxcbiAgLy8gY29udGVudCBsYW5kcyAob3IgZmFpbHMpLiBBbiBlc3RpbWF0ZSBpcyBlbm91Z2g6IHRoZSBzaGlmdCBzaHJpbmtzIGZyb21cbiAgLy8gXCJlbnRpcmUgc2VjdGlvbnNcIiB0byBhIGZldyBkb3plbiBwaXhlbHMuXG4gIGZ1bmN0aW9uIGhvbWVwYWdlUGxhY2Vob2xkZXJzKHNlcmllc0VsLCBzcG90bGlnaHRFbCwgY2FtcEVsKSB7XG4gICAgdmFyIHBlbmRpbmdIb21lID0gaXNEZWZhdWx0RmlsdGVyU3RhdGUoKSAmJiAhc3RhdGUuaG9tZXBhZ2VTZWN0aW9uc0xvYWRlZDtcbiAgICB2YXIgcGVuZGluZ0NhbXAgPSBpc0NhbXBMYW5kaW5nU3RhdGUoKSAmJiAhc3RhdGUuY2FtcExhbmRpbmcubG9hZGVkO1xuICAgIC8vIENhbXAgc3BvdGxpZ2h0IGJlY2FtZSBhc3luYyAyMDI2LTA4LTA5IChwZXItY2FtcCBleGlzdGVuY2UgcHJvYmVzKSAtXG4gICAgLy8gcmVzZXJ2ZSBvbmUgY2FyZCByb3cncyBoZWlnaHQgdW50aWwgaXQgbGFuZHMsIHNhbWUgQ0xTIGNvbnZlbnRpb24uXG4gICAgaWYgKGNhbXBFbCkge1xuICAgICAgaWYgKHBlbmRpbmdIb21lKSB7XG4gICAgICAgIGNhbXBFbC5jbGFzc05hbWUgPSBcInR0YS1zZWN0aW9uLXNrZWxldG9uXCI7XG4gICAgICAgIGNhbXBFbC5zdHlsZS5taW5IZWlnaHQgPSBcIjI0MHB4XCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYW1wRWwuY2xhc3NOYW1lID0gXCJcIjtcbiAgICAgICAgY2FtcEVsLnN0eWxlLm1pbkhlaWdodCA9IFwiXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwZW5kaW5nSG9tZSkge1xuICAgICAgLy8gRXN0aW1hdGVzIHRyYWNrIHRoZSBDVVJBVEVEIHNlY3Rpb24gc2l6ZXMgKDIwMjYtMDgtMDkpOiB1cCB0b1xuICAgICAgLy8gU0VSSUVTX1JPV1NfU0hPV04gcm93cyBwbHVzIHRoZSBkaXJlY3RvcnkncyB0aWxlIGdyaWQsIGFuZCB0aGVcbiAgICAgIC8vIGNvbGxhcHNlZCBjaGlwIGNvdW50IG9uY2UgdGhlIHJvc3RlciBwYXNzZXMgdGhlIHRocmVzaG9sZC5cbiAgICAgIHZhciBzZXJpZXNQb29sID0gcHVibGlzaGVkVGVybXMoc3RhdGUudGVybXMuc2VyaWVzKTtcbiAgICAgIHZhciByb3dDb3VudCA9IE1hdGgubWluKHNlcmllc1Bvb2wubGVuZ3RoLCBTRVJJRVNfUk9XU19TSE9XTik7XG4gICAgICB2YXIgZGlyUm93cyA9IHNlcmllc1Bvb2wubGVuZ3RoID4gcm93Q291bnQgPyBNYXRoLmNlaWwoc2VyaWVzUG9vbC5sZW5ndGggLyA0KSA6IDA7XG4gICAgICBzZXJpZXNFbC5jbGFzc05hbWUgPSBcInR0YS1zZWN0aW9uLXNrZWxldG9uXCI7XG4gICAgICBzZXJpZXNFbC5zdHlsZS5taW5IZWlnaHQgPSAocm93Q291bnQgKiAzMzAgKyAoZGlyUm93cyA/IGRpclJvd3MgKiA3MCArIDYwIDogMCkpICsgXCJweFwiO1xuICAgICAgdmFyIHNwZWFrZXJQb29sID0gcHVibGlzaGVkVGVybXMoc3RhdGUudGVybXMuc3BlYWtlcik7XG4gICAgICB2YXIgY2hpcENvdW50ID0gc3BlYWtlclBvb2wubGVuZ3RoID4gU1BFQUtFUl9DT0xMQVBTRV9USFJFU0hPTEQgPyBTUEVBS0VSX0NISVBTX1NIT1dOIDogc3BlYWtlclBvb2wubGVuZ3RoO1xuICAgICAgc3BvdGxpZ2h0RWwuY2xhc3NOYW1lID0gXCJ0dGEtc2VjdGlvbi1za2VsZXRvblwiO1xuICAgICAgc3BvdGxpZ2h0RWwuc3R5bGUubWluSGVpZ2h0ID0gKE1hdGguY2VpbChjaGlwQ291bnQgLyA0KSAqIDEwMCArIDYwKSArIFwicHhcIjtcbiAgICB9IGVsc2UgaWYgKHBlbmRpbmdDYW1wKSB7XG4gICAgICAvLyBDYW1wIHNlcmllcy9zcGVha2VyIGNvdW50cyBhcmVuJ3Qga25vd2FibGUgYmVmb3JlIHRoZSBwcm9iZVxuICAgICAgLy8gcmVzb2x2ZXMgLSByZXNlcnZlIGEgbW9kZXN0IGZpeGVkIGVzdGltYXRlOyB0aGUgY29udmVudGlvbiBvbmx5XG4gICAgICAvLyBuZWVkcyB0aGUgc2hpZnQgdG8gc2hyaW5rIHRvIGEgZmV3IGRvemVuIHBpeGVscywgbm90IHRvIGJlIGV4YWN0LlxuICAgICAgc2VyaWVzRWwuY2xhc3NOYW1lID0gXCJ0dGEtc2VjdGlvbi1za2VsZXRvblwiO1xuICAgICAgc2VyaWVzRWwuc3R5bGUubWluSGVpZ2h0ID0gXCI2NjBweFwiO1xuICAgICAgc3BvdGxpZ2h0RWwuY2xhc3NOYW1lID0gXCJ0dGEtc2VjdGlvbi1za2VsZXRvblwiO1xuICAgICAgc3BvdGxpZ2h0RWwuc3R5bGUubWluSGVpZ2h0ID0gXCIxNjBweFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXJpZXNFbC5jbGFzc05hbWUgPSBcIlwiO1xuICAgICAgc2VyaWVzRWwuc3R5bGUubWluSGVpZ2h0ID0gXCJcIjtcbiAgICAgIHNwb3RsaWdodEVsLmNsYXNzTmFtZSA9IFwiXCI7XG4gICAgICBzcG90bGlnaHRFbC5zdHlsZS5taW5IZWlnaHQgPSBcIlwiO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlckdyaWREb20oKSB7XG4gICAgLy8gRGVyaXZlZCBvbiBldmVyeSByZW5kZXIsIHNhbWUgZGVjbGFyYXRpdmUgcGF0dGVybiBhcyB0aGUgZmVhdHVyZWQvXG4gICAgLy8gc2VyaWVzL3Nwb3RsaWdodCBzZWN0aW9ucyBiZWxvdyAtIHRoZSBicmVhZGNydW1iIHdhcyB0aGUgb25lXG4gICAgLy8gaW1wZXJhdGl2ZSBob2xkb3V0ICh1cGRhdGVkIG9ubHkgdmlhIGFwcGx5RmlsdGVyQ2hhbmdlKSwgd2hpY2ggbGV0IGl0XG4gICAgLy8gZ28gc3RhbGUgb24gcmVuZGVycyB0aGF0IGRvbid0IHBhc3MgdGhyb3VnaCBhIGZpbHRlciBjaGFuZ2UgKDIwMjYtMDgtMDkpLlxuICAgIHVwZGF0ZUZpbHRlckJyZWFkY3J1bWIoKTtcbiAgICB2YXIgY291bnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidHRhLXJlc3VsdC1jb3VudFwiKTtcbiAgICB2YXIgZW1wdHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1lbXB0eVwiKTtcbiAgICB2YXIgZ3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidHRhLWdyaWRcIik7XG4gICAgdmFyIGxvYWRNb3JlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1sb2FkLW1vcmVcIik7XG4gICAgdmFyIHNlcmllc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0dGEtc2VyaWVzLXJvd3NcIik7XG4gICAgdmFyIHNwb3RsaWdodEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0dGEtc3BlYWtlci1zcG90bGlnaHRcIik7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1mZWF0dXJlZFwiKS5pbm5lckhUTUwgPSAoaXNEZWZhdWx0RmlsdGVyU3RhdGUoKSAmJiBzdGF0ZS5mZWF0dXJlZCkgPyBmZWF0dXJlZEh0bWwoc3RhdGUuZmVhdHVyZWQpIDogXCJcIjtcbiAgICBpZiAoaXNEZWZhdWx0RmlsdGVyU3RhdGUoKSkge1xuICAgICAgc2VyaWVzRWwuaW5uZXJIVE1MID0gc3RhdGUuc2VyaWVzUm93c0h0bWw7XG4gICAgICBzcG90bGlnaHRFbC5pbm5lckhUTUwgPSBzdGF0ZS5zcGVha2VyU3BvdGxpZ2h0SHRtbDtcbiAgICB9IGVsc2UgaWYgKGlzQ2FtcExhbmRpbmdTdGF0ZSgpICYmIFN0cmluZyhzdGF0ZS5jYW1wTGFuZGluZy5jYW1wSWQpID09PSBTdHJpbmcoc3RhdGUuZmlsdGVyZWRDYW1wSWQpICYmIHN0YXRlLmNhbXBMYW5kaW5nLmxvYWRlZCkge1xuICAgICAgc2VyaWVzRWwuaW5uZXJIVE1MID0gc3RhdGUuY2FtcExhbmRpbmcuc2VyaWVzSHRtbDtcbiAgICAgIHNwb3RsaWdodEVsLmlubmVySFRNTCA9IHN0YXRlLmNhbXBMYW5kaW5nLnNwZWFrZXJzSHRtbDtcbiAgICB9IGVsc2UgaWYgKGlzU3BlYWtlckxhbmRpbmdTdGF0ZSgpKSB7XG4gICAgICAvLyBTeW5jaHJvbm91cyAtIGJ1aWx0IGVudGlyZWx5IGZyb20gdGhlIGFscmVhZHktbG9hZGVkIHRlcm0gbGlzdCwgc29cbiAgICAgIC8vIG5vIHBsYWNlaG9sZGVyL3NrZWxldG9uIGRhbmNlIGlzIG5lZWRlZC5cbiAgICAgIHNlcmllc0VsLmlubmVySFRNTCA9IHNwZWFrZXJMYW5kaW5nSHRtbCgpO1xuICAgICAgc3BvdGxpZ2h0RWwuaW5uZXJIVE1MID0gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VyaWVzRWwuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgIHNwb3RsaWdodEVsLmlubmVySFRNTCA9IFwiXCI7XG4gICAgfVxuICAgIHZhciBjYW1wRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1jYW1wLXNwb3RsaWdodFwiKTtcbiAgICBjYW1wRWwuaW5uZXJIVE1MID0gaXNEZWZhdWx0RmlsdGVyU3RhdGUoKSA/IHN0YXRlLmNhbXBTcG90bGlnaHRIdG1sIDogXCJcIjtcbiAgICBob21lcGFnZVBsYWNlaG9sZGVycyhzZXJpZXNFbCwgc3BvdGxpZ2h0RWwsIGNhbXBFbCk7XG5cbiAgICBpZiAoc3RhdGUuZ3JpZC5sb2FkaW5nKSB7XG4gICAgICBncmlkLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICBsb2FkTW9yZUVsLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICBjb3VudEVsLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICAgIGVtcHR5LnRleHRDb250ZW50ID0gXCJMb2FkaW5nIHRhbGtzXHUyMDI2XCI7XG4gICAgICBlbXB0eS5oaWRkZW4gPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaXRlbXMgPSBjdXJyZW50R3JpZEl0ZW1zKCk7XG4gICAgdmFyIHRvdGFsID0gc3RhdGUuc2VhcmNoID8gKHN0YXRlLmdyaWQuc2VhcmNoSXRlbXMgfHwgW10pLmxlbmd0aCA6IHN0YXRlLmdyaWQudG90YWw7XG5cbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgZ3JpZC5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgbG9hZE1vcmVFbC5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgY291bnRFbC50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgICAvLyBBIGZhaWxlZCBmZXRjaCBtdXN0IG5ldmVyIHJlbmRlciBhcyB0aGUgbWlzbGVhZGluZyBcIm5vIHRhbGtzIG1hdGNoXG4gICAgICAvLyB0aG9zZSBmaWx0ZXJzXCIgdGV4dCAoMjAyNi0wOC0wOCBVWCBwYXNzKSAtIGFuZCB0aGUgb2xkIGJlaGF2aW9yIG9mXG4gICAgICAvLyBsZWF2aW5nIFwiTG9hZGluZyB0YWxrc1x1MjAyNlwiIHVwIGZvcmV2ZXIgbmV4dCB0byB0aGUgZXJyb3Igc3RhdHVzIHdhc1xuICAgICAgLy8gd29yc2UuIHN0YXRlLmdyaWQuZXJyb3IgaXMgc2V0IGJ5IHRoZSBmZXRjaCBjYXRjaCBoYW5kbGVycy5cbiAgICAgIGVtcHR5LnRleHRDb250ZW50ID0gc3RhdGUuZ3JpZC5lcnJvclxuICAgICAgICA/IHN0YXRlLmdyaWQuZXJyb3JcbiAgICAgICAgOiAoaXNEZWZhdWx0RmlsdGVyU3RhdGUoKSA/IFwiTm8gdGFsa3MgcHVibGlzaGVkIHlldC4gQ2hlY2sgYmFjayBzb29uLlwiIDogXCJObyB0YWxrcyBtYXRjaCB0aG9zZSBmaWx0ZXJzIHlldCAtIHRyeSBjbGVhcmluZyBvbmUuXCIpO1xuICAgICAgZW1wdHkuaGlkZGVuID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZW1wdHkuaGlkZGVuID0gdHJ1ZTtcbiAgICBjb3VudEVsLnRleHRDb250ZW50ID0gdG90YWwgKyAodG90YWwgPT09IDEgPyBcIiB0YWxrXCIgOiBcIiB0YWxrc1wiKTtcbiAgICBncmlkLmlubmVySFRNTCA9IGl0ZW1zLm1hcChjYXJkSHRtbCkuam9pbihcIlwiKTtcblxuICAgIGxvYWRNb3JlRWwuaW5uZXJIVE1MID0gaGFzTW9yZUdyaWRJdGVtcygpXG4gICAgICA/ICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInR0YS1sb2FkbW9yZS1idG5cIiBpZD1cInR0YS1sb2FkbW9yZS1idG5cIicgKyAoc3RhdGUuZ3JpZC5hcHBlbmRMb2FkaW5nID8gXCIgZGlzYWJsZWRcIiA6IFwiXCIpICsgJz4nICsgKHN0YXRlLmdyaWQuYXBwZW5kTG9hZGluZyA/IFwiTG9hZGluZ1x1MjAyNlwiIDogXCJMb2FkIE1vcmUgVGFsa3NcIikgKyAnPC9idXR0b24+J1xuICAgICAgOiBcIlwiO1xuICAgIHZhciBsb2FkTW9yZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidHRhLWxvYWRtb3JlLWJ0blwiKTtcbiAgICBpZiAobG9hZE1vcmVCdG4pIGxvYWRNb3JlQnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVMb2FkTW9yZSk7XG4gIH1cblxuICAvLyBGb2N1cyByZXBhaXIgKDIwMjYtMDgtMDggVVggcGFzcyk6IHJlbmRlckdyaWREb20oKSByZWJ1aWxkcyB0aGUgZ3JpZCBhbmRcbiAgLy8gdGhlIExvYWQgTW9yZSBidXR0b24gdmlhIGlubmVySFRNTCwgd2hpY2ggc2lsZW50bHkgZHJvcHMga2V5Ym9hcmQgZm9jdXNcbiAgLy8gdG8gPGJvZHk+LiBBZnRlciBhbiBhcHBlbmQsIG1vdmUgZm9jdXMgdG8gdGhlIGZpcnN0IG5ld2x5LWFkZGVkIGNhcmRcbiAgLy8gKHRoZXkncmUgcmVhbCBsaW5rcyBub3csIG5hdGl2ZWx5IGZvY3VzYWJsZSkgLSBrZXlib2FyZCB1c2VycyBjb250aW51ZVxuICAvLyBmcm9tIHdoZXJlIHRoZSBuZXcgY29udGVudCBzdGFydHMgaW5zdGVhZCBvZiByZXN0YXJ0aW5nIGZyb20gdGhlIHRvcC5cbiAgZnVuY3Rpb24gZm9jdXNGaXJzdE5ld0NhcmQocHJldkNvdW50KSB7XG4gICAgdmFyIGdyaWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1ncmlkXCIpO1xuICAgIGlmIChncmlkICYmIGdyaWQuY2hpbGRyZW5bcHJldkNvdW50XSkgZ3JpZC5jaGlsZHJlbltwcmV2Q291bnRdLmZvY3VzKCk7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVMb2FkTW9yZSgpIHtcbiAgICBpZiAoc3RhdGUuZ3JpZC5hcHBlbmRMb2FkaW5nKSByZXR1cm47XG4gICAgdmFyIHByZXZDb3VudCA9IGN1cnJlbnRHcmlkSXRlbXMoKS5sZW5ndGg7XG4gICAgaWYgKHN0YXRlLnNlYXJjaCkge1xuICAgICAgc3RhdGUuZ3JpZC52aXNpYmxlQ291bnQgKz0gUEFHRV9TSVpFO1xuICAgICAgcmVuZGVyR3JpZERvbSgpO1xuICAgICAgZm9jdXNGaXJzdE5ld0NhcmQocHJldkNvdW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RhdGUuZ3JpZC5hcHBlbmRMb2FkaW5nID0gdHJ1ZTtcbiAgICBsb2FkR3JpZFBhZ2Uoc3RhdGUuZ3JpZC5wYWdlICsgMSwgdHJ1ZSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBzdGF0ZS5ncmlkLmFwcGVuZExvYWRpbmcgPSBmYWxzZTtcbiAgICAgIC8vIEZvdW5kIDIwMjYtMDgtMDU6IGxvYWRHcmlkUGFnZSdzIG93biBpbnRlcm5hbCByZW5kZXIgYWxyZWFkeSByYW5cbiAgICAgIC8vIChhbmQgcGFpbnRlZCB0aGUgYnV0dG9uIGRpc2FibGVkL1wiTG9hZGluZ1x1MjAyNlwiKSBiZWZvcmUgdGhpcyBsaW5lIC1cbiAgICAgIC8vIHdpdGhvdXQgcmUtcmVuZGVyaW5nIGhlcmUgdG9vLCBhcHBlbmRMb2FkaW5nIHJlc2V0cyBpbnRlcm5hbGx5IGJ1dFxuICAgICAgLy8gdGhlIERPTSBuZXZlciByZWZsZWN0cyBpdCwgc28gdGhlIGJ1dHRvbiBzdGF5cyBwZXJtYW5lbnRseSBzdHVja1xuICAgICAgLy8gZGlzYWJsZWQgYWZ0ZXIgdGhlIHZlcnkgZmlyc3Qgc3VjY2Vzc2Z1bCBcIkxvYWQgTW9yZVwiLlxuICAgICAgcmVuZGVyR3JpZERvbSgpO1xuICAgICAgZm9jdXNGaXJzdE5ld0NhcmQocHJldkNvdW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdyaWRRdWVyeVBhcmFtcyhwYWdlTnVtKSB7XG4gICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgIHBlcl9wYWdlOiBQQUdFX1NJWkUsXG4gICAgICBwYWdlOiBwYWdlTnVtLFxuICAgICAgb3JkZXJieTogXCJkYXRlXCIsXG4gICAgICBvcmRlcjogc3RhdGUuc29ydCA9PT0gXCJuZXdlc3RcIiA/IFwiZGVzY1wiIDogXCJhc2NcIixcbiAgICAgIGNhbXA6IHN0YXRlLmZpbHRlcmVkQ2FtcElkIHx8IHVuZGVmaW5lZCxcbiAgICAgIHNlcmllczogc3RhdGUuZmlsdGVyZWRTZXJpZXNJZCB8fCB1bmRlZmluZWQsXG4gICAgICB0b3BpY3M6IHN0YXRlLmZpbHRlcmVkVG9waWNJZCB8fCB1bmRlZmluZWQsXG4gICAgICBzcGVha2VyOiBzdGF0ZS5maWx0ZXJlZFNwZWFrZXJJZCB8fCB1bmRlZmluZWRcbiAgICB9O1xuICAgIC8vIEV4Y2x1ZGUgdGhlIGdsb2JhbGx5LWZlYXR1cmVkIHRhbGsgZnJvbSBFVkVSWSBwYWdlIG9mIHRoZSBkZWZhdWx0XG4gICAgLy8gdmlldyAobm90IGp1c3QgcGFnZSAxKSBzbyBpdCBpc24ndCBzaG93biB0d2ljZSAob25jZSBhcyBGZWF0dXJlZCxcbiAgICAvLyBvbmNlIGluIHRoZSBncmlkKS4gRm91bmQgYW5kIGZpeGVkIDIwMjYtMDgtMDU6IGFwcGx5aW5nIHRoaXMgb25seSB0b1xuICAgIC8vIHBhZ2UgMSBicmVha3MgdGhlIHBhZ2UtdG8tcmFuayBtYXBwaW5nIGZvciBldmVyeSBsYXRlciBwYWdlIC0gcGFnZSAxXG4gICAgLy8gKDI5LWl0ZW0gZmlsdGVyZWQgc2V0KSB3b3VsZCByZXR1cm4gcmFua3MgMi03IG9mIHRoZSB0cnVlIG9yZGVyLFxuICAgIC8vIHdoaWxlIGFuIHVuLWV4Y2x1ZGVkIHBhZ2UgMiByZXR1cm5zIHJhbmtzIDctMTIsIGR1cGxpY2F0aW5nIHJhbmsgNy5cbiAgICAvLyBFeGNsdWRpbmcgb24gZXZlcnkgcGFnZSBrZWVwcyBldmVyeSBwYWdlIGNvbnNpc3RlbnRseSBzY29wZWQgdG8gdGhlXG4gICAgLy8gc2FtZSAyOS1pdGVtIHNldCwgc28gcmFua3MvcGFnZXMvdG90YWxzIG5ldmVyIGRpc2FncmVlIHdpdGggZWFjaFxuICAgIC8vIG90aGVyLlxuICAgIGlmIChpc0RlZmF1bHRGaWx0ZXJTdGF0ZSgpICYmIHN0YXRlLmZlYXR1cmVkKSB7XG4gICAgICBwYXJhbXMuZXhjbHVkZSA9IHN0YXRlLmZlYXR1cmVkLmlkO1xuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9hZEdyaWRQYWdlKHBhZ2VOdW0sIGFwcGVuZCkge1xuICAgIC8vIFJhY2UgZ3VhcmQgKDIwMjYtMDgtMDggVVggcGFzcyk6IGNhcHR1cmUgYSB0b2tlbiBub3c7IG9ubHkgdGhlIG5ld2VzdFxuICAgIC8vIGluLWZsaWdodCByZXF1ZXN0IG1heSBjb21taXQgcmVzdWx0cy4gV2l0aG91dCB0aGlzLCBhIHNsb3cgcmVzcG9uc2VcbiAgICAvLyBmb3IgYW4gQUJBTkRPTkVEIGZpbHRlciBzdGF0ZSBjb3VsZCBsYW5kIGFmdGVyIHRoZSBjdXJyZW50IG9uZSBhbmRcbiAgICAvLyBvdmVyd3JpdGUgdGhlIHZpc2libGUgZ3JpZCB3aXRoIHJlc3VsdHMgdGhhdCBkb24ndCBtYXRjaCB0aGVcbiAgICAvLyBkcm9wZG93bnMuIFRoZSAzMDBtcyBzZWFyY2ggZGVib3VuY2UgbmFycm93cyBidXQgbmV2ZXIgY2xvc2VkIHRoaXMuXG4gICAgdmFyIHRva2VuID0gKytzdGF0ZS5ncmlkLnJlcXVlc3RUb2tlbjtcbiAgICBzdGF0ZS5ncmlkLmxvYWRpbmcgPSAhYXBwZW5kO1xuICAgIHN0YXRlLmdyaWQuZXJyb3IgPSBcIlwiO1xuICAgIHJlbmRlckdyaWREb20oKTtcbiAgICB2YXIgcGFyYW1zID0gZ3JpZFF1ZXJ5UGFyYW1zKHBhZ2VOdW0pO1xuICAgIHZhciBleGNsdWRlZEZlYXR1cmVkID0gISFwYXJhbXMuZXhjbHVkZTtcbiAgICB2YXIgdXJsID0gYnVpbGRMaXN0VXJsKHBhcmFtcyk7XG4gICAgcmV0dXJuIGZldGNoSnNvbih1cmwpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgaWYgKHRva2VuICE9PSBzdGF0ZS5ncmlkLnJlcXVlc3RUb2tlbikgcmV0dXJuOyAvLyBzdXBlcnNlZGVkIC0gZHJvcCBzaWxlbnRseVxuICAgICAgdmFyIGl0ZW1zID0gcmVzLmRhdGEubWFwKG5vcm1hbGl6ZSk7XG4gICAgICBzdGF0ZS5ncmlkLnBhZ2UgPSBwYWdlTnVtO1xuICAgICAgc3RhdGUuZ3JpZC50b3RhbFBhZ2VzID0gcmVzLnRvdGFsUGFnZXM7XG4gICAgICAvLyBYLVdQLVRvdGFsIHJlZmxlY3RzIHRoZSBxdWVyeSdzIG93biBmaWx0ZXJlZCBzZXQgLSB3aGVuIHRoZVxuICAgICAgLy8gZmVhdHVyZWQgdGFsayBpcyBleGNsdWRlZCwgdGhhdCdzIDI5LCBub3QgdGhlIHRydWUgMzAuIFRoZVxuICAgICAgLy8gZmVhdHVyZWQgdGFsayBJUyBzdGlsbCBzaG93biAoYXMgRmVhdHVyZWQpLCBzbyB0aGUgdXNlci1mYWNpbmdcbiAgICAgIC8vIGNvdW50IHNob3VsZCBpbmNsdWRlIGl0IC0gYWRkIGJhY2sgZXhhY3RseSB0aGUgMSB3ZSBrbm93IHdlXG4gICAgICAvLyBleGNsdWRlZCwgcmF0aGVyIHRoYW4gYSBndWVzcy5cbiAgICAgIHN0YXRlLmdyaWQudG90YWwgPSByZXMudG90YWwgKyAoZXhjbHVkZWRGZWF0dXJlZCA/IDEgOiAwKTtcbiAgICAgIHN0YXRlLmdyaWQuaXRlbXMgPSBhcHBlbmQgPyBzdGF0ZS5ncmlkLml0ZW1zLmNvbmNhdChpdGVtcykgOiBpdGVtcztcbiAgICAgIHN0YXRlLmdyaWQubG9hZGluZyA9IGZhbHNlO1xuICAgICAgcmVuZGVyR3JpZERvbSgpO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmICh0b2tlbiAhPT0gc3RhdGUuZ3JpZC5yZXF1ZXN0VG9rZW4pIHJldHVybjsgLy8gc3VwZXJzZWRlZCAtIGEgbmV3ZXIgcmVxdWVzdCBvd25zIHRoZSBVSVxuICAgICAgY29uc29sZS5lcnJvcihcIlRoZSBUYWtlYXdheTogZmFpbGVkIHRvIGxvYWQgdGFsa3NcIiwgZXJyKTtcbiAgICAgIHN0YXRlLmdyaWQubG9hZGluZyA9IGZhbHNlO1xuICAgICAgLy8gUmUtcmVuZGVyIHNvIHRoZSBcIkxvYWRpbmcgdGFsa3NcdTIwMjZcIiBlbXB0eS1zdGF0ZSB0ZXh0IGRvZXNuJ3Qgc2l0XG4gICAgICAvLyBuZXh0IHRvIHRoZSBlcnJvciBtZXNzYWdlIGZvcmV2ZXIgKDIwMjYtMDgtMDggVVggcGFzcykgLSB3aXRoXG4gICAgICAvLyBncmlkLmVycm9yIHNldCwgcmVuZGVyR3JpZERvbSBzaG93cyB0aGUgZXJyb3IgdGV4dCB3aGVuIHRoZXJlIGFyZVxuICAgICAgLy8gbm8gaXRlbXMsIG9yIGtlZXBzIHRoZSBhbHJlYWR5LWxvYWRlZCBpdGVtcyB2aXNpYmxlIHdoZW4gdGhlcmUgYXJlLlxuICAgICAgc3RhdGUuZ3JpZC5lcnJvciA9IFwiVW5hYmxlIHRvIGxvYWQgdGFsa3MgcmlnaHQgbm93LiBQbGVhc2UgdHJ5IGFnYWluIHNob3J0bHkuXCI7XG4gICAgICByZW5kZXJHcmlkRG9tKCk7XG4gICAgICBzZXRTdGF0dXMoc3RhdGUuZ3JpZC5pdGVtcy5sZW5ndGggPyBcIlVuYWJsZSB0byBsb2FkIG1vcmUgdGFsa3MgcmlnaHQgbm93LiBQbGVhc2UgdHJ5IGFnYWluIHNob3J0bHkuXCIgOiBcIlwiKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC0tLS0gU2VhcmNoIChKb2huJ3MgY2FsbCwgMjAyNi0wOC0wNTogZnVsbCB0aXRsZSArIHNwZWFrZXIgcGFyaXR5KSAtLS0tLVxuICAvLyBXb3JkUHJlc3MncyBuYXRpdmUgP3NlYXJjaD0gb25seSBtYXRjaGVzIHRpdGxlL2NvbnRlbnQsIG5vdCB0YXhvbm9teVxuICAvLyB0ZXJtcyAtIHNwZWFrZXIgaXMgYSB0YXhvbm9teSwgbm90IHBhcnQgb2YgdGhlIHBvc3QgdGl0bGUvY29udGVudFxuICAvLyAoY29uZmlybWVkIGVtcGlyaWNhbGx5IDIwMjYtMDgtMDUgYWdhaW5zdCB0aGUgbGl2ZSB0YWxrIHBvc3QgdHlwZSwgc2VlXG4gIC8vIG9wcy90aGUtdGFrZWF3YXktcGFnaW5hdGlvbi1yZWRlc2lnbi5tZCkuIFRvIGtlZXAgXCJzZWFyY2ggYnkgc3BlYWtlciBvclxuICAvLyB0aXRsZVwiIHdvcmtpbmcsIGEgc2VhcmNoIGZldGNoZXMgQk9USCBhIHRpdGxlL2NvbnRlbnQgbWF0Y2ggYW5kICh3aGVuXG4gIC8vIHRoZSB0eXBlZCB0ZXh0IG1hdGNoZXMgYW55IHNwZWFrZXIgbmFtZSkgYSB0YXhvbm9teSBtYXRjaCwgbWVyZ2VzIGJ5IElELFxuICAvLyBhbmQgcGFnaW5hdGVzIHRoZSBtZXJnZWQgc2V0IGNsaWVudC1zaWRlIC0gdGhlIG9uZSBkZWxpYmVyYXRlIGV4Y2VwdGlvblxuICAvLyB0byByZWFsIHNlcnZlci1zaWRlIHBhZ2luYXRpb24gaW4gdGhpcyBmaWxlLCBzY29wZWQgb25seSB0byB0aGUgc2VhcmNoXG4gIC8vIGJveCBiZWluZyBub24tZW1wdHkuIEJvdW5kZWQgYnkgcGVyX3BhZ2U9MTAwIG9uIGVhY2ggYnJhbmNoIC0gaWYgYVxuICAvLyBzaW5nbGUgc2VhcmNoIG9yIGZpbHRlciBjb21iaW5hdGlvbiBldmVyIG1hdGNoZXMgbW9yZSB0aGFuIDEwMCB0YWxrcyxcbiAgLy8gb25seSB0aGUgZmlyc3QgMTAwIChwZXIgYnJhbmNoKSBhcmUgY29uc2lkZXJlZDsgd29ydGggcmV2aXNpdGluZyBpZi93aGVuXG4gIC8vIHRhbGsgY291bnQgZ3Jvd3Mgd2VsbCBwYXN0IFwiZG96ZW5zIG1vcmVcIi5cbiAgZnVuY3Rpb24gcnVuU2VhcmNoKCkge1xuICAgIHZhciB0b2tlbiA9ICsrc3RhdGUuZ3JpZC5yZXF1ZXN0VG9rZW47IC8vIHNhbWUgcmFjZSBndWFyZCBhcyBsb2FkR3JpZFBhZ2UgLSBzZWUgY29tbWVudCB0aGVyZVxuICAgIHN0YXRlLmdyaWQubG9hZGluZyA9IHRydWU7XG4gICAgc3RhdGUuZ3JpZC5lcnJvciA9IFwiXCI7XG4gICAgcmVuZGVyR3JpZERvbSgpO1xuXG4gICAgdmFyIHRleHQgPSBzdGF0ZS5zZWFyY2gudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgbWF0Y2hpbmdTcGVha2VySWRzID0gc3RhdGUudGVybXMuc3BlYWtlclxuICAgICAgLmZpbHRlcihmdW5jdGlvbiAodCkgeyByZXR1cm4gdC5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0ZXh0KSAhPT0gLTE7IH0pXG4gICAgICAubWFwKGZ1bmN0aW9uICh0KSB7IHJldHVybiB0LmlkOyB9KTtcblxuICAgIHZhciBiYXNlRmlsdGVycyA9IHtcbiAgICAgIHBlcl9wYWdlOiAxMDAsXG4gICAgICBjYW1wOiBzdGF0ZS5maWx0ZXJlZENhbXBJZCB8fCB1bmRlZmluZWQsXG4gICAgICBzZXJpZXM6IHN0YXRlLmZpbHRlcmVkU2VyaWVzSWQgfHwgdW5kZWZpbmVkLFxuICAgICAgdG9waWNzOiBzdGF0ZS5maWx0ZXJlZFRvcGljSWQgfHwgdW5kZWZpbmVkLFxuICAgICAgb3JkZXJieTogXCJkYXRlXCIsXG4gICAgICBvcmRlcjogc3RhdGUuc29ydCA9PT0gXCJuZXdlc3RcIiA/IFwiZGVzY1wiIDogXCJhc2NcIlxuICAgIH07XG4gICAgZnVuY3Rpb24gd2l0aEV4dHJhKGV4dHJhKSB7XG4gICAgICB2YXIgbWVyZ2VkID0ge307XG4gICAgICBmb3IgKHZhciBrIGluIGJhc2VGaWx0ZXJzKSBtZXJnZWRba10gPSBiYXNlRmlsdGVyc1trXTtcbiAgICAgIGZvciAodmFyIGsyIGluIGV4dHJhKSBtZXJnZWRbazJdID0gZXh0cmFbazJdO1xuICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICB9XG5cbiAgICB2YXIgcmVxdWVzdHMgPSBbXTtcbiAgICBpZiAoc3RhdGUuZmlsdGVyZWRTcGVha2VySWQpIHtcbiAgICAgIC8vIFNwZWFrZXIgZmlsdGVyIGFscmVhZHkgZXhwbGljaXRseSBjaG9zZW4gLSBhIG5vcm1hbCBBTkQgd2l0aFxuICAgICAgLy8gc2VhcmNoLCBvbmUgcXVlcnksIG5vIE9SLW1lcmdlIG5lZWRlZC5cbiAgICAgIHJlcXVlc3RzLnB1c2goZmV0Y2hKc29uKGJ1aWxkTGlzdFVybCh3aXRoRXh0cmEoeyBzcGVha2VyOiBzdGF0ZS5maWx0ZXJlZFNwZWFrZXJJZCwgc2VhcmNoOiBzdGF0ZS5zZWFyY2ggfSkpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVlc3RzLnB1c2goZmV0Y2hKc29uKGJ1aWxkTGlzdFVybCh3aXRoRXh0cmEoeyBzZWFyY2g6IHN0YXRlLnNlYXJjaCB9KSkpKTtcbiAgICAgIGlmIChtYXRjaGluZ1NwZWFrZXJJZHMubGVuZ3RoKSB7XG4gICAgICAgIHJlcXVlc3RzLnB1c2goZmV0Y2hKc29uKGJ1aWxkTGlzdFVybCh3aXRoRXh0cmEoeyBzcGVha2VyOiBtYXRjaGluZ1NwZWFrZXJJZHMgfSkpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHJlcXVlc3RzKS50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICBpZiAodG9rZW4gIT09IHN0YXRlLmdyaWQucmVxdWVzdFRva2VuKSByZXR1cm47IC8vIHN1cGVyc2VkZWQgLSBkcm9wIHNpbGVudGx5XG4gICAgICB2YXIgc2VlbiA9IHt9O1xuICAgICAgdmFyIG1lcmdlZCA9IFtdO1xuICAgICAgcmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgcmVzLmRhdGEubWFwKG5vcm1hbGl6ZSkuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICBpZiAoIXNlZW5bZW50cnkuaWRdKSB7IHNlZW5bZW50cnkuaWRdID0gdHJ1ZTsgbWVyZ2VkLnB1c2goZW50cnkpOyB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBtZXJnZWQuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gc3RhdGUuc29ydCA9PT0gXCJuZXdlc3RcIiA/IGIuZGF0ZU1zIC0gYS5kYXRlTXMgOiBhLmRhdGVNcyAtIGIuZGF0ZU1zOyB9KTtcbiAgICAgIHN0YXRlLmdyaWQuc2VhcmNoSXRlbXMgPSBtZXJnZWQ7XG4gICAgICBzdGF0ZS5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHJlbmRlckdyaWREb20oKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAodG9rZW4gIT09IHN0YXRlLmdyaWQucmVxdWVzdFRva2VuKSByZXR1cm47IC8vIHN1cGVyc2VkZWQgLSBhIG5ld2VyIHJlcXVlc3Qgb3ducyB0aGUgVUlcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJUaGUgVGFrZWF3YXk6IHNlYXJjaCBmYWlsZWRcIiwgZXJyKTtcbiAgICAgIHN0YXRlLmdyaWQubG9hZGluZyA9IGZhbHNlO1xuICAgICAgc3RhdGUuZ3JpZC5lcnJvciA9IFwiU2VhcmNoIGZhaWxlZCAtIHBsZWFzZSB0cnkgYWdhaW4uXCI7XG4gICAgICByZW5kZXJHcmlkRG9tKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyAtLS0tIERldGFpbCB2aWV3IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBCb3RoIHNoYXJlIGFjdGlvbnMgdXNlIHRoZSB0YWxrJ3MgcmVhbCBwZXJtYWxpbmsgKGVudHJ5LmxpbmssIG5vdyB0aGF0XG4gIC8vIGNhbXBzLndvbC5vcmcvdGFsay88c2x1Zz4vIHJlbmRlcnMgdGhlIGZ1bGwgZGV0YWlsIHZpZXcgaXRzZWxmIC0gc2VlXG4gIC8vIGluaXRTaW5nbGUoKSBiZWxvdyksIG5vdCB3aW5kb3cubG9jYXRpb24uaHJlZiAtIHRoZSBodWIgcmVuZGVycyBldmVyeVxuICAvLyBkZXRhaWwgdmlldyBhcyBhbiBpbi1wYWdlIHN3YXAgd2l0aG91dCBldmVyIGNoYW5naW5nIHRoZSBVUkwgYmFyLCBzb1xuICAvLyB3aW5kb3cubG9jYXRpb24uaHJlZiB3YXMgYWx3YXlzIGp1c3QgdGhlIGJhc2UgaHViIFVSTCByZWdhcmRsZXNzIG9mXG4gIC8vIHdoaWNoIHRhbGsgd2FzIG9wZW4uIEZhbGxzIGJhY2sgdG8gd2luZG93LmxvY2F0aW9uLmhyZWYgb25seSBpZiBhIHRhbGtcbiAgLy8gc29tZWhvdyBoYXMgbm8gcmVhbCBsaW5rIChzaG91bGRuJ3QgaGFwcGVuIGZvciBhIHB1Ymxpc2hlZCBwb3N0KS5cbiAgZnVuY3Rpb24gY29weUxpbmsoKSB7XG4gICAgdmFyIGVudHJ5ID0gc3RhdGUuZW50cnlDYWNoZVtzdGF0ZS5jdXJyZW50SWRdO1xuICAgIHZhciB1cmwgPSAoZW50cnkgJiYgZW50cnkubGluaykgfHwgd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgdmFyIG5vdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1zaGFyZS1ub3RlXCIpO1xuICAgIHZhciBkb25lID0gZnVuY3Rpb24gKCkgeyBpZiAobm90ZSkgeyBub3RlLnRleHRDb250ZW50ID0gXCJMaW5rIGNvcGllZCFcIjsgbm90ZS5oaWRkZW4gPSBmYWxzZTsgfSB9O1xuICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7XG4gICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh1cmwpLnRoZW4oZG9uZSkuY2F0Y2goZG9uZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvbmUoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlbWFpbFNoYXJlSHJlZihlbnRyeSkge1xuICAgIHZhciB1cmwgPSBlbnRyeS5saW5rIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIHZhciBzdWJqZWN0ID0gXCJDaGVjayBvdXQgdGhpcyB0YWxrOiBcIiArIGVudHJ5LnRpdGxlO1xuICAgIHZhciBib2R5ID0gXCJJIHRob3VnaHQgeW91J2Qgd2FudCB0byBoZWFyIHRoaXM6IFwiICsgZW50cnkudGl0bGUgKyBcIlxcblwiICsgdXJsO1xuICAgIHJldHVybiBcIm1haWx0bzo/c3ViamVjdD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChzdWJqZWN0KSArIFwiJmJvZHk9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoYm9keSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZXRhaWxIdG1sKGVudHJ5KSB7XG4gICAgdmFyIGVtYmVkVXJsID0gdG9FbWJlZFVybChlbnRyeS52aWRlb1VybCk7XG4gICAgLy8gQ2xpY2stdG8tcGxheSBmYWNhZGUgaW5zdGVhZCBvZiBhbiBpbW1lZGlhdGVseS1sb2FkZWQgaWZyYW1lOiBzaG93c1xuICAgIC8vIG91ciBvd24gYWxyZWFkeS11cGxvYWRlZCB0aHVtYm5haWwgKG5vdCBWaW1lbydzIC0gdmlkZW9zIHNldCB0b1xuICAgIC8vIFZpbWVvJ3MgXCJkaXNhYmxlXCIgcHJpdmFjeSB2aWV3LCByZXF1aXJlZCBmb3IgZG9tYWluLXJlc3RyaWN0ZWRcbiAgICAvLyBlbWJlZGRpbmcgdG8gYWN0dWFsbHkgd29yaywgZG9uJ3QgZXhwb3NlIGEgcG9zdGVyIGltYWdlIHZpYSBhbnlcbiAgICAvLyBwdWJsaWMgQVBJLCBjb25maXJtZWQgMjAyNi0wOC0wNSB2aWEgb0VtYmVkIHJldHVybmluZyBub1xuICAgIC8vIHRodW1ibmFpbF91cmwgYXQgYWxsIGZvciB0aGF0IHByaXZhY3kgbGV2ZWwpIHdpdGggYSBwbGF5IGJhZGdlXG4gICAgLy8gb3ZlcmxheTsgdGhlIHJlYWwgaWZyYW1lIGlzIG9ubHkgY3JlYXRlZCBvbiBjbGljay4gQWxzbyBtZWFucyB0aGVcbiAgICAvLyBwYWdlIG5ldmVyIGxvYWRzIFZpbWVvJ3MgcGxheWVyIEpTL2Fzc2V0cyBmb3IgdmlkZW9zIG5vYm9keSBwcmVzc2VzXG4gICAgLy8gcGxheSBvbi5cbiAgICB2YXIgZmFjYWRlSW1nID0gZW50cnkudGh1bWJuYWlsTGFyZ2UgfHwgZW50cnkudGh1bWJuYWlsO1xuICAgIHZhciB2aWRlb0Jsb2NrID0gZW1iZWRVcmxcbiAgICAgID8gKFxuICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInR0YS12aWRlby1mYWNhZGVcIiBpZD1cInR0YS12aWRlby1mYWNhZGVcIiBkYXRhLWVtYmVkLXNyYz1cIicgKyBlc2NhcGVIdG1sKGVtYmVkVXJsKSArICdcIiBhcmlhLWxhYmVsPVwiUGxheSB2aWRlb1wiPicgK1xuICAgICAgICAgICAgKGZhY2FkZUltZyA/ICc8aW1nIHNyYz1cIicgKyBlc2NhcGVIdG1sKGZhY2FkZUltZykgKyAnXCIgYWx0PVwiXCIgbG9hZGluZz1cImxhenlcIj4nIDogXCJcIikgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ0dGEtcGxheS1iYWRnZSB0dGEtcGxheS1iYWRnZS0tbGdcIj48c3Bhbj48L3NwYW4+PC9kaXY+JyArXG4gICAgICAgICAgJzwvYnV0dG9uPidcbiAgICAgICAgKVxuICAgICAgOiAoZW50cnkudmlkZW9VcmxcbiAgICAgICAgICA/ICc8YSBjbGFzcz1cInR0YS12aWRlby1taXNzaW5nXCIgaHJlZj1cIicgKyBlc2NhcGVIdG1sKGVudHJ5LnZpZGVvVXJsKSArICdcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiPldhdGNoIHRoZSB2aWRlbyAmcmFycjs8L2E+J1xuICAgICAgICAgIDogJzxkaXYgY2xhc3M9XCJ0dGEtdmlkZW8tbWlzc2luZ1wiPlZpZGVvIGNvbWluZyBzb29uPC9kaXY+Jyk7XG5cbiAgICAvLyBcIlN0dWR5IE5vdGVzXCIgYXMgYSBidWxsZXQgbGlzdCBmcm9tIHRoZSByZWFsIG91dGxpbmUgZmllbGQsIHBsdXMgYVxuICAgIC8vIHBsYWluLCB1bmdhdGVkIFBERiBkb3dubG9hZCAtIHRoZSBEZXNpZ24gRm91bmRhdGlvbiBkb2MncyBcImdhdGVkIGJ5XG4gICAgLy8gZW1haWxcIiBkZWNpc2lvbiBuZWVkcyBhIFBhcmRvdC9Gb3Jtc3RhY2sgYmFja2VuZCB0aGF0IGRvZXNuJ3QgZXhpc3RcbiAgICAvLyB5ZXQsIHNvIHRoaXMgc3RheXMgb3BlbiByYXRoZXIgdGhhbiBmYWtpbmcgYW4gZW1haWwgY2FwdHVyZS5cbiAgICB2YXIgbm90ZXNMaXN0QmxvY2sgPSBlbnRyeS5vdXRsaW5lXG4gICAgICA/ICc8ZGl2IGNsYXNzPVwidHRhLXNlY3Rpb24tdGl0bGVcIj5TdHVkeSBOb3RlczwvZGl2Pjx1bCBjbGFzcz1cInR0YS1ub3Rlcy1saXN0XCI+JyArXG4gICAgICAgICAgZW50cnkub3V0bGluZS5zcGxpdChcIlxcblwiKS5maWx0ZXIoZnVuY3Rpb24gKGwpIHsgcmV0dXJuIGwudHJpbSgpOyB9KS5tYXAoZnVuY3Rpb24gKGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnPGxpPicgKyBlc2NhcGVIdG1sKGwudHJpbSgpKSArICc8L2xpPic7XG4gICAgICAgICAgfSkuam9pbihcIlwiKSArXG4gICAgICAgICc8L3VsPidcbiAgICAgIDogXCJcIjtcblxuICAgIHZhciBzdHVkeU5vdGVzTGluayA9IGVudHJ5LnN0dWR5Tm90ZXNQZGZVcmxcbiAgICAgID8gJzxhIGNsYXNzPVwidHRhLXBpbGxidG5cIiBocmVmPVwiJyArIGVzY2FwZUh0bWwoZW50cnkuc3R1ZHlOb3Rlc1BkZlVybCkgKyAnXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXJcIj5Eb3dubG9hZCBTdHVkeSBOb3RlczwvYT4nXG4gICAgICA6IFwiXCI7XG5cbiAgICB2YXIgcXVvdGVzQmxvY2sgPSBlbnRyeS5xdW90ZXMubGVuZ3RoXG4gICAgICA/ICc8ZGl2IGNsYXNzPVwidHRhLXNlY3Rpb24tdGl0bGVcIj5RdW90ZXM8L2Rpdj4nICsgZW50cnkucXVvdGVzLm1hcChmdW5jdGlvbiAocSkge1xuICAgICAgICAgIHJldHVybiAnPHAgY2xhc3M9XCJ0dGEtcXVvdGVcIj4mbGRxdW87JyArIGVzY2FwZUh0bWwocSkgKyAnJnJkcXVvOzwvcD4nO1xuICAgICAgICB9KS5qb2luKFwiXCIpXG4gICAgICA6IFwiXCI7XG5cbiAgICAvLyBGdWxsIHRleHQgb24tcGFnZSwgY29sbGFwc2libGUvZXhwYW5kYWJsZSwgY3Jhd2xhYmxlIGluIEhUTUwgLSBwZXIgdGhlXG4gICAgLy8gRGVzaWduIEZvdW5kYXRpb24gZG9jJ3MgbG9ja2VkIHRyYW5zY3JpcHQtZGlzcGxheSBkZWNpc2lvbi4gVGhlIGJvZHlcbiAgICAvLyBpcyBhbHdheXMgcmVuZGVyZWQgc3RydWN0dXJhbGx5IChub3QgY29uZGl0aW9uYWwgb24gdHJhbnNjcmlwdFRleHRcbiAgICAvLyBiZWluZyBwcmVzZW50KSBiZWNhdXNlIHRoZSBsaXN0IGZldGNoIGRlbGliZXJhdGVseSBubyBsb25nZXIgaW5jbHVkZXNcbiAgICAvLyBpdCAtIHNlZSBMSVNUX0ZJRUxEUy4gVGhlIGFjdHVhbCB0ZXh0IGxvYWRzIG9uIGRlbWFuZCwgb25seSBpZiBhXG4gICAgLy8gdmlzaXRvciBleHBhbmRzIHRoaXMgdG9nZ2xlLCB2aWEgdGhlIGNsaWNrIGhhbmRsZXIgaW4gc2hvd0RldGFpbCgpLlxuICAgIHZhciB0cmFuc2NyaXB0QmxvY2sgPVxuICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidHRhLXRyYW5zY3JpcHQtdG9nZ2xlXCIgaWQ9XCJ0dGEtdHJhbnNjcmlwdC10b2dnbGVcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBhcmlhLWNvbnRyb2xzPVwidHRhLXRyYW5zY3JpcHQtYm9keVwiPicgK1xuICAgICAgICAnPHNwYW4gY2xhc3M9XCJ0dGEtc2VjdGlvbi10aXRsZVwiIHN0eWxlPVwibWFyZ2luOjI0cHggMCAwO1wiPkZ1bGwgVHJhbnNjcmlwdDwvc3Bhbj4nICtcbiAgICAgICAgJzxzcGFuIGNsYXNzPVwidHRhLXRyYW5zY3JpcHQtdG9nZ2xlLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj4rPC9zcGFuPicgK1xuICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgJzxkaXYgY2xhc3M9XCJ0dGEtdHJhbnNjcmlwdC1ib2R5XCIgaWQ9XCJ0dGEtdHJhbnNjcmlwdC1ib2R5XCIgaGlkZGVuPjwvZGl2Pic7XG5cbiAgICAvLyBRdW90ZSBncmFwaGljcyAmIGNsaXAgLSBib3RoIGN1cnJlbnRseSBlbXB0eSBmb3IgZXZlcnkgcmVhbCB0YWxrXG4gICAgLy8gKG5vIENhbnZhLXJlbmRlcmVkIGdyYXBoaWNzIG9yIGhpZ2hsaWdodCBjbGlwcyBleGlzdCB5ZXQpLCBzbyB0aGlzXG4gICAgLy8gc2VjdGlvbiBzaW1wbHkgZG9lc24ndCByZW5kZXIgdG9kYXkuIExlZnQgd2lyZWQgdXAgZm9yIHdoZW4gdGhhdFxuICAgIC8vIGNvbnRlbnQgZXhpc3RzIHJhdGhlciB0aGFuIGZha2luZyBwbGFjZWhvbGRlcnMgbm93LlxuICAgIHZhciBxdW90ZUNhcmRzSHRtbCA9IGVudHJ5LnF1b3RlR3JhcGhpY3MubWFwKGZ1bmN0aW9uIChpbWdVcmwsIGkpIHtcbiAgICAgIHZhciB0ZXh0ID0gZW50cnkucXVvdGVzW2ldIHx8IGVudHJ5LnF1b3Rlc1swXSB8fCBcIlwiO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJ0dGEtcXVvdGVjYXJkXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWltYWdlOnVybCgmcXVvdDsnICsgZXNjYXBlSHRtbChpbWdVcmwpICsgJyZxdW90OylcIj4nICtcbiAgICAgICAgICAnPGRpdiBjbGFzcz1cInR0YS1xdW90ZWNhcmQtdGludFwiPjwvZGl2PicgK1xuICAgICAgICAgICc8cD4mbGRxdW87JyArIGVzY2FwZUh0bWwodGV4dCkgKyAnJnJkcXVvOzwvcD4nICtcbiAgICAgICAgJzwvZGl2PidcbiAgICAgICk7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgICB2YXIgY2xpcENhcmRIdG1sID0gZW50cnkuY2xpcFZpZGVvVXJsXG4gICAgICA/ICc8YSBjbGFzcz1cInR0YS1jbGlwY2FyZFwiIGhyZWY9XCInICsgZXNjYXBlSHRtbChlbnRyeS5jbGlwVmlkZW9VcmwpICsgJ1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCI+PGRpdiBjbGFzcz1cInR0YS1wbGF5LWJhZGdlXCI+PHNwYW4+PC9zcGFuPjwvZGl2PjwvYT4nXG4gICAgICA6IFwiXCI7XG4gICAgdmFyIHF1b3RlQ2xpcHNCbG9jayA9IChxdW90ZUNhcmRzSHRtbCB8fCBjbGlwQ2FyZEh0bWwpXG4gICAgICA/ICc8c2VjdGlvbiBjbGFzcz1cInR0YS1kZXRhaWwtc2VjdGlvblwiPjxoMiBjbGFzcz1cInR0YS1oM1wiPlF1b3RlIEdyYXBoaWNzICZhbXA7IENsaXBzPC9oMj48ZGl2IGNsYXNzPVwidHRhLXF1b3RlY2xpcC1ncmlkXCI+JyArIHF1b3RlQ2FyZHNIdG1sICsgY2xpcENhcmRIdG1sICsgJzwvZGl2Pjwvc2VjdGlvbj4nXG4gICAgICA6IFwiXCI7XG5cbiAgICAvLyBSZWxhdGVkIFRhbGtzIGlzIG5vdyBhIGRlZGljYXRlZCBmZXRjaCAobG9hZFJlbGF0ZWRUYWxrcygpLCBjYWxsZWRcbiAgICAvLyBmcm9tIHNob3dEZXRhaWwoKSBiZWxvdykgcmF0aGVyIHRoYW4gYSBmaWx0ZXIgb3ZlciBhbiBpbi1tZW1vcnkgZnVsbFxuICAgIC8vIGxpc3QgLSB0aGlzIHBsYWNlaG9sZGVyIGp1c3QgcmVzZXJ2ZXMgdGhlIHNwb3Q7IGl0J3MgbGVmdCBlbXB0eSAobm9cbiAgICAvLyBoZWFkaW5nIGVpdGhlcikgaWYgdGhlIGZldGNoIGZpbmRzIG5vdGhpbmcsIG1hdGNoaW5nIHRoZSBvcmlnaW5hbFxuICAgIC8vIFwibm8gcmVsYXRlZCB0YWxrc1wiIGJlaGF2aW9yLlxuICAgIHZhciByZWxhdGVkUGxhY2Vob2xkZXIgPSAnPHNlY3Rpb24gY2xhc3M9XCJ0dGEtZGV0YWlsLXNlY3Rpb25cIiBpZD1cInR0YS1yZWxhdGVkLWNvbnRhaW5lclwiPjwvc2VjdGlvbj4nO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICc8ZGl2IGNsYXNzPVwidHRhLWNvbnRhaW5lciB0dGEtZGV0YWlsLWNvbnRhaW5lclwiPicgK1xuICAgICAgICAnPGRpdiBjbGFzcz1cInR0YS1icmVhZGNydW1iXCI+JyArXG4gICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwidHRhLWJhY2stYnRuXCI+VGhlIFRha2Vhd2F5PC9idXR0b24+JyArXG4gICAgICAgICAgJzxzcGFuPi88L3NwYW4+JyArXG4gICAgICAgICAgJzxzcGFuPicgKyBlc2NhcGVIdG1sKGVudHJ5LnRpdGxlKSArICc8L3NwYW4+JyArXG4gICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJ0dGEtdGFnLXJvd1wiPicgK1xuICAgICAgICAgIChlbnRyeS5jYW1wID8gJzxzcGFuIGNsYXNzPVwidHRhLXRhZyB0dGEtdGFnLS1jYW1wXCI+JyArIGVzY2FwZUh0bWwoZW50cnkuY2FtcCkgKyAnPC9zcGFuPicgOiBcIlwiKSArXG4gICAgICAgICAgKGVudHJ5LnNlcmllcyA/ICc8c3BhbiBjbGFzcz1cInR0YS10YWcgdHRhLXRhZy0tc2VyaWVzXCI+JyArIGVzY2FwZUh0bWwoZW50cnkuc2VyaWVzKSArICc8L3NwYW4+JyA6IFwiXCIpICtcbiAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAnPGgxIGlkPVwidHRhLWRldGFpbC10aXRsZVwiIHRhYmluZGV4PVwiLTFcIj4nICsgZXNjYXBlSHRtbChlbnRyeS50aXRsZSkgKyAnPC9oMT4nICtcbiAgICAgICAgJzxwIGNsYXNzPVwidHRhLWRldGFpbC1tZXRhXCI+JyArIGVzY2FwZUh0bWwoZW50cnkuc3BlYWtlcikgKyAoZW50cnkuZGF0ZSA/IFwiICZtaWRkb3Q7IFwiICsgZXNjYXBlSHRtbChlbnRyeS5kYXRlKSA6IFwiXCIpICsgKGVudHJ5LnNjcmlwdHVyZSA/IFwiICZtaWRkb3Q7IFwiICsgZXNjYXBlSHRtbChlbnRyeS5zY3JpcHR1cmUpIDogXCJcIikgKyAnPC9wPicgK1xuICAgICAgICAoZW50cnkudG9waWNzLmxlbmd0aFxuICAgICAgICAgID8gJzxwIGNsYXNzPVwidHRhLWRldGFpbC10b3BpY3NcIj4nICsgZW50cnkudG9waWNzLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwidHRhLXRvcGljLXBpbGxcIj4nICsgZXNjYXBlSHRtbCh0KSArICc8L3NwYW4+JztcbiAgICAgICAgICAgIH0pLmpvaW4oXCJcIikgKyAnPC9wPidcbiAgICAgICAgICA6IFwiXCIpICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJ0dGEtdmlkZW8td3JhcFwiPicgKyB2aWRlb0Jsb2NrICsgJzwvZGl2PicgK1xuICAgICAgICAnPGRpdiBjbGFzcz1cInR0YS1xdWljay1hY3Rpb25zXCI+JyArXG4gICAgICAgICAgJzxzcGFuIGNsYXNzPVwidHRhLWZpbHRlcnMtbGFiZWxcIj5TaGFyZTwvc3Bhbj4nICtcbiAgICAgICAgICAnPGEgY2xhc3M9XCJ0dGEtYWN0aW9uYnRuXCIgaHJlZj1cIicgKyBlbWFpbFNoYXJlSHJlZihlbnRyeSkgKyAnXCI+RW1haWw8L2E+JyArXG4gICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidHRhLWFjdGlvbmJ0blwiIGlkPVwidHRhLWNvcHktbGluay1idG5cIj5Db3B5IExpbms8L2J1dHRvbj4nICtcbiAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJ0dGEtc2hhcmUtbm90ZVwiIGlkPVwidHRhLXNoYXJlLW5vdGVcIiByb2xlPVwic3RhdHVzXCIgaGlkZGVuPjwvc3Bhbj4nICtcbiAgICAgICAgICAoc3R1ZHlOb3Rlc0xpbmsgPyAnPHNwYW4gY2xhc3M9XCJ0dGEtcXVpY2stYWN0aW9ucy1zcGFjZXJcIj48L3NwYW4+JyArIHN0dWR5Tm90ZXNMaW5rIDogXCJcIikgK1xuICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgIG5vdGVzTGlzdEJsb2NrICtcbiAgICAgICAgcXVvdGVzQmxvY2sgK1xuICAgICAgICB0cmFuc2NyaXB0QmxvY2sgK1xuICAgICAgJzwvZGl2PicgK1xuICAgICAgcXVvdGVDbGlwc0Jsb2NrICtcbiAgICAgIHJlbGF0ZWRQbGFjZWhvbGRlciArXG4gICAgICAnPHNlY3Rpb24gY2xhc3M9XCJ0dGEtbmV3c2xldHRlciB0dGEtbmV3c2xldHRlci0tZm9vdGVyXCI+JyArXG4gICAgICAgICc8aDI+U3RheSBpbiB0aGUgTG9vcDwvaDI+JyArXG4gICAgICAgICc8cD5Ta2lwIHRoZSBQREY/IEF0IGxlYXN0IGdyYWIgb3VyIG1vbnRobHkgZW1haWwgc28gdGhlIG5leHQgbWVzc2FnZSBmaW5kcyB5b3UuPC9wPicgK1xuICAgICAgICAnPGZvcm0gaWQ9XCJ0dGEtbmV3c2xldHRlci1mb3JtLTJcIiBjbGFzcz1cInR0YS1uZXdzbGV0dGVyLWZvcm1cIj4nICtcbiAgICAgICAgICAnPGlucHV0IHR5cGU9XCJlbWFpbFwiIHJlcXVpcmVkIHBsYWNlaG9sZGVyPVwieW91QGV4YW1wbGUuY29tXCIgYXJpYS1sYWJlbD1cIkVtYWlsIGFkZHJlc3NcIj4nICtcbiAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwic3VibWl0XCI+U2lnbiBVcDwvYnV0dG9uPicgK1xuICAgICAgICAnPC9mb3JtPicgK1xuICAgICAgICAnPHAgY2xhc3M9XCJ0dGEtbmV3c2xldHRlci1ub3RlXCIgaWQ9XCJ0dGEtbmV3c2xldHRlci1ub3RlLTJcIiByb2xlPVwic3RhdHVzXCIgaGlkZGVuPjwvcD4nICtcbiAgICAgICc8L3NlY3Rpb24+J1xuICAgICk7XG4gIH1cblxuICAvLyBGaXJlcyBhZnRlciB0aGUgZGV0YWlsIHZpZXcgaXMgc2hvd24gLSBxdWVyaWVzIGJ5IHNwZWFrZXJJZCBhbmQvb3JcbiAgLy8gc2VyaWVzSWQgKHdoaWNoZXZlciB0aGUgdGFsayBoYXMpLCBleGNsdWRpbmcgaXRzZWxmLCBtZXJnZXMgYnkgSUQsIGNhcHNcbiAgLy8gYXQgMy4gVHdvIHNtYWxsIGRlZGljYXRlZCByZXF1ZXN0cyBpbnN0ZWFkIG9mIGEgZmlsdGVyIG92ZXIgYSBmdWxsIGxpc3RcbiAgLy8gdGhhdCBubyBsb25nZXIgZXhpc3RzIGluIG1lbW9yeS5cbiAgZnVuY3Rpb24gbG9hZFJlbGF0ZWRUYWxrcyhlbnRyeSkge1xuICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1yZWxhdGVkLWNvbnRhaW5lclwiKTtcbiAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICAgIHZhciByZXF1ZXN0cyA9IFtdO1xuICAgIGlmIChlbnRyeS5zcGVha2VySWQpIHJlcXVlc3RzLnB1c2goZmV0Y2hKc29uKGJ1aWxkTGlzdFVybCh7IHNwZWFrZXI6IGVudHJ5LnNwZWFrZXJJZCwgcGVyX3BhZ2U6IDQsIGV4Y2x1ZGU6IGVudHJ5LmlkLCBvcmRlcmJ5OiBcImRhdGVcIiwgb3JkZXI6IFwiZGVzY1wiIH0pKSk7XG4gICAgaWYgKGVudHJ5LnNlcmllc0lkKSByZXF1ZXN0cy5wdXNoKGZldGNoSnNvbihidWlsZExpc3RVcmwoeyBzZXJpZXM6IGVudHJ5LnNlcmllc0lkLCBwZXJfcGFnZTogNCwgZXhjbHVkZTogZW50cnkuaWQsIG9yZGVyYnk6IFwiZGF0ZVwiLCBvcmRlcjogXCJkZXNjXCIgfSkpKTtcbiAgICBpZiAoIXJlcXVlc3RzLmxlbmd0aCkgcmV0dXJuO1xuICAgIFByb21pc2UuYWxsKHJlcXVlc3RzKS50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICB2YXIgc2VlbiA9IHt9O1xuICAgICAgdmFyIG1lcmdlZCA9IFtdO1xuICAgICAgcmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgcmVzLmRhdGEubWFwKG5vcm1hbGl6ZSkuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGlmICghc2VlbltlLmlkXSAmJiBlLmlkICE9PSBlbnRyeS5pZCkgeyBzZWVuW2UuaWRdID0gdHJ1ZTsgbWVyZ2VkLnB1c2goZSk7IH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIG1lcmdlZCA9IG1lcmdlZC5zbGljZSgwLCAzKTtcbiAgICAgIGlmICghbWVyZ2VkLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8aDIgY2xhc3M9XCJ0dGEtaDNcIj5SZWxhdGVkIFRhbGtzPC9oMj48ZGl2IGNsYXNzPVwidHRhLXNlcmllcy1ncmlkXCI+JyArIG1lcmdlZC5tYXAoc2VyaWVzQ2FyZEh0bWwpLmpvaW4oXCJcIikgKyAnPC9kaXY+JztcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiVGhlIFRha2Vhd2F5OiByZWxhdGVkIHRhbGtzIGZhaWxlZCB0byBsb2FkXCIsIGVycik7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB3aXJlTmV3c2xldHRlckZvcm0oZm9ybUlkLCBub3RlSWQpIHtcbiAgICB2YXIgZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1JZCk7XG4gICAgaWYgKCFmb3JtKSByZXR1cm47XG4gICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB2YXIgbm90ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG5vdGVJZCk7XG4gICAgICBpZiAobm90ZSkgeyBub3RlLnRleHRDb250ZW50ID0gTkVXU0xFVFRFUl9OT1RfQ09OTkVDVEVEX01TRzsgbm90ZS5oaWRkZW4gPSBmYWxzZTsgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd0RldGFpbChpZCkge1xuICAgIHZhciBlbnRyeSA9IHN0YXRlLmVudHJ5Q2FjaGVbaWRdO1xuICAgIGlmIChlbnRyeSAmJiBlbnRyeS5fZnVsbCkge1xuICAgICAgcmVuZGVyRGV0YWlsRm9yKGVudHJ5LCBpZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIE5vIGNhY2hlZCBlbnRyeSwgb3Igb25seSBhIHBhcnRpYWwgb25lIChlLmcuIHRoaXMgY2FyZCBjYW1lIGZyb20gdGhlXG4gICAgLy8gaG9tZXBhZ2UgYmF0Y2ggLSBzZXJpZXMgcm93cyAvIHNwZWFrZXIgc3BvdGxpZ2h0IC0gd2hpY2ggbmV2ZXJcbiAgICAvLyBmZXRjaGVkIHZpZGVvL291dGxpbmUvcXVvdGVzKS4gRmV0Y2ggdGhlIHJlYWwgdGhpbmcgcmF0aGVyIHRoYW5cbiAgICAvLyByZW5kZXIgYSB0YWxrIHRoYXQgbG9va3MgbGlrZSBpdCdzIG1pc3NpbmcgaXRzIHZpZGVvLlxuICAgIHZhciB1cmwgPSBidWlsZExpc3RVcmwoeyBpbmNsdWRlOiBpZCwgcGVyX3BhZ2U6IDEgfSk7XG4gICAgZmV0Y2hKc29uKHVybCkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICB2YXIgZnJlc2ggPSByZXMuZGF0YS5tYXAobm9ybWFsaXplKVswXTtcbiAgICAgIGlmICghZnJlc2gpIHtcbiAgICAgICAgc2V0U3RhdHVzKFwiVW5hYmxlIHRvIG9wZW4gdGhhdCB0YWxrIHJpZ2h0IG5vdy4gUGxlYXNlIHRyeSBhZ2FpbiBzaG9ydGx5LlwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVuZGVyRGV0YWlsRm9yKGZyZXNoLCBpZCk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgLy8gU3VyZmFjZSBpdCAoMjAyNi0wOC0wOCBVWCBwYXNzKSAtIHByZXZpb3VzbHkgYSBmYWlsZWQgY2FyZCBjbGlja1xuICAgICAgLy8gbG9nZ2VkIHRvIGNvbnNvbGUgYW5kIGRpZCBub3RoaW5nIHZpc2libGUsIHdoaWNoIHJlYWRzIGFzIGEgYnJva2VuXG4gICAgICAvLyBjbGljay4gVGhlIHN0YXR1cyBlbGVtZW50IGlzIGFuIGFyaWEtbGl2ZSByZWdpb24sIHNvIHRoaXMgaXNcbiAgICAgIC8vIGFubm91bmNlZCB0b28uXG4gICAgICBjb25zb2xlLmVycm9yKFwiVGhlIFRha2Vhd2F5OiBmYWlsZWQgdG8gbG9hZCB0YWxrIGRldGFpbFwiLCBlcnIpO1xuICAgICAgc2V0U3RhdHVzKFwiVW5hYmxlIHRvIG9wZW4gdGhhdCB0YWxrIHJpZ2h0IG5vdy4gUGxlYXNlIHRyeSBhZ2FpbiBzaG9ydGx5LlwiKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlckRldGFpbEZvcihlbnRyeSwgaWQpIHtcbiAgICBzdGF0ZS52aWV3ID0gXCJkZXRhaWxcIjtcbiAgICBzdGF0ZS5jdXJyZW50SWQgPSBpZDtcbiAgICBpZiAoIXN0YXRlLnNpbmdsZU1vZGUgJiYgIXN0YXRlLmhhbmRsaW5nUG9wc3RhdGUgJiYgZW50cnkubGluaykge1xuICAgICAgdHJ5IHsgaGlzdG9yeS5wdXNoU3RhdGUoeyB0dGE6IFwiZGV0YWlsXCIsIGlkOiBpZCB9LCBlbnRyeS50aXRsZSwgZW50cnkubGluayk7IH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICAgIHN0YXRlLmhhbmRsaW5nUG9wc3RhdGUgPSBmYWxzZTtcbiAgICAvLyBIZXJvL2xpc3QtdmlldyBkb24ndCBleGlzdCBpbiBzaW5nbGUgbW9kZSAoaW5pdFNpbmdsZSgpIG5ldmVyIGJ1aWxkc1xuICAgIC8vIHRoZW0gLSBzZWUgYmVsb3cpIC0gZ3VhcmQgaW5zdGVhZCBvZiBhc3N1bWluZywgcmF0aGVyIHRoYW4gbWFpbnRhaW5cbiAgICAvLyB0d28gc2VwYXJhdGUgcmVuZGVyIHBhdGhzIGZvciB3aGF0J3Mgb3RoZXJ3aXNlIGlkZW50aWNhbCBtYXJrdXAuXG4gICAgdmFyIGhlcm8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1oZXJvXCIpO1xuICAgIGlmIChoZXJvKSBoZXJvLmhpZGRlbiA9IHRydWU7XG4gICAgdmFyIGxpc3RWaWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0dGEtbGlzdC12aWV3XCIpO1xuICAgIGlmIChsaXN0VmlldykgbGlzdFZpZXcuaGlkZGVuID0gdHJ1ZTtcbiAgICB2YXIgZGV0YWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0dGEtZGV0YWlsXCIpO1xuICAgIGRldGFpbC5oaWRkZW4gPSBmYWxzZTtcbiAgICBkZXRhaWwuaW5uZXJIVE1MID0gZGV0YWlsSHRtbChlbnRyeSk7XG5cbiAgICB2YXIgYmFja0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidHRhLWJhY2stYnRuXCIpO1xuICAgIGlmIChzdGF0ZS5zaW5nbGVNb2RlKSB7XG4gICAgICAvLyBObyBTUEEgbGlzdCB2aWV3IHRvIHN3YXAgYmFjayB0byAtIHRoaXMgaXMgYSByZWFsLCBzZXBhcmF0ZSBXUFxuICAgICAgLy8gcGFnZSwgc28gXCJiYWNrXCIgaXMgYSByZWFsIGxpbmsgdG8gdGhlIGh1Yiwgbm90IHNob3dMaXN0KCkuXG4gICAgICBiYWNrQnRuLm91dGVySFRNTCA9ICc8YSBpZD1cInR0YS1iYWNrLWJ0blwiIGhyZWY9XCInICsgU0lURV9VUkwgKyAnL3RoZXRha2Vhd2F5L1wiPlRoZSBUYWtlYXdheTwvYT4nO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYWNrQnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBzaG93TGlzdCk7XG4gICAgfVxuICAgIHZhciBjb3B5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0dGEtY29weS1saW5rLWJ0blwiKTtcbiAgICBpZiAoY29weUJ0bikgY29weUJ0bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgY29weUxpbmspO1xuICAgIHdpcmVOZXdzbGV0dGVyRm9ybShcInR0YS1uZXdzbGV0dGVyLWZvcm0tMlwiLCBcInR0YS1uZXdzbGV0dGVyLW5vdGUtMlwiKTtcbiAgICBsb2FkUmVsYXRlZFRhbGtzKGVudHJ5KTtcblxuICAgIC8vIChzaW5nbGUgbW9kZSB1c2VkIHRvIG5lZWQgYSBjbGljayBsaXN0ZW5lciBoZXJlIHRvIG1ha2UgcmVsYXRlZC10YWxrXG4gICAgLy8gY2FyZHMgbmF2aWdhdGUgLSBhcyBvZiAyMDI2LTA4LTA4IHRoZSBjYXJkcyBhcmUgcmVhbCA8YSBocmVmPiBsaW5rc1xuICAgIC8vIHRvIGVhY2ggdGFsaydzIHBlcm1hbGluaywgc28gb24gdGhpcyBwYWdlIChubyBodWIgY2xpY2sgaW50ZXJjZXB0b3JcbiAgICAvLyBib3VuZCkgdGhlIGJyb3dzZXIncyBkZWZhdWx0IG5hdmlnYXRpb24ganVzdCB3b3JrcywgaW5jbHVkaW5nXG4gICAgLy8gbWlkZGxlLWNsaWNrL25ldy10YWIuKVxuXG4gICAgdmFyIHZpZGVvRmFjYWRlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0dGEtdmlkZW8tZmFjYWRlXCIpO1xuICAgIGlmICh2aWRlb0ZhY2FkZSkge1xuICAgICAgdmlkZW9GYWNhZGUuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgICAgIGlmcmFtZS5zcmMgPSB2aWRlb0ZhY2FkZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLWVtYmVkLXNyY1wiKTtcbiAgICAgICAgaWZyYW1lLnRpdGxlID0gZW50cnkudGl0bGU7XG4gICAgICAgIGlmcmFtZS5hbGxvdyA9IFwiYWNjZWxlcm9tZXRlcjsgYXV0b3BsYXk7IGNsaXBib2FyZC13cml0ZTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZVwiO1xuICAgICAgICBpZnJhbWUuYWxsb3dGdWxsc2NyZWVuID0gdHJ1ZTtcbiAgICAgICAgdmlkZW9GYWNhZGUucmVwbGFjZVdpdGgoaWZyYW1lKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciB0cmFuc2NyaXB0VG9nZ2xlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0dGEtdHJhbnNjcmlwdC10b2dnbGVcIik7XG4gICAgaWYgKHRyYW5zY3JpcHRUb2dnbGUpIHtcbiAgICAgIHRyYW5zY3JpcHRUb2dnbGUuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS10cmFuc2NyaXB0LWJvZHlcIik7XG4gICAgICAgIHZhciBvcGVuID0gdHJhbnNjcmlwdFRvZ2dsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpID09PSBcInRydWVcIjtcbiAgICAgICAgdHJhbnNjcmlwdFRvZ2dsZS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIsIFN0cmluZyghb3BlbikpO1xuICAgICAgICBib2R5LmhpZGRlbiA9IG9wZW47XG4gICAgICAgIHRyYW5zY3JpcHRUb2dnbGUucXVlcnlTZWxlY3RvcihcIi50dGEtdHJhbnNjcmlwdC10b2dnbGUtaWNvblwiKS50ZXh0Q29udGVudCA9IG9wZW4gPyBcIitcIiA6IFwiXHUyMjEyXCI7XG5cbiAgICAgICAgLy8gTGF6eS1sb2FkOiB0aGUgbGlzdCBmZXRjaCBkZWxpYmVyYXRlbHkgZXhjbHVkZXMgdHJhbnNjcmlwdF90ZXh0XG4gICAgICAgIC8vIChzZWUgTElTVF9GSUVMRFMpLCBzbyB0aGUgZmlyc3QgZXhwYW5kIGZldGNoZXMgaXQgb24gZGVtYW5kIGZvclxuICAgICAgICAvLyBqdXN0IHRoaXMgb25lIHRhbGsgaW5zdGVhZCBvZiBldmVyeSB0YWxrIGhhdmluZyBwYWlkIHRoYXQgY29zdFxuICAgICAgICAvLyB1cGZyb250IG9uIHBhZ2UgbG9hZC5cbiAgICAgICAgaWYgKCFvcGVuICYmICFlbnRyeS50cmFuc2NyaXB0VGV4dCAmJiAhZW50cnkuX3RyYW5zY3JpcHRMb2FkaW5nKSB7XG4gICAgICAgICAgZW50cnkuX3RyYW5zY3JpcHRMb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICBib2R5LmlubmVySFRNTCA9ICc8cCBjbGFzcz1cInR0YS10cmFuc2NyaXB0LXBhcmFcIj5Mb2FkaW5nIHRyYW5zY3JpcHQmaGVsbGlwOzwvcD4nO1xuICAgICAgICAgIGZldGNoVHJhbnNjcmlwdChlbnRyeS5zbHVnKS50aGVuKGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgICAgICBlbnRyeS50cmFuc2NyaXB0VGV4dCA9IHRleHQ7XG4gICAgICAgICAgICBib2R5LmlubmVySFRNTCA9IHRleHRcbiAgICAgICAgICAgICAgPyB0ZXh0LnNwbGl0KC9cXG5cXHMqXFxuLykuZmlsdGVyKGZ1bmN0aW9uIChwKSB7IHJldHVybiBwLnRyaW0oKS5sZW5ndGg7IH0pLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuICc8cCBjbGFzcz1cInR0YS10cmFuc2NyaXB0LXBhcmFcIj4nICsgZXNjYXBlSHRtbChwLnRyaW0oKSkgKyAnPC9wPic7XG4gICAgICAgICAgICAgICAgfSkuam9pbihcIlwiKVxuICAgICAgICAgICAgICA6ICc8cCBjbGFzcz1cInR0YS10cmFuc2NyaXB0LXBhcmFcIj5UcmFuc2NyaXB0IG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgdGFsay48L3A+JztcbiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBlbnRyeS5fdHJhbnNjcmlwdExvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGJvZHkuaW5uZXJIVE1MID0gJzxwIGNsYXNzPVwidHRhLXRyYW5zY3JpcHQtcGFyYVwiPlVuYWJsZSB0byBsb2FkIHRoZSB0cmFuc2NyaXB0IHJpZ2h0IG5vdyAtIHBsZWFzZSB0cnkgYWdhaW4uPC9wPic7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBUYWIgdGl0bGUgKyBmb2N1cyAoMjAyNi0wOC0wOCBVWCBwYXNzKTogdGhlIGluLXBhZ2Ugc3dhcCBuZXZlciB1cGRhdGVkXG4gICAgLy8gZG9jdW1lbnQudGl0bGUgKHB1c2hTdGF0ZSdzIHRpdGxlIGFyZyBpcyBpZ25vcmVkIGJ5IGJyb3dzZXJzKSwgc28gdGhlXG4gICAgLy8gdGFiIGFsd2F5cyByZWFkIGFzIHRoZSBodWI7IGFuZCBmb2N1cyBzdGF5ZWQgaW5zaWRlIHRoZSBub3ctW2hpZGRlbl1cbiAgICAvLyBsaXN0IHZpZXcsIHN0cmFuZGluZyBrZXlib2FyZC9zY3JlZW4tcmVhZGVyIHVzZXJzLiBTaW5nbGUgbW9kZSBza2lwc1xuICAgIC8vIHRoZSB0aXRsZSAoV29yZFByZXNzIGFscmVhZHkgcmVuZGVyZWQgdGhlIHJpZ2h0IG9uZSBzZXJ2ZXItc2lkZSkuXG4gICAgaWYgKCFzdGF0ZS5zaW5nbGVNb2RlKSBkb2N1bWVudC50aXRsZSA9IGVudHJ5LnRpdGxlICsgXCIgLSBUaGUgVGFrZWF3YXlcIjtcbiAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgMCk7XG4gICAgdmFyIGRldGFpbFRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0dGEtZGV0YWlsLXRpdGxlXCIpO1xuICAgIGlmIChkZXRhaWxUaXRsZSkgZGV0YWlsVGl0bGUuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd0xpc3QoKSB7XG4gICAgc3RhdGUudmlldyA9IFwibGlzdFwiO1xuICAgIHN0YXRlLmN1cnJlbnRJZCA9IG51bGw7XG4gICAgaWYgKCFzdGF0ZS5oYW5kbGluZ1BvcHN0YXRlKSB7XG4gICAgICB0cnkgeyBoaXN0b3J5LnB1c2hTdGF0ZSh7IHR0YTogXCJsaXN0XCIgfSwgZG9jdW1lbnQudGl0bGUsIFNJVEVfVVJMICsgXCIvdGhldGFrZWF3YXkvXCIpOyB9IGNhdGNoIChlKSB7fVxuICAgIH1cbiAgICBzdGF0ZS5oYW5kbGluZ1BvcHN0YXRlID0gZmFsc2U7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0dGEtZGV0YWlsXCIpLmhpZGRlbiA9IHRydWU7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0dGEtaGVyb1wiKS5oaWRkZW4gPSBmYWxzZTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1saXN0LXZpZXdcIikuaGlkZGVuID0gZmFsc2U7XG4gICAgLy8gUmVjb25jaWxlIHRoZSB3aG9sZSBsaXN0IHZpZXcgd2l0aCBjdXJyZW50IHN0YXRlIG9uIGV2ZXJ5IHJldHVybiBmcm9tXG4gICAgLy8gdGhlIGRldGFpbCB2aWV3ICgyMDI2LTA4LTA5KSAtIHRoZSBsaXN0IERPTSBpcyBvdGhlcndpc2Ugd2hhdGV2ZXIgaXRcbiAgICAvLyB3YXMgd2hlbiB0aGUgdmlzaXRvciBsZWZ0IGl0LCBhbmQgYW55dGhpbmcgdGhhdCBkcmlmdGVkIHdoaWxlIGl0IHdhc1xuICAgIC8vIFtoaWRkZW5dIChicmVhZGNydW1iLCBzZWN0aW9ucykgd291bGQgcmVuZGVyIHN0YWxlLiBDaGVhcDogcHVyZVxuICAgIC8vIHJlLXJlbmRlciBmcm9tIHN0YXRlLCBubyBmZXRjaGVzLlxuICAgIHJlbmRlckdyaWREb20oKTtcbiAgICBpZiAoc3RhdGUuYmFzZURvY1RpdGxlKSBkb2N1bWVudC50aXRsZSA9IHN0YXRlLmJhc2VEb2NUaXRsZTsgLy8gdW5kbyB0aGUgZGV0YWlsIHZpZXcncyB0aXRsZSAoc2VlIHJlbmRlckRldGFpbEZvcilcbiAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgMCk7XG4gICAgdmFyIGhlcm9UaXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidHRhLWhlcm8tdGl0bGVcIik7XG4gICAgaWYgKGhlcm9UaXRsZSkgaGVyb1RpdGxlLmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTsgLy8gbWlycm9yIG9mIHJlbmRlckRldGFpbEZvcidzIGZvY3VzIG1vdmUgLSBiYWNrIGxhbmRzIGF0IHRoZSB0b3Agb2YgdGhlIGxpc3Qgdmlld1xuICB9XG5cbiAgLy8gLS0tLSBXaXJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBmdW5jdGlvbiBzZXRTdGF0dXModGV4dCkge1xuICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidHRhLXN0YXR1c1wiKTtcbiAgICBpZiAoIXRleHQpIHtcbiAgICAgIGVsLmhpZGRlbiA9IHRydWU7XG4gICAgICBlbC50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLmhpZGRlbiA9IGZhbHNlO1xuICAgICAgZWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUdyaWRDbGljayhlKSB7XG4gICAgdmFyIGVsID0gZS50YXJnZXQuY2xvc2VzdChcIltkYXRhLWlkXVwiKTtcbiAgICBpZiAoZWwpIHtcbiAgICAgIC8vIENhcmRzIGFyZSByZWFsIGxpbmtzIG5vdyAoMjAyNi0wOC0wOCk6IG9ubHkgaW50ZXJjZXB0IGEgcGxhaW4gbGVmdFxuICAgICAgLy8gY2xpY2sgZm9yIHRoZSBmYXN0IGluLXBhZ2Ugc3dhcC4gTW9kaWZpZWQgY2xpY2tzIChjbWQvY3RybC9zaGlmdC9cbiAgICAgIC8vIGFsdCkgZmFsbCB0aHJvdWdoIHRvIHRoZSBicm93c2VyJ3MgbmF0aXZlIG9wZW4taW4tbmV3LXRhYi93aW5kb3dcbiAgICAgIC8vIGJlaGF2aW9yIG9uIHRoZSB0YWxrJ3MgcmVhbCBwZXJtYWxpbmsgLSB0aGF0J3MgdGhlIHBvaW50IG9mIHRoZVxuICAgICAgLy8gY2hhbmdlLiAoTWlkZGxlIGNsaWNrcyBmaXJlIGF1eGNsaWNrLCBub3QgY2xpY2ssIHNvIHRoZXkgbmV2ZXJcbiAgICAgIC8vIHJlYWNoIGhlcmUgYXQgYWxsLilcbiAgICAgIGlmIChlLm1ldGFLZXkgfHwgZS5jdHJsS2V5IHx8IGUuc2hpZnRLZXkgfHwgZS5hbHRLZXkgfHwgZS5idXR0b24gIT09IDApIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNob3dEZXRhaWwoZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1pZFwiKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNwZWFrZXJUb2dnbGUgPSBlLnRhcmdldC5jbG9zZXN0KFwiI3R0YS1zcGVha2VyLXRvZ2dsZVwiKTtcbiAgICBpZiAoc3BlYWtlclRvZ2dsZSkge1xuICAgICAgc3RhdGUuc3BlYWtlclNob3dBbGwgPSAhc3RhdGUuc3BlYWtlclNob3dBbGw7XG4gICAgICBzdGF0ZS5zcGVha2VyU3BvdGxpZ2h0SHRtbCA9IHNwZWFrZXJTcG90bGlnaHRIdG1sKCk7XG4gICAgICByZW5kZXJHcmlkRG9tKCk7XG4gICAgICAvLyBpbm5lckhUTUwgcmVidWlsZCBkcm9wcGVkIGtleWJvYXJkIGZvY3VzIHRvIDxib2R5PiAoMjAyNi0wOC0wOFxuICAgICAgLy8gZm9jdXMtcmVwYWlyIGNvbnZlbnRpb24pIC0gcHV0IGl0IGJhY2sgb24gdGhlIHJlLWNyZWF0ZWQgdG9nZ2xlLlxuICAgICAgdmFyIHJlYnVpbHRUb2dnbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1zcGVha2VyLXRvZ2dsZVwiKTtcbiAgICAgIGlmIChyZWJ1aWx0VG9nZ2xlKSByZWJ1aWx0VG9nZ2xlLmZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNlZUFsbCA9IGUudGFyZ2V0LmNsb3Nlc3QoXCJbZGF0YS1zZXJpZXMtaWRdXCIpO1xuICAgIGlmIChzZWVBbGwpIHtcbiAgICAgIHN0YXRlLmZpbHRlcmVkU2VyaWVzSWQgPSBzZWVBbGwuZ2V0QXR0cmlidXRlKFwiZGF0YS1zZXJpZXMtaWRcIik7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1zZXJpZXMtZmlsdGVyXCIpLnZhbHVlID0gc3RhdGUuZmlsdGVyZWRTZXJpZXNJZDtcbiAgICAgIGFwcGx5RmlsdGVyQ2hhbmdlKCk7XG4gICAgICBzY3JvbGxUb0lkKFwiYWxsLXRhbGtzXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzcGVha2VyQ2FyZCA9IGUudGFyZ2V0LmNsb3Nlc3QoXCJbZGF0YS1zcGVha2VyLWlkXVwiKTtcbiAgICBpZiAoc3BlYWtlckNhcmQpIHtcbiAgICAgIHN0YXRlLmZpbHRlcmVkU3BlYWtlcklkID0gc3BlYWtlckNhcmQuZ2V0QXR0cmlidXRlKFwiZGF0YS1zcGVha2VyLWlkXCIpO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0dGEtc3BlYWtlci1maWx0ZXJcIikudmFsdWUgPSBzdGF0ZS5maWx0ZXJlZFNwZWFrZXJJZDtcbiAgICAgIGFwcGx5RmlsdGVyQ2hhbmdlKCk7XG4gICAgICBzY3JvbGxUb0lkKFwiYWxsLXRhbGtzXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBjYW1wQ2FyZCA9IGUudGFyZ2V0LmNsb3Nlc3QoXCJbZGF0YS1jYW1wXVwiKTtcbiAgICBpZiAoY2FtcENhcmQpIHtcbiAgICAgIHZhciB0ZXJtID0gcmVzb2x2ZUNhbXBUZXJtKGNhbXBDYXJkLmdldEF0dHJpYnV0ZShcImRhdGEtY2FtcFwiKSk7XG4gICAgICBpZiAodGVybSkge1xuICAgICAgICBzdGF0ZS5maWx0ZXJlZENhbXBJZCA9IHRlcm0uaWQ7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidHRhLWNhbXAtZmlsdGVyXCIpLnZhbHVlID0gdGVybS5pZDtcbiAgICAgICAgYXBwbHlGaWx0ZXJDaGFuZ2UoKTtcbiAgICAgICAgc2Nyb2xsVG9JZChcImFsbC10YWxrc1wiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSdW5zIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBodWIgaW5pdCgpIHdoZW4gI3R0YS1yb290IGNhcnJpZXNcbiAgLy8gZGF0YS10dGEtbW9kZT1cInNpbmdsZVwiIC0gc2V0IHNlcnZlci1zaWRlIGJ5IHRoZSBXUENvZGUgc25pcHBldCB0aGF0XG4gIC8vIGluamVjdHMgdGhpcyBzYW1lIGJ1bmRsZSBvbiBhIHRhbGsncyBvd24gcGVybWFsaW5rXG4gIC8vIChjYW1wcy53b2wub3JnL3RhbGsvPHNsdWc+LyksIG5vdCB0aGUgaHViIHBhZ2UuIFJlbmRlcnMganVzdCB0aGF0IG9uZVxuICAvLyB0YWxrJ3MgZGV0YWlsIHZpZXcgLSBubyBncmlkLCBmaWx0ZXJzLCBoZXJvLCBvciB0YXhvbm9teS10ZXJtIGZldGNoZXMsXG4gIC8vIHNpbmNlIG5vbmUgb2YgdGhhdCBkYXRhIGlzIG5lZWRlZCBoZXJlIGFuZCBmZXRjaGluZyBpdCBhbnl3YXkgd291bGRcbiAgLy8gdW5kbyBzb21lIG9mIHRoZSBQaGFzZSAyIHBlcmZvcm1hbmNlIHdvcmsgZm9yIG5vIGJlbmVmaXQgb24gdGhpcyBwYWdlLlxuICBmdW5jdGlvbiBpbml0U2luZ2xlKHJvb3QsIHNsdWcpIHtcbiAgICBzdGF0ZS5zaW5nbGVNb2RlID0gdHJ1ZTtcbiAgICByb290LmlubmVySFRNTCA9ICc8ZGl2IGlkPVwidHRhLWRldGFpbFwiPjwvZGl2Pic7XG4gICAgdmFyIHVybCA9IGJ1aWxkTGlzdFVybCh7IHNsdWc6IHNsdWcgfSk7XG4gICAgZmV0Y2hKc29uKHVybCkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICB2YXIgZW50cnkgPSByZXMuZGF0YS5tYXAobm9ybWFsaXplKVswXTtcbiAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgcm9vdC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInR0YS1jb250YWluZXJcIj48cD5UaGlzIHRhbGsgY291bGQgbm90IGJlIGZvdW5kLjwvcD48L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZW5kZXJEZXRhaWxGb3IoZW50cnksIGVudHJ5LmlkKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiVGhlIFRha2Vhd2F5OiBmYWlsZWQgdG8gbG9hZCBzaW5nbGUgdGFsa1wiLCBlcnIpO1xuICAgICAgcm9vdC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInR0YS1jb250YWluZXJcIj48cD5VbmFibGUgdG8gbG9hZCB0aGlzIHRhbGsgcmlnaHQgbm93LiBQbGVhc2UgdHJ5IGFnYWluIHNob3J0bHkuPC9wPjwvZGl2Pic7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbml0KCkge1xuICAgIHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0dGEtcm9vdFwiKTtcbiAgICBpZiAoIXJvb3QpIHJldHVybjtcblxuICAgIHZhciBzaW5nbGVTbHVnID0gcm9vdC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXR0YS1tb2RlXCIpID09PSBcInNpbmdsZVwiID8gcm9vdC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXR0YS1zbHVnXCIpIDogbnVsbDtcbiAgICBpZiAoc2luZ2xlU2x1Zykge1xuICAgICAgaW5pdFNpbmdsZShyb290LCBzaW5nbGVTbHVnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBidWlsZFNrZWxldG9uKHJvb3QpO1xuICAgIHN0YXRlLmJhc2VEb2NUaXRsZSA9IGRvY3VtZW50LnRpdGxlOyAvLyByZXN0b3JlZCBieSBzaG93TGlzdCgpIGFmdGVyIGEgZGV0YWlsIHZpZXcgY2hhbmdlZCBpdFxuXG4gICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyB0dGE6IFwibGlzdFwiIH0sIGRvY3VtZW50LnRpdGxlLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFlLnN0YXRlKSByZXR1cm47XG4gICAgICBzdGF0ZS5oYW5kbGluZ1BvcHN0YXRlID0gdHJ1ZTtcbiAgICAgIGlmIChlLnN0YXRlLnR0YSA9PT0gXCJkZXRhaWxcIiAmJiBlLnN0YXRlLmlkKSB7XG4gICAgICAgIHNob3dEZXRhaWwoZS5zdGF0ZS5pZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93TGlzdCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0dGEtbGlzdC12aWV3XCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVHcmlkQ2xpY2spO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0dGEtY2FtcC1maWx0ZXJcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgc3RhdGUuZmlsdGVyZWRDYW1wSWQgPSBlLnRhcmdldC52YWx1ZTsgYXBwbHlGaWx0ZXJDaGFuZ2UoKTtcbiAgICB9KTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1zcGVha2VyLWZpbHRlclwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBzdGF0ZS5maWx0ZXJlZFNwZWFrZXJJZCA9IGUudGFyZ2V0LnZhbHVlOyBhcHBseUZpbHRlckNoYW5nZSgpO1xuICAgIH0pO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidHRhLXNlcmllcy1maWx0ZXJcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgc3RhdGUuZmlsdGVyZWRTZXJpZXNJZCA9IGUudGFyZ2V0LnZhbHVlOyBhcHBseUZpbHRlckNoYW5nZSgpO1xuICAgIH0pO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidHRhLXRvcGljLWZpbHRlclwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBzdGF0ZS5maWx0ZXJlZFRvcGljSWQgPSBlLnRhcmdldC52YWx1ZTsgYXBwbHlGaWx0ZXJDaGFuZ2UoKTtcbiAgICB9KTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1zb3J0XCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIHN0YXRlLnNvcnQgPSBlLnRhcmdldC52YWx1ZTsgYXBwbHlGaWx0ZXJDaGFuZ2UoKTtcbiAgICB9KTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1zZWFyY2hcIikuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGRlYm91bmNlKGZ1bmN0aW9uIChlKSB7XG4gICAgICBzdGF0ZS5zZWFyY2ggPSBlLnRhcmdldC52YWx1ZTsgYXBwbHlGaWx0ZXJDaGFuZ2UoKTtcbiAgICB9LCBTRUFSQ0hfREVCT1VOQ0VfTVMpKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1maWx0ZXItYnJlYWRjcnVtYi1ob21lXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjbGVhckFsbEZpbHRlcnMoKTtcbiAgICB9KTtcblxuICAgIHdpcmVOZXdzbGV0dGVyRm9ybShcInR0YS1uZXdzbGV0dGVyLWZvcm1cIiwgXCJ0dGEtbmV3c2xldHRlci1ub3RlXCIpO1xuXG4gICAgc2V0U3RhdHVzKFwiTG9hZGluZyB0YWxrc1x1MjAyNlwiKTtcbiAgICBsb2FkQWxsVGVybXMoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHBvcHVsYXRlRmlsdGVyU2VsZWN0cygpO1xuXG4gICAgICAvLyBEZWxpYmVyYXRlbHkgTk9UIGEgc2luZ2xlIFByb21pc2UuYWxsKCkgLSBtZWFzdXJlZCAyMDI2LTA4LTA1XG4gICAgICAvLyBhZ2FpbnN0IHRoZSBsaXZlIEFQSTogdGhlIGdyaWQncyBvd24gcGVyX3BhZ2U9NiBmZXRjaCByZXNvbHZlc1xuICAgICAgLy8gZmFzdGVyIHRoYW4gdGhlIGhvbWVwYWdlIHNlY3Rpb25zIChzZXJpZXMgcm93cy9zcGVha2VyIHNwb3RsaWdodClcbiAgICAgIC8vIGRvLCBzaW5jZSB0aGUgbGF0dGVyIGZhbiBvdXQgaW50byB0aGVpciBvd24gcGVyLXRlcm0gcmVxdWVzdHMgKHNlZVxuICAgICAgLy8gbG9hZFNlcmllc1Jvd3MvbG9hZFNwZWFrZXJTcG90bGlnaHQgYWJvdmUpLiBHYXRpbmcgdGhlIHdob2xlIHBhZ2Unc1xuICAgICAgLy8gbG9hZGluZyBzdGF0ZSBvbiB0aGUgc2xvd2VzdCBvZiB0aGUgdGhyZWUgd291bGQgbWVhbiB0aGUgZ3JpZCAtIHRoZVxuICAgICAgLy8gcHJpbWFyeSBjb250ZW50IC0gc2l0cyBiZWhpbmQgYSBcIkxvYWRpbmcgdGFsa3NcdTIwMjZcIiBzY3JlZW4gZm9yXG4gICAgICAvLyBzZWN0aW9ucyBpdCBkb2Vzbid0IGFjdHVhbGx5IGRlcGVuZCBvbi4gTGV0dGluZyB0aGUgZ3JpZCBjbGVhciBpdHNcbiAgICAgIC8vIG93biBzdGF0dXMgYXMgc29vbiBhcyBJVFMgZmV0Y2ggcmVzb2x2ZXMsIGluZGVwZW5kZW50IG9mIHRoZSBvdGhlclxuICAgICAgLy8gdHdvLCBpcyBhIHJlYWwsIG1lYXN1cmVkIHdpbi5cbiAgICAgIC8vIGxvYWRGZWF0dXJlZCgpIG11c3QgcmVzb2x2ZSBCRUZPUkUgbG9hZEdyaWRQYWdlKDEpIHN0YXJ0cywgbm90IGp1c3RcbiAgICAgIC8vIHJ1biBpbiBwYXJhbGxlbCB3aXRoIGl0IC0gZm91bmQgMjAyNi0wOC0wNTogZ3JpZFF1ZXJ5UGFyYW1zKCkgb25seVxuICAgICAgLy8gZXhjbHVkZXMgdGhlIGZlYXR1cmVkIHRhbGsncyBJRCB3aGVuIHN0YXRlLmZlYXR1cmVkIGlzIGFscmVhZHlcbiAgICAgIC8vIHNldCwgYW5kIGl0J3MgY2hlY2tlZCBzeW5jaHJvbm91c2x5IGF0IGZldGNoLWNhbGwgdGltZSwgbm90XG4gICAgICAvLyByZS1jaGVja2VkIHdoZW4gZmVhdHVyZWQgbGF0ZXIgcmVzb2x2ZXMuIEZpcmluZyBib3RoIGluIHBhcmFsbGVsXG4gICAgICAvLyBtZWFudCBzdGF0ZS5mZWF0dXJlZCB3YXMgc3RpbGwgbnVsbCBhdCB0aGUgaW5zdGFudCBwYWdlIDEncyByZXF1ZXN0XG4gICAgICAvLyB3YXMgYnVpbHQsIHNvIHRoZSBleGNsdWRlIG5ldmVyIGFwcGxpZWQgYW5kIHRoZSBmZWF0dXJlZCB0YWxrXG4gICAgICAvLyBkdXBsaWNhdGVkIGFzIHRoZSBncmlkJ3Mgb3duIGZpcnN0IGNhcmQuIGxvYWRGZWF0dXJlZCgpIGlzIGEgdGlueVxuICAgICAgLy8gcGVyX3BhZ2U9MSByZXF1ZXN0IC0gY2hhaW5pbmcgaXQgYmVmb3JlIHBhZ2UgMSBjb3N0cyBuZWdsaWdpYmxlXG4gICAgICAvLyB0aW1lIGFuZCBpc24ndCB0aGUgc2xvdyBjYWxsICh0aGF0J3MgdGhlIGhvbWVwYWdlIHNlY3Rpb25zIGJlbG93LFxuICAgICAgLy8gc3RpbGwgZnVsbHkgcGFyYWxsZWwvaW5kZXBlbmRlbnQgb2YgdGhlIGdyaWQpLlxuICAgICAgbG9hZEZlYXR1cmVkKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlbmRlckdyaWREb20oKTtcbiAgICAgICAgcmV0dXJuIGxvYWRHcmlkUGFnZSgxLCBmYWxzZSk7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0U3RhdHVzKG51bGwpO1xuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiVGhlIFRha2Vhd2F5OiBmZWF0dXJlZCB0YWxrIG9yIGdyaWQgZmFpbGVkIHRvIGxvYWRcIiwgZXJyKTtcbiAgICAgICAgc2V0U3RhdHVzKFwiVW5hYmxlIHRvIGxvYWQgdGFsa3MgcmlnaHQgbm93LiBQbGVhc2UgdHJ5IGFnYWluIHNob3J0bHkuXCIpO1xuICAgICAgfSk7XG4gICAgICBQcm9taXNlLmFsbChbbG9hZFNlcmllc1Jvd3MoKSwgbG9hZFNwZWFrZXJTcG90bGlnaHQoKSwgbG9hZENhbXBTcG90bGlnaHQoKV0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICBzdGF0ZS5ob21lcGFnZVNlY3Rpb25zTG9hZGVkID0gdHJ1ZTsgLy8gcmVsZWFzZSB0aGUgQ0xTIHBsYWNlaG9sZGVyIHNwYWNlIChzZWUgaG9tZXBhZ2VQbGFjZWhvbGRlcnMpXG4gICAgICAgIHJlbmRlckdyaWREb20oKTtcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlRoZSBUYWtlYXdheTogaG9tZXBhZ2Ugc2VjdGlvbnMgZmFpbGVkIHRvIGxvYWRcIiwgZXJyKTtcbiAgICAgICAgc3RhdGUuaG9tZXBhZ2VTZWN0aW9uc0xvYWRlZCA9IHRydWU7IC8vIHJlbGVhc2UgdGhlIHJlc2VydmVkIHNwYWNlIG9uIGZhaWx1cmUgdG9vIC0gbmV2ZXIgbGVhdmUgYSBwZXJtYW5lbnQgZW1wdHkgYmxvY2tcbiAgICAgICAgcmVuZGVyR3JpZERvbSgpO1xuICAgICAgfSk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihcIlRoZSBUYWtlYXdheTogZmFpbGVkIHRvIGxvYWQgZW50cmllc1wiLCBlcnIpO1xuICAgICAgc2V0U3RhdHVzKFwiVW5hYmxlIHRvIGxvYWQgdGFsa3MgcmlnaHQgbm93LiBQbGVhc2UgdHJ5IGFnYWluIHNob3J0bHkuXCIpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gUmVhZC1vbmx5IGRpYWdub3N0aWMgaG9vayAoMjAyNi0wOC0wOSwgYWRkZWQgd2hpbGUgY2hhc2luZyBhIHN0YWxlLVxuICAvLyBicmVhZGNydW1iIHJlcG9ydCB0aGF0IGNvdWxkIG5vdCBiZSByZXByb2R1Y2VkIG9yZ2FuaWNhbGx5KTogcGFzdGVcbiAgLy8gYFRUQV9ERUJVR19TVEFURSgpYCBpbiB0aGUgY29uc29sZSBhdCB0aGUgbW9tZW50IGEgdmlldyBsb29rcyB3cm9uZyBhbmRcbiAgLy8gaXQgcmV0dXJucyB0aGUgd2lkZ2V0J3MgYWN0dWFsIGZpbHRlci9ncmlkIHN0YXRlIGFsb25nc2lkZSB3aGF0IHRoZVxuICAvLyBicmVhZGNydW1iIERPTSBpcyBzaG93aW5nIC0gdGhlIGZhc3Rlc3Qgd2F5IHRvIHRlbGwgXCJzdGF0ZSBpcyB3cm9uZ1wiXG4gIC8vIGZyb20gXCJET00gd2VudCBzdGFsZVwiIGZyb20gXCJ0aGlzIHRhYiBpcyBydW5uaW5nIGFuIG9sZCBidW5kbGVcIi5cbiAgd2luZG93LlRUQV9ERUJVR19TVEFURSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYmMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInR0YS1maWx0ZXItYnJlYWRjcnVtYlwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgdmVyc2lvbjogd2luZG93LlRUQV9BU1NFVFNfVkVSU0lPTixcbiAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgY2FtcDogc3RhdGUuZmlsdGVyZWRDYW1wSWQsXG4gICAgICAgIHNwZWFrZXI6IHN0YXRlLmZpbHRlcmVkU3BlYWtlcklkLFxuICAgICAgICBzZXJpZXM6IHN0YXRlLmZpbHRlcmVkU2VyaWVzSWQsXG4gICAgICAgIHRvcGljOiBzdGF0ZS5maWx0ZXJlZFRvcGljSWQsXG4gICAgICAgIHNlYXJjaDogc3RhdGUuc2VhcmNoLFxuICAgICAgICBzb3J0OiBzdGF0ZS5zb3J0XG4gICAgICB9LFxuICAgICAgdmlldzogc3RhdGUudmlldyxcbiAgICAgIGdyaWRUb3RhbDogc3RhdGUuZ3JpZC50b3RhbCxcbiAgICAgIGdyaWRJdGVtczogc3RhdGUuZ3JpZC5pdGVtcy5sZW5ndGgsXG4gICAgICBicmVhZGNydW1iRG9tOiBiYyA/IHsgaGlkZGVuOiBiYy5oaWRkZW4sIGxhYmVsOiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0dGEtZmlsdGVyLWJyZWFkY3J1bWItbGFiZWxcIikgfHwge30pLnRleHRDb250ZW50IH0gOiBudWxsXG4gICAgfTtcbiAgfTtcblxuICBpbml0KCk7XG59KSgpO1xuIiwgInZlcnNpb24iOiAiMmY4ZTcyMTRmZmMxIn0=