@sbb-esta/lyne-elements-experimental-dev 4.12.1-dev.1778136194 → 4.12.1-dev.1778146180
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +240 -240
- package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +1 -1
- package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +1 -1
- package/development/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.js +1 -1
- package/development/autocomplete-grid-cell.component-BxkWGaX0.js +1 -1
- package/development/autocomplete-grid-option.component-5mPGswUO.js +1 -1
- package/development/autocomplete-grid-row.component-DEm6zyHZ.js +1 -1
- package/development/core/timetable/access-leg-helper.js +1 -1
- package/development/core/timetable/timetable-helper.js +1 -1
- package/development/date-helper-qNdwgC9O.js +1 -1
- package/development/differenceInMinutes-B7_GTDq7.js +1 -1
- package/development/format-DFx4997p.js +1 -1
- package/development/isValid-JpZ7FphI.js +1 -1
- package/development/journey-summary.component-BZwgD4im.js +1 -1
- package/development/mapper-hWWm7Uke.js +1 -1
- package/development/pearl-chain-time.component-B2_BI6E_.js +1 -1
- package/development/pearl-chain-vertical-item.component-D4clzjjQ.js +1 -1
- package/development/pearl-chain-vertical.component-CpcNFl-x.js +1 -1
- package/development/pearl-chain.component-oQZUzsyW.js +1 -1
- package/development/seat-reservation/common/translations/i18n.js +1 -1
- package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +1 -1
- package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +1 -1
- package/development/seat-reservation-area.component-BWdrKqek.js +1 -1
- package/development/seat-reservation-graphic.component-CN5sWn0I.js +1 -1
- package/development/seat-reservation-navigation-coach.component-tDZkXl-3.js +1 -1
- package/development/seat-reservation-navigation-services.component-CGel7__P.js +1 -1
- package/development/seat-reservation-place-control.component-CM9efId7.js +1 -1
- package/development/seat-reservation-scoped.component-CFA_bJ3o.js +1 -1
- package/development/seat-reservation.component-44IHFFlM.js +1 -1
- package/development/timetable-duration.component-BhFlqYbV.js +1 -1
- package/development/timetable-row.component-Dko8laRT.js +1 -1
- package/development/toDate-DOFAOjP-.js +1 -1
- package/package.json +2 -2
|
@@ -1458,4 +1458,4 @@ var SeatReservationBaseElement = (() => {
|
|
|
1458
1458
|
//#endregion
|
|
1459
1459
|
export { SeatReservationBaseElement };
|
|
1460
1460
|
|
|
1461
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9hMTF5LmpzJztcbmltcG9ydCB7IFNiYkVsZW1lbnQgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2Jhc2UtZWxlbWVudHMuanMnO1xuaW1wb3J0IHsgZm9yY2VUeXBlIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGlzU2VydmVyLCB0eXBlIFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGV2ZW50T3B0aW9ucywgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQge1xuICBtYXBDb2FjaEluZm9zVG9Db2FjaFNlbGVjdGlvbixcbiAgbWFwSWNvblRvU3ZnLFxuICBtYXBQbGFjZUFuZENvYWNoVG9TZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbixcbiAgbWFwUGxhY2VJbmZvc1RvUGxhY2VTZWxlY3Rpb24sXG59IGZyb20gJy4uL2NvbW1vbi9tYXBwZXIudHMnO1xuaW1wb3J0IHR5cGUge1xuICBCYXNlRWxlbWVudCxcbiAgQ29hY2hJdGVtLFxuICBDb2FjaE51bWJlck9mRnJlZVBsYWNlcyxcbiAgRWxlbWVudERpbWVuc2lvbixcbiAgRWxlbWVudE1vdW50aW5nLFxuICBFbGVtZW50UG9zaXRpb24sXG4gIENvYWNoSXRlbURldGFpbHMsXG4gIFBsYWNlLFxuICBQbGFjZVNlbGVjdGlvbixcbiAgUGxhY2VUcmF2ZWxDbGFzcyxcbiAgU2VhdFJlc2VydmF0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbixcbiAgU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaCxcbiAgU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMsXG4gIFRyYXZlbERpcmVjdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uL3R5cGVzLnRzJztcbmltcG9ydCB0eXBlIHsgU2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wuY29tcG9uZW50LnRzJztcblxuZW51bSBTY3JvbGxEaXJlY3Rpb24ge1xuICByaWdodCA9ICdyaWdodCcsXG4gIGxlZnQgPSAnbGVmdCcsXG59XG5cbmludGVyZmFjZSBDb2FjaFNjcm9sbFRyaWdnZXJQb2ludCB7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGVuZDogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU2VhdHJlc2VydmF0aW9uU3RydWN0dXJlIHtcbiAgZGVja3M6IFNlYXRyZXNlcnZhdGlvbkRlY2tbXTtcbn1cblxuaW50ZXJmYWNlIFNlYXRyZXNlcnZhdGlvbkRlY2sge1xuICBkZWNrSW5kZXg6IG51bWJlcjtcbiAgZGVja0NvYWNoZXM6IENvYWNoU3RydWN0dXJlW107XG59XG5cbmludGVyZmFjZSBDb2FjaFN0cnVjdHVyZSB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBhcmVhRWxlbWVudHM6IEJhc2VFbGVtZW50W107XG4gIHNlcnZpY2VFbGVtZW50czogQmFzZUVsZW1lbnRbXTtcbiAgb3RoZXJFbGVtZW50czogQmFzZUVsZW1lbnRbXTtcbiAgYm9yZGVyTWlkZGxlRWxlbWVudDogQmFzZUVsZW1lbnQ7XG4gIGhhc092ZXJoYW5naW5nRWxlbWVudHM6IGJvb2xlYW47XG59XG5cbmNvbnN0IE1BWF9TRVJWSUNFX1BST1BFUlRJRVMgPSAzO1xuY29uc3QgQUxMT1dFRF9TRVJWSUNFX0lDT05TOiBzdHJpbmdbXSA9IFtcbiAgJ3NhLXZvJyxcbiAgJ3NhLXJzJyxcbiAgJ3NhLWFidGVpbGtpbmRlcndhZ2VuJyxcbiAgJ3NhLXdyJyxcbiAgJ3NhLWZhJyxcbiAgJ3NhLWJ6JyxcbiAgJ3NhLXJ6Jyxcbl07XG5cbmV4cG9ydCBjbGFzcyBTZWF0UmVzZXJ2YXRpb25CYXNlRWxlbWVudCBleHRlbmRzIFNiYkVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGV2ZW50cyA9IHtcbiAgICBzZWxlY3RlZHBsYWNlczogJ3NlbGVjdGVkcGxhY2VzJyxcbiAgICBzZWxlY3RlZGNvYWNoOiAnc2VsZWN0ZWRjb2FjaCcsXG4gIH0gYXMgY29uc3Q7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9ucyBhcnJheSBjb250YWlucyBhbGwgY29hY2hlcyBhbmQgcGxhY2VzICovXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3NlYXQtcmVzZXJ2YXRpb25zJywgdHlwZTogQXJyYXkgfSlcbiAgcHVibGljIGFjY2Vzc29yIHNlYXRSZXNlcnZhdGlvbnM6IFNlYXRSZXNlcnZhdGlvbltdID0gbnVsbCE7XG5cbiAgLyoqIERpc3BsYXlzIGFuIGFycm93IHNob3dpbmcgd2hhdCBkaXJlY3Rpb24gZG9lcyB0cmFpbiBkcml2ZSovXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3RyYXZlbC1kaXJlY3Rpb24nLCB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIGFjY2Vzc29yIHRyYXZlbERpcmVjdGlvbjogVHJhdmVsRGlyZWN0aW9uID0gJ05PTkUnO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBuYXZpZ2F0aW9uIGNhbiBiZSB0b2dnbGVkIGJ5IHRoaXMgcHJvcGVydHkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2hhcy1uYXZpZ2F0aW9uJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaGFzTmF2aWdhdGlvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEgaXMgYWxpZ25lZCB2ZXJ0aWNhbGx5ICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdhbGlnbi12ZXJ0aWNhbCcsIHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUsIHVzZURlZmF1bHQ6IHRydWUgfSlcbiAgcHVibGljIGFjY2Vzc29yIGFsaWduVmVydGljYWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSdzIGJhc2UgZ3JpZCBzaXplICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdiYXNlLWdyaWQtc2l6ZScsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYmFzZUdyaWRTaXplOiBudW1iZXIgPSAxNjtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSdzIHdpZHRoICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdoZWlnaHQnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIGhlaWdodDogbnVtYmVyID0gbnVsbCE7XG5cbiAgLyoqIE1heGltYWwgbnVtYmVyIG9mIHBvc3NpYmxlIGNsaWNrYWJsZSBzZWF0cyAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnbWF4LXNlYXQtcmVzZXJ2YXRpb25zJywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBtYXhTZWF0UmVzZXJ2YXRpb25zOiBudW1iZXIgPSAtMTtcblxuICAvKiogTWF4aW1hbCBudW1iZXIgb2YgcG9zc2libGUgY2xpY2thYmxlIGJpY3ljbGUgcGxhY2VzICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdtYXgtYmljeWNsZS1yZXNlcnZhdGlvbnMnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIG1heEJpY3ljbGVSZXNlcnZhdGlvbnM6IG51bWJlciA9IC0xO1xuXG4gIC8qKiBBbnkgY2xpY2sgZnVuY3Rpb25hbGl0eSBpcyBwcmV2ZW50ZWQgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3ByZXZlbnQtcGxhY2UtY2xpY2snLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBwcmV2ZW50UGxhY2VDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdwcmVzZWxlY3QtY29hY2gtaW5kZXgnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIHByZXNlbGVjdENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiB0aXRsZSBpbmZvcm1hdGlvbiBhdCBwbGFjZS1jb250cm9scywgbmF2aWdhdGlvbi1jb2FjaGVzIGFuZCBuYXZpZ2F0aW9uLXNlcnZpY2VzIGNhbiBiZSB0b2dnbGVkIGJ5IHRoaXMgcHJvcGVydHkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3Nob3ctdGl0bGUtaW5mbycsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIHNob3dUaXRsZUluZm86IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3Igc2VsZWN0ZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGZvY3VzZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGhvdmVyZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcblxuICAvLyBEZXNjcmliZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGJvcmRlciBvZiB0aGUgY29hY2ggYW5kIHRoZSBwbGFjZXMgaW4gcGl4ZWxzXG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlclBhZGRpbmcgPSA2O1xuICAvLyBEZXNjcmliZXMgdGhlIGdhcCBiZXR3ZWVuIHRoZSBjb2FjaGVzIGluIHBpeGVsc1xuICBwcm90ZWN0ZWQgZ2FwQmV0d2VlbkNvYWNoZXMgPSA0O1xuICAvLyBUaGUgY2FsY3VsYXRlZCBjb2FjaEJvcmRlck9mZnNldCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiBjb2FjaCBib3JkZXIgZ3JhcGhpYyxcbiAgLy8gYnV0IGFsc28gdG8gcG9zaXRpb24gb3RoZXIgZ3JhcGhpY3MgdGhhdCBhcmUgYWxpZ25lZCBkaXJlY3RseSB0byB0aGUgY29hY2ggYm9yZGVyLlxuICBwcm90ZWN0ZWQgY29hY2hCb3JkZXJPZmZzZXQgPSB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAvIHRoaXMuYmFzZUdyaWRTaXplO1xuICAvLyBEZXNjcmliZXMgdGhlIGdhcCBiZXR3ZWVuIHRoZSBjb2FjaGVzIGRlY2tzIGJ5IG11bHRpcGxlIGRlY2sgdmlzdWFsaXphdGlvblxuICBwcm90ZWN0ZWQgZ2FwQmV0d2VlbkNvYWNoRGVja3MgPSA0ODtcbiAgLy8gRGVzY3JpYmVzIHRoZSBmaXggd2lkdGggb2YgY29hY2ggbmF2aWdhdGlvbiBidXR0b25cbiAgcHJvdGVjdGVkIGNvYWNoTmF2QnV0dG9uRGltOiBudW1iZXIgPSAwO1xuICAvLyBEZXNjcmliZXMgdGhlIGNhbGN1bGF0ZWQgZGltZW5zaW9uIGZvciB0aGUgYXJlYSBpY29ucywgd2hpY2ggaXMgdXNlZCB0byBzZXQgdGhlIG1heCB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBhcmVhIGljb25zXG4gIHByb3RlY3RlZCBnbG9iYWxBcmVhSWNvbkRpbTogRWxlbWVudERpbWVuc2lvbiA9IHsgdzogMiwgaDogMiB9O1xuICAvLyAjVElNTy00NTg1OFxuICAvLyBEZXNjcmliZXMgdGhlIHBhZGRpbmcgZm9yIHRoZSBpY29uIHdpdGhpbiB0aGUgYXJlYSBhcyBhIHBlcmNlbnRhZ2Ugc2l6ZSBvZiB0aGUgYXJlYSBzZWxmLiA4MCUgKDAuOCBwZXJjZW50KSBjb3JyZXNwb25kc1xuICAvLyB0byBhIGdvb2Qgb3B0aWNhbCBzaXplIGFuZCBjcmVhdGVzIGEgZ29vZCBwYWRkaW5nIGZyb20gdGhlIGFyZWEgdGkgaWNvblxuICBwcm90ZWN0ZWQgZ2xvYmFsQXJlYUljb25QYWRkaW5nOiBudW1iZXIgPSAwLjg7XG4gIHByb3RlY3RlZCBjb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHM6IENvYWNoSXRlbURldGFpbHNbXSA9IFtdO1xuICBwcm90ZWN0ZWQgY3VyclNjcm9sbERpcmVjdGlvbjogU2Nyb2xsRGlyZWN0aW9uID0gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0O1xuICBwcm90ZWN0ZWQgbWF4Q2FsY0NvYWNoZXNXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbENvYWNoZXNBcmVhV2lkdGg6IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCBzY3JvbGxOYXZpZ2F0aW9uQXJlYURpbTogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb246IENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50W10gPSBbXTtcbiAgcHJvdGVjdGVkIG5hdmlnYXRpb25TY3JvbGxBcmVhOiBIVE1MRWxlbWVudCA9IG51bGwhO1xuICBwcm90ZWN0ZWQgY29hY2hTY3JvbGxBcmVhOiBIVE1MRWxlbWVudCA9IG51bGwhO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkUGxhY2U6IFBsYWNlIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZERlY2tJbmRleDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM6IFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzID0ge1xuICAgIHNlYXRzOiBbXSxcbiAgICBiaWN5Y2xlczogW10sXG4gIH07XG4gIHByb3RlY3RlZCBzZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0NvYWNoR3JpZEZvY3VzYWJsZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaXNBdXRvU2Nyb2xsaW5nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0tleWJvYXJkTmF2aWdhdGlvbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaGFzTXVsdGlwbGVEZWNrcyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cyA9IHtcbiAgICBBcnJvd0xlZnQ6ICdBcnJvd0xlZnQnLFxuICAgIEFycm93UmlnaHQ6ICdBcnJvd1JpZ2h0JyxcbiAgICBBcnJvd1VwOiAnQXJyb3dVcCcsXG4gICAgQXJyb3dEb3duOiAnQXJyb3dEb3duJyxcbiAgICBUYWI6ICdUYWInLFxuICAgIEVudGVyOiAnRW50ZXInLFxuICB9IGFzIGNvbnN0O1xuXG4gIHByb3RlY3RlZCBzZWF0UmVzZXJ2YXRpb25TdHJ1Y3R1cmU6IFNlYXRyZXNlcnZhdGlvblN0cnVjdHVyZSA9IHtcbiAgICBkZWNrczogW10sXG4gIH07XG5cbiAgLy8gQXJlYSBpY29ucyB0aGF0IHNob3VsZCBub3QgYmUgZml4ZWQgZHVyaW5nIHJvdGF0aW9uIHdoZW4gdmVydGljYWwgbW9kZSBpcyBzZWxlY3RlZFxuICBwcm90ZWN0ZWQgbm90Rml4ZWRSb3RhdGFibGVBcmVhSWNvbnMgPSBbJ0VOVFJZX0VYSVQnXTtcblxuICAvLyBHcmFwaGljcyB0aGF0IHNob3VsZCBub3QgYmUgcmVuZGVyZWQgd2l0aCBhbiBhcmVhXG4gIHByb3RlY3RlZCBub3RBcmVhRWxlbWVudHMgPSBbXG4gICAgJ0RSSVZFUl9BUkVBJyxcbiAgICAnRFJJVkVSX0FSRUFfTk9fVkVSVElDQUxfV0FMTCcsXG4gICAgJ0NPQUNIX1BBU1NBR0UnLFxuICAgICdDT0FDSF9XQUxMX05PX1BBU1NBR0UnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFJyxcbiAgICAnQ09NUEFSVE1FTlRfUEFTU0FHRV9ISUdIJyxcbiAgICAnQ09NUEFSVE1FTlRfUEFTU0FHRV9NSURETEUnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX0xPVycsXG4gICAgJ0NPTVBBUlRNRU5UX1dBTEwnLFxuICBdO1xuXG4gIC8vIEdyYXBoaWNzIHRoYXQgc2hvdWxkIG5vdCBiZSByZW5kZXJlZCB3aXRoIGFuIGFyZWFcbiAgcHJvdGVjdGVkIG1pZGRsZUJvcmRlckRvY2tpbmdFbGVtZW50cyA9IFtcbiAgICAnRFJJVkVSX0FSRUEnLFxuICAgICdEUklWRVJfQVJFQV9OT19WRVJUSUNBTF9XQUxMJyxcbiAgICAnQ09BQ0hfUEFTU0FHRScsXG4gICAgJ0NPQUNIX1dBTExfTk9fUEFTU0FHRScsXG4gIF07XG5cbiAgcHJpdmF0ZSBfaXNSdW5uaW5nSW5pdFByZXNlbGVjdENvYWNoSW5kZXggPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2Nyb2xsVGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2xhc3RTdGFydFNjcm9sbFBvcyA9IC0xO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIC8vIEFkZCBibHVyIGV2ZW50IGxpc3RlbmVyIG9uIHRoZSBlbnRpcmUgY29tcG9uZW50IHRvIGRldGVjdCB3aGVuIHRoZSB1c2VyIGxlYXZlcyB0aGUgY29tcG9uZW50XG4gICAgLy8gYnkgdXNpbmcgdGFiIG5hdmlnYXRpb24gb3IgY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgY29tcG9uZW50LiBJbiB0aGlzIGNhc2UsIHdlIGNhbiByZXNldCB0aGUgc2VsZWN0ZWQgY29hY2ggYW5kIHBsYWNlLlxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHRoaXMuX29uTGVhdmVTZWF0UmVzZXJ2YXRpb25Db21wb25lbnQoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3NlYXRSZXNlcnZhdGlvbnMnKSkge1xuICAgICAgdGhpcy5oYXNNdWx0aXBsZURlY2tzID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zPy5sZW5ndGggPiAxO1xuXG4gICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgIHRoaXMuX2luaXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbigpO1xuICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdiYXNlR3JpZFNpemUnKSkge1xuICAgICAgdGhpcy5jb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmlkLXNpemUnLCBgJHt0aGlzLmJhc2VHcmlkU2l6ZX1weGApO1xuICAgICAgdGhpcy5faW5pdFByZXBhcmVTZWF0UmVzZXJ2YXRpb25EYXRhKCk7XG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBoZWlnaHQgaXMgdXNlZCwgdGhlIGJhc2VHcmlkU2l6ZSBtdXN0IGJlIHJlY2FsY3VsYXRlZFxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2hlaWdodCcpICYmICEhdGhpcy5oZWlnaHQpIHtcbiAgICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvbkxheWVyID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XSB8fCBudWxsO1xuICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvbkxheWVyPy5jb2FjaEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmJhc2VHcmlkU2l6ZSA9IHRoaXMuaGVpZ2h0IC8gc2VhdFJlc2VydmF0aW9uTGF5ZXIuY29hY2hJdGVtc1swXS5kaW1lbnNpb24uaDtcbiAgICAgICAgdGhpcy5jb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyaWQtc2l6ZScsIGAke3RoaXMuYmFzZUdyaWRTaXplfXB4YCk7XG5cbiAgICAgICAgdGhpcy5faW5pdFByZXBhcmVTZWF0UmVzZXJ2YXRpb25EYXRhKCk7XG4gICAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnYWxpZ25WZXJ0aWNhbCcpKSB7XG4gICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygncHJlc2VsZWN0Q29hY2hJbmRleCcpKSB7XG4gICAgICAvLyBzZXRUaW1lb3V0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdpdGhvdXQsIF9nZXRDb2FjaFNjcm9sbFBvc2l0aW9uWCgpIHdvdWxkIGZhaWwgd2l0aCBOUEUgYmVjYXVzZVxuICAgICAgLy8gdGhlIGNvYWNoU2Nyb2xsQXJlYSBpcyBub3QgeWV0IGluaXRpYWxpemVkXG4gICAgICB0aGlzLl9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHRoaXMucHJlc2VsZWN0Q29hY2hJbmRleCksIDEpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBuYXZpZ2F0ZUJ5RGlyZWN0aW9uQnRuKGJ0bkRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgbGV0IG5hdmlnYXRlVG9Db2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuICAgIGlmIChidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9MRUZUJyAmJiBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA+IDApIHtcbiAgICAgIG5hdmlnYXRlVG9Db2FjaEluZGV4ID1cbiAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICE9IC0xID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4IC0gMSA6IDA7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJyAmJlxuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPFxuICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdPy5jb2FjaEl0ZW1zLmxlbmd0aCAtIDFcbiAgICApIHtcbiAgICAgIG5hdmlnYXRlVG9Db2FjaEluZGV4ID1cbiAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICE9IC0xID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgMSA6IDA7XG4gICAgfVxuXG4gICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2gobmF2aWdhdGVUb0NvYWNoSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERhdGEgY2FuIGJlIHByZXBhcmVkIG9uY2UgZm9yIHRoZSBlbnRpcmUgY29tcG9uZW50XG4gICAqIGluIG9yZGVyIHRvIGF2b2lkIHJlY3VycmluZyBpdGVyYXRpb24gcHJvY2Vzc2VzIGluIHJlbmRlcmluZy5cbiAgICovXG4gIHByaXZhdGUgX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXRlcm1pbmVCYXNlRm9udFNpemUoKTtcblxuICAgIGlmICh0aGlzLmhhc011bHRpcGxlRGVja3MpIHtcbiAgICAgIC8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBkZWNrcywgd2UgbmVlZCB0byBjaGVja1xuICAgICAgLy8gd2hldGhlciBlbXB0eSBjb2FjaGVzIG5lZWQgdG8gYmUgYWRkZWQgb24gZGlmZmVyZW50IGRlY2sgbGV2ZWxzXG4gICAgICB0aGlzLl9pbml0RW1wdHlDb2FjaERlY2tPZmZzZXRzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJlcGFyZUNvYWNoSXRlbURldGFpbHNEYXRhKCk7XG4gICAgdGhpcy5fcHJlcGFyZVNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZUluZm9ybWF0aW9uKCk7XG4gICAgdGhpcy5fcHJlcGFyZU9wdGltaXplQXJlYUljb25EaW1lbnNpb25CeU1lZGlhbigpO1xuICB9XG5cbiAgLyoqIEluaXQgc2Nyb2xsIGV2ZW50IGhhbmRsaW5nIGZvciBjb2FjaCBuYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCBpbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnI3NiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhJyxcbiAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgIHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnI3NiYi1zcl9fbmF2aWdhdGlvbi1saXN0LWNvYWNoZXMnLFxuICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25EZWNrID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zXG4gICAgICA/IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF1cbiAgICAgIDogbnVsbDtcbiAgICBpZiAoc2VhdFJlc2VydmF0aW9uRGVjayAmJiBzZWF0UmVzZXJ2YXRpb25EZWNrLmNvYWNoSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2FsY3VsYXRlcyB0aGUgYWJzb2x1dGUgaGVpZ2h0IG9mIG9uZSBjb2FjaCBpbmNsdWRpbmcgYm9yZGVyIHBhZGRpbmdcbiAgICAgIGNvbnN0IGNvYWNoSGVpZ2h0V2l0aEJvcmRlclBhZGRpbmcgPVxuICAgICAgICBzZWF0UmVzZXJ2YXRpb25EZWNrLmNvYWNoSXRlbXNbMF0uZGltZW5zaW9uLmggKiB0aGlzLmJhc2VHcmlkU2l6ZSArIHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgZWFjaCBnYXAgYmV0d2VlbiBtdWx0aXBsZSBjb2FjaCB0aGUgZGVja3MuXG4gICAgICAvLyBObyBnYXAgZXhpc3QgaWYganVzdCBvbmUgY29hY2ggZGVjayBleGlzdC5cbiAgICAgIGNvbnN0IGdhcEJldHdlZW5Db2FjaERlY2tzID0gKHRoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxKSAqIHRoaXMuZ2FwQmV0d2VlbkNvYWNoRGVja3M7XG5cbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1oZWlnaHQnLFxuICAgICAgICBgJHtjb2FjaEhlaWdodFdpdGhCb3JkZXJQYWRkaW5nICogdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCArIGdhcEJldHdlZW5Db2FjaERlY2tzfWAsXG4gICAgICApO1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZGVja3MnLCBgJHt0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RofWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhKSB7XG4gICAgICB0aGlzLnNjcm9sbE5hdmlnYXRpb25BcmVhRGltID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgID8gdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgICAgOiB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG4gICAgICAvLyBJbml0IHRoZSBjb2FjaE5hdkJ1dHRvbkRpbSBkaW1lbnNpb24sIHdoaWNoIGlzIG5lZWRlZCB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3Qgc2Nyb2xsIG5hdmlnYXRpb24gbGF0ZXJcbiAgICAgIGNvbnN0IG5hdkNvYWNoZXNMaXN0ID0gdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYS5xdWVyeVNlbGVjdG9yKCd1bCA+IGxpJykgYXMgSFRNTFVMaXN0RWxlbWVudDtcbiAgICAgIGlmIChuYXZDb2FjaGVzTGlzdCkge1xuICAgICAgICBjb25zdCBmaXJzdExpRWxlRGltZW5zaW9uID0gbmF2Q29hY2hlc0xpc3Q/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLmNvYWNoTmF2QnV0dG9uRGltID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgPyBmaXJzdExpRWxlRGltZW5zaW9uLmhlaWdodFxuICAgICAgICAgIDogZmlyc3RMaUVsZURpbWVuc2lvbi53aWR0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb2FjaFNjcm9sbEFyZWEgJiYgc2VhdFJlc2VydmF0aW9uRGVjaykge1xuICAgICAgLy8gSW5pdCB0aGUgc3RhcnQgb2Zmc2V0IGZvciB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGNvYWNoIHNjcm9sbCB0cmlnZ2VyIHBvc2l0aW9uc1xuICAgICAgbGV0IGN1cnJDYWxjVHJpZ2dlclBvcyA9IDA7XG4gICAgICB0aGlzLnNjcm9sbENvYWNoZXNBcmVhV2lkdGggPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgICAgOiB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgLy8gUHJlY2FsY3VsYXRlIHRyaWdnZXIgc2Nyb2xsIHBvc2l0aW9uIGFycmF5IGRlcGVuZHMgb24gY29hY2ggd2lkdGhcbiAgICAgIHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvbiA9IHNlYXRSZXNlcnZhdGlvbkRlY2suY29hY2hJdGVtcy5tYXAoKF8sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvYWNoU3RydWN0dXJlID1cbiAgICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZS5kZWNrc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uZGVja0NvYWNoZXNbaW5kZXhdO1xuICAgICAgICBjb25zdCBzdGFydFBvc1ggPSBjdXJyQ2FsY1RyaWdnZXJQb3M7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRpb24gb2YgdGhlIGVuZCBzY3JvbGwgdHJpZ2dlciBwb3NpdGlvbiBvZiBhIGNvYWNoLCBpbmNsdWRpbmcgdGhlIGdhcCBiZXR3ZWVuIHRoZSBjb2FjaGVzXG4gICAgICAgIC8vIFRoZSBnYXAgaXMgbWF5YmUgYWRqdXN0ZWQgaWYgb3ZlcmhhbmdpbmcgcGxhY2VzIG9yIGdyYXBoaWNzIGV4aXN0XG4gICAgICAgIGN1cnJDYWxjVHJpZ2dlclBvcyArPVxuICAgICAgICAgIGNvYWNoU3RydWN0dXJlLndpZHRoICtcbiAgICAgICAgICAoIWNvYWNoU3RydWN0dXJlLmhhc092ZXJoYW5naW5nRWxlbWVudHNcbiAgICAgICAgICAgID8gdGhpcy5nYXBCZXR3ZWVuQ29hY2hlc1xuICAgICAgICAgICAgOiAyICogdGhpcy5nYXBCZXR3ZWVuQ29hY2hlcyk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGFydDogc3RhcnRQb3NYLFxuICAgICAgICAgIGVuZDogY3VyckNhbGNUcmlnZ2VyUG9zLFxuICAgICAgICAgIHdpZHRoOiBjb2FjaFN0cnVjdHVyZS53aWR0aCxcbiAgICAgICAgfSBhcyBDb2FjaFNjcm9sbFRyaWdnZXJQb2ludDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgbWF4aW11bSBjYWxjdWxhdGVkIGNvYWNoIHdpZHRoXG4gICAgICB0aGlzLm1heENhbGNDb2FjaGVzV2lkdGggPSBjdXJyQ2FsY1RyaWdnZXJQb3MgLSB0aGlzLmdhcEJldHdlZW5Db2FjaGVzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGwgZXZlbnQgaGFuZGxlciBtYW5hZ2VkIHRoZSBlbmQgb2Ygc2Nyb2xsaW5nIGluc2lkZSB0aGUgY29hY2ggc2Nyb2xsIGFyZWEuXG4gICAqIFRpbWVvdXQgZXZlbnQgaGFuZGxpbmcgdG8gY2hlY2sgaWYgdGhlIHNjcm9sbGluZyBoYXMgYmVlbiBjb21wbGV0ZWQuXG4gICAqIEl0IGlzIHJlcXVpcmVkIGJlY2F1c2UgdGhlIFNhZmFyaSBicm93c2VyIGRvZXMgbm90IGhhbmRsZSBzY3JvbGxlbmQgZXZlbnQsXG4gICAqIGFuZCB3ZSB0aGVyZWZvcmUgaW1pdGF0ZSB0aGlzIGV2ZW50IC0+IHNjcm9sbGVuZC5cbiAgICovXG4gIEBldmVudE9wdGlvbnMoeyBwYXNzaXZlOiB0cnVlIH0pXG4gIHByb3RlY3RlZCBjb2FjaEFyZWFTY3JvbGxlbmQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Njcm9sbFRpbWVvdXQpIHtcbiAgICAgIC8vIEZpcnN0LCB3ZSBjbGVhcmVkIHRoZSByZWdpc3RlcmVkIHRpbWVvdXQsIGFzIHRoZSBzY3JvbGxpbmcgaXMgc3RpbGwgcnVubmluZ1xuICAgICAgLy8gYW5kIHRodXMgd2UgcHJldmVudCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBfaGFuZGxlQ29hY2hBcmVhU2Nyb2xsZW5kRXZlbnQgZnVuY3Rpb25cbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zY3JvbGxUaW1lb3V0KTtcbiAgICB9XG4gICAgLy8gSWYgbm8gZnVydGhlciBzY3JvbGwgZXZlbnQgaXMgZmlyZWQsIHRoZSBuZXh0IHRpbWVvdXQgY2FuIGV4ZWN1dGUgdGhlIGlubmVyIGZ1bmN0aW9uIF9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCB3aXRob3V0IGNsZWFyaW5nXG4gICAgdGhpcy5fc2Nyb2xsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5faGFuZGxlQ29hY2hBcmVhU2Nyb2xsZW5kRXZlbnQoKSwgMTUwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBubyBuYXZpZ2F0aW9uIGV4aXN0cyAocHJvcGVydHkgc2V0dGluZyAtPiBoYXNOYXZpZ2F0aW9uKSBhbmQgYSB0YWJsZSBjb2FjaCBnZXRzIHRoZSBmb2N1cyxcbiAgICogdGhlIGZpcnN0IHBsYWNlIGluIHRoZSBjb2FjaCBtdXN0IGJlIGF1dG9tYXRpY2FsbHkgcHJlc2VsZWN0ZWQgdG8gY29udHJvbCB0aGUgcGxhY2UgbmF2aWdhdGlvbiB2aWEga2V5Ym9hcmRcbiAgICpcbiAgICogQHBhcmFtIGZvY3VzQ29hY2hJbmRleFxuICAgKi9cbiAgcHJvdGVjdGVkIG9uRm9jdXNUYWJsZUNvYWNoQW5kUHJlc2VsZWN0UGxhY2UoZm9jdXNDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyAmJiAhdGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgZm9jdXNDb2FjaEluZGV4ID09PSAwXG4gICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KC0xKVxuICAgICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChmb2N1c0NvYWNoSW5kZXgpO1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICB9XG4gIH1cblxuICAvKiogV2lsbCBiZSB0cmlnZ2VyZWQgYnkgZm9jdXMgbmF2aWdhdGlvbiBkaXJlY3Rpb24gKi9cbiAgcHJvdGVjdGVkIG9uRm9jdXNOYXZEaXJlY3Rpb25CdXR0b24oKTogdm9pZCB7XG4gICAgLy8gSWYgYW55IG5hdmlnYXRpb24gZGlyZWN0aW9uIGJ1dHRvbiAocmlnaHR8bGVmdCkgZ2V0IHRoZSBmb2N1cywgc28gd2UgaGF2ZSBtYW51YWwgcmVzZXQgdGhlIHByZXZpb3VzIGZvY3VzQ29hY2hJbmRleC5cbiAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gIH1cblxuICAvKiogVEFCIEtleSBFdmVudCBoYW5kbGluZyBmb3IgQ29hY2ggTmF2aWdhdGlvbiAqL1xuICBwcm90ZWN0ZWQgb25LZXlOYXZpZ2F0aW9uTmF2Q29hY2hCdXR0b24oXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsXG4gICAgY3Vyck5hdkNvYWNoQnV0dG9uSW5kZXg6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiKSB7XG4gICAgICB0aGlzLl9oYW5kbGVUYWJLZXlOYXZpZ2F0aW9uKGV2ZW50LCAnbmF2aWdhdGlvbicsIGN1cnJOYXZDb2FjaEJ1dHRvbkluZGV4KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBCeSB1c2luZyBhbnkgb3RoZXIga2V5IChubyBUQUIpIGluc2lkZSB0aGUgTmF2aWdhdGlvbiBhcmVhLCBzbyB3ZSBjYW4gaGFuZGxlIHRoaXMgYnkgdXNpbmcgdGhlIGxvZ2ljIGZyb20ga2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZ1xuICAgIGlmIChpc0Fycm93S2V5T3JQYWdlS2V5c1ByZXNzZWQoZXZlbnQpKSB7XG4gICAgICB0aGlzLmtleWJvYXJkU2VhdG1hcEV2ZW50SGFuZGxpbmcoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBHZW5lcmFsIFRBQiBLZXkgRXZlbnQgaGFuZGxpbmcgZm9yIHRhYiBuYXZpZ2F0aW9uIGluc2lkZSB0aGUgY29hY2ggbmF2aWdhdGlvbiBhcmVhIGFuZCB0aGUgc2VhdG1hcCBhcmVhICovXG4gIHByaXZhdGUgX2hhbmRsZVRhYktleU5hdmlnYXRpb24oXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsXG4gICAgZXZlbnRBcmVhOiBzdHJpbmcsXG4gICAgY3VyclRhYkluZGV4PzogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwcmVzc2VkS2V5ID0gZXZlbnQua2V5O1xuICAgIGNvbnN0IHByZXNzZWRTaGlmdFRhYiA9IGV2ZW50LnNoaWZ0S2V5O1xuXG4gICAgaWYgKHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLlRhYikge1xuICAgICAgLy8gSGFuZGxlIFRBQiBrZXkgZXZlbnQgbmF2aWdhdGlvbiBmb3IgY29hY2ggbmF2aWdhdGlvbiBhcmVhLlxuICAgICAgLy8gRnByIGNvYWNoIG5hdmlnYXRpb24gd2UganVzdCBjb250cm9sIHRoZSBmb2N1cyBpbmRleCB0byB2aXN1YWxpemUgZm9jdXMgc3R5bGUgZm9yIG5hdiBjb2FjaCBidXR0b25cbiAgICAgIGlmIChldmVudEFyZWEgPT0gJ25hdmlnYXRpb24nKSB7XG4gICAgICAgIGlmIChjdXJyVGFiSW5kZXggPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuY3VyclNlbGVjdGVkUGxhY2UgfHxcbiAgICAgICAgICAgICFwcmVzc2VkU2hpZnRUYWIgfHxcbiAgICAgICAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzW2N1cnJUYWJJbmRleF0uaXNEcml2ZXJBcmVhIHx8XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID09IC0xXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gY3VyclRhYkluZGV4O1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJlc3NlZFNoaWZ0VGFiICYmIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UpIHtcbiAgICAgICAgICAgIC8vSWYgdGhlIEZvciBiYWNrIHRhYmJpbmcsIHdlIGp1bXBcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyVGFiSW5kZXghO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZE5hdmlnYXRpb25CdXR0b24oY3VyclRhYkluZGV4ISk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgVEFCIGtleSBldmVudCBuYXZpZ2F0aW9uIGZvciBzZWF0bWFwIGFyZWFcbiAgICAgIGVsc2UgaWYgKGV2ZW50QXJlYSA9PSAnc2VhdG1hcCcpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHByZXNzZWRTaGlmdFRhYikge1xuICAgICAgICAgIHRoaXMuX25hdmlnYXRlQ29hY2hOYXZpZ2F0aW9uQnlLZXlib2FyZCgnUFJFVl9UQUInKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZUNvYWNoTmF2aWdhdGlvbkJ5S2V5Ym9hcmQoJ05FWFRfVEFCJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzYXRpb24gb2YgS2V5Ym9hcmQgU2VhdG1hcCBldmVudCBoYW5kbGluZyB0byBuYXZpZ2F0aW9uIGJldHdlZW4gZWFjaCBwbGFjZXMgaW5zaWRlIGEgc2VsZWN0ZWQgY29hY2ggYnkgdXNpbmcgW2Fycm93XSBrZXlzLlxuICAgKiBXaXRoIHRoZSBbVEFCXSBrZXkgdGhlIHVzZXIgbmF2aWdhdGlvbiBnb2VzIHRvIHRoZSBuZXh0IGNvYWNoIG5hdmlnYXRpb24gZWxlbWVudCBhbmQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZSBpcyBhdXRvbWF0aWNhbGx5IHJlc2V0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGtleWJvYXJkU2VhdG1hcEV2ZW50SGFuZGxpbmcoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpc1RhYk5leHQgPSBldmVudC5rZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLlRhYjtcbiAgICBjb25zdCBpc1RhYlByZXYgPSBldmVudC5zaGlmdEtleSAmJiBpc1RhYk5leHQ7XG5cbiAgICAvLyBJZiBubyBuYXZpZ2F0aW9uIGV4aXN0IGFuZCB0aGUgZmlyc3Qgb3IgbGFzdCBjb2FjaCBpcyBzZWxlY3RlZCwgdGhlIHRoZSB1c2UgdHJpZXMgdG8gbGVhdmUgdGhlIHNlYXQgcmVzZXJ2YXRpb24gY29tcG9uZW50IGJ5IHVzaW5nIHRhYixcbiAgICAvLyBzbyB3ZSBjYW4gcmV0dXJuIGhlcmUgYW5kIGFsbG93IHRoZSBuYXRpdmUgZm9jdXMgdG8gbGVhdmUgdGhlIGNvbXBvbmVudC5cbiAgICBpZiAoXG4gICAgICAoIXRoaXMuaGFzTmF2aWdhdGlvbiAmJiB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IDAgJiYgaXNUYWJQcmV2KSB8fFxuICAgICAgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubGVuZ3RoIC0gMSAmJiBpc1RhYk5leHQpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJlc3NlZEtleSA9IGV2ZW50LmtleTtcbiAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IGZhbHNlO1xuICAgIC8vIENoZWNrIGFueSBrZXlib2FyZCBldmVudCB3YXMgdHJpZ2dlcmVkIGluc2lkZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQsXG4gICAgLy8gc28gd2UgY2FuIHNheSB0aGUgbmF0aXZlIGJyb3dzZXIgZm9jdXMgbGllcyBvbiB0aGUgY29tcG9uZW50XG4gICAgaWYgKCF0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzICYmIChpc1RhYk5leHQgfHwgaXNUYWJQcmV2KSkge1xuICAgICAgdGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gSWYgYW55IHBsYWNlIGlzIHNlbGVjdGVkIGFuZCBUQUIgS2V5IGNvbWJpbmF0aW9uIGlzdCBwcmVzc2VkLFxuICAgIC8vIHRoZW4gd2UgaGFuZGxlIHRoZSBuZXh0IG9yIHByZXZpb3VzIGNvYWNoIHNlbGVjdGlvblxuICAgIGlmIChpc1RhYk5leHQpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVRhYktleU5hdmlnYXRpb24oZXZlbnQsICdzZWF0bWFwJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQXJyb3cgS2V5Ym9hcmQgbmF2aWdhdGlvbiB0byBjb250cm9sIHBsYWNlcyBpbnNpZGUgdGhlIHNlYXRtYXBcbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICE9PSAtMSAmJiBpc0Fycm93S2V5T3JQYWdlS2V5c1ByZXNzZWQoZXZlbnQpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBzd2l0Y2ggKHByZXNzZWRLZXkpIHtcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZExlZnRLZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd25cbiAgICAgICAgICAgICAgOiBwcmVzc2VkS2V5O1xuICAgICAgICAgICAgdGhpcy5fbmF2aWdhdGVUb1BsYWNlQnlLZXlib2FyZChwcmVzc2VkTGVmdEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRSaWdodEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXBcbiAgICAgICAgICAgICAgOiBwcmVzc2VkS2V5O1xuICAgICAgICAgICAgdGhpcy5fbmF2aWdhdGVUb1BsYWNlQnlLZXlib2FyZChwcmVzc2VkUmlnaHRLZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkVXBLZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnRcbiAgICAgICAgICAgICAgOiBwcmVzc2VkS2V5O1xuICAgICAgICAgICAgdGhpcy5fbmF2aWdhdGVUb1BsYWNlQnlLZXlib2FyZChwcmVzc2VkVXBLZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWREb3duS2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWREb3duS2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIGEgcGxhY2UgaW5zaWRlIHRoZSBjb2FjaCBpZiBuYXZpZ2F0ZWQgdmlhIGtleWJvYXJkLFxuICAgKiBvdGhlcndpc2UgdGhlIGNvYWNoIGdyaWQgaXMgc2VsZWN0ZWQgKG5lY2Vzc2FyeSBmb3IgU2NyZWVuUmVhZGVyKVxuICAgKi9cbiAgcHJvdGVjdGVkIHByZXNlbGVjdFBsYWNlSW5Db2FjaCgpOiB2b2lkIHtcbiAgICAvLyBObyBwcmVzZWxlY3QgcGxhY2UgYnkgbWFudWFsIHNlYXRtYXAgc2Nyb2xsaW5nXG4gICAgaWYgKCF0aGlzLmlzQXV0b1Njcm9sbGluZykgcmV0dXJuO1xuXG4gICAgLy8gTm8gYXV0byBwbGFjZSBwcmVzZWxlY3Rpb24gYnkgcnVubmluZyB0aGUgcHJlc2VsZWN0IGNvYWNoIGluZGV4XG4gICAgaWYgKHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLl9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciBEcml2ZXJBcmVhIG9yIEVtcHR5IGNvYWNoIChubyBwbGFjZXMpLCBubyBwbGFjZSBpcyBzZWxlY3RhYmxlLCBzbyB3ZSByZXR1cm4gZGlyZWN0bHlcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdICYmXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLmlzRHJpdmVyQXJlYVxuICAgICkge1xuICAgICAgdGhpcy5fc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT25seSB3aGVuIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCBhbmQgY29hY2hlcyBhcmUgc2Nyb2xsZWQgYnkgYXV0byBzY3JvbGxpbmcsXG4gICAgLy8gdGhlbiB3ZSBjYW4gc2V0IHRoZSBmb2N1cyBvbiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoLlxuICAgIGlmICh0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uICYmIHRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICBjb25zdCBjbG9zZXN0UGxhY2UgPSB0aGlzLl9nZXRDbG9zZXN0UGxhY2VCeUtleURpcmVjdGlvbigpO1xuICAgICAgLy9JZiBjbG9zZXN0UGxhY2UgZXhpc3QsIHdlIGhhdmUgdG8gdW5mb2N1cyBwcmV2aW91cyBmb2N1c2VkIHBsYWNlXG4gICAgICBpZiAoY2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KGNsb3Nlc3RQbGFjZSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIGEgY29hY2ggd2FzIHNlbGVjdGVkIHdpdGggbm8gcGxhY2VzLCB0aGVuIHdlIGhhdmUgdG8gZm9jdXMgdGhlIGNvYWNoR3JpZFxuICAgICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSW4gY2FzZXMgd2hlcmUgdGhlIHByZXNlbGVjdGlvbiBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgYnkgbm9ybWFsIGNsaWNraW5nIG9yIHZpYSBzY3JlZW4gcmVhZGVyIHZpYSB0YWIsXG4gICAgLy8gd2Ugb25seSBmb2N1cyB0aGUgdGFibGUgd2l0aG91dCBkaXJlY3RseSBmb2N1c2luZyB0aGUgcGxhY2UuXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcblxuICAgICAgdGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5faXNWYWxpZENvYWNoSW5kZXgoc2VsZWN0ZWROYXZDb2FjaEluZGV4KSAmJlxuICAgICAgc2VsZWN0ZWROYXZDb2FjaEluZGV4ICE9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICApIHtcbiAgICAgIHRoaXMuaG92ZXJlZENvYWNoSW5kZXggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXg7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IHRydWU7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleDtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gdGhpcy5fZ2V0RXhpc3RpbmdDb2FjaERlY2tJbmRleCgpO1xuICAgICAgdGhpcy5fc2V0U2Nyb2xsRGlyZWN0aW9uQnlDb2FjaEluZGV4KCk7XG5cbiAgICAgIGNvbnN0IHNjcm9sbFRvQ29hY2hQb3NYID0gdGhpcy5fZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTtcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWRDb2FjaEluZGV4U2Nyb2xsYWJsZSA9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ICE9PSAtMSB8fCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPiAwO1xuXG4gICAgICAvLyBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gYWxsb3dzIHNjcm9sbGluZyB0byB0aGUgbmV4dCB3YWdvbiBvciBub3RcbiAgICAgIGlmIChpc1NlbGVjdGVkQ29hY2hJbmRleFNjcm9sbGFibGUgJiYgdGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgICAgdGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICAgICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogdGhpcy5hbGlnblZlcnRpY2FsID8gc2Nyb2xsVG9Db2FjaFBvc1ggOiAwLFxuICAgICAgICAgIGxlZnQ6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IDAgOiBzY3JvbGxUb0NvYWNoUG9zWCxcbiAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBBdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBzZWxlY3RlZCBjb2FjaCBpbiB0aGUgbWFpbiBuYXZpZ2F0aW9uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihzZWxlY3RlZE5hdkNvYWNoSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBmb2N1c1BsYWNlRWxlbWVudChwbGFjZTogUGxhY2UgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgaWYgKHBsYWNlKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gcGxhY2U7XG4gICAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgICAgaWYgKHNlbGVjdGVkUGxhY2VFbGVtZW50KSB7XG4gICAgICAgIHNlbGVjdGVkUGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgna2V5Zm9jdXMnLCAnZm9jdXMnKTtcblxuICAgICAgICAvL1RyeSB0byBzY3JvbGwgZm9jdXNlZCBwbGFjZSBpbnRvIHRoZSB2aWV3cG9ydFxuICAgICAgICBjb25zdCBkZWxheVNjcm9sbEluVmlld3BvcnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBwbGFjZUlkID0gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4LFxuICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgICAgICAgcGxhY2UubnVtYmVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0KHBsYWNlSWQpO1xuICAgICAgICAgIGNsZWFyVGltZW91dChkZWxheVNjcm9sbEluVmlld3BvcnQpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdW5mb2N1c1BsYWNlRWxlbWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICBpZiAoc2VsZWN0ZWRQbGFjZUVsZW1lbnQpIHtcbiAgICAgIHNlbGVjdGVkUGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgna2V5Zm9jdXMnLCAndW5mb2N1cycpO1xuICAgICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQobnVsbCk7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihcbiAgICBlbGVtZW50RGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoRGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBpc09yaWdpbkhlaWdodD86IGJvb2xlYW4sXG4gICAgaXNTdHJldGNoSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudERpbWVuc2lvbiB7XG4gICAgaWYgKGNvYWNoRGltZW5zaW9uICYmICFpc09yaWdpbkhlaWdodCkge1xuICAgICAgLy8gU2luY2UgdGhlIGhlaWdodCBvZiB0aGUgY29hY2ggaGFzIGJlZW4gdmlzdWFsbHkgZXhwYW5kZWQgdG8gbWFpbnRhaW4gYSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3JkZXIgb2YgdGhlIGNvYWNoIGFuZCB0aGUgcGxhY2VzLFxuICAgICAgLy8gc29tZSBncmFwaGljcyBtdXN0IGFsc28gYmUgYWRhcHRlZCB0byB0aGUgaGVpZ2h0LCB3aGljaCBlbmQgd2l0aCB0aGUgYm9yZGVycyBvZiB0aGUgY29hY2hcbiAgICAgIGVsZW1lbnREaW1lbnNpb24uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogMjtcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJldGNoSGVpZ2h0KSB7XG4gICAgICAvLyBJbiB0aGUgY2FzZSBvZiBncmFwaGljcyBhcmUgYXNzaWduZWQgZGlyZWN0bHkgYXQgdGhlIGJvcmRlciBvZiB0aGUgY29hY2gsXG4gICAgICAvLyB0aGVzZSBncmFwaGljcyBtdXN0IGJlIGV4cGFuZGVkIGluIGhlaWdodCBieSBhIGNvYWNoQm9yZGVyT2Zmc2V0IGluIG9yZGVyIHRvIHJlYWNoIHRoZWlyIG9yaWdpbmFsIHZpc3VhbCBwb3NpdGlvblxuICAgICAgZWxlbWVudERpbWVuc2lvbi5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHc6IE1hdGgucm91bmQodGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50RGltZW5zaW9uLncpLFxuICAgICAgaDogTWF0aC5yb3VuZCh0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnREaW1lbnNpb24uaCksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkUG9zaXRpb24oXG4gICAgZWxlbWVudFBvc2l0aW9uOiBFbGVtZW50UG9zaXRpb24sXG4gICAgZWxlbWVudERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudFBvc2l0aW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgZWxlbWVudERpbWVuc2lvbikge1xuICAgICAgY29uc3QgZW5kUG9zSGVpZ2h0ID0gaXNPcmlnaW5IZWlnaHRcbiAgICAgICAgPyBjb2FjaERpbWVuc2lvbi5oXG4gICAgICAgIDogY29hY2hEaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICAvLyBJZiB0aGUgb3JpZ2luYWwgZWxlbWVudCBpcyBwb3NpdGlvbmVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSBjb2FjaCwgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgWSBjb29yZGluYXRlIHdpdGggdGhlIGFkZGl0aW9uYWwgYm9yZGVyIHBhZGRpbmdcbiAgICAgIGlmIChlbGVtZW50UG9zaXRpb24ueSA9PT0gMCkge1xuICAgICAgICBlbGVtZW50UG9zaXRpb24ueSAtPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50UG9zaXRpb24ueSArIGVsZW1lbnREaW1lbnNpb24uaCA9PT0gZW5kUG9zSGVpZ2h0KSB7XG4gICAgICAgIGVsZW1lbnRQb3NpdGlvbi55ICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IE1hdGgucm91bmQodGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueCksXG4gICAgICB5OiBNYXRoLnJvdW5kKHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudFBvc2l0aW9uLnkpLFxuICAgICAgejogZWxlbWVudFBvc2l0aW9uLnosXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZXRlY3RzIGlmIGEgKGdyYXBoaWNhbCkgZWxlbWVudCBpcyBvbiB0aGUgYm9yZGVyIHdpdGggaXRzIHBvc2l0aW9uICh1cHBlciBvciBsb3dlciBib3JkZXIpLlxuICAgKiBAcGFyYW0gYmFzZUVsZW1lbnRcbiAgICogQHBhcmFtIGNvYWNoRGltZW5zaW9uXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBpc0VsZW1lbnREaXJlY3RseU9uQm9yZGVyKFxuICAgIGJhc2VFbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICBjb2FjaERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGJhc2VFbGVtZW50LnBvc2l0aW9uLnkgPT09IDAgfHxcbiAgICAgIGJhc2VFbGVtZW50LnBvc2l0aW9uLnkgKyBiYXNlRWxlbWVudC5kaW1lbnNpb24uaCA9PT0gY29hY2hEaW1lbnNpb24uaFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ291bnRzIGFsbCBhdmFpbGFibGUgc2VhdHMgdG9nZXRoZXIgZGVwZW5kaW5nIG9uIHRoZSBzZWF0IHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHBsYWNlc1xuICAgKiBAcmV0dXJucyBBbiBPYmplY3Qgd2l0aCBjb3VudCBvZiBmcmVlIHNlYXRzIGFuZCBmcmVlIGJpY3ljbGUgcGxhY2VzXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChcbiAgICBwbGFjZXM6IFBsYWNlW10gfCB1bmRlZmluZWQsXG4gICk6IENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzIHtcbiAgICBjb25zdCBhY2N1bXVsYXRvcjogQ29hY2hOdW1iZXJPZkZyZWVQbGFjZXMgPSB7IHNlYXRzOiAwLCBiaWN5Y2xlczogMCB9O1xuICAgIGNvbnN0IGZyZWVQbGFjZXMgPSBwbGFjZXM/LnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJQbGFjZTogUGxhY2UpID0+IHtcbiAgICAgIGlmIChjdXJyUGxhY2Uuc3RhdGUgIT09ICdGUkVFJykge1xuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgICB9XG4gICAgICAvLyBDb3VudCB1cCBkZXBlbmRpbmcgb24gc2VhdCB0eXBlXG4gICAgICBpZiAoY3VyclBsYWNlLnR5cGUgPT09ICdTRUFUJykge1xuICAgICAgICBhY2N1bXVsYXRvci5zZWF0cysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWNjdW11bGF0b3IuYmljeWNsZXMrKztcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9LCBhY2N1bXVsYXRvcik7XG4gICAgcmV0dXJuIGZyZWVQbGFjZXMgPyBmcmVlUGxhY2VzIDogYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQXQgdGhlIGVuZCBvZiBhIHNjcm9sbCBFdmVudCBmcm9tIHRoZSBjb2FjaCBzY3JvbGxhYmxlIGFyZWEsXG4gICAqIHRoZSByZWFjaGVkIGNvYWNoIGlzIG1hcmtlZCBhcyBzZWxlY3RlZFxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQ29hY2hBcmVhU2Nyb2xsZW5kRXZlbnQoKTogdm9pZCB7XG4gICAgY29uc3QgZmluZFNjcm9sbENvYWNoSW5kZXggPSB0aGlzLmlzQXV0b1Njcm9sbGluZ1xuICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgIDogdGhpcy5fZ2V0Q29hY2hJbmRleEJ5U2Nyb2xsVHJpZ2dlclBvc2l0aW9uKCk7XG5cbiAgICAvLyBUSU1PLTQzNzA1XG4gICAgLy8gSWYgYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYnkgbW91c2UgY2xpY2sgKHByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljaykgYmVmb3JlIHRyaWdnZXJpbmcgdGhpcyBzY3JvbGxlbmQgbWV0aG9kLFxuICAgIC8vIHRoZW4gdGhpcyBzY3JvbGxpbmcgd2FzIHRyaWdnZXJlZCBieSB0aGUgbWV0aG9kIF9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQsIGFuZCBpdCBpcyBvbmx5IGEgcGxhY2UgYWRqdXN0bWVudCBzY3JvbGwgKHNjcm9sbEludG9WaWV3KSxcbiAgICAvLyB3aGVyZSBhIGxlc3MgdmlzaWJsZSBwbGFjZSBoYXMgYmVlbiBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC4gSW4gY2FzZSBvZiBhIHBsYWNlIGFkanVzdG1lbnQgYnkgY2xpY2ssIHdlIGNhbiByZXR1cm4gaGVyZS5cbiAgICBpZiAodGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2spIHtcbiAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGVuZHNjcm9sbGluZyBpcyBqdXN0IGEgcGxhY2UgYWRqdXN0bWVudCBzY3JvbGxpbmcgKHBsYWNlIGhhcyAyIGdyaWQgc2l6ZSB1bml0cylcbiAgICAgIGNvbnN0IGlzQ29hY2hTY3JvbGxpbmcgPVxuICAgICAgICBNYXRoLmFicyh0aGlzLl9sYXN0U3RhcnRTY3JvbGxQb3MgLSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0KSA+XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplICogMjtcbiAgICAgIGlmIChpc0NvYWNoU2Nyb2xsaW5nKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcblxuICAgIC8vIEFmdGVyIGNvYWNoIHNjcm9sbGVuZCBldmVudCB3ZSBjYW4gcmVzZXQgdGhlIGhvdmVyZWQgY29hY2ggaW5kZXhcbiAgICB0aGlzLmhvdmVyZWRDb2FjaEluZGV4ID0gLTE7XG5cbiAgICAvLyBJbiBjYXNlIHRoZSB1c2VyIHVzZXMgdGhlIHNjcm9sbGJhciB3aXRob3V0IGludGVyYWN0aW5nIHdpdGggdGhlIHNlYXQgcmVzZXJ2YXRpb24sXG4gICAgLy8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpbmRleCBpcyAtMSwgYW5kIHdlIGhhdmUgdG8gc2V0IHRoaXMgdmFsdWUgd2l0aCBmaW5kU2Nyb2xsQ29hY2hJbmRleC5cbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSAtMSkge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgZmluZFNjcm9sbENvYWNoSW5kZXggPCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgIDogZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzQXV0b1Njcm9sbGluZykge1xuICAgICAgLy9XaGVuIHVzZXIgaXMgc2Nyb2xsaW5nIHZpYSBzY3JvbGxiYXIsIGl0IGF1dG9tYXRpY2FsbHkgc2Nyb2xscyB0byB0aGUgZm9jdXNlZCBjb2FjaCBpbiB0aGUgbWFpbiBuYXZpZ2F0aW9uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihmaW5kU2Nyb2xsQ29hY2hJbmRleCk7XG4gICAgfVxuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuXG4gICAgaWYgKCF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhbiBhdXRvbWF0aWMgbWFpbiBuYXZpZ2F0aW9uIHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIHNlbGVjdGVkTmF2Q29hY2hJbmRleC5cbiAgICogQ2FsY3VsYXRlcyB0aGUgY2VudHJhbCBzY3JvbGwgb2Zmc2V0IG9mIHRoZSBuYXYgY29hY2ggdG8gYmUgc2VsZWN0ZWQuXG4gICAqIEBwYXJhbSBzZWxlY3RlZE5hdkNvYWNoSW5kZXhcbiAgICovXG4gIHByaXZhdGUgX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy9UaW1lIGRlbGF5IHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBvdGhlciBleGVjdXRpbmcgY2FsbGluZyBzY3JvbGxUbyBmdW5jdGlvbnMgKGNvYWNoZXMgc2Nyb2xsaW5nKVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbiAmJiB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhKSB7XG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25BcmVhQ2VudGVyZWRQb3NYID0gdGhpcy5zY3JvbGxOYXZpZ2F0aW9uQXJlYURpbSAvIDI7XG4gICAgICAgIGNvbnN0IHNjcm9sbEJ1dHRvbk9mZnNldFggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXggKiB0aGlzLmNvYWNoTmF2QnV0dG9uRGltO1xuICAgICAgICBjb25zdCBzY3JvbGxPZmZzZXRYID1cbiAgICAgICAgICBzY3JvbGxCdXR0b25PZmZzZXRYIC0gbmF2aWdhdGlvbkFyZWFDZW50ZXJlZFBvc1ggKyB0aGlzLmNvYWNoTmF2QnV0dG9uRGltO1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLnNjcm9sbFRvKHtcbiAgICAgICAgICB0b3A6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IHNjcm9sbE9mZnNldFggOiAwLFxuICAgICAgICAgIGxlZnQ6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IDAgOiBzY3JvbGxPZmZzZXRYLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgMTApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG5ldyBTY3JvbGxEaXJlY3Rpb24gYnkgdGhlIG5ldyBnaXZlbiB0YXJnZXQgY29hY2ggaW5kZXguXG4gICAqL1xuICBwcml2YXRlIF9zZXRTY3JvbGxEaXJlY3Rpb25CeUNvYWNoSW5kZXgoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID1cbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA+IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgID8gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0XG4gICAgICAgIDogU2Nyb2xsRGlyZWN0aW9uLmxlZnQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2Nyb2xsIHN0YXJ0IG9yIGVuZCBwb3NpdGlvbiBYIGZyb20gdGhlIHNlbGVjdGVkIGNvYWNoLlxuICAgKiBJbiBjYXNlIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBuYXZpZ2F0aW5nIHRocm91Z2ggcGxhY2VzIGJ5IGtleWJvYXJkIGFuZCBnb2VzIHRvIHByZXZpb3VzIGNvYWNoLFxuICAgKiB0aGVuIHdlIHJldHVybiB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBjb2FjaCB0byBnZXQgdGhlIGNsb3Nlc3Qgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGZvY3VzIHBsYWNlLlxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCk6IG51bWJlciB7XG4gICAgY29uc3QgY29hY2hUcmlnZ2VyUG9pbnQgPSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBpc0ZvY3VzUGxhY2VGcm9tUHJldmlvdXNDb2FjaFBvc2l0aW9uID1cbiAgICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gJiZcbiAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgIGNvYWNoVHJpZ2dlclBvaW50LndpZHRoID4gdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoO1xuXG4gICAgcmV0dXJuIGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb25cbiAgICAgID8gY29hY2hUcmlnZ2VyUG9pbnQuZW5kIC0gdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoXG4gICAgICA6IGNvYWNoVHJpZ2dlclBvaW50LnN0YXJ0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZvY3VzIG9uIHRoZSBIVE1MIHRhYmxlIChncmlkKSBjYXB0aW9uIGVsZW1lbnQgc28gdGhhdCB0aGUgaGVhZGluZyBpcyByZWFkIG91dCB3aGVuIHVzaW5nIGEgU2NyZWVuUmVhZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk6IHZvaWQge1xuICAgIC8vIFdoZW4gdGhlIHVzZXIgcGVyZm9ybXMgYW4gYWN0aW9uIHRoYXQgYWZmZWN0cyB0aGUgY29hY2ggbmF2aWdhdGlvbiwgdGhlbiB0aGUgbmF2aWdhdGVkIHRhYmxlIGlzIGZvY3VzYWJsZS5cbiAgICBpZiAodGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSAmJiB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzKSB7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgICBjb25zdCBjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcjc2JiLXNyLWNvYWNoLWNhcHRpb24tJyArIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICkgYXMgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ7XG4gICAgICBpZiAoY29hY2hUYWJsZUNhcHRpb25FbGVtZW50KSB7XG4gICAgICAgIGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2Nyb2xsZWQgcG9zaXRpb24gY2FuIGJlIHVzZWQgdG8gc2Nyb2xsIHRvIHRoZSBzZWxlY3RlZCB3YWdvblxuICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAqL1xuICBwcml2YXRlIF9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VyclNjcm9sbFBvc1ggPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgID8gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG9wXG4gICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG4gICAgY29uc3QgY29hY2hTY3JvbGxXaW5kb3dXaWR0aCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3QgbWF4U2Nyb2xsV2lkdGhBcmVhID0gdGhpcy5tYXhDYWxjQ29hY2hlc1dpZHRoIC0gY29hY2hTY3JvbGxXaW5kb3dXaWR0aDtcbiAgICBjb25zdCBjdXJyQ29hY2hUcmlnZ2VyID0gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgaXNTY3JvbGxQb3NTYW1lVG9DdXJyQ29hY2hQb3MgPVxuICAgICAgY3VyclNjcm9sbFBvc1ggPT09IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLnN0YXJ0O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIChjdXJyU2Nyb2xsUG9zWCA8IG1heFNjcm9sbFdpZHRoQXJlYSB8fCBjdXJyU2Nyb2xsUG9zWCA+IGN1cnJDb2FjaFRyaWdnZXIuc3RhcnQpICYmXG4gICAgICAhaXNTY3JvbGxQb3NTYW1lVG9DdXJyQ29hY2hQb3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvYWNoIGluZGV4IHdoaWNoIGlzIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSBzY3JvbGwgYXJlYVxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoSW5kZXhCeVNjcm9sbFRyaWdnZXJQb3NpdGlvbigpOiBudW1iZXIge1xuICAgIGNvbnN0IHNjcm9sbFBvcyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUb3BcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCBzY3JvbGxPZmZzZXRYID0gc2Nyb2xsUG9zICsgdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoIC8gMjtcbiAgICByZXR1cm4gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uLmZpbmRJbmRleChcbiAgICAgIChjb2FjaFRyaWdnZXIpID0+IHNjcm9sbE9mZnNldFggPj0gY29hY2hUcmlnZ2VyLnN0YXJ0ICYmIHNjcm9sbE9mZnNldFggPD0gY29hY2hUcmlnZ2VyLmVuZCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlyc3QgcGxhY2Ugb2YgY3VycmVudCBzZWxlY3RlZCBjb2FjaCBieSB0YWJsZSBjZWxsIGNvb3JkaW5hdGUgMC0wIGlkLlxuICAgKiBAcmV0dXJucyBQbGFjZSBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRGaXJzdFBsYWNlSW5TZWxlY3RlZENvYWNoKCk6IFBsYWNlIHwgbnVsbCB7XG4gICAgbGV0IGZpcnN0UGxhY2U6IFBsYWNlIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY29hY2ggPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgZmlyc3RDZWxsSWQgPVxuICAgICAgJ2NlbGwtJyArIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgJy0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgJy0wLTAnO1xuICAgIGNvbnN0IHBsYWNlTnVtYmVyID1cbiAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+KCcjJyArIGZpcnN0Q2VsbElkKVxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8U2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudD4oJ3NiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wnKVxuICAgICAgICA/LmdldEF0dHJpYnV0ZSgndGV4dCcpIHx8IG51bGw7XG5cbiAgICBpZiAoY29hY2ggJiYgcGxhY2VOdW1iZXIpIHtcbiAgICAgIGZpcnN0UGxhY2UgPSBjb2FjaC5wbGFjZXM/LmZpbmQoKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT09IHBsYWNlTnVtYmVyKSB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmlyc3RQbGFjZTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgcHJlc3NlZEtleTogc3RyaW5nLFxuICAgIGNvYWNoOiBDb2FjaEl0ZW0sXG4gICk6IG51bWJlciB8IG51bGwge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlIHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0IHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnRcbiAgICApXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggRE9XTlxuICAgIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93biAmJlxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ICsgMiA9PT0gY29hY2guZGltZW5zaW9uLmggJiZcbiAgICAgICEhdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgMV1cbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCArIDE7XG4gICAgfVxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggVVBcbiAgICBlbHNlIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueSA9PT0gMCAmJlxuICAgICAgISF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggLSAxXVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4IC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVG8gZ2V0IHRoZSBjb3JyZWN0IGNsb3Nlc3QgcGxhY2Ugb2YgY3VycmVudCBwcmVzc2VkIGtleSBhbmQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcGxhY2UsXG4gICAqIHdlIGhhdmUgdG8gaW52ZXN0aWdhdGUgdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggcGxhY2UgdG8gZmluZCB0aGUgY2xvc2VzdCBwbGFjZSBvZiB0aGUgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQuXG4gICAqIEBwYXJhbSBwcmVzc2VkS2V5XG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKHByZXNzZWRLZXk/OiBzdHJpbmcpOiBQbGFjZSB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoID1cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGxldCBjbG9zZXN0UGxhY2UgPSBudWxsO1xuICAgIGxldCBjb2FjaFBsYWNlcyA9IGNvYWNoLnBsYWNlcztcbiAgICBsZXQgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA9IG51bGw7XG5cbiAgICBpZiAoY29hY2hQbGFjZXMpIHtcbiAgICAgIC8vIElmIG5vIHBsYWNlIHNldCwgdGhlbiB3ZSB1c2UgaW5pdGlhbCB0aGUgbGVmdC10b3AgcGxhY2Ugb24gdGhlIGNvYWNoXG4gICAgICBpZiAoIXRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEZpcnN0UGxhY2VJblNlbGVjdGVkQ29hY2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICAgICAgY29uc3QgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbiA9IHsgLi4udGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbiB9O1xuXG4gICAgICAgICAgaWYgKHByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCB0byBzd2l0Y2ggdG8gYW5vdGhlciBjb2FjaCBkZWNrIChVcCAtPiBEb3duIHwgRG93biAtPiBVcCkuXG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHRha2UgdGhlIGNvYWNoIHBsYWNlcyB3ZSBoYXZlIHRvIGNoZWNrZWQgZnJvbSB0aGUgdGFyZ2V0IGRlY2sgbm93LlxuICAgICAgICAgICAgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA9IHRoaXMuX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgICAgICAgICAgIHByZXNzZWRLZXksXG4gICAgICAgICAgICAgIGNvYWNoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChzd2l0Y2hlZENvYWNoRGVja0luZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIEFzc2lnbiBjaGVjayBwbGFjZXMgZnJvbSB0aGUgdGFyZ2V0IHN3aXRjaCBkZWNrXG4gICAgICAgICAgICAgIGNvYWNoUGxhY2VzID1cbiAgICAgICAgICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbc3dpdGNoZWRDb2FjaERlY2tJbmRleF0uY29hY2hJdGVtc1tcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgICAgICAgIF0ucGxhY2VzIHx8IFtdO1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHVwZGF0ZSB5IGNvb3JkaW5hdGVcbiAgICAgICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ID1cbiAgICAgICAgICAgICAgICBzd2l0Y2hlZENvYWNoRGVja0luZGV4IDwgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPyBjb2FjaC5kaW1lbnNpb24uaCA6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3QgcGxhY2Ugb2YgY29hY2hQbGFjZXMpIHtcbiAgICAgICAgICAgIC8vIElmIG5vIGtleSBwcmVzc2VkLCB0aGVuIHdlIHRyeSB0byBmaW5kIHRoZSBwbGFjZSBvZiB0aGUgY3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uXG4gICAgICAgICAgICBpZiAoIXByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgICAgLy8gRmluZCBwbGFjZSBmcm9tIHRoZSBsZWZ0IHNpZGUgb2YgY29hY2ggYnkgeSBjb29yZGluYXRlLiBDdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb24gaXMgUklHSFRcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvL0ZpbmQgcGxhY2UgZnJvbSB0aGUgcmlnaHQgc2lkZSBvZiBjb2FjaCBieSB5IGNvb3JkaW5hdGUuIEN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvbiBpcyBMRUZUXG4gICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocGxhY2UubnVtYmVyICE9PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlPy5udW1iZXIpIHtcbiAgICAgICAgICAgICAgICAvL0tleSBbUmlnaHRdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeC1heGlzIHRvIGdldCB0aGUgc21hbGxlc3QgbGFyZ2VyIHggcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA+IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vS2V5IFtEb3duXSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHktYXhpcyB0byBnZXQgdGhlIHNtYWxsZXN0IGxhcmdlciB5IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCArIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID4gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi55IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLnkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW0xlZnRdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeC1heGlzIHRvIGdldCB0aGUgZ3JlYXRlc3Qgc21hbGxlciB4IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0ICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSArIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54IDwgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW1VwXSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHktYXhpcyB0byBnZXQgdGhlIGdyZWF0ZXN0IHNtYWxsZXIgeSBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IC0gMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPCBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIGEgcGxhY2UgaGFzIGJlZW4gZm91bmQgaW4gdGhlIGNoYW5naW5nIHN3aXRjaCBjb2FjaCxcbiAgICAgICAgICAvLyB3ZSBjYW4gdXBkYXRlIHRoZSBjdXJyU2VsZWN0ZWREZWNrSW5kZXhcbiAgICAgICAgICBpZiAoc3dpdGNoZWRDb2FjaERlY2tJbmRleCAhPT0gbnVsbCAmJiBjbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gc3dpdGNoZWRDb2FjaERlY2tJbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsb3Nlc3RQbGFjZTtcbiAgfVxuXG4gIC8vIEhhbmRsaW5nIGZvciBUYWIgbmF2aWdhdGlvbiBpZiBhIHBsYWNlIGlzIHNlbGVjdGVkIGluc2lkZSB0aGUgY29hY2guXG4gIC8vIFRoaXMgY29udHJvbHMgdGhlIGZvY3VzZWQgY29hY2ggZnJvbSB0aGUgY3VycmVudCBzZWxlY3RlZCBjb2FjaC5cbiAgcHJpdmF0ZSBfbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKHRhYkRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VyckZvY3VzSW5kZXggPVxuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9PT0gLTFcbiAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IC0xXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgOiB0aGlzLmZvY3VzZWRDb2FjaEluZGV4O1xuXG4gICAgLy8gQ2hlY2sgbmV4dCBvciBwcmV2IHRhYiBpcyBwcmVzc2VkLCB0aGVuIHdlIG5lZWQgdG8gZmluZCB0aGUgbmV4dCBhdmFpbGFibGUgY29hY2ggaW5kZXggdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgZm9jdXNcbiAgICBjb25zdCBuZXdGb2N1c2FibGVJbmRleDogbnVtYmVyID1cbiAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJ1xuICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoY3VyckZvY3VzSW5kZXgpXG4gICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyRm9jdXNJbmRleCk7XG5cbiAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICAgIGNvbnN0IHBsYWNlSW5Db2FjaEhhc0ZvY3VzID0gc2VsZWN0ZWRQbGFjZUVsZW1lbnRcbiAgICAgICAgPyBzZWxlY3RlZFBsYWNlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJykgPT09ICdmb2N1cydcbiAgICAgICAgOiBmYWxzZTtcblxuICAgICAgLy8gSWYgd2UgdGFiIGJhY2sgKFBSRVZfVEFCKSBhbmQgdGhlIGZvY3VzIGlzIGN1cnJlbnRseSBvbiBwbGFjZSxcbiAgICAgIC8vIHdlIHJlbW92ZSB0aGUgc2VsZWN0ZWQgc3RhdGUgZnJvbSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5hdmlnYXRpb24gY29hY2ggYW5kIG9ubHkgc2V0IHRoZSBmb2N1cyBzdGF0dXMgdG8gaXRcbiAgICAgIGlmICh0YWJEaXJlY3Rpb24gPT09ICdQUkVWX1RBQicgJiYgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPT09IGN1cnJGb2N1c0luZGV4KSB7XG4gICAgICAgIC8vIElmIHdlIFRBQiBiYWNrIGFuZCBoYXZlIGEgc2VsZWN0ZWQgcGxhY2VzIGluc2lkZSB0aGUgY3VycmVudCBjb2FjaCwgdGhlbiB3ZSBtb3ZlIG91dCBmcm9tIHRoZSBzZWF0bWFwIGFuZCBzZXQgdGhlIGZvY3VzIHRvIHRoZSBjdXJyZW50IHNlbGVjdGVkIGNvYWNoXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cyB8fCB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJGb2N1c0luZGV4O1xuICAgICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBmaXJzdCBjb2FjaCBpcyBzZWxlY3RlZCBhbmQgd2UgVEFCIGJhY2ssIHdlIGhhdmUgdG8gc2V0IHRoZSBuYXRpdmUgZm9jdXMgb24gdGhlIGZpcnN0IGNvYWNoIGluIHRoZSBuYXZpZ2F0aW9uIHRvIGdldCBiYWNrIHRvIHRoZSBub3JtYWwgdGFiIG5hdmlnYXRpb24uXG4gICAgICAgIC8vIFRvIGRvIHRoaXMsIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBmb2N1c2VkSW5kZXggZnJvbSB0aGUgZmlyc3QgY29hY2ggYW5kIHNldCBpdCBhZ2FpbiBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgICAgIGVsc2UgaWYgKGN1cnJGb2N1c0luZGV4ID09PSAwKSB7XG4gICAgICAgICAgLy8gUmVmb2N1cyB0aGUgZmlyc3QgY29hY2hcbiAgICAgICAgICB0aGlzLl9yZWZvY3VzQ3VycmVudEZvY3VzZWROYXZDb2FjaChjdXJyRm9jdXNJbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBPbmx5IHNldHMgdGhlIGZvY3VzIG9uIHRoZSBuZXcgbmF2aWdhdGlvbiBjb2FjaFxuICAgICAgZWxzZSBpZiAobmV3Rm9jdXNhYmxlSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICB9XG4gICAgICAvLyBXaGVuIHRoZSBsYXN0IGNvYWNoIGlzIHNlbGVjdGVkIGFuZCB3ZSBUQUIsIHdlIGhhdmUgdG8gc2V0IHRoZSBuYXRpdmUgZm9jdXMgb24gdGhlIGxhc3QgY29hY2ggaW4gdGhlIG5hdmlnYXRpb24gdG8gZ2V0IGJhY2sgdG8gdGhlIG5vcm1hbCB0YWIgbmF2aWdhdGlvbi5cbiAgICAgIC8vIFRvIGRvIHRoaXMsIHdlIGhhdmUgIHRvIHJlbW92ZSB0aGUgZm9jdXNlZEluZGV4IGZyb20gdGhlIGZpcnN0IGNvYWNoIGFuZCBzZXQgaXQgYWdhaW4gYWZ0ZXIgYSBzaG9ydCBkZWxheVxuICAgICAgZWxzZSBpZiAoXG4gICAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJyAmJlxuICAgICAgICBuZXdGb2N1c2FibGVJbmRleCA9PT0gdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubGVuZ3RoIC0gMVxuICAgICAgKSB7XG4gICAgICAgIC8vIFJlZm9jdXMgdGhlIGxhc3QgY29hY2hcbiAgICAgICAgdGhpcy5fcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goY3VyckZvY3VzSW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICAvLyBJZiBhbnkgcGxhY2Ugd2FzIGZvY3VzZWQgaW4gY29hY2gsIHNvIHdlIHNldCBmb2N1c2VkIGFnYWluXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cykge1xuICAgICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm8gcGxhY2Ugd2FzIHNlbGVjdGVkLCB0aGVuIHdlIHNlbGVjdCB0aGUgY29hY2ggZ3JpZFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCeSBUYWIgTmF2aWdhdGlvbiwgcGVyZm9ybSBhdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBmb2N1c2VkIHdhZ29uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QsIHdlIHNjcm9sbCBkaXJlY3RseSB0byB0aGUgbmV4dCB0YWJhYmxlIGNvYWNoXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVmb2N1c2VkIHRoZSBjdXJyZW50IGZvY3VzZWQgKHZpc3VhbCkgbmF2IGNvYWNoIHRvIGdldCB0aGUgbmF0aXZlIGZvY3VzIGJhY2sgdG8gdGhlIG5hdmlnYXRpb25cbiAgcHJpdmF0ZSBfcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goZm9jdXNJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBmb2N1c0luZGV4KSwgMCk7XG4gIH1cblxuICBwcml2YXRlIF9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZlbnRQbGFjZUNsaWNrKSB7XG4gICAgICBjb25zdCBmaW5kQ2xvc2VzdFBsYWNlID0gdGhpcy5fZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24ocHJlc3NlZEtleSk7XG5cbiAgICAgIGlmIChmaW5kQ2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoZmluZENsb3Nlc3RQbGFjZSk7XG4gICAgICB9XG4gICAgICAvLyBObyBjbG9zZXN0IHBsYWNlIGZvdW5kIGJ5IGtleSBuYXZpZ2F0aW9uXG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgfHxcbiAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgfHxcbiAgICAgICAgICAodGhpcy5hbGlnblZlcnRpY2FsICYmXG4gICAgICAgICAgICAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCB8fFxuICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24pKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDaGVjayB0aGUgY3VycmVudCBwcmVzc2VkIGtleSB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIGNvYWNoIGluZGV4XG4gICAgICAgICAgY29uc3QgbmV3U2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHRcbiAgICAgICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KClcbiAgICAgICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KCk7XG5cbiAgICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdTZWxlY3RlZENvYWNoSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICAgPyBzdGFydEluZGV4ICsgMVxuICAgICAgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPiAwID8gc3RhcnRJbmRleCAtIDEgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHBsYWNlVHlwZVByb3AgPSBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/ICdzZWF0cycgOiAnYmljeWNsZXMnO1xuICAgIGNvbnN0IG1heFJlc2VydmF0aW9ucyA9XG4gICAgICBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/IHRoaXMubWF4U2VhdFJlc2VydmF0aW9ucyA6IHRoaXMubWF4QmljeWNsZVJlc2VydmF0aW9ucztcbiAgICBjb25zdCBjdXJyU2VsZWN0ZWRQbGFjZXMgPSB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzW3BsYWNlVHlwZVByb3BdO1xuXG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1twbGFjZVR5cGVQcm9wXSA9IHRoaXMuX3VwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKFxuICAgICAgY3VyclNlbGVjdGVkUGxhY2VzLFxuICAgICAgbWF4UmVzZXJ2YXRpb25zLFxuICAgICAgcGxhY2VTZWxlY3Rpb24sXG4gICAgKTtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Q3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXM+fVxuICAgICAqIEVtaXRzIHdoZW4gYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYW5kIHJldHVybnMgYSBQbGFjZSBhcnJheSB3aXRoIGFsbCBzZWxlY3RlZCBwbGFjZXMuXG4gICAgICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzPignc2VsZWN0ZWRwbGFjZXMnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMoXG4gICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10sXG4gICAgbWF4UmVzZXJ2YXRpb25zOiBudW1iZXIsXG4gICAgcGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdIHtcbiAgICAvLyBBZGQgc2VsZWN0ZWQgcGxhY2UgdG8gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNcbiAgICBpZiAocGxhY2VTZWxlY3Rpb24uc3RhdGUgPT09ICdTRUxFQ1RFRCcpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VEZWNrSW5kZXggPSB0aGlzLl9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgIHBsYWNlU2VsZWN0aW9uLFxuICAgICAgICBzZWxlY3RlZFBsYWNlRGVja0luZGV4LFxuICAgICAgKTtcbiAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pIHtcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMucHVzaChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgcGxhY2UgZnJvbSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGVsc2Uge1xuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5maWx0ZXIoXG4gICAgICAgIChfc2VsZWN0ZWRQbGFjZSkgPT4gX3NlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gQ2hlY2tzIHdoZXRoZXIgbWF4UmVzZXJ2YXRpb24gaXMgYWN0aXZhdGVkIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0ZWQgcGxhY2VzIGlzIHJlYWNoZWRcbiAgICBpZiAobWF4UmVzZXJ2YXRpb25zID4gLTEgJiYgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMubGVuZ3RoID4gbWF4UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCByZXNldFdpdGhQbGFjZVNlbGVjdGlvbiA9IG1heFJlc2VydmF0aW9ucyA+IDAgPyBwbGFjZVNlbGVjdGlvbiA6IHVuZGVmaW5lZDtcblxuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSB0aGlzLl9yZXNldEFsbFBsYWNlU2VsZWN0aW9ucyhcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICAgIHJlc2V0V2l0aFBsYWNlU2VsZWN0aW9uLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZFBsYWNlSW5Db2FjaChwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBwbGFjZURlY2tJbmRleCA9IHRoaXMuX2dldERlY2tJbmRleEJ5UGxhY2VJZChwbGFjZVNlbGVjdGlvbi5pZCk7XG4gICAgY29uc3QgY29hY2hJbmRleCA9IHBsYWNlU2VsZWN0aW9uLmNvYWNoSW5kZXg7XG5cbiAgICBpZiAocGxhY2VEZWNrSW5kZXggPT09IG51bGwpIHJldHVybjtcblxuICAgIGNvbnN0IHBsYWNlID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3BsYWNlRGVja0luZGV4XS5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdLnBsYWNlcz8uZmluZChcbiAgICAgIChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09IHBsYWNlU2VsZWN0aW9uLm51bWJlcixcbiAgICApO1xuXG4gICAgaWYgKCFwbGFjZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPSBwbGFjZURlY2tJbmRleDtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBjb2FjaEluZGV4O1xuICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBwbGFjZTtcblxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQocGxhY2UpO1xuXG4gICAgLy8gVGltZSBkZWxheSB0byB3YWl0IGZvciBzdGF0dXMgdXBkYXRlIHByb2Nlc3MgYXQgY2xpY2tlZCBwbGFjZVxuICAgIGNvbnN0IGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0KHBsYWNlU2VsZWN0aW9uLmlkKTtcbiAgICAgIGNsZWFyVGltZW91dChkZWxheVNjcm9sbEluVmlld3BvcnQpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk6IHZvaWQge1xuICAgIC8vT25seSBpZiB0aGUgc2VsZWN0ZWRDb2FjaEluZGV4IGhhcyBjaGFuZ2VkLCBhbiB1cGRhdGUgbmVlZHMgdG8gYmUgY2FycmllZCBvdXRcbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KSByZXR1cm47XG5cbiAgICAvLyBJZiBhIGZvY3VzaW5kZXggaGFzIGJlZW4gc2V0ICghPSAtMSksIGl0IGNhbiBiZSB1cGRhdGVkIHdpdGggdGhlIGN1cnJlbnQgc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuXG4gICAgY29uc3QgY29hY2hTZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoKHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KTtcbiAgICBpZiAoY29hY2hTZWxlY3Rpb24pIHtcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUge0N1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2g+fVxuICAgICAgICogRW1pdHMgd2hlbiBhIGNvYWNoIHdhcyBzZWxlY3RlZCBhbmQgcmV0dXJucyBhIENvYWNoU2VsZWN0aW9uXG4gICAgICAgKi9cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2g+KCdzZWxlY3RlZGNvYWNoJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBjb2FjaFNlbGVjdGlvbixcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQbGFjZUVsZW1lbnRJZChcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBwbGFjZU51bWJlcjogc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICAnc2VhdC1yZXNlcnZhdGlvbl9fcGxhY2UtYnV0dG9uLScgKyBjb2FjaERlY2tJbmRleCArICctJyArIGNvYWNoSW5kZXggKyAnLScgKyBwbGFjZU51bWJlclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW4gdGhlIGNhc2Ugb2YgY29hY2ggbGF5b3V0cyB3aXRoIGRpZmZlcmVudCBkZWNrcyxcbiAgICogaXQgaXMgbmVjZXNzYXJ5IHRvIGV4dGVuZCB0aGUgb2Zmc2V0IHdpdGggZW1wdHkgY29hY2hlc1xuICAgKiBpbiBvcmRlciB0byBjcmVhdGUgYSBzdGFibGUgdmVoaWNsZSBsYXlvdXQuXG4gICAqXG4gICAqICAgICAgICAgICAgIFtvb29dLVtvb29dLVtvb29dXG4gICAqIFtvb29dLVtvb29dLVtvb29dLVtvb29dLVtvb29dXG4gICAqL1xuICBwcml2YXRlIF9pbml0RW1wdHlDb2FjaERlY2tPZmZzZXRzKCk6IHZvaWQge1xuICAgIC8vIFByZWZpbGwgb2Zmc2V0IGNvdW50ZXJzIHdpdGggMCBzdGFydCBpbmRleFxuICAgIGNvbnN0IGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyID0gQXJyYXkodGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDEpLmZpbGwoMCk7XG4gICAgLy8gVGFrZXMgdGhlIGxvd2VyIGRlY2sgd2hpY2ggY29udGFpbnMgdGhlIG1heCBudW1iZXJzIG9mIGNvYWNoZXNcbiAgICBjb25zdCBsb3dlckRlY2sgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdO1xuXG4gICAgbG93ZXJEZWNrLmNvYWNoSXRlbXMuZm9yRWFjaCgobG93ZXJDb2FjaEl0ZW06IENvYWNoSXRlbSkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRlY2tDb2FjaEl0ZW0gPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbaV0uY29hY2hJdGVtc1tjb2FjaE9mZnNldEluZGV4Q291bnRlcltpXV07XG4gICAgICAgIGlmIChsb3dlckNvYWNoSXRlbS5pZCAhPSBkZWNrQ29hY2hJdGVtPy5pZCkge1xuICAgICAgICAgIC8vIEFkZCBFbXB0eSBvZmZzZXQgY29hY2ggdG8gc3BlY2lmaWVkIGluZGV4IHBvc2l0aW9uXG4gICAgICAgICAgY29uc3QgZW1wdHlPZmZzZXRDb2FjaCA9IHtcbiAgICAgICAgICAgIC4uLmxvd2VyQ29hY2hJdGVtLFxuICAgICAgICAgICAgcGxhY2VzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBwcm9wZXJ0eUlkczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ3JhcGhpY0VsZW1lbnRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzZXJ2aWNlRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRyYXZlbENsYXNzOiBbXSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1tpXS5jb2FjaEl0ZW1zLnNwbGljZShcbiAgICAgICAgICAgIGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGVtcHR5T2Zmc2V0Q29hY2gsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldKys7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gb2YgU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gQXJyYXkgYmFzZWQgb24gdGhlIHRyYW5zZmVycmVkIHBsYWNlc1xuICAgKiB0aGF0IGhhdmUgdGhlIHN0YXRlIFNFTEVDVEVEIHdpdGhpbiB0aGUgc2VhdFJlc2VydmF0aW9uIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIC8vIFJlc2V0IHBsYWNlIHNlbGVjdGlvbnNcbiAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLnNlYXRzID0gW107XG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5iaWN5Y2xlcyA9IFtdO1xuXG4gICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zPy5mb3JFYWNoKChzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiwgY29hY2hEZWNrSW5kZXg6IG51bWJlcikgPT5cbiAgICAgIHNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zLm1hcCgoY29hY2g6IENvYWNoSXRlbSwgY29hY2hJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvYWNoLnBsYWNlc1xuICAgICAgICAgID8uZmlsdGVyKChwbGFjZSkgPT4gcGxhY2Uuc3RhdGUgPT09ICdTRUxFQ1RFRCcpXG4gICAgICAgICAgPy5mb3JFYWNoKChwbGFjZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGxhY2VJZCA9IHRoaXMuZ2V0UGxhY2VFbGVtZW50SWQoY29hY2hEZWNrSW5kZXgsIGNvYWNoSW5kZXgsIHBsYWNlLm51bWJlcik7XG4gICAgICAgICAgICBjb25zdCBwcmVzZWxlY3RlZFBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbiA9IG1hcFBsYWNlSW5mb3NUb1BsYWNlU2VsZWN0aW9uKFxuICAgICAgICAgICAgICBwbGFjZSxcbiAgICAgICAgICAgICAgcGxhY2VJZCxcbiAgICAgICAgICAgICAgc2VhdFJlc2VydmF0aW9uLmRlY2tDb2FjaEluZGV4LFxuICAgICAgICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb246IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIHwgbnVsbCA9XG4gICAgICAgICAgICAgIHRoaXMuX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKHByZXNlbGVjdGVkUGxhY2VTZWxlY3Rpb24sIGNvYWNoRGVja0luZGV4KTtcblxuICAgICAgICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuc2VhdHMucHVzaChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5iaWN5Y2xlcy5wdXNoKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgc2VsZWN0ZWQgcGxhY2VzIHdpbGwgYmUgcmVzZXQgb3IgdGhlIGN1cnJlbnRTZWxlY3RlZFBsYWNlIHdhcyBnaXZlbiwgdGhlbiB3ZSByZXNldCBhbGwgZXhjZXB0IGN1cnJlbnRTZWxlY3RlZFBsYWNlXG4gICAqIEBwYXJhbSByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uc1xuICAgKiBAcGFyYW0gY3VyclNlbGVjdGVkUGxhY2VcbiAgICovXG4gIHByaXZhdGUgX3Jlc2V0QWxsUGxhY2VTZWxlY3Rpb25zKFxuICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdLFxuICAgIGN1cnJTZWxlY3RlZFBsYWNlPzogUGxhY2VTZWxlY3Rpb24sXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10ge1xuICAgIC8vRmluZCBhbGwgcGxhY2VzIHRvIGJlIG5lZWRlZCB1bnNlbGVjdFxuICAgIGZvciAoY29uc3QgcGxhY2VTZWxlY3Rpb24gb2YgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMpIHtcbiAgICAgIGlmICghY3VyclNlbGVjdGVkUGxhY2UgfHwgY3VyclNlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQocGxhY2VTZWxlY3Rpb24uaWQpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAocGxhY2VFbGVtZW50KSB7XG4gICAgICAgICAgcGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3RhdGUnLCAnRlJFRScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vUmVtb3ZlcyBhbGwgc2VsZWN0ZWQgcGxhY2VzIGV4Y2VwdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgaWYgKGN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucyA9IHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zLmZpbHRlcihcbiAgICAgICAgKF9zZWxlY3RlZFBsYWNlKSA9PiBfc2VsZWN0ZWRQbGFjZS5pZCA9PT0gY3VyclNlbGVjdGVkUGxhY2UuaWQsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucyA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIF9nZXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihcbiAgICBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2VTZWxlY3Rpb24sXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlciB8IG51bGwsXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIHwgbnVsbCB7XG4gICAgaWYgKGNvYWNoRGVja0luZGV4ID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGNvYWNoID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW2NvYWNoRGVja0luZGV4XS5jb2FjaEl0ZW1zW2N1cnJTZWxlY3RlZFBsYWNlLmNvYWNoSW5kZXhdO1xuICAgIGNvbnN0IHBsYWNlID0gY29hY2gucGxhY2VzPy5maW5kKChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09PSBjdXJyU2VsZWN0ZWRQbGFjZS5udW1iZXIpO1xuXG4gICAgcmV0dXJuIHBsYWNlXG4gICAgICA/IG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKFxuICAgICAgICAgIHBsYWNlLFxuICAgICAgICAgIGNvYWNoLFxuICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlLmlkLFxuICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlLmRlY2tJbmRleCxcbiAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZS5jb2FjaEluZGV4LFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9nZXRTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoKFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgKTogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaCB8IG51bGwge1xuICAgIGlmICghdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGNvYWNoID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGNvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzID0gdGhpcy5nZXRBdmFpbGFibGVGcmVlUGxhY2VzTnVtRnJvbUNvYWNoKGNvYWNoLnBsYWNlcyk7XG4gICAgcmV0dXJuIG1hcENvYWNoSW5mb3NUb0NvYWNoU2VsZWN0aW9uKGNvYWNoSW5kZXgsIGNvYWNoLCBjb2FjaE51bWJlck9mRnJlZVBsYWNlcyk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZTogUGxhY2UgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZCA9IHBsYWNlXG4gICAgICA/IHRoaXMuZ2V0UGxhY2VFbGVtZW50SWQoXG4gICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXgsXG4gICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgICAgIHBsYWNlLm51bWJlcixcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmF0aW9uIG9mIHRoZSB1c2VkIGRvY3VtZW50cyBmb250LXNpemUgd2hpY2ggbmVlZHNcbiAgICogdG8gYmUgZGV0ZXJtaW5lZCBpbiBvcmRlciB0byBjb3JyZWN0bHkgY2FsY3VsYXRlIENTUyB2YWx1ZXMgd2l0aCByZW1cbiAgICogKi9cbiAgcHJpdmF0ZSBfZGV0ZXJtaW5lQmFzZUZvbnRTaXplKCk6IHZvaWQge1xuICAgIGlmICghaXNTZXJ2ZXIpIHtcbiAgICAgIGNvbnN0IGJhc2VGb250U2l6ZSA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmZvbnRTaXplLCAxMCk7XG4gICAgICAvL2NhbGN1bGF0ZSByZW0gb2YgMXB4XG4gICAgICBjb25zdCBvbmVQaXhlbEluUmVtID0gMSAvIGJhc2VGb250U2l6ZTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLW9uZS1weC1yZW0nLCBgJHtvbmVQaXhlbEluUmVtICsgJ3JlbSd9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGRhdGEgZm9yIGRpc3BsYXlpbmcgbmF2aWdhdGlvbiBhcmVhLlxuICAgKiBDYWxjdWxhdGVzIHRoZSB2YWx1ZXMgd2hpY2ggYXJlIG5vdCBnb2luZyB0byBjaGFuZ2UgZHVyaW5nIHVzZSBvZiBhIGNvbXBvbmVudDpcbiAgICogICAgLSBjb2FjaCBpZFxuICAgKiAgICAtIGxpc3Qgb2Ygc2VydmljZSBpY29uc1xuICAgKiAgICAtIGNsYXNzIChmaXJzdCwgc2Vjb25kLCBhbnkpXG4gICAqICAgIC0gd2hldGhlciB0aGVyZSBpcyBhIGRyaXZlciBhcmVhIGxlZnQgb3IgcmlnaHRcbiAgICogKi9cbiAgcHJpdmF0ZSBfcHJlcGFyZUNvYWNoSXRlbURldGFpbHNEYXRhKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHtcbiAgICAgIGNvbnN0IGxvd2VyRGVjazogQ29hY2hJdGVtW10gPVxuICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdLmNvYWNoSXRlbXM7XG5cbiAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzID0gW107XG5cbiAgICAgIGxvd2VyRGVjay5mb3JFYWNoKChjb2FjaCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgdHJhdmVsQ2xhc3NlczogUGxhY2VUcmF2ZWxDbGFzc1tdID0gW107XG4gICAgICAgIGNvbnN0IHByb3BlcnR5SWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBjb25zdCBwbGFjZXM6IFBsYWNlW10gPSBbXTtcblxuICAgICAgICAvLyBDb2xsZWN0IGFsbCBpbXBvcnRhbnQgbmF2aWdhdGlvbiBkYXRhIHRvIGJlIHJlbmRlcmVkXG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1xuICAgICAgICAgIC5tYXAoKHNyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3IuY29hY2hJdGVtc1tpbmRleF07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZm9yRWFjaCgoY29hY2g6IENvYWNoSXRlbSkgPT4ge1xuICAgICAgICAgICAgdHJhdmVsQ2xhc3Nlcy5wdXNoKC4uLmNvYWNoLnRyYXZlbENsYXNzKTtcbiAgICAgICAgICAgIHByb3BlcnR5SWRzLnB1c2goLi4uKGNvYWNoLnByb3BlcnR5SWRzID8gY29hY2gucHJvcGVydHlJZHMgOiBbXSkpO1xuICAgICAgICAgICAgcGxhY2VzLnB1c2goLi4uKGNvYWNoLnBsYWNlcyA/IGNvYWNoLnBsYWNlcyA6IFtdKSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgaWQ6IGNvYWNoLmlkLFxuICAgICAgICAgIHRyYXZlbENsYXNzOiB0aGlzLl9wcmVwYXJlVHJhdmVsQ2xhc3NOYXZpZ2F0aW9uKHRyYXZlbENsYXNzZXMpLFxuICAgICAgICAgIHByb3BlcnR5SWRzOiB0aGlzLl9wcmVwYXJlU2VydmljZUljb25zTmF2aWdhdGlvbihwcm9wZXJ0eUlkcyksXG4gICAgICAgICAgaXNEcml2ZXJBcmVhOiBjb2FjaC5wbGFjZXMgPyBjb2FjaC5wbGFjZXMubGVuZ3RoID09PSAwIDogdHJ1ZSxcbiAgICAgICAgICBpc0xvY29tb3RpdmU6IHRoaXMuX2lzTG9jb21vdGl2ZShjb2FjaCksXG4gICAgICAgICAgZHJpdmVyQXJlYVNpZGU6IHRoaXMuX3ByZXBhcmVEcml2ZXJBcmVhU2lkZU5hdmlnYXRpb24oY29hY2gpLFxuICAgICAgICAgIGZyZWVQbGFjZXM6IHRoaXMuZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChwbGFjZXMpLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vICNUSU1PLTQ1ODU4XG4gIC8vIEZpbmRzIHRoZSBvcHRpbWFsIGljb24gc2l6ZSBiYXNlZCBvbiBhbGwgc2VydmljZUVsZW1lbnRzIGFuZCB0aGVpciBkaW1lbnNpb24uXG4gIC8vIFRoaXMgc2V0cyB0aGUgZ2xvYmFsQXJlYUljb25EaW0gYW5kIGlzIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhIGVsZW1lbnRzLlxuICAvLyBUaGlzIGdpdmVzIHVzIGEgbWF4aW11bSB1bmlmb3JtIGljb24gc2l6ZSB3aXRoaW4gdGhlIGFyZWEgZWxlbWVudHNcbiAgcHJpdmF0ZSBfcHJlcGFyZU9wdGltaXplQXJlYUljb25EaW1lbnNpb25CeU1lZGlhbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWF0UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCBhbGxTZXJ2aWNlRGltZW5zaW9uczogRWxlbWVudERpbWVuc2lvbltdID0gW107XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnMuZm9yRWFjaCgoZGVjaykgPT5cbiAgICAgICAgZGVjay5jb2FjaEl0ZW1zLmZvckVhY2goKGNvYWNoKSA9PlxuICAgICAgICAgIGNvYWNoLnNlcnZpY2VFbGVtZW50cz8uZm9yRWFjaCgoaWNvbikgPT4gYWxsU2VydmljZURpbWVuc2lvbnMucHVzaChpY29uLmRpbWVuc2lvbikpLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgICAgaWYgKGFsbFNlcnZpY2VEaW1lbnNpb25zLmxlbmd0aCkge1xuICAgICAgICBhbGxTZXJ2aWNlRGltZW5zaW9ucy5zb3J0KFxuICAgICAgICAgIChkaW0xOiBFbGVtZW50RGltZW5zaW9uIHwgdW5kZWZpbmVkLCBkaW0yOiBFbGVtZW50RGltZW5zaW9uIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgICAgICBpZiAoZGltMSAmJiBkaW0yKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1heERpbTEgPSBkaW0xLncgKyBkaW0xLmg7XG4gICAgICAgICAgICAgIGNvbnN0IG1heERpbTIgPSBkaW0yLncgKyBkaW0yLmg7XG4gICAgICAgICAgICAgIGlmIChtYXhEaW0xID4gbWF4RGltMikgcmV0dXJuIDE7XG4gICAgICAgICAgICAgIGVsc2UgaWYgKG1heERpbTEgPCBtYXhEaW0yKSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgIGVsc2UgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGJlc3QgaWNvbiBzaXplIGJ5IG1lZGlhblxuICAgICAgICBjb25zdCBtZWRpYW5JY29uU2l6ZSA9IGFsbFNlcnZpY2VEaW1lbnNpb25zW01hdGguZmxvb3IoYWxsU2VydmljZURpbWVuc2lvbnMubGVuZ3RoIC8gMildITtcblxuICAgICAgICAvLyBTZXQgdGhlIGRldGVybWluZWQgbWVkaWFuIGljb24gc2l6ZSBhcyBnbG9iYWwgY2FsY3VsYXRlZCBhcmVhIGljb24gZGltZW5zaW9uXG4gICAgICAgIHRoaXMuZ2xvYmFsQXJlYUljb25EaW0gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24obWVkaWFuSWNvblNpemUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZmluZCB0aGUgbWF4aW11bSBjb2FjaCBoZWlnaHQgZnJvbSBhbGwgZGVja3NcbiAgICAgICAgY29uc3QgbWF4Q29hY2hIZWlnaHQgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNcbiAgICAgICAgICAuZmxhdE1hcCgoZGVjaykgPT4gZGVjay5jb2FjaEl0ZW1zLm1hcCgoY29hY2gpID0+IGNvYWNoLmRpbWVuc2lvbi5oKSlcbiAgICAgICAgICAucmVkdWNlKChtYXgsIGhlaWdodCkgPT4gTWF0aC5tYXgobWF4LCBoZWlnaHQpLCAwKTtcblxuICAgICAgICAvL2NhbGN1bGF0ZSAyMCUgb2YgbWF4aW11bSBoZWlnaHQgYXMgaWNvbiBkaW1lbnNpb25cbiAgICAgICAgY29uc3QgaWNvbkRpbWVuc2lvbiA9IE1hdGguZmxvb3IobWF4Q29hY2hIZWlnaHQgKiAwLjIpO1xuICAgICAgICB0aGlzLmdsb2JhbEFyZWFJY29uRGltID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKHtcbiAgICAgICAgICB3OiBpY29uRGltZW5zaW9uLFxuICAgICAgICAgIGg6IGljb25EaW1lbnNpb24sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3ByZXBhcmVUcmF2ZWxDbGFzc05hdmlnYXRpb24odHJhdmVsQ2xhc3NlczogUGxhY2VUcmF2ZWxDbGFzc1tdKTogUGxhY2VUcmF2ZWxDbGFzcyB7XG4gICAgaWYgKHRyYXZlbENsYXNzZXMuaW5kZXhPZignRklSU1QnKSAhPT0gLTEpIHJldHVybiAnRklSU1QnO1xuICAgIGlmICh0cmF2ZWxDbGFzc2VzLmluZGV4T2YoJ1NFQ09ORCcpICE9PSAtMSkgcmV0dXJuICdTRUNPTkQnO1xuICAgIHJldHVybiAnQU5ZX0NMQVNTJztcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXBhcmVEcml2ZXJBcmVhU2lkZU5hdmlnYXRpb24oXG4gICAgY29hY2hJdGVtOiBDb2FjaEl0ZW0sXG4gICk6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb2FjaERyaXZlckFyZWFzID0gY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cz8uZmlsdGVyKFxuICAgICAgKGdyYXBoaWNhbEVsZW1lbnRzKSA9PiBncmFwaGljYWxFbGVtZW50cy5pY29uID09PSAnRFJJVkVSX0FSRUEnLFxuICAgICk7XG5cbiAgICBpZiAoY29hY2hEcml2ZXJBcmVhcyAmJiBjb2FjaERyaXZlckFyZWFzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENoZWNraW5nIHRoZSBkcml2ZXIgYXJlYSBwb3NpdGlvbiB3aGV0aGVyIGl0IGlzIHByZXNlbnQgb24gdGhlIGxlZnQgb3IgcmlnaHQgc2lkZSBpbiBhIGNvYWNoXG4gICAgICBjb25zdCBoYXNMZWZ0RHJpdmVyQXJlYSA9XG4gICAgICAgIGNvYWNoRHJpdmVyQXJlYXMuZmluZCgoZHJpdmVyQXJlYUVsZW1lbnQpID0+IGRyaXZlckFyZWFFbGVtZW50LnBvc2l0aW9uLnggPT09IDApIHx8IGZhbHNlO1xuICAgICAgY29uc3QgaGFzUmlnaHREcml2ZXJBcmVhID1cbiAgICAgICAgY29hY2hEcml2ZXJBcmVhcy5maW5kKChkcml2ZXJBcmVhRWxlbWVudCkgPT4gZHJpdmVyQXJlYUVsZW1lbnQucG9zaXRpb24ueCA+IDApIHx8IGZhbHNlO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAhIWhhc0xlZnREcml2ZXJBcmVhLFxuICAgICAgICByaWdodDogISFoYXNSaWdodERyaXZlckFyZWEsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZVNlcnZpY2VJY29uc05hdmlnYXRpb24gPSAocHJvcGVydHlJZHM6IHN0cmluZ1tdKTogc3RyaW5nW10gPT4ge1xuICAgIGlmICghcHJvcGVydHlJZHMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzaHJ1bmtQcm9wZXJ0eUlkcyA9IHByb3BlcnR5SWRzXG4gICAgICA/Lm1hcChmdW5jdGlvbiAocHJvcGVydHlJZDogc3RyaW5nKToge1xuICAgICAgICBwSWQ6IHN0cmluZztcbiAgICAgICAgc3ZnTmFtZTogc3RyaW5nO1xuICAgICAgfSB7XG4gICAgICAgIC8vIHByZXBhcmUgdGVtcG9yYXJ5IG9iamVjdCBtYXBwaW5nIHByb3BlcnR5IGlkIHRvIGl0J3Mgc3ZnTmFtZSBzbyB0aGF0IHdlIGNhbiBjb21wYXJlIGl0IHRvIHRoZSBsaXN0IG9mIGFsbG93ZWQgaWNvbnNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwSWQ6IHByb3BlcnR5SWQsXG4gICAgICAgICAgc3ZnTmFtZTogbWFwSWNvblRvU3ZnW3Byb3BlcnR5SWRdPy5zdmdOYW1lID8gbWFwSWNvblRvU3ZnW3Byb3BlcnR5SWRdPy5zdmdOYW1lIDogJycsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLy9maWx0ZXIgb3V0IG9iamVjdHMgc2VydmljZSBpY29ucyB3aGljaCBhcmUgbm90IGluIEFMTE9XRURfU0VSVklDRV9JQ09OU1xuICAgICAgLmZpbHRlcigocHJvcGVydHlUb1N2ZykgPT4gQUxMT1dFRF9TRVJWSUNFX0lDT05TLmluZGV4T2YocHJvcGVydHlUb1N2Zy5zdmdOYW1lKSAhPT0gLTEpXG4gICAgICAvL21ha2UgaXQgZGlzdGluY3QgYnkgc3ZnTmFtZVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHZhbHVlLCBpbmRleCwgc2VsZikgPT5cbiAgICAgICAgICBzZWxmLm1hcCgocHJvcFN2ZykgPT4gcHJvcFN2Zy5zdmdOYW1lKS5pbmRleE9mKHZhbHVlLnN2Z05hbWUpID09PSBpbmRleCxcbiAgICAgIClcbiAgICAgIC8vIGdvIGJhY2sgdG8gcHJvcGVydHlJZCBzdHJpbmcgZnJvbSB0ZW1wb3Jhcnkgb2JqZWN0XG4gICAgICAubWFwKChwcm9wZXJ0eVRvU3ZnKSA9PiBwcm9wZXJ0eVRvU3ZnLnBJZClcbiAgICAgIC8vIHRha2UgZmlyc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCBmcm9tIEJhY2tlbmQsIG90aGVyd2lzZSB0aGUgbGF5b3V0IGNvdWxkIGJlIGRlc3Ryb3llZFxuICAgICAgLnNsaWNlKDAsIE1BWF9TRVJWSUNFX1BST1BFUlRJRVMpO1xuICAgIHJldHVybiBzaHJ1bmtQcm9wZXJ0eUlkcyA/IHNocnVua1Byb3BlcnR5SWRzIDogW107XG4gIH07XG5cbiAgLy8gSW5pdGlhbGx5IGNhbGN1bGF0ZXMgYWxsIHRoZSBuZWNlc3NhcnkgcG9zaXRpb25zIGFuZCBkaW1lbnNpb25zIG9mIGFsbCBjb2FjaCBlbGVtZW50cywgYXJlYSBlbGVtZW50cywgc2VydmljZSBlbGVtZW50c1xuICBwcml2YXRlIF9wcmVwYXJlU2VhdFJlc2VydmF0aW9uU3RydWN0dXJlSW5mb3JtYXRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhdFJlc2VydmF0aW9ucykge1xuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25TdHJ1Y3R1cmUgPSB7XG4gICAgICAgIGRlY2tzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9ucy5mb3JFYWNoKChzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25EZWNrOiBTZWF0cmVzZXJ2YXRpb25EZWNrID0ge1xuICAgICAgICAgIGRlY2tJbmRleDogaW5kZXgsXG4gICAgICAgICAgZGVja0NvYWNoZXM6IFtdLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbj8uY29hY2hJdGVtcz8uZm9yRWFjaCgoY29hY2hJdGVtOiBDb2FjaEl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZEFyZWFFbGVtZW50cyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHM/LmZpbHRlcihcbiAgICAgICAgICAgIChlKSA9PiBlLmljb24gJiYgIXRoaXMubm90QXJlYUVsZW1lbnRzLmluY2x1ZGVzKGUuaWNvbiksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBhbGxFbGVtZW5ldHMgPVxuICAgICAgICAgICAgZmlsdGVyZWRBcmVhRWxlbWVudHNcbiAgICAgICAgICAgICAgPy5jb25jYXQoY29hY2hJdGVtLnNlcnZpY2VFbGVtZW50cyB8fCBbXSlcbiAgICAgICAgICAgICAgLmNvbmNhdChjb2FjaEl0ZW0ucGxhY2VzIHx8IFtdKSB8fCBbXTtcbiAgICAgICAgICBjb25zdCBoYXNPdmVyaGFuZ2luZ0VsZW1lbnRzID0gdGhpcy5faXNPdmVyaGFuZ2luZ0VsZW1lbnRzUHJlc2VudChcbiAgICAgICAgICAgIGNvYWNoSXRlbS5kaW1lbnNpb24udyxcbiAgICAgICAgICAgIGFsbEVsZW1lbmV0cyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGFyZWFFbGVtZW50cyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHNcbiAgICAgICAgICAgID8uZmlsdGVyKFxuICAgICAgICAgICAgICAoZ3JhcGhpY2FsRWxlbWVudDogQmFzZUVsZW1lbnQpID0+XG4gICAgICAgICAgICAgICAgIXRoaXMubm90QXJlYUVsZW1lbnRzLmluY2x1ZGVzKGdyYXBoaWNhbEVsZW1lbnQuaWNvbiEpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm1hcCgoZWxlKSA9PlxuICAgICAgICAgICAgICB0aGlzLl9nZXRDYWxjdWxhdGVkRGltZW5zaW9uUG9zaXRpb25FbGVtZW50KGVsZSwgY29hY2hJdGVtLmRpbWVuc2lvbiwgdHJ1ZSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG90aGVyRWxlbWVudHMgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzXG4gICAgICAgICAgICA/LmZpbHRlcigoZ3JhcGhpY2FsRWxlbWVudDogQmFzZUVsZW1lbnQpID0+XG4gICAgICAgICAgICAgIHRoaXMubm90QXJlYUVsZW1lbnRzLmluY2x1ZGVzKGdyYXBoaWNhbEVsZW1lbnQuaWNvbiEpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm1hcCgoZWxlKSA9PlxuICAgICAgICAgICAgICB0aGlzLl9nZXRDYWxjdWxhdGVkRGltZW5zaW9uUG9zaXRpb25FbGVtZW50KGVsZSwgY29hY2hJdGVtLmRpbWVuc2lvbiwgZmFsc2UpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzZXJ2aWNlRWxlbWVudHMgPSBjb2FjaEl0ZW0uc2VydmljZUVsZW1lbnRzPy5tYXAoKGVsZSkgPT5cbiAgICAgICAgICAgIHRoaXMuX2dldENhbGN1bGF0ZWREaW1lbnNpb25Qb3NpdGlvbkVsZW1lbnQoZWxlLCBjb2FjaEl0ZW0uZGltZW5zaW9uLCBmYWxzZSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBib3JkZXJNaWRkbGVFbGVtZW50ID0gdGhpcy5fZ2V0Q2FsY3VsYXRlZE1pZGRsZUJvcmRlckVsZW1lbnQoY29hY2hJdGVtKTtcbiAgICAgICAgICBjb25zdCBjYWxjQ29hY2hEaW1lbnNpb24gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oeyAuLi5jb2FjaEl0ZW0uZGltZW5zaW9uIH0pO1xuICAgICAgICAgIC8vIENvbGxlY3QgYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3Igc2luZ2xlIGNvYWNoXG4gICAgICAgICAgY29uc3QgY29hY2hTdHVyY3R1cmU6IENvYWNoU3RydWN0dXJlID0ge1xuICAgICAgICAgICAgd2lkdGg6IGNhbGNDb2FjaERpbWVuc2lvbi53LFxuICAgICAgICAgICAgaGVpZ2h0OiBjYWxjQ29hY2hEaW1lbnNpb24uaCxcbiAgICAgICAgICAgIG90aGVyRWxlbWVudHM6IG90aGVyRWxlbWVudHMgfHwgW10sXG4gICAgICAgICAgICBzZXJ2aWNlRWxlbWVudHM6IHNlcnZpY2VFbGVtZW50cyB8fCBbXSxcbiAgICAgICAgICAgIGFyZWFFbGVtZW50czogYXJlYUVsZW1lbnRzIHx8IFtdLFxuICAgICAgICAgICAgYm9yZGVyTWlkZGxlRWxlbWVudDogYm9yZGVyTWlkZGxlRWxlbWVudCxcbiAgICAgICAgICAgIGhhc092ZXJoYW5naW5nRWxlbWVudHM6IGhhc092ZXJoYW5naW5nRWxlbWVudHMsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHNlYXRSZXNlcnZhdGlvbkRlY2suZGVja0NvYWNoZXMucHVzaChjb2FjaFN0dXJjdHVyZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlLmRlY2tzLnB1c2goc2VhdFJlc2VydmF0aW9uRGVjayk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2FsY3VsYXRlZCBwb3NpdGlvbiBhbmQgZGltZW5zaW9uIG9mIHRoZSBtaWRkbGUgYm9yZGVyLlxuICAgKiBUbyBjYWxjdWxhdGUgdGhlIHN0YXJ0ICsgZW5kIGNvb3JkaW5hdGUgYW5kIHRoZSBkaW1lbnNpb24gb2YgdGhlIG1pZGRsZSBib3JkZXIgY29hY2ggZ3JhcGhpYyxcbiAgICogdGhlIGV4aXN0aW5nIGRvY2tpbmcgY29hY2ggZ3JhcGhpY3MgYXJlIGFuYWx5c2VkIGFuZCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgcG9zaXRpb24gYW5kIGRpZW1lbnNpb24gaW5mb3JtYXRpb24uXG4gICAqIEByZXR1cm5zIEJhc2VFbGVtZW50XG4gICAqL1xuICBwcml2YXRlIF9nZXRDYWxjdWxhdGVkTWlkZGxlQm9yZGVyRWxlbWVudChjb2FjaDogQ29hY2hJdGVtKTogQmFzZUVsZW1lbnQge1xuICAgIGNvbnN0IGJvcmRlckhlaWdodCA9IChjb2FjaC5kaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgKiAyKSAqIHRoaXMuYmFzZUdyaWRTaXplO1xuICAgIC8vIERlZmF1bHQgLSB3aXRob3V0IGZpbmRpbmcgZG9ja2luZyBib3JkZXIgZWxlbWVudHMsIHRoZSBtaWRkbGUgYm9yZGVyIGdvZXMgZnJvbSAwIHBvc2l0aW9uIHVudGlsIGNvYWNoIHdpZHRoIGVuZFxuICAgIGxldCBzdGFydEJvcmRlck9mZnNldFggPSAwO1xuICAgIGxldCBib3JkZXJXaWR0aCA9IGNvYWNoLmRpbWVuc2lvbi53O1xuXG4gICAgaWYgKGNvYWNoLmdyYXBoaWNFbGVtZW50cykge1xuICAgICAgLy8gRG9ja2luZ0VsZW1lbnRlIGRlZmluZXMgdGhlIGVsZW1lbnRzIHdoZXJlIHRoZSBib3JkZXIgb2YgdGhlIGNvYWNoIHJlYWxseSBzdGFydHMgYW5kIGVuZHNcbiAgICAgIGNvbnN0IGRvY2tpbmdFbGVtZW50cyA9IHRoaXMuX2dldEZpcnN0TGFzdERvY2tpbmdFbGVtZW50cyhjb2FjaC5ncmFwaGljRWxlbWVudHMpO1xuXG4gICAgICAvLyBUd28gZG9ja2luZyBjb2FjaCBlbGVtZW50cyBleGlzdCAobm9ybWFsIGNhc2UgLSBzdGFydCBhbmQgZW5kIGRvY2tpbmcgZWxlbWVudClcbiAgICAgIGlmIChkb2NraW5nRWxlbWVudHM/Lmxlbmd0aCA9PSAyKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0RG9ja2luZ0VsZW1lbnQgPSBkb2NraW5nRWxlbWVudHNbMF07XG4gICAgICAgIGNvbnN0IGxhc3REb2NraW5nRWxlbWVudCA9IGRvY2tpbmdFbGVtZW50c1sxXTtcbiAgICAgICAgY29uc3QgZW5kQm9yZGVyT2Zmc2V0WCA9XG4gICAgICAgICAgZmlyc3REb2NraW5nRWxlbWVudC5wb3NpdGlvbi54ID09IDBcbiAgICAgICAgICAgID8gbGFzdERvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53XG4gICAgICAgICAgICA6IGZpcnN0RG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLnc7XG5cbiAgICAgICAgc3RhcnRCb3JkZXJPZmZzZXRYID1cbiAgICAgICAgICBmaXJzdERvY2tpbmdFbGVtZW50LnBvc2l0aW9uLnggPT0gMFxuICAgICAgICAgICAgPyBmaXJzdERvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53XG4gICAgICAgICAgICA6IGxhc3REb2NraW5nRWxlbWVudC5kaW1lbnNpb24udztcblxuICAgICAgICBib3JkZXJXaWR0aCA9IGNvYWNoLmRpbWVuc2lvbi53IC0gZW5kQm9yZGVyT2Zmc2V0WCAtIHN0YXJ0Qm9yZGVyT2Zmc2V0WDtcbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgb25lIGRvY2tpbmcgYm9yZGVyIGNvYWNoIGVsZW1lbnRzIGV4aXN0IChzdGFydCBvciBlbmQgZG9ja2luZyBlbGVtZW50KVxuICAgICAgZWxzZSBpZiAoZG9ja2luZ0VsZW1lbnRzPy5sZW5ndGggPT0gMSkge1xuICAgICAgICBjb25zdCBkb2NraW5nRWxlbWVudCA9IGRvY2tpbmdFbGVtZW50c1swXTtcblxuICAgICAgICAvLyBNaWRkbGVCb3JkZXIgc3RhcnRzIGZyb20gbGVmdCBkb2NraW5nIGVsZW1lbnQgdW50aWwgY29hY2ggZW5kXG4gICAgICAgIGlmIChkb2NraW5nRWxlbWVudC5wb3NpdGlvbi54ID09PSAwKSB7XG4gICAgICAgICAgc3RhcnRCb3JkZXJPZmZzZXRYID0gZG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLnc7XG4gICAgICAgICAgYm9yZGVyV2lkdGggPSBjb2FjaC5kaW1lbnNpb24udyAtIGRvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53O1xuICAgICAgICB9XG4gICAgICAgIC8vIE1pZGRsZUJvcmRlciBzdGFydHMgZnJvbSBwb3NpdGlvbiB4IDAgdW50aWwgZG9ja2luZyBlbGVtZW50IG9uIHRoZSByaWdodCBjb2FjaCBzaWRlXG4gICAgICAgIGVsc2UgaWYgKGRvY2tpbmdFbGVtZW50LnBvc2l0aW9uLnggIT09IDApIHtcbiAgICAgICAgICBib3JkZXJXaWR0aCA9IGNvYWNoLmRpbWVuc2lvbi53IC0gZG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLnc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5T2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgKiAtMTtcblxuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogeyB4OiBzdGFydEJvcmRlck9mZnNldFggKiB0aGlzLmJhc2VHcmlkU2l6ZSwgeTogeU9mZnNldCwgejogMCB9LFxuICAgICAgZGltZW5zaW9uOiB7IHc6IGJvcmRlcldpZHRoICogdGhpcy5iYXNlR3JpZFNpemUsIGg6IGJvcmRlckhlaWdodCB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBncmFwaGljYWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RhcnQgYW5kIGVuZCBib3JkZXIgZWxlbWVudHMgb2YgdGhlIGNvYWNoLlxuICAgKiBAcmV0dXJucyBCYXNlRWxlbWVudFtdXG4gICAqL1xuICBwcml2YXRlIF9nZXRGaXJzdExhc3REb2NraW5nRWxlbWVudHMoZ3JhcGhpY0VsZW1lbnRzOiBCYXNlRWxlbWVudFtdKTogQmFzZUVsZW1lbnRbXSB7XG4gICAgLy8gR2V0IGFsbCByZWxldmFudCBkb2NraW5nIGVsZW1lbnRzIGFuZCBzb3J0cyB0aGVtIGFnYWluIGFjY29yZGluZyB0byB0aGVpciB4IHBvc2l0aW9uIGNvb3JkaW5hdGVzLFxuICAgIC8vIHRodXMgdGhlIHN0YXJ0IGFuZCBlbmQgZG9ja2luZyBlbGVtZW50cyB3b3VsZCBiZSBkZWZpbmVkXG4gICAgY29uc3QgZmlsdGVyZWREb2NraW5nRWxlbWVudHMgPSAoXG4gICAgICBncmFwaGljRWxlbWVudHMuZmlsdGVyKChlbGUpID0+IHRoaXMubWlkZGxlQm9yZGVyRG9ja2luZ0VsZW1lbnRzLmluY2x1ZGVzKGVsZS5pY29uISkpIHx8IFtdXG4gICAgKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBwb3NBID0gYS5wb3NpdGlvbi54O1xuICAgICAgY29uc3QgcG9zQiA9IGIucG9zaXRpb24ueDtcbiAgICAgIGlmIChwb3NBID4gcG9zQikge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICAgIGlmIChwb3NBIDwgcG9zQikge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIHJldHVybiBmaWx0ZXJlZERvY2tpbmdFbGVtZW50cy5maWx0ZXIoXG4gICAgICAoXywgaW5kZXgpID0+IGluZGV4ID09IDAgfHwgaW5kZXggPT0gZmlsdGVyZWREb2NraW5nRWxlbWVudHMubGVuZ3RoIC0gMSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNhbGN1bGF0ZWQgcG9zaXRpb25zIGFuZCBkaW1lbnNpb25zIG9mIGdyYXBoaWNhbCwgc2VydmljZSBhbmQgYXJlYSBlbGVtZW50c1xuICAgKiBAcmV0dXJucyBCYXNlRWxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q2FsY3VsYXRlZERpbWVuc2lvblBvc2l0aW9uRWxlbWVudChcbiAgICBlbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICBjb2FjaERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgICBpc0NhbGNBcmVhRWxlbWVudDogYm9vbGVhbixcbiAgKTogQmFzZUVsZW1lbnQge1xuICAgIGNvbnN0IGRpbSA9IHsgLi4uZWxlbWVudC5kaW1lbnNpb24gfTtcbiAgICBjb25zdCBwb3MgPSB7IC4uLmVsZW1lbnQucG9zaXRpb24gfTtcbiAgICBjb25zdCByb3RhdGlvbiA9IGVsZW1lbnQucm90YXRpb24gfHwgMDtcbiAgICBjb25zdCBpc05vdEZpeGVkUm90YXRpb25HcmFwaGljYWxFbGVtZW50ID1cbiAgICAgIHRoaXMubm90QXJlYUVsZW1lbnRzLmNvbmNhdCh0aGlzLm5vdEZpeGVkUm90YXRhYmxlQXJlYUljb25zKS5pbmRleE9mKGVsZW1lbnQuaWNvbiEpID09PSAtMTtcbiAgICBjb25zdCBjYWxjUm90YXRpb24gPVxuICAgICAgdGhpcy5hbGlnblZlcnRpY2FsICYmIGlzTm90Rml4ZWRSb3RhdGlvbkdyYXBoaWNhbEVsZW1lbnQgPyByb3RhdGlvbiAtIDkwIDogcm90YXRpb247XG4gICAgbGV0IGFyZWFNb3VudGluZzogRWxlbWVudE1vdW50aW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gYW5kIGRpbWVuc2lvbiBmb3IgQXJlYUVsZW1lbnRzXG4gICAgaWYgKGlzQ2FsY0FyZWFFbGVtZW50KSB7XG4gICAgICBjb25zdCBpc05vdFRhYmxlR3JhcGhpYyA9IGVsZW1lbnQuaWNvbj8uaW5kZXhPZignVEFCTEUnKSA9PT0gLTE7XG4gICAgICBjb25zdCBhcmVhUHJvcGVydHkgPSBlbGVtZW50Lmljb24gJiYgaXNOb3RUYWJsZUdyYXBoaWMgPyBlbGVtZW50Lmljb24gOiBudWxsO1xuICAgICAgY29uc3Qgc3RyZXRjaEhlaWdodCA9XG4gICAgICAgIHRoaXMuaXNFbGVtZW50RGlyZWN0bHlPbkJvcmRlcihlbGVtZW50LCBjb2FjaERpbWVuc2lvbikgJiYgYXJlYVByb3BlcnR5ICE9PSAnRU5UUllfRVhJVCc7XG5cbiAgICAgIGlmIChlbGVtZW50LnBvc2l0aW9uLnkgPT09IDApIHtcbiAgICAgICAgYXJlYU1vdW50aW5nID0gJ3VwcGVyLWJvcmRlcic7XG4gICAgICAgIHBvcy55IC09IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgLSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC8gMztcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5wb3NpdGlvbi55ICsgZWxlbWVudC5kaW1lbnNpb24uaCA9PT0gY29hY2hEaW1lbnNpb24uaCkge1xuICAgICAgICBhcmVhTW91bnRpbmcgPSAnbG93ZXItYm9yZGVyJztcbiAgICAgICAgaWYgKCFzdHJldGNoSGVpZ2h0KSB7XG4gICAgICAgICAgcG9zLnkgKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAtIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgLyAzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJldGNoSGVpZ2h0KSB7XG4gICAgICAgIGRpbS5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgLSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC8gMztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2FsY3VsYXRlIHBvc2l0aW9uIGFuZCBkaW1lbnNpb24gZm9yIGFsbCBvdGhlciBncmFwaGljYWwgZWxlbWVudHNcbiAgICBlbHNlIHtcbiAgICAgIGlmIChlbGVtZW50LnBvc2l0aW9uLnkgPT09IDApIHtcbiAgICAgICAgcG9zLnkgLT0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvYWNoRGltZW5zaW9uLmggPT09IGVsZW1lbnQucG9zaXRpb24ueSArIGVsZW1lbnQuZGltZW5zaW9uLmgpIHtcbiAgICAgICAgZGltLmggKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAqIDI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGltLncgPSBNYXRoLnJvdW5kKGRpbS53ICogdGhpcy5iYXNlR3JpZFNpemUpO1xuICAgIGRpbS5oID0gTWF0aC5yb3VuZChkaW0uaCAqIHRoaXMuYmFzZUdyaWRTaXplKTtcblxuICAgIHBvcy54ID0gTWF0aC5yb3VuZChwb3MueCAqIHRoaXMuYmFzZUdyaWRTaXplKTtcbiAgICBwb3MueSA9IE1hdGgucm91bmQocG9zLnkgKiB0aGlzLmJhc2VHcmlkU2l6ZSk7XG5cbiAgICBjb25zdCBpY29uID1cbiAgICAgIGVsZW1lbnQuaWNvbiAmJiBlbGVtZW50Lmljb24uZW5kc1dpdGgoJ0RSSVZFUl9BUkVBJylcbiAgICAgICAgPyBlbGVtZW50Lmljb24/LmNvbmNhdCgnXycsIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0udmVoaWNsZVR5cGUpXG4gICAgICAgIDogZWxlbWVudC5pY29uO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGljb246IGljb24sXG4gICAgICByb3RhdGlvbjogY2FsY1JvdGF0aW9uLFxuICAgICAgZGltZW5zaW9uOiBkaW0sXG4gICAgICBwb3NpdGlvbjogcG9zLFxuICAgICAgbW91bnRpbmc6IGFyZWFNb3VudGluZyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcGxhY2UgSFRNTCBlbGVtZW50IGJ5IGN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkLlxuICAgKiBAcmV0dXJucyBIVE1MRWxlbWVudCBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRQbGFjZUh0bWxFbGVtZW50KCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWRcbiAgICAgID8gdGhpcy5zaGFkb3dSb290Py5nZXRFbGVtZW50QnlJZCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKSB8fCBudWxsXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXh0cmFjdGVkIGNvYWNoIGRlY2sgaW5kZXggZnJvbSBwbGFjZSBpZFxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldERlY2tJbmRleEJ5UGxhY2VJZChwbGFjZUlkOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBkZWNrSW5kZXggPSB0aGlzLnNoYWRvd1Jvb3RcbiAgICAgID8ucXVlcnlTZWxlY3RvcignIycgKyBwbGFjZUlkKVxuICAgICAgPy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGVjay1pbmRleCcpO1xuICAgIGlmIChkZWNrSW5kZXggJiYgIWlzTmFOKCtkZWNrSW5kZXgpKSB7XG4gICAgICByZXR1cm4gK2RlY2tJbmRleDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9pc1ZhbGlkQ29hY2hJbmRleChjb2FjaEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY29hY2hJbmRleCA+PSAwICYmXG4gICAgICBjb2FjaEluZGV4IDw9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMV0uY29hY2hJdGVtcy5sZW5ndGhcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZXhpc3RpbmcgY29hY2ggZGVjayBpbmRleCBkZXBlbmRpbmcgb24gdGhlIHNlbGVjdGVkIGNvYWNoLlxuICAgKiBUaGlzIG1ldGhvZCBpcyBuZWNlc3NhcnkgdG8gZ2V0IGFuIGF2YWlsYWJsZSBjb2FjaCBkZWNrIGluZGV4IGR1cmluZyBrZXlib2FyZCBuYXZpZ2F0aW9uLCB3aGljaCBjYW4gdmFyeSBiZXR3ZWVuIGNvYWNoZXMgd2l0aCBkaWZmZXJlbnQgZGVja3MuXG4gICAqIEZvciBleGFtcGxlLCB3aGVuIG5hdmlnYXRpbmcgZnJvbSBhIGNvYWNoIHdpdGggdHdvIGRlY2tzIHRvIGEgY29hY2ggd2l0aCBvbmUgZGVjay5cbiAgICpcbiAgICogICAgICAgW29vb10tW29vb10tW29vb11cbiAgICogW29vb10tW29vb10tW29vb10tW29vb10tW29vb11cbiAgICpcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXRFeGlzdGluZ0NvYWNoRGVja0luZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF1cbiAgICAgICAgLnBsYWNlcyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXg7XG4gICAgfVxuXG4gICAgLy8gRmluZCBuZXh0IHBvc3NpYmxlIGNvYWNoIGRlY2sgaW5kZXggd2hlcmUgcGxhY2VzIGV4aXN0XG4gICAgY29uc3QgbmV4dEF2YWlsYWJsZURlY2tDb2FjaEluZGV4ID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmZpbmRJbmRleChcbiAgICAgIChzZWF0UmVzZXJ2YXRpb24pID0+XG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0ucGxhY2VzICE9PSB1bmRlZmluZWQsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPj0gbmV4dEF2YWlsYWJsZURlY2tDb2FjaEluZGV4XG4gICAgICA/IHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XG4gICAgICA6IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhIHNlbGVjdGVkIHBsYWNlIGlzIHNsaWdodGx5IGhpZGRlbiBieSB0aGUgb3ZlcmZsb3cgc2Nyb2xsIGNvbnRlbnQgYW5kIGlzIHN0aWxsIGNsaWNrZWQsXG4gICAqIHRoZSBtZXRob2QgdHJpZXMgdG8gc2Nyb2xsIHRoZSBzZWxlY3RlZCBwbGFjZSBpbnRvIHRoZSBuZWFyZXN0IHZpZXdwb3J0LCBzbyB0aGF0IGl0IGlzIGNvbXBsZXRlbHkgdmlzaWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHBsYWNlSWRcbiAgICovXG4gIHByaXZhdGUgX3Njcm9sbFBsYWNlSW50b05lYXJlc3RWaWV3cG9ydChwbGFjZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNoYWRvd1Jvb3RcbiAgICAgID8uZ2V0RWxlbWVudEJ5SWQocGxhY2VJZClcbiAgICAgID8uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcsIGlubGluZTogJ25lYXJlc3QnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGNoZWNrcyBpZiBhbnkgcGxhY2VzIG9yIGdyYXBoaWNhbCBlbGVtZW50cyAoZS5nLiB0b2lsZXQgYXJlYSwgZXRjLikgYXJlIG92ZXJoYW5naW5nIHRoZSBjb2FjaCBib3JkZXJzXG4gICAqIEBwYXJhbSBjb2FjaEl0ZW1XaWR0aFxuICAgKiBAcGFyYW0gZWxlbWVudHNcbiAgICovXG4gIHByaXZhdGUgX2lzT3ZlcmhhbmdpbmdFbGVtZW50c1ByZXNlbnQoXG4gICAgY29hY2hJdGVtV2lkdGg6IG51bWJlcixcbiAgICBlbGVtZW50czogKFBsYWNlIHwgQmFzZUVsZW1lbnQpW10gfCB1bmRlZmluZWQsXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBlbGVtZW50cz8uc29tZShcbiAgICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICAgZWxlbWVudC5wb3NpdGlvbi54ID09PSAwIHx8IGVsZW1lbnQucG9zaXRpb24ueCArIGVsZW1lbnQuZGltZW5zaW9uLncgPj0gY29hY2hJdGVtV2lkdGgsXG4gICAgICApID8/IGZhbHNlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBkcml2ZXJBcmVhcyBmb3Igb25lIGNvYWNoXG4gICAqIEBwYXJhbSBjb2FjaEl0ZW1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2lzTG9jb21vdGl2ZShjb2FjaEl0ZW06IENvYWNoSXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBjb2FjaEl0ZW0/LmdyYXBoaWNFbGVtZW50cz8uZmluZChcbiAgICAgICAgKGVsZW1lbnQ6IEJhc2VFbGVtZW50KSA9PiBlbGVtZW50Lmljb24gPT09ICdEUklWRVJfQVJFQV9OT19WRVJUSUNBTF9XQUxMJyxcbiAgICAgICkgIT09IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSXMgY2FsbGVkIHdoZW4gdGhlIFNlYXRSZXNlcnZhdGlvbiBsb3NlcyBmb2N1cywgd2hhdCBoYXBwZW5zIHdoZW4gdGhlIHVzZXIgdGFicyBvdXQgb3IgY2xpY2tzIHNvbWV3aGVyZSBlbHNlLlxuICAgKiBUaGVuIHdlIHJlc2V0IHRoZSBmb2N1c2VkIGVsZW1lbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfb25MZWF2ZVNlYXRSZXNlcnZhdGlvbkNvbXBvbmVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgfVxuICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBK0JBLElBQUs7Q0FBTCxTQUFLLGlCQUFlO0FBQ2xCLGlCQUFBLFdBQUE7QUFDQSxpQkFBQSxVQUFBO0dBRkcsb0JBQUEsa0JBQWUsRUFBQSxFQUFBO0FBOEJwQixJQUFNLHlCQUF5QjtBQUMvQixJQUFNLHdCQUFrQztDQUN0QztDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNEO0lBRVksb0NBQTBCO21CQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Y0FBbkMsbUNBQW1DLFlBQVU7OzttQ0FPdkQsU0FBUztJQUFFLFdBQVc7SUFBcUIsTUFBTTtJQUFPLENBQUMsQ0FBQTtrQ0FJekQsU0FBUztJQUFFLFdBQVc7SUFBb0IsTUFBTTtJQUFRLENBQUMsQ0FBQTtnQ0FJekQsV0FBVyxFQUNYLFNBQVM7SUFBRSxXQUFXO0lBQWtCLE1BQU07SUFBUyxDQUFDLENBQUE7Z0NBSXhELFdBQVcsRUFDWCxTQUFTO0lBQUUsV0FBVztJQUFrQixNQUFNO0lBQVMsU0FBUztJQUFNLFlBQVk7SUFBTSxDQUFDLENBQUE7K0JBSXpGLFdBQVcsRUFDWCxTQUFTO0lBQUUsV0FBVztJQUFrQixNQUFNO0lBQVEsQ0FBQyxDQUFBO3lCQUl2RCxXQUFXLEVBQ1gsU0FBUztJQUFFLFdBQVc7SUFBVSxNQUFNO0lBQVEsQ0FBQyxDQUFBO3NDQUkvQyxXQUFXLEVBQ1gsU0FBUztJQUFFLFdBQVc7SUFBeUIsTUFBTTtJQUFRLENBQUMsQ0FBQTt5Q0FJOUQsV0FBVyxFQUNYLFNBQVM7SUFBRSxXQUFXO0lBQTRCLE1BQU07SUFBUSxDQUFDLENBQUE7b0NBSWpFLFdBQVcsRUFDWCxTQUFTO0lBQUUsV0FBVztJQUF1QixNQUFNO0lBQVMsQ0FBQyxDQUFBO3NDQUc3RCxXQUFXLEVBQ1gsU0FBUztJQUFFLFdBQVc7SUFBeUIsTUFBTTtJQUFRLENBQUMsQ0FBQTtnQ0FJOUQsV0FBVyxFQUNYLFNBQVM7SUFBRSxXQUFXO0lBQW1CLE1BQU07SUFBUyxDQUFDLENBQUE7cUNBR3pELE9BQU8sQ0FBQTtvQ0FDUCxPQUFPLENBQUE7b0NBQ1AsT0FBTyxDQUFBO3FDQTRQUCxhQUFhLEVBQUUsU0FBUyxNQUFNLENBQUMsQ0FBQTtBQWhUaEMsZ0JBQUEsTUFBQSxNQUFBLDhCQUFBO0lBQUEsTUFBQTtJQUFBLE1BQUE7SUFBQSxRQUFBO0lBQUEsU0FBQTtJQUFBLFFBQUE7S0FBQSxNQUFBLFFBQUEsc0JBQUE7S0FBQSxNQUFBLFFBQUEsSUFBZ0I7S0FBZ0IsTUFBQSxLQUFBLFVBQUE7QUFBQSxVQUFoQixtQkFBZ0I7O0tBQUE7SUFBQSxVQUFBO0lBQUEsRUFBQSxnQ0FBQSxvQ0FBQTtBQUloQyxnQkFBQSxNQUFBLE1BQUEsNkJBQUE7SUFBQSxNQUFBO0lBQUEsTUFBQTtJQUFBLFFBQUE7SUFBQSxTQUFBO0lBQUEsUUFBQTtLQUFBLE1BQUEsUUFBQSxxQkFBQTtLQUFBLE1BQUEsUUFBQSxJQUFnQjtLQUFlLE1BQUEsS0FBQSxVQUFBO0FBQUEsVUFBZixrQkFBZTs7S0FBQTtJQUFBLFVBQUE7SUFBQSxFQUFBLCtCQUFBLG1DQUFBO0FBSy9CLGdCQUFBLE1BQUEsTUFBQSwyQkFBQTtJQUFBLE1BQUE7SUFBQSxNQUFBO0lBQUEsUUFBQTtJQUFBLFNBQUE7SUFBQSxRQUFBO0tBQUEsTUFBQSxRQUFBLG1CQUFBO0tBQUEsTUFBQSxRQUFBLElBQWdCO0tBQWEsTUFBQSxLQUFBLFVBQUE7QUFBQSxVQUFiLGdCQUFhOztLQUFBO0lBQUEsVUFBQTtJQUFBLEVBQUEsNkJBQUEsaUNBQUE7QUFLN0IsZ0JBQUEsTUFBQSxNQUFBLDJCQUFBO0lBQUEsTUFBQTtJQUFBLE1BQUE7SUFBQSxRQUFBO0lBQUEsU0FBQTtJQUFBLFFBQUE7S0FBQSxNQUFBLFFBQUEsbUJBQUE7S0FBQSxNQUFBLFFBQUEsSUFBZ0I7S0FBYSxNQUFBLEtBQUEsVUFBQTtBQUFBLFVBQWIsZ0JBQWE7O0tBQUE7SUFBQSxVQUFBO0lBQUEsRUFBQSw2QkFBQSxpQ0FBQTtBQUs3QixnQkFBQSxNQUFBLE1BQUEsMEJBQUE7SUFBQSxNQUFBO0lBQUEsTUFBQTtJQUFBLFFBQUE7SUFBQSxTQUFBO0lBQUEsUUFBQTtLQUFBLE1BQUEsUUFBQSxrQkFBQTtLQUFBLE1BQUEsUUFBQSxJQUFnQjtLQUFZLE1BQUEsS0FBQSxVQUFBO0FBQUEsVUFBWixlQUFZOztLQUFBO0lBQUEsVUFBQTtJQUFBLEVBQUEsNEJBQUEsZ0NBQUE7QUFLNUIsZ0JBQUEsTUFBQSxNQUFBLG9CQUFBO0lBQUEsTUFBQTtJQUFBLE1BQUE7SUFBQSxRQUFBO0lBQUEsU0FBQTtJQUFBLFFBQUE7S0FBQSxNQUFBLFFBQUEsWUFBQTtLQUFBLE1BQUEsUUFBQSxJQUFnQjtLQUFNLE1BQUEsS0FBQSxVQUFBO0FBQUEsVUFBTixTQUFNOztLQUFBO0lBQUEsVUFBQTtJQUFBLEVBQUEsc0JBQUEsMEJBQUE7QUFLdEIsZ0JBQUEsTUFBQSxNQUFBLGlDQUFBO0lBQUEsTUFBQTtJQUFBLE1BQUE7SUFBQSxRQUFBO0lBQUEsU0FBQTtJQUFBLFFBQUE7S0FBQSxNQUFBLFFBQUEseUJBQUE7S0FBQSxNQUFBLFFBQUEsSUFBZ0I7S0FBbUIsTUFBQSxLQUFBLFVBQUE7QUFBQSxVQUFuQixzQkFBbUI7O0tBQUE7SUFBQSxVQUFBO0lBQUEsRUFBQSxtQ0FBQSx1Q0FBQTtBQUtuQyxnQkFBQSxNQUFBLE1BQUEsb0NBQUE7SUFBQSxNQUFBO0lBQUEsTUFBQTtJQUFBLFFBQUE7SUFBQSxTQUFBO0lBQUEsUUFBQTtLQUFBLE1BQUEsUUFBQSw0QkFBQTtLQUFBLE1BQUEsUUFBQSxJQUFnQjtLQUFzQixNQUFBLEtBQUEsVUFBQTtBQUFBLFVBQXRCLHlCQUFzQjs7S0FBQTtJQUFBLFVBQUE7SUFBQSxFQUFBLHNDQUFBLDBDQUFBO0FBS3RDLGdCQUFBLE1BQUEsTUFBQSwrQkFBQTtJQUFBLE1BQUE7SUFBQSxNQUFBO0lBQUEsUUFBQTtJQUFBLFNBQUE7SUFBQSxRQUFBO0tBQUEsTUFBQSxRQUFBLHVCQUFBO0tBQUEsTUFBQSxRQUFBLElBQWdCO0tBQWlCLE1BQUEsS0FBQSxVQUFBO0FBQUEsVUFBakIsb0JBQWlCOztLQUFBO0lBQUEsVUFBQTtJQUFBLEVBQUEsaUNBQUEscUNBQUE7QUFJakMsZ0JBQUEsTUFBQSxNQUFBLGlDQUFBO0lBQUEsTUFBQTtJQUFBLE1BQUE7SUFBQSxRQUFBO0lBQUEsU0FBQTtJQUFBLFFBQUE7S0FBQSxNQUFBLFFBQUEseUJBQUE7S0FBQSxNQUFBLFFBQUEsSUFBZ0I7S0FBbUIsTUFBQSxLQUFBLFVBQUE7QUFBQSxVQUFuQixzQkFBbUI7O0tBQUE7SUFBQSxVQUFBO0lBQUEsRUFBQSxtQ0FBQSx1Q0FBQTtBQUtuQyxnQkFBQSxNQUFBLE1BQUEsMkJBQUE7SUFBQSxNQUFBO0lBQUEsTUFBQTtJQUFBLFFBQUE7SUFBQSxTQUFBO0lBQUEsUUFBQTtLQUFBLE1BQUEsUUFBQSxtQkFBQTtLQUFBLE1BQUEsUUFBQSxJQUFnQjtLQUFhLE1BQUEsS0FBQSxVQUFBO0FBQUEsVUFBYixnQkFBYTs7S0FBQTtJQUFBLFVBQUE7SUFBQSxFQUFBLDZCQUFBLGlDQUFBO0FBRXBCLGdCQUFBLE1BQUEsTUFBQSxnQ0FBQTtJQUFBLE1BQUE7SUFBQSxNQUFBO0lBQUEsUUFBQTtJQUFBLFNBQUE7SUFBQSxRQUFBO0tBQUEsTUFBQSxRQUFBLHdCQUFBO0tBQUEsTUFBQSxRQUFBLElBQW1CO0tBQWtCLE1BQUEsS0FBQSxVQUFBO0FBQUEsVUFBbEIscUJBQWtCOztLQUFBO0lBQUEsVUFBQTtJQUFBLEVBQUEsa0NBQUEsc0NBQUE7QUFDckMsZ0JBQUEsTUFBQSxNQUFBLCtCQUFBO0lBQUEsTUFBQTtJQUFBLE1BQUE7SUFBQSxRQUFBO0lBQUEsU0FBQTtJQUFBLFFBQUE7S0FBQSxNQUFBLFFBQUEsdUJBQUE7S0FBQSxNQUFBLFFBQUEsSUFBbUI7S0FBaUIsTUFBQSxLQUFBLFVBQUE7QUFBQSxVQUFqQixvQkFBaUI7O0tBQUE7SUFBQSxVQUFBO0lBQUEsRUFBQSxpQ0FBQSxxQ0FBQTtBQUNwQyxnQkFBQSxNQUFBLE1BQUEsK0JBQUE7SUFBQSxNQUFBO0lBQUEsTUFBQTtJQUFBLFFBQUE7SUFBQSxTQUFBO0lBQUEsUUFBQTtLQUFBLE1BQUEsUUFBQSx1QkFBQTtLQUFBLE1BQUEsUUFBQSxJQUFtQjtLQUFpQixNQUFBLEtBQUEsVUFBQTtBQUFBLFVBQWpCLG9CQUFpQjs7S0FBQTtJQUFBLFVBQUE7SUFBQSxFQUFBLGlDQUFBLHFDQUFBO0FBNlA3QyxnQkFBQSxNQUFBLE1BQUEsZ0NBQUE7SUFBQSxNQUFBO0lBQUEsTUFBQTtJQUFBLFFBQUE7SUFBQSxTQUFBO0lBQUEsUUFBQTtLQUFBLE1BQUEsUUFBQSx3QkFBQTtLQUFBLE1BQUEsUUFBQSxJQUFVO0tBQWtCO0lBQUEsVUFBQTtJQUFBLEVBQUEsTUFBQSwyQkFBQTs7Ozs7Ozs7O0FBeFRMLFFBQUEsU0FBUztJQUM5QixnQkFBZ0I7SUFDaEIsZUFBZTtJQUNQOztFQUlWOztFQUFBLElBQWdCLG1CQUFnQjtBQUFBLFVBQUEsTUFBQTs7RUFBaEMsSUFBZ0IsaUJBQWdCLE9BQUE7QUFBQSxTQUFBLG9DQUFBOztFQUloQzs7RUFBQSxJQUFnQixrQkFBZTtBQUFBLFVBQUEsTUFBQTs7RUFBL0IsSUFBZ0IsZ0JBQWUsT0FBQTtBQUFBLFNBQUEsbUNBQUE7O0VBSy9COztFQUFBLElBQWdCLGdCQUFhO0FBQUEsVUFBQSxNQUFBOztFQUE3QixJQUFnQixjQUFhLE9BQUE7QUFBQSxTQUFBLGlDQUFBOztFQUs3Qjs7RUFBQSxJQUFnQixnQkFBYTtBQUFBLFVBQUEsTUFBQTs7RUFBN0IsSUFBZ0IsY0FBYSxPQUFBO0FBQUEsU0FBQSxpQ0FBQTs7RUFLN0I7O0VBQUEsSUFBZ0IsZUFBWTtBQUFBLFVBQUEsTUFBQTs7RUFBNUIsSUFBZ0IsYUFBWSxPQUFBO0FBQUEsU0FBQSxnQ0FBQTs7RUFLNUI7O0VBQUEsSUFBZ0IsU0FBTTtBQUFBLFVBQUEsTUFBQTs7RUFBdEIsSUFBZ0IsT0FBTSxPQUFBO0FBQUEsU0FBQSwwQkFBQTs7RUFLdEI7O0VBQUEsSUFBZ0Isc0JBQW1CO0FBQUEsVUFBQSxNQUFBOztFQUFuQyxJQUFnQixvQkFBbUIsT0FBQTtBQUFBLFNBQUEsdUNBQUE7O0VBS25DOztFQUFBLElBQWdCLHlCQUFzQjtBQUFBLFVBQUEsTUFBQTs7RUFBdEMsSUFBZ0IsdUJBQXNCLE9BQUE7QUFBQSxTQUFBLDBDQUFBOztFQUt0Qzs7RUFBQSxJQUFnQixvQkFBaUI7QUFBQSxVQUFBLE1BQUE7O0VBQWpDLElBQWdCLGtCQUFpQixPQUFBO0FBQUEsU0FBQSxxQ0FBQTs7RUFJakM7RUFBQSxJQUFnQixzQkFBbUI7QUFBQSxVQUFBLE1BQUE7O0VBQW5DLElBQWdCLG9CQUFtQixPQUFBO0FBQUEsU0FBQSx1Q0FBQTs7RUFLbkM7O0VBQUEsSUFBZ0IsZ0JBQWE7QUFBQSxVQUFBLE1BQUE7O0VBQTdCLElBQWdCLGNBQWEsT0FBQTtBQUFBLFNBQUEsaUNBQUE7O0VBRXBCO0VBQUEsSUFBbUIscUJBQWtCO0FBQUEsVUFBQSxNQUFBOztFQUFyQyxJQUFtQixtQkFBa0IsT0FBQTtBQUFBLFNBQUEsc0NBQUE7O0VBQ3JDO0VBQUEsSUFBbUIsb0JBQWlCO0FBQUEsVUFBQSxNQUFBOztFQUFwQyxJQUFtQixrQkFBaUIsT0FBQTtBQUFBLFNBQUEscUNBQUE7O0VBQ3BDO0VBQUEsSUFBbUIsb0JBQWlCO0FBQUEsVUFBQSxNQUFBOztFQUFwQyxJQUFtQixrQkFBaUIsT0FBQTtBQUFBLFNBQUEscUNBQUE7O0VBbUY3QyxjQUFBO0FBQ0UsVUFBTztBQXhJTyxTQUFBLHFDQVJMLGtCQUFBLE1BQUEsMkJBQTBCLEVBQUEsa0JBQUEsTUFBQSxnQ0FRaUIsS0FBSztBQUkzQyxTQUFBLG9DQUFBLGtCQUFBLE1BQUEsb0NBQUEsRUFBQSxrQkFBQSxNQUFBLCtCQUFtQyxPQUFNO0FBS3pDLFNBQUEsa0NBQUEsa0JBQUEsTUFBQSxtQ0FBQSxFQUFBLGtCQUFBLE1BQUEsNkJBQXlCLEtBQUk7QUFLN0IsU0FBQSxrQ0FBQSxrQkFBQSxNQUFBLGlDQUFBLEVBQUEsa0JBQUEsTUFBQSw2QkFBeUIsTUFBSztBQUs5QixTQUFBLGlDQUFBLGtCQUFBLE1BQUEsaUNBQUEsRUFBQSxrQkFBQSxNQUFBLDRCQUF1QixHQUFFO0FBS3pCLFNBQUEsMkJBQUEsa0JBQUEsTUFBQSxnQ0FBQSxFQUFBLGtCQUFBLE1BQUEsc0JBQWlCLEtBQUs7QUFLdEIsU0FBQSx3Q0FBQSxrQkFBQSxNQUFBLDBCQUFBLEVBQUEsa0JBQUEsTUFBQSxtQ0FBOEIsR0FBRTtBQUtoQyxTQUFBLDJDQUFBLGtCQUFBLE1BQUEsdUNBQUEsRUFBQSxrQkFBQSxNQUFBLHNDQUFpQyxHQUFFO0FBS25DLFNBQUEsc0NBQUEsa0JBQUEsTUFBQSwwQ0FBQSxFQUFBLGtCQUFBLE1BQUEsaUNBQTZCLE1BQUs7QUFJbEMsU0FBQSx3Q0FBQSxrQkFBQSxNQUFBLHFDQUFBLEVBQUEsa0JBQUEsTUFBQSxtQ0FBOEIsR0FBRTtBQUtoQyxTQUFBLGtDQUFBLGtCQUFBLE1BQUEsdUNBQUEsRUFBQSxrQkFBQSxNQUFBLDZCQUF5QixNQUFLO0FBRWxCLFNBQUEsdUNBQUEsa0JBQUEsTUFBQSxpQ0FBQSxFQUFBLGtCQUFBLE1BQUEsa0NBQTZCLEdBQUU7QUFDL0IsU0FBQSxzQ0FBQSxrQkFBQSxNQUFBLHNDQUFBLEVBQUEsa0JBQUEsTUFBQSxpQ0FBNEIsR0FBRTtBQUM5QixTQUFBLHNDQUFBLGtCQUFBLE1BQUEscUNBQUEsRUFBQSxrQkFBQSxNQUFBLGlDQUE0QixHQUFFO0FBR2hELFFBQUEsc0JBQWtCLGtCQUFBLE1BQUEscUNBQUEsRUFBRztBQUVyQixRQUFBLG9CQUFvQjtBQUdwQixRQUFBLG9CQUFvQixLQUFLLHFCQUFxQixLQUFLO0FBRW5ELFFBQUEsdUJBQXVCO0FBRXZCLFFBQUEsb0JBQTRCO0FBRTVCLFFBQUEsb0JBQXNDO0lBQUUsR0FBRztJQUFHLEdBQUc7SUFBRztBQUlwRCxRQUFBLHdCQUFnQztBQUNoQyxRQUFBLDJCQUErQyxFQUFFO0FBQ2pELFFBQUEsc0JBQXVDLGdCQUFnQjtBQUN2RCxRQUFBLHNCQUE4QjtBQUM5QixRQUFBLHlCQUFpQztBQUNqQyxRQUFBLDBCQUFrQztBQUNsQyxRQUFBLGtDQUE2RCxFQUFFO0FBQy9ELFFBQUEsdUJBQW9DO0FBQ3BDLFFBQUEsa0JBQStCO0FBQy9CLFFBQUEsb0JBQWtDO0FBQ2xDLFFBQUEsNkJBQTRDO0FBQzVDLFFBQUEseUJBQWlDO0FBQ2pDLFFBQUEsd0JBQWdDO0FBQ2hDLFFBQUEsaUNBQTBDO0FBQzFDLFFBQUEsZ0NBQStEO0lBQ3ZFLE9BQU8sRUFBRTtJQUNULFVBQVUsRUFBQTtJQUNYO0FBQ1MsUUFBQSwyQ0FBMkM7QUFDM0MsUUFBQSx1QkFBdUI7QUFDdkIsUUFBQSxrQkFBa0I7QUFDbEIsUUFBQSx1QkFBdUI7QUFDdkIsUUFBQSxtQkFBbUI7QUFDbkIsUUFBQSxnQ0FBZ0M7QUFDaEMsUUFBQSwyQkFBMkI7SUFDbkMsV0FBVztJQUNYLFlBQVk7SUFDWixTQUFTO0lBQ1QsV0FBVztJQUNYLEtBQUs7SUFDTCxPQUFPO0lBQ0M7QUFFQSxRQUFBLDJCQUFxRCxFQUM3RCxPQUFPLEVBQUUsRUFDVjtBQUdTLFFBQUEsNkJBQTZCLENBQUMsYUFBYTtBQUczQyxRQUFBLGtCQUFrQjtJQUMxQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDRDtBQUdTLFFBQUEsOEJBQThCO0lBQ3RDO0lBQ0E7SUFDQTtJQUNBO0lBQ0Q7QUFFTyxRQUFBLG9DQUFvQztBQUVwQyxRQUFBLHNCQUFzQjtBQXUzQ3RCLFFBQUEsa0NBQWtDLGdCQUFtQztBQUMzRSxRQUFJLENBQUMsWUFDSCxRQUFPLEVBQUU7SUFHWCxNQUFNLG9CQUFvQixhQUN0QixJQUFJLFNBQVUsWUFBa0I7QUFLaEMsWUFBTztNQUNMLEtBQUs7TUFDTCxTQUFTLGFBQWEsYUFBYSxVQUFVLGFBQWEsYUFBYSxVQUFVO01BQ2xGO01BQ0QsQ0FFRCxRQUFRLGtCQUFrQixzQkFBc0IsUUFBUSxjQUFjLFFBQVEsS0FBSyxHQUFHLENBRXRGLFFBQ0UsT0FBTyxPQUFPLFNBQ2IsS0FBSyxLQUFLLFlBQVksUUFBUSxRQUFRLENBQUMsUUFBUSxNQUFNLFFBQVEsS0FBSyxNQUNyRSxDQUVBLEtBQUssa0JBQWtCLGNBQWMsSUFBSSxDQUV6QyxNQUFNLEdBQUcsdUJBQXVCO0FBQ25DLFdBQU8sb0JBQW9CLG9CQUFvQixFQUFFOztBQTU0Q2pELFFBQUssaUJBQWlCLGNBQWMsS0FBSyxrQ0FBa0MsQ0FBQzs7RUFHM0QsV0FBVyxtQkFBdUM7QUFDbkUsU0FBTSxXQUFXLGtCQUFrQjtBQUVuQyxPQUFJLGtCQUFrQixJQUFJLG1CQUFtQixFQUFFO0FBQzdDLFNBQUssbUJBQW1CLEtBQUssa0JBQWtCLFNBQVM7QUFFeEQsU0FBSyxpQ0FBaUM7QUFDdEMsU0FBSyxvQ0FBb0M7QUFDekMsU0FBSyxzQ0FBc0M7O0FBRzdDLE9BQUksa0JBQWtCLElBQUksZUFBZSxFQUFFO0FBQ3pDLFNBQUssb0JBQW9CLEtBQUsscUJBQXFCLEtBQUs7QUFDeEQsU0FBSyxPQUFPLFlBQVksb0NBQW9DLEdBQUcsS0FBSyxhQUFZLElBQUs7QUFDckYsU0FBSyxpQ0FBaUM7QUFDdEMsU0FBSyxzQ0FBc0M7O0FBSTdDLE9BQUksa0JBQWtCLElBQUksU0FBUyxJQUFJLENBQUMsQ0FBQyxLQUFLLFFBQVE7SUFDcEQsTUFBTSx1QkFBdUIsS0FBSyxpQkFBaUIsS0FBSywwQkFBMEI7QUFDbEYsUUFBSSxzQkFBc0IsV0FBVyxRQUFRO0FBQzNDLFVBQUssZUFBZSxLQUFLLFNBQVMscUJBQXFCLFdBQVcsR0FBRyxVQUFVO0FBQy9FLFVBQUssb0JBQW9CLEtBQUsscUJBQXFCLEtBQUs7QUFDeEQsVUFBSyxPQUFPLFlBQVksb0NBQW9DLEdBQUcsS0FBSyxhQUFZLElBQUs7QUFFckYsVUFBSyxpQ0FBaUM7QUFDdEMsVUFBSyxzQ0FBc0M7OztBQUkvQyxPQUFJLGtCQUFrQixJQUFJLGdCQUFnQixFQUFFO0FBQzFDLFNBQUssaUNBQWlDO0FBQ3RDLFNBQUssc0NBQXNDOztBQUc3QyxPQUFJLGtCQUFrQixJQUFJLHNCQUFzQixFQUFFO0FBR2hELFNBQUssb0NBQW9DO0FBQ3pDLHFCQUFpQixLQUFLLHlCQUF5QixLQUFLLG9CQUFvQixFQUFFLEVBQUU7OztFQUl0RSx1QkFBdUIsY0FBb0I7QUFDbkQsUUFBSyxxQkFBcUI7R0FDMUIsSUFBSSx1QkFBdUIsS0FBSztBQUNoQyxPQUFJLGdCQUFnQixvQkFBb0IsdUJBQXVCLEVBQzdELHdCQUNFLEtBQUssMEJBQTBCLEtBQUssS0FBSyx5QkFBeUIsSUFBSTtZQUV4RSxnQkFBZ0IscUJBQ2hCLHVCQUNFLEtBQUssaUJBQWlCLEtBQUssd0JBQXdCLFdBQVcsU0FBUyxFQUV6RSx3QkFDRSxLQUFLLDBCQUEwQixLQUFLLEtBQUsseUJBQXlCLElBQUk7QUFHMUUsUUFBSyx5QkFBeUIscUJBQXFCOzs7Ozs7RUFPN0Msa0NBQStCO0FBQ3JDLFFBQUssd0JBQXdCO0FBRTdCLE9BQUksS0FBSyxpQkFHUCxNQUFLLDRCQUE0QjtBQUduQyxRQUFLLDhCQUE4QjtBQUNuQyxRQUFLLDZDQUE2QztBQUNsRCxRQUFLLDJDQUEyQzs7O0VBSXhDLHVDQUFvQztBQUM1QyxRQUFLLGtCQUFrQixLQUFLLFlBQVksY0FDdEMsOEJBQ2M7QUFDaEIsUUFBSyx1QkFBdUIsS0FBSyxZQUFZLGNBQzNDLG1DQUNjO0dBRWhCLE1BQU0sc0JBQXNCLEtBQUssbUJBQzdCLEtBQUssaUJBQWlCLEtBQUsseUJBQzNCO0FBQ0osT0FBSSx1QkFBdUIsb0JBQW9CLFdBQVcsU0FBUyxHQUFHO0lBRXBFLE1BQU0sK0JBQ0osb0JBQW9CLFdBQVcsR0FBRyxVQUFVLElBQUksS0FBSyxlQUFlLEtBQUs7SUFJM0UsTUFBTSx3QkFBd0IsS0FBSyxpQkFBaUIsU0FBUyxLQUFLLEtBQUs7QUFFdkUsU0FBSyxPQUFPLFlBQ1YsaUNBQ0EsR0FBRywrQkFBK0IsS0FBSyxpQkFBaUIsU0FBUyx1QkFDbEU7QUFDRCxTQUFLLE9BQU8sWUFBWSxnQ0FBZ0MsR0FBRyxLQUFLLGlCQUFpQixTQUFTOztBQUc1RixPQUFJLEtBQUssc0JBQXNCO0FBQzdCLFNBQUssMEJBQTBCLEtBQUssZ0JBQ2hDLEtBQUsscUJBQXFCLHVCQUF1QixDQUFDLFNBQ2xELEtBQUsscUJBQXFCLHVCQUF1QixDQUFDO0lBR3RELE1BQU0saUJBQWlCLEtBQUsscUJBQXFCLGNBQWMsVUFBOEI7QUFDN0YsUUFBSSxnQkFBZ0I7S0FDbEIsTUFBTSxzQkFBc0IsZ0JBQWdCLHVCQUF1QjtBQUNuRSxVQUFLLG9CQUFvQixLQUFLLGdCQUMxQixvQkFBb0IsU0FDcEIsb0JBQW9COzs7QUFJNUIsT0FBSSxLQUFLLG1CQUFtQixxQkFBcUI7SUFFL0MsSUFBSSxxQkFBcUI7QUFDekIsU0FBSyx5QkFBeUIsS0FBSyxnQkFDL0IsS0FBSyxnQkFBZ0IsdUJBQXVCLENBQUMsU0FDN0MsS0FBSyxnQkFBZ0IsdUJBQXVCLENBQUM7QUFHakQsU0FBSyxrQ0FBa0Msb0JBQW9CLFdBQVcsS0FBSyxHQUFHLFVBQVM7S0FDckYsTUFBTSxpQkFDSixLQUFLLHlCQUF5QixNQUFNLEtBQUssdUJBQXVCLFlBQVk7S0FDOUUsTUFBTSxZQUFZO0FBSWxCLDJCQUNFLGVBQWUsU0FDZCxDQUFDLGVBQWUseUJBQ2IsS0FBSyxvQkFDTCxJQUFJLEtBQUs7QUFFZixZQUFPO01BQ0wsT0FBTztNQUNQLEtBQUs7TUFDTCxPQUFPLGVBQWU7TUFDSTtNQUM1QjtBQUdGLFNBQUssc0JBQXNCLHFCQUFxQixLQUFLOzs7Ozs7Ozs7RUFXL0MscUJBQWtCO0FBQzFCLE9BQUksS0FBSyxlQUdQLGNBQWEsS0FBSyxlQUFlO0FBR25DLFFBQUssaUJBQWlCLGlCQUFpQixLQUFLLGdDQUFnQyxFQUFFLElBQUk7Ozs7Ozs7O0VBUzFFLG1DQUFtQyxpQkFBdUI7QUFDbEUsT0FBSSxDQUFDLEtBQUssNENBQTRDLENBQUMsS0FBSyxlQUFlO0FBQ3pFLFNBQUssMkNBQTJDO0FBQ2hELFNBQUsseUJBQ0gsb0JBQW9CLElBQ2hCLEtBQUssMkJBQTJCLEdBQUcsR0FDbkMsS0FBSywyQkFBMkIsZ0JBQWdCO0FBQ3RELFNBQUssdUJBQXVCOzs7O0VBS3RCLDRCQUF5QjtBQUVqQyxRQUFLLG9CQUFvQjs7O0VBSWpCLDhCQUNSLE9BQ0EseUJBQStCO0FBRS9CLE9BQUksTUFBTSxRQUFRLEtBQUsseUJBQXlCLEtBQUs7QUFDbkQsU0FBSyx3QkFBd0IsT0FBTyxjQUFjLHdCQUF3QjtBQUMxRTs7QUFJRixPQUFJLDRCQUE0QixNQUFNLENBQ3BDLE1BQUssNkJBQTZCLE1BQU07OztFQUtwQyx3QkFDTixPQUNBLFdBQ0EsY0FBcUI7R0FFckIsTUFBTSxhQUFhLE1BQU07R0FDekIsTUFBTSxrQkFBa0IsTUFBTTtBQUU5QixPQUFJLGVBQWUsS0FBSyx5QkFBeUI7UUFHM0MsYUFBYSxjQUFjO0FBQzdCLFNBQUksZ0JBQWdCLEtBQUs7VUFFckIsQ0FBQyxLQUFLLHFCQUNOLENBQUMsbUJBQ0QsS0FBSyx5QkFBeUIsY0FBYyxnQkFDNUMsS0FBSyxxQkFBcUIsR0FFMUIsTUFBSyxvQkFBb0I7ZUFDaEIsbUJBQW1CLEtBQUssbUJBQW1CO0FBRXBELFlBQUssb0JBQW9CO0FBQ3pCLFlBQUssa0JBQWtCLEtBQUssa0JBQWtCOztXQUdoRCxNQUFLLG9CQUFvQjtBQUczQixVQUFLLGtDQUFrQyxhQUFjO2VBRzlDLGFBQWEsV0FBVztBQUMvQixXQUFNLGdCQUFnQjtBQUN0QixTQUFJLGdCQUNGLE1BQUssbUNBQW1DLFdBQVc7U0FFbkQsTUFBSyxtQ0FBbUMsV0FBVzs7Ozs7Ozs7RUFVakQsNkJBQTZCLE9BQW9CO0dBQ3pELE1BQU0sWUFBWSxNQUFNLFFBQVEsS0FBSyx5QkFBeUI7R0FDOUQsTUFBTSxZQUFZLE1BQU0sWUFBWTtBQUlwQyxPQUNHLENBQUMsS0FBSyxpQkFBaUIsS0FBSywyQkFBMkIsS0FBSyxhQUM1RCxLQUFLLDJCQUEyQixLQUFLLHlCQUF5QixTQUFTLEtBQUssVUFFN0U7R0FHRixNQUFNLGFBQWEsTUFBTTtBQUN6QixRQUFLLGlDQUFpQztBQUd0QyxPQUFJLENBQUMsS0FBSyxrQ0FBa0MsYUFBYSxXQUN2RCxNQUFLLGdDQUFnQztBQUt2QyxPQUFJLFdBQVc7QUFDYixTQUFLLHdCQUF3QixPQUFPLFVBQVU7QUFDOUM7O0FBSUYsT0FBSSxLQUFLLDJCQUEyQixNQUFNLDRCQUE0QixNQUFNLEVBQUU7QUFDNUUsVUFBTSxnQkFBZ0I7QUFFdEIsWUFBUSxZQUFSO0tBQ0UsS0FBSyxLQUFLLHlCQUF5QjtNQUNqQztPQUNFLE1BQU0sd0JBQWdDLEtBQUssZ0JBQ3ZDLEtBQUsseUJBQXlCLFlBQzlCO0FBQ0osWUFBSywyQkFBMkIsc0JBQXNCOztBQUV4RDtLQUNGLEtBQUssS0FBSyx5QkFBeUI7TUFDakM7T0FDRSxNQUFNLHlCQUFpQyxLQUFLLGdCQUN4QyxLQUFLLHlCQUF5QixVQUM5QjtBQUNKLFlBQUssMkJBQTJCLHVCQUF1Qjs7QUFFekQ7S0FDRixLQUFLLEtBQUsseUJBQXlCO01BQ2pDO09BQ0UsTUFBTSxzQkFBOEIsS0FBSyxnQkFDckMsS0FBSyx5QkFBeUIsWUFDOUI7QUFDSixZQUFLLDJCQUEyQixvQkFBb0I7O0FBRXREO0tBQ0YsS0FBSyxLQUFLLHlCQUF5QjtNQUNqQztPQUNFLE1BQU0sd0JBQWdDLEtBQUssZ0JBQ3ZDLEtBQUsseUJBQXlCLGFBQzlCO0FBQ0osWUFBSywyQkFBMkIsc0JBQXNCOztBQUV4RDtLQUNGLFFBQ0U7Ozs7Ozs7O0VBU0Usd0JBQXFCO0FBRTdCLE9BQUksQ0FBQyxLQUFLLGdCQUFpQjtBQUczQixPQUFJLEtBQUssbUNBQW1DO0FBQzFDLFNBQUssb0NBQW9DO0FBQ3pDOztBQUlGLE9BQ0UsS0FBSyx5QkFBeUIsS0FBSywyQkFDbkMsS0FBSyx5QkFBeUIsS0FBSyx3QkFBd0IsY0FDM0Q7QUFDQSxTQUFLLDhCQUE4QjtBQUNuQzs7QUFLRixPQUFJLEtBQUssd0JBQXdCLEtBQUssaUJBQWlCO0lBQ3JELE1BQU0sZUFBZSxLQUFLLGdDQUFnQztBQUUxRCxRQUFJLGNBQWM7QUFDaEIsVUFBSyxxQkFBcUI7QUFDMUIsVUFBSyxrQkFBa0IsYUFBYTtBQUNwQyxVQUFLLG9CQUFvQjtVQUd6QixNQUFLLDhCQUE4QjtVQUtsQztBQUNILFNBQUsscUJBQXFCO0FBRTFCLFNBQUssdUJBQXVCO0FBQzVCLFNBQUssOEJBQThCOzs7RUFJN0IseUJBQXlCLHVCQUE2QjtBQUM5RCxPQUNFLEtBQUssbUJBQW1CLHNCQUFzQixJQUM5QywwQkFBMEIsS0FBSyx3QkFDL0I7QUFDQSxTQUFLLG9CQUFvQjtBQUN6QixTQUFLLGtCQUFrQjtBQUN2QixTQUFLLHVCQUF1QjtBQUM1QixTQUFLLHlCQUF5QjtBQUM5QixTQUFLLHdCQUF3QixLQUFLLDRCQUE0QjtBQUM5RCxTQUFLLGlDQUFpQztJQUV0QyxNQUFNLG9CQUFvQixLQUFLLDBCQUEwQjtBQUt6RCxTQUhFLEtBQUssdUJBQXVCLE1BQU0sS0FBSyx5QkFBeUIsTUFHNUIsS0FBSyw4QkFBOEIsRUFBRTtBQUN6RSxVQUFLLHNCQUFzQixLQUFLLGdCQUFnQjtBQUNoRCxVQUFLLGdCQUFnQixTQUFTO01BQzVCLEtBQUssS0FBSyxnQkFBZ0Isb0JBQW9CO01BQzlDLE1BQU0sS0FBSyxnQkFBZ0IsSUFBSTtNQUMvQixVQUFVO01BQ1gsQ0FBQztVQUVGLE1BQUssNEJBQTRCO0FBSW5DLFNBQUssa0NBQWtDLHNCQUFzQjs7O0VBSXZELGtCQUFrQixPQUFtQjtBQUM3QyxRQUFLLHFCQUFxQjtBQUMxQixPQUFJLE9BQU87QUFDVCxTQUFLLG9CQUFvQjtBQUN6QixTQUFLLCtCQUErQixNQUFNO0lBRTFDLE1BQU0sdUJBQXVCLEtBQUssc0JBQXNCO0FBQ3hELFFBQUksc0JBQXNCO0FBQ3hCLDBCQUFxQixhQUFhLFlBQVksUUFBUTtLQUd0RCxNQUFNLHdCQUF3QixpQkFBZ0I7TUFDNUMsTUFBTSxVQUFVLEtBQUssa0JBQ25CLEtBQUssdUJBQ0wsS0FBSyx3QkFDTCxNQUFNLE9BQ1A7QUFDRCxXQUFLLGdDQUFnQyxRQUFRO0FBQzdDLG1CQUFhLHNCQUFzQjtRQUNsQyxFQUFFOzs7O0VBS0Qsc0JBQW1CO0dBQzNCLE1BQU0sdUJBQXVCLEtBQUssc0JBQXNCO0FBQ3hELE9BQUksc0JBQXNCO0FBQ3hCLHlCQUFxQixhQUFhLFlBQVksVUFBVTtBQUN4RCxTQUFLLCtCQUErQixLQUFLO0FBQ3pDLFNBQUssb0JBQW9COzs7RUFJbkIsdUJBQ1Isa0JBQ0EsZ0JBQ0EsZ0JBQ0EsaUJBQXlCO0FBRXpCLE9BQUksa0JBQWtCLENBQUMsZUFHckIsa0JBQWlCLEtBQUssS0FBSyxvQkFBb0I7QUFHakQsT0FBSSxnQkFHRixrQkFBaUIsS0FBSyxLQUFLO0FBRzdCLFVBQU87SUFDTCxHQUFHLEtBQUssTUFBTSxLQUFLLGVBQWUsaUJBQWlCLEVBQUU7SUFDckQsR0FBRyxLQUFLLE1BQU0sS0FBSyxlQUFlLGlCQUFpQixFQUFBO0lBQ3BEOztFQUdPLHNCQUNSLGlCQUNBLGtCQUNBLGdCQUNBLGdCQUF3QjtBQUV4QixPQUFJLGtCQUFrQixrQkFBa0I7SUFDdEMsTUFBTSxlQUFlLGlCQUNqQixlQUFlLElBQ2YsZUFBZSxJQUFJLEtBQUs7QUFFNUIsUUFBSSxnQkFBZ0IsTUFBTSxFQUN4QixpQkFBZ0IsS0FBSyxLQUFLO2FBQ2pCLGdCQUFnQixJQUFJLGlCQUFpQixNQUFNLGFBQ3BELGlCQUFnQixLQUFLLEtBQUs7O0FBSTlCLFVBQU87SUFDTCxHQUFHLEtBQUssTUFBTSxLQUFLLGVBQWUsZ0JBQWdCLEVBQUU7SUFDcEQsR0FBRyxLQUFLLE1BQU0sS0FBSyxlQUFlLGdCQUFnQixFQUFFO0lBQ3BELEdBQUcsZ0JBQWdCO0lBQ3BCOzs7Ozs7OztFQVNPLDBCQUNSLGFBQ0EsZ0JBQWdDO0FBRWhDLFVBQ0UsWUFBWSxTQUFTLE1BQU0sS0FDM0IsWUFBWSxTQUFTLElBQUksWUFBWSxVQUFVLE1BQU0sZUFBZTs7Ozs7Ozs7RUFVOUQsbUNBQ1IsUUFBMkI7R0FFM0IsTUFBTSxjQUF1QztJQUFFLE9BQU87SUFBRyxVQUFVO0lBQUc7R0FDdEUsTUFBTSxhQUFhLFFBQVEsUUFBUSxhQUFhLGNBQW9CO0FBQ2xFLFFBQUksVUFBVSxVQUFVLE9BQ3RCLFFBQU87QUFHVCxRQUFJLFVBQVUsU0FBUyxPQUNyQixhQUFZO1FBRVosYUFBWTtBQUVkLFdBQU87TUFDTixZQUFZO0FBQ2YsVUFBTyxhQUFhLGFBQWE7Ozs7OztFQU8zQixpQ0FBOEI7R0FDcEMsTUFBTSx1QkFBdUIsS0FBSyxrQkFDOUIsS0FBSyx5QkFDTCxLQUFLLHVDQUF1QztBQU1oRCxPQUFJLEtBQUssZ0NBQWdDO0FBS3ZDLFFBRkUsS0FBSyxJQUFJLEtBQUssc0JBQXNCLEtBQUssZ0JBQWdCLFdBQVcsR0FDcEUsS0FBSyxlQUFlLEVBRXBCLE1BQUsscUJBQXFCO0FBRzVCLFNBQUssaUNBQWlDO0FBQ3RDOztBQUdGLFFBQUssc0JBQXNCLEtBQUssZ0JBQWdCO0FBR2hELFFBQUssb0JBQW9CO0FBSXpCLE9BQUksS0FBSywyQkFBMkIsR0FDbEMsTUFBSyx5QkFBeUI7QUFHaEMsT0FBSSxLQUFLLDhCQUE4QixDQUNyQyxNQUFLLHlCQUF5QjtPQUU5QixNQUFLLHlCQUNILHVCQUF1QixLQUFLLHlCQUN4QixLQUFLLHlCQUNMO0FBR1IsT0FBSSxDQUFDLEtBQUssZ0JBRVIsTUFBSyxrQ0FBa0MscUJBQXFCO0FBRTlELFFBQUssaUNBQWlDO0FBQ3RDLFFBQUssNEJBQTRCO0FBRWpDLE9BQUksQ0FBQyxLQUFLLGVBQWU7QUFDdkIsU0FBSyx1QkFBdUI7QUFDNUIsU0FBSyxrQkFBa0I7Ozs7Ozs7O0VBU25CLGtDQUFrQyx1QkFBNkI7QUFFckUsb0JBQWdCO0FBQ2QsUUFBSSxLQUFLLGlCQUFpQixLQUFLLHNCQUFzQjtLQUNuRCxNQUFNLDZCQUE2QixLQUFLLDBCQUEwQjtLQUVsRSxNQUFNLGdCQURzQix3QkFBd0IsS0FBSyxvQkFFakMsNkJBQTZCLEtBQUs7QUFDMUQsVUFBSyxxQkFBcUIsU0FBUztNQUNqQyxLQUFLLEtBQUssZ0JBQWdCLGdCQUFnQjtNQUMxQyxNQUFNLEtBQUssZ0JBQWdCLElBQUk7TUFDL0IsVUFBVTtNQUNYLENBQUM7O01BRUgsR0FBRzs7Ozs7RUFNQSxrQ0FBK0I7QUFDckMsUUFBSyxzQkFDSCxLQUFLLHlCQUF5QixLQUFLLHFCQUMvQixnQkFBZ0IsUUFDaEIsZ0JBQWdCOzs7Ozs7OztFQVNoQiwyQkFBd0I7R0FDOUIsTUFBTSxvQkFBb0IsS0FBSyxnQ0FBZ0MsS0FBSztBQU1wRSxVQUpFLEtBQUssd0JBQ0wsS0FBSyx3QkFBd0IsZ0JBQWdCLFFBQzdDLGtCQUFrQixRQUFRLEtBQUsseUJBRzdCLGtCQUFrQixNQUFNLEtBQUsseUJBQzdCLGtCQUFrQjs7Ozs7RUFNaEIsK0JBQTRCO0FBRWxDLE9BQUksS0FBSyx3QkFBd0IsS0FBSywrQkFBK0I7QUFDbkUsU0FBSyx1QkFBdUI7SUFDNUIsTUFBTSwyQkFBMkIsS0FBSyxZQUFZLGNBQ2hELDJCQUEyQixLQUFLLHVCQUNOO0FBQzVCLFFBQUkseUJBQ0YsMEJBQXlCLE9BQU87Ozs7Ozs7RUFTOUIsK0JBQTRCO0dBQ2xDLE1BQU0saUJBQWlCLEtBQUssZ0JBQ3hCLEtBQUssZ0JBQWdCLFlBQ3JCLEtBQUssZ0JBQWdCO0dBQ3pCLE1BQU0seUJBQXlCLEtBQUssZ0JBQ2hDLEtBQUssZ0JBQWdCLHVCQUF1QixDQUFDLFNBQzdDLEtBQUssZ0JBQWdCLHVCQUF1QixDQUFDO0dBQ2pELE1BQU0scUJBQXFCLEtBQUssc0JBQXNCO0dBQ3RELE1BQU0sbUJBQW1CLEtBQUssZ0NBQWdDLEtBQUs7R0FDbkUsTUFBTSxnQ0FDSixtQkFBbUIsS0FBSyxnQ0FBZ0MsS0FBSyx3QkFBd0I7QUFFdkYsV0FDRyxpQkFBaUIsc0JBQXNCLGlCQUFpQixpQkFBaUIsVUFDMUUsQ0FBQzs7Ozs7O0VBUUcsd0NBQXFDO0dBSTNDLE1BQU0saUJBSFksS0FBSyxnQkFDbkIsS0FBSyxnQkFBZ0IsWUFDckIsS0FBSyxnQkFBZ0IsY0FDUyxLQUFLLHlCQUF5QjtBQUNoRSxVQUFPLEtBQUssZ0NBQWdDLFdBQ3pDLGlCQUFpQixpQkFBaUIsYUFBYSxTQUFTLGlCQUFpQixhQUFhLElBQ3hGOzs7Ozs7RUFPSyxnQ0FBNkI7R0FDbkMsSUFBSSxhQUEyQjtHQUMvQixNQUFNLFFBQ0osS0FBSyxpQkFBaUIsS0FBSyx1QkFBdUIsV0FBVyxLQUFLO0dBQ3BFLE1BQU0sY0FDSixVQUFVLEtBQUssd0JBQXdCLE1BQU0sS0FBSyx5QkFBeUI7R0FDN0UsTUFBTSxjQUNKLEtBQUssWUFDRCxjQUFvQyxNQUFNLFlBQVksRUFDdEQsY0FBcUQscUNBQXFDLEVBQzFGLGFBQWEsT0FBTyxJQUFJO0FBRTlCLE9BQUksU0FBUyxZQUNYLGNBQWEsTUFBTSxRQUFRLE1BQU0sVUFBVSxNQUFNLFdBQVcsWUFBWSxJQUFJO0FBRTlFLFVBQU87O0VBR0QsMENBQ04sWUFDQSxPQUFnQjtBQUVoQixPQUNFLENBQUMsS0FBSyxxQkFDTixlQUFlLEtBQUsseUJBQXlCLGNBQzdDLGVBQWUsS0FBSyx5QkFBeUIsVUFFN0MsUUFBTztBQUdULE9BQ0UsZUFBZSxLQUFLLHlCQUF5QixhQUM3QyxLQUFLLGtCQUFrQixTQUFTLElBQUksTUFBTSxNQUFNLFVBQVUsS0FDMUQsQ0FBQyxDQUFDLEtBQUssaUJBQWlCLEtBQUssd0JBQXdCLEdBRXJELFFBQU8sS0FBSyx3QkFBd0I7WUFJcEMsZUFBZSxLQUFLLHlCQUF5QixXQUM3QyxLQUFLLGtCQUFrQixTQUFTLE1BQU0sS0FDdEMsQ0FBQyxDQUFDLEtBQUssaUJBQWlCLEtBQUssd0JBQXdCLEdBRXJELFFBQU8sS0FBSyx3QkFBd0I7QUFFdEMsVUFBTzs7Ozs7Ozs7RUFTRCwrQkFBK0IsWUFBbUI7R0FDeEQsTUFBTSxRQUNKLEtBQUssaUJBQWlCLEtBQUssdUJBQXVCLFdBQVcsS0FBSztHQUNwRSxJQUFJLGVBQWU7R0FDbkIsSUFBSSxjQUFjLE1BQU07R0FDeEIsSUFBSSx5QkFBeUI7QUFFN0IsT0FBSTtRQUVFLENBQUMsS0FBSywyQkFDUixRQUFPLEtBQUssK0JBQStCO2FBRXZDLEtBQUssbUJBQW1CO0tBQzFCLE1BQU0sNEJBQTRCLEVBQUUsR0FBRyxLQUFLLGtCQUFrQixVQUFVO0FBRXhFLFNBQUksWUFBWTtBQUdkLCtCQUF5QixLQUFLLDBDQUM1QixZQUNBLE1BQ0Q7QUFDRCxVQUFJLDJCQUEyQixNQUFNO0FBRW5DLHFCQUNFLEtBQUssaUJBQWlCLHdCQUF3QixXQUM1QyxLQUFLLHdCQUNMLFVBQVUsRUFBRTtBQUVoQixpQ0FBMEIsSUFDeEIseUJBQXlCLEtBQUssd0JBQXdCLE1BQU0sVUFBVSxJQUFJOzs7QUFJaEYsVUFBSyxNQUFNLFNBQVMsWUFFbEIsS0FBSSxDQUFDO1VBR0QsS0FBSyx3QkFBd0IsZ0JBQWdCLFNBQzdDLE1BQU0sU0FBUyxNQUFNLDBCQUEwQixNQUM5QyxDQUFDLGdCQUFnQixNQUFNLFNBQVMsSUFBSSxhQUFhLFNBQVMsR0FFM0QsZ0JBQWU7ZUFJZixLQUFLLHdCQUF3QixnQkFBZ0IsUUFDN0MsTUFBTSxTQUFTLE1BQU0sMEJBQTBCLE1BQzlDLENBQUMsZ0JBQWdCLE1BQU0sU0FBUyxJQUFJLGFBQWEsU0FBUyxHQUUzRCxnQkFBZTtnQkFHYixNQUFNLFdBQVcsS0FBSyxtQkFBbUI7VUFHekMsZUFBZSxLQUFLLHlCQUF5QixlQUM1QyxNQUFNLFNBQVMsTUFBTSwwQkFBMEIsS0FDOUMsTUFBTSxTQUFTLE1BQU0sMEJBQTBCLElBQUksTUFDckQsTUFBTSxTQUFTLElBQUksMEJBQTBCLE1BQzVDLENBQUMsZ0JBQWdCLE1BQU0sU0FBUyxJQUFJLGFBQWEsU0FBUyxHQUUzRCxnQkFBZTtlQUlmLGVBQWUsS0FBSyx5QkFBeUIsY0FDNUMsTUFBTSxTQUFTLE1BQU0sMEJBQTBCLEtBQzlDLE1BQU0sU0FBUyxNQUFNLDBCQUEwQixJQUFJLE1BQ3JELE1BQU0sU0FBUyxJQUFJLDBCQUEwQixNQUM1QyxDQUFDLGdCQUFnQixNQUFNLFNBQVMsSUFBSSxhQUFhLFNBQVMsR0FFM0QsZ0JBQWU7ZUFJZixlQUFlLEtBQUsseUJBQXlCLGNBQzVDLE1BQU0sU0FBUyxNQUFNLDBCQUEwQixLQUM5QyxNQUFNLFNBQVMsTUFBTSwwQkFBMEIsSUFBSSxNQUNyRCxNQUFNLFNBQVMsSUFBSSwwQkFBMEIsTUFDNUMsQ0FBQyxnQkFBZ0IsTUFBTSxTQUFTLElBQUksYUFBYSxTQUFTLEdBRTNELGdCQUFlO2VBSWYsZUFBZSxLQUFLLHlCQUF5QixZQUM1QyxNQUFNLFNBQVMsTUFBTSwwQkFBMEIsS0FDOUMsTUFBTSxTQUFTLE1BQU0sMEJBQTBCLElBQUksTUFDckQsTUFBTSxTQUFTLElBQUksMEJBQTBCLE1BQzVDLENBQUMsZ0JBQWdCLE1BQU0sU0FBUyxJQUFJLGFBQWEsU0FBUyxHQUUzRCxnQkFBZTs7QUFRdkIsU0FBSSwyQkFBMkIsUUFBUSxhQUNyQyxNQUFLLHdCQUF3Qjs7O0FBS3JDLFVBQU87O0VBS0QsbUNBQW1DLGNBQW9CO0dBQzdELE1BQU0saUJBQ0osS0FBSyxzQkFBc0IsS0FDdkIsS0FBSywyQkFBMkIsS0FDOUIsSUFDQSxLQUFLLHlCQUNQLEtBQUs7R0FHWCxNQUFNLG9CQUNKLGlCQUFpQixhQUNiLEtBQUssMkJBQTJCLGVBQWUsR0FDL0MsS0FBSywyQkFBMkIsZUFBZTtBQUVyRCxPQUFJLEtBQUssZUFBZTtJQUN0QixNQUFNLHVCQUF1QixLQUFLLHNCQUFzQjtJQUN4RCxNQUFNLHVCQUF1Qix1QkFDekIscUJBQXFCLGFBQWEsV0FBVyxLQUFLLFVBQ2xEO0FBSUosUUFBSSxpQkFBaUIsY0FBYyxLQUFLLHVCQUF1QixlQUU3RCxLQUFJLHdCQUF3QixLQUFLLHNCQUFzQixNQUFNO0FBQzNELFVBQUssb0JBQW9CO0FBQ3pCLFVBQUsscUJBQXFCO0FBQzFCO2VBSU8sbUJBQW1CLEVBRTFCLE1BQUssK0JBQStCLGVBQWU7UUFFbkQsTUFBSyxvQkFBb0I7YUFJcEIsc0JBQXNCLEtBQUssdUJBQ2xDLE1BQUssb0JBQW9CO2FBS3pCLGlCQUFpQixjQUNqQixzQkFBc0IsS0FBSyx5QkFBeUIsU0FBUyxFQUc3RCxNQUFLLCtCQUErQixlQUFlO1NBQzlDO0FBQ0wsVUFBSyxvQkFBb0I7QUFDekIsVUFBSyxxQkFBcUI7QUFFMUIsU0FBSSxxQkFDRixNQUFLLGtCQUFrQixLQUFLLGtCQUFrQjtVQUczQztBQUNILFdBQUssdUJBQXVCO0FBQzVCLFdBQUssOEJBQThCOzs7QUFLdkMsU0FBSyxrQ0FBa0Msa0JBQWtCO1NBSXpELE1BQUsseUJBQXlCLGtCQUFrQjs7RUFLNUMsK0JBQStCLFlBQWtCO0FBQ3ZELFFBQUssb0JBQW9CO0FBQ3pCLG9CQUFrQixLQUFLLG9CQUFvQixZQUFhLEVBQUU7O0VBR3BELDJCQUEyQixZQUFrQjtBQUNuRCxRQUFLLHVCQUF1QjtBQUU1QixPQUFJLEtBQUssc0JBQXNCLEdBQzdCLE1BQUssb0JBQW9CO0FBRzNCLE9BQUksQ0FBQyxLQUFLLG1CQUFtQjtJQUMzQixNQUFNLG1CQUFtQixLQUFLLCtCQUErQixXQUFXO0FBRXhFLFFBQUksaUJBQ0YsTUFBSyxrQkFBa0IsaUJBQWlCO2FBS3RDLGVBQWUsS0FBSyx5QkFBeUIsY0FDN0MsZUFBZSxLQUFLLHlCQUF5QixhQUM1QyxLQUFLLGtCQUNILGVBQWUsS0FBSyx5QkFBeUIsV0FDNUMsZUFBZSxLQUFLLHlCQUF5QixZQUNqRDtLQUVBLE1BQU0sd0JBQ0osZUFBZSxLQUFLLHlCQUF5QixhQUN6QyxLQUFLLDRCQUE0QixHQUNqQyxLQUFLLDRCQUE0QjtBQUV2QyxVQUFLLHlCQUF5QixzQkFBc0I7Ozs7RUFNbEQsMkJBQTJCLGNBQXFCO0dBQ3hELE1BQU0sYUFBYSxnQkFBZ0IsS0FBSztBQUN4QyxVQUFPLGFBQWEsS0FBSyxpQkFBaUIsS0FBSyx1QkFBdUIsV0FBVyxTQUFTLElBQ3RGLGFBQWEsSUFDYjs7RUFHSSwyQkFBMkIsY0FBcUI7R0FDeEQsTUFBTSxhQUFhLGdCQUFnQixLQUFLO0FBQ3hDLFVBQU8sYUFBYSxJQUFJLGFBQWEsSUFBSTs7RUFHakMsb0NBQW9DLGdCQUE4QjtHQUMxRSxNQUFNLGdCQUFnQixlQUFlLGNBQWMsU0FBUyxVQUFVO0dBQ3RFLE1BQU0sa0JBQ0osZUFBZSxjQUFjLFNBQVMsS0FBSyxzQkFBc0IsS0FBSztHQUN4RSxNQUFNLHFCQUFxQixLQUFLLDhCQUE4QjtBQUU5RCxRQUFLLDhCQUE4QixpQkFBaUIsS0FBSyxxQ0FDdkQsb0JBQ0EsaUJBQ0EsZUFDRDs7Ozs7QUFLRCxRQUFLLGNBQ0gsSUFBSSxZQUEyQyxrQkFBa0I7SUFDL0QsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRLEtBQUs7SUFDZCxDQUFDLENBQ0g7O0VBR0sscUNBQ04sK0JBQ0EsaUJBQ0EsZ0JBQThCO0FBRzlCLE9BQUksZUFBZSxVQUFVLFlBQVk7SUFDdkMsTUFBTSx5QkFBeUIsS0FBSyx1QkFBdUIsZUFBZSxHQUFHO0lBQzdFLE1BQU0sMkJBQTJCLEtBQUssa0NBQ3BDLGdCQUNBLHVCQUNEO0FBQ0QsUUFBSSx5QkFDRiwrQkFBOEIsS0FBSyx5QkFBeUI7U0FLOUQsaUNBQWdDLDhCQUE4QixRQUMzRCxtQkFBbUIsZUFBZSxPQUFPLGVBQWUsR0FDMUQ7QUFHSCxPQUFJLGtCQUFrQixNQUFNLDhCQUE4QixTQUFTLGlCQUFpQjtJQUNsRixNQUFNLDBCQUEwQixrQkFBa0IsSUFBSSxpQkFBaUIsS0FBQTtBQUV2RSxvQ0FBZ0MsS0FBSyx5QkFDbkMsK0JBQ0Esd0JBQ0Q7O0FBRUgsVUFBTzs7RUFHQyxrQ0FBa0MsZ0JBQThCO0dBQ3hFLE1BQU0saUJBQWlCLEtBQUssdUJBQXVCLGVBQWUsR0FBRztHQUNyRSxNQUFNLGFBQWEsZUFBZTtBQUVsQyxPQUFJLG1CQUFtQixLQUFNO0dBRTdCLE1BQU0sUUFBUSxLQUFLLGlCQUFpQixnQkFBZ0IsV0FBVyxZQUFZLFFBQVEsTUFDaEYsVUFBVSxNQUFNLFVBQVUsZUFBZSxPQUMzQztBQUVELE9BQUksQ0FBQyxNQUFPO0FBRVosUUFBSyx3QkFBd0I7QUFDN0IsUUFBSyx5QkFBeUI7QUFDOUIsUUFBSyxvQkFBb0I7QUFFekIsT0FBSSxLQUFLLDJCQUEyQixLQUFLLG1CQUN2QyxNQUFLLDRCQUE0QjtBQUduQyxRQUFLLCtCQUErQixNQUFNO0dBRzFDLE1BQU0sd0JBQXdCLGlCQUFnQjtBQUM1QyxTQUFLLGdDQUFnQyxlQUFlLEdBQUc7QUFDdkQsaUJBQWEsc0JBQXNCO01BQ2xDLEVBQUU7O0VBR0csNkJBQTBCO0FBRWxDLE9BQUksS0FBSywwQkFBMEIsS0FBSyxtQkFBb0I7QUFHNUQsT0FBSSxLQUFLLHFCQUFxQixHQUM1QixNQUFLLG9CQUFvQixLQUFLO0FBRWhDLFFBQUsscUJBQXFCLEtBQUs7R0FFL0IsTUFBTSxpQkFBaUIsS0FBSyxpQ0FBaUMsS0FBSyxtQkFBbUI7QUFDckYsT0FBSTs7Ozs7QUFLRixRQUFLLGNBQ0gsSUFBSSxZQUEwQyxpQkFBaUI7SUFDN0QsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1QsQ0FBQyxDQUNIOztFQUlLLGtCQUNSLGdCQUNBLFlBQ0EsYUFBbUI7QUFFbkIsVUFDRSxvQ0FBb0MsaUJBQWlCLE1BQU0sYUFBYSxNQUFNOzs7Ozs7Ozs7O0VBWTFFLDZCQUEwQjtHQUVoQyxNQUFNLDBCQUEwQixNQUFNLEtBQUssaUJBQWlCLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRTtBQUU3RCxRQUFLLGlCQUFpQixLQUFLLGlCQUFpQixTQUFTLEdBRTdELFdBQVcsU0FBUyxtQkFBNkI7QUFDekQsU0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLEtBQUssaUJBQWlCLFNBQVMsR0FBRyxLQUFLO0tBQ3pELE1BQU0sZ0JBQWdCLEtBQUssaUJBQWlCLEdBQUcsV0FBVyx3QkFBd0I7QUFDbEYsU0FBSSxlQUFlLE1BQU0sZUFBZSxJQUFJO01BRTFDLE1BQU0sbUJBQW1CO09BQ3ZCLEdBQUc7T0FDSCxRQUFRLEtBQUE7T0FDUixhQUFhLEtBQUE7T0FDYixpQkFBaUIsS0FBQTtPQUNqQixpQkFBaUIsS0FBQTtPQUNqQixhQUFhLEVBQUE7T0FDZDtBQUNELFdBQUssaUJBQWlCLEdBQUcsV0FBVyxPQUNsQyx3QkFBd0IsSUFDeEIsR0FDQSxpQkFDRDs7QUFHSCw2QkFBd0I7O0tBRTFCOzs7Ozs7RUFPSSxxQ0FBa0M7QUFFeEMsUUFBSyw4QkFBOEIsUUFBUSxFQUFFO0FBQzdDLFFBQUssOEJBQThCLFdBQVcsRUFBRTtBQUVoRCxRQUFLLGtCQUFrQixTQUFTLGlCQUFrQyxtQkFDaEUsZ0JBQWdCLFdBQVcsS0FBSyxPQUFrQixlQUFzQjtBQUN0RSxVQUFNLFFBQ0YsUUFBUSxVQUFVLE1BQU0sVUFBVSxXQUFXLEVBQzdDLFNBQVMsVUFBUztLQUVsQixNQUFNLDRCQUE0Qyw4QkFDaEQsT0FGYyxLQUFLLGtCQUFrQixnQkFBZ0IsWUFBWSxNQUFNLE9BR3ZFLEVBQ0EsZ0JBQWdCLGdCQUNoQixXQUNEO0tBRUQsTUFBTSxnQ0FDSixLQUFLLGtDQUFrQywyQkFBMkIsZUFBZTtBQUVuRixTQUFJLDhCQUNGLEtBQUksOEJBQThCLGNBQWMsT0FDOUMsTUFBSyw4QkFBOEIsTUFBTSxLQUFLLDhCQUE4QjtTQUU1RSxNQUFLLDhCQUE4QixTQUFTLEtBQUssOEJBQThCO01BR25GO0tBQ0osQ0FDSDs7Ozs7OztFQVFLLHlCQUNOLDRCQUNBLG1CQUFrQztBQUdsQyxRQUFLLE1BQU0sa0JBQWtCLDJCQUMzQixLQUFJLENBQUMscUJBQXFCLGtCQUFrQixPQUFPLGVBQWUsSUFBSTtJQUNwRSxNQUFNLGVBQWUsS0FBSyxZQUFZLGVBQWUsZUFBZSxHQUFrQjtBQUN0RixRQUFJLGFBQ0YsY0FBYSxhQUFhLFNBQVMsT0FBTzs7QUFLaEQsT0FBSSxrQkFDRiw4QkFBNkIsMkJBQTJCLFFBQ3JELG1CQUFtQixlQUFlLE9BQU8sa0JBQWtCLEdBQzdEO09BRUQsOEJBQTZCLEVBQUU7QUFFakMsVUFBTzs7RUFHRCxrQ0FDTixtQkFDQSxnQkFBNkI7QUFFN0IsT0FBSSxtQkFBbUIsS0FBTSxRQUFPO0dBRXBDLE1BQU0sUUFBUSxLQUFLLGlCQUFpQixnQkFBZ0IsV0FBVyxrQkFBa0I7R0FDakYsTUFBTSxRQUFRLE1BQU0sUUFBUSxNQUFNLFVBQVUsTUFBTSxXQUFXLGtCQUFrQixPQUFPO0FBRXRGLFVBQU8sUUFDSCxnREFDRSxPQUNBLE9BQ0Esa0JBQWtCLElBQ2xCLGtCQUFrQixXQUNsQixrQkFBa0IsV0FDbkIsR0FDRDs7RUFHRSxpQ0FDTixZQUFrQjtBQUVsQixPQUFJLENBQUMsS0FBSyxpQkFBaUIsS0FBSyx1QkFBdUIsV0FBVyxZQUFhLFFBQU87R0FFdEYsTUFBTSxRQUFRLEtBQUssaUJBQWlCLEtBQUssdUJBQXVCLFdBQVc7QUFFM0UsVUFBTyw4QkFBOEIsWUFBWSxPQURqQixLQUFLLG1DQUFtQyxNQUFNLE9BQ3RCLENBQXdCOztFQUcxRSwrQkFBK0IsT0FBbUI7QUFDeEQsUUFBSyw2QkFBNkIsUUFDOUIsS0FBSyxrQkFDSCxLQUFLLHVCQUNMLEtBQUssd0JBQ0wsTUFBTSxPQUNQLEdBQ0Q7Ozs7OztFQU9FLHlCQUFzQjtBQUM1QixPQUFJLENBQUMsVUFBVTtJQUdiLE1BQU0sZ0JBQWdCLElBRkQsU0FBUyxPQUFPLGlCQUFpQixTQUFTLEtBQUssQ0FBQyxVQUFVLEdBRXJEO0FBQzFCLFNBQUssT0FBTyxZQUFZLHFDQUFxQyxHQUFHLGdCQUFnQixRQUFROzs7Ozs7Ozs7OztFQVlwRiwrQkFBNEI7QUFDbEMsT0FBSSxLQUFLLGtCQUFrQjtJQUN6QixNQUFNLFlBQ0osS0FBSyxpQkFBaUIsS0FBSyxpQkFBaUIsU0FBUyxHQUFHO0FBRTFELFNBQUssMkJBQTJCLEVBQUU7QUFFbEMsY0FBVSxTQUFTLE9BQU8sVUFBUztLQUNqQyxNQUFNLGdCQUFvQyxFQUFFO0tBQzVDLE1BQU0sY0FBd0IsRUFBRTtLQUNoQyxNQUFNLFNBQWtCLEVBQUU7QUFHMUIsVUFBSyxpQkFDRixLQUFLLE9BQU07QUFDVixhQUFPLEdBQUcsV0FBVztPQUNyQixDQUNELFNBQVMsVUFBb0I7QUFDNUIsb0JBQWMsS0FBSyxHQUFHLE1BQU0sWUFBWTtBQUN4QyxrQkFBWSxLQUFLLEdBQUksTUFBTSxjQUFjLE1BQU0sY0FBYyxFQUFFLENBQUU7QUFDakUsYUFBTyxLQUFLLEdBQUksTUFBTSxTQUFTLE1BQU0sU0FBUyxFQUFFLENBQUU7T0FDbEQ7QUFFSixVQUFLLHlCQUF5QixLQUFLO01BQ2pDLElBQUksTUFBTTtNQUNWLGFBQWEsS0FBSyw4QkFBOEIsY0FBYztNQUM5RCxhQUFhLEtBQUssK0JBQStCLFlBQVk7TUFDN0QsY0FBYyxNQUFNLFNBQVMsTUFBTSxPQUFPLFdBQVcsSUFBSTtNQUN6RCxjQUFjLEtBQUssY0FBYyxNQUFNO01BQ3ZDLGdCQUFnQixLQUFLLGlDQUFpQyxNQUFNO01BQzVELFlBQVksS0FBSyxtQ0FBbUMsT0FBQTtNQUNyRCxDQUFDO01BQ0Y7OztFQVFFLDRDQUF5QztBQUMvQyxPQUFJLEtBQUssa0JBQWtCO0lBQ3pCLE1BQU0sdUJBQTJDLEVBQUU7QUFDbkQsU0FBSyxpQkFBaUIsU0FBUyxTQUM3QixLQUFLLFdBQVcsU0FBUyxVQUN2QixNQUFNLGlCQUFpQixTQUFTLFNBQVMscUJBQXFCLEtBQUssS0FBSyxVQUFVLENBQUMsQ0FDcEYsQ0FDRjtBQUVELFFBQUkscUJBQXFCLFFBQVE7QUFDL0IsMEJBQXFCLE1BQ2xCLE1BQW9DLFNBQXNDO0FBQ3pFLFVBQUksUUFBUSxNQUFNO09BQ2hCLE1BQU0sVUFBVSxLQUFLLElBQUksS0FBSztPQUM5QixNQUFNLFVBQVUsS0FBSyxJQUFJLEtBQUs7QUFDOUIsV0FBSSxVQUFVLFFBQVMsUUFBTztnQkFDckIsVUFBVSxRQUFTLFFBQU87V0FDOUIsUUFBTzs7QUFFZCxhQUFPO09BRVY7S0FFRCxNQUFNLGlCQUFpQixxQkFBcUIsS0FBSyxNQUFNLHFCQUFxQixTQUFTLEVBQUU7QUFHdkYsVUFBSyxvQkFBb0IsS0FBSyx1QkFBdUIsZUFBZTtXQUMvRDtLQUVMLE1BQU0saUJBQWlCLEtBQUssaUJBQ3pCLFNBQVMsU0FBUyxLQUFLLFdBQVcsS0FBSyxVQUFVLE1BQU0sVUFBVSxFQUFFLENBQUMsQ0FDcEUsUUFBUSxLQUFLLFdBQVcsS0FBSyxJQUFJLEtBQUssT0FBTyxFQUFFLEVBQUU7S0FHcEQsTUFBTSxnQkFBZ0IsS0FBSyxNQUFNLGlCQUFpQixHQUFJO0FBQ3RELFVBQUssb0JBQW9CLEtBQUssdUJBQXVCO01BQ25ELEdBQUc7TUFDSCxHQUFHO01BQ0osQ0FBQzs7OztFQUtBLDhCQUE4QixlQUFpQztBQUNyRSxPQUFJLGNBQWMsUUFBUSxRQUFRLEtBQUssR0FBSSxRQUFPO0FBQ2xELE9BQUksY0FBYyxRQUFRLFNBQVMsS0FBSyxHQUFJLFFBQU87QUFDbkQsVUFBTzs7RUFHRCxpQ0FDTixXQUFvQjtHQUVwQixNQUFNLG1CQUFtQixVQUFVLGlCQUFpQixRQUNqRCxzQkFBc0Isa0JBQWtCLFNBQVMsY0FDbkQ7QUFFRCxPQUFJLG9CQUFvQixpQkFBaUIsU0FBUyxHQUFHO0lBRW5ELE1BQU0sb0JBQ0osaUJBQWlCLE1BQU0sc0JBQXNCLGtCQUFrQixTQUFTLE1BQU0sRUFBRSxJQUFJO0lBQ3RGLE1BQU0scUJBQ0osaUJBQWlCLE1BQU0sc0JBQXNCLGtCQUFrQixTQUFTLElBQUksRUFBRSxJQUFJO0FBRXBGLFdBQU87S0FDTCxNQUFNLENBQUMsQ0FBQztLQUNSLE9BQU8sQ0FBQyxDQUFDO0tBQ1Y7OztFQW9DRyw4Q0FBMkM7QUFDakQsT0FBSSxLQUFLLGtCQUFrQjtBQUN6QixTQUFLLDJCQUEyQixFQUM5QixPQUFPLEVBQUUsRUFDVjtBQUVELFNBQUssaUJBQWlCLFNBQVMsaUJBQWtDLFVBQWlCO0tBQ2hGLE1BQU0sc0JBQTJDO01BQy9DLFdBQVc7TUFDWCxhQUFhLEVBQUE7TUFDZDtBQUVELHNCQUFpQixZQUFZLFNBQVMsY0FBd0I7TUFJNUQsTUFBTSxnQkFIdUIsVUFBVSxpQkFBaUIsUUFDckQsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLGdCQUFnQixTQUFTLEVBQUUsS0FBSyxDQUN4RCxHQUdLLE9BQU8sVUFBVSxtQkFBbUIsRUFBRSxDQUFDLENBQ3hDLE9BQU8sVUFBVSxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUU7TUFDekMsTUFBTSx5QkFBeUIsS0FBSyw4QkFDbEMsVUFBVSxVQUFVLEdBQ3BCLGFBQ0Q7TUFDRCxNQUFNLGVBQWUsVUFBVSxpQkFDM0IsUUFDQyxxQkFDQyxDQUFDLEtBQUssZ0JBQWdCLFNBQVMsaUJBQWlCLEtBQU0sQ0FDekQsQ0FDQSxLQUFLLFFBQ0osS0FBSyx1Q0FBdUMsS0FBSyxVQUFVLFdBQVcsS0FBSyxDQUM1RTtNQUNILE1BQU0sZ0JBQWdCLFVBQVUsaUJBQzVCLFFBQVEscUJBQ1IsS0FBSyxnQkFBZ0IsU0FBUyxpQkFBaUIsS0FBTSxDQUN0RCxDQUNBLEtBQUssUUFDSixLQUFLLHVDQUF1QyxLQUFLLFVBQVUsV0FBVyxNQUFNLENBQzdFO01BQ0gsTUFBTSxrQkFBa0IsVUFBVSxpQkFBaUIsS0FBSyxRQUN0RCxLQUFLLHVDQUF1QyxLQUFLLFVBQVUsV0FBVyxNQUFNLENBQzdFO01BQ0QsTUFBTSxzQkFBc0IsS0FBSyxrQ0FBa0MsVUFBVTtNQUM3RSxNQUFNLHFCQUFxQixLQUFLLHVCQUF1QixFQUFFLEdBQUcsVUFBVSxXQUFXLENBQUM7TUFFbEYsTUFBTSxpQkFBaUM7T0FDckMsT0FBTyxtQkFBbUI7T0FDMUIsUUFBUSxtQkFBbUI7T0FDM0IsZUFBZSxpQkFBaUIsRUFBRTtPQUNsQyxpQkFBaUIsbUJBQW1CLEVBQUU7T0FDdEMsY0FBYyxnQkFBZ0IsRUFBRTtPQUNYO09BQ0c7T0FDekI7QUFFRCwwQkFBb0IsWUFBWSxLQUFLLGVBQWU7T0FDcEQ7QUFFRixVQUFLLHlCQUF5QixNQUFNLEtBQUssb0JBQW9CO01BQzdEOzs7Ozs7Ozs7RUFVRSxrQ0FBa0MsT0FBZ0I7R0FDeEQsTUFBTSxnQkFBZ0IsTUFBTSxVQUFVLElBQUksS0FBSyxvQkFBb0IsS0FBSyxLQUFLO0dBRTdFLElBQUkscUJBQXFCO0dBQ3pCLElBQUksY0FBYyxNQUFNLFVBQVU7QUFFbEMsT0FBSSxNQUFNLGlCQUFpQjtJQUV6QixNQUFNLGtCQUFrQixLQUFLLDZCQUE2QixNQUFNLGdCQUFnQjtBQUdoRixRQUFJLGlCQUFpQixVQUFVLEdBQUc7S0FDaEMsTUFBTSxzQkFBc0IsZ0JBQWdCO0tBQzVDLE1BQU0scUJBQXFCLGdCQUFnQjtLQUMzQyxNQUFNLG1CQUNKLG9CQUFvQixTQUFTLEtBQUssSUFDOUIsbUJBQW1CLFVBQVUsSUFDN0Isb0JBQW9CLFVBQVU7QUFFcEMsMEJBQ0Usb0JBQW9CLFNBQVMsS0FBSyxJQUM5QixvQkFBb0IsVUFBVSxJQUM5QixtQkFBbUIsVUFBVTtBQUVuQyxtQkFBYyxNQUFNLFVBQVUsSUFBSSxtQkFBbUI7ZUFHOUMsaUJBQWlCLFVBQVUsR0FBRztLQUNyQyxNQUFNLGlCQUFpQixnQkFBZ0I7QUFHdkMsU0FBSSxlQUFlLFNBQVMsTUFBTSxHQUFHO0FBQ25DLDJCQUFxQixlQUFlLFVBQVU7QUFDOUMsb0JBQWMsTUFBTSxVQUFVLElBQUksZUFBZSxVQUFVO2dCQUdwRCxlQUFlLFNBQVMsTUFBTSxFQUNyQyxlQUFjLE1BQU0sVUFBVSxJQUFJLGVBQWUsVUFBVTs7O0dBS2pFLE1BQU0sVUFBVSxLQUFLLHFCQUFxQjtBQUUxQyxVQUFPO0lBQ0wsVUFBVTtLQUFFLEdBQUcscUJBQXFCLEtBQUs7S0FBYyxHQUFHO0tBQVMsR0FBRztLQUFHO0lBQ3pFLFdBQVc7S0FBRSxHQUFHLGNBQWMsS0FBSztLQUFjLEdBQUc7O0lBQ3JEOzs7Ozs7RUFPSyw2QkFBNkIsaUJBQThCO0dBR2pFLE1BQU0sMkJBQ0osZ0JBQWdCLFFBQVEsUUFBUSxLQUFLLDRCQUE0QixTQUFTLElBQUksS0FBTSxDQUFDLElBQUksRUFBRSxFQUMzRixNQUFNLEdBQUcsTUFBSztJQUNkLE1BQU0sT0FBTyxFQUFFLFNBQVM7SUFDeEIsTUFBTSxPQUFPLEVBQUUsU0FBUztBQUN4QixRQUFJLE9BQU8sS0FDVCxRQUFPO0FBRVQsUUFBSSxPQUFPLEtBQ1QsUUFBTztBQUVULFdBQU87S0FDUDtBQUVGLFVBQU8sd0JBQXdCLFFBQzVCLEdBQUcsVUFBVSxTQUFTLEtBQUssU0FBUyx3QkFBd0IsU0FBUyxFQUN2RTs7Ozs7O0VBT0ssdUNBQ04sU0FDQSxnQkFDQSxtQkFBMEI7R0FFMUIsTUFBTSxNQUFNLEVBQUUsR0FBRyxRQUFRLFdBQVc7R0FDcEMsTUFBTSxNQUFNLEVBQUUsR0FBRyxRQUFRLFVBQVU7R0FDbkMsTUFBTSxXQUFXLFFBQVEsWUFBWTtHQUNyQyxNQUFNLHFDQUNKLEtBQUssZ0JBQWdCLE9BQU8sS0FBSywyQkFBMkIsQ0FBQyxRQUFRLFFBQVEsS0FBTSxLQUFLO0dBQzFGLE1BQU0sZUFDSixLQUFLLGlCQUFpQixxQ0FBcUMsV0FBVyxLQUFLO0dBQzdFLElBQUksZUFBdUM7QUFHM0MsT0FBSSxtQkFBbUI7SUFDckIsTUFBTSxvQkFBb0IsUUFBUSxNQUFNLFFBQVEsUUFBUSxLQUFLO0lBQzdELE1BQU0sZUFBZSxRQUFRLFFBQVEsb0JBQW9CLFFBQVEsT0FBTztJQUN4RSxNQUFNLGdCQUNKLEtBQUssMEJBQTBCLFNBQVMsZUFBZSxJQUFJLGlCQUFpQjtBQUU5RSxRQUFJLFFBQVEsU0FBUyxNQUFNLEdBQUc7QUFDNUIsb0JBQWU7QUFDZixTQUFJLEtBQUssS0FBSyxvQkFBb0IsS0FBSyxvQkFBb0I7ZUFDbEQsUUFBUSxTQUFTLElBQUksUUFBUSxVQUFVLE1BQU0sZUFBZSxHQUFHO0FBQ3hFLG9CQUFlO0FBQ2YsU0FBSSxDQUFDLGNBQ0gsS0FBSSxLQUFLLEtBQUssb0JBQW9CLEtBQUssb0JBQW9COztBQUkvRCxRQUFJLGNBQ0YsS0FBSSxLQUFLLEtBQUssb0JBQW9CLEtBQUssb0JBQW9CO1VBSTFEO0FBQ0gsUUFBSSxRQUFRLFNBQVMsTUFBTSxFQUN6QixLQUFJLEtBQUssS0FBSztBQUdoQixRQUFJLGVBQWUsTUFBTSxRQUFRLFNBQVMsSUFBSSxRQUFRLFVBQVUsRUFDOUQsS0FBSSxLQUFLLEtBQUssb0JBQW9COztBQUl0QyxPQUFJLElBQUksS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLGFBQWE7QUFDN0MsT0FBSSxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxhQUFhO0FBRTdDLE9BQUksSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssYUFBYTtBQUM3QyxPQUFJLElBQUksS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLGFBQWE7QUFPN0MsVUFBTztJQUNDLE1BTE4sUUFBUSxRQUFRLFFBQVEsS0FBSyxTQUFTLGNBQWMsR0FDaEQsUUFBUSxNQUFNLE9BQU8sS0FBSyxLQUFLLGlCQUFpQixLQUFLLHVCQUF1QixZQUFZLEdBQ3hGLFFBQVE7SUFJWixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1g7Ozs7OztFQU9LLHVCQUFvQjtBQUMxQixVQUFPLEtBQUssNkJBQ1IsS0FBSyxZQUFZLGVBQWUsS0FBSywyQkFBMkIsSUFBSSxPQUNwRTs7Ozs7O0VBT0UsdUJBQXVCLFNBQWU7R0FDNUMsTUFBTSxZQUFZLEtBQUssWUFDbkIsY0FBYyxNQUFNLFFBQVEsRUFDNUIsYUFBYSxrQkFBa0I7QUFDbkMsT0FBSSxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FDakMsUUFBTyxDQUFDO0FBRVYsVUFBTzs7RUFHRCxtQkFBbUIsWUFBa0I7QUFDM0MsVUFDRSxjQUFjLEtBQ2QsY0FBYyxLQUFLLGlCQUFpQixLQUFLLGlCQUFpQixTQUFTLEdBQUcsV0FBVzs7Ozs7Ozs7Ozs7O0VBYzdFLDZCQUEwQjtBQUNoQyxPQUNFLEtBQUssaUJBQWlCLEtBQUssdUJBQXVCLFdBQVcsS0FBSyx3QkFDL0QsV0FBVyxLQUFBLEVBRWQsUUFBTyxLQUFLO0dBSWQsTUFBTSw4QkFBOEIsS0FBSyxpQkFBaUIsV0FDdkQsb0JBQ0MsZ0JBQWdCLFdBQVcsS0FBSyx3QkFBd0IsV0FBVyxLQUFBLEVBQ3RFO0FBQ0QsVUFBTyxLQUFLLHlCQUF5Qiw4QkFDakMsS0FBSyx3QkFDTDs7Ozs7Ozs7RUFTRSxnQ0FBZ0MsU0FBZTtBQUNyRCxRQUFLLFlBQ0QsZUFBZSxRQUFRLEVBQ3ZCLGVBQWU7SUFBRSxVQUFVO0lBQVUsT0FBTztJQUFXLFFBQVE7SUFBVyxDQUFDOzs7Ozs7O0VBUXpFLDhCQUNOLGdCQUNBLFVBQTZDO0FBRTdDLFVBQ0UsVUFBVSxNQUNQLFlBQ0MsUUFBUSxTQUFTLE1BQU0sS0FBSyxRQUFRLFNBQVMsSUFBSSxRQUFRLFVBQVUsS0FBSyxlQUMzRSxJQUFJOzs7Ozs7O0VBU0QsY0FBYyxXQUFvQjtBQUN4QyxVQUNFLFdBQVcsaUJBQWlCLE1BQ3pCLFlBQXlCLFFBQVEsU0FBUywrQkFDNUMsS0FBSyxLQUFBOzs7Ozs7RUFRRixtQ0FBZ0M7QUFDdEMsT0FBSSxLQUFLLGNBQ1AsTUFBSyxvQkFBb0I7QUFFM0IsUUFBSyxxQkFBcUIifQ==
|
|
1461
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9hMTF5LmpzJztcbmltcG9ydCB7IFNiYkVsZW1lbnQgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2Jhc2UtZWxlbWVudHMuanMnO1xuaW1wb3J0IHsgZm9yY2VUeXBlIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGlzU2VydmVyLCB0eXBlIFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGV2ZW50T3B0aW9ucywgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQge1xuICBtYXBDb2FjaEluZm9zVG9Db2FjaFNlbGVjdGlvbixcbiAgbWFwSWNvblRvU3ZnLFxuICBtYXBQbGFjZUFuZENvYWNoVG9TZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbixcbiAgbWFwUGxhY2VJbmZvc1RvUGxhY2VTZWxlY3Rpb24sXG59IGZyb20gJy4uL2NvbW1vbi9tYXBwZXIudHMnO1xuaW1wb3J0IHR5cGUge1xuICBCYXNlRWxlbWVudCxcbiAgQ29hY2hJdGVtLFxuICBDb2FjaE51bWJlck9mRnJlZVBsYWNlcyxcbiAgRWxlbWVudERpbWVuc2lvbixcbiAgRWxlbWVudE1vdW50aW5nLFxuICBFbGVtZW50UG9zaXRpb24sXG4gIENvYWNoSXRlbURldGFpbHMsXG4gIFBsYWNlLFxuICBQbGFjZVNlbGVjdGlvbixcbiAgUGxhY2VUcmF2ZWxDbGFzcyxcbiAgU2VhdFJlc2VydmF0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbixcbiAgU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaCxcbiAgU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMsXG4gIFRyYXZlbERpcmVjdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uL3R5cGVzLnRzJztcbmltcG9ydCB0eXBlIHsgU2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wuY29tcG9uZW50LnRzJztcblxuZW51bSBTY3JvbGxEaXJlY3Rpb24ge1xuICByaWdodCA9ICdyaWdodCcsXG4gIGxlZnQgPSAnbGVmdCcsXG59XG5cbmludGVyZmFjZSBDb2FjaFNjcm9sbFRyaWdnZXJQb2ludCB7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGVuZDogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU2VhdHJlc2VydmF0aW9uU3RydWN0dXJlIHtcbiAgZGVja3M6IFNlYXRyZXNlcnZhdGlvbkRlY2tbXTtcbn1cblxuaW50ZXJmYWNlIFNlYXRyZXNlcnZhdGlvbkRlY2sge1xuICBkZWNrSW5kZXg6IG51bWJlcjtcbiAgZGVja0NvYWNoZXM6IENvYWNoU3RydWN0dXJlW107XG59XG5cbmludGVyZmFjZSBDb2FjaFN0cnVjdHVyZSB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBhcmVhRWxlbWVudHM6IEJhc2VFbGVtZW50W107XG4gIHNlcnZpY2VFbGVtZW50czogQmFzZUVsZW1lbnRbXTtcbiAgb3RoZXJFbGVtZW50czogQmFzZUVsZW1lbnRbXTtcbiAgYm9yZGVyTWlkZGxlRWxlbWVudDogQmFzZUVsZW1lbnQ7XG4gIGhhc092ZXJoYW5naW5nRWxlbWVudHM6IGJvb2xlYW47XG59XG5cbmNvbnN0IE1BWF9TRVJWSUNFX1BST1BFUlRJRVMgPSAzO1xuY29uc3QgQUxMT1dFRF9TRVJWSUNFX0lDT05TOiBzdHJpbmdbXSA9IFtcbiAgJ3NhLXZvJyxcbiAgJ3NhLXJzJyxcbiAgJ3NhLWFidGVpbGtpbmRlcndhZ2VuJyxcbiAgJ3NhLXdyJyxcbiAgJ3NhLWZhJyxcbiAgJ3NhLWJ6JyxcbiAgJ3NhLXJ6Jyxcbl07XG5cbmV4cG9ydCBjbGFzcyBTZWF0UmVzZXJ2YXRpb25CYXNlRWxlbWVudCBleHRlbmRzIFNiYkVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGV2ZW50cyA9IHtcbiAgICBzZWxlY3RlZHBsYWNlczogJ3NlbGVjdGVkcGxhY2VzJyxcbiAgICBzZWxlY3RlZGNvYWNoOiAnc2VsZWN0ZWRjb2FjaCcsXG4gIH0gYXMgY29uc3Q7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9ucyBhcnJheSBjb250YWlucyBhbGwgY29hY2hlcyBhbmQgcGxhY2VzICovXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3NlYXQtcmVzZXJ2YXRpb25zJywgdHlwZTogQXJyYXkgfSlcbiAgcHVibGljIGFjY2Vzc29yIHNlYXRSZXNlcnZhdGlvbnM6IFNlYXRSZXNlcnZhdGlvbltdID0gbnVsbCE7XG5cbiAgLyoqIERpc3BsYXlzIGFuIGFycm93IHNob3dpbmcgd2hhdCBkaXJlY3Rpb24gZG9lcyB0cmFpbiBkcml2ZSovXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3RyYXZlbC1kaXJlY3Rpb24nLCB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIGFjY2Vzc29yIHRyYXZlbERpcmVjdGlvbjogVHJhdmVsRGlyZWN0aW9uID0gJ05PTkUnO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBuYXZpZ2F0aW9uIGNhbiBiZSB0b2dnbGVkIGJ5IHRoaXMgcHJvcGVydHkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2hhcy1uYXZpZ2F0aW9uJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaGFzTmF2aWdhdGlvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEgaXMgYWxpZ25lZCB2ZXJ0aWNhbGx5ICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdhbGlnbi12ZXJ0aWNhbCcsIHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUsIHVzZURlZmF1bHQ6IHRydWUgfSlcbiAgcHVibGljIGFjY2Vzc29yIGFsaWduVmVydGljYWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSdzIGJhc2UgZ3JpZCBzaXplICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdiYXNlLWdyaWQtc2l6ZScsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYmFzZUdyaWRTaXplOiBudW1iZXIgPSAxNjtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSdzIHdpZHRoICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdoZWlnaHQnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIGhlaWdodDogbnVtYmVyID0gbnVsbCE7XG5cbiAgLyoqIE1heGltYWwgbnVtYmVyIG9mIHBvc3NpYmxlIGNsaWNrYWJsZSBzZWF0cyAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnbWF4LXNlYXQtcmVzZXJ2YXRpb25zJywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBtYXhTZWF0UmVzZXJ2YXRpb25zOiBudW1iZXIgPSAtMTtcblxuICAvKiogTWF4aW1hbCBudW1iZXIgb2YgcG9zc2libGUgY2xpY2thYmxlIGJpY3ljbGUgcGxhY2VzICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdtYXgtYmljeWNsZS1yZXNlcnZhdGlvbnMnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIG1heEJpY3ljbGVSZXNlcnZhdGlvbnM6IG51bWJlciA9IC0xO1xuXG4gIC8qKiBBbnkgY2xpY2sgZnVuY3Rpb25hbGl0eSBpcyBwcmV2ZW50ZWQgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3ByZXZlbnQtcGxhY2UtY2xpY2snLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBwcmV2ZW50UGxhY2VDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdwcmVzZWxlY3QtY29hY2gtaW5kZXgnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIHByZXNlbGVjdENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiB0aXRsZSBpbmZvcm1hdGlvbiBhdCBwbGFjZS1jb250cm9scywgbmF2aWdhdGlvbi1jb2FjaGVzIGFuZCBuYXZpZ2F0aW9uLXNlcnZpY2VzIGNhbiBiZSB0b2dnbGVkIGJ5IHRoaXMgcHJvcGVydHkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3Nob3ctdGl0bGUtaW5mbycsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIHNob3dUaXRsZUluZm86IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3Igc2VsZWN0ZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGZvY3VzZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGhvdmVyZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcblxuICAvLyBEZXNjcmliZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGJvcmRlciBvZiB0aGUgY29hY2ggYW5kIHRoZSBwbGFjZXMgaW4gcGl4ZWxzXG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlclBhZGRpbmcgPSA2O1xuICAvLyBEZXNjcmliZXMgdGhlIGdhcCBiZXR3ZWVuIHRoZSBjb2FjaGVzIGluIHBpeGVsc1xuICBwcm90ZWN0ZWQgZ2FwQmV0d2VlbkNvYWNoZXMgPSA0O1xuICAvLyBUaGUgY2FsY3VsYXRlZCBjb2FjaEJvcmRlck9mZnNldCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiBjb2FjaCBib3JkZXIgZ3JhcGhpYyxcbiAgLy8gYnV0IGFsc28gdG8gcG9zaXRpb24gb3RoZXIgZ3JhcGhpY3MgdGhhdCBhcmUgYWxpZ25lZCBkaXJlY3RseSB0byB0aGUgY29hY2ggYm9yZGVyLlxuICBwcm90ZWN0ZWQgY29hY2hCb3JkZXJPZmZzZXQgPSB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAvIHRoaXMuYmFzZUdyaWRTaXplO1xuICAvLyBEZXNjcmliZXMgdGhlIGdhcCBiZXR3ZWVuIHRoZSBjb2FjaGVzIGRlY2tzIGJ5IG11bHRpcGxlIGRlY2sgdmlzdWFsaXphdGlvblxuICBwcm90ZWN0ZWQgZ2FwQmV0d2VlbkNvYWNoRGVja3MgPSA0ODtcbiAgLy8gRGVzY3JpYmVzIHRoZSBmaXggd2lkdGggb2YgY29hY2ggbmF2aWdhdGlvbiBidXR0b25cbiAgcHJvdGVjdGVkIGNvYWNoTmF2QnV0dG9uRGltOiBudW1iZXIgPSAwO1xuICAvLyBEZXNjcmliZXMgdGhlIGNhbGN1bGF0ZWQgZGltZW5zaW9uIGZvciB0aGUgYXJlYSBpY29ucywgd2hpY2ggaXMgdXNlZCB0byBzZXQgdGhlIG1heCB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBhcmVhIGljb25zXG4gIHByb3RlY3RlZCBnbG9iYWxBcmVhSWNvbkRpbTogRWxlbWVudERpbWVuc2lvbiA9IHsgdzogMiwgaDogMiB9O1xuICAvLyAjVElNTy00NTg1OFxuICAvLyBEZXNjcmliZXMgdGhlIHBhZGRpbmcgZm9yIHRoZSBpY29uIHdpdGhpbiB0aGUgYXJlYSBhcyBhIHBlcmNlbnRhZ2Ugc2l6ZSBvZiB0aGUgYXJlYSBzZWxmLiA4MCUgKDAuOCBwZXJjZW50KSBjb3JyZXNwb25kc1xuICAvLyB0byBhIGdvb2Qgb3B0aWNhbCBzaXplIGFuZCBjcmVhdGVzIGEgZ29vZCBwYWRkaW5nIGZyb20gdGhlIGFyZWEgdGkgaWNvblxuICBwcm90ZWN0ZWQgZ2xvYmFsQXJlYUljb25QYWRkaW5nOiBudW1iZXIgPSAwLjg7XG4gIHByb3RlY3RlZCBjb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHM6IENvYWNoSXRlbURldGFpbHNbXSA9IFtdO1xuICBwcm90ZWN0ZWQgY3VyclNjcm9sbERpcmVjdGlvbjogU2Nyb2xsRGlyZWN0aW9uID0gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0O1xuICBwcm90ZWN0ZWQgbWF4Q2FsY0NvYWNoZXNXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbENvYWNoZXNBcmVhV2lkdGg6IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCBzY3JvbGxOYXZpZ2F0aW9uQXJlYURpbTogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb246IENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50W10gPSBbXTtcbiAgcHJvdGVjdGVkIG5hdmlnYXRpb25TY3JvbGxBcmVhOiBIVE1MRWxlbWVudCA9IG51bGwhO1xuICBwcm90ZWN0ZWQgY29hY2hTY3JvbGxBcmVhOiBIVE1MRWxlbWVudCA9IG51bGwhO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkUGxhY2U6IFBsYWNlIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZERlY2tJbmRleDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM6IFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzID0ge1xuICAgIHNlYXRzOiBbXSxcbiAgICBiaWN5Y2xlczogW10sXG4gIH07XG4gIHByb3RlY3RlZCBzZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0NvYWNoR3JpZEZvY3VzYWJsZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaXNBdXRvU2Nyb2xsaW5nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0tleWJvYXJkTmF2aWdhdGlvbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaGFzTXVsdGlwbGVEZWNrcyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cyA9IHtcbiAgICBBcnJvd0xlZnQ6ICdBcnJvd0xlZnQnLFxuICAgIEFycm93UmlnaHQ6ICdBcnJvd1JpZ2h0JyxcbiAgICBBcnJvd1VwOiAnQXJyb3dVcCcsXG4gICAgQXJyb3dEb3duOiAnQXJyb3dEb3duJyxcbiAgICBUYWI6ICdUYWInLFxuICAgIEVudGVyOiAnRW50ZXInLFxuICB9IGFzIGNvbnN0O1xuXG4gIHByb3RlY3RlZCBzZWF0UmVzZXJ2YXRpb25TdHJ1Y3R1cmU6IFNlYXRyZXNlcnZhdGlvblN0cnVjdHVyZSA9IHtcbiAgICBkZWNrczogW10sXG4gIH07XG5cbiAgLy8gQXJlYSBpY29ucyB0aGF0IHNob3VsZCBub3QgYmUgZml4ZWQgZHVyaW5nIHJvdGF0aW9uIHdoZW4gdmVydGljYWwgbW9kZSBpcyBzZWxlY3RlZFxuICBwcm90ZWN0ZWQgbm90Rml4ZWRSb3RhdGFibGVBcmVhSWNvbnMgPSBbJ0VOVFJZX0VYSVQnXTtcblxuICAvLyBHcmFwaGljcyB0aGF0IHNob3VsZCBub3QgYmUgcmVuZGVyZWQgd2l0aCBhbiBhcmVhXG4gIHByb3RlY3RlZCBub3RBcmVhRWxlbWVudHMgPSBbXG4gICAgJ0RSSVZFUl9BUkVBJyxcbiAgICAnRFJJVkVSX0FSRUFfTk9fVkVSVElDQUxfV0FMTCcsXG4gICAgJ0NPQUNIX1BBU1NBR0UnLFxuICAgICdDT0FDSF9XQUxMX05PX1BBU1NBR0UnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFJyxcbiAgICAnQ09NUEFSVE1FTlRfUEFTU0FHRV9ISUdIJyxcbiAgICAnQ09NUEFSVE1FTlRfUEFTU0FHRV9NSURETEUnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX0xPVycsXG4gICAgJ0NPTVBBUlRNRU5UX1dBTEwnLFxuICBdO1xuXG4gIC8vIEdyYXBoaWNzIHRoYXQgc2hvdWxkIG5vdCBiZSByZW5kZXJlZCB3aXRoIGFuIGFyZWFcbiAgcHJvdGVjdGVkIG1pZGRsZUJvcmRlckRvY2tpbmdFbGVtZW50cyA9IFtcbiAgICAnRFJJVkVSX0FSRUEnLFxuICAgICdEUklWRVJfQVJFQV9OT19WRVJUSUNBTF9XQUxMJyxcbiAgICAnQ09BQ0hfUEFTU0FHRScsXG4gICAgJ0NPQUNIX1dBTExfTk9fUEFTU0FHRScsXG4gIF07XG5cbiAgcHJpdmF0ZSBfaXNSdW5uaW5nSW5pdFByZXNlbGVjdENvYWNoSW5kZXggPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2Nyb2xsVGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2xhc3RTdGFydFNjcm9sbFBvcyA9IC0xO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIC8vIEFkZCBibHVyIGV2ZW50IGxpc3RlbmVyIG9uIHRoZSBlbnRpcmUgY29tcG9uZW50IHRvIGRldGVjdCB3aGVuIHRoZSB1c2VyIGxlYXZlcyB0aGUgY29tcG9uZW50XG4gICAgLy8gYnkgdXNpbmcgdGFiIG5hdmlnYXRpb24gb3IgY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgY29tcG9uZW50LiBJbiB0aGlzIGNhc2UsIHdlIGNhbiByZXNldCB0aGUgc2VsZWN0ZWQgY29hY2ggYW5kIHBsYWNlLlxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHRoaXMuX29uTGVhdmVTZWF0UmVzZXJ2YXRpb25Db21wb25lbnQoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3NlYXRSZXNlcnZhdGlvbnMnKSkge1xuICAgICAgdGhpcy5oYXNNdWx0aXBsZURlY2tzID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zPy5sZW5ndGggPiAxO1xuXG4gICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgIHRoaXMuX2luaXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbigpO1xuICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdiYXNlR3JpZFNpemUnKSkge1xuICAgICAgdGhpcy5jb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmlkLXNpemUnLCBgJHt0aGlzLmJhc2VHcmlkU2l6ZX1weGApO1xuICAgICAgdGhpcy5faW5pdFByZXBhcmVTZWF0UmVzZXJ2YXRpb25EYXRhKCk7XG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBoZWlnaHQgaXMgdXNlZCwgdGhlIGJhc2VHcmlkU2l6ZSBtdXN0IGJlIHJlY2FsY3VsYXRlZFxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2hlaWdodCcpICYmICEhdGhpcy5oZWlnaHQpIHtcbiAgICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvbkxheWVyID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XSB8fCBudWxsO1xuICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvbkxheWVyPy5jb2FjaEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmJhc2VHcmlkU2l6ZSA9IHRoaXMuaGVpZ2h0IC8gc2VhdFJlc2VydmF0aW9uTGF5ZXIuY29hY2hJdGVtc1swXS5kaW1lbnNpb24uaDtcbiAgICAgICAgdGhpcy5jb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyaWQtc2l6ZScsIGAke3RoaXMuYmFzZUdyaWRTaXplfXB4YCk7XG5cbiAgICAgICAgdGhpcy5faW5pdFByZXBhcmVTZWF0UmVzZXJ2YXRpb25EYXRhKCk7XG4gICAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnYWxpZ25WZXJ0aWNhbCcpKSB7XG4gICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygncHJlc2VsZWN0Q29hY2hJbmRleCcpKSB7XG4gICAgICAvLyBzZXRUaW1lb3V0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdpdGhvdXQsIF9nZXRDb2FjaFNjcm9sbFBvc2l0aW9uWCgpIHdvdWxkIGZhaWwgd2l0aCBOUEUgYmVjYXVzZVxuICAgICAgLy8gdGhlIGNvYWNoU2Nyb2xsQXJlYSBpcyBub3QgeWV0IGluaXRpYWxpemVkXG4gICAgICB0aGlzLl9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHRoaXMucHJlc2VsZWN0Q29hY2hJbmRleCksIDEpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBuYXZpZ2F0ZUJ5RGlyZWN0aW9uQnRuKGJ0bkRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgbGV0IG5hdmlnYXRlVG9Db2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuICAgIGlmIChidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9MRUZUJyAmJiBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA+IDApIHtcbiAgICAgIG5hdmlnYXRlVG9Db2FjaEluZGV4ID1cbiAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICE9IC0xID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4IC0gMSA6IDA7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJyAmJlxuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPFxuICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdPy5jb2FjaEl0ZW1zLmxlbmd0aCAtIDFcbiAgICApIHtcbiAgICAgIG5hdmlnYXRlVG9Db2FjaEluZGV4ID1cbiAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICE9IC0xID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgMSA6IDA7XG4gICAgfVxuXG4gICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2gobmF2aWdhdGVUb0NvYWNoSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERhdGEgY2FuIGJlIHByZXBhcmVkIG9uY2UgZm9yIHRoZSBlbnRpcmUgY29tcG9uZW50XG4gICAqIGluIG9yZGVyIHRvIGF2b2lkIHJlY3VycmluZyBpdGVyYXRpb24gcHJvY2Vzc2VzIGluIHJlbmRlcmluZy5cbiAgICovXG4gIHByaXZhdGUgX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXRlcm1pbmVCYXNlRm9udFNpemUoKTtcblxuICAgIGlmICh0aGlzLmhhc011bHRpcGxlRGVja3MpIHtcbiAgICAgIC8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBkZWNrcywgd2UgbmVlZCB0byBjaGVja1xuICAgICAgLy8gd2hldGhlciBlbXB0eSBjb2FjaGVzIG5lZWQgdG8gYmUgYWRkZWQgb24gZGlmZmVyZW50IGRlY2sgbGV2ZWxzXG4gICAgICB0aGlzLl9pbml0RW1wdHlDb2FjaERlY2tPZmZzZXRzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJlcGFyZUNvYWNoSXRlbURldGFpbHNEYXRhKCk7XG4gICAgdGhpcy5fcHJlcGFyZVNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZUluZm9ybWF0aW9uKCk7XG4gICAgdGhpcy5fcHJlcGFyZU9wdGltaXplQXJlYUljb25EaW1lbnNpb25CeU1lZGlhbigpO1xuICB9XG5cbiAgLyoqIEluaXQgc2Nyb2xsIGV2ZW50IGhhbmRsaW5nIGZvciBjb2FjaCBuYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCBpbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnI3NiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhJyxcbiAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgIHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnI3NiYi1zcl9fbmF2aWdhdGlvbi1saXN0LWNvYWNoZXMnLFxuICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25EZWNrID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zXG4gICAgICA/IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF1cbiAgICAgIDogbnVsbDtcbiAgICBpZiAoc2VhdFJlc2VydmF0aW9uRGVjayAmJiBzZWF0UmVzZXJ2YXRpb25EZWNrLmNvYWNoSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2FsY3VsYXRlcyB0aGUgYWJzb2x1dGUgaGVpZ2h0IG9mIG9uZSBjb2FjaCBpbmNsdWRpbmcgYm9yZGVyIHBhZGRpbmdcbiAgICAgIGNvbnN0IGNvYWNoSGVpZ2h0V2l0aEJvcmRlclBhZGRpbmcgPVxuICAgICAgICBzZWF0UmVzZXJ2YXRpb25EZWNrLmNvYWNoSXRlbXNbMF0uZGltZW5zaW9uLmggKiB0aGlzLmJhc2VHcmlkU2l6ZSArIHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgZWFjaCBnYXAgYmV0d2VlbiBtdWx0aXBsZSBjb2FjaCB0aGUgZGVja3MuXG4gICAgICAvLyBObyBnYXAgZXhpc3QgaWYganVzdCBvbmUgY29hY2ggZGVjayBleGlzdC5cbiAgICAgIGNvbnN0IGdhcEJldHdlZW5Db2FjaERlY2tzID0gKHRoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxKSAqIHRoaXMuZ2FwQmV0d2VlbkNvYWNoRGVja3M7XG5cbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1oZWlnaHQnLFxuICAgICAgICBgJHtjb2FjaEhlaWdodFdpdGhCb3JkZXJQYWRkaW5nICogdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCArIGdhcEJldHdlZW5Db2FjaERlY2tzfWAsXG4gICAgICApO1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZGVja3MnLCBgJHt0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RofWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhKSB7XG4gICAgICB0aGlzLnNjcm9sbE5hdmlnYXRpb25BcmVhRGltID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgID8gdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgICAgOiB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG4gICAgICAvLyBJbml0IHRoZSBjb2FjaE5hdkJ1dHRvbkRpbSBkaW1lbnNpb24sIHdoaWNoIGlzIG5lZWRlZCB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3Qgc2Nyb2xsIG5hdmlnYXRpb24gbGF0ZXJcbiAgICAgIGNvbnN0IG5hdkNvYWNoZXNMaXN0ID0gdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYS5xdWVyeVNlbGVjdG9yKCd1bCA+IGxpJykgYXMgSFRNTFVMaXN0RWxlbWVudDtcbiAgICAgIGlmIChuYXZDb2FjaGVzTGlzdCkge1xuICAgICAgICBjb25zdCBmaXJzdExpRWxlRGltZW5zaW9uID0gbmF2Q29hY2hlc0xpc3Q/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLmNvYWNoTmF2QnV0dG9uRGltID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgPyBmaXJzdExpRWxlRGltZW5zaW9uLmhlaWdodFxuICAgICAgICAgIDogZmlyc3RMaUVsZURpbWVuc2lvbi53aWR0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb2FjaFNjcm9sbEFyZWEgJiYgc2VhdFJlc2VydmF0aW9uRGVjaykge1xuICAgICAgLy8gSW5pdCB0aGUgc3RhcnQgb2Zmc2V0IGZvciB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGNvYWNoIHNjcm9sbCB0cmlnZ2VyIHBvc2l0aW9uc1xuICAgICAgbGV0IGN1cnJDYWxjVHJpZ2dlclBvcyA9IDA7XG4gICAgICB0aGlzLnNjcm9sbENvYWNoZXNBcmVhV2lkdGggPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgICAgOiB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgLy8gUHJlY2FsY3VsYXRlIHRyaWdnZXIgc2Nyb2xsIHBvc2l0aW9uIGFycmF5IGRlcGVuZHMgb24gY29hY2ggd2lkdGhcbiAgICAgIHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvbiA9IHNlYXRSZXNlcnZhdGlvbkRlY2suY29hY2hJdGVtcy5tYXAoKF8sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvYWNoU3RydWN0dXJlID1cbiAgICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZS5kZWNrc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uZGVja0NvYWNoZXNbaW5kZXhdO1xuICAgICAgICBjb25zdCBzdGFydFBvc1ggPSBjdXJyQ2FsY1RyaWdnZXJQb3M7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRpb24gb2YgdGhlIGVuZCBzY3JvbGwgdHJpZ2dlciBwb3NpdGlvbiBvZiBhIGNvYWNoLCBpbmNsdWRpbmcgdGhlIGdhcCBiZXR3ZWVuIHRoZSBjb2FjaGVzXG4gICAgICAgIC8vIFRoZSBnYXAgaXMgbWF5YmUgYWRqdXN0ZWQgaWYgb3ZlcmhhbmdpbmcgcGxhY2VzIG9yIGdyYXBoaWNzIGV4aXN0XG4gICAgICAgIGN1cnJDYWxjVHJpZ2dlclBvcyArPVxuICAgICAgICAgIGNvYWNoU3RydWN0dXJlLndpZHRoICtcbiAgICAgICAgICAoIWNvYWNoU3RydWN0dXJlLmhhc092ZXJoYW5naW5nRWxlbWVudHNcbiAgICAgICAgICAgID8gdGhpcy5nYXBCZXR3ZWVuQ29hY2hlc1xuICAgICAgICAgICAgOiAyICogdGhpcy5nYXBCZXR3ZWVuQ29hY2hlcyk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGFydDogc3RhcnRQb3NYLFxuICAgICAgICAgIGVuZDogY3VyckNhbGNUcmlnZ2VyUG9zLFxuICAgICAgICAgIHdpZHRoOiBjb2FjaFN0cnVjdHVyZS53aWR0aCxcbiAgICAgICAgfSBhcyBDb2FjaFNjcm9sbFRyaWdnZXJQb2ludDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgbWF4aW11bSBjYWxjdWxhdGVkIGNvYWNoIHdpZHRoXG4gICAgICB0aGlzLm1heENhbGNDb2FjaGVzV2lkdGggPSBjdXJyQ2FsY1RyaWdnZXJQb3MgLSB0aGlzLmdhcEJldHdlZW5Db2FjaGVzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGwgZXZlbnQgaGFuZGxlciBtYW5hZ2VkIHRoZSBlbmQgb2Ygc2Nyb2xsaW5nIGluc2lkZSB0aGUgY29hY2ggc2Nyb2xsIGFyZWEuXG4gICAqIFRpbWVvdXQgZXZlbnQgaGFuZGxpbmcgdG8gY2hlY2sgaWYgdGhlIHNjcm9sbGluZyBoYXMgYmVlbiBjb21wbGV0ZWQuXG4gICAqIEl0IGlzIHJlcXVpcmVkIGJlY2F1c2UgdGhlIFNhZmFyaSBicm93c2VyIGRvZXMgbm90IGhhbmRsZSBzY3JvbGxlbmQgZXZlbnQsXG4gICAqIGFuZCB3ZSB0aGVyZWZvcmUgaW1pdGF0ZSB0aGlzIGV2ZW50IC0+IHNjcm9sbGVuZC5cbiAgICovXG4gIEBldmVudE9wdGlvbnMoeyBwYXNzaXZlOiB0cnVlIH0pXG4gIHByb3RlY3RlZCBjb2FjaEFyZWFTY3JvbGxlbmQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Njcm9sbFRpbWVvdXQpIHtcbiAgICAgIC8vIEZpcnN0LCB3ZSBjbGVhcmVkIHRoZSByZWdpc3RlcmVkIHRpbWVvdXQsIGFzIHRoZSBzY3JvbGxpbmcgaXMgc3RpbGwgcnVubmluZ1xuICAgICAgLy8gYW5kIHRodXMgd2UgcHJldmVudCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBfaGFuZGxlQ29hY2hBcmVhU2Nyb2xsZW5kRXZlbnQgZnVuY3Rpb25cbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zY3JvbGxUaW1lb3V0KTtcbiAgICB9XG4gICAgLy8gSWYgbm8gZnVydGhlciBzY3JvbGwgZXZlbnQgaXMgZmlyZWQsIHRoZSBuZXh0IHRpbWVvdXQgY2FuIGV4ZWN1dGUgdGhlIGlubmVyIGZ1bmN0aW9uIF9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCB3aXRob3V0IGNsZWFyaW5nXG4gICAgdGhpcy5fc2Nyb2xsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5faGFuZGxlQ29hY2hBcmVhU2Nyb2xsZW5kRXZlbnQoKSwgMTUwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBubyBuYXZpZ2F0aW9uIGV4aXN0cyAocHJvcGVydHkgc2V0dGluZyAtPiBoYXNOYXZpZ2F0aW9uKSBhbmQgYSB0YWJsZSBjb2FjaCBnZXRzIHRoZSBmb2N1cyxcbiAgICogdGhlIGZpcnN0IHBsYWNlIGluIHRoZSBjb2FjaCBtdXN0IGJlIGF1dG9tYXRpY2FsbHkgcHJlc2VsZWN0ZWQgdG8gY29udHJvbCB0aGUgcGxhY2UgbmF2aWdhdGlvbiB2aWEga2V5Ym9hcmRcbiAgICpcbiAgICogQHBhcmFtIGZvY3VzQ29hY2hJbmRleFxuICAgKi9cbiAgcHJvdGVjdGVkIG9uRm9jdXNUYWJsZUNvYWNoQW5kUHJlc2VsZWN0UGxhY2UoZm9jdXNDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyAmJiAhdGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgZm9jdXNDb2FjaEluZGV4ID09PSAwXG4gICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KC0xKVxuICAgICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChmb2N1c0NvYWNoSW5kZXgpO1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICB9XG4gIH1cblxuICAvKiogV2lsbCBiZSB0cmlnZ2VyZWQgYnkgZm9jdXMgbmF2aWdhdGlvbiBkaXJlY3Rpb24gKi9cbiAgcHJvdGVjdGVkIG9uRm9jdXNOYXZEaXJlY3Rpb25CdXR0b24oKTogdm9pZCB7XG4gICAgLy8gSWYgYW55IG5hdmlnYXRpb24gZGlyZWN0aW9uIGJ1dHRvbiAocmlnaHR8bGVmdCkgZ2V0IHRoZSBmb2N1cywgc28gd2UgaGF2ZSBtYW51YWwgcmVzZXQgdGhlIHByZXZpb3VzIGZvY3VzQ29hY2hJbmRleC5cbiAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gIH1cblxuICAvKiogVEFCIEtleSBFdmVudCBoYW5kbGluZyBmb3IgQ29hY2ggTmF2aWdhdGlvbiAqL1xuICBwcm90ZWN0ZWQgb25LZXlOYXZpZ2F0aW9uTmF2Q29hY2hCdXR0b24oXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsXG4gICAgY3Vyck5hdkNvYWNoQnV0dG9uSW5kZXg6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiKSB7XG4gICAgICB0aGlzLl9oYW5kbGVUYWJLZXlOYXZpZ2F0aW9uKGV2ZW50LCAnbmF2aWdhdGlvbicsIGN1cnJOYXZDb2FjaEJ1dHRvbkluZGV4KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBCeSB1c2luZyBhbnkgb3RoZXIga2V5IChubyBUQUIpIGluc2lkZSB0aGUgTmF2aWdhdGlvbiBhcmVhLCBzbyB3ZSBjYW4gaGFuZGxlIHRoaXMgYnkgdXNpbmcgdGhlIGxvZ2ljIGZyb20ga2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZ1xuICAgIGlmIChpc0Fycm93S2V5T3JQYWdlS2V5c1ByZXNzZWQoZXZlbnQpKSB7XG4gICAgICB0aGlzLmtleWJvYXJkU2VhdG1hcEV2ZW50SGFuZGxpbmcoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBHZW5lcmFsIFRBQiBLZXkgRXZlbnQgaGFuZGxpbmcgZm9yIHRhYiBuYXZpZ2F0aW9uIGluc2lkZSB0aGUgY29hY2ggbmF2aWdhdGlvbiBhcmVhIGFuZCB0aGUgc2VhdG1hcCBhcmVhICovXG4gIHByaXZhdGUgX2hhbmRsZVRhYktleU5hdmlnYXRpb24oXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsXG4gICAgZXZlbnRBcmVhOiBzdHJpbmcsXG4gICAgY3VyclRhYkluZGV4PzogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwcmVzc2VkS2V5ID0gZXZlbnQua2V5O1xuICAgIGNvbnN0IHByZXNzZWRTaGlmdFRhYiA9IGV2ZW50LnNoaWZ0S2V5O1xuXG4gICAgaWYgKHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLlRhYikge1xuICAgICAgLy8gSGFuZGxlIFRBQiBrZXkgZXZlbnQgbmF2aWdhdGlvbiBmb3IgY29hY2ggbmF2aWdhdGlvbiBhcmVhLlxuICAgICAgLy8gRnByIGNvYWNoIG5hdmlnYXRpb24gd2UganVzdCBjb250cm9sIHRoZSBmb2N1cyBpbmRleCB0byB2aXN1YWxpemUgZm9jdXMgc3R5bGUgZm9yIG5hdiBjb2FjaCBidXR0b25cbiAgICAgIGlmIChldmVudEFyZWEgPT0gJ25hdmlnYXRpb24nKSB7XG4gICAgICAgIGlmIChjdXJyVGFiSW5kZXggPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuY3VyclNlbGVjdGVkUGxhY2UgfHxcbiAgICAgICAgICAgICFwcmVzc2VkU2hpZnRUYWIgfHxcbiAgICAgICAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzW2N1cnJUYWJJbmRleF0uaXNEcml2ZXJBcmVhIHx8XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID09IC0xXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gY3VyclRhYkluZGV4O1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJlc3NlZFNoaWZ0VGFiICYmIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UpIHtcbiAgICAgICAgICAgIC8vSWYgdGhlIEZvciBiYWNrIHRhYmJpbmcsIHdlIGp1bXBcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyVGFiSW5kZXghO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZE5hdmlnYXRpb25CdXR0b24oY3VyclRhYkluZGV4ISk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgVEFCIGtleSBldmVudCBuYXZpZ2F0aW9uIGZvciBzZWF0bWFwIGFyZWFcbiAgICAgIGVsc2UgaWYgKGV2ZW50QXJlYSA9PSAnc2VhdG1hcCcpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHByZXNzZWRTaGlmdFRhYikge1xuICAgICAgICAgIHRoaXMuX25hdmlnYXRlQ29hY2hOYXZpZ2F0aW9uQnlLZXlib2FyZCgnUFJFVl9UQUInKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZUNvYWNoTmF2aWdhdGlvbkJ5S2V5Ym9hcmQoJ05FWFRfVEFCJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzYXRpb24gb2YgS2V5Ym9hcmQgU2VhdG1hcCBldmVudCBoYW5kbGluZyB0byBuYXZpZ2F0aW9uIGJldHdlZW4gZWFjaCBwbGFjZXMgaW5zaWRlIGEgc2VsZWN0ZWQgY29hY2ggYnkgdXNpbmcgW2Fycm93XSBrZXlzLlxuICAgKiBXaXRoIHRoZSBbVEFCXSBrZXkgdGhlIHVzZXIgbmF2aWdhdGlvbiBnb2VzIHRvIHRoZSBuZXh0IGNvYWNoIG5hdmlnYXRpb24gZWxlbWVudCBhbmQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZSBpcyBhdXRvbWF0aWNhbGx5IHJlc2V0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGtleWJvYXJkU2VhdG1hcEV2ZW50SGFuZGxpbmcoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpc1RhYk5leHQgPSBldmVudC5rZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLlRhYjtcbiAgICBjb25zdCBpc1RhYlByZXYgPSBldmVudC5zaGlmdEtleSAmJiBpc1RhYk5leHQ7XG5cbiAgICAvLyBJZiBubyBuYXZpZ2F0aW9uIGV4aXN0IGFuZCB0aGUgZmlyc3Qgb3IgbGFzdCBjb2FjaCBpcyBzZWxlY3RlZCwgdGhlIHRoZSB1c2UgdHJpZXMgdG8gbGVhdmUgdGhlIHNlYXQgcmVzZXJ2YXRpb24gY29tcG9uZW50IGJ5IHVzaW5nIHRhYixcbiAgICAvLyBzbyB3ZSBjYW4gcmV0dXJuIGhlcmUgYW5kIGFsbG93IHRoZSBuYXRpdmUgZm9jdXMgdG8gbGVhdmUgdGhlIGNvbXBvbmVudC5cbiAgICBpZiAoXG4gICAgICAoIXRoaXMuaGFzTmF2aWdhdGlvbiAmJiB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IDAgJiYgaXNUYWJQcmV2KSB8fFxuICAgICAgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubGVuZ3RoIC0gMSAmJiBpc1RhYk5leHQpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJlc3NlZEtleSA9IGV2ZW50LmtleTtcbiAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IGZhbHNlO1xuICAgIC8vIENoZWNrIGFueSBrZXlib2FyZCBldmVudCB3YXMgdHJpZ2dlcmVkIGluc2lkZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQsXG4gICAgLy8gc28gd2UgY2FuIHNheSB0aGUgbmF0aXZlIGJyb3dzZXIgZm9jdXMgbGllcyBvbiB0aGUgY29tcG9uZW50XG4gICAgaWYgKCF0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzICYmIChpc1RhYk5leHQgfHwgaXNUYWJQcmV2KSkge1xuICAgICAgdGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gSWYgYW55IHBsYWNlIGlzIHNlbGVjdGVkIGFuZCBUQUIgS2V5IGNvbWJpbmF0aW9uIGlzdCBwcmVzc2VkLFxuICAgIC8vIHRoZW4gd2UgaGFuZGxlIHRoZSBuZXh0IG9yIHByZXZpb3VzIGNvYWNoIHNlbGVjdGlvblxuICAgIGlmIChpc1RhYk5leHQpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVRhYktleU5hdmlnYXRpb24oZXZlbnQsICdzZWF0bWFwJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQXJyb3cgS2V5Ym9hcmQgbmF2aWdhdGlvbiB0byBjb250cm9sIHBsYWNlcyBpbnNpZGUgdGhlIHNlYXRtYXBcbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICE9PSAtMSAmJiBpc0Fycm93S2V5T3JQYWdlS2V5c1ByZXNzZWQoZXZlbnQpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBzd2l0Y2ggKHByZXNzZWRLZXkpIHtcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZExlZnRLZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd25cbiAgICAgICAgICAgICAgOiBwcmVzc2VkS2V5O1xuICAgICAgICAgICAgdGhpcy5fbmF2aWdhdGVUb1BsYWNlQnlLZXlib2FyZChwcmVzc2VkTGVmdEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRSaWdodEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXBcbiAgICAgICAgICAgICAgOiBwcmVzc2VkS2V5O1xuICAgICAgICAgICAgdGhpcy5fbmF2aWdhdGVUb1BsYWNlQnlLZXlib2FyZChwcmVzc2VkUmlnaHRLZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkVXBLZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnRcbiAgICAgICAgICAgICAgOiBwcmVzc2VkS2V5O1xuICAgICAgICAgICAgdGhpcy5fbmF2aWdhdGVUb1BsYWNlQnlLZXlib2FyZChwcmVzc2VkVXBLZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWREb3duS2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWREb3duS2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIGEgcGxhY2UgaW5zaWRlIHRoZSBjb2FjaCBpZiBuYXZpZ2F0ZWQgdmlhIGtleWJvYXJkLFxuICAgKiBvdGhlcndpc2UgdGhlIGNvYWNoIGdyaWQgaXMgc2VsZWN0ZWQgKG5lY2Vzc2FyeSBmb3IgU2NyZWVuUmVhZGVyKVxuICAgKi9cbiAgcHJvdGVjdGVkIHByZXNlbGVjdFBsYWNlSW5Db2FjaCgpOiB2b2lkIHtcbiAgICAvLyBObyBwcmVzZWxlY3QgcGxhY2UgYnkgbWFudWFsIHNlYXRtYXAgc2Nyb2xsaW5nXG4gICAgaWYgKCF0aGlzLmlzQXV0b1Njcm9sbGluZykgcmV0dXJuO1xuXG4gICAgLy8gTm8gYXV0byBwbGFjZSBwcmVzZWxlY3Rpb24gYnkgcnVubmluZyB0aGUgcHJlc2VsZWN0IGNvYWNoIGluZGV4XG4gICAgaWYgKHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLl9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciBEcml2ZXJBcmVhIG9yIEVtcHR5IGNvYWNoIChubyBwbGFjZXMpLCBubyBwbGFjZSBpcyBzZWxlY3RhYmxlLCBzbyB3ZSByZXR1cm4gZGlyZWN0bHlcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdICYmXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLmlzRHJpdmVyQXJlYVxuICAgICkge1xuICAgICAgdGhpcy5fc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT25seSB3aGVuIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCBhbmQgY29hY2hlcyBhcmUgc2Nyb2xsZWQgYnkgYXV0byBzY3JvbGxpbmcsXG4gICAgLy8gdGhlbiB3ZSBjYW4gc2V0IHRoZSBmb2N1cyBvbiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoLlxuICAgIGlmICh0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uICYmIHRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICBjb25zdCBjbG9zZXN0UGxhY2UgPSB0aGlzLl9nZXRDbG9zZXN0UGxhY2VCeUtleURpcmVjdGlvbigpO1xuICAgICAgLy9JZiBjbG9zZXN0UGxhY2UgZXhpc3QsIHdlIGhhdmUgdG8gdW5mb2N1cyBwcmV2aW91cyBmb2N1c2VkIHBsYWNlXG4gICAgICBpZiAoY2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KGNsb3Nlc3RQbGFjZSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIGEgY29hY2ggd2FzIHNlbGVjdGVkIHdpdGggbm8gcGxhY2VzLCB0aGVuIHdlIGhhdmUgdG8gZm9jdXMgdGhlIGNvYWNoR3JpZFxuICAgICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSW4gY2FzZXMgd2hlcmUgdGhlIHByZXNlbGVjdGlvbiBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgYnkgbm9ybWFsIGNsaWNraW5nIG9yIHZpYSBzY3JlZW4gcmVhZGVyIHZpYSB0YWIsXG4gICAgLy8gd2Ugb25seSBmb2N1cyB0aGUgdGFibGUgd2l0aG91dCBkaXJlY3RseSBmb2N1c2luZyB0aGUgcGxhY2UuXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcblxuICAgICAgdGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5faXNWYWxpZENvYWNoSW5kZXgoc2VsZWN0ZWROYXZDb2FjaEluZGV4KSAmJlxuICAgICAgc2VsZWN0ZWROYXZDb2FjaEluZGV4ICE9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICApIHtcbiAgICAgIHRoaXMuaG92ZXJlZENvYWNoSW5kZXggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXg7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IHRydWU7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleDtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gdGhpcy5fZ2V0RXhpc3RpbmdDb2FjaERlY2tJbmRleCgpO1xuICAgICAgdGhpcy5fc2V0U2Nyb2xsRGlyZWN0aW9uQnlDb2FjaEluZGV4KCk7XG5cbiAgICAgIGNvbnN0IHNjcm9sbFRvQ29hY2hQb3NYID0gdGhpcy5fZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTtcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWRDb2FjaEluZGV4U2Nyb2xsYWJsZSA9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ICE9PSAtMSB8fCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPiAwO1xuXG4gICAgICAvLyBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gYWxsb3dzIHNjcm9sbGluZyB0byB0aGUgbmV4dCB3YWdvbiBvciBub3RcbiAgICAgIGlmIChpc1NlbGVjdGVkQ29hY2hJbmRleFNjcm9sbGFibGUgJiYgdGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgICAgdGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICAgICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogdGhpcy5hbGlnblZlcnRpY2FsID8gc2Nyb2xsVG9Db2FjaFBvc1ggOiAwLFxuICAgICAgICAgIGxlZnQ6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IDAgOiBzY3JvbGxUb0NvYWNoUG9zWCxcbiAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBBdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBzZWxlY3RlZCBjb2FjaCBpbiB0aGUgbWFpbiBuYXZpZ2F0aW9uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihzZWxlY3RlZE5hdkNvYWNoSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBmb2N1c1BsYWNlRWxlbWVudChwbGFjZTogUGxhY2UgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgaWYgKHBsYWNlKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gcGxhY2U7XG4gICAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgICAgaWYgKHNlbGVjdGVkUGxhY2VFbGVtZW50KSB7XG4gICAgICAgIHNlbGVjdGVkUGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgna2V5Zm9jdXMnLCAnZm9jdXMnKTtcblxuICAgICAgICAvL1RyeSB0byBzY3JvbGwgZm9jdXNlZCBwbGFjZSBpbnRvIHRoZSB2aWV3cG9ydFxuICAgICAgICBjb25zdCBkZWxheVNjcm9sbEluVmlld3BvcnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBwbGFjZUlkID0gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4LFxuICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgICAgICAgcGxhY2UubnVtYmVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0KHBsYWNlSWQpO1xuICAgICAgICAgIGNsZWFyVGltZW91dChkZWxheVNjcm9sbEluVmlld3BvcnQpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdW5mb2N1c1BsYWNlRWxlbWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICBpZiAoc2VsZWN0ZWRQbGFjZUVsZW1lbnQpIHtcbiAgICAgIHNlbGVjdGVkUGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgna2V5Zm9jdXMnLCAndW5mb2N1cycpO1xuICAgICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQobnVsbCk7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihcbiAgICBlbGVtZW50RGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoRGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBpc09yaWdpbkhlaWdodD86IGJvb2xlYW4sXG4gICAgaXNTdHJldGNoSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudERpbWVuc2lvbiB7XG4gICAgaWYgKGNvYWNoRGltZW5zaW9uICYmICFpc09yaWdpbkhlaWdodCkge1xuICAgICAgLy8gU2luY2UgdGhlIGhlaWdodCBvZiB0aGUgY29hY2ggaGFzIGJlZW4gdmlzdWFsbHkgZXhwYW5kZWQgdG8gbWFpbnRhaW4gYSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3JkZXIgb2YgdGhlIGNvYWNoIGFuZCB0aGUgcGxhY2VzLFxuICAgICAgLy8gc29tZSBncmFwaGljcyBtdXN0IGFsc28gYmUgYWRhcHRlZCB0byB0aGUgaGVpZ2h0LCB3aGljaCBlbmQgd2l0aCB0aGUgYm9yZGVycyBvZiB0aGUgY29hY2hcbiAgICAgIGVsZW1lbnREaW1lbnNpb24uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogMjtcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJldGNoSGVpZ2h0KSB7XG4gICAgICAvLyBJbiB0aGUgY2FzZSBvZiBncmFwaGljcyBhcmUgYXNzaWduZWQgZGlyZWN0bHkgYXQgdGhlIGJvcmRlciBvZiB0aGUgY29hY2gsXG4gICAgICAvLyB0aGVzZSBncmFwaGljcyBtdXN0IGJlIGV4cGFuZGVkIGluIGhlaWdodCBieSBhIGNvYWNoQm9yZGVyT2Zmc2V0IGluIG9yZGVyIHRvIHJlYWNoIHRoZWlyIG9yaWdpbmFsIHZpc3VhbCBwb3NpdGlvblxuICAgICAgZWxlbWVudERpbWVuc2lvbi5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHc6IE1hdGgucm91bmQodGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50RGltZW5zaW9uLncpLFxuICAgICAgaDogTWF0aC5yb3VuZCh0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnREaW1lbnNpb24uaCksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkUG9zaXRpb24oXG4gICAgZWxlbWVudFBvc2l0aW9uOiBFbGVtZW50UG9zaXRpb24sXG4gICAgZWxlbWVudERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudFBvc2l0aW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgZWxlbWVudERpbWVuc2lvbikge1xuICAgICAgY29uc3QgZW5kUG9zSGVpZ2h0ID0gaXNPcmlnaW5IZWlnaHRcbiAgICAgICAgPyBjb2FjaERpbWVuc2lvbi5oXG4gICAgICAgIDogY29hY2hEaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICAvLyBJZiB0aGUgb3JpZ2luYWwgZWxlbWVudCBpcyBwb3NpdGlvbmVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSBjb2FjaCwgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgWSBjb29yZGluYXRlIHdpdGggdGhlIGFkZGl0aW9uYWwgYm9yZGVyIHBhZGRpbmdcbiAgICAgIGlmIChlbGVtZW50UG9zaXRpb24ueSA9PT0gMCkge1xuICAgICAgICBlbGVtZW50UG9zaXRpb24ueSAtPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50UG9zaXRpb24ueSArIGVsZW1lbnREaW1lbnNpb24uaCA9PT0gZW5kUG9zSGVpZ2h0KSB7XG4gICAgICAgIGVsZW1lbnRQb3NpdGlvbi55ICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IE1hdGgucm91bmQodGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueCksXG4gICAgICB5OiBNYXRoLnJvdW5kKHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudFBvc2l0aW9uLnkpLFxuICAgICAgejogZWxlbWVudFBvc2l0aW9uLnosXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZXRlY3RzIGlmIGEgKGdyYXBoaWNhbCkgZWxlbWVudCBpcyBvbiB0aGUgYm9yZGVyIHdpdGggaXRzIHBvc2l0aW9uICh1cHBlciBvciBsb3dlciBib3JkZXIpLlxuICAgKiBAcGFyYW0gYmFzZUVsZW1lbnRcbiAgICogQHBhcmFtIGNvYWNoRGltZW5zaW9uXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBpc0VsZW1lbnREaXJlY3RseU9uQm9yZGVyKFxuICAgIGJhc2VFbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICBjb2FjaERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGJhc2VFbGVtZW50LnBvc2l0aW9uLnkgPT09IDAgfHxcbiAgICAgIGJhc2VFbGVtZW50LnBvc2l0aW9uLnkgKyBiYXNlRWxlbWVudC5kaW1lbnNpb24uaCA9PT0gY29hY2hEaW1lbnNpb24uaFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ291bnRzIGFsbCBhdmFpbGFibGUgc2VhdHMgdG9nZXRoZXIgZGVwZW5kaW5nIG9uIHRoZSBzZWF0IHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHBsYWNlc1xuICAgKiBAcmV0dXJucyBBbiBPYmplY3Qgd2l0aCBjb3VudCBvZiBmcmVlIHNlYXRzIGFuZCBmcmVlIGJpY3ljbGUgcGxhY2VzXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChcbiAgICBwbGFjZXM6IFBsYWNlW10gfCB1bmRlZmluZWQsXG4gICk6IENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzIHtcbiAgICBjb25zdCBhY2N1bXVsYXRvcjogQ29hY2hOdW1iZXJPZkZyZWVQbGFjZXMgPSB7IHNlYXRzOiAwLCBiaWN5Y2xlczogMCB9O1xuICAgIGNvbnN0IGZyZWVQbGFjZXMgPSBwbGFjZXM/LnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJQbGFjZTogUGxhY2UpID0+IHtcbiAgICAgIGlmIChjdXJyUGxhY2Uuc3RhdGUgIT09ICdGUkVFJykge1xuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgICB9XG4gICAgICAvLyBDb3VudCB1cCBkZXBlbmRpbmcgb24gc2VhdCB0eXBlXG4gICAgICBpZiAoY3VyclBsYWNlLnR5cGUgPT09ICdTRUFUJykge1xuICAgICAgICBhY2N1bXVsYXRvci5zZWF0cysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWNjdW11bGF0b3IuYmljeWNsZXMrKztcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9LCBhY2N1bXVsYXRvcik7XG4gICAgcmV0dXJuIGZyZWVQbGFjZXMgPyBmcmVlUGxhY2VzIDogYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQXQgdGhlIGVuZCBvZiBhIHNjcm9sbCBFdmVudCBmcm9tIHRoZSBjb2FjaCBzY3JvbGxhYmxlIGFyZWEsXG4gICAqIHRoZSByZWFjaGVkIGNvYWNoIGlzIG1hcmtlZCBhcyBzZWxlY3RlZFxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQ29hY2hBcmVhU2Nyb2xsZW5kRXZlbnQoKTogdm9pZCB7XG4gICAgY29uc3QgZmluZFNjcm9sbENvYWNoSW5kZXggPSB0aGlzLmlzQXV0b1Njcm9sbGluZ1xuICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgIDogdGhpcy5fZ2V0Q29hY2hJbmRleEJ5U2Nyb2xsVHJpZ2dlclBvc2l0aW9uKCk7XG5cbiAgICAvLyBUSU1PLTQzNzA1XG4gICAgLy8gSWYgYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYnkgbW91c2UgY2xpY2sgKHByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljaykgYmVmb3JlIHRyaWdnZXJpbmcgdGhpcyBzY3JvbGxlbmQgbWV0aG9kLFxuICAgIC8vIHRoZW4gdGhpcyBzY3JvbGxpbmcgd2FzIHRyaWdnZXJlZCBieSB0aGUgbWV0aG9kIF9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQsIGFuZCBpdCBpcyBvbmx5IGEgcGxhY2UgYWRqdXN0bWVudCBzY3JvbGwgKHNjcm9sbEludG9WaWV3KSxcbiAgICAvLyB3aGVyZSBhIGxlc3MgdmlzaWJsZSBwbGFjZSBoYXMgYmVlbiBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC4gSW4gY2FzZSBvZiBhIHBsYWNlIGFkanVzdG1lbnQgYnkgY2xpY2ssIHdlIGNhbiByZXR1cm4gaGVyZS5cbiAgICBpZiAodGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2spIHtcbiAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGVuZHNjcm9sbGluZyBpcyBqdXN0IGEgcGxhY2UgYWRqdXN0bWVudCBzY3JvbGxpbmcgKHBsYWNlIGhhcyAyIGdyaWQgc2l6ZSB1bml0cylcbiAgICAgIGNvbnN0IGlzQ29hY2hTY3JvbGxpbmcgPVxuICAgICAgICBNYXRoLmFicyh0aGlzLl9sYXN0U3RhcnRTY3JvbGxQb3MgLSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0KSA+XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplICogMjtcbiAgICAgIGlmIChpc0NvYWNoU2Nyb2xsaW5nKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcblxuICAgIC8vIEFmdGVyIGNvYWNoIHNjcm9sbGVuZCBldmVudCB3ZSBjYW4gcmVzZXQgdGhlIGhvdmVyZWQgY29hY2ggaW5kZXhcbiAgICB0aGlzLmhvdmVyZWRDb2FjaEluZGV4ID0gLTE7XG5cbiAgICAvLyBJbiBjYXNlIHRoZSB1c2VyIHVzZXMgdGhlIHNjcm9sbGJhciB3aXRob3V0IGludGVyYWN0aW5nIHdpdGggdGhlIHNlYXQgcmVzZXJ2YXRpb24sXG4gICAgLy8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpbmRleCBpcyAtMSwgYW5kIHdlIGhhdmUgdG8gc2V0IHRoaXMgdmFsdWUgd2l0aCBmaW5kU2Nyb2xsQ29hY2hJbmRleC5cbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSAtMSkge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgZmluZFNjcm9sbENvYWNoSW5kZXggPCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgIDogZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzQXV0b1Njcm9sbGluZykge1xuICAgICAgLy9XaGVuIHVzZXIgaXMgc2Nyb2xsaW5nIHZpYSBzY3JvbGxiYXIsIGl0IGF1dG9tYXRpY2FsbHkgc2Nyb2xscyB0byB0aGUgZm9jdXNlZCBjb2FjaCBpbiB0aGUgbWFpbiBuYXZpZ2F0aW9uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihmaW5kU2Nyb2xsQ29hY2hJbmRleCk7XG4gICAgfVxuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuXG4gICAgaWYgKCF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhbiBhdXRvbWF0aWMgbWFpbiBuYXZpZ2F0aW9uIHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIHNlbGVjdGVkTmF2Q29hY2hJbmRleC5cbiAgICogQ2FsY3VsYXRlcyB0aGUgY2VudHJhbCBzY3JvbGwgb2Zmc2V0IG9mIHRoZSBuYXYgY29hY2ggdG8gYmUgc2VsZWN0ZWQuXG4gICAqIEBwYXJhbSBzZWxlY3RlZE5hdkNvYWNoSW5kZXhcbiAgICovXG4gIHByaXZhdGUgX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy9UaW1lIGRlbGF5IHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBvdGhlciBleGVjdXRpbmcgY2FsbGluZyBzY3JvbGxUbyBmdW5jdGlvbnMgKGNvYWNoZXMgc2Nyb2xsaW5nKVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbiAmJiB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhKSB7XG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25BcmVhQ2VudGVyZWRQb3NYID0gdGhpcy5zY3JvbGxOYXZpZ2F0aW9uQXJlYURpbSAvIDI7XG4gICAgICAgIGNvbnN0IHNjcm9sbEJ1dHRvbk9mZnNldFggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXggKiB0aGlzLmNvYWNoTmF2QnV0dG9uRGltO1xuICAgICAgICBjb25zdCBzY3JvbGxPZmZzZXRYID1cbiAgICAgICAgICBzY3JvbGxCdXR0b25PZmZzZXRYIC0gbmF2aWdhdGlvbkFyZWFDZW50ZXJlZFBvc1ggKyB0aGlzLmNvYWNoTmF2QnV0dG9uRGltO1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLnNjcm9sbFRvKHtcbiAgICAgICAgICB0b3A6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IHNjcm9sbE9mZnNldFggOiAwLFxuICAgICAgICAgIGxlZnQ6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IDAgOiBzY3JvbGxPZmZzZXRYLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgMTApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG5ldyBTY3JvbGxEaXJlY3Rpb24gYnkgdGhlIG5ldyBnaXZlbiB0YXJnZXQgY29hY2ggaW5kZXguXG4gICAqL1xuICBwcml2YXRlIF9zZXRTY3JvbGxEaXJlY3Rpb25CeUNvYWNoSW5kZXgoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID1cbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA+IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgID8gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0XG4gICAgICAgIDogU2Nyb2xsRGlyZWN0aW9uLmxlZnQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2Nyb2xsIHN0YXJ0IG9yIGVuZCBwb3NpdGlvbiBYIGZyb20gdGhlIHNlbGVjdGVkIGNvYWNoLlxuICAgKiBJbiBjYXNlIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBuYXZpZ2F0aW5nIHRocm91Z2ggcGxhY2VzIGJ5IGtleWJvYXJkIGFuZCBnb2VzIHRvIHByZXZpb3VzIGNvYWNoLFxuICAgKiB0aGVuIHdlIHJldHVybiB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBjb2FjaCB0byBnZXQgdGhlIGNsb3Nlc3Qgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGZvY3VzIHBsYWNlLlxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCk6IG51bWJlciB7XG4gICAgY29uc3QgY29hY2hUcmlnZ2VyUG9pbnQgPSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBpc0ZvY3VzUGxhY2VGcm9tUHJldmlvdXNDb2FjaFBvc2l0aW9uID1cbiAgICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gJiZcbiAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgIGNvYWNoVHJpZ2dlclBvaW50LndpZHRoID4gdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoO1xuXG4gICAgcmV0dXJuIGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb25cbiAgICAgID8gY29hY2hUcmlnZ2VyUG9pbnQuZW5kIC0gdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoXG4gICAgICA6IGNvYWNoVHJpZ2dlclBvaW50LnN0YXJ0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZvY3VzIG9uIHRoZSBIVE1MIHRhYmxlIChncmlkKSBjYXB0aW9uIGVsZW1lbnQgc28gdGhhdCB0aGUgaGVhZGluZyBpcyByZWFkIG91dCB3aGVuIHVzaW5nIGEgU2NyZWVuUmVhZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk6IHZvaWQge1xuICAgIC8vIFdoZW4gdGhlIHVzZXIgcGVyZm9ybXMgYW4gYWN0aW9uIHRoYXQgYWZmZWN0cyB0aGUgY29hY2ggbmF2aWdhdGlvbiwgdGhlbiB0aGUgbmF2aWdhdGVkIHRhYmxlIGlzIGZvY3VzYWJsZS5cbiAgICBpZiAodGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSAmJiB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzKSB7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgICBjb25zdCBjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcjc2JiLXNyLWNvYWNoLWNhcHRpb24tJyArIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICkgYXMgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ7XG4gICAgICBpZiAoY29hY2hUYWJsZUNhcHRpb25FbGVtZW50KSB7XG4gICAgICAgIGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2Nyb2xsZWQgcG9zaXRpb24gY2FuIGJlIHVzZWQgdG8gc2Nyb2xsIHRvIHRoZSBzZWxlY3RlZCB3YWdvblxuICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAqL1xuICBwcml2YXRlIF9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VyclNjcm9sbFBvc1ggPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgID8gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG9wXG4gICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG4gICAgY29uc3QgY29hY2hTY3JvbGxXaW5kb3dXaWR0aCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3QgbWF4U2Nyb2xsV2lkdGhBcmVhID0gdGhpcy5tYXhDYWxjQ29hY2hlc1dpZHRoIC0gY29hY2hTY3JvbGxXaW5kb3dXaWR0aDtcbiAgICBjb25zdCBjdXJyQ29hY2hUcmlnZ2VyID0gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgaXNTY3JvbGxQb3NTYW1lVG9DdXJyQ29hY2hQb3MgPVxuICAgICAgY3VyclNjcm9sbFBvc1ggPT09IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLnN0YXJ0O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIChjdXJyU2Nyb2xsUG9zWCA8IG1heFNjcm9sbFdpZHRoQXJlYSB8fCBjdXJyU2Nyb2xsUG9zWCA+IGN1cnJDb2FjaFRyaWdnZXIuc3RhcnQpICYmXG4gICAgICAhaXNTY3JvbGxQb3NTYW1lVG9DdXJyQ29hY2hQb3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvYWNoIGluZGV4IHdoaWNoIGlzIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSBzY3JvbGwgYXJlYVxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoSW5kZXhCeVNjcm9sbFRyaWdnZXJQb3NpdGlvbigpOiBudW1iZXIge1xuICAgIGNvbnN0IHNjcm9sbFBvcyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUb3BcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCBzY3JvbGxPZmZzZXRYID0gc2Nyb2xsUG9zICsgdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoIC8gMjtcbiAgICByZXR1cm4gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uLmZpbmRJbmRleChcbiAgICAgIChjb2FjaFRyaWdnZXIpID0+IHNjcm9sbE9mZnNldFggPj0gY29hY2hUcmlnZ2VyLnN0YXJ0ICYmIHNjcm9sbE9mZnNldFggPD0gY29hY2hUcmlnZ2VyLmVuZCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlyc3QgcGxhY2Ugb2YgY3VycmVudCBzZWxlY3RlZCBjb2FjaCBieSB0YWJsZSBjZWxsIGNvb3JkaW5hdGUgMC0wIGlkLlxuICAgKiBAcmV0dXJucyBQbGFjZSBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRGaXJzdFBsYWNlSW5TZWxlY3RlZENvYWNoKCk6IFBsYWNlIHwgbnVsbCB7XG4gICAgbGV0IGZpcnN0UGxhY2U6IFBsYWNlIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY29hY2ggPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgZmlyc3RDZWxsSWQgPVxuICAgICAgJ2NlbGwtJyArIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgJy0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgJy0wLTAnO1xuICAgIGNvbnN0IHBsYWNlTnVtYmVyID1cbiAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+KCcjJyArIGZpcnN0Q2VsbElkKVxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8U2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudD4oJ3NiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wnKVxuICAgICAgICA/LmdldEF0dHJpYnV0ZSgndGV4dCcpIHx8IG51bGw7XG5cbiAgICBpZiAoY29hY2ggJiYgcGxhY2VOdW1iZXIpIHtcbiAgICAgIGZpcnN0UGxhY2UgPSBjb2FjaC5wbGFjZXM/LmZpbmQoKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT09IHBsYWNlTnVtYmVyKSB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmlyc3RQbGFjZTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgcHJlc3NlZEtleTogc3RyaW5nLFxuICAgIGNvYWNoOiBDb2FjaEl0ZW0sXG4gICk6IG51bWJlciB8IG51bGwge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlIHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0IHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnRcbiAgICApXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggRE9XTlxuICAgIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93biAmJlxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ICsgMiA9PT0gY29hY2guZGltZW5zaW9uLmggJiZcbiAgICAgICEhdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgMV1cbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCArIDE7XG4gICAgfVxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggVVBcbiAgICBlbHNlIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueSA9PT0gMCAmJlxuICAgICAgISF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggLSAxXVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4IC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVG8gZ2V0IHRoZSBjb3JyZWN0IGNsb3Nlc3QgcGxhY2Ugb2YgY3VycmVudCBwcmVzc2VkIGtleSBhbmQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcGxhY2UsXG4gICAqIHdlIGhhdmUgdG8gaW52ZXN0aWdhdGUgdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggcGxhY2UgdG8gZmluZCB0aGUgY2xvc2VzdCBwbGFjZSBvZiB0aGUgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQuXG4gICAqIEBwYXJhbSBwcmVzc2VkS2V5XG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKHByZXNzZWRLZXk/OiBzdHJpbmcpOiBQbGFjZSB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoID1cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGxldCBjbG9zZXN0UGxhY2UgPSBudWxsO1xuICAgIGxldCBjb2FjaFBsYWNlcyA9IGNvYWNoLnBsYWNlcztcbiAgICBsZXQgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA9IG51bGw7XG5cbiAgICBpZiAoY29hY2hQbGFjZXMpIHtcbiAgICAgIC8vIElmIG5vIHBsYWNlIHNldCwgdGhlbiB3ZSB1c2UgaW5pdGlhbCB0aGUgbGVmdC10b3AgcGxhY2Ugb24gdGhlIGNvYWNoXG4gICAgICBpZiAoIXRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEZpcnN0UGxhY2VJblNlbGVjdGVkQ29hY2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICAgICAgY29uc3QgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbiA9IHsgLi4udGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbiB9O1xuXG4gICAgICAgICAgaWYgKHByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCB0byBzd2l0Y2ggdG8gYW5vdGhlciBjb2FjaCBkZWNrIChVcCAtPiBEb3duIHwgRG93biAtPiBVcCkuXG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHRha2UgdGhlIGNvYWNoIHBsYWNlcyB3ZSBoYXZlIHRvIGNoZWNrZWQgZnJvbSB0aGUgdGFyZ2V0IGRlY2sgbm93LlxuICAgICAgICAgICAgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA9IHRoaXMuX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgICAgICAgICAgIHByZXNzZWRLZXksXG4gICAgICAgICAgICAgIGNvYWNoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChzd2l0Y2hlZENvYWNoRGVja0luZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIEFzc2lnbiBjaGVjayBwbGFjZXMgZnJvbSB0aGUgdGFyZ2V0IHN3aXRjaCBkZWNrXG4gICAgICAgICAgICAgIGNvYWNoUGxhY2VzID1cbiAgICAgICAgICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbc3dpdGNoZWRDb2FjaERlY2tJbmRleF0uY29hY2hJdGVtc1tcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgICAgICAgIF0ucGxhY2VzIHx8IFtdO1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHVwZGF0ZSB5IGNvb3JkaW5hdGVcbiAgICAgICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ID1cbiAgICAgICAgICAgICAgICBzd2l0Y2hlZENvYWNoRGVja0luZGV4IDwgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPyBjb2FjaC5kaW1lbnNpb24uaCA6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3QgcGxhY2Ugb2YgY29hY2hQbGFjZXMpIHtcbiAgICAgICAgICAgIC8vIElmIG5vIGtleSBwcmVzc2VkLCB0aGVuIHdlIHRyeSB0byBmaW5kIHRoZSBwbGFjZSBvZiB0aGUgY3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uXG4gICAgICAgICAgICBpZiAoIXByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgICAgLy8gRmluZCBwbGFjZSBmcm9tIHRoZSBsZWZ0IHNpZGUgb2YgY29hY2ggYnkgeSBjb29yZGluYXRlLiBDdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb24gaXMgUklHSFRcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvL0ZpbmQgcGxhY2UgZnJvbSB0aGUgcmlnaHQgc2lkZSBvZiBjb2FjaCBieSB5IGNvb3JkaW5hdGUuIEN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvbiBpcyBMRUZUXG4gICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocGxhY2UubnVtYmVyICE9PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlPy5udW1iZXIpIHtcbiAgICAgICAgICAgICAgICAvL0tleSBbUmlnaHRdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeC1heGlzIHRvIGdldCB0aGUgc21hbGxlc3QgbGFyZ2VyIHggcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA+IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vS2V5IFtEb3duXSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHktYXhpcyB0byBnZXQgdGhlIHNtYWxsZXN0IGxhcmdlciB5IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCArIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID4gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi55IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLnkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW0xlZnRdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeC1heGlzIHRvIGdldCB0aGUgZ3JlYXRlc3Qgc21hbGxlciB4IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0ICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSArIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54IDwgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW1VwXSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHktYXhpcyB0byBnZXQgdGhlIGdyZWF0ZXN0IHNtYWxsZXIgeSBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IC0gMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPCBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIGEgcGxhY2UgaGFzIGJlZW4gZm91bmQgaW4gdGhlIGNoYW5naW5nIHN3aXRjaCBjb2FjaCxcbiAgICAgICAgICAvLyB3ZSBjYW4gdXBkYXRlIHRoZSBjdXJyU2VsZWN0ZWREZWNrSW5kZXhcbiAgICAgICAgICBpZiAoc3dpdGNoZWRDb2FjaERlY2tJbmRleCAhPT0gbnVsbCAmJiBjbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gc3dpdGNoZWRDb2FjaERlY2tJbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsb3Nlc3RQbGFjZTtcbiAgfVxuXG4gIC8vIEhhbmRsaW5nIGZvciBUYWIgbmF2aWdhdGlvbiBpZiBhIHBsYWNlIGlzIHNlbGVjdGVkIGluc2lkZSB0aGUgY29hY2guXG4gIC8vIFRoaXMgY29udHJvbHMgdGhlIGZvY3VzZWQgY29hY2ggZnJvbSB0aGUgY3VycmVudCBzZWxlY3RlZCBjb2FjaC5cbiAgcHJpdmF0ZSBfbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKHRhYkRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VyckZvY3VzSW5kZXggPVxuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9PT0gLTFcbiAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IC0xXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgOiB0aGlzLmZvY3VzZWRDb2FjaEluZGV4O1xuXG4gICAgLy8gQ2hlY2sgbmV4dCBvciBwcmV2IHRhYiBpcyBwcmVzc2VkLCB0aGVuIHdlIG5lZWQgdG8gZmluZCB0aGUgbmV4dCBhdmFpbGFibGUgY29hY2ggaW5kZXggdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgZm9jdXNcbiAgICBjb25zdCBuZXdGb2N1c2FibGVJbmRleDogbnVtYmVyID1cbiAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJ1xuICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoY3VyckZvY3VzSW5kZXgpXG4gICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyRm9jdXNJbmRleCk7XG5cbiAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICAgIGNvbnN0IHBsYWNlSW5Db2FjaEhhc0ZvY3VzID0gc2VsZWN0ZWRQbGFjZUVsZW1lbnRcbiAgICAgICAgPyBzZWxlY3RlZFBsYWNlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJykgPT09ICdmb2N1cydcbiAgICAgICAgOiBmYWxzZTtcblxuICAgICAgLy8gSWYgd2UgdGFiIGJhY2sgKFBSRVZfVEFCKSBhbmQgdGhlIGZvY3VzIGlzIGN1cnJlbnRseSBvbiBwbGFjZSxcbiAgICAgIC8vIHdlIHJlbW92ZSB0aGUgc2VsZWN0ZWQgc3RhdGUgZnJvbSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5hdmlnYXRpb24gY29hY2ggYW5kIG9ubHkgc2V0IHRoZSBmb2N1cyBzdGF0dXMgdG8gaXRcbiAgICAgIGlmICh0YWJEaXJlY3Rpb24gPT09ICdQUkVWX1RBQicgJiYgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPT09IGN1cnJGb2N1c0luZGV4KSB7XG4gICAgICAgIC8vIElmIHdlIFRBQiBiYWNrIGFuZCBoYXZlIGEgc2VsZWN0ZWQgcGxhY2VzIGluc2lkZSB0aGUgY3VycmVudCBjb2FjaCwgdGhlbiB3ZSBtb3ZlIG91dCBmcm9tIHRoZSBzZWF0bWFwIGFuZCBzZXQgdGhlIGZvY3VzIHRvIHRoZSBjdXJyZW50IHNlbGVjdGVkIGNvYWNoXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cyB8fCB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJGb2N1c0luZGV4O1xuICAgICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBmaXJzdCBjb2FjaCBpcyBzZWxlY3RlZCBhbmQgd2UgVEFCIGJhY2ssIHdlIGhhdmUgdG8gc2V0IHRoZSBuYXRpdmUgZm9jdXMgb24gdGhlIGZpcnN0IGNvYWNoIGluIHRoZSBuYXZpZ2F0aW9uIHRvIGdldCBiYWNrIHRvIHRoZSBub3JtYWwgdGFiIG5hdmlnYXRpb24uXG4gICAgICAgIC8vIFRvIGRvIHRoaXMsIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBmb2N1c2VkSW5kZXggZnJvbSB0aGUgZmlyc3QgY29hY2ggYW5kIHNldCBpdCBhZ2FpbiBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgICAgIGVsc2UgaWYgKGN1cnJGb2N1c0luZGV4ID09PSAwKSB7XG4gICAgICAgICAgLy8gUmVmb2N1cyB0aGUgZmlyc3QgY29hY2hcbiAgICAgICAgICB0aGlzLl9yZWZvY3VzQ3VycmVudEZvY3VzZWROYXZDb2FjaChjdXJyRm9jdXNJbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBPbmx5IHNldHMgdGhlIGZvY3VzIG9uIHRoZSBuZXcgbmF2aWdhdGlvbiBjb2FjaFxuICAgICAgZWxzZSBpZiAobmV3Rm9jdXNhYmxlSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICB9XG4gICAgICAvLyBXaGVuIHRoZSBsYXN0IGNvYWNoIGlzIHNlbGVjdGVkIGFuZCB3ZSBUQUIsIHdlIGhhdmUgdG8gc2V0IHRoZSBuYXRpdmUgZm9jdXMgb24gdGhlIGxhc3QgY29hY2ggaW4gdGhlIG5hdmlnYXRpb24gdG8gZ2V0IGJhY2sgdG8gdGhlIG5vcm1hbCB0YWIgbmF2aWdhdGlvbi5cbiAgICAgIC8vIFRvIGRvIHRoaXMsIHdlIGhhdmUgIHRvIHJlbW92ZSB0aGUgZm9jdXNlZEluZGV4IGZyb20gdGhlIGZpcnN0IGNvYWNoIGFuZCBzZXQgaXQgYWdhaW4gYWZ0ZXIgYSBzaG9ydCBkZWxheVxuICAgICAgZWxzZSBpZiAoXG4gICAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJyAmJlxuICAgICAgICBuZXdGb2N1c2FibGVJbmRleCA9PT0gdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubGVuZ3RoIC0gMVxuICAgICAgKSB7XG4gICAgICAgIC8vIFJlZm9jdXMgdGhlIGxhc3QgY29hY2hcbiAgICAgICAgdGhpcy5fcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goY3VyckZvY3VzSW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICAvLyBJZiBhbnkgcGxhY2Ugd2FzIGZvY3VzZWQgaW4gY29hY2gsIHNvIHdlIHNldCBmb2N1c2VkIGFnYWluXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cykge1xuICAgICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm8gcGxhY2Ugd2FzIHNlbGVjdGVkLCB0aGVuIHdlIHNlbGVjdCB0aGUgY29hY2ggZ3JpZFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCeSBUYWIgTmF2aWdhdGlvbiwgcGVyZm9ybSBhdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBmb2N1c2VkIHdhZ29uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QsIHdlIHNjcm9sbCBkaXJlY3RseSB0byB0aGUgbmV4dCB0YWJhYmxlIGNvYWNoXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVmb2N1c2VkIHRoZSBjdXJyZW50IGZvY3VzZWQgKHZpc3VhbCkgbmF2IGNvYWNoIHRvIGdldCB0aGUgbmF0aXZlIGZvY3VzIGJhY2sgdG8gdGhlIG5hdmlnYXRpb25cbiAgcHJpdmF0ZSBfcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goZm9jdXNJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBmb2N1c0luZGV4KSwgMCk7XG4gIH1cblxuICBwcml2YXRlIF9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZlbnRQbGFjZUNsaWNrKSB7XG4gICAgICBjb25zdCBmaW5kQ2xvc2VzdFBsYWNlID0gdGhpcy5fZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24ocHJlc3NlZEtleSk7XG5cbiAgICAgIGlmIChmaW5kQ2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoZmluZENsb3Nlc3RQbGFjZSk7XG4gICAgICB9XG4gICAgICAvLyBObyBjbG9zZXN0IHBsYWNlIGZvdW5kIGJ5IGtleSBuYXZpZ2F0aW9uXG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgfHxcbiAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgfHxcbiAgICAgICAgICAodGhpcy5hbGlnblZlcnRpY2FsICYmXG4gICAgICAgICAgICAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCB8fFxuICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24pKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDaGVjayB0aGUgY3VycmVudCBwcmVzc2VkIGtleSB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIGNvYWNoIGluZGV4XG4gICAgICAgICAgY29uc3QgbmV3U2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHRcbiAgICAgICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KClcbiAgICAgICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KCk7XG5cbiAgICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdTZWxlY3RlZENvYWNoSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICAgPyBzdGFydEluZGV4ICsgMVxuICAgICAgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPiAwID8gc3RhcnRJbmRleCAtIDEgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHBsYWNlVHlwZVByb3AgPSBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/ICdzZWF0cycgOiAnYmljeWNsZXMnO1xuICAgIGNvbnN0IG1heFJlc2VydmF0aW9ucyA9XG4gICAgICBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/IHRoaXMubWF4U2VhdFJlc2VydmF0aW9ucyA6IHRoaXMubWF4QmljeWNsZVJlc2VydmF0aW9ucztcbiAgICBjb25zdCBjdXJyU2VsZWN0ZWRQbGFjZXMgPSB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzW3BsYWNlVHlwZVByb3BdO1xuXG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1twbGFjZVR5cGVQcm9wXSA9IHRoaXMuX3VwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKFxuICAgICAgY3VyclNlbGVjdGVkUGxhY2VzLFxuICAgICAgbWF4UmVzZXJ2YXRpb25zLFxuICAgICAgcGxhY2VTZWxlY3Rpb24sXG4gICAgKTtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Q3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXM+fVxuICAgICAqIEVtaXRzIHdoZW4gYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYW5kIHJldHVybnMgYSBQbGFjZSBhcnJheSB3aXRoIGFsbCBzZWxlY3RlZCBwbGFjZXMuXG4gICAgICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzPignc2VsZWN0ZWRwbGFjZXMnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMoXG4gICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10sXG4gICAgbWF4UmVzZXJ2YXRpb25zOiBudW1iZXIsXG4gICAgcGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdIHtcbiAgICAvLyBBZGQgc2VsZWN0ZWQgcGxhY2UgdG8gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNcbiAgICBpZiAocGxhY2VTZWxlY3Rpb24uc3RhdGUgPT09ICdTRUxFQ1RFRCcpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VEZWNrSW5kZXggPSB0aGlzLl9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgIHBsYWNlU2VsZWN0aW9uLFxuICAgICAgICBzZWxlY3RlZFBsYWNlRGVja0luZGV4LFxuICAgICAgKTtcbiAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pIHtcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMucHVzaChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgcGxhY2UgZnJvbSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGVsc2Uge1xuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5maWx0ZXIoXG4gICAgICAgIChfc2VsZWN0ZWRQbGFjZSkgPT4gX3NlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gQ2hlY2tzIHdoZXRoZXIgbWF4UmVzZXJ2YXRpb24gaXMgYWN0aXZhdGVkIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0ZWQgcGxhY2VzIGlzIHJlYWNoZWRcbiAgICBpZiAobWF4UmVzZXJ2YXRpb25zID4gLTEgJiYgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMubGVuZ3RoID4gbWF4UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCByZXNldFdpdGhQbGFjZVNlbGVjdGlvbiA9IG1heFJlc2VydmF0aW9ucyA+IDAgPyBwbGFjZVNlbGVjdGlvbiA6IHVuZGVmaW5lZDtcblxuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSB0aGlzLl9yZXNldEFsbFBsYWNlU2VsZWN0aW9ucyhcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICAgIHJlc2V0V2l0aFBsYWNlU2VsZWN0aW9uLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZFBsYWNlSW5Db2FjaChwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBwbGFjZURlY2tJbmRleCA9IHRoaXMuX2dldERlY2tJbmRleEJ5UGxhY2VJZChwbGFjZVNlbGVjdGlvbi5pZCk7XG4gICAgY29uc3QgY29hY2hJbmRleCA9IHBsYWNlU2VsZWN0aW9uLmNvYWNoSW5kZXg7XG5cbiAgICBpZiAocGxhY2VEZWNrSW5kZXggPT09IG51bGwpIHJldHVybjtcblxuICAgIGNvbnN0IHBsYWNlID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3BsYWNlRGVja0luZGV4XS5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdLnBsYWNlcz8uZmluZChcbiAgICAgIChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09IHBsYWNlU2VsZWN0aW9uLm51bWJlcixcbiAgICApO1xuXG4gICAgaWYgKCFwbGFjZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPSBwbGFjZURlY2tJbmRleDtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBjb2FjaEluZGV4O1xuICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBwbGFjZTtcblxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQocGxhY2UpO1xuXG4gICAgLy8gVGltZSBkZWxheSB0byB3YWl0IGZvciBzdGF0dXMgdXBkYXRlIHByb2Nlc3MgYXQgY2xpY2tlZCBwbGFjZVxuICAgIGNvbnN0IGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0KHBsYWNlU2VsZWN0aW9uLmlkKTtcbiAgICAgIGNsZWFyVGltZW91dChkZWxheVNjcm9sbEluVmlld3BvcnQpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk6IHZvaWQge1xuICAgIC8vT25seSBpZiB0aGUgc2VsZWN0ZWRDb2FjaEluZGV4IGhhcyBjaGFuZ2VkLCBhbiB1cGRhdGUgbmVlZHMgdG8gYmUgY2FycmllZCBvdXRcbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KSByZXR1cm47XG5cbiAgICAvLyBJZiBhIGZvY3VzaW5kZXggaGFzIGJlZW4gc2V0ICghPSAtMSksIGl0IGNhbiBiZSB1cGRhdGVkIHdpdGggdGhlIGN1cnJlbnQgc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuXG4gICAgY29uc3QgY29hY2hTZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoKHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KTtcbiAgICBpZiAoY29hY2hTZWxlY3Rpb24pIHtcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUge0N1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2g+fVxuICAgICAgICogRW1pdHMgd2hlbiBhIGNvYWNoIHdhcyBzZWxlY3RlZCBhbmQgcmV0dXJucyBhIENvYWNoU2VsZWN0aW9uXG4gICAgICAgKi9cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2g+KCdzZWxlY3RlZGNvYWNoJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBjb2FjaFNlbGVjdGlvbixcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQbGFjZUVsZW1lbnRJZChcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBwbGFjZU51bWJlcjogc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICAnc2VhdC1yZXNlcnZhdGlvbl9fcGxhY2UtYnV0dG9uLScgKyBjb2FjaERlY2tJbmRleCArICctJyArIGNvYWNoSW5kZXggKyAnLScgKyBwbGFjZU51bWJlclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW4gdGhlIGNhc2Ugb2YgY29hY2ggbGF5b3V0cyB3aXRoIGRpZmZlcmVudCBkZWNrcyxcbiAgICogaXQgaXMgbmVjZXNzYXJ5IHRvIGV4dGVuZCB0aGUgb2Zmc2V0IHdpdGggZW1wdHkgY29hY2hlc1xuICAgKiBpbiBvcmRlciB0byBjcmVhdGUgYSBzdGFibGUgdmVoaWNsZSBsYXlvdXQuXG4gICAqXG4gICAqICAgICAgICAgICAgIFtvb29dLVtvb29dLVtvb29dXG4gICAqIFtvb29dLVtvb29dLVtvb29dLVtvb29dLVtvb29dXG4gICAqL1xuICBwcml2YXRlIF9pbml0RW1wdHlDb2FjaERlY2tPZmZzZXRzKCk6IHZvaWQge1xuICAgIC8vIFByZWZpbGwgb2Zmc2V0IGNvdW50ZXJzIHdpdGggMCBzdGFydCBpbmRleFxuICAgIGNvbnN0IGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyID0gQXJyYXkodGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDEpLmZpbGwoMCk7XG4gICAgLy8gVGFrZXMgdGhlIGxvd2VyIGRlY2sgd2hpY2ggY29udGFpbnMgdGhlIG1heCBudW1iZXJzIG9mIGNvYWNoZXNcbiAgICBjb25zdCBsb3dlckRlY2sgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdO1xuXG4gICAgbG93ZXJEZWNrLmNvYWNoSXRlbXMuZm9yRWFjaCgobG93ZXJDb2FjaEl0ZW06IENvYWNoSXRlbSkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRlY2tDb2FjaEl0ZW0gPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbaV0uY29hY2hJdGVtc1tjb2FjaE9mZnNldEluZGV4Q291bnRlcltpXV07XG4gICAgICAgIGlmIChsb3dlckNvYWNoSXRlbS5pZCAhPSBkZWNrQ29hY2hJdGVtPy5pZCkge1xuICAgICAgICAgIC8vIEFkZCBFbXB0eSBvZmZzZXQgY29hY2ggdG8gc3BlY2lmaWVkIGluZGV4IHBvc2l0aW9uXG4gICAgICAgICAgY29uc3QgZW1wdHlPZmZzZXRDb2FjaCA9IHtcbiAgICAgICAgICAgIC4uLmxvd2VyQ29hY2hJdGVtLFxuICAgICAgICAgICAgcGxhY2VzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBwcm9wZXJ0eUlkczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ3JhcGhpY0VsZW1lbnRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzZXJ2aWNlRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRyYXZlbENsYXNzOiBbXSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1tpXS5jb2FjaEl0ZW1zLnNwbGljZShcbiAgICAgICAgICAgIGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGVtcHR5T2Zmc2V0Q29hY2gsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldKys7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gb2YgU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gQXJyYXkgYmFzZWQgb24gdGhlIHRyYW5zZmVycmVkIHBsYWNlc1xuICAgKiB0aGF0IGhhdmUgdGhlIHN0YXRlIFNFTEVDVEVEIHdpdGhpbiB0aGUgc2VhdFJlc2VydmF0aW9uIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIC8vIFJlc2V0IHBsYWNlIHNlbGVjdGlvbnNcbiAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLnNlYXRzID0gW107XG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5iaWN5Y2xlcyA9IFtdO1xuXG4gICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zPy5mb3JFYWNoKChzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiwgY29hY2hEZWNrSW5kZXg6IG51bWJlcikgPT5cbiAgICAgIHNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zLm1hcCgoY29hY2g6IENvYWNoSXRlbSwgY29hY2hJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvYWNoLnBsYWNlc1xuICAgICAgICAgID8uZmlsdGVyKChwbGFjZSkgPT4gcGxhY2Uuc3RhdGUgPT09ICdTRUxFQ1RFRCcpXG4gICAgICAgICAgPy5mb3JFYWNoKChwbGFjZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGxhY2VJZCA9IHRoaXMuZ2V0UGxhY2VFbGVtZW50SWQoY29hY2hEZWNrSW5kZXgsIGNvYWNoSW5kZXgsIHBsYWNlLm51bWJlcik7XG4gICAgICAgICAgICBjb25zdCBwcmVzZWxlY3RlZFBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbiA9IG1hcFBsYWNlSW5mb3NUb1BsYWNlU2VsZWN0aW9uKFxuICAgICAgICAgICAgICBwbGFjZSxcbiAgICAgICAgICAgICAgcGxhY2VJZCxcbiAgICAgICAgICAgICAgc2VhdFJlc2VydmF0aW9uLmRlY2tDb2FjaEluZGV4LFxuICAgICAgICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb246IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIHwgbnVsbCA9XG4gICAgICAgICAgICAgIHRoaXMuX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKHByZXNlbGVjdGVkUGxhY2VTZWxlY3Rpb24sIGNvYWNoRGVja0luZGV4KTtcblxuICAgICAgICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuc2VhdHMucHVzaChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5iaWN5Y2xlcy5wdXNoKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgc2VsZWN0ZWQgcGxhY2VzIHdpbGwgYmUgcmVzZXQgb3IgdGhlIGN1cnJlbnRTZWxlY3RlZFBsYWNlIHdhcyBnaXZlbiwgdGhlbiB3ZSByZXNldCBhbGwgZXhjZXB0IGN1cnJlbnRTZWxlY3RlZFBsYWNlXG4gICAqIEBwYXJhbSByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uc1xuICAgKiBAcGFyYW0gY3VyclNlbGVjdGVkUGxhY2VcbiAgICovXG4gIHByaXZhdGUgX3Jlc2V0QWxsUGxhY2VTZWxlY3Rpb25zKFxuICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdLFxuICAgIGN1cnJTZWxlY3RlZFBsYWNlPzogUGxhY2VTZWxlY3Rpb24sXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10ge1xuICAgIC8vRmluZCBhbGwgcGxhY2VzIHRvIGJlIG5lZWRlZCB1bnNlbGVjdFxuICAgIGZvciAoY29uc3QgcGxhY2VTZWxlY3Rpb24gb2YgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMpIHtcbiAgICAgIGlmICghY3VyclNlbGVjdGVkUGxhY2UgfHwgY3VyclNlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQocGxhY2VTZWxlY3Rpb24uaWQpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAocGxhY2VFbGVtZW50KSB7XG4gICAgICAgICAgcGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3RhdGUnLCAnRlJFRScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vUmVtb3ZlcyBhbGwgc2VsZWN0ZWQgcGxhY2VzIGV4Y2VwdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgaWYgKGN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucyA9IHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zLmZpbHRlcihcbiAgICAgICAgKF9zZWxlY3RlZFBsYWNlKSA9PiBfc2VsZWN0ZWRQbGFjZS5pZCA9PT0gY3VyclNlbGVjdGVkUGxhY2UuaWQsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucyA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIF9nZXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihcbiAgICBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2VTZWxlY3Rpb24sXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlciB8IG51bGwsXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIHwgbnVsbCB7XG4gICAgaWYgKGNvYWNoRGVja0luZGV4ID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGNvYWNoID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW2NvYWNoRGVja0luZGV4XS5jb2FjaEl0ZW1zW2N1cnJTZWxlY3RlZFBsYWNlLmNvYWNoSW5kZXhdO1xuICAgIGNvbnN0IHBsYWNlID0gY29hY2gucGxhY2VzPy5maW5kKChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09PSBjdXJyU2VsZWN0ZWRQbGFjZS5udW1iZXIpO1xuXG4gICAgcmV0dXJuIHBsYWNlXG4gICAgICA/IG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKFxuICAgICAgICAgIHBsYWNlLFxuICAgICAgICAgIGNvYWNoLFxuICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlLmlkLFxuICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlLmRlY2tJbmRleCxcbiAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZS5jb2FjaEluZGV4LFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9nZXRTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoKFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgKTogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaCB8IG51bGwge1xuICAgIGlmICghdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGNvYWNoID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGNvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzID0gdGhpcy5nZXRBdmFpbGFibGVGcmVlUGxhY2VzTnVtRnJvbUNvYWNoKGNvYWNoLnBsYWNlcyk7XG4gICAgcmV0dXJuIG1hcENvYWNoSW5mb3NUb0NvYWNoU2VsZWN0aW9uKGNvYWNoSW5kZXgsIGNvYWNoLCBjb2FjaE51bWJlck9mRnJlZVBsYWNlcyk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZTogUGxhY2UgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZCA9IHBsYWNlXG4gICAgICA/IHRoaXMuZ2V0UGxhY2VFbGVtZW50SWQoXG4gICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXgsXG4gICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgICAgIHBsYWNlLm51bWJlcixcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmF0aW9uIG9mIHRoZSB1c2VkIGRvY3VtZW50cyBmb250LXNpemUgd2hpY2ggbmVlZHNcbiAgICogdG8gYmUgZGV0ZXJtaW5lZCBpbiBvcmRlciB0byBjb3JyZWN0bHkgY2FsY3VsYXRlIENTUyB2YWx1ZXMgd2l0aCByZW1cbiAgICogKi9cbiAgcHJpdmF0ZSBfZGV0ZXJtaW5lQmFzZUZvbnRTaXplKCk6IHZvaWQge1xuICAgIGlmICghaXNTZXJ2ZXIpIHtcbiAgICAgIGNvbnN0IGJhc2VGb250U2l6ZSA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmZvbnRTaXplLCAxMCk7XG4gICAgICAvL2NhbGN1bGF0ZSByZW0gb2YgMXB4XG4gICAgICBjb25zdCBvbmVQaXhlbEluUmVtID0gMSAvIGJhc2VGb250U2l6ZTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLW9uZS1weC1yZW0nLCBgJHtvbmVQaXhlbEluUmVtICsgJ3JlbSd9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGRhdGEgZm9yIGRpc3BsYXlpbmcgbmF2aWdhdGlvbiBhcmVhLlxuICAgKiBDYWxjdWxhdGVzIHRoZSB2YWx1ZXMgd2hpY2ggYXJlIG5vdCBnb2luZyB0byBjaGFuZ2UgZHVyaW5nIHVzZSBvZiBhIGNvbXBvbmVudDpcbiAgICogICAgLSBjb2FjaCBpZFxuICAgKiAgICAtIGxpc3Qgb2Ygc2VydmljZSBpY29uc1xuICAgKiAgICAtIGNsYXNzIChmaXJzdCwgc2Vjb25kLCBhbnkpXG4gICAqICAgIC0gd2hldGhlciB0aGVyZSBpcyBhIGRyaXZlciBhcmVhIGxlZnQgb3IgcmlnaHRcbiAgICogKi9cbiAgcHJpdmF0ZSBfcHJlcGFyZUNvYWNoSXRlbURldGFpbHNEYXRhKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHtcbiAgICAgIGNvbnN0IGxvd2VyRGVjazogQ29hY2hJdGVtW10gPVxuICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdLmNvYWNoSXRlbXM7XG5cbiAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzID0gW107XG5cbiAgICAgIGxvd2VyRGVjay5mb3JFYWNoKChjb2FjaCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgdHJhdmVsQ2xhc3NlczogUGxhY2VUcmF2ZWxDbGFzc1tdID0gW107XG4gICAgICAgIGNvbnN0IHByb3BlcnR5SWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBjb25zdCBwbGFjZXM6IFBsYWNlW10gPSBbXTtcblxuICAgICAgICAvLyBDb2xsZWN0IGFsbCBpbXBvcnRhbnQgbmF2aWdhdGlvbiBkYXRhIHRvIGJlIHJlbmRlcmVkXG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1xuICAgICAgICAgIC5tYXAoKHNyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3IuY29hY2hJdGVtc1tpbmRleF07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZm9yRWFjaCgoY29hY2g6IENvYWNoSXRlbSkgPT4ge1xuICAgICAgICAgICAgdHJhdmVsQ2xhc3Nlcy5wdXNoKC4uLmNvYWNoLnRyYXZlbENsYXNzKTtcbiAgICAgICAgICAgIHByb3BlcnR5SWRzLnB1c2goLi4uKGNvYWNoLnByb3BlcnR5SWRzID8gY29hY2gucHJvcGVydHlJZHMgOiBbXSkpO1xuICAgICAgICAgICAgcGxhY2VzLnB1c2goLi4uKGNvYWNoLnBsYWNlcyA/IGNvYWNoLnBsYWNlcyA6IFtdKSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgaWQ6IGNvYWNoLmlkLFxuICAgICAgICAgIHRyYXZlbENsYXNzOiB0aGlzLl9wcmVwYXJlVHJhdmVsQ2xhc3NOYXZpZ2F0aW9uKHRyYXZlbENsYXNzZXMpLFxuICAgICAgICAgIHByb3BlcnR5SWRzOiB0aGlzLl9wcmVwYXJlU2VydmljZUljb25zTmF2aWdhdGlvbihwcm9wZXJ0eUlkcyksXG4gICAgICAgICAgaXNEcml2ZXJBcmVhOiBjb2FjaC5wbGFjZXMgPyBjb2FjaC5wbGFjZXMubGVuZ3RoID09PSAwIDogdHJ1ZSxcbiAgICAgICAgICBpc0xvY29tb3RpdmU6IHRoaXMuX2lzTG9jb21vdGl2ZShjb2FjaCksXG4gICAgICAgICAgZHJpdmVyQXJlYVNpZGU6IHRoaXMuX3ByZXBhcmVEcml2ZXJBcmVhU2lkZU5hdmlnYXRpb24oY29hY2gpLFxuICAgICAgICAgIGZyZWVQbGFjZXM6IHRoaXMuZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChwbGFjZXMpLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vICNUSU1PLTQ1ODU4XG4gIC8vIEZpbmRzIHRoZSBvcHRpbWFsIGljb24gc2l6ZSBiYXNlZCBvbiBhbGwgc2VydmljZUVsZW1lbnRzIGFuZCB0aGVpciBkaW1lbnNpb24uXG4gIC8vIFRoaXMgc2V0cyB0aGUgZ2xvYmFsQXJlYUljb25EaW0gYW5kIGlzIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhIGVsZW1lbnRzLlxuICAvLyBUaGlzIGdpdmVzIHVzIGEgbWF4aW11bSB1bmlmb3JtIGljb24gc2l6ZSB3aXRoaW4gdGhlIGFyZWEgZWxlbWVudHNcbiAgcHJpdmF0ZSBfcHJlcGFyZU9wdGltaXplQXJlYUljb25EaW1lbnNpb25CeU1lZGlhbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWF0UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCBhbGxTZXJ2aWNlRGltZW5zaW9uczogRWxlbWVudERpbWVuc2lvbltdID0gW107XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnMuZm9yRWFjaCgoZGVjaykgPT5cbiAgICAgICAgZGVjay5jb2FjaEl0ZW1zLmZvckVhY2goKGNvYWNoKSA9PlxuICAgICAgICAgIGNvYWNoLnNlcnZpY2VFbGVtZW50cz8uZm9yRWFjaCgoaWNvbikgPT4gYWxsU2VydmljZURpbWVuc2lvbnMucHVzaChpY29uLmRpbWVuc2lvbikpLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgICAgaWYgKGFsbFNlcnZpY2VEaW1lbnNpb25zLmxlbmd0aCkge1xuICAgICAgICBhbGxTZXJ2aWNlRGltZW5zaW9ucy5zb3J0KFxuICAgICAgICAgIChkaW0xOiBFbGVtZW50RGltZW5zaW9uIHwgdW5kZWZpbmVkLCBkaW0yOiBFbGVtZW50RGltZW5zaW9uIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgICAgICBpZiAoZGltMSAmJiBkaW0yKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1heERpbTEgPSBkaW0xLncgKyBkaW0xLmg7XG4gICAgICAgICAgICAgIGNvbnN0IG1heERpbTIgPSBkaW0yLncgKyBkaW0yLmg7XG4gICAgICAgICAgICAgIGlmIChtYXhEaW0xID4gbWF4RGltMikgcmV0dXJuIDE7XG4gICAgICAgICAgICAgIGVsc2UgaWYgKG1heERpbTEgPCBtYXhEaW0yKSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgIGVsc2UgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGJlc3QgaWNvbiBzaXplIGJ5IG1lZGlhblxuICAgICAgICBjb25zdCBtZWRpYW5JY29uU2l6ZSA9IGFsbFNlcnZpY2VEaW1lbnNpb25zW01hdGguZmxvb3IoYWxsU2VydmljZURpbWVuc2lvbnMubGVuZ3RoIC8gMildITtcblxuICAgICAgICAvLyBTZXQgdGhlIGRldGVybWluZWQgbWVkaWFuIGljb24gc2l6ZSBhcyBnbG9iYWwgY2FsY3VsYXRlZCBhcmVhIGljb24gZGltZW5zaW9uXG4gICAgICAgIHRoaXMuZ2xvYmFsQXJlYUljb25EaW0gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24obWVkaWFuSWNvblNpemUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZmluZCB0aGUgbWF4aW11bSBjb2FjaCBoZWlnaHQgZnJvbSBhbGwgZGVja3NcbiAgICAgICAgY29uc3QgbWF4Q29hY2hIZWlnaHQgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNcbiAgICAgICAgICAuZmxhdE1hcCgoZGVjaykgPT4gZGVjay5jb2FjaEl0ZW1zLm1hcCgoY29hY2gpID0+IGNvYWNoLmRpbWVuc2lvbi5oKSlcbiAgICAgICAgICAucmVkdWNlKChtYXgsIGhlaWdodCkgPT4gTWF0aC5tYXgobWF4LCBoZWlnaHQpLCAwKTtcblxuICAgICAgICAvL2NhbGN1bGF0ZSAyMCUgb2YgbWF4aW11bSBoZWlnaHQgYXMgaWNvbiBkaW1lbnNpb25cbiAgICAgICAgY29uc3QgaWNvbkRpbWVuc2lvbiA9IE1hdGguZmxvb3IobWF4Q29hY2hIZWlnaHQgKiAwLjIpO1xuICAgICAgICB0aGlzLmdsb2JhbEFyZWFJY29uRGltID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKHtcbiAgICAgICAgICB3OiBpY29uRGltZW5zaW9uLFxuICAgICAgICAgIGg6IGljb25EaW1lbnNpb24sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3ByZXBhcmVUcmF2ZWxDbGFzc05hdmlnYXRpb24odHJhdmVsQ2xhc3NlczogUGxhY2VUcmF2ZWxDbGFzc1tdKTogUGxhY2VUcmF2ZWxDbGFzcyB7XG4gICAgaWYgKHRyYXZlbENsYXNzZXMuaW5kZXhPZignRklSU1QnKSAhPT0gLTEpIHJldHVybiAnRklSU1QnO1xuICAgIGlmICh0cmF2ZWxDbGFzc2VzLmluZGV4T2YoJ1NFQ09ORCcpICE9PSAtMSkgcmV0dXJuICdTRUNPTkQnO1xuICAgIHJldHVybiAnQU5ZX0NMQVNTJztcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXBhcmVEcml2ZXJBcmVhU2lkZU5hdmlnYXRpb24oXG4gICAgY29hY2hJdGVtOiBDb2FjaEl0ZW0sXG4gICk6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb2FjaERyaXZlckFyZWFzID0gY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cz8uZmlsdGVyKFxuICAgICAgKGdyYXBoaWNhbEVsZW1lbnRzKSA9PiBncmFwaGljYWxFbGVtZW50cy5pY29uID09PSAnRFJJVkVSX0FSRUEnLFxuICAgICk7XG5cbiAgICBpZiAoY29hY2hEcml2ZXJBcmVhcyAmJiBjb2FjaERyaXZlckFyZWFzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENoZWNraW5nIHRoZSBkcml2ZXIgYXJlYSBwb3NpdGlvbiB3aGV0aGVyIGl0IGlzIHByZXNlbnQgb24gdGhlIGxlZnQgb3IgcmlnaHQgc2lkZSBpbiBhIGNvYWNoXG4gICAgICBjb25zdCBoYXNMZWZ0RHJpdmVyQXJlYSA9XG4gICAgICAgIGNvYWNoRHJpdmVyQXJlYXMuZmluZCgoZHJpdmVyQXJlYUVsZW1lbnQpID0+IGRyaXZlckFyZWFFbGVtZW50LnBvc2l0aW9uLnggPT09IDApIHx8IGZhbHNlO1xuICAgICAgY29uc3QgaGFzUmlnaHREcml2ZXJBcmVhID1cbiAgICAgICAgY29hY2hEcml2ZXJBcmVhcy5maW5kKChkcml2ZXJBcmVhRWxlbWVudCkgPT4gZHJpdmVyQXJlYUVsZW1lbnQucG9zaXRpb24ueCA+IDApIHx8IGZhbHNlO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAhIWhhc0xlZnREcml2ZXJBcmVhLFxuICAgICAgICByaWdodDogISFoYXNSaWdodERyaXZlckFyZWEsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZVNlcnZpY2VJY29uc05hdmlnYXRpb24gPSAocHJvcGVydHlJZHM6IHN0cmluZ1tdKTogc3RyaW5nW10gPT4ge1xuICAgIGlmICghcHJvcGVydHlJZHMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzaHJ1bmtQcm9wZXJ0eUlkcyA9IHByb3BlcnR5SWRzXG4gICAgICA/Lm1hcChmdW5jdGlvbiAocHJvcGVydHlJZDogc3RyaW5nKToge1xuICAgICAgICBwSWQ6IHN0cmluZztcbiAgICAgICAgc3ZnTmFtZTogc3RyaW5nO1xuICAgICAgfSB7XG4gICAgICAgIC8vIHByZXBhcmUgdGVtcG9yYXJ5IG9iamVjdCBtYXBwaW5nIHByb3BlcnR5IGlkIHRvIGl0J3Mgc3ZnTmFtZSBzbyB0aGF0IHdlIGNhbiBjb21wYXJlIGl0IHRvIHRoZSBsaXN0IG9mIGFsbG93ZWQgaWNvbnNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwSWQ6IHByb3BlcnR5SWQsXG4gICAgICAgICAgc3ZnTmFtZTogbWFwSWNvblRvU3ZnW3Byb3BlcnR5SWRdPy5zdmdOYW1lID8gbWFwSWNvblRvU3ZnW3Byb3BlcnR5SWRdPy5zdmdOYW1lIDogJycsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLy9maWx0ZXIgb3V0IG9iamVjdHMgc2VydmljZSBpY29ucyB3aGljaCBhcmUgbm90IGluIEFMTE9XRURfU0VSVklDRV9JQ09OU1xuICAgICAgLmZpbHRlcigocHJvcGVydHlUb1N2ZykgPT4gQUxMT1dFRF9TRVJWSUNFX0lDT05TLmluZGV4T2YocHJvcGVydHlUb1N2Zy5zdmdOYW1lKSAhPT0gLTEpXG4gICAgICAvL21ha2UgaXQgZGlzdGluY3QgYnkgc3ZnTmFtZVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHZhbHVlLCBpbmRleCwgc2VsZikgPT5cbiAgICAgICAgICBzZWxmLm1hcCgocHJvcFN2ZykgPT4gcHJvcFN2Zy5zdmdOYW1lKS5pbmRleE9mKHZhbHVlLnN2Z05hbWUpID09PSBpbmRleCxcbiAgICAgIClcbiAgICAgIC8vIGdvIGJhY2sgdG8gcHJvcGVydHlJZCBzdHJpbmcgZnJvbSB0ZW1wb3Jhcnkgb2JqZWN0XG4gICAgICAubWFwKChwcm9wZXJ0eVRvU3ZnKSA9PiBwcm9wZXJ0eVRvU3ZnLnBJZClcbiAgICAgIC8vIHRha2UgZmlyc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCBmcm9tIEJhY2tlbmQsIG90aGVyd2lzZSB0aGUgbGF5b3V0IGNvdWxkIGJlIGRlc3Ryb3llZFxuICAgICAgLnNsaWNlKDAsIE1BWF9TRVJWSUNFX1BST1BFUlRJRVMpO1xuICAgIHJldHVybiBzaHJ1bmtQcm9wZXJ0eUlkcyA/IHNocnVua1Byb3BlcnR5SWRzIDogW107XG4gIH07XG5cbiAgLy8gSW5pdGlhbGx5IGNhbGN1bGF0ZXMgYWxsIHRoZSBuZWNlc3NhcnkgcG9zaXRpb25zIGFuZCBkaW1lbnNpb25zIG9mIGFsbCBjb2FjaCBlbGVtZW50cywgYXJlYSBlbGVtZW50cywgc2VydmljZSBlbGVtZW50c1xuICBwcml2YXRlIF9wcmVwYXJlU2VhdFJlc2VydmF0aW9uU3RydWN0dXJlSW5mb3JtYXRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhdFJlc2VydmF0aW9ucykge1xuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25TdHJ1Y3R1cmUgPSB7XG4gICAgICAgIGRlY2tzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9ucy5mb3JFYWNoKChzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25EZWNrOiBTZWF0cmVzZXJ2YXRpb25EZWNrID0ge1xuICAgICAgICAgIGRlY2tJbmRleDogaW5kZXgsXG4gICAgICAgICAgZGVja0NvYWNoZXM6IFtdLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbj8uY29hY2hJdGVtcz8uZm9yRWFjaCgoY29hY2hJdGVtOiBDb2FjaEl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZEFyZWFFbGVtZW50cyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHM/LmZpbHRlcihcbiAgICAgICAgICAgIChlKSA9PiBlLmljb24gJiYgIXRoaXMubm90QXJlYUVsZW1lbnRzLmluY2x1ZGVzKGUuaWNvbiksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBhbGxFbGVtZW5ldHMgPVxuICAgICAgICAgICAgZmlsdGVyZWRBcmVhRWxlbWVudHNcbiAgICAgICAgICAgICAgPy5jb25jYXQoY29hY2hJdGVtLnNlcnZpY2VFbGVtZW50cyB8fCBbXSlcbiAgICAgICAgICAgICAgLmNvbmNhdChjb2FjaEl0ZW0ucGxhY2VzIHx8IFtdKSB8fCBbXTtcbiAgICAgICAgICBjb25zdCBoYXNPdmVyaGFuZ2luZ0VsZW1lbnRzID0gdGhpcy5faXNPdmVyaGFuZ2luZ0VsZW1lbnRzUHJlc2VudChcbiAgICAgICAgICAgIGNvYWNoSXRlbS5kaW1lbnNpb24udyxcbiAgICAgICAgICAgIGFsbEVsZW1lbmV0cyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGFyZWFFbGVtZW50cyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHNcbiAgICAgICAgICAgID8uZmlsdGVyKFxuICAgICAgICAgICAgICAoZ3JhcGhpY2FsRWxlbWVudDogQmFzZUVsZW1lbnQpID0+XG4gICAgICAgICAgICAgICAgIXRoaXMubm90QXJlYUVsZW1lbnRzLmluY2x1ZGVzKGdyYXBoaWNhbEVsZW1lbnQuaWNvbiEpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm1hcCgoZWxlKSA9PlxuICAgICAgICAgICAgICB0aGlzLl9nZXRDYWxjdWxhdGVkRGltZW5zaW9uUG9zaXRpb25FbGVtZW50KGVsZSwgY29hY2hJdGVtLmRpbWVuc2lvbiwgdHJ1ZSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG90aGVyRWxlbWVudHMgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzXG4gICAgICAgICAgICA/LmZpbHRlcigoZ3JhcGhpY2FsRWxlbWVudDogQmFzZUVsZW1lbnQpID0+XG4gICAgICAgICAgICAgIHRoaXMubm90QXJlYUVsZW1lbnRzLmluY2x1ZGVzKGdyYXBoaWNhbEVsZW1lbnQuaWNvbiEpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm1hcCgoZWxlKSA9PlxuICAgICAgICAgICAgICB0aGlzLl9nZXRDYWxjdWxhdGVkRGltZW5zaW9uUG9zaXRpb25FbGVtZW50KGVsZSwgY29hY2hJdGVtLmRpbWVuc2lvbiwgZmFsc2UpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzZXJ2aWNlRWxlbWVudHMgPSBjb2FjaEl0ZW0uc2VydmljZUVsZW1lbnRzPy5tYXAoKGVsZSkgPT5cbiAgICAgICAgICAgIHRoaXMuX2dldENhbGN1bGF0ZWREaW1lbnNpb25Qb3NpdGlvbkVsZW1lbnQoZWxlLCBjb2FjaEl0ZW0uZGltZW5zaW9uLCBmYWxzZSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBib3JkZXJNaWRkbGVFbGVtZW50ID0gdGhpcy5fZ2V0Q2FsY3VsYXRlZE1pZGRsZUJvcmRlckVsZW1lbnQoY29hY2hJdGVtKTtcbiAgICAgICAgICBjb25zdCBjYWxjQ29hY2hEaW1lbnNpb24gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oeyAuLi5jb2FjaEl0ZW0uZGltZW5zaW9uIH0pO1xuICAgICAgICAgIC8vIENvbGxlY3QgYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3Igc2luZ2xlIGNvYWNoXG4gICAgICAgICAgY29uc3QgY29hY2hTdHVyY3R1cmU6IENvYWNoU3RydWN0dXJlID0ge1xuICAgICAgICAgICAgd2lkdGg6IGNhbGNDb2FjaERpbWVuc2lvbi53LFxuICAgICAgICAgICAgaGVpZ2h0OiBjYWxjQ29hY2hEaW1lbnNpb24uaCxcbiAgICAgICAgICAgIG90aGVyRWxlbWVudHM6IG90aGVyRWxlbWVudHMgfHwgW10sXG4gICAgICAgICAgICBzZXJ2aWNlRWxlbWVudHM6IHNlcnZpY2VFbGVtZW50cyB8fCBbXSxcbiAgICAgICAgICAgIGFyZWFFbGVtZW50czogYXJlYUVsZW1lbnRzIHx8IFtdLFxuICAgICAgICAgICAgYm9yZGVyTWlkZGxlRWxlbWVudDogYm9yZGVyTWlkZGxlRWxlbWVudCxcbiAgICAgICAgICAgIGhhc092ZXJoYW5naW5nRWxlbWVudHM6IGhhc092ZXJoYW5naW5nRWxlbWVudHMsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHNlYXRSZXNlcnZhdGlvbkRlY2suZGVja0NvYWNoZXMucHVzaChjb2FjaFN0dXJjdHVyZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlLmRlY2tzLnB1c2goc2VhdFJlc2VydmF0aW9uRGVjayk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2FsY3VsYXRlZCBwb3NpdGlvbiBhbmQgZGltZW5zaW9uIG9mIHRoZSBtaWRkbGUgYm9yZGVyLlxuICAgKiBUbyBjYWxjdWxhdGUgdGhlIHN0YXJ0ICsgZW5kIGNvb3JkaW5hdGUgYW5kIHRoZSBkaW1lbnNpb24gb2YgdGhlIG1pZGRsZSBib3JkZXIgY29hY2ggZ3JhcGhpYyxcbiAgICogdGhlIGV4aXN0aW5nIGRvY2tpbmcgY29hY2ggZ3JhcGhpY3MgYXJlIGFuYWx5c2VkIGFuZCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgcG9zaXRpb24gYW5kIGRpZW1lbnNpb24gaW5mb3JtYXRpb24uXG4gICAqIEByZXR1cm5zIEJhc2VFbGVtZW50XG4gICAqL1xuICBwcml2YXRlIF9nZXRDYWxjdWxhdGVkTWlkZGxlQm9yZGVyRWxlbWVudChjb2FjaDogQ29hY2hJdGVtKTogQmFzZUVsZW1lbnQge1xuICAgIGNvbnN0IGJvcmRlckhlaWdodCA9IChjb2FjaC5kaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgKiAyKSAqIHRoaXMuYmFzZUdyaWRTaXplO1xuICAgIC8vIERlZmF1bHQgLSB3aXRob3V0IGZpbmRpbmcgZG9ja2luZyBib3JkZXIgZWxlbWVudHMsIHRoZSBtaWRkbGUgYm9yZGVyIGdvZXMgZnJvbSAwIHBvc2l0aW9uIHVudGlsIGNvYWNoIHdpZHRoIGVuZFxuICAgIGxldCBzdGFydEJvcmRlck9mZnNldFggPSAwO1xuICAgIGxldCBib3JkZXJXaWR0aCA9IGNvYWNoLmRpbWVuc2lvbi53O1xuXG4gICAgaWYgKGNvYWNoLmdyYXBoaWNFbGVtZW50cykge1xuICAgICAgLy8gRG9ja2luZ0VsZW1lbnRlIGRlZmluZXMgdGhlIGVsZW1lbnRzIHdoZXJlIHRoZSBib3JkZXIgb2YgdGhlIGNvYWNoIHJlYWxseSBzdGFydHMgYW5kIGVuZHNcbiAgICAgIGNvbnN0IGRvY2tpbmdFbGVtZW50cyA9IHRoaXMuX2dldEZpcnN0TGFzdERvY2tpbmdFbGVtZW50cyhjb2FjaC5ncmFwaGljRWxlbWVudHMpO1xuXG4gICAgICAvLyBUd28gZG9ja2luZyBjb2FjaCBlbGVtZW50cyBleGlzdCAobm9ybWFsIGNhc2UgLSBzdGFydCBhbmQgZW5kIGRvY2tpbmcgZWxlbWVudClcbiAgICAgIGlmIChkb2NraW5nRWxlbWVudHM/Lmxlbmd0aCA9PSAyKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0RG9ja2luZ0VsZW1lbnQgPSBkb2NraW5nRWxlbWVudHNbMF07XG4gICAgICAgIGNvbnN0IGxhc3REb2NraW5nRWxlbWVudCA9IGRvY2tpbmdFbGVtZW50c1sxXTtcbiAgICAgICAgY29uc3QgZW5kQm9yZGVyT2Zmc2V0WCA9XG4gICAgICAgICAgZmlyc3REb2NraW5nRWxlbWVudC5wb3NpdGlvbi54ID09IDBcbiAgICAgICAgICAgID8gbGFzdERvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53XG4gICAgICAgICAgICA6IGZpcnN0RG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLnc7XG5cbiAgICAgICAgc3RhcnRCb3JkZXJPZmZzZXRYID1cbiAgICAgICAgICBmaXJzdERvY2tpbmdFbGVtZW50LnBvc2l0aW9uLnggPT0gMFxuICAgICAgICAgICAgPyBmaXJzdERvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53XG4gICAgICAgICAgICA6IGxhc3REb2NraW5nRWxlbWVudC5kaW1lbnNpb24udztcblxuICAgICAgICBib3JkZXJXaWR0aCA9IGNvYWNoLmRpbWVuc2lvbi53IC0gZW5kQm9yZGVyT2Zmc2V0WCAtIHN0YXJ0Qm9yZGVyT2Zmc2V0WDtcbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgb25lIGRvY2tpbmcgYm9yZGVyIGNvYWNoIGVsZW1lbnRzIGV4aXN0IChzdGFydCBvciBlbmQgZG9ja2luZyBlbGVtZW50KVxuICAgICAgZWxzZSBpZiAoZG9ja2luZ0VsZW1lbnRzPy5sZW5ndGggPT0gMSkge1xuICAgICAgICBjb25zdCBkb2NraW5nRWxlbWVudCA9IGRvY2tpbmdFbGVtZW50c1swXTtcblxuICAgICAgICAvLyBNaWRkbGVCb3JkZXIgc3RhcnRzIGZyb20gbGVmdCBkb2NraW5nIGVsZW1lbnQgdW50aWwgY29hY2ggZW5kXG4gICAgICAgIGlmIChkb2NraW5nRWxlbWVudC5wb3NpdGlvbi54ID09PSAwKSB7XG4gICAgICAgICAgc3RhcnRCb3JkZXJPZmZzZXRYID0gZG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLnc7XG4gICAgICAgICAgYm9yZGVyV2lkdGggPSBjb2FjaC5kaW1lbnNpb24udyAtIGRvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53O1xuICAgICAgICB9XG4gICAgICAgIC8vIE1pZGRsZUJvcmRlciBzdGFydHMgZnJvbSBwb3NpdGlvbiB4IDAgdW50aWwgZG9ja2luZyBlbGVtZW50IG9uIHRoZSByaWdodCBjb2FjaCBzaWRlXG4gICAgICAgIGVsc2UgaWYgKGRvY2tpbmdFbGVtZW50LnBvc2l0aW9uLnggIT09IDApIHtcbiAgICAgICAgICBib3JkZXJXaWR0aCA9IGNvYWNoLmRpbWVuc2lvbi53IC0gZG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLnc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5T2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgKiAtMTtcblxuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogeyB4OiBzdGFydEJvcmRlck9mZnNldFggKiB0aGlzLmJhc2VHcmlkU2l6ZSwgeTogeU9mZnNldCwgejogMCB9LFxuICAgICAgZGltZW5zaW9uOiB7IHc6IGJvcmRlcldpZHRoICogdGhpcy5iYXNlR3JpZFNpemUsIGg6IGJvcmRlckhlaWdodCB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBncmFwaGljYWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RhcnQgYW5kIGVuZCBib3JkZXIgZWxlbWVudHMgb2YgdGhlIGNvYWNoLlxuICAgKiBAcmV0dXJucyBCYXNlRWxlbWVudFtdXG4gICAqL1xuICBwcml2YXRlIF9nZXRGaXJzdExhc3REb2NraW5nRWxlbWVudHMoZ3JhcGhpY0VsZW1lbnRzOiBCYXNlRWxlbWVudFtdKTogQmFzZUVsZW1lbnRbXSB7XG4gICAgLy8gR2V0IGFsbCByZWxldmFudCBkb2NraW5nIGVsZW1lbnRzIGFuZCBzb3J0cyB0aGVtIGFnYWluIGFjY29yZGluZyB0byB0aGVpciB4IHBvc2l0aW9uIGNvb3JkaW5hdGVzLFxuICAgIC8vIHRodXMgdGhlIHN0YXJ0IGFuZCBlbmQgZG9ja2luZyBlbGVtZW50cyB3b3VsZCBiZSBkZWZpbmVkXG4gICAgY29uc3QgZmlsdGVyZWREb2NraW5nRWxlbWVudHMgPSAoXG4gICAgICBncmFwaGljRWxlbWVudHMuZmlsdGVyKChlbGUpID0+IHRoaXMubWlkZGxlQm9yZGVyRG9ja2luZ0VsZW1lbnRzLmluY2x1ZGVzKGVsZS5pY29uISkpIHx8IFtdXG4gICAgKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBwb3NBID0gYS5wb3NpdGlvbi54O1xuICAgICAgY29uc3QgcG9zQiA9IGIucG9zaXRpb24ueDtcbiAgICAgIGlmIChwb3NBID4gcG9zQikge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICAgIGlmIChwb3NBIDwgcG9zQikge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIHJldHVybiBmaWx0ZXJlZERvY2tpbmdFbGVtZW50cy5maWx0ZXIoXG4gICAgICAoXywgaW5kZXgpID0+IGluZGV4ID09IDAgfHwgaW5kZXggPT0gZmlsdGVyZWREb2NraW5nRWxlbWVudHMubGVuZ3RoIC0gMSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNhbGN1bGF0ZWQgcG9zaXRpb25zIGFuZCBkaW1lbnNpb25zIG9mIGdyYXBoaWNhbCwgc2VydmljZSBhbmQgYXJlYSBlbGVtZW50c1xuICAgKiBAcmV0dXJucyBCYXNlRWxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q2FsY3VsYXRlZERpbWVuc2lvblBvc2l0aW9uRWxlbWVudChcbiAgICBlbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICBjb2FjaERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgICBpc0NhbGNBcmVhRWxlbWVudDogYm9vbGVhbixcbiAgKTogQmFzZUVsZW1lbnQge1xuICAgIGNvbnN0IGRpbSA9IHsgLi4uZWxlbWVudC5kaW1lbnNpb24gfTtcbiAgICBjb25zdCBwb3MgPSB7IC4uLmVsZW1lbnQucG9zaXRpb24gfTtcbiAgICBjb25zdCByb3RhdGlvbiA9IGVsZW1lbnQucm90YXRpb24gfHwgMDtcbiAgICBjb25zdCBpc05vdEZpeGVkUm90YXRpb25HcmFwaGljYWxFbGVtZW50ID1cbiAgICAgIHRoaXMubm90QXJlYUVsZW1lbnRzLmNvbmNhdCh0aGlzLm5vdEZpeGVkUm90YXRhYmxlQXJlYUljb25zKS5pbmRleE9mKGVsZW1lbnQuaWNvbiEpID09PSAtMTtcbiAgICBjb25zdCBjYWxjUm90YXRpb24gPVxuICAgICAgdGhpcy5hbGlnblZlcnRpY2FsICYmIGlzTm90Rml4ZWRSb3RhdGlvbkdyYXBoaWNhbEVsZW1lbnQgPyByb3RhdGlvbiAtIDkwIDogcm90YXRpb247XG4gICAgbGV0IGFyZWFNb3VudGluZzogRWxlbWVudE1vdW50aW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gYW5kIGRpbWVuc2lvbiBmb3IgQXJlYUVsZW1lbnRzXG4gICAgaWYgKGlzQ2FsY0FyZWFFbGVtZW50KSB7XG4gICAgICBjb25zdCBpc05vdFRhYmxlR3JhcGhpYyA9IGVsZW1lbnQuaWNvbj8uaW5kZXhPZignVEFCTEUnKSA9PT0gLTE7XG4gICAgICBjb25zdCBhcmVhUHJvcGVydHkgPSBlbGVtZW50Lmljb24gJiYgaXNOb3RUYWJsZUdyYXBoaWMgPyBlbGVtZW50Lmljb24gOiBudWxsO1xuICAgICAgY29uc3Qgc3RyZXRjaEhlaWdodCA9XG4gICAgICAgIHRoaXMuaXNFbGVtZW50RGlyZWN0bHlPbkJvcmRlcihlbGVtZW50LCBjb2FjaERpbWVuc2lvbikgJiYgYXJlYVByb3BlcnR5ICE9PSAnRU5UUllfRVhJVCc7XG5cbiAgICAgIGlmIChlbGVtZW50LnBvc2l0aW9uLnkgPT09IDApIHtcbiAgICAgICAgYXJlYU1vdW50aW5nID0gJ3VwcGVyLWJvcmRlcic7XG4gICAgICAgIHBvcy55IC09IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgLSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC8gMztcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5wb3NpdGlvbi55ICsgZWxlbWVudC5kaW1lbnNpb24uaCA9PT0gY29hY2hEaW1lbnNpb24uaCkge1xuICAgICAgICBhcmVhTW91bnRpbmcgPSAnbG93ZXItYm9yZGVyJztcbiAgICAgICAgaWYgKCFzdHJldGNoSGVpZ2h0KSB7XG4gICAgICAgICAgcG9zLnkgKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAtIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgLyAzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJldGNoSGVpZ2h0KSB7XG4gICAgICAgIGRpbS5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgLSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC8gMztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2FsY3VsYXRlIHBvc2l0aW9uIGFuZCBkaW1lbnNpb24gZm9yIGFsbCBvdGhlciBncmFwaGljYWwgZWxlbWVudHNcbiAgICBlbHNlIHtcbiAgICAgIGlmIChlbGVtZW50LnBvc2l0aW9uLnkgPT09IDApIHtcbiAgICAgICAgcG9zLnkgLT0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvYWNoRGltZW5zaW9uLmggPT09IGVsZW1lbnQucG9zaXRpb24ueSArIGVsZW1lbnQuZGltZW5zaW9uLmgpIHtcbiAgICAgICAgZGltLmggKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAqIDI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGltLncgPSBNYXRoLnJvdW5kKGRpbS53ICogdGhpcy5iYXNlR3JpZFNpemUpO1xuICAgIGRpbS5oID0gTWF0aC5yb3VuZChkaW0uaCAqIHRoaXMuYmFzZUdyaWRTaXplKTtcblxuICAgIHBvcy54ID0gTWF0aC5yb3VuZChwb3MueCAqIHRoaXMuYmFzZUdyaWRTaXplKTtcbiAgICBwb3MueSA9IE1hdGgucm91bmQocG9zLnkgKiB0aGlzLmJhc2VHcmlkU2l6ZSk7XG5cbiAgICBjb25zdCBpY29uID1cbiAgICAgIGVsZW1lbnQuaWNvbiAmJiBlbGVtZW50Lmljb24uZW5kc1dpdGgoJ0RSSVZFUl9BUkVBJylcbiAgICAgICAgPyBlbGVtZW50Lmljb24/LmNvbmNhdCgnXycsIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0udmVoaWNsZVR5cGUpXG4gICAgICAgIDogZWxlbWVudC5pY29uO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGljb246IGljb24sXG4gICAgICByb3RhdGlvbjogY2FsY1JvdGF0aW9uLFxuICAgICAgZGltZW5zaW9uOiBkaW0sXG4gICAgICBwb3NpdGlvbjogcG9zLFxuICAgICAgbW91bnRpbmc6IGFyZWFNb3VudGluZyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcGxhY2UgSFRNTCBlbGVtZW50IGJ5IGN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkLlxuICAgKiBAcmV0dXJucyBIVE1MRWxlbWVudCBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRQbGFjZUh0bWxFbGVtZW50KCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWRcbiAgICAgID8gdGhpcy5zaGFkb3dSb290Py5nZXRFbGVtZW50QnlJZCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKSB8fCBudWxsXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXh0cmFjdGVkIGNvYWNoIGRlY2sgaW5kZXggZnJvbSBwbGFjZSBpZFxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldERlY2tJbmRleEJ5UGxhY2VJZChwbGFjZUlkOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBkZWNrSW5kZXggPSB0aGlzLnNoYWRvd1Jvb3RcbiAgICAgID8ucXVlcnlTZWxlY3RvcignIycgKyBwbGFjZUlkKVxuICAgICAgPy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGVjay1pbmRleCcpO1xuICAgIGlmIChkZWNrSW5kZXggJiYgIWlzTmFOKCtkZWNrSW5kZXgpKSB7XG4gICAgICByZXR1cm4gK2RlY2tJbmRleDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9pc1ZhbGlkQ29hY2hJbmRleChjb2FjaEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY29hY2hJbmRleCA+PSAwICYmXG4gICAgICBjb2FjaEluZGV4IDw9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMV0uY29hY2hJdGVtcy5sZW5ndGhcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZXhpc3RpbmcgY29hY2ggZGVjayBpbmRleCBkZXBlbmRpbmcgb24gdGhlIHNlbGVjdGVkIGNvYWNoLlxuICAgKiBUaGlzIG1ldGhvZCBpcyBuZWNlc3NhcnkgdG8gZ2V0IGFuIGF2YWlsYWJsZSBjb2FjaCBkZWNrIGluZGV4IGR1cmluZyBrZXlib2FyZCBuYXZpZ2F0aW9uLCB3aGljaCBjYW4gdmFyeSBiZXR3ZWVuIGNvYWNoZXMgd2l0aCBkaWZmZXJlbnQgZGVja3MuXG4gICAqIEZvciBleGFtcGxlLCB3aGVuIG5hdmlnYXRpbmcgZnJvbSBhIGNvYWNoIHdpdGggdHdvIGRlY2tzIHRvIGEgY29hY2ggd2l0aCBvbmUgZGVjay5cbiAgICpcbiAgICogICAgICAgW29vb10tW29vb10tW29vb11cbiAgICogW29vb10tW29vb10tW29vb10tW29vb10tW29vb11cbiAgICpcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXRFeGlzdGluZ0NvYWNoRGVja0luZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF1cbiAgICAgICAgLnBsYWNlcyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXg7XG4gICAgfVxuXG4gICAgLy8gRmluZCBuZXh0IHBvc3NpYmxlIGNvYWNoIGRlY2sgaW5kZXggd2hlcmUgcGxhY2VzIGV4aXN0XG4gICAgY29uc3QgbmV4dEF2YWlsYWJsZURlY2tDb2FjaEluZGV4ID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmZpbmRJbmRleChcbiAgICAgIChzZWF0UmVzZXJ2YXRpb24pID0+XG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0ucGxhY2VzICE9PSB1bmRlZmluZWQsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPj0gbmV4dEF2YWlsYWJsZURlY2tDb2FjaEluZGV4XG4gICAgICA/IHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XG4gICAgICA6IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhIHNlbGVjdGVkIHBsYWNlIGlzIHNsaWdodGx5IGhpZGRlbiBieSB0aGUgb3ZlcmZsb3cgc2Nyb2xsIGNvbnRlbnQgYW5kIGlzIHN0aWxsIGNsaWNrZWQsXG4gICAqIHRoZSBtZXRob2QgdHJpZXMgdG8gc2Nyb2xsIHRoZSBzZWxlY3RlZCBwbGFjZSBpbnRvIHRoZSBuZWFyZXN0IHZpZXdwb3J0LCBzbyB0aGF0IGl0IGlzIGNvbXBsZXRlbHkgdmlzaWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHBsYWNlSWRcbiAgICovXG4gIHByaXZhdGUgX3Njcm9sbFBsYWNlSW50b05lYXJlc3RWaWV3cG9ydChwbGFjZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNoYWRvd1Jvb3RcbiAgICAgID8uZ2V0RWxlbWVudEJ5SWQocGxhY2VJZClcbiAgICAgID8uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcsIGlubGluZTogJ25lYXJlc3QnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGNoZWNrcyBpZiBhbnkgcGxhY2VzIG9yIGdyYXBoaWNhbCBlbGVtZW50cyAoZS5nLiB0b2lsZXQgYXJlYSwgZXRjLikgYXJlIG92ZXJoYW5naW5nIHRoZSBjb2FjaCBib3JkZXJzXG4gICAqIEBwYXJhbSBjb2FjaEl0ZW1XaWR0aFxuICAgKiBAcGFyYW0gZWxlbWVudHNcbiAgICovXG4gIHByaXZhdGUgX2lzT3ZlcmhhbmdpbmdFbGVtZW50c1ByZXNlbnQoXG4gICAgY29hY2hJdGVtV2lkdGg6IG51bWJlcixcbiAgICBlbGVtZW50czogKFBsYWNlIHwgQmFzZUVsZW1lbnQpW10gfCB1bmRlZmluZWQsXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBlbGVtZW50cz8uc29tZShcbiAgICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICAgZWxlbWVudC5wb3NpdGlvbi54ID09PSAwIHx8IGVsZW1lbnQucG9zaXRpb24ueCArIGVsZW1lbnQuZGltZW5zaW9uLncgPj0gY29hY2hJdGVtV2lkdGgsXG4gICAgICApID8/IGZhbHNlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBkcml2ZXJBcmVhcyBmb3Igb25lIGNvYWNoXG4gICAqIEBwYXJhbSBjb2FjaEl0ZW1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2lzTG9jb21vdGl2ZShjb2FjaEl0ZW06IENvYWNoSXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBjb2FjaEl0ZW0/LmdyYXBoaWNFbGVtZW50cz8uZmluZChcbiAgICAgICAgKGVsZW1lbnQ6IEJhc2VFbGVtZW50KSA9PiBlbGVtZW50Lmljb24gPT09ICdEUklWRVJfQVJFQV9OT19WRVJUSUNBTF9XQUxMJyxcbiAgICAgICkgIT09IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSXMgY2FsbGVkIHdoZW4gdGhlIFNlYXRSZXNlcnZhdGlvbiBsb3NlcyBmb2N1cywgd2hhdCBoYXBwZW5zIHdoZW4gdGhlIHVzZXIgdGFicyBvdXQgb3IgY2xpY2tzIHNvbWV3aGVyZSBlbHNlLlxuICAgKiBUaGVuIHdlIHJlc2V0IHRoZSBmb2N1c2VkIGVsZW1lbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfb25MZWF2ZVNlYXRSZXNlcnZhdGlvbkNvbXBvbmVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgfVxuICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBK0JBLElBQUs7Q0FBTCxTQUFLLGlCQUFlO0NBQ2xCLGdCQUFBLFdBQUE7Q0FDQSxnQkFBQSxVQUFBO0dBRkcsb0JBQUEsa0JBQWUsRUFBQSxFQUFBO0FBOEJwQixJQUFNLHlCQUF5QjtBQUMvQixJQUFNLHdCQUFrQztDQUN0QztDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNEO0lBRVksb0NBQTBCO21CQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Y0FBbkMsbUNBQW1DLFlBQVU7OzttQ0FPdkQsU0FBUztJQUFFLFdBQVc7SUFBcUIsTUFBTTtJQUFPLENBQUMsQ0FBQTtrQ0FJekQsU0FBUztJQUFFLFdBQVc7SUFBb0IsTUFBTTtJQUFRLENBQUMsQ0FBQTtnQ0FJekQsV0FBVyxFQUNYLFNBQVM7SUFBRSxXQUFXO0lBQWtCLE1BQU07SUFBUyxDQUFDLENBQUE7Z0NBSXhELFdBQVcsRUFDWCxTQUFTO0lBQUUsV0FBVztJQUFrQixNQUFNO0lBQVMsU0FBUztJQUFNLFlBQVk7SUFBTSxDQUFDLENBQUE7K0JBSXpGLFdBQVcsRUFDWCxTQUFTO0lBQUUsV0FBVztJQUFrQixNQUFNO0lBQVEsQ0FBQyxDQUFBO3lCQUl2RCxXQUFXLEVBQ1gsU0FBUztJQUFFLFdBQVc7SUFBVSxNQUFNO0lBQVEsQ0FBQyxDQUFBO3NDQUkvQyxXQUFXLEVBQ1gsU0FBUztJQUFFLFdBQVc7SUFBeUIsTUFBTTtJ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
|