valtech-components 4.0.632 → 4.0.633
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/esm2022/lib/components/organisms/mini-games/chessimals-adventure-data.mjs +3 -3
- package/esm2022/lib/components/organisms/mini-games/chessimals-engine.mjs +10 -10
- package/esm2022/lib/components/organisms/mini-games/chessimals-game.component.mjs +11 -11
- package/esm2022/lib/components/organisms/mini-games/mini-games.i18n.mjs +5 -5
- package/esm2022/lib/components/organisms/mini-games/types.mjs +1 -1
- package/esm2022/lib/services/auth/auth.service.mjs +9 -2
- package/esm2022/lib/version.mjs +2 -2
- package/fesm2022/valtech-components.mjs +34 -27
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/atoms/rights-footer/rights-footer.component.d.ts +1 -1
- package/lib/components/molecules/cta-card/cta-card.component.d.ts +1 -1
- package/lib/components/molecules/metric-card/metric-card.component.d.ts +1 -1
- package/lib/components/molecules/phone-display/phone-display.component.d.ts +1 -1
- package/lib/components/organisms/account-view/account-view.component.d.ts +1 -1
- package/lib/components/organisms/article/article.component.d.ts +1 -1
- package/lib/components/organisms/auth-cta/auth-cta.component.d.ts +1 -1
- package/lib/components/organisms/member-import-modal/member-import-modal.component.d.ts +1 -1
- package/lib/components/organisms/mini-games/chessimals-game.component.d.ts +1 -1
- package/lib/components/organisms/mini-games/memory-game.component.d.ts +1 -1
- package/lib/components/organisms/mini-games/types.d.ts +2 -2
- package/lib/components/organisms/notification-preferences-view/notification-preferences-view.component.d.ts +1 -1
- package/lib/components/organisms/organization-view/organization-view.component.d.ts +1 -1
- package/lib/services/auth/auth.service.d.ts +5 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- /package/src/lib/assets/games/chessimals/challenge-avatars/{nightmare-magnus.png → nightmare-mandrill.png} +0 -0
|
@@ -358,7 +358,14 @@ export class AuthService {
|
|
|
358
358
|
const bridgeUrl = new URL(this.config.ssoBridgeUrl);
|
|
359
359
|
bridgeUrl.searchParams.set('redirect_uri', redirectUri);
|
|
360
360
|
console.log('[ValtechAuth] bootstrap — no local session, redirecting to SSO bridge');
|
|
361
|
-
|
|
361
|
+
this.navigateToSSOBridgeUrl(bridgeUrl.toString());
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Navegación real (aislada en su propio método para poder espiarla en
|
|
365
|
+
* tests unitarios sin que Karma navegue de verdad el runner).
|
|
366
|
+
*/
|
|
367
|
+
navigateToSSOBridgeUrl(url) {
|
|
368
|
+
window.location.href = url;
|
|
362
369
|
}
|
|
363
370
|
ngOnDestroy() {
|
|
364
371
|
this.stopRefreshTimer();
|
|
@@ -1742,4 +1749,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
1742
1749
|
}] }, { type: i10.ConfirmationDialogService }, { type: i11.Firestore, decorators: [{
|
|
1743
1750
|
type: Optional
|
|
1744
1751
|
}] }] });
|
|
1745
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9hdXRoL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQWEsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR25GLE9BQU8sRUFBYyxVQUFVLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3RGLE9BQU8sRUFDTCxHQUFHLEVBQ0gsVUFBVSxFQUNWLFNBQVMsRUFDVCxHQUFHLEVBQ0gsTUFBTSxFQUNOLElBQUksRUFDSixPQUFPLEVBQ1AsV0FBVyxFQUNYLFFBQVEsR0FDVCxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQXVGL0MsT0FBTyxFQUFhLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDOzs7Ozs7Ozs7Ozs7O0FBdkYzQzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7QUFpRmpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxNQUFNLE9BQU8sV0FBVztJQWN0QixZQUNtRCxNQUFnQyxFQUN6RSxJQUFnQixFQUNoQixNQUFjLEVBQ2QsWUFBOEIsRUFDOUIsWUFBMEIsRUFDMUIsY0FBa0MsRUFDbEMsV0FBNEIsRUFDNUIsZUFBZ0MsRUFDaEMsWUFBMEIsRUFDZCxnQkFBeUMsRUFDekMsV0FBK0IsRUFDM0MsbUJBQThDLEVBQ2xDLGlCQUFtQztRQVpOLFdBQU0sR0FBTixNQUFNLENBQTBCO1FBQ3pFLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsV0FBTSxHQUFOLE1BQU0s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OzRGQUNuQixXQUFXO2tCQUR2QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBZ0I3QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBU3RDLFFBQVE7OzBCQUNSLFFBQVE7OzBCQUVSLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIGlzRGV2TW9kZSwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciwgb2YsIGZyb20sIGZpcnN0VmFsdWVGcm9tLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIHRhcCxcbiAgY2F0Y2hFcnJvcixcbiAgc3dpdGNoTWFwLFxuICBtYXAsXG4gIGZpbHRlcixcbiAgdGFrZSxcbiAgdGltZW91dCxcbiAgc2hhcmVSZXBsYXksXG4gIGZpbmFsaXplLFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFZBTFRFQ0hfQVVUSF9DT05GSUcgfSBmcm9tICcuL2NvbmZpZyc7XG5cbi8qKlxuICogVGltZW91dCBkdXJvIHBhcmEgZWwgYC9yZWZyZXNoYCAobXMpLiBVbmEgTGFtYmRhIGZyw61hICsgcmVkIG3Ds3ZpbCBmbGFreSBwdWVkZW5cbiAqIGRlamFyIGVsIFBPU1QgY29sZ2FkbyBpbmRlZmluaWRhbWVudGU7IHNpbiBlc3RlIGzDrW1pdGUgZWwgYGF3YWl0YCBkZVxuICogYGluaXRpYWxpemUoKWAgKEFQUF9JTklUSUFMSVpFUikgY29uZ2VsYSBlbCBib290c3RyYXAgZW4gZWwgc2tlbGV0b24sIHkgZWwgZmxhZ1xuICogYGlzUmVmcmVzaGluZ2AgZGVsIGludGVyY2VwdG9yIHNlIHF1ZWRhIHBlZ2FkbyBibG9xdWVhbmRvIHRvZGEgcmVxdWVzdCBwb3N0ZXJpb3IuXG4gKiBDb24gdGltZW91dCwgZWwgcmVmcmVzaCBTSUVNUFJFIHJlc3VlbHZlIChvayBvIGVycm9yKSDihpIgbGEgVUkgbnVuY2EgY3VlbGdhOiBlbFxuICogYm9vdHN0cmFwIGNvbnRpbsO6YSBjb21vIGludml0YWRvIHkgZWwgaW50ZXJjZXB0b3IgbGliZXJhIGxhIGNvbGEuXG4gKi9cbmNvbnN0IFJFRlJFU0hfVElNRU9VVF9NUyA9IDEwMDAwO1xuaW1wb3J0IHsgQXV0aFN0YXRlU2VydmljZSB9IGZyb20gJy4vYXV0aC1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRva2VuU2VydmljZSB9IGZyb20gJy4vdG9rZW4uc2VydmljZSc7XG5pbXBvcnQgeyBBdXRoU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBBdXRoU3luY1NlcnZpY2UgfSBmcm9tICcuL3N5bmMuc2VydmljZSc7XG5pbXBvcnQge1xuICBTaWduaW5SZXF1ZXN0LFxuICBTaWduaW5SZXNwb25zZSxcbiAgU2lnbnVwUmVxdWVzdCxcbiAgU2lnbnVwUmVzcG9uc2UsXG4gIFZlcmlmeUVtYWlsUmVxdWVzdCxcbiAgVmVyaWZ5RW1haWxSZXNwb25zZSxcbiAgUmVzZW5kQ29kZVJlcXVlc3QsXG4gIFJlc2VuZENvZGVSZXNwb25zZSxcbiAgTUZBVmVyaWZ5UmVzcG9uc2UsXG4gIFJlZnJlc2hSZXF1ZXN0LFxuICBSZWZyZXNoUmVzcG9uc2UsXG4gIEdldFBlcm1pc3Npb25zUmVzcG9uc2UsXG4gIEdldFByb2ZpbGVSZXNwb25zZSxcbiAgVXBkYXRlUHJvZmlsZVJlcXVlc3QsXG4gIFVwZGF0ZVByb2ZpbGVSZXNwb25zZSxcbiAgTUZBU2V0dXBSZXNwb25zZSxcbiAgTUZBQ29uZmlybVJlc3BvbnNlLFxuICBNRkFEaXNhYmxlUmVxdWVzdCxcbiAgTUZBRGlzYWJsZVJlc3BvbnNlLFxuICBGb3Jnb3RQYXNzd29yZFJlcXVlc3QsXG4gIEZvcmdvdFBhc3N3b3JkUmVzcG9uc2UsXG4gIFJlc2V0UGFzc3dvcmRSZXF1ZXN0LFxuICBSZXNldFBhc3N3b3JkUmVzcG9uc2UsXG4gIE1GQVJlc2V0UmVxdWVzdFJlcXVlc3QsXG4gIE1GQVJlc2V0UmVxdWVzdFJlc3BvbnNlLFxuICBNRkFSZXNldENvbmZpcm1SZXF1ZXN0LFxuICBNRkFSZXNldENvbmZpcm1SZXNwb25zZSxcbiAgQWN0aXZhdGVBY2NvdW50UmVxdWVzdCxcbiAgQWN0aXZhdGVBY2NvdW50UmVzcG9uc2UsXG4gIENoYW5nZVBhc3N3b3JkUmVxdWVzdCxcbiAgQ2hhbmdlUGFzc3dvcmRSZXNwb25zZSxcbiAgRGVsZXRlQWNjb3VudFJlcXVlc3QsXG4gIERlbGV0ZUFjY291bnRSZXNwb25zZSxcbiAgU2VuZERlbGV0ZUFjY291bnRDb2RlUmVzcG9uc2UsXG4gIFN3aXRjaE9yZ1Jlc3BvbnNlLFxuICBNRkFNZXRob2QsXG4gIEF1dGhFcnJvcixcbiAgQXV0aFN5bmNFdmVudCxcbiAgVmFsdGVjaEF1dGhDb25maWcsXG4gIFJlZ2lzdGVyRGV2aWNlUmVzcG9uc2UsXG4gIEVuYWJsZU5vdGlmaWNhdGlvbnNSZXN1bHQsXG4gIE5vdGlmaWNhdGlvblBlcm1pc3Npb25TdGF0ZSxcbiAgUmVnaXN0ZXJEZXZpY2VSZXN1bHQsXG4gIC8vIFRPVFAgTUZBIHR5cGVzXG4gIFRPVFBTZXR1cFJlc3BvbnNlLFxuICBUT1RQVmVyaWZ5U2V0dXBSZXNwb25zZSxcbiAgVE9UUERpc2FibGVSZXNwb25zZSxcbiAgUmVnZW5lcmF0ZUJhY2t1cENvZGVzUmVzcG9uc2UsXG4gIEJhY2t1cENvZGVzQ291bnRSZXNwb25zZSxcbiAgLy8gT0F1dGggdHlwZXNcbiAgT0F1dGhQcm92aWRlcixcbiAgT0F1dGhSZXN1bHQsXG4gIExpbmtlZFByb3ZpZGVyLFxuICBIYXNQYXNzd29yZFJlc3BvbnNlLFxuICAvLyBIYW5kbGUgdHlwZXNcbiAgVXBkYXRlSGFuZGxlUmVzcG9uc2UsXG4gIENoZWNrSGFuZGxlUmVzcG9uc2UsXG4gIC8vIEF2YXRhciB0eXBlc1xuICBVcGRhdGVBdmF0YXJSZXF1ZXN0LFxuICBVcGRhdGVBdmF0YXJSZXNwb25zZSxcbiAgLy8gRW1haWwgY2hhbmdlXG4gIEluaXRpYXRlRW1haWxDaGFuZ2VSZXF1ZXN0LFxuICBJbml0aWF0ZUVtYWlsQ2hhbmdlUmVzcG9uc2UsXG4gIENvbmZpcm1FbWFpbENoYW5nZVN0ZXAxUmVxdWVzdCxcbiAgQ29uZmlybUVtYWlsQ2hhbmdlU3RlcDFSZXNwb25zZSxcbiAgQ29uZmlybUVtYWlsQ2hhbmdlU3RlcDJSZXF1ZXN0LFxuICBDb25maXJtRW1haWxDaGFuZ2VTdGVwMlJlc3BvbnNlLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IE9BdXRoU2VydmljZSB9IGZyb20gJy4vb2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBGaXJlYmFzZVNlcnZpY2UsIE1lc3NhZ2luZ1NlcnZpY2UgfSBmcm9tICcuLi9maXJlYmFzZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSwgSTE4bkxhbmcgfSBmcm9tICcuLi9pMThuJztcbmltcG9ydCB7IEZpcmVzdG9yZSwgZG9jLCBvblNuYXBzaG90IH0gZnJvbSAnQGFuZ3VsYXIvZmlyZS9maXJlc3RvcmUnO1xuaW1wb3J0IHsgQ29uZmlybWF0aW9uRGlhbG9nU2VydmljZSB9IGZyb20gJy4uL2NvbmZpcm1hdGlvbi1kaWFsb2cvY29uZmlybWF0aW9uLWRpYWxvZy5zZXJ2aWNlJztcbmltcG9ydCB7IGludGVycHJldEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuLyoqXG4gKiBTZXJ2aWNpbyBwcmluY2lwYWwgZGUgYXV0ZW50aWNhY2nDs24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAndmFsdGVjaC1jb21wb25lbnRzJztcbiAqXG4gKiBAQ29tcG9uZW50KHsuLi59KVxuICogZXhwb3J0IGNsYXNzIExvZ2luQ29tcG9uZW50IHtcbiAqICAgcHJpdmF0ZSBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAqXG4gKiAgIGFzeW5jIGxvZ2luKCkge1xuICogICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuYXV0aC5zaWduaW4oeyBlbWFpbCwgcGFzc3dvcmQgfSkpO1xuICogICAgIGlmICh0aGlzLmF1dGgubWZhUGVuZGluZygpLnJlcXVpcmVkKSB7XG4gKiAgICAgICAvLyBNb3N0cmFyIFVJIGRlIE1GQVxuICogICAgIH0gZWxzZSB7XG4gKiAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy8nXSk7XG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8vIFRpbWVyIHBhcmEgcmVmcmVzaCBwcm9hY3Rpdm9cbiAgcHJpdmF0ZSByZWZyZXNoVGltZXJJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzeW5jU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBmaXJlc3RvcmVSQkFDVW5zdWJzY3JpYmU6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFNpbmdsZS1mbGlnaHQgcmVmcmVzaDogdW4gc29sbyBQT1NUIC9yZWZyZXNoIGVuIHZ1ZWxvIGEgbGEgdmV6LiBUb2RvcyBsb3NcbiAgLy8gY2FsbGVycyAoYm9vdHN0cmFwLCByZWVzdGFibGVjZXIgRmlyZWJhc2UsIGludGVyY2VwdG9yIDQwMSwgdGltZXIgcHJvYWN0aXZvKVxuICAvLyBjb21wYXJ0ZW4gZWwgTUlTTU8gb2JzZXJ2YWJsZS4gU2luIGVzdG8sIHJlZnJlc2hlcyBjb25jdXJyZW50ZXMgY2hvY2FuIGNvbnRyYVxuICAvLyBsYSByb3RhY2nDs24gZGUgcmVmcmVzaCB0b2tlbiBkZWwgYmFja2VuZDogZWwgcHJpbWVybyByb3RhIGVsIHRva2VuIHkgZWxcbiAgLy8gc2VndW5kbyBsbGVnYSBjb24gZWwgdG9rZW4geWEgaW52YWxpZGFkbyDihpIgNDAxIOKGkiBsb2dvdXQgZXNwdXJpbyAoZWwgdXN1YXJpb1xuICAvLyBjYWUgYSBsYSBsYW5kaW5nIGFsIGFjdHVhbGl6YXIpLiBWZXIgcHJvamVjdF9wd2EtbG9naW4tZnJlZXplLlxuICBwcml2YXRlIGluRmxpZ2h0UmVmcmVzaCQ6IE9ic2VydmFibGU8UmVmcmVzaFJlc3BvbnNlPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVkFMVEVDSF9BVVRIX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFZhbHRlY2hBdXRoQ29uZmlnIHwgbnVsbCxcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHN0YXRlU2VydmljZTogQXV0aFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIHRva2VuU2VydmljZTogVG9rZW5TZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IEF1dGhTdG9yYWdlU2VydmljZSxcbiAgICBwcml2YXRlIHN5bmNTZXJ2aWNlOiBBdXRoU3luY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBmaXJlYmFzZVNlcnZpY2U6IEZpcmViYXNlU2VydmljZSxcbiAgICBwcml2YXRlIG9hdXRoU2VydmljZTogT0F1dGhTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbWVzc2FnaW5nU2VydmljZTogTWVzc2FnaW5nU2VydmljZSB8IG51bGwsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBpMThuU2VydmljZTogSTE4blNlcnZpY2UgfCBudWxsLFxuICAgIHByaXZhdGUgY29uZmlybWF0aW9uU2VydmljZTogQ29uZmlybWF0aW9uRGlhbG9nU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGZpcmVzdG9yZUluc3RhbmNlOiBGaXJlc3RvcmUgfCBudWxsXG4gICkge1xuICAgIGlmICghdGhpcy5jb25maWcgJiYgaXNEZXZNb2RlKCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ1t2YWx0ZWNoLWNvbXBvbmVudHNdIEF1dGhTZXJ2aWNlOiBwcm92aWRlVmFsdGVjaEF1dGgoKSBubyBlc3TDoSBlbiBtYWluLnRzLiAnICtcbiAgICAgICAgICAnTG9naW4sIHJlZ2lzdHJvIHkgc2VzacOzbiBubyBmdW5jaW9uYXLDoW4uJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRVNUQURPIFDDmkJMSUNPIChTaWduYWxzIHJlYWRvbmx5KVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogRXN0YWRvIGNvbXBsZXRvIGRlIGF1dGVudGljYWNpw7NuICovXG4gIHJlYWRvbmx5IHN0YXRlID0gdGhpcy5zdGF0ZVNlcnZpY2Uuc3RhdGU7XG5cbiAgLyoqIFVzdWFyaW8gZXN0w6EgYXV0ZW50aWNhZG8gKi9cbiAgcmVhZG9ubHkgaXNBdXRoZW50aWNhdGVkID0gdGhpcy5zdGF0ZVNlcnZpY2UuaXNBdXRoZW50aWNhdGVkO1xuXG4gIC8qKiBFc3RhZG8gZGUgY2FyZ2EgKi9cbiAgcmVhZG9ubHkgaXNMb2FkaW5nID0gdGhpcy5zdGF0ZVNlcnZpY2UuaXNMb2FkaW5nO1xuXG4gIC8qKiBJbmZvcm1hY2nDs24gZGVsIHVzdWFyaW8gKi9cbiAgcmVhZG9ubHkgdXNlciA9IHRoaXMuc3RhdGVTZXJ2aWNlLnVzZXI7XG5cbiAgLyoqIENhbWJpb3MgZGUgb3JnYW5pemFjacOzbiBhY3RpdmEgZGV0ZWN0YWRvcyBkZXNkZSB0b2tlbiByZWZyZXNoLCBzd2l0Y2gtb3JnIG8gc3luYyBlbnRyZSBwZXN0YcOxYXMuICovXG4gIHJlYWRvbmx5IGFjdGl2ZU9yZ0NoYW5nZWQkID0gdGhpcy5zdGF0ZVNlcnZpY2UuYWN0aXZlT3JnQ2hhbmdlZCQ7XG5cbiAgLyoqIFRva2VuIGRlIGFjY2VzbyAqL1xuICByZWFkb25seSBhY2Nlc3NUb2tlbiA9IHRoaXMuc3RhdGVTZXJ2aWNlLmFjY2Vzc1Rva2VuO1xuXG4gIC8qKiBSb2xlcyBkZWwgdXN1YXJpbyAqL1xuICByZWFkb25seSByb2xlcyA9IHRoaXMuc3RhdGVTZXJ2aWNlLnJvbGVzO1xuXG4gIC8qKiBQZXJtaXNvcyBkZWwgdXN1YXJpbyAqL1xuICByZWFkb25seSBwZXJtaXNzaW9ucyA9IHRoaXMuc3RhdGVTZXJ2aWNlLnBlcm1pc3Npb25zO1xuXG4gIC8qKiBVc3VhcmlvIGVzIHN1cGVyIGFkbWluICovXG4gIHJlYWRvbmx5IGlzU3VwZXJBZG1pbiA9IHRoaXMuc3RhdGVTZXJ2aWNlLmlzU3VwZXJBZG1pbjtcblxuICAvKiogRXN0YWRvIGRlIE1GQSBwZW5kaWVudGUgKi9cbiAgcmVhZG9ubHkgbWZhUGVuZGluZyA9IHRoaXMuc3RhdGVTZXJ2aWNlLm1mYVBlbmRpbmc7XG5cbiAgLyoqIEVycm9yIGFjdHVhbCAqL1xuICByZWFkb25seSBlcnJvciA9IHRoaXMuc3RhdGVTZXJ2aWNlLmVycm9yO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJTklDSUFMSVpBQ0nDk05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaWNpYWxpemEgZWwgc2VydmljaW8gZGUgYXV0ZW50aWNhY2nDs24uXG4gICAqIExsYW1hZG8gYXV0b23DoXRpY2FtZW50ZSBwb3IgcHJvdmlkZVZhbHRlY2hBdXRoLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyAxLiBDYXJnYXIgZXN0YWRvIGRlc2RlIHN0b3JhZ2VcbiAgICBjb25zdCBzdG9yZWRTdGF0ZSA9IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZFN0YXRlKCk7XG5cbiAgICBpZiAoc3RvcmVkU3RhdGUuYWNjZXNzVG9rZW4pIHtcbiAgICAgIC8vIDIuIFZlcmlmaWNhciBzaSB0b2tlbiBlcyB2w6FsaWRvXG4gICAgICBpZiAodGhpcy50b2tlblNlcnZpY2UuaXNUb2tlblZhbGlkKHN0b3JlZFN0YXRlLmFjY2Vzc1Rva2VuKSkge1xuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5yZXN0b3JlRnJvbVN0b3JhZ2Uoc3RvcmVkU3RhdGUpO1xuXG4gICAgICAgIC8vIEV4dHJhZXIgaW5mbyBkZWwgdG9rZW5cbiAgICAgICAgY29uc3QgY2xhaW1zID0gdGhpcy50b2tlblNlcnZpY2UucGFyc2VUb2tlbihzdG9yZWRTdGF0ZS5hY2Nlc3NUb2tlbik7XG4gICAgICAgIGNvbnN0IHRhYkFjdGl2ZU9yZyA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0QWN0aXZlT3JnKCk7XG4gICAgICAgIGlmIChjbGFpbXMpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVVc2VySW5mbyhjbGFpbXMudWlkLCBjbGFpbXMuZW1haWwpO1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZU9yZyA9IHRhYkFjdGl2ZU9yZyB8fCBjbGFpbXMub3JnO1xuICAgICAgICAgIGlmIChhY3RpdmVPcmcpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjdGl2ZU9yZyhhY3RpdmVPcmcpO1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlQWN0aXZlT3JnKGFjdGl2ZU9yZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFN5bmMgaXNTdXBlckFkbWluIGZyb20gSldUIGluIGNhc2UgSXNQbGF0Zm9ybUFkbWluIGNoYW5nZWQgc2luY2UgbGFzdCBsb2dpblxuICAgICAgICAgIGNvbnN0IGp3dEFkbWluID0gY2xhaW1zLmFkbWluID09PSB0cnVlO1xuICAgICAgICAgIGlmIChqd3RBZG1pbiAhPT0gKHN0b3JlZFN0YXRlLmlzU3VwZXJBZG1pbiA/PyBmYWxzZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvbGVzID0gc3RvcmVkU3RhdGUucm9sZXMgPz8gW107XG4gICAgICAgICAgICBjb25zdCBwZXJtcyA9IHN0b3JlZFN0YXRlLnBlcm1pc3Npb25zID8/IFtdO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUGVybWlzc2lvbnMocm9sZXMsIHBlcm1zLCBqd3RBZG1pbik7XG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVQZXJtaXNzaW9ucyh7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbklkOiAnJyxcbiAgICAgICAgICAgICAgcm9sZXMsXG4gICAgICAgICAgICAgIHBlcm1pc3Npb25zOiBwZXJtcyxcbiAgICAgICAgICAgICAgaXNTdXBlckFkbWluOiBqd3RBZG1pbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVsIGFjY2VzcyB0b2tlbiBlc3TDoSBlbiBsb2NhbFN0b3JhZ2UgeSBwdWVkZSBoYWJlciBzaWRvIGVzY3JpdG8gcG9yXG4gICAgICAgIC8vIG90cmEgcGVzdGHDsWEgZW4gb3RyYSBvcmdhbml6YWNpw7NuLiBTaSBlc3RhIHBlc3Rhw7FhIHJlY3VlcmRhIHVuYSBvcmdcbiAgICAgICAgLy8gZGlzdGludGEgZW4gc2Vzc2lvblN0b3JhZ2UsIHJlZnJlc2NhbW9zIGRlIGZvcm1hIGJsb3F1ZWFudGUgYW50ZXMgZGVcbiAgICAgICAgLy8gZGVqYXIgcXVlIGxhcyBydXRhcyBvcmctc2NvcGVkIHBpZGFuIGRhdG9zIGNvbiB1biBKV1QgZXF1aXZvY2Fkby5cbiAgICAgICAgaWYgKHRhYkFjdGl2ZU9yZyAmJiBjbGFpbXM/Lm9yZyAmJiBjbGFpbXMub3JnICE9PSB0YWJBY3RpdmVPcmcpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGBbVmFsdGVjaEF1dGhdIGJvb3RzdHJhcCDigJQgc3RvcmVkIEpXVCBvcmcgJHtjbGFpbXMub3JnfSBkaWZmZXJzIGZyb20gdGFiIG9yZyAke3RhYkFjdGl2ZU9yZ307IHJlZnJlc2hpbmcgYmVmb3JlIHJvdXRlIGRhdGFgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIEluaWNpYXIgdGltZXIgZGUgcmVmcmVzY28gcHJvYWN0aXZvXG4gICAgICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcblxuICAgICAgICAvLyA0LiBSZS1lc3RhYmxlY2VyIGxhIHNlc2nDs24gZGUgRmlyZWJhc2UgZW4gYm9vdHN0cmFwLlxuICAgICAgICAvLyBFbCBhY2Nlc3MgdG9rZW4gc2lndWUgdsOhbGlkbywgYXPDrSBxdWUgTk8gcGFzYW1vcyBwb3IgbGEgcmFtYSBkZVxuICAgICAgICAvLyByZWZyZXNoIOKAlCBwZXJvIGxhIHBlcnNpc3RlbmNpYSBJbmRleGVkREIgcHJvcGlhIGRlIEZpcmViYXNlIEF1dGggbm9cbiAgICAgICAgLy8gc29icmV2aXZlIGVsIGNvbnRlbmVkb3IgZGUgc3RvcmFnZSBkZSB1bmEgUFdBIHN0YW5kYWxvbmUgZW4gaU9TLlxuICAgICAgICAvLyBTaW4gZXN0bywgYGZpcmViYXNlQXV0aFJlYWR5YCBzZSBxdWVkYSBlbiBgZmFsc2VgIHBhcmEgc2llbXByZSB5XG4gICAgICAgIC8vIGN1YWxxdWllciBsaXN0ZW5lciBGaXJlc3RvcmUgKGVqLiBlbCBpbmJveCBkZSBub3RpZmljYWNpb25lcykgY3VlbGdhLlxuICAgICAgICAvLyBGaXJlLWFuZC1mb3JnZXQ6IE5PIGRlYmUgZGVtb3JhciBlbCByZXNvbHZlIGRlIGluaXRpYWxpemUoKS5cbiAgICAgICAgdm9pZCB0aGlzLmVuc3VyZUZpcmViYXNlU2Vzc2lvbk9uQm9vdHN0cmFwKCk7XG5cbiAgICAgICAgLy8gNS4gTGlzdGVuZXIgUkJBQyBGaXJlc3RvcmUg4oCUIHJlLWVzdGFibGVjZXIgdHJhcyByZWxvYWQgZGUgcMOhZ2luYS5cbiAgICAgICAgLy8gaGFuZGxlU3VjY2Vzc2Z1bEF1dGggbG8gY29uZmlndXJhIGVuIGVsIGxvZ2luIGluaWNpYWwsIHBlcm8gbm8gc29icmV2aXZlXG4gICAgICAgIC8vIHJlY2FyZ2FzOiBpbml0aWFsaXplKCkgcmVzdGF1cmEgZWwgc3RhdGUgZGVzZGUgc3RvcmFnZSBwZXJvIG5vIGVsIGxpc3RlbmVyLlxuICAgICAgICAvLyBzZXR1cEZpcmVzdG9yZVJCQUNTeW5jIGVzcGVyYSBpbnRlcm5hbWVudGUgYSBxdWUgRmlyZWJhc2UgQXV0aCBlc3TDqSBsaXN0YS5cbiAgICAgICAgaWYgKGNsYWltcz8udWlkKSB7XG4gICAgICAgICAgdGhpcy5zZXR1cEZpcmVzdG9yZVJCQUNTeW5jKGNsYWltcy51aWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0b3JlZFN0YXRlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIC8vIDQuIFRva2VuIGRlIGFjY2VzbyBleHBpcmFkby4gQ29va2llLW9ubHkgKEgtMDUpOiBlbCByZWZyZXNoIHlhIE5PIGVzdMOhXG4gICAgICAgIC8vIGVuIHN0b3JhZ2UsIGFzw60gcXVlIGVsIGRpc3BhcmFkb3IgZXMgXCJoYWLDrWEgdW4gYWNjZXNzIHRva2VuXCIgKHNlc2nDs25cbiAgICAgICAgLy8gcHJldmlhKTsgZWwgL3JlZnJlc2ggZGUgZm9uZG8gdXNhIGxhIGNvb2tpZSBIdHRwT25seS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTk8gYmxvcXVlYW1vcyBlbCBib290c3RyYXAgZXNwZXJhbmRvIGxhIHJlZDogdW4gL3JlZnJlc2ggZW4gdW5hXG4gICAgICAgIC8vIExhbWJkYSBmcsOtYSBzb24gMi01cyBkZSBwYW50YWxsYSBlbiBibGFuY28gKEFuZ3VsYXIgbm8gcmVuZGVyaXphXG4gICAgICAgIC8vIG5hZGEgaGFzdGEgcXVlIGVsIEFQUF9JTklUSUFMSVpFUiByZXN1ZWx2ZSkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFJlc3RhdXJhY2nDs24gb3B0aW1pc3RhOiBlbCBhY2Nlc3MgdG9rZW4gZXhwaXLDsyBwZXJvIHN1cyBjbGFpbXNcbiAgICAgICAgLy8gKHVpZC9lbWFpbC9yb2xlcykgc2lndWVuIGRlY29kaWZpY2FibGVzIOKAlCBgcGFyc2VUb2tlbmAgTk8gdmFsaWRhXG4gICAgICAgIC8vIGBleHBgLiBSZXN0YXVyYW1vcyBsYSBzZXNpw7NuIGRlc2RlIGVzb3MgY2xhaW1zIHBhcmEgcXVlIGxhIGFwcFxuICAgICAgICAvLyByZW5kZXJpY2UgZWwgc2hlbGwgYXV0ZW50aWNhZG8gZGUgaW5tZWRpYXRvLCB5IGRpc3BhcmFtb3MgZWxcbiAgICAgICAgLy8gL3JlZnJlc2ggZW4gc2VndW5kbyBwbGFubyAoZmlyZS1hbmQtZm9yZ2V0KS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2VndXJpZGFkIGRlIGxhIHZlbnRhbmEgc3ViLXNlZ3VuZG8gYW50ZXMgZGUgcXVlIGVsIHJlZnJlc2ggbGxlZ3VlOlxuICAgICAgICAvLyBjdWFscXVpZXIgQVBJIGNhbGwgc2FsZSBjb24gZWwgdG9rZW4gZXhwaXJhZG8g4oaSIDQwMSDihpIgZWxcbiAgICAgICAgLy8gYXV0aEludGVyY2VwdG9yIHJlZnJlc2NhICsgcmVpbnRlbnRhIGF1dG9tw6F0aWNhbWVudGUuIFNpIGVsIHJlZnJlc2hcbiAgICAgICAgLy8gZGUgZm9uZG8gZmFsbGEg4oaSIHNpZ25PdXQgKyBjbGVhclN0YXRlLlxuICAgICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBib290c3RyYXAg4oCUIGFjY2VzcyB0b2tlbiBleHBpcmVkLCByZWZyZXNoaW5nIGluIGJhY2tncm91bmQnKTtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UucmVzdG9yZUZyb21TdG9yYWdlKHN0b3JlZFN0YXRlKTtcblxuICAgICAgICBjb25zdCBleHBpcmVkQ2xhaW1zID0gdGhpcy50b2tlblNlcnZpY2UucGFyc2VUb2tlbihzdG9yZWRTdGF0ZS5hY2Nlc3NUb2tlbik7XG4gICAgICAgIGNvbnN0IHRhYkFjdGl2ZU9yZyA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0QWN0aXZlT3JnKCk7XG4gICAgICAgIGlmIChleHBpcmVkQ2xhaW1zKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlVXNlckluZm8oZXhwaXJlZENsYWltcy51aWQsIGV4cGlyZWRDbGFpbXMuZW1haWwpO1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZU9yZyA9IHRhYkFjdGl2ZU9yZyB8fCBleHBpcmVkQ2xhaW1zLm9yZztcbiAgICAgICAgICBpZiAoYWN0aXZlT3JnKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVBY3RpdmVPcmcoYWN0aXZlT3JnKTtcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZUFjdGl2ZU9yZyhhY3RpdmVPcmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZXhwaXJlZENsYWltcy51aWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBGaXJlc3RvcmVSQkFDU3luYyhleHBpcmVkQ2xhaW1zLnVpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVmcmVzaCBlbiBzZWd1bmRvIHBsYW5vIOKAlCBOTyBzZSBoYWNlIGF3YWl0OiBpbml0aWFsaXplKCkgcmVzdWVsdmUgeWEuXG4gICAgICAgIGZpcnN0VmFsdWVGcm9tKHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuKCkpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tWYWx0ZWNoQXV0aF0gYm9vdHN0cmFwIOKAlCBiYWNrZ3JvdW5kIHJlZnJlc2ggZmFpbGVkLCBzaWduaW5nIG91dCcpO1xuICAgICAgICAgIHRoaXMuc2lnbk91dEZpcmViYXNlKCk7XG4gICAgICAgICAgdGhpcy5jbGVhclN0YXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaWduT3V0RmlyZWJhc2UoKTtcbiAgICAgICAgdGhpcy5jbGVhclN0YXRlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuY29uZmlnPy5ib290c3RyYXBTZXNzaW9uRnJvbUhpbnQgJiZcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuaGFzTG9nZ2VkSW5IaW50KHRoaXMuY29uZmlnPy5sb2dnZWRJbkhpbnRDb29raWUpXG4gICAgKSB7XG4gICAgICAvLyBObyBoYXkgdG9rZW4gbG9jYWwgZW4gZXN0ZSBvcmlnaW4sIHBlcm8gbGEgY29va2llLWhpbnQgaW5kaWNhIHNlc2nDs25cbiAgICAgIC8vIGFjdGl2YSBlbiBsYSBmYW1pbGlhIChsb2d1ZWFkbyBlbiBvdHJhIGFwcCBkZWwgZmFjdG9yeSkuIEJvb3RzdHJhcGVhbW9zXG4gICAgICAvLyBsYSBzZXNpw7NuIGNyb3NzLW9yaWdpbiB2w61hIC9yZWZyZXNoIOKAlCBibG9xdWVhbnRlIHBhcmEgcXVlIGxvcyBndWFyZHMgbGFcbiAgICAgIC8vIHZlYW4uIFZlciBWYWx0ZWNoQXV0aENvbmZpZy5ib290c3RyYXBTZXNzaW9uRnJvbUhpbnQuXG4gICAgICBhd2FpdCB0aGlzLmJvb3RzdHJhcFNlc3Npb25Gcm9tSGludENvb2tpZSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zaG91bGRCb290c3RyYXBWaWFTU09CcmlkZ2UoKSkge1xuICAgICAgLy8gQURSLTA1MCBNb2RvIEI6IGVzdGEgYXBwIG5vIGNvbXBhcnRlIGRvbWluaW8gcmHDrXogY29uIGVsIHJlc3RvIGRlbFxuICAgICAgLy8gZmFjdG9yeSAoYm9vdHN0cmFwU2Vzc2lvbkZyb21IaW50IG5vIGFwbGljYSDigJQgbGEgY29va2llLWhpbnQgbnVuY2FcbiAgICAgIC8vIGxsZWdhIGFxdcOtKS4gTmF2ZWdhY2nDs24gZGUgcMOhZ2luYSBjb21wbGV0YSBhbCBBdXRoIFByb3h5IENlbnRyYWw7XG4gICAgICAvLyB2dWVsdmUgY29uIGA/aGFuZG9mZj1gIHNpIGhheSBzZXNpw7NuIGFjdGl2YS4gVmVyXG4gICAgICAvLyBWYWx0ZWNoQXV0aENvbmZpZy5ib290c3RyYXBTZXNzaW9uRnJvbUJyaWRnZS5cbiAgICAgIHRoaXMucmVkaXJlY3RUb1NTT0JyaWRnZSgpO1xuICAgICAgLy8gTm8gc2VndWltb3MgZWwgcmVzdG8gZGUgaW5pdGlhbGl6ZSgpIOKAlCBsYSBww6FnaW5hIGVzdMOhIHBvciBuYXZlZ2FyXG4gICAgICAvLyBmdWVyYS4gRGVqYW1vcyBsb2FkaW5nPXRydWUgYSBwcm9ww7NzaXRvOiBlbCB1bmxvYWQgZXMgaW5taW5lbnRlLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIDUuIEluaWNpYXIgc2luY3Jvbml6YWNpw7NuIGVudHJlIHBlc3Rhw7Fhc1xuICAgIGlmICh0aGlzLmNvbmZpZz8uZW5hYmxlVGFiU3luYykge1xuICAgICAgdGhpcy5zeW5jU2VydmljZS5zdGFydCgpO1xuICAgICAgdGhpcy5zeW5jU3Vic2NyaXB0aW9uID0gdGhpcy5zeW5jU2VydmljZS5vbkV2ZW50JC5zdWJzY3JpYmUoZXZlbnQgPT5cbiAgICAgICAgdGhpcy5oYW5kbGVTeW5jRXZlbnQoZXZlbnQpXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldExvYWRpbmcoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIMK/SGF5IHNlc2nDs24gYWN0aXZhIGVuIGxhIGZhbWlsaWEgc2Vnw7puIGxhIGNvb2tpZS1oaW50IEpTLXJlYWRhYmxlP1xuICAgKlxuICAgKiBFc3Blam8gbGVnaWJsZSBkZSBsYSBjb29raWUgSHR0cE9ubHkgYHZhbHRlY2hfcmVmcmVzaGAgKHF1ZSBKUyBubyBwdWVkZSBsZWVyKS5cbiAgICogw5p0aWwgcGFyYSBxdWUgdW4gc2l0aW8gcMO6YmxpY28gZGVjaWRhIGxhbmRpbmctdnMtYXBwIGRlIGZvcm1hIHPDrW5jcm9uYSwgc2luXG4gICAqIGVzcGVyYXIgZWwgYC9yZWZyZXNoYC4gTk8gZXMgcHJ1ZWJhIGRlIHNlc2nDs24gdsOhbGlkYSAobGEgaGludCBwdWVkZSBxdWVkYXJcbiAgICogc3RhbGUpIOKAlCBwYXJhIHVuYSBzZXNpw7NuIHJlYWwgdXNhciBgaXNBdXRoZW50aWNhdGVkKClgICsgYGJvb3RzdHJhcFNlc3Npb25Gcm9tSGludGAuXG4gICAqL1xuICBoYXNMb2dnZWRJbkhpbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZVNlcnZpY2UuaGFzTG9nZ2VkSW5IaW50KHRoaXMuY29uZmlnPy5sb2dnZWRJbkhpbnRDb29raWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJvb3RzdHJhcCBjcm9zcy1vcmlnaW4gZGUgbGEgc2VzacOzbiBkZXNkZSBsYSBjb29raWUtaGludCBkZSBmYW1pbGlhLlxuICAgKlxuICAgKiBTZSBpbnZvY2EgZGVzZGUgYGluaXRpYWxpemUoKWAgY3VhbmRvIG5vIGhheSB0b2tlbiBsb2NhbCBwZXJvIGxhIGFwcCBvcHTDsyBwb3JcbiAgICogYGJvb3RzdHJhcFNlc3Npb25Gcm9tSGludGAgeSBsYSBoaW50IGVzdMOhIHByZXNlbnRlLiBFbCBgL3JlZnJlc2hgIHVzYSBlbFxuICAgKiByZWZyZXNoIHRva2VuIEh0dHBPbmx5IChgU2FtZVNpdGU9Tm9uZWApIHbDoWxpZG8gY3Jvc3Mtb3JpZ2luLiBgcmVmcmVzaEFjY2Vzc1Rva2VuYFxuICAgKiBwZXJzaXN0ZSBlbCB0b2tlbiArIEZpcmViYXNlICsgdGltZXIsIHBlcm8gTk8gbWFyY2EgYGlzQXV0aGVudGljYXRlZGAgbmlcbiAgICogcmVzdGF1cmEgY2xhaW1zL3JvbGVzIOKGkiBzZSBjb21wbGV0YSBsYSBzZXNpw7NuIGFjw6EuIEZhbGxhIGxpbXBpbyAoaGludCBzdGFsZSBvXG4gICAqIGRldiBjcm9zcy1zaXRlIGNvbiBjb29raWUgZGUgdGVyY2Vyb3MgYmxvcXVlYWRhKSDihpIgaW52aXRhZG8uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJvb3RzdHJhcFNlc3Npb25Gcm9tSGludENvb2tpZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBib290c3RyYXAg4oCUIG5vIGxvY2FsIHRva2VuIGJ1dCBmYW1pbHkgaGludCBwcmVzZW50LCByZWZyZXNoaW5nJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpKTtcbiAgICAgIGNvbnN0IGNsYWltcyA9IHRoaXMudG9rZW5TZXJ2aWNlLnBhcnNlVG9rZW4ocmVzcC5hY2Nlc3NUb2tlbik7XG4gICAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgcmVzcC5leHBpcmVzSW4gKiAxMDAwO1xuICAgICAgY29uc3QgaXNTdXBlckFkbWluID0gKHJlc3AucGVybWlzc2lvbnM/LmluY2x1ZGVzKCcqOionKSB8fCBjbGFpbXM/LmFkbWluID09PSB0cnVlKSA/PyBmYWxzZTtcbiAgICAgIGNvbnN0IGlzUHJlbWl1bSA9IGNsYWltcz8ucHJlbWl1bSA9PT0gdHJ1ZTtcblxuICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0QXV0aGVudGljYXRlZCh7XG4gICAgICAgIGFjY2Vzc1Rva2VuOiByZXNwLmFjY2Vzc1Rva2VuLFxuICAgICAgICByZWZyZXNoVG9rZW46IHJlc3AucmVmcmVzaFRva2VuLFxuICAgICAgICB1c2VySWQ6IGNsYWltcz8udWlkLFxuICAgICAgICBlbWFpbDogY2xhaW1zPy5lbWFpbCxcbiAgICAgICAgcm9sZXM6IHJlc3Aucm9sZXMgPz8gW10sXG4gICAgICAgIHBlcm1pc3Npb25zOiByZXNwLnBlcm1pc3Npb25zID8/IFtdLFxuICAgICAgICBpc1N1cGVyQWRtaW4sXG4gICAgICAgIGlzUHJlbWl1bSxcbiAgICAgICAgZXhwaXJlc0F0LFxuICAgICAgfSk7XG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVTdGF0ZSh7XG4gICAgICAgIGFjY2Vzc1Rva2VuOiByZXNwLmFjY2Vzc1Rva2VuLFxuICAgICAgICByZWZyZXNoVG9rZW46IHJlc3AucmVmcmVzaFRva2VuLFxuICAgICAgICByb2xlczogcmVzcC5yb2xlcyA/PyBbXSxcbiAgICAgICAgcGVybWlzc2lvbnM6IHJlc3AucGVybWlzc2lvbnMgPz8gW10sXG4gICAgICAgIGlzU3VwZXJBZG1pbixcbiAgICAgICAgaXNQcmVtaXVtLFxuICAgICAgICBleHBpcmVzQXQsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGNsYWltcz8ub3JnKSB7XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjdGl2ZU9yZyhjbGFpbXMub3JnKTtcbiAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlQWN0aXZlT3JnKGNsYWltcy5vcmcpO1xuICAgICAgfVxuICAgICAgaWYgKGNsYWltcz8udWlkKSB7XG4gICAgICAgIHRoaXMuc2V0dXBGaXJlc3RvcmVSQkFDU3luYyhjbGFpbXMudWlkKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBib290c3RyYXAg4oCUIGZhbWlseSBoaW50IHJlZnJlc2ggZmFpbGVkLCBjb250aW51aW5nIGFzIGd1ZXN0Jyk7XG4gICAgICB0aGlzLmNsZWFyU3RhdGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm9tYnJlIGRlIGxhIHNlc3Npb25TdG9yYWdlIGtleSB1c2FkYSBjb21vIGd1YXJkYSBhbnRpLWxvb3AgZGVsIGJyaWRnZS5cbiAgICogYHNlc3Npb25TdG9yYWdlYCAobm8gbG9jYWxTdG9yYWdlKSDigJQgZWwgZ3VhcmQgZGViZSBleHBpcmFyIG5hdHVyYWxtZW50ZSBhbFxuICAgKiBjZXJyYXIgbGEgcGVzdGHDsWE7IHVuYSBzZXNpw7NuIGRlIGZhbWlsaWEgcmVjacOpbiBpbmljaWFkYSBlbiBvdHJhIHBlc3Rhw7FhXG4gICAqIGRlYmUgcG9kZXIgcmVpbnRlbnRhciBlbCBicmlkZ2UgZW4gdW5hIHBlc3Rhw7FhIG51ZXZhLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1NPX0JSSURHRV9HVUFSRF9LRVkgPSAndmFsdGVjaF9zc29fYnJpZGdlX2F0dGVtcHRlZCc7XG5cbiAgLyoqXG4gICAqIMK/Q29ycmVzcG9uZGUgZGlzcGFyYXIgZWwgcmVkaXJlY3QgYWwgQXV0aCBQcm94eSBDZW50cmFsIChBRFItMDUwIE1vZG8gQik/XG4gICAqXG4gICAqIEZhbHNvIHNpOiBsYSBjb25maWcgbm8gbG8gaGFiaWxpdGEsIGZhbHRhIGBzc29CcmlkZ2VVcmxgLCBubyBjb3JyZW1vcyBlblxuICAgKiB1biBicm93c2VyIHJlYWwgKFNTUi90ZXN0cyksIG8gZXN0YSBwZXN0YcOxYSBZQSB2b2x2acOzIGRlIHVuIGludGVudG8gZGVcbiAgICogYnJpZGdlIOKAlCBzaW4gZXN0ZSDDumx0aW1vIGd1YXJkLCB1biBicmlkZ2UgcXVlIHJlZGlyaWdlIHNpbiBgP2hhbmRvZmZgXG4gICAqIChzaW4gc2VzacOzbikgZGlzcGFyYXLDrWEgdW4gYnVjbGUgaW5maW5pdG8gZGUgcmVkaXJlY3RzIGVuIGNhZGFcbiAgICogYGluaXRpYWxpemUoKWAgcG9zdGVyaW9yIGRlIGxhIG1pc21hIHBlc3Rhw7FhLlxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRCb290c3RyYXBWaWFTU09CcmlkZ2UoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uYm9vdHN0cmFwU2Vzc2lvbkZyb21CcmlkZ2UgfHwgIXRoaXMuY29uZmlnPy5zc29CcmlkZ2VVcmwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBzZXNzaW9uU3RvcmFnZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKEF1dGhTZXJ2aWNlLlNTT19CUklER0VfR1VBUkRfS0VZKSA9PT0gJzEnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIHNlc3Npb25TdG9yYWdlIGJsb3F1ZWFkbyAobW9kbyBwcml2YWRvIGFncmVzaXZvKSDigJQgbm8gYXJyaWVzZ2FyIHVuXG4gICAgICAvLyBsb29wIHNpbiBwb2RlciBtYXJjYXIgZWwgZ3VhcmQ7IG5vcyBhYnN0ZW5lbW9zIGRlbCBicmlkZ2UuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hdmVnYSBsYSBww6FnaW5hIGNvbXBsZXRhIGFsIEF1dGggUHJveHkgQ2VudHJhbCBjb24gYHJlZGlyZWN0X3VyaWAgPSBsYVxuICAgKiBVUkwgYWN0dWFsLiBFbCBiYWNrZW5kIHZhbGlkYSBsYSBjb29raWUgYHZhbHRlY2hfcmVmcmVzaGAgKHZpc2libGUgc29sb1xuICAgKiBlbiBzdSBwcm9waW8gZG9taW5pbywgcG9yIGVzbyBlbCByZWRpcmVjdCBkZWJlIHNlciB0b3AtbGV2ZWwgbmF2aWdhdGlvblxuICAgKiB5IG5vIHVuIGZldGNoKSB5IHJlZGlyaWdlIGRlIHZ1ZWx0YSBjb24gYD9oYW5kb2ZmPVRPS0VOYCBzaSBoYXkgc2VzacOzbi5cbiAgICpcbiAgICogTWFyY2EgZWwgZ3VhcmQgQU5URVMgZGUgbmF2ZWdhciDigJQgc2kgZWwgYnJpZGdlIHJlZGlyaWdlIHNpbiBgP2hhbmRvZmZgXG4gICAqIChzaW4gc2VzacOzbiksIGVsIHNpZ3VpZW50ZSBgaW5pdGlhbGl6ZSgpYCBkZSBlc3RhIHBlc3Rhw7FhIG5vIGRlYmUgdm9sdmVyXG4gICAqIGEgaW50ZW50YXIgZWwgYnJpZGdlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWRpcmVjdFRvU1NPQnJpZGdlKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKEF1dGhTZXJ2aWNlLlNTT19CUklER0VfR1VBUkRfS0VZLCAnMScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU2kgbm8gcG9kZW1vcyBtYXJjYXIgZWwgZ3VhcmQsIG1lam9yIG5vIG5hdmVnYXIg4oCUIGV2aXRhIGVsIGxvb3AuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlZGlyZWN0VXJpID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgY29uc3QgYnJpZGdlVXJsID0gbmV3IFVSTCh0aGlzLmNvbmZpZyEuc3NvQnJpZGdlVXJsISk7XG4gICAgYnJpZGdlVXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3JlZGlyZWN0X3VyaScsIHJlZGlyZWN0VXJpKTtcbiAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBib290c3RyYXAg4oCUIG5vIGxvY2FsIHNlc3Npb24sIHJlZGlyZWN0aW5nIHRvIFNTTyBicmlkZ2UnKTtcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGJyaWRnZVVybC50b1N0cmluZygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVmcmVzaFRpbWVyKCk7XG4gICAgdGhpcy5zeW5jU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMudGVhcmRvd25GaXJlc3RvcmVSQkFDU3luYygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFVVEVOVElDQUNJw5NOXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbmljaWEgc2VzacOzbiBjb24gZW1haWwgeSBjb250cmFzZcOxYS5cbiAgICogRGV0ZWN0YSBhdXRvbcOhdGljYW1lbnRlIGxhIHBsYXRhZm9ybWEgcGFyYSBpZGVudGlmaWNhciBkaXNwb3NpdGl2b3MgbnVldm9zLlxuICAgKi9cbiAgc2lnbmluKHJlcXVlc3Q6IFNpZ25pblJlcXVlc3QpOiBPYnNlcnZhYmxlPFNpZ25pblJlc3BvbnNlPiB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyTUZBUGVuZGluZygpO1xuXG4gICAgLy8gQWdyZWdhciBpbmZvIGRlIHBsYXRhZm9ybWEgcGFyYSBkZXZpY2UgZGV0ZWN0aW9uXG4gICAgY29uc3QgcGxhdGZvcm1JbmZvID0gdGhpcy5kZXRlY3RQbGF0Zm9ybUluZm8oKTtcbiAgICBjb25zdCBlbnJpY2hlZFJlcXVlc3Q6IFNpZ25pblJlcXVlc3QgPSB7XG4gICAgICAuLi5yZXF1ZXN0LFxuICAgICAgcGxhdGZvcm06IHJlcXVlc3QucGxhdGZvcm0gPz8gcGxhdGZvcm1JbmZvLnBsYXRmb3JtLFxuICAgICAgYnJvd3NlcjogcmVxdWVzdC5icm93c2VyID8/IHBsYXRmb3JtSW5mby5icm93c2VyLFxuICAgICAgb3M6IHJlcXVlc3Qub3MgPz8gcGxhdGZvcm1JbmZvLm9zLFxuICAgIH07XG5cbiAgICAvLyB3aXRoQ3JlZGVudGlhbHM6IGVsIGJhY2tlbmQgc2V0ZWEgbGEgY29va2llIEh0dHBPbmx5IGRlIHJlZnJlc2ggKHZhbHRlY2hfcmVmcmVzaClcbiAgICAvLyBlbiBsYSByZXNwdWVzdGEuIEVsIGJyb3dzZXIgc29sbyBhbG1hY2VuYSBlc2UgU2V0LUNvb2tpZSBjcm9zcy1vcmlnaW4gc2kgbGFcbiAgICAvLyByZXF1ZXN0IHNlIGhpem8gY29uIGNyZWRlbmNpYWxlcy4gU2luIGVzdG8gbGEgY29va2llIG5vIHBlcnNpc3RlIHkgL3JlZnJlc2hcbiAgICAvLyBmYWxsYSBzaWVtcHJlICg0MDApIOKGkiBsYSBzZXNpw7NuIG5vIGR1cmEgKEgtMDUpLlxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFNpZ25pblJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3NpZ25pbmAsIGVucmljaGVkUmVxdWVzdCwgeyB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5tZmFSZXF1aXJlZCkge1xuICAgICAgICAgICAgLy8gTUZBIHJlcXVlcmlkbyAtIGd1YXJkYXIgZXN0YWRvIHRlbXBvcmFsXG4gICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRNRkFQZW5kaW5nKHtcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIG1mYVRva2VuOiByZXNwb25zZS5tZmFUb2tlbiEsXG4gICAgICAgICAgICAgIG1ldGhvZDogcmVzcG9uc2UubWZhTWV0aG9kISxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgIC8vIExvZ2luIGV4aXRvc28gc2luIE1GQVxuICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsQXV0aChyZXNwb25zZSk7XG5cbiAgICAgICAgICAgIC8vIE5vdGlmaWNhciBzaSBlcyB1biBkaXNwb3NpdGl2byBudWV2b1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmlzTmV3RGV2aWNlKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIE5ldyBkZXZpY2UgZGV0ZWN0ZWQ6JywgcmVzcG9uc2UuZGV2aWNlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPQVVUSCAoTG9naW4gc29jaWFsKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pY2lhIHNlc2nDs24gY29uIE9BdXRoIChHb29nbGUsIEFwcGxlLCBNaWNyb3NvZnQpLlxuICAgKiBBYnJlIHVuIHBvcHVwIHBhcmEgZWwgZmx1am8gZGUgYXV0ZW50aWNhY2nDs24uXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFByb3ZlZWRvciBPQXV0aCAoJ2dvb2dsZScsICdhcHBsZScsICdtaWNyb3NvZnQnKVxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHF1ZSBlbWl0ZSBTaWduaW5SZXNwb25zZSBjdWFuZG8gc2UgY29tcGxldGFcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB0aGlzLmF1dGguc2lnbmluV2l0aE9BdXRoKCdnb29nbGUnKS5zdWJzY3JpYmUoe1xuICAgKiAgIG5leHQ6ICgpID0+IHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLyddKSxcbiAgICogICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcignT0F1dGggZmFpbGVkOicsIGVycilcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgc2lnbmluV2l0aE9BdXRoKHByb3ZpZGVyOiBPQXV0aFByb3ZpZGVyKTogT2JzZXJ2YWJsZTxTaWduaW5SZXNwb25zZT4ge1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyRXJyb3IoKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhck1GQVBlbmRpbmcoKTtcblxuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5zdGFydEZsb3cocHJvdmlkZXIpLnBpcGUoXG4gICAgICB0YXAocmVzdWx0ID0+IHtcbiAgICAgICAgLy8gTUZBIHJlcXVlcmlkbyB0cmFzIE9BdXRoIOKAlCBndWFyZGFyIGVzdGFkbyB0ZW1wb3JhbCwgTk8gYXV0ZW50aWNhci5cbiAgICAgICAgLy8gRWwgbG9naW4gY29tcG9uZW50IHJlYWNjaW9uYSBhIGBtZmFQZW5kaW5nKClgIHkgYWJyZSBlbCBtb2RhbCB2ZXJpZnkuXG4gICAgICAgIGlmIChyZXN1bHQubWZhUmVxdWlyZWQpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRNRkFQZW5kaW5nKHtcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbWZhVG9rZW46IHJlc3VsdC5tZmFUb2tlbiEsXG4gICAgICAgICAgICBtZXRob2Q6IHJlc3VsdC5tZmFNZXRob2QhLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnRpciBPQXV0aFJlc3VsdCBhIFNpZ25pblJlc3BvbnNlIGNvbXBhdGlibGVcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IFNpZ25pblJlc3BvbnNlID0ge1xuICAgICAgICAgIG9wZXJhdGlvbklkOiAnb2F1dGgnLFxuICAgICAgICAgIGFjY2Vzc1Rva2VuOiByZXN1bHQuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgcmVmcmVzaFRva2VuOiByZXN1bHQucmVmcmVzaFRva2VuLFxuICAgICAgICAgIGZpcmViYXNlVG9rZW46IHJlc3VsdC5maXJlYmFzZVRva2VuLFxuICAgICAgICAgIGV4cGlyZXNJbjogcmVzdWx0LmV4cGlyZXNJbixcbiAgICAgICAgICByb2xlczogcmVzdWx0LnJvbGVzLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiByZXN1bHQucGVybWlzc2lvbnMsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlU3VjY2Vzc2Z1bEF1dGgocmVzcG9uc2UpO1xuICAgICAgfSksXG4gICAgICBtYXAocmVzdWx0ID0+XG4gICAgICAgIHJlc3VsdC5tZmFSZXF1aXJlZFxuICAgICAgICAgID8gKHtcbiAgICAgICAgICAgICAgb3BlcmF0aW9uSWQ6ICdvYXV0aCcsXG4gICAgICAgICAgICAgIG1mYVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBtZmFUb2tlbjogcmVzdWx0Lm1mYVRva2VuLFxuICAgICAgICAgICAgICBtZmFNZXRob2Q6IHJlc3VsdC5tZmFNZXRob2QsXG4gICAgICAgICAgICB9IGFzIFNpZ25pblJlc3BvbnNlKVxuICAgICAgICAgIDogKHtcbiAgICAgICAgICAgICAgb3BlcmF0aW9uSWQ6ICdvYXV0aCcsXG4gICAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiByZXN1bHQuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogcmVzdWx0LnJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgICAgZmlyZWJhc2VUb2tlbjogcmVzdWx0LmZpcmViYXNlVG9rZW4sXG4gICAgICAgICAgICAgIGV4cGlyZXNJbjogcmVzdWx0LmV4cGlyZXNJbixcbiAgICAgICAgICAgICAgcm9sZXM6IHJlc3VsdC5yb2xlcyxcbiAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IHJlc3VsdC5wZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIH0gYXMgU2lnbmluUmVzcG9uc2UpXG4gICAgICApLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgIGNvbnN0IGF1dGhFcnJvcjogQXV0aEVycm9yID0ge1xuICAgICAgICAgIGNvZGU6IGVycm9yLmNvZGUgfHwgJ09BVVRIX0VSUk9SJyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIHx8ICdFcnJvciBkZSBhdXRlbnRpY2FjacOzbiBPQXV0aCcsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldEVycm9yKGF1dGhFcnJvcik7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGF1dGhFcnJvcik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ29udGluw7phIHVuIGxvZ2luIE9BdXRoIHF1ZSB2b2x2acOzIHBvciByZWRpcmVjdCBwcmluY2lwYWwgY29uIE1GQSByZXF1ZXJpZG8uXG4gICAqIEVuIGVzZSBjYXNvIGBzaWduaW5XaXRoT0F1dGgoKWAgbm8gcHVlZGUgZW1pdGlyIHBvcnF1ZSBsYSBww6FnaW5hIG5hdmVnw7MgYWxcbiAgICogYmFja2VuZCBPQXV0aCB5IGVsIGNhbGxiYWNrIGNvcnJlIGVuIHVuYSBydXRhIG51ZXZhIGRlIGxhIG1pc21hIFNQQS5cbiAgICovXG4gIHNldE9BdXRoTUZBUGVuZGluZyhtZmFUb2tlbjogc3RyaW5nLCBtZXRob2Q6IE1GQU1ldGhvZCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyRXJyb3IoKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRNRkFQZW5kaW5nKHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgbWZhVG9rZW4sXG4gICAgICBtZXRob2QsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmluY3VsYSB1biBwcm92ZWVkb3IgT0F1dGggYWRpY2lvbmFsIGEgbGEgY3VlbnRhIGFjdHVhbC5cbiAgICogUmVxdWllcmUgcXVlIGVsIHVzdWFyaW8gZXN0w6kgYXV0ZW50aWNhZG8uXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFByb3ZlZWRvciBPQXV0aCBhIHZpbmN1bGFyXG4gICAqL1xuICBsaW5rT0F1dGhQcm92aWRlcihwcm92aWRlcjogT0F1dGhQcm92aWRlcik6IE9ic2VydmFibGU8eyBzdWNjZXNzOiBib29sZWFuIH0+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2Uuc3RhcnRMaW5rRmxvdyhwcm92aWRlcikucGlwZShcbiAgICAgIG1hcCgoKSA9PiAoeyBzdWNjZXNzOiB0cnVlIH0pKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICBjb25zdCBhdXRoRXJyb3I6IEF1dGhFcnJvciA9IHtcbiAgICAgICAgICBjb2RlOiBlcnJvci5jb2RlIHx8ICdMSU5LX0VSUk9SJyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIHx8ICdFcnJvciBhbCB2aW5jdWxhciBwcm92ZWVkb3InLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRFcnJvcihhdXRoRXJyb3IpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBhdXRoRXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbG9zIHByb3ZlZWRvcmVzIE9BdXRoIHZpbmN1bGFkb3MgYWwgdXN1YXJpby5cbiAgICovXG4gIGdldExpbmtlZFByb3ZpZGVycygpOiBPYnNlcnZhYmxlPExpbmtlZFByb3ZpZGVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2UuZ2V0TGlua2VkUHJvdmlkZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdmluY3VsYSB1biBwcm92ZWVkb3IgT0F1dGggZGUgbGEgY3VlbnRhLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBQcm92ZWVkb3IgYSBkZXN2aW5jdWxhclxuICAgKi9cbiAgdW5saW5rT0F1dGhQcm92aWRlcihwcm92aWRlcjogT0F1dGhQcm92aWRlcik6IE9ic2VydmFibGU8eyBzdWNjZXNzOiBib29sZWFuIH0+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2UudW5saW5rUHJvdmlkZXIocHJvdmlkZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGFibGVjZSBjb250cmFzZcOxYSBwYXJhIHVzdWFyaW9zIHF1ZSBzb2xvIHRpZW5lbiBPQXV0aC5cbiAgICogUGVybWl0ZSBxdWUgdXN1YXJpb3MgT0F1dGgtb25seSBwdWVkYW4gdGFtYmnDqW4gdXNhciBlbWFpbC9wYXNzd29yZC5cbiAgICpcbiAgICogQHBhcmFtIHBhc3N3b3JkIC0gTnVldmEgY29udHJhc2XDsWFcbiAgICovXG4gIHNldFBhc3N3b3JkRm9yT0F1dGhVc2VyKHBhc3N3b3JkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHsgc3VjY2VzczogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLnNldFBhc3N3b3JkKHBhc3N3b3JkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHRpZW5lIGNvbnRyYXNlw7FhIGVzdGFibGVjaWRhLlxuICAgKiDDmnRpbCBwYXJhIG1vc3RyYXIvb2N1bHRhciBvcGNpb25lcyBkZSBjYW1iaW8gZGUgY29udHJhc2XDsWEuXG4gICAqL1xuICBjaGVja0hhc1Bhc3N3b3JkKCk6IE9ic2VydmFibGU8SGFzUGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5oYXNQYXNzd29yZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdHJhIHVuIG51ZXZvIHVzdWFyaW8uXG4gICAqIEVsIHVzdWFyaW8gcXVlZGEgZW4gZXN0YWRvIFBFTkRJTkcgaGFzdGEgdmVyaWZpY2FyIHN1IGVtYWlsLlxuICAgKi9cbiAgc2lnbnVwKHJlcXVlc3Q6IFNpZ251cFJlcXVlc3QpOiBPYnNlcnZhYmxlPFNpZ251cFJlc3BvbnNlPiB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8U2lnbnVwUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vc2lnbnVwYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2EgZW1haWwgY29uIGPDs2RpZ28gZGUgNiBkw61naXRvcy5cbiAgICogU2kgZXMgZXhpdG9zbywgaGFjZSBhdXRvLWxvZ2luIHkgcmV0b3JuYSB0b2tlbnMuXG4gICAqL1xuICB2ZXJpZnlFbWFpbChyZXF1ZXN0OiBWZXJpZnlFbWFpbFJlcXVlc3QpOiBPYnNlcnZhYmxlPFZlcmlmeUVtYWlsUmVzcG9uc2U+IHtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhckVycm9yKCk7XG5cbiAgICAvLyB3aXRoQ3JlZGVudGlhbHM6IGVsIHZlcmlmeS1lbWFpbCBhdXRvLWxvZ3VlYSB5IHNldGVhIGxhIGNvb2tpZSBIdHRwT25seSBkZVxuICAgIC8vIHJlZnJlc2guIFNpbiBjcmVkZW5jaWFsZXMgZWwgYnJvd3NlciBkZXNjYXJ0YSBlbCBTZXQtQ29va2llIOKGkiAvcmVmcmVzaCA0MDAgKEgtMDUpLlxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFZlcmlmeUVtYWlsUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vdmVyaWZ5LWVtYWlsYCwgcmVxdWVzdCwgeyB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZS52ZXJpZmllZCAmJiByZXNwb25zZS5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgLy8gQXV0by1sb2dpbjogZ3VhcmRhciB0b2tlbnMgeSBhY3R1YWxpemFyIGVzdGFkb1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsQXV0aChyZXNwb25zZSBhcyB1bmtub3duIGFzIFNpZ25pblJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVlbnbDrWEgY8OzZGlnbyBkZSB2ZXJpZmljYWNpw7NuIGFsIGVtYWlsLlxuICAgKi9cbiAgcmVzZW5kQ29kZShyZXF1ZXN0OiBSZXNlbmRDb2RlUmVxdWVzdCk6IE9ic2VydmFibGU8UmVzZW5kQ29kZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8UmVzZW5kQ29kZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Jlc2VuZC1jb2RlYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2EgY8OzZGlnbyBNRkEuXG4gICAqL1xuICB2ZXJpZnlNRkEoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxNRkFWZXJpZnlSZXNwb25zZT4ge1xuICAgIGNvbnN0IG1mYVN0YXRlID0gdGhpcy5tZmFQZW5kaW5nKCk7XG4gICAgaWYgKCFtZmFTdGF0ZS5tZmFUb2tlbikge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gKHtcbiAgICAgICAgY29kZTogJ01GQV9OT1RfUEVORElORycsXG4gICAgICAgIG1lc3NhZ2U6ICdObyBoYXkgdmVyaWZpY2FjacOzbiBNRkEgcGVuZGllbnRlJyxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFWZXJpZnlSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvdmVyaWZ5YCwge1xuICAgICAgICBtZmFUb2tlbjogbWZhU3RhdGUubWZhVG9rZW4sXG4gICAgICAgIGNvZGUsXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJNRkFQZW5kaW5nKCk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsQXV0aChyZXNwb25zZSk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzY2EgZWwgdG9rZW4gZGUgYWNjZXNvLlxuICAgKiBJbXBsZW1lbnRhIHRva2VuIHJvdGF0aW9uOiBjYWRhIHJlZnJlc2ggZ2VuZXJhIHVuIG51ZXZvIHJlZnJlc2ggdG9rZW5cbiAgICogcXVlIGVsIGNsaWVudGUgZGViZSBndWFyZGFyIHBhcmEgZWwgcHLDs3hpbW8gcmVmcmVzaC5cbiAgICovXG4gIHJlZnJlc2hBY2Nlc3NUb2tlbigpOiBPYnNlcnZhYmxlPFJlZnJlc2hSZXNwb25zZT4ge1xuICAgIC8vIFNpbmdsZS1mbGlnaHQ6IHNpIHlhIGhheSB1biAvcmVmcmVzaCBlbiB2dWVsbywgZGV2b2x2ZW1vcyBlbCBNSVNNT1xuICAgIC8vIG9ic2VydmFibGUgKG11bHRpY2FzdCB2w61hIHNoYXJlUmVwbGF5KS4gRXZpdGEgbGEgY2FycmVyYSBjb250cmEgbGEgcm90YWNpw7NuXG4gICAgLy8gZGUgcmVmcmVzaCB0b2tlbiBkZWwgYmFja2VuZCwgcXVlIHByb2R1Y8OtYSA0MDEgZXNwdXJpb3Mg4oaSIGxvZ291dCBhbFxuICAgIC8vIGFjdHVhbGl6YXIuIFZlciBpbkZsaWdodFJlZnJlc2gkIHkgcHJvamVjdF9wd2EtbG9naW4tZnJlZXplLlxuICAgIGlmICh0aGlzLmluRmxpZ2h0UmVmcmVzaCQpIHtcbiAgICAgIHJldHVybiB0aGlzLmluRmxpZ2h0UmVmcmVzaCQ7XG4gICAgfVxuXG4gICAgLy8gSC0wNSBzYW1lLXNpdGUtYXdhcmU6IGVuIHNhbWUtc2l0ZSAocHJvZCkgZWwgcmVmcmVzaCB2YSBTT0xPIHBvciBsYSBjb29raWVcbiAgICAvLyBIdHRwT25seSAoYm9keSB2YWPDrW8pLCBubyBzZSBwZXJzaXN0ZSBlbiBsb2NhbFN0b3JhZ2Ug4oaSIHVuIFhTUyBubyBsbyByb2JhLlxuICAgIC8vIEVuIGNyb3NzLXNpdGUgKGRldikgbGEgY29va2llIGRlIHRlcmNlcm9zIHNlIGJsb3F1ZWEgKFNhZmFyaSBJVFAgLyBDaHJvbWVcbiAgICAvLyAzcmQtcGFydHkgcGhhc2Utb3V0KSDihpIgc2UgbWFuZGEgZW4gZWwgYm9keSArIHNlIHBlcnNpc3RlIChmYWxsYmFjaykuXG4gICAgLy8gd2l0aENyZWRlbnRpYWxzIGFkanVudGEgbGEgY29va2llIGN1YW5kbyBlbCBicm93c2VyIGxhIHBlcm1pdGUuXG4gICAgY29uc3QgY3VycmVudEFjdGl2ZU9yZyA9IHRoaXMuc3RhdGUoKS5hY3RpdmVPcmcgfHwgdGhpcy5zdG9yYWdlU2VydmljZS5nZXRBY3RpdmVPcmcoKTtcbiAgICBjb25zdCBib2R5OiBSZWZyZXNoUmVxdWVzdCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuY29va2llT25seVxuICAgICAgPyB7IGFjdGl2ZU9yZ0lkOiBjdXJyZW50QWN0aXZlT3JnIH1cbiAgICAgIDogeyByZWZyZXNoVG9rZW46IHRoaXMuc3RhdGUoKS5yZWZyZXNoVG9rZW4sIGFjdGl2ZU9yZ0lkOiBjdXJyZW50QWN0aXZlT3JnIH07XG5cbiAgICB0aGlzLmluRmxpZ2h0UmVmcmVzaCQgPSB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFJlZnJlc2hSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9yZWZyZXNoYCwgYm9keSwgeyB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICAvLyBOdW5jYSBkZWphciBlbCByZWZyZXNoIGNvbGdhZG86IHNpIGxhIHJlZC9MYW1iZGEgbm8gcmVzcG9uZGUgYSB0aWVtcG8sXG4gICAgICAgIC8vIGVtaXRpbW9zIGVycm9yIOKGkiBsb3MgY2FsbGVycyAoaW5pdGlhbGl6ZSwgaW50ZXJjZXB0b3IpIGxvIG1hbmVqYW4geSBsYVxuICAgICAgICAvLyBVSSBkZWphIGRlIGVzcGVyYXIuIFZlciBSRUZSRVNIX1RJTUVPVVRfTVMuXG4gICAgICAgIHRpbWVvdXQoUkVGUkVTSF9USU1FT1VUX01TKSxcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgcmVzcG9uc2UuZXhwaXJlc0luICogMTAwMDtcblxuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjY2Vzc1Rva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuLCByZXNwb25zZS5leHBpcmVzSW4pO1xuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVJlZnJlc2hUb2tlbihyZXNwb25zZS5yZWZyZXNoVG9rZW4pO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZUFjY2Vzc1Rva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuLCBleHBpcmVzQXQpO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVJlZnJlc2hUb2tlbihyZXNwb25zZS5yZWZyZXNoVG9rZW4pOyAvLyBzZWxmLWdhdGU6IG5vLW9wIGVuIGNvb2tpZU9ubHlcblxuICAgICAgICAgIC8vIFN5bmMgaXNTdXBlckFkbWluIGZyb20gcmVmcmVzaGVkIEpXVCBzbyBwbGF0Zm9ybSBhZG1pbiBwcm9tb3Rpb24vcmV2b2NhdGlvblxuICAgICAgICAgIC8vIHRha2VzIGVmZmVjdCB3aXRob3V0IHJlcXVpcmluZyBhIGZ1bGwgcmUtbG9naW4uXG4gICAgICAgICAgY29uc3QgcGFyc2VkVG9rZW4gPSB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgICBpZiAocGFyc2VkVG9rZW4/Lm9yZykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKHBhcnNlZFRva2VuLm9yZyk7XG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVBY3RpdmVPcmcocGFyc2VkVG9rZW4ub3JnLCB7IHBlcnNpc3RQcmVmZXJyZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBuZXdJc1N1cGVyQWRtaW4gPVxuICAgICAgICAgICAgcmVzcG9uc2UucGVybWlzc2lvbnM/LmluY2x1ZGVzKCcqOionKSB8fCBwYXJzZWRUb2tlbj8uYWRtaW4gPT09IHRydWUgfHwgZmFsc2U7XG4gICAgICAgICAgY29uc3QgbmV3Um9sZXMgPSByZXNwb25zZS5yb2xlcyA/PyB0aGlzLnN0YXRlKCkucm9sZXM7XG4gICAgICAgICAgY29uc3QgbmV3UGVybXMgPSByZXNwb25zZS5wZXJtaXNzaW9ucyA/PyB0aGlzLnN0YXRlKCkucGVybWlzc2lvbnM7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUGVybWlzc2lvbnMobmV3Um9sZXMsIG5ld1Blcm1zLCBuZXdJc1N1cGVyQWRtaW4pO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVBlcm1pc3Npb25zKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbklkOiAnJyxcbiAgICAgICAgICAgIHJvbGVzOiBuZXdSb2xlcyxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBuZXdQZXJtcyxcbiAgICAgICAgICAgIGlzU3VwZXJBZG1pbjogbmV3SXNTdXBlckFkbWluLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnPy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uICYmIHJlc3BvbnNlLmZpcmViYXNlVG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2lnbkluV2l0aEZpcmViYXNlKHJlc3BvbnNlLmZpcmViYXNlVG9rZW4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcbiAgICAgICAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7XG4gICAgICAgICAgICB0eXBlOiAnVE9LRU5fUkVGUkVTSCcsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZS5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgICAgcmVmcmVzaFRva2VuOiByZXNwb25zZS5yZWZyZXNoVG9rZW4sIC8vIE5VRVZPOiBzaW5jcm9uaXphciBlbnRyZSB0YWJzXG4gICAgICAgICAgICAgIGV4cGlyZXNBdCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICAvLyBEbyBOT1QgY2FsbCBsb2dvdXQoKSBoZXJlIOKAlCBjYWxsZXJzIGRlY2lkZSB3aGF0IHRvIGRvIG9uIGZhaWx1cmUuXG4gICAgICAgICAgLy8gVGhlIGF1dGggaW50ZXJjZXB0b3IgYWxyZWFkeSBjYWxscyBsb2dvdXQoKSBleHBsaWNpdGx5LCBhbmRcbiAgICAgICAgICAvLyBpbml0aWFsaXplKCkgb25seSBjbGVhcnMgc3RhdGUgKG5vIHJlZGlyZWN0KS4gQXV0by1uYXZpZ2F0aW5nIHRvXG4gICAgICAgICAgLy8gL2xvZ2luIGZyb20gdGhpcyBtZXRob2QgcmVkaXJlY3RzIGV2ZW4gdXNlcnMgb24gcHVibGljIHJvdXRlcy5cbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICAgIH0pLFxuICAgICAgICAvLyBMaWJlcmFyIGVsIHNsb3QgYWwgdGVybWluYXIgKMOpeGl0bywgZXJyb3IgbyB0aW1lb3V0KSBwYXJhIHF1ZSBlbFxuICAgICAgICAvLyBwcsOzeGltbyByZWZyZXNoIHJlYWwgYXJyYW5xdWUgdW5vIG51ZXZvLlxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbkZsaWdodFJlZnJlc2gkID0gbnVsbDtcbiAgICAgICAgfSksXG4gICAgICAgIC8vIE11bHRpY2FzdDogbG9zIHNpZGUtZWZmZWN0cyBkZWwgdGFwIGNvcnJlbiBVTkEgdmV6IHkgdG9kb3MgbG9zIGNhbGxlcnNcbiAgICAgICAgLy8gY29uY3VycmVudGVzIHJlY2liZW4gbGEgbWlzbWEgcmVzcHVlc3RhL2Vycm9yLiByZWZDb3VudDpmYWxzZSDihpIgcXVlIHVuXG4gICAgICAgIC8vIGNhbGxlciBzZSBkZXN1c2NyaWJlIHRlbXByYW5vIE5PIGNhbmNlbGEgbGEgcm90YWNpw7NuIGRlIHRva2VuIGVuIHZ1ZWxvLlxuICAgICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiBmYWxzZSB9KVxuICAgICAgKTtcblxuICAgIHJldHVybiB0aGlzLmluRmxpZ2h0UmVmcmVzaCQ7XG4gIH1cblxuICAvKipcbiAgICogTWFuZWphIGF1dGVudGljYWNpw7NuIGV4aXRvc2EgZGVzZGUgZnVlbnRlcyBleHRlcm5hcyAoT0F1dGgsIGV0YykuXG4gICAqIEd1YXJkYSB0b2tlbnMsIGFjdHVhbGl6YSBlc3RhZG8sIGluaWNpYSBGaXJlYmFzZSBzaSBjb3JyZXNwb25kZS5cbiAgICpcbiAgICogQHBhcmFtIGF1dGhSZXN1bHQgLSBSZXN1bHRhZG8gZGUgYXV0ZW50aWNhY2nDs24gY29uIHRva2Vuc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlc2RlIHVuIGZsdWpvIE9BdXRoIGV4dGVybm9cbiAgICogZXh0ZXJuYWxPQXV0aC5zaWduSW4oKS5zdWJzY3JpYmUoe1xuICAgKiAgIG5leHQ6IChyZXN1bHQpID0+IHtcbiAgICogICAgIHRoaXMuYXV0aFNlcnZpY2Uuc2V0RXh0ZXJuYWxBdXRoKHJlc3VsdCk7XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBzZXRFeHRlcm5hbEF1dGgoYXV0aFJlc3VsdDoge1xuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gICAgZmlyZWJhc2VUb2tlbj86IHN0cmluZztcbiAgICBleHBpcmVzSW46IG51bWJlcjtcbiAgICByb2xlcz86IHN0cmluZ1tdO1xuICAgIHBlcm1pc3Npb25zPzogc3RyaW5nW107XG4gIH0pOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHtcbiAgICAgIC4uLmF1dGhSZXN1bHQsXG4gICAgICBvcGVyYXRpb25JZDogJ2V4dGVybmFsLWF1dGgnLFxuICAgICAgdG9rZW5UeXBlOiAnQmVhcmVyJyxcbiAgICB9IGFzIFNpZ25pblJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaWVycmEgc2VzacOzbiB0cmFzIHBlZGlyIGNvbmZpcm1hY2nDs24gYWwgdXN1YXJpby5cbiAgICpcbiAgICogTXVlc3RyYSB1biBkacOhbG9nbyBuYXRpdm8gKGVzdGlsbyBkZXN0cnVjdGl2bykuIFNpIGVsIHVzdWFyaW8gY29uZmlybWEsXG4gICAqIGVqZWN1dGEgYGxvZ291dCgpYC4gU2kgY2FuY2VsYSwgbm8gcGFzYSBuYWRhLlxuICAgKlxuICAgKiBUZXh0byBwb3IgZGVmZWN0byBkZXNkZSBgX2dsb2JhbGAgaTE4bjogYGxvZ291dENvbmZpcm1UaXRsZWAsXG4gICAqIGBsb2dvdXRDb25maXJtTWVzc2FnZWAsIGBsb2dvdXRgLCBgY2FuY2VsYC4gT3ZlcnJpZGUgdmlhIGBvcHRzYC5cbiAgICpcbiAgICogQHJldHVybnMgdHJ1ZSBzaSBlbCB1c3VhcmlvIGNvbmZpcm3DsyAobG9nb3V0IGVqZWN1dGFkbyksIGZhbHNlIHNpIGNhbmNlbMOzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBvbkxvZ291dENsaWNrKCkgeyB0aGlzLmF1dGgubG9nb3V0V2l0aENvbmZpcm1hdGlvbigpOyB9XG4gICAqL1xuICBhc3luYyBsb2dvdXRXaXRoQ29uZmlybWF0aW9uKG9wdHM/OiB7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgbWVzc2FnZT86IHN0cmluZztcbiAgICBjb25maXJtVGV4dD86IHN0cmluZztcbiAgICBjYW5jZWxUZXh0Pzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdCA9IChrZXk6IHN0cmluZywgZmFsbGJhY2s6IHN0cmluZykgPT4gdGhpcy5pMThuU2VydmljZT8udChrZXkpIHx8IGZhbGxiYWNrO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtRGVzdHJ1Y3RpdmUoe1xuICAgICAgdGl0bGU6IG9wdHM/LnRpdGxlID8/IHQoJ2xvZ291dENvbmZpcm1UaXRsZScsICdDZXJyYXIgc2VzacOzbicpLFxuICAgICAgbWVzc2FnZTogb3B0cz8ubWVzc2FnZSA/PyB0KCdsb2dvdXRDb25maXJtTWVzc2FnZScsICfCv1NlZ3VybyBxdWUgZGVzZWFzIGNlcnJhciBzZXNpw7NuPycpLFxuICAgICAgY29uZmlybUJ1dHRvbjogeyB0ZXh0OiBvcHRzPy5jb25maXJtVGV4dCA/PyB0KCdsb2dvdXQnLCAnQ2VycmFyIHNlc2nDs24nKSB9LFxuICAgICAgY2FuY2VsQnV0dG9uOiB7IHRleHQ6IG9wdHM/LmNhbmNlbFRleHQgPz8gdCgnY2FuY2VsJywgJ0NhbmNlbGFyJykgfSxcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQuY29uZmlybWVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvZ291dCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaWVycmEgc2VzacOzbi5cbiAgICovXG4gIGFzeW5jIGxvZ291dChvcHRpb25zOiB7IHJlZGlyZWN0PzogYm9vbGVhbjsgYnJvYWRjYXN0PzogYm9vbGVhbiB9ID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZWRpcmVjdCA9IG9wdGlvbnMucmVkaXJlY3QgPz8gIXRoaXMuaXNDdXJyZW50Um91dGVQdWJsaWMoKTtcbiAgICBjb25zdCBicm9hZGNhc3QgPSBvcHRpb25zLmJyb2FkY2FzdCA/PyB0cnVlO1xuXG4gICAgLy8gRWxpbWluYXIgZGlzcG9zaXRpdm8gZGVsIGJhY2tlbmQgYW50ZXMgZGUgY2VycmFyIHNlc2nDs25cbiAgICBhd2FpdCB0aGlzLnVucmVnaXN0ZXJEZXZpY2UoKTtcblxuICAgIC8vIE5vdGlmaWNhciBhbCBiYWNrZW5kIChmaXJlIGFuZCBmb3JnZXQpLiBILTA1IHNhbWUtc2l0ZS1hd2FyZTogZW4gc2FtZS1zaXRlXG4gICAgLy8gZWwgcmVmcmVzaCB2YSBwb3IgbGEgY29va2llIEh0dHBPbmx5OyBlbiBjcm9zcy1zaXRlIHNlIG1hbmRhIGVuIGVsIGJvZHkuXG4gICAgLy8gd2l0aENyZWRlbnRpYWxzIGFkanVudGEgbGEgY29va2llOyBlbCBiYWNrZW5kIHJldm9jYSBsYSBzZXNpw7NuICsgbGEgZXhwaXJhLlxuICAgIGNvbnN0IGJvZHkgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmNvb2tpZU9ubHkgPyB7fSA6IHsgcmVmcmVzaFRva2VuOiB0aGlzLnN0YXRlKCkucmVmcmVzaFRva2VuIH07XG4gICAgdGhpcy5odHRwXG4gICAgICAucG9zdChgJHt0aGlzLmJhc2VVcmx9L2xvZ291dGAsIGJvZHksIHsgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSlcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIC8vIENlcnJhciBzZXNpw7NuIGRlIEZpcmViYXNlIHNpIGVzdMOhIGludGVncmFkb1xuICAgIHRoaXMuc2lnbk91dEZpcmViYXNlKCk7XG5cbiAgICB0aGlzLmNsZWFyU3RhdGUoKTtcbiAgICBpZiAoYnJvYWRjYXN0KSB7XG4gICAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7IHR5cGU6ICdMT0dPVVQnIH0pO1xuICAgIH1cbiAgICBpZiAocmVkaXJlY3QpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmNvbmZpZz8ubG9naW5Sb3V0ZV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNRkEgU0VUVVAgKHVzdWFyaW8gYXV0ZW50aWNhZG8pXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmEgTUZBIHBhcmEgZWwgdXN1YXJpby5cbiAgICovXG4gIHNldHVwTUZBKG1ldGhvZDogTUZBTWV0aG9kLCBwaG9uZT86IHN0cmluZyk6IE9ic2VydmFibGU8TUZBU2V0dXBSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PE1GQVNldHVwUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3NldHVwYCwgeyBtZXRob2QsIHBob25lIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm1hIGxhIGNvbmZpZ3VyYWNpw7NuIGRlIE1GQS5cbiAgICovXG4gIGNvbmZpcm1NRkEoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxNRkFDb25maXJtUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFDb25maXJtUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL2NvbmZpcm1gLCB7IGNvZGUgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogRGVzaGFiaWxpdGEgTUZBLiBBY2VwdGEgYHBhc3N3b3JkYCBvIGBtZmFDb2RlYCAodW5vIHJlcXVlcmlkbykuXG4gICAqIGBtZmFDb2RlYCBlcyBwYXJhIHVzdWFyaW9zIE9BdXRoLW9ubHkgY29uIFRPVFAgcXVlIG5vIHRpZW5lbiBjb250cmFzZcOxYS5cbiAgICovXG4gIGRpc2FibGVNRkEoaW5wdXQ6IE1GQURpc2FibGVSZXF1ZXN0KTogT2JzZXJ2YWJsZTxNRkFEaXNhYmxlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFEaXNhYmxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL2Rpc2FibGVgLCBpbnB1dClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICBzZW5kTUZBRGlzYWJsZUNvZGUoKTogT2JzZXJ2YWJsZTx7IG9wZXJhdGlvbklkOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PHsgb3BlcmF0aW9uSWQ6IHN0cmluZyB9PihgJHt0aGlzLmJhc2VVcmx9L21mYS9kaXNhYmxlLWNvZGVgLCB7fSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVE9UUCBNRkEgKEdvb2dsZSBBdXRoZW50aWNhdG9yKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pY2lhIGNvbmZpZ3VyYWNpw7NuIGRlIFRPVFAgTUZBLlxuICAgKiBSZXRvcm5hIGVsIHNlY3JldG8sIFVSTCBwYXJhIFFSIGNvZGUgeSBjw7NkaWdvcyBkZSByZXNwYWxkby5cbiAgICovXG4gIHNldHVwVE9UUCgpOiBPYnNlcnZhYmxlPFRPVFBTZXR1cFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8VE9UUFNldHVwUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3RvdHAvc2V0dXBgLCB7fSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2EgZWwgY8OzZGlnbyBUT1RQIHkgYWN0aXZhIE1GQS5cbiAgICogRGViZSBsbGFtYXJzZSBkZXNwdcOpcyBkZSBzZXR1cFRPVFAgY29uIGVsIGPDs2RpZ28gZGVsIGF1dGhlbnRpY2F0b3IuXG4gICAqL1xuICB2ZXJpZnlUT1RQU2V0dXAoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxUT1RQVmVyaWZ5U2V0dXBSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFRPVFBWZXJpZnlTZXR1cFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS90b3RwL3ZlcmlmeWAsIHsgY29kZSB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdlbmVyYSBsb3MgY8OzZGlnb3MgZGUgcmVzcGFsZG8gVE9UUC5cbiAgICogTG9zIGPDs2RpZ29zIGFudGVyaW9yZXMgc29uIGludmFsaWRhZG9zLlxuICAgKi9cbiAgcmVnZW5lcmF0ZUJhY2t1cENvZGVzKCk6IE9ic2VydmFibGU8UmVnZW5lcmF0ZUJhY2t1cENvZGVzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxSZWdlbmVyYXRlQmFja3VwQ29kZXNSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvdG90cC9iYWNrdXAtY29kZXNgLCB7fSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsYSBjYW50aWRhZCBkZSBjw7NkaWdvcyBkZSByZXNwYWxkbyByZXN0YW50ZXMuXG4gICAqL1xuICBnZXRCYWNrdXBDb2Rlc0NvdW50KCk6IE9ic2VydmFibGU8QmFja3VwQ29kZXNDb3VudFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldDxCYWNrdXBDb2Rlc0NvdW50UmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3RvdHAvYmFja3VwLWNvZGVzL2NvdW50YClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogRGVzYWN0aXZhIFRPVFAgTUZBIChyZXF1aWVyZSBjb250cmFzZcOxYSkuXG4gICAqL1xuICBkaXNhYmxlVE9UUChwYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxUT1RQRGlzYWJsZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8VE9UUERpc2FibGVSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvdG90cC9kaXNhYmxlYCwgeyBwYXNzd29yZCB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPUkdBTklaQUNJT05FU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQ2FtYmlhIGxhIG9yZ2FuaXphY2nDs24gYWN0aXZhIGRlbCB1c3VhcmlvLlxuICAgKiBHZW5lcmEgdW4gbnVldm8gRmlyZWJhc2UgdG9rZW4gY29uIGVsIGFjdGl2ZU9yZyBhY3R1YWxpemFkby5cbiAgICpcbiAgICogQHBhcmFtIG9yZ2FuaXphdGlvbklkIC0gSUQgZGUgbGEgb3JnYW5pemFjacOzbiBhIGxhIHF1ZSBjYW1iaWFyXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgY29uIGVsIG51ZXZvIEZpcmViYXNlIHRva2VuIHkgYWN0aXZlT3JnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hdXRoLnN3aXRjaE9yZygnb3JnX3h5ejc4OScpKTtcbiAgICogLy8gRmlyZWJhc2UgeWEgZXN0w6EgcmUtYXV0ZW50aWNhZG8gY29uIGxhIG51ZXZhIG9yZ1xuICAgKiBjb25zdCBhY3RpdmVPcmcgPSBhd2FpdCB0aGlzLmZpcmViYXNlLmdldEFjdGl2ZU9yZygpO1xuICAgKiBgYGBcbiAgICovXG4gIHN3aXRjaE9yZyhvcmdhbml6YXRpb25JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTd2l0Y2hPcmdSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxTd2l0Y2hPcmdSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9zd2l0Y2gtb3JnYCwgeyBvcmdhbml6YXRpb25JZCB9KS5waXBlKFxuICAgICAgc3dpdGNoTWFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgLy8gUmUtYXV0ZW50aWNhciBlbiBGaXJlYmFzZSBjb24gZWwgbnVldm8gdG9rZW5cbiAgICAgICAgLy8gVXNhciBzd2l0Y2hNYXAgKyBmcm9tIHBhcmEgZXNwZXJhciBhIHF1ZSBGaXJlYmFzZSBjb21wbGV0ZVxuICAgICAgICBjb25zdCBmaXJlYmFzZUF1dGgkID0gcmVzcG9uc2UuZmlyZWJhc2VUb2tlblxuICAgICAgICAgID8gZnJvbSh0aGlzLnNpZ25JbldpdGhGaXJlYmFzZShyZXNwb25zZS5maXJlYmFzZVRva2VuKSlcbiAgICAgICAgICA6IG9mKHVuZGVmaW5lZCk7XG5cbiAgICAgICAgcmV0dXJuIGZpcmViYXNlQXV0aCQucGlwZShcbiAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQWN0dWFsaXphciBhY3RpdmVPcmcgZW4gZWwgc3RhdGUgbG9jYWxcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjdGl2ZU9yZyhyZXNwb25zZS5hY3RpdmVPcmcpO1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlQWN0aXZlT3JnKHJlc3BvbnNlLmFjdGl2ZU9yZyk7XG4gICAgICAgICAgICAvLyBQZXJzaXN0aXIgZWwgbnVldm8gYWNjZXNzIHRva2VuIChpbmNsdXllIGFjdGl2ZU9yZyBhY3R1YWxpemFkbykuXG4gICAgICAgICAgICAvLyBTaW4gZXN0bywgZWwgYm9vdHN0cmFwIHBvc3QtcmVmcmVzaCB1c2EgZWwgSldUIGNhY2hlYWRvIGNvbiBsYSBvcmcgYW50ZXJpb3IuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIChyZXNwb25zZS5leHBpcmVzSW4gPz8gOTAwKSAqIDEwMDA7XG4gICAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjY2Vzc1Rva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuLCByZXNwb25zZS5leHBpcmVzSW4gPz8gOTAwKTtcbiAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlQWNjZXNzVG9rZW4ocmVzcG9uc2UuYWNjZXNzVG9rZW4sIGV4cGlyZXNBdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBOb3RpZmljYXIgY2FtYmlvIGEgb3RyYXMgcGVzdGHDsWFzXG4gICAgICAgICAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdPUkdfU1dJVENIJyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogeyBhY3RpdmVPcmc6IHJlc3BvbnNlLmFjdGl2ZU9yZyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgLy8gUmV0b3JuYXIgcmVzcG9uc2Ugb3JpZ2luYWwgZGVzcHXDqXMgZGUgcXVlIEZpcmViYXNlIGNvbXBsZXRlXG4gICAgICAgICAgbWFwKCgpID0+IHJlc3BvbnNlKVxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBFUkZJTCBERSBVU1VBUklPXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGVsIHBlcmZpbCBkZWwgdXN1YXJpbyBhdXRlbnRpY2Fkby5cbiAgICogSW5jbHV5ZSBpbmZvcm1hY2nDs24gZGUgTUZBIHkgdGVsw6lmb25vLiBIaWRyYXRhIGVsIHN0YXRlIGF1dG9tw6F0aWNhbWVudGVcbiAgICogY29uIGBuYW1lL2hhbmRsZS9hdmF0YXJVcmwvcGhvbmVgIHBhcmEgcXVlIGBhdXRoLnVzZXIoKWAgbG9zIHJldG9ybmUuXG4gICAqL1xuICBnZXRQcm9maWxlKCk6IE9ic2VydmFibGU8R2V0UHJvZmlsZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8R2V0UHJvZmlsZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Byb2ZpbGVgKS5waXBlKFxuICAgICAgdGFwKHByb2ZpbGUgPT5cbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUHJvZmlsZUZpZWxkcyh7XG4gICAgICAgICAgbmFtZTogcHJvZmlsZS5uYW1lLFxuICAgICAgICAgIGhhbmRsZTogcHJvZmlsZS5oYW5kbGUgPz8gbnVsbCxcbiAgICAgICAgICBhdmF0YXJVcmw6IHByb2ZpbGUuYXZhdGFyVXJsID8/IG51bGwsXG4gICAgICAgICAgcGhvbmU6IHByb2ZpbGUucGhvbmUgPz8gbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdHVhbGl6YSBlbCBwZXJmaWwgZGVsIHVzdWFyaW8uIFNpbmNyb25pemEgc3RhdGUgY29uIGxvcyBudWV2b3MgdmFsdWVzXG4gICAqIChuYW1lL3Bob25lKSDigJQgZWwgYmFja2VuZCByZXNwb25zZSBubyBsb3MgZWNobydhIHBlcm8gZWwgY2FsbGVyIHlhIHRpZW5lXG4gICAqIGxvcyB2YWxvcmVzIHF1ZSBtYW5kw7MuXG4gICAqL1xuICB1cGRhdGVQcm9maWxlKHJlcXVlc3Q6IFVwZGF0ZVByb2ZpbGVSZXF1ZXN0KTogT2JzZXJ2YWJsZTxVcGRhdGVQcm9maWxlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxVcGRhdGVQcm9maWxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcHJvZmlsZWAsIHJlcXVlc3QpLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUHJvZmlsZUZpZWxkcyhyZXF1ZXN0KSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdHVhbGl6YSBlbCBhdmF0YXIgZGVsIHVzdWFyaW8gZW4gZWwgYmFja2VuZC4gU2luY3Jvbml6YSBzdGF0ZSBjb24gZWxcbiAgICogYGF2YXRhclVybGAgcmV0b3JuYWRvIHBhcmEgcXVlIGVsIGhlYWRlciAvIGRhc2hib2FyZCBzZSByZWZyZXNxdWVuIHNpblxuICAgKiBuZWNlc2lkYWQgZGUgdW4gZ2V0UHJvZmlsZSBhZGljaW9uYWwuXG4gICAqL1xuICB1cGRhdGVBdmF0YXIocmVxdWVzdDogVXBkYXRlQXZhdGFyUmVxdWVzdCk6IE9ic2VydmFibGU8VXBkYXRlQXZhdGFyUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxVcGRhdGVBdmF0YXJSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9wcm9maWxlL2F2YXRhcmAsIHJlcXVlc3QpLnBpcGUoXG4gICAgICB0YXAocmVzID0+IHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVByb2ZpbGVGaWVsZHMoeyBhdmF0YXJVcmw6IHJlcy5hdmF0YXJVcmwgfSkpLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSRUNVUEVSQUNJw5NOIERFIENPTlRSQVNFw5FBXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbmljaWEgZWwgcHJvY2VzbyBkZSByZWN1cGVyYWNpw7NuIGRlIGNvbnRyYXNlw7FhLlxuICAgKiBFbnbDrWEgdW4gY8OzZGlnbyBhbCBlbWFpbCBkZWwgdXN1YXJpby5cbiAgICovXG4gIGZvcmdvdFBhc3N3b3JkKHJlcXVlc3Q6IEZvcmdvdFBhc3N3b3JkUmVxdWVzdCk6IE9ic2VydmFibGU8Rm9yZ290UGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PEZvcmdvdFBhc3N3b3JkUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vZm9yZ290LXBhc3N3b3JkYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRlYSBsYSBjb250cmFzZcOxYSB1c2FuZG8gZWwgY8OzZGlnbyBlbnZpYWRvIHBvciBlbWFpbC5cbiAgICovXG4gIHJlc2V0UGFzc3dvcmQocmVxdWVzdDogUmVzZXRQYXNzd29yZFJlcXVlc3QpOiBPYnNlcnZhYmxlPFJlc2V0UGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFJlc2V0UGFzc3dvcmRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9yZXNldC1wYXNzd29yZGAsIHJlcXVlc3QpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaWNpYSBlbCByZXNldCBkZSBNRkEgcG9yIGVtYWlsIGN1YW5kbyBlbCB1c2VyIHBlcmRpw7Mgc3UgMsK6IGZhY3RvclxuICAgKiAoVE9UUCArIGJhY2t1cCBjb2RlcykuIEVudsOtYSB1biBjw7NkaWdvIGRlIDYgZMOtZ2l0b3MgYWwgZW1haWwgdmVyaWZpY2Fkby5cbiAgICogUmVzcG9uc2Ugc2llbXByZSBnZW7DqXJpY2EgKGFudGktZW51bWVyYWNpw7NuKS5cbiAgICovXG4gIHJlcXVlc3RNRkFSZXNldChyZXF1ZXN0OiBNRkFSZXNldFJlcXVlc3RSZXF1ZXN0KTogT2JzZXJ2YWJsZTxNRkFSZXNldFJlcXVlc3RSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PE1GQVJlc2V0UmVxdWVzdFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS9yZXNldC1yZXF1ZXN0YCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlybWEgZWwgcmVzZXQgZGUgTUZBIGNvbiBlbCBjw7NkaWdvIHJlY2liaWRvIHBvciBlbWFpbCDihpIgZGVzaGFiaWxpdGEgTUZBLlxuICAgKiBUcmFzIGVzdG8gZWwgdXNlciBpbmljaWEgc2VzacOzbiBub3JtYWxtZW50ZSAoc2luIDLCuiBmYWN0b3IpIHkgcmUtZW5yb2xhLlxuICAgKi9cbiAgY29uZmlybU1GQVJlc2V0KHJlcXVlc3Q6IE1GQVJlc2V0Q29uZmlybVJlcXVlc3QpOiBPYnNlcnZhYmxlPE1GQVJlc2V0Q29uZmlybVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8TUZBUmVzZXRDb25maXJtUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3Jlc2V0YCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhIHVuYSBjdWVudGEgcHJlLWFwcm92aXNpb25hZGEgcG9yIHVuYSBvcmdhbml6YWNpw7NuIChBRFItMDIzKTogZGVmaW5lXG4gICAqIGxhIGNvbnRyYXNlw7FhIGNvbiBlbCB0b2tlbiBkZWwgZW5sYWNlIGRlIGVtYWlsLiBFbiDDqXhpdG8gZWwgYmFja2VuZCBkZXZ1ZWx2ZVxuICAgKiB0b2tlbnMgZGUgYXV0by1zaWduaW4g4oaSIGVsIHVzdWFyaW8gcXVlZGEgbG9ndWVhZG8gKG1pc21vIGZsdWpvIHF1ZSB2ZXJpZnktZW1haWwpLlxuICAgKi9cbiAgYWN0aXZhdGVBY2NvdW50KHJlcXVlc3Q6IEFjdGl2YXRlQWNjb3VudFJlcXVlc3QpOiBPYnNlcnZhYmxlPEFjdGl2YXRlQWNjb3VudFJlc3BvbnNlPiB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuICAgIC8vIHdpdGhDcmVkZW50aWFsczogYWN0aXZhdGUgYXV0by1sb2d1ZWEgeSBzZXRlYSBsYSBjb29raWUgSHR0cE9ubHkgZGUgcmVmcmVzaC5cbiAgICAvLyBTaW4gY3JlZGVuY2lhbGVzIGVsIGJyb3dzZXIgZGVzY2FydGEgZWwgU2V0LUNvb2tpZSDihpIgL3JlZnJlc2ggNDAwIChILTA1KS5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxBY3RpdmF0ZUFjY291bnRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9hY3RpdmF0ZWAsIHJlcXVlc3QsIHsgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UuYWN0aXZhdGVkICYmIHJlc3BvbnNlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHJlc3BvbnNlIGFzIHVua25vd24gYXMgU2lnbmluUmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW1iaWEgbGEgY29udHJhc2XDsWEgZGVsIHVzdWFyaW8gYXV0ZW50aWNhZG8uXG4gICAqIFJlcXVpZXJlIGxhIGNvbnRyYXNlw7FhIGFjdHVhbCBwYXJhIHZlcmlmaWNhY2nDs24uXG4gICAqL1xuICBjaGFuZ2VQYXNzd29yZChjdXJyZW50UGFzc3dvcmQ6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hhbmdlUGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3Q6IENoYW5nZVBhc3N3b3JkUmVxdWVzdCA9IHsgY3VycmVudFBhc3N3b3JkLCBuZXdQYXNzd29yZCB9O1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PENoYW5nZVBhc3N3b3JkUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vY2hhbmdlLXBhc3N3b3JkYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ0FNQklPIERFIEVNQUlMIOKAlCBmbHVqbyBkZSAzIHBhc29zXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGluaXRpYXRlRW1haWxDaGFuZ2UoXG4gICAgY3VycmVudFBhc3N3b3JkOiBzdHJpbmcsXG4gICAgbmV3RW1haWw6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPEluaXRpYXRlRW1haWxDaGFuZ2VSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3Q6IEluaXRpYXRlRW1haWxDaGFuZ2VSZXF1ZXN0ID0geyBjdXJyZW50UGFzc3dvcmQsIG5ld0VtYWlsIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8SW5pdGlhdGVFbWFpbENoYW5nZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2VtYWlsL2luaXRpYXRlYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICBjb25maXJtRW1haWxDaGFuZ2VTdGVwMShjb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENvbmZpcm1FbWFpbENoYW5nZVN0ZXAxUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0OiBDb25maXJtRW1haWxDaGFuZ2VTdGVwMVJlcXVlc3QgPSB7IGNvZGUgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxDb25maXJtRW1haWxDaGFuZ2VTdGVwMVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2VtYWlsL2NvbmZpcm0vMWAsIHJlcXVlc3QpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgY29uZmlybUVtYWlsQ2hhbmdlU3RlcDIoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxDb25maXJtRW1haWxDaGFuZ2VTdGVwMlJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdDogQ29uZmlybUVtYWlsQ2hhbmdlU3RlcDJSZXF1ZXN0ID0geyBjb2RlIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8Q29uZmlybUVtYWlsQ2hhbmdlU3RlcDJSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9lbWFpbC9jb25maXJtLzJgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFTElNSU5BQ0nDk04gREUgQ1VFTlRBXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBFbGltaW5hIGxhIGN1ZW50YSBkZWwgdXN1YXJpbyAoc29mdCBkZWxldGUpLlxuICAgKiBSZXF1aWVyZSBjb25maXJtYWNpw7NuIGRlIGNvbnRyYXNlw7FhIHBvciBzZWd1cmlkYWQuXG4gICAqIERlc3B1w6lzIGRlIGVsaW1pbmFyLCBjaWVycmEgc2VzacOzbiBhdXRvbcOhdGljYW1lbnRlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFzc3dvcmQgLSBDb250cmFzZcOxYSBhY3R1YWwgcGFyYSBjb25maXJtYXJcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBjb24gcmVzdWx0YWRvIGRlIGxhIGVsaW1pbmFjacOzblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIGNvbmZpcm1EZWxldGVBY2NvdW50KHBhc3N3b3JkOiBzdHJpbmcpIHtcbiAgICogICB0cnkge1xuICAgKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hdXRoLmRlbGV0ZUFjY291bnQocGFzc3dvcmQpKTtcbiAgICogICAgIGNvbnNvbGUubG9nKHJlc3VsdC5tZXNzYWdlKTsgLy8gXCJUdSBjdWVudGEgaGEgc2lkbyBlbGltaW5hZGEuLi5cIlxuICAgKiAgICAgLy8gVXN1YXJpbyBlcyByZWRpcmlnaWRvIGF1dG9tw6F0aWNhbWVudGUgYWwgbG9naW5cbiAgICogICB9IGNhdGNoIChlcnJvcikge1xuICAgKiAgICAgLy8gTWFuZWphciBlcnJvciAoY29udHJhc2XDsWEgaW5jb3JyZWN0YSwgZXRjKVxuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIC8qKlxuICAgKiBFbnbDrWEgdW4gY8OzZGlnbyBPVFAgYWwgZW1haWwgZGVsIHVzdWFyaW8gcGFyYSBjb25maXJtYXIgbGEgZWxpbWluYWNpw7NuLlxuICAgKiBTb2xvIGFwbGljYSBhIHVzdWFyaW9zIE9BdXRoIHNpbiBjb250cmFzZcOxYSAoYGhhc1Bhc3N3b3JkKCkgPT09IGZhbHNlYCkuXG4gICAqL1xuICBzZW5kRGVsZXRlQWNjb3VudENvZGUoKTogT2JzZXJ2YWJsZTxTZW5kRGVsZXRlQWNjb3VudENvZGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFNlbmREZWxldGVBY2NvdW50Q29kZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2FjY291bnQvZGVsZXRlLWNvZGVgLCB7fSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogRWxpbWluYSBsYSBjdWVudGEgZGVsIHVzdWFyaW8gKHNvZnQgZGVsZXRlKS5cbiAgICogLSBVc3VhcmlvcyBjb24gY29udHJhc2XDsWE6IHBhc2FyIGB7IHBhc3N3b3JkIH1gLlxuICAgKiAtIFVzdWFyaW9zIE9BdXRoIHNpbiBjb250cmFzZcOxYTogcGFzYXIgYHsgY29kZSB9YCAob2J0ZW5pZG8gdmlhIHNlbmREZWxldGVBY2NvdW50Q29kZSkuXG4gICAqIERlc3B1w6lzIGRlIGVsaW1pbmFyLCBjaWVycmEgc2VzacOzbiB5IHJlZGlyaWdlIGFsIGxvZ2luIGF1dG9tw6F0aWNhbWVudGUuXG4gICAqL1xuICBkZWxldGVBY2NvdW50KGNyZWRlbnRpYWxzOiB7XG4gICAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gICAgY29kZT86IHN0cmluZztcbiAgfSk6IE9ic2VydmFibGU8RGVsZXRlQWNjb3VudFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmRlbGV0ZTxEZWxldGVBY2NvdW50UmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vYWNjb3VudGAsIHsgYm9keTogY3JlZGVudGlhbHMgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5kZWxldGVkKSB7XG4gICAgICAgICAgICAvLyBMaW1waWFyIGVzdGFkbyB5IGNlcnJhciBzZXNpw7NuIHNpbiBub3RpZmljYXIgYWwgYmFja2VuZFxuICAgICAgICAgICAgLy8gKGxhIHNlc2nDs24geWEgZnVlIHJldm9jYWRhIHBvciBlbCBiYWNrZW5kKVxuICAgICAgICAgICAgdGhpcy5zaWduT3V0RmlyZWJhc2UoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5zeW5jU2VydmljZS5icm9hZGNhc3QoeyB0eXBlOiAnTE9HT1VUJyB9KTtcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmNvbmZpZz8ubG9naW5Sb3V0ZV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQRVJNSVNPU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT2J0aWVuZSBsb3MgcGVybWlzb3MgYWN0dWFsaXphZG9zIGRlbCBiYWNrZW5kLlxuICAgKi9cbiAgZmV0Y2hQZXJtaXNzaW9ucygpOiBPYnNlcnZhYmxlPEdldFBlcm1pc3Npb25zUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxHZXRQZXJtaXNzaW9uc1Jlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Blcm1pc3Npb25zYCkucGlwZShcbiAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVBlcm1pc3Npb25zKFxuICAgICAgICAgIHJlc3BvbnNlLnJvbGVzLFxuICAgICAgICAgIHJlc3BvbnNlLnBlcm1pc3Npb25zLFxuICAgICAgICAgIHJlc3BvbnNlLmlzU3VwZXJBZG1pblxuICAgICAgICApO1xuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVQZXJtaXNzaW9ucyhyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuc3luY1NlcnZpY2UuYnJvYWRjYXN0KHsgdHlwZTogJ1BFUk1JU1NJT05TX1VQREFURScgfSk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyB0aWVuZSB1biBwZXJtaXNvIGVzcGVjw61maWNvLlxuICAgKiBGb3JtYXRvOiBcInJlc291cmNlOmFjdGlvblwiIChlajogXCJ0ZW1wbGF0ZXM6ZWRpdFwiKVxuICAgKi9cbiAgaGFzUGVybWlzc2lvbihwZXJtaXNzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1N1cGVyQWRtaW4oKSkgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCBbcmVzb3VyY2UsIGFjdGlvbl0gPSBwZXJtaXNzaW9uLnNwbGl0KCc6Jyk7XG4gICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbnMoKS5zb21lKHAgPT4ge1xuICAgICAgY29uc3QgW3BSZXNvdXJjZSwgcEFjdGlvbl0gPSBwLnNwbGl0KCc6Jyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAocFJlc291cmNlID09PSAnKicgfHwgcFJlc291cmNlID09PSByZXNvdXJjZSkgJiYgKHBBY3Rpb24gPT09ICcqJyB8fCBwQWN0aW9uID09PSBhY3Rpb24pXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gdGllbmUgYWxndW5vIGRlIGxvcyBwZXJtaXNvcyBkYWRvcy5cbiAgICovXG4gIGhhc0FueVBlcm1pc3Npb24ocGVybWlzc2lvbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zLnNvbWUocCA9PiB0aGlzLmhhc1Blcm1pc3Npb24ocCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gdGllbmUgdG9kb3MgbG9zIHBlcm1pc29zIGRhZG9zLlxuICAgKi9cbiAgaGFzQWxsUGVybWlzc2lvbnMocGVybWlzc2lvbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zLmV2ZXJ5KHAgPT4gdGhpcy5oYXNQZXJtaXNzaW9uKHApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHRpZW5lIHVuIHJvbCBlc3BlY8OtZmljby5cbiAgICovXG4gIGhhc1JvbGUocm9sZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucm9sZXMoKS5zb21lKHIgPT4gci50b0xvd2VyQ2FzZSgpID09PSByb2xlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhBTkRMRSAoVVNFUk5BTUUpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBBY3R1YWxpemEgZWwgaGFuZGxlIChAdXNlcm5hbWUpIGRlbCB1c3VhcmlvLlxuICAgKiBAcGFyYW0gaGFuZGxlIC0gTnVldm8gaGFuZGxlIChzaW4gQCwgZWo6IFwidmljdG9ydlwiKVxuICAgKi9cbiAgdXBkYXRlSGFuZGxlKGhhbmRsZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxVcGRhdGVIYW5kbGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFVwZGF0ZUhhbmRsZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Byb2ZpbGUvaGFuZGxlYCwgeyBoYW5kbGUgfSkucGlwZShcbiAgICAgIHRhcCgoKSA9PiB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQcm9maWxlRmllbGRzKHsgaGFuZGxlIH0pKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgdW4gaGFuZGxlIGVzdMOhIGRpc3BvbmlibGUuXG4gICAqIEBwYXJhbSBoYW5kbGUgLSBIYW5kbGUgYSB2ZXJpZmljYXIgKHNpbiBAKVxuICAgKi9cbiAgY2hlY2tIYW5kbGVBdmFpbGFiaWxpdHkoaGFuZGxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoZWNrSGFuZGxlUmVzcG9uc2U+IHtcbiAgICAvLyBTZXJ2ZXIgcmVzcG9uc2U6IHsgb3BlcmF0aW9uSWQsIHVzZXI/LCBmb3VuZCB9LiBmb3VuZD10cnVlIOKGkiBoYW5kbGUgdGFrZW4uXG4gICAgLy8gTGliIHNlbWFudGljOiBhdmFpbGFibGUgPSAhZm91bmQuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldDx7XG4gICAgICAgIG9wZXJhdGlvbklkOiBzdHJpbmc7XG4gICAgICAgIGZvdW5kOiBib29sZWFuO1xuICAgICAgfT4oYCR7dGhpcy51c2Vyc0Jhc2VVcmx9L2hhbmRsZS8ke2VuY29kZVVSSUNvbXBvbmVudChoYW5kbGUpfWApXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKHJhdyA9PiAoe1xuICAgICAgICAgIG9wZXJhdGlvbklkOiByYXcub3BlcmF0aW9uSWQsXG4gICAgICAgICAgaGFuZGxlLFxuICAgICAgICAgIGF2YWlsYWJsZTogIXJhdy5mb3VuZCxcbiAgICAgICAgfSkpLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICAgICk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgZ2V0IGJhc2VVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5jb25maWc/LmFwaVVybH0ke3RoaXMuY29uZmlnPy5hdXRoUHJlZml4fWA7XG4gIH1cblxuICAvKiogQmFzZSBmb3IgL3YyL3VzZXJzIGVuZHBvaW50cyAoc2VwYXJhdGUgZnJvbSAvdjIvYXV0aCkuICovXG4gIHByaXZhdGUgZ2V0IHVzZXJzQmFzZVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmNvbmZpZz8uYXBpVXJsfS92Mi91c2Vyc2A7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHJlc3BvbnNlOiBTaWduaW5SZXNwb25zZSB8IE1GQVZlcmlmeVJlc3BvbnNlKTogdm9pZCB7XG4gICAgY29uc3QgZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIHJlc3BvbnNlLmV4cGlyZXNJbiEgKiAxMDAwO1xuICAgIGNvbnN0IHRva2VuRGF0YSA9IHRoaXMudG9rZW5TZXJ2aWNlLnBhcnNlVG9rZW4ocmVzcG9uc2UuYWNjZXNzVG9rZW4hKTtcbiAgICBjb25zdCBpc1ByZW1pdW0gPSB0b2tlbkRhdGE/LnByZW1pdW0gPT09IHRydWU7XG5cbiAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRBdXRoZW50aWNhdGVkKHtcbiAgICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZS5hY2Nlc3NUb2tlbiEsXG4gICAgICByZWZyZXNoVG9rZW46IHJlc3BvbnNlLnJlZnJlc2hUb2tlbiEsXG4gICAgICB1c2VySWQ6IHRva2VuRGF0YT8udWlkLFxuICAgICAgZW1haWw6IHRva2VuRGF0YT8uZW1haWwsXG4gICAgICByb2xlczogcmVzcG9uc2Uucm9sZXMgfHwgW10sXG4gICAgICBwZXJtaXNzaW9uczogcmVzcG9uc2UucGVybWlzc2lvbnMgfHwgW10sXG4gICAgICBpc1N1cGVyQWRtaW46IHJlc3BvbnNlLnBlcm1pc3Npb25zPy5pbmNsdWRlcygnKjoqJykgfHwgdG9rZW5EYXRhPy5hZG1pbiA9PT0gdHJ1ZSB8fCBmYWxzZSxcbiAgICAgIGlzUHJlbWl1bSxcbiAgICAgIGV4cGlyZXNBdCxcbiAgICB9KTtcblxuICAgIGlmICh0b2tlbkRhdGE/Lm9yZykge1xuICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKHRva2VuRGF0YS5vcmcpO1xuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlQWN0aXZlT3JnKHRva2VuRGF0YS5vcmcpO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVN0YXRlKHtcbiAgICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZS5hY2Nlc3NUb2tlbiEsXG4gICAgICByZWZyZXNoVG9rZW46IHJlc3BvbnNlLnJlZnJlc2hUb2tlbiEsXG4gICAgICByb2xlczogcmVzcG9uc2Uucm9sZXMgfHwgW10sXG4gICAgICBwZXJtaXNzaW9uczogcmVzcG9uc2UucGVybWlzc2lvbnMgfHwgW10sXG4gICAgICBpc1N1cGVyQWRtaW46IHJlc3BvbnNlLnBlcm1pc3Npb25zPy5pbmNsdWRlcygnKjoqJykgfHwgdG9rZW5EYXRhPy5hZG1pbiA9PT0gdHJ1ZSB8fCBmYWxzZSxcbiAgICAgIGlzUHJlbWl1bSxcbiAgICAgIGV4cGlyZXNBdCxcbiAgICB9KTtcblxuICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7IHR5cGU6ICdMT0dJTicgfSk7XG5cbiAgICAvLyBJbnRlZ3JhY2nDs24gY29uIEZpcmViYXNlXG4gICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gaGFuZGxlU3VjY2Vzc2Z1bEF1dGggLSBGaXJlYmFzZSBjaGVjazonLCB7XG4gICAgICBlbmFibGVGaXJlYmFzZUludGVncmF0aW9uOiB0aGlzLmNvbmZpZz8uZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbixcbiAgICAgIGhhc0ZpcmViYXNlVG9rZW5LZXk6ICdmaXJlYmFzZVRva2VuJyBpbiByZXNwb25zZSxcbiAgICAgIGZpcmViYXNlVG9rZW5WYWx1ZTogISEocmVzcG9uc2UgYXMgYW55KS5maXJlYmFzZVRva2VuLFxuICAgICAgZmlyZWJhc2VUb2tlbkxlbmd0aDogKHJlc3BvbnNlIGFzIGFueSkuZmlyZWJhc2VUb2tlbj8ubGVuZ3RoIHx8IDAsXG4gICAgfSk7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbmZpZz8uZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbiAmJlxuICAgICAgJ2ZpcmViYXNlVG9rZW4nIGluIHJlc3BvbnNlICYmXG4gICAgICByZXNwb25zZS5maXJlYmFzZVRva2VuXG4gICAgKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ1tWYWx0ZWNoQXV0aF0gQ2FsbGluZyBzaWduSW5XaXRoRmlyZWJhc2Ugd2l0aCB0b2tlbiBsZW5ndGg6JyxcbiAgICAgICAgcmVzcG9uc2UuZmlyZWJhc2VUb2tlbi5sZW5ndGhcbiAgICAgICk7XG4gICAgICB0aGlzLnNpZ25JbldpdGhGaXJlYmFzZShyZXNwb25zZS5maXJlYmFzZVRva2VuKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnPy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uKSB7XG4gICAgICAvLyBFbCBsb2dpbiBOTyB0cmFqbyBmaXJlYmFzZVRva2VuIChlai4gZmx1am8gT0F1dGggcXVlIGxvIHBlcmRpw7MpLiBFbiB2ZXpcbiAgICAgIC8vIGRlIHF1ZWRhciBzaW4gc2VzacOzbiBkZSBGaXJlYmFzZSwgcmVjdXJyaW1vcyBhbCBmYWxsYmFjayBzZWxmLWhlYWxpbmc6XG4gICAgICAvLyAvcmVmcmVzaCBzw60gZGV2dWVsdmUgdW4gZmlyZWJhc2VUb2tlbiBjb25maWFibGUuXG4gICAgICBjb25zb2xlLmxvZygnW0ZCQXV0aF0gbG9naW4gcmVzcG9uc2Ugc2luIGZpcmViYXNlVG9rZW4g4oaSIHJlY3VycmllbmRvIGEgZmFsbGJhY2sgL3JlZnJlc2gnKTtcbiAgICAgIHZvaWQgdGhpcy5yZWVzdGFibGlzaEZpcmViYXNlVmlhUmVmcmVzaCgnbG9naW4tbWlzc2luZy1maXJlYmFzZS10b2tlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWduaW4gc2tpcHBlZCAtIGludGVncmFjacOzbiBGaXJlYmFzZSBkZXNhY3RpdmFkYScpO1xuICAgIH1cblxuICAgIC8vIFJlZ2lzdHJvIGF1dG9tw6F0aWNvIGRlIGRpc3Bvc2l0aXZvIHBhcmEgcHVzaCBub3RpZmljYXRpb25zXG4gICAgaWYgKHRoaXMuY29uZmlnPy5lbmFibGVEZXZpY2VSZWdpc3RyYXRpb24pIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJEZXZpY2VJZk5lZWRlZCgpOyAvLyBmaXJlLWFuZC1mb3JnZXRcbiAgICB9XG5cbiAgICAvLyBTaW5jcm9uaXphciBpZGlvbWEgZGVsIHVzdWFyaW8gY29uIGkxOG5cbiAgICBpZiAodGhpcy5pMThuU2VydmljZSAmJiAnbGFuZ3VhZ2UnIGluIHJlc3BvbnNlICYmIHJlc3BvbnNlLmxhbmd1YWdlKSB7XG4gICAgICBjb25zdCB1c2VyTGFuZyA9IHJlc3BvbnNlLmxhbmd1YWdlIGFzIEkxOG5MYW5nO1xuICAgICAgY29uc3QgY3VycmVudExhbmcgPSB0aGlzLmkxOG5TZXJ2aWNlLmxhbmcoKTtcbiAgICAgIGlmICh1c2VyTGFuZyAhPT0gY3VycmVudExhbmcpIHtcbiAgICAgICAgdGhpcy5pMThuU2VydmljZS5zZXRMYW5ndWFnZSh1c2VyTGFuZyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbVmFsdGVjaEF1dGhdIExhbmd1YWdlIHN5bmNlZCB0bzogJHt1c2VyTGFuZ31gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMaXN0ZW5lciBGaXJlc3RvcmUgUkJBQyDigJQgb3B0LWluIHZpYSBlbmFibGVGaXJlc3RvcmVSQkFDOiB0cnVlXG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5zdGF0ZVNlcnZpY2Uuc3RhdGUoKS51c2VySWQ7XG4gICAgaWYgKHVzZXJJZCkge1xuICAgICAgdGhpcy5zZXR1cEZpcmVzdG9yZVJCQUNTeW5jKHVzZXJJZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFJlZnJlc2hUaW1lcigpO1xuICAgIHRoaXMudGVhcmRvd25GaXJlc3RvcmVSQkFDU3luYygpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlc2V0KCk7XG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5jbGVhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEZpcmVzdG9yZVJCQUNTeW5jKHVzZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uZW5hYmxlRmlyZXN0b3JlUkJBQyB8fCAhdGhpcy5maXJlc3RvcmVJbnN0YW5jZSkgcmV0dXJuO1xuICAgIHRoaXMudGVhcmRvd25GaXJlc3RvcmVSQkFDU3luYygpO1xuXG4gICAgaWYgKCF0aGlzLmZpcmViYXNlU2VydmljZSB8fCB0aGlzLmZpcmViYXNlU2VydmljZS5maXJlYmFzZUF1dGhSZWFkeSgpKSB7XG4gICAgICAvLyBGaXJlYmFzZSBub3QgdXNlZCBvciBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQg4oCUIGF0dGFjaCBsaXN0ZW5lciBub3cuXG4gICAgICB0aGlzLl9hdHRhY2hGaXJlc3RvcmVSQkFDTGlzdGVuZXIodXNlcklkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmlyZWJhc2UgQXV0aCBub3QgcmVhZHkgeWV0LiBGaXJlc3RvcmUgcGVybWlzc2lvbi1kZW5pZWQgZXJyb3JzIHRlcm1pbmF0ZVxuICAgICAgLy8gb25TbmFwc2hvdCBwZXJtYW5lbnRseSAobm8gYXV0b21hdGljIHJldHJ5IHdoZW4gYXV0aCBzdGF0ZSBjaGFuZ2VzKS5cbiAgICAgIC8vIFdhaXQgdW50aWwgdGhlIHVzZXIgaXMgYXV0aGVudGljYXRlZCwgdGhlbiBhdHRhY2guXG4gICAgICB0aGlzLmZpcmViYXNlU2VydmljZS5maXJlYmFzZUF1dGhSZWFkeSRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKHJlYWR5ID0+IHJlYWR5KSxcbiAgICAgICAgICB0YWtlKDEpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9hdHRhY2hGaXJlc3RvcmVSQkFDTGlzdGVuZXIodXNlcklkKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXR0YWNoRmlyZXN0b3JlUkJBQ0xpc3RlbmVyKHVzZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZG9jUmVmID0gZG9jKHRoaXMuZmlyZXN0b3JlSW5zdGFuY2UhLCAndXNlcnMnLCB1c2VySWQpO1xuICAgIHRoaXMuZmlyZXN0b3JlUkJBQ1Vuc3Vic2NyaWJlID0gb25TbmFwc2hvdChkb2NSZWYsIHNuYXAgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHNuYXAuZGF0YSgpO1xuICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG5cbiAgICAgIC8vIFN5bmMgZGUgcGVyZmlsIOKAlCBlbCBtaXJyb3IgRmlyZXN0b3JlIGAvdXNlcnMve3VpZH1gIGVzIGVsIGVzcGVqbyBjYW7Ds25pY29cbiAgICAgIC8vIHF1ZSBlbCBiYWNrZW5kIGVzY3JpYmUgKGBTeW5jUHJvZmlsZVRvRmlyZXN0b3JlYCkuIFJlZnJlc2NhciBhY8OhIG1hbnRpZW5lXG4gICAgICAvLyBgYXV0aC51c2VyKClgIFZJVk8gKGF2YXRhciBkZWwgaGVhZGVyLCBncmVldGluZywgZXRjLikgc2luIGRlcGVuZGVyIGRlIHVuXG4gICAgICAvLyBgZ2V0UHJvZmlsZSgpYCBtYW51YWw6IGVkaXRhciBlbCBwZXJmaWwgZW4gdW5hIHZpc3RhIHNlIHJlZmxlamEgZW4gdG9kYXNcbiAgICAgIC8vIChob21lIGluY2x1aWRvKSBlbiBjdWFudG8gZWwgYmFja2VuZCBhY3R1YWxpemEgZWwgbWlycm9yLlxuICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUHJvZmlsZUZpZWxkcyh7XG4gICAgICAgIG5hbWU6IGRhdGFbJ25hbWUnXSA/PyB1bmRlZmluZWQsXG4gICAgICAgIGhhbmRsZTogZGF0YVsnaGFuZGxlJ10gPz8gdW5kZWZpbmVkLFxuICAgICAgICBhdmF0YXJVcmw6IGRhdGFbJ2F2YXRhclVybCddID8/IHVuZGVmaW5lZCxcbiAgICAgICAgcGhvbmU6IGRhdGFbJ3Bob25lJ10gPz8gdW5kZWZpbmVkLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJiYWMgPSBkYXRhWydyYmFjJ107XG4gICAgICBpZiAoIXJiYWMpIHJldHVybjtcbiAgICAgIGNvbnN0IGFjdGl2ZU9yZyA9IHRoaXMuc3RhdGVTZXJ2aWNlLnN0YXRlKCkuYWN0aXZlT3JnO1xuICAgICAgaWYgKHJiYWNbJ2FjdGl2ZU9yZyddICYmIHJiYWNbJ2FjdGl2ZU9yZyddICE9PSBhY3RpdmVPcmcpIHJldHVybjtcbiAgICAgIGNvbnN0IHJvbGVzOiBzdHJpbmdbXSA9IHJiYWNbJ3JvbGVzJ10gPz8gW107XG4gICAgICBjb25zdCBwZXJtaXNzaW9uczogc3RyaW5nW10gPSByYmFjWydwZXJtaXNzaW9ucyddID8/IFtdO1xuICAgICAgLy8gUHJlc2VydmUgcGxhdGZvcm0gYWRtaW4gc3RhdHVzIGZyb20gSldUIOKAlCBGaXJlc3RvcmUgUkJBQyByZWZsZWN0cyBvcmctbGV2ZWxcbiAgICAgIC8vIHBlcm1pc3Npb25zIHdoaWNoIGRvbid0IGluY2x1ZGUgKjoqIGZvciBvcmdzIHRoZSBhZG1pbiBkb2Vzbid0IG93bi5cbiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5zdGF0ZVNlcnZpY2UuYWNjZXNzVG9rZW4oKTtcbiAgICAgIGNvbnN0IGp3dEFkbWluID0gdG9rZW4gPyB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHRva2VuKT8uYWRtaW4gPT09IHRydWUgOiBmYWxzZTtcbiAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVBlcm1pc3Npb25zKFxuICAgICAgICByb2xlcyxcbiAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgIHBlcm1pc3Npb25zLmluY2x1ZGVzKCcqOionKSB8fCBqd3RBZG1pblxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdGVhcmRvd25GaXJlc3RvcmVSQkFDU3luYygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maXJlc3RvcmVSQkFDVW5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMuZmlyZXN0b3JlUkJBQ1Vuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLmZpcmVzdG9yZVJCQUNVbnN1YnNjcmliZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFJlZnJlc2hUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BSZWZyZXNoVGltZXIoKTtcblxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZVNlcnZpY2Uuc3RhdGUoKTtcbiAgICBpZiAoIXN0YXRlLmV4cGlyZXNBdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVmcmVzaEJlZm9yZU1zID0gKHRoaXMuY29uZmlnPy5yZWZyZXNoQmVmb3JlRXhwaXJ5IHx8IDYwKSAqIDEwMDA7XG4gICAgY29uc3QgcmVmcmVzaEF0ID0gc3RhdGUuZXhwaXJlc0F0IC0gcmVmcmVzaEJlZm9yZU1zO1xuICAgIGNvbnN0IGRlbGF5ID0gcmVmcmVzaEF0IC0gRGF0ZS5ub3coKTtcblxuICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVySWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmxvZ291dCgpLFxuICAgICAgICB9KTtcbiAgICAgIH0sIGRlbGF5KTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLnJlZnJlc2hUb2tlbikge1xuICAgICAgLy8gVG9rZW4geWEgZGViZXLDrWEgcmVmcmVzY2Fyc2UsIGludGVudGFyIGFob3JhXG4gICAgICB0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpLnN1YnNjcmliZSh7XG4gICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmxvZ291dCgpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUmVmcmVzaFRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lcklkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWZyZXNoVGltZXJJZCk7XG4gICAgICB0aGlzLnJlZnJlc2hUaW1lcklkID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN5bmNFdmVudChldmVudDogQXV0aFN5bmNFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgY2FzZSAnTE9HSU4nOiB7XG4gICAgICAgIC8vIFJlY2FyZ2FyIGVzdGFkbyBkZXNkZSBzdG9yYWdlXG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkU3RhdGUoKTtcbiAgICAgICAgaWYgKHN0YXRlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UucmVzdG9yZUZyb21TdG9yYWdlKHN0YXRlKTtcbiAgICAgICAgICBjb25zdCBjbGFpbXMgPSB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHN0YXRlLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgICBpZiAoY2xhaW1zKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVVc2VySW5mbyhjbGFpbXMudWlkLCBjbGFpbXMuZW1haWwpO1xuICAgICAgICAgICAgaWYgKGNsYWltcy5vcmcpIHtcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKGNsYWltcy5vcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnN0YXJ0UmVmcmVzaFRpbWVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdUT0tFTl9SRUZSRVNIJzoge1xuICAgICAgICAvLyBSZWNhcmdhciBjcmVkZW5jaWFsZXMgZGVzZGUgc3RvcmFnZSBzb2xvIHNpIGNvcnJlc3BvbmRlbiBhIGxhIG1pc21hXG4gICAgICAgIC8vIG9yZyBkZSBlc3RhIHBlc3Rhw7FhLiBFbCBhY2Nlc3MgdG9rZW4gZXN0w6EgZW4gbG9jYWxTdG9yYWdlIHkgb3RyYVxuICAgICAgICAvLyBwZXN0YcOxYSBwdWVkZSByZWZyZXNjYXIgZW4gdW5hIG9yZyBkaXN0aW50YTsgZXNvIE5PIGRlYmUgY2FtYmlhciBlbFxuICAgICAgICAvLyBjb250ZXh0byB2aXNpYmxlIGFjdHVhbC4gUGFyYSBjYW1iaWFyIG9yZyBleGlzdGUgT1JHX1NXSVRDSC5cbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWRTdGF0ZSgpO1xuICAgICAgICBpZiAoc3RhdGUuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICBjb25zdCBjbGFpbXMgPSB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHN0YXRlLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50T3JnID1cbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnN0YXRlKCkuYWN0aXZlT3JnIHx8IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0QWN0aXZlT3JnKCk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRPcmcgJiYgY2xhaW1zPy5vcmcgJiYgY2xhaW1zLm9yZyAhPT0gY3VycmVudE9yZykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGBbVmFsdGVjaEF1dGhdIHN5bmMg4oCUIGlnbm9yaW5nIFRPS0VOX1JFRlJFU0ggZm9yIG9yZyAke2NsYWltcy5vcmd9OyBjdXJyZW50IHRhYiBvcmcgaXMgJHtjdXJyZW50T3JnfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UucmVzdG9yZUZyb21TdG9yYWdlKHN0YXRlKTtcbiAgICAgICAgICBpZiAoY2xhaW1zKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVVc2VySW5mbyhjbGFpbXMudWlkLCBjbGFpbXMuZW1haWwpO1xuICAgICAgICAgICAgaWYgKGNsYWltcy5vcmcpIHtcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKGNsYWltcy5vcmcpO1xuICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVBY3RpdmVPcmcoY2xhaW1zLm9yZywgeyBwZXJzaXN0UHJlZmVycmVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zdGFydFJlZnJlc2hUaW1lcigpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnTE9HT1VUJzpcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UucmVzZXQoKTtcbiAgICAgICAgdGhpcy5zdG9wUmVmcmVzaFRpbWVyKCk7XG4gICAgICAgIGlmICghdGhpcy5pc0N1cnJlbnRSb3V0ZVB1YmxpYygpKSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuY29uZmlnPy5sb2dpblJvdXRlXSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdQRVJNSVNTSU9OU19VUERBVEUnOiB7XG4gICAgICAgIGNvbnN0IHBlcm1zID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkUGVybWlzc2lvbnMoKTtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUGVybWlzc2lvbnMocGVybXMucm9sZXMsIHBlcm1zLnBlcm1pc3Npb25zLCBwZXJtcy5pc1N1cGVyQWRtaW4pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ09SR19TV0lUQ0gnOlxuICAgICAgICAvLyBPdHJhIHBlc3Rhw7FhIGNhbWJpw7MgZGUgb3JnYW5pemFjacOzbi4gTm8gcmVjYXJnYW1vcyBsYSBVUkwgYWN0dWFsOlxuICAgICAgICAvLyBwdWVkZSBzZXIgdW5hIHJ1dGEgb3JnLXNjb3BlZCAoZXZlbnRzLzppZCwgc2V0dGluZ3MgZGUgdW5hIG9yZywgZXRjLilcbiAgICAgICAgLy8gcXVlIHF1ZWRhIGludsOhbGlkYSBiYWpvIGxhIG51ZXZhIG9yZy4gVm9sdmVtb3MgYSBsYSBob21lIGF1dGVudGljYWRhLlxuICAgICAgICBpZiAoIXRoaXMuaXNDdXJyZW50Um91dGVQdWJsaWMoKSkge1xuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwodGhpcy5jb25maWc/LmhvbWVSb3V0ZSB8fCAnLycsIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnV0YXMgcMO6YmxpY2FzIGNvbXBhcnRpYmxlcyBubyBkZWJlbiBzZXIgc2VjdWVzdHJhZGFzIHBvciBldmVudG9zIGdsb2JhbGVzXG4gICAqIGRlIHNlc2nDs24uIFVuIGxvZ291dCBlbiBvdHJhIHBlc3Rhw7FhIG5vIGRlYmUgbWFuZGFyIGEgYC9sb2dpbmAgYSBhbGd1aWVuIHF1ZVxuICAgKiBlc3TDoSBjb21wcmFuZG8gcG9yIGAvYnV5Lzp0b2tlbmAsIG5pIHJvbXBlciB1biBsaW5rIGRlIHZlbmRlZG9yLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0N1cnJlbnRSb3V0ZVB1YmxpYygpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmVmaXhlcyA9IHRoaXMuY29uZmlnPy5wdWJsaWNSb3V0ZVByZWZpeGVzID8/IFtdO1xuICAgIGlmIChwcmVmaXhlcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJvdXRlci51cmwgfHwgJy8nO1xuICAgIGNvbnN0IHBhdGggPSBjdXJyZW50LnNwbGl0KCc/JylbMF0uc3BsaXQoJyMnKVswXSB8fCAnLyc7XG4gICAgcmV0dXJuIHByZWZpeGVzLnNvbWUocHJlZml4ID0+IHtcbiAgICAgIGlmICghcHJlZml4KSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gcHJlZml4LnN0YXJ0c1dpdGgoJy8nKSA/IHByZWZpeCA6IGAvJHtwcmVmaXh9YDtcbiAgICAgIHJldHVybiBwYXRoID09PSBub3JtYWxpemVkIHx8IHBhdGguc3RhcnRzV2l0aChgJHtub3JtYWxpemVkfS9gKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQXV0aEVycm9yKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSk6IE9ic2VydmFibGU8bmV2ZXI+IHtcbiAgICAvLyBgaW50ZXJwcmV0RXJyb3JgIChoZWxwZXIgY29tcGFydGlkbyBkZSBsYSBsaWIpIG5vcm1hbGl6YSBlbFxuICAgIC8vIEh0dHBFcnJvclJlc3BvbnNlIOKAlCBpbmNsdXllbmRvIGZhbGxvcyBkZSByZWQgKHN0YXR1cyAwKS4gQXBsYW5hbW9zIGFcbiAgICAvLyBBdXRoRXJyb3IgcGFyYSBtYW50ZW5lciBsYSBBUEkgcMO6YmxpY2EgZGUgQXV0aFNlcnZpY2UgZXN0YWJsZS5cbiAgICBjb25zdCBpbnRlcnByZXRlZCA9IGludGVycHJldEVycm9yKGVycm9yKTtcbiAgICBjb25zdCBhdXRoRXJyb3I6IEF1dGhFcnJvciA9IHtcbiAgICAgIGNvZGU6IGludGVycHJldGVkLmNvZGUsXG4gICAgICBtZXNzYWdlOiBpbnRlcnByZXRlZC5tZXNzYWdlLFxuICAgIH07XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0RXJyb3IoYXV0aEVycm9yKTtcbiAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBhdXRoRXJyb3IpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZJUkVCQVNFIElOVEVHUkFUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgYXN5bmMgc2lnbkluV2l0aEZpcmViYXNlKGZpcmViYXNlVG9rZW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFtGQkF1dGhdIGF1dGggZmxvdyDihpIgc2lnbkluV2l0aEZpcmViYXNlIGF0dGVtcHQgdG9rZW5MZW49JHtmaXJlYmFzZVRva2VuPy5sZW5ndGggPz8gMH0gYCArXG4gICAgICAgIGBmaXJlYmFzZVNlcnZpY2VQcmVzZW50PSR7ISF0aGlzLmZpcmViYXNlU2VydmljZX1gXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuZmlyZWJhc2VTZXJ2aWNlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlyZWJhc2VTZXJ2aWNlLnNpZ25JbldpdGhDdXN0b21Ub2tlbihmaXJlYmFzZVRva2VuKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRmlyZWJhc2Ugc2lnbmluIHN1Y2Nlc3NmdWwnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZVNlcnZpY2Ugbm90IHByb3ZpZGVkLiBBZGQgcHJvdmlkZVZhbHRlY2hGaXJlYmFzZSgpIHRvIHlvdXIgcHJvdmlkZXJzLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTm8gYmxvcXVlYXIgZWwgbG9naW4gcHJpbmNpcGFsIHNpIEZpcmViYXNlIGZhbGxhXG4gICAgICBjb25zb2xlLmVycm9yKCdbVmFsdGVjaEF1dGhdIEZpcmViYXNlIHNpZ25pbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2lnbk91dEZpcmViYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25maWc/LmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24pIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5maXJlYmFzZVNlcnZpY2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5maXJlYmFzZVNlcnZpY2Uuc2lnbk91dCgpO1xuICAgICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWdub3V0IHN1Y2Nlc3NmdWwnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWdub3JhciBlcnJvcmVzIGRlIEZpcmViYXNlIHNpZ25vdXRcbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWdub3V0IGZhaWxlZDonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLWVzdGFibGVjZSBsYSBzZXNpw7NuIGRlIEZpcmViYXNlIEF1dGggZW4gZWwgYm9vdHN0cmFwIGRlIGxhIGFwcCBjdWFuZG9cbiAgICogZWwgYWNjZXNzIHRva2VuIGRlIGxhIGFwcCBzaWd1ZSB2w6FsaWRvIChsYSByYW1hIGRlIGluaXRpYWxpemUoKSBxdWUgTk9cbiAgICogcGFzYSBwb3IgcmVmcmVzaCkuXG4gICAqXG4gICAqIEZpcmViYXNlIEF1dGggbWFudGllbmUgc3UgUFJPUElBIHNlc2nDs24gY29uIHBlcnNpc3RlbmNpYSBJbmRleGVkREJcbiAgICogaW5kZXBlbmRpZW50ZSBkZWwgc3RvcmFnZSBkZSB0b2tlbnMgZGUgbGEgYXBwLiBFbiB1biBuYXZlZ2Fkb3Igbm9ybWFsIGVzYVxuICAgKiBwZXJzaXN0ZW5jaWEgc2UgYXV0by1yZXN0YXVyYSBzb2xhOyBlbiB1bmEgUFdBIHN0YW5kYWxvbmUgZW4gaU9TIGVsXG4gICAqIGNvbnRlbmVkb3IgZGUgc3RvcmFnZSBubyBzb2JyZXZpdmUsIHkgYGZpcmViYXNlQXV0aFJlYWR5YCBzZSBxdWVkYSBlblxuICAgKiBgZmFsc2VgIGluZGVmaW5pZGFtZW50ZSDihpIgbG9zIGxpc3RlbmVycyBGaXJlc3RvcmUgY3VlbGdhbiAofjQwcyB0aW1lb3V0KS5cbiAgICpcbiAgICogRXN0cmF0ZWdpYTogZGFyIHVuYSB2ZW50YW5hIGNvcnRhIGEgbGEgYXV0by1yZXN0YXVyYWNpw7NuIGRlIEZpcmViYXNlIHksIHNpXG4gICAqIG5vIG9jdXJyZSwgZm9yemFyIHVuIGByZWZyZXNoQWNjZXNzVG9rZW4oKWAg4oCUIHF1ZSB5YSBoYWNlIGBzaWduSW5XaXRoRmlyZWJhc2VgXG4gICAqIGNvbiBlbCBgZmlyZWJhc2VUb2tlbmAgcXVlIGRldnVlbHZlIGAvcmVmcmVzaGAuXG4gICAqXG4gICAqIEZpcmUtYW5kLWZvcmdldDogc2UgaW52b2NhIGNvbiBgdm9pZGAgcGFyYSBubyBkZW1vcmFyIGBpbml0aWFsaXplKClgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVGaXJlYmFzZVNlc3Npb25PbkJvb3RzdHJhcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uIHx8ICF0aGlzLmZpcmViYXNlU2VydmljZSkgcmV0dXJuO1xuXG4gICAgLy8gRGFyIGEgbGEgcGVyc2lzdGVuY2lhIEluZGV4ZWREQiBwcm9waWEgZGUgRmlyZWJhc2UgQXV0aCB1bmEgb3BvcnR1bmlkYWRcbiAgICAvLyBkZSBhdXRvLXJlc3RhdXJhcnNlIChuYXZlZ2Fkb3Igbm9ybWFsKS4gRW4gdW5hIFBXQSBzdGFuZGFsb25lIGRlIGlPU1xuICAgIC8vIG5vcm1hbG1lbnRlIE5PIGxvIGhhcsOhLlxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAyNTAwKSk7XG5cbiAgICBpZiAodGhpcy5maXJlYmFzZVNlcnZpY2UuZmlyZWJhc2VBdXRoUmVhZHkoKSkge1xuICAgICAgY29uc29sZS5sb2coJ1tGQkF1dGhdIGJvb3RzdHJhcCDigJQgRmlyZWJhc2Ugc2Vzc2lvbiByZXN0b3JlZCBvbiBpdHMgb3duJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coXG4gICAgICAnW0ZCQXV0aF0gYm9vdHN0cmFwIOKAlCBzZXNzaW9uIHZhbGlkIGJ1dCBGaXJlYmFzZSBOT1QgcmVhZHkg4oaSIHJlY3VycmllbmRvIGEgZmFsbGJhY2snXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnJlZXN0YWJsaXNoRmlyZWJhc2VWaWFSZWZyZXNoKCdib290c3RyYXAtc2Vzc2lvbi1yZXN0b3JlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmFsbGJhY2sgc2VsZi1oZWFsaW5nIGRlIEZpcmViYXNlIEF1dGguIFBpZGUgdW4gZmlyZWJhc2VUb2tlbiBmcmVzY28gdsOtYVxuICAgKiBgL3JlZnJlc2hgIChxdWUgc8OtIGxvIGRldnVlbHZlIGRlIGZvcm1hIGNvbmZpYWJsZSkgeSwgZW4gw6l4aXRvLFxuICAgKiBgcmVmcmVzaEFjY2Vzc1Rva2VuKClgIHlhIGVqZWN1dGEgYHNpZ25JbldpdGhGaXJlYmFzZSgpYC5cbiAgICpcbiAgICogU2UgaW52b2NhIGN1YW5kbyB1biBwYXRoIGRlIGF1dGggZGVqw7MgbGEgc2VzacOzbiBkZSBGaXJlYmFzZSBzaW4gZXN0YWJsZWNlcjpcbiAgICogIC0gbG9naW4gT0F1dGgvcGFzc3dvcmQgcXVlIHZvbHZpw7Mgc2luIGBmaXJlYmFzZVRva2VuYCxcbiAgICogIC0gY29sZCBsYXVuY2ggZGUgUFdBIGlPUyBzaW4gcGVyc2lzdGVuY2lhIGRlIEZpcmViYXNlLlxuICAgKlxuICAgKiBgcmVhc29uYCBhcGFyZWNlIGVuIGxvcyBsb2dzIGBbRkJBdXRoXSBmYWxsYmFja2AgcGFyYSBwb2RlciBhdGVzdGlndWFyXG4gICAqIGRlc2RlIGVsIGRlYnVnLWNvbnNvbGUgcXXDqSBkaXNwYXLDsyBlbCBmYWxsYmFjay5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVlc3RhYmxpc2hGaXJlYmFzZVZpYVJlZnJlc2gocmVhc29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uIHx8ICF0aGlzLmZpcmViYXNlU2VydmljZSkgcmV0dXJuO1xuXG4gICAgY29uc29sZS5sb2coYFtGQkF1dGhdIGZhbGxiYWNrIOKAlCByZS1lc3RhYmxlY2llbmRvIEZpcmViYXNlIHbDrWEgL3JlZnJlc2ggKG1vdGl2bzogJHtyZWFzb259KWApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbRkJBdXRoXSBmYWxsYmFjayDigJQgL3JlZnJlc2ggT0ssIEZpcmViYXNlIHJlLWVzdGFibGVjaWRvIChtb3Rpdm86ICR7cmVhc29ufSlgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtGQkF1dGhdIGZhbGxiYWNrIOKAlCAvcmVmcmVzaCBmYWxsw7MgKG1vdGl2bzogJHtyZWFzb259KTpgLCBlKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gREVWSUNFIFJFR0lTVFJBVElPTiAoUHVzaCBOb3RpZmljYXRpb25zKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogU29saWNpdGEgcGVybWlzb3MgZGUgbm90aWZpY2FjacOzbiB5IHJlZ2lzdHJhIGVsIGRpc3Bvc2l0aXZvLlxuICAgKiBVc2FyIGN1YW5kbyBlbCB1c3VhcmlvIGFjZXB0YSByZWNpYmlyIG5vdGlmaWNhY2lvbmVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIG9uRW5hYmxlTm90aWZpY2F0aW9ucygpIHtcbiAgICogICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGguZW5hYmxlTm90aWZpY2F0aW9ucygpO1xuICAgKiAgIGlmIChyZXN1bHQuZ3JhbnRlZCkge1xuICAgKiAgICAgY29uc29sZS5sb2coJ05vdGlmaWNhY2lvbmVzIGhhYmlsaXRhZGFzJyk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZW5hYmxlTm90aWZpY2F0aW9ucygpOiBQcm9taXNlPEVuYWJsZU5vdGlmaWNhdGlvbnNSZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIE1lc3NhZ2luZ1NlcnZpY2Ugbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIHsgZ3JhbnRlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoIShhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuaXNTdXBwb3J0ZWQoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBQdXNoIG5vdGlmaWNhdGlvbnMgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgcmV0dXJuIHsgZ3JhbnRlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMubWVzc2FnaW5nU2VydmljZS5yZXF1ZXN0UGVybWlzc2lvbigpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiB7IGdyYW50ZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0cmFyIGRpc3Bvc2l0aXZvIGVuIGJhY2tlbmRcbiAgICBjb25zdCByZWdpc3RlcmVkID0gYXdhaXQgdGhpcy5yZWdpc3RlckRldmljZUlmTmVlZGVkKCk7XG5cbiAgICByZXR1cm4geyBncmFudGVkOiB0cnVlLCB0b2tlbiwgcmVnaXN0ZXJlZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2FjdGl2YSBsYXMgbm90aWZpY2FjaW9uZXMgcGFyYSBlc3RlIGRpc3Bvc2l0aXZvLlxuICAgKiBFbGltaW5hIGVsIHRva2VuIGRlbCBiYWNrZW5kIHkgZGUgRkNNLlxuICAgKiBVc2FyIGRlc2RlIHVuIHRvZ2dsZSBkZSBwcmVmZXJlbmNpYXMgY3VhbmRvIGVsIHVzdWFyaW8gZGVzYWN0aXZhIG5vdGlmaWNhY2lvbmVzLlxuICAgKlxuICAgKiBOT1RBOiBFc3RvIE5PIHJldm9jYSBlbCBwZXJtaXNvIGRlbCBuYXZlZ2Fkb3IgKGVsIHVzdWFyaW8gZGViZSBoYWNlcmxvIG1hbnVhbG1lbnRlXG4gICAqIGRlc2RlIGxhIGNvbmZpZ3VyYWNpw7NuIGRlbCBuYXZlZ2Fkb3IpLiBTb2xvIGVsaW1pbmEgZWwgcmVnaXN0cm8gZGVsIGRpc3Bvc2l0aXZvLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIG9uVG9nZ2xlTm90aWZpY2F0aW9ucyhlbmFibGVkOiBib29sZWFuKSB7XG4gICAqICAgaWYgKGVuYWJsZWQpIHtcbiAgICogICAgIGF3YWl0IHRoaXMuYXV0aC5lbmFibGVOb3RpZmljYXRpb25zKCk7XG4gICAqICAgfSBlbHNlIHtcbiAgICogICAgIGF3YWl0IHRoaXMuYXV0aC5kaXNhYmxlTm90aWZpY2F0aW9ucygpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGRpc2FibGVOb3RpZmljYXRpb25zKCk6IFByb21pc2U8eyBkaXNhYmxlZDogYm9vbGVhbiB9PiB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2luZ1NlcnZpY2UpIHtcbiAgICAgIHJldHVybiB7IGRpc2FibGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHRoaXMubWVzc2FnaW5nU2VydmljZS5jdXJyZW50VG9rZW47XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgLy8gRWxpbWluYXIgZGVsIGJhY2tlbmRcbiAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgICAucmVxdWVzdCgnREVMRVRFJywgYCR7dGhpcy5jb25maWc/LmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlcy9ieS10b2tlbmAsIHtcbiAgICAgICAgICAgICAgYm9keTogeyB0b2tlbiB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVsaW1pbmFyIHRva2VuIGRlIEZDTVxuICAgICAgICBhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZGVsZXRlVG9rZW4oKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gTm90aWZpY2F0aW9ucyBkaXNhYmxlZCcpO1xuICAgICAgICByZXR1cm4geyBkaXNhYmxlZDogdHJ1ZSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBkaXNhYmxlZDogZmFsc2UgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIEZhaWxlZCB0byBkaXNhYmxlIG5vdGlmaWNhdGlvbnM6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgZGlzYWJsZWQ6IGZhbHNlIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgZWwgZXN0YWRvIGFjdHVhbCBkZSBwZXJtaXNvcyBkZSBub3RpZmljYWNpw7NuLlxuICAgKlxuICAgKiBAcmV0dXJucyAnZ3JhbnRlZCcgfCAnZGVuaWVkJyB8ICdkZWZhdWx0JyB8ICd1bnN1cHBvcnRlZCdcbiAgICovXG4gIGdldE5vdGlmaWNhdGlvblBlcm1pc3Npb25TdGF0ZSgpOiBOb3RpZmljYXRpb25QZXJtaXNzaW9uU3RhdGUge1xuICAgIGlmICghdGhpcy5tZXNzYWdpbmdTZXJ2aWNlKSB7XG4gICAgICByZXR1cm4gJ3Vuc3VwcG9ydGVkJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnaW5nU2VydmljZS5nZXRQZXJtaXNzaW9uU3RhdGUoKSBhcyBOb3RpZmljYXRpb25QZXJtaXNzaW9uU3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0cmEgbWFudWFsbWVudGUgZWwgZGlzcG9zaXRpdm8gZW4gZWwgYmFja2VuZC5cbiAgICogw5p0aWwgcGFyYSBzaW5jcm9uaXphciBkaXNwb3NpdGl2b3MgcXVlIHRpZW5lbiB0b2tlbiBGQ00gcGVybyBubyBlc3TDoW4gcmVnaXN0cmFkb3MuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlZFRva2VuIFRva2VuIEZDTSBvcGNpb25hbC4gU2kgc2UgcHJvcG9yY2lvbmEsIHNlIHVzYSBkaXJlY3RhbWVudGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgc2luIGRlcGVuZGVyIGRlbCBNZXNzYWdpbmdTZXJ2aWNlIChldml0YSB0aW1pbmcgaXNzdWVzKS5cbiAgICogQHJldHVybnMgUmVzdWx0YWRvIGRlbCByZWdpc3RybyBjb24gZGV2aWNlSWQgc2kgZnVlIGV4aXRvc29cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBTaW5jcm9uaXphciBjb24gdG9rZW4gZXhpc3RlbnRlIChyZWNvbWVuZGFkbylcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnJlZ2lzdGVyRGV2aWNlKG15VG9rZW4pO1xuICAgKlxuICAgKiAvLyBTaW4gdG9rZW4sIGludGVudGFyw6Egb2J0ZW5lcmxvIGRlbCBNZXNzYWdpbmdTZXJ2aWNlXG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5yZWdpc3RlckRldmljZSgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyRGV2aWNlKHByb3ZpZGVkVG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPFJlZ2lzdGVyRGV2aWNlUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdVc3VhcmlvIG5vIGF1dGVudGljYWRvJyB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBWZXJpZmljYXIgcGVybWlzb3Mgc2kgdGVuZW1vcyBNZXNzYWdpbmdTZXJ2aWNlXG4gICAgICBpZiAodGhpcy5tZXNzYWdpbmdTZXJ2aWNlKSB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb24gPSB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZ2V0UGVybWlzc2lvblN0YXRlKCk7XG4gICAgICAgIGlmIChwZXJtaXNzaW9uICE9PSAnZ3JhbnRlZCcpIHtcbiAgICAgICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdQZXJtaXNvIGRlIG5vdGlmaWNhY2lvbmVzIG5vIG90b3JnYWRvJyB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVzYXIgdG9rZW4gcHJvcG9yY2lvbmFkbyBwcmltZXJvIChldml0YSB0aW1pbmcgaXNzdWVzIGNvbiBJbmplY3RvcilcbiAgICAgIGxldCB0b2tlbiA9IHByb3ZpZGVkVG9rZW4gfHwgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlPy5jdXJyZW50VG9rZW47XG5cbiAgICAgIC8vIFNpIG5vIGhheSB0b2tlbiwgaW50ZW50YXIgb2J0ZW5lcmxvIGRlbCBNZXNzYWdpbmdTZXJ2aWNlXG4gICAgICBpZiAoIXRva2VuICYmIHRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuaXNTdXBwb3J0ZWQoKSkpIHtcbiAgICAgICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdGQ00gbm8gc29wb3J0YWRvIGVuIGVzdGUgbmF2ZWdhZG9yJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRva2VuID0gYXdhaXQgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmdldFRva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHsgcmVnaXN0ZXJlZDogZmFsc2UsIGVycm9yOiAnTm8gc2UgcHVkbyBvYnRlbmVyIHRva2VuIEZDTScgfTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVnaXN0cmFyIGVuIGJhY2tlbmRcbiAgICAgIGNvbnN0IHsgcGxhdGZvcm0sIGJyb3dzZXIsIG9zIH0gPSB0aGlzLmRldGVjdFBsYXRmb3JtSW5mbygpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5odHRwLnBvc3Q8UmVnaXN0ZXJEZXZpY2VSZXNwb25zZT4oYCR7dGhpcy5jb25maWc/LmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlc2AsIHtcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgICBhcHBJZDogdGhpcy5jb25maWc/LmFwcElkLFxuICAgICAgICAgIGJyb3dzZXIsXG4gICAgICAgICAgb3MsXG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBEZXZpY2UgcmVnaXN0ZXJlZCBtYW51YWxseTonLCByZXNwb25zZS5kZXZpY2UuZGV2aWNlSWQpO1xuICAgICAgcmV0dXJuIHsgcmVnaXN0ZXJlZDogdHJ1ZSwgZGV2aWNlSWQ6IHJlc3BvbnNlLmRldmljZS5kZXZpY2VJZCwgdG9rZW4gfTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tWYWx0ZWNoQXV0aF0gTWFudWFsIGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZ2lzdGVyZWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogZXJyb3I/LmVycm9yPy5tZXNzYWdlIHx8IGVycm9yPy5tZXNzYWdlIHx8ICdFcnJvciBhbCByZWdpc3RyYXIgZGlzcG9zaXRpdm8nLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0cmEgZWwgZGlzcG9zaXRpdm8gZW4gZWwgYmFja2VuZCBzaSB0aWVuZSBwZXJtaXNvcyBkZSBub3RpZmljYWNpw7NuLlxuICAgKiBTZSBsbGFtYSBhdXRvbcOhdGljYW1lbnRlIGRlc3B1w6lzIGRlIHVuIGxvZ2luIGV4aXRvc28gc2kgZW5hYmxlRGV2aWNlUmVnaXN0cmF0aW9uPXRydWUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyRGV2aWNlSWZOZWVkZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gU29sbyBzaSBlc3TDoSBoYWJpbGl0YWRvIHkgbWVzc2FnaW5nIGVzdMOhIGRpc3BvbmlibGVcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVEZXZpY2VSZWdpc3RyYXRpb24gfHwgIXRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBWZXJpZmljYXIgc2kgRkNNIGVzdMOhIHNvcG9ydGFkb1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmlzU3VwcG9ydGVkKCkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZpY2FyIHNpIHlhIHRpZW5lIHBlcm1pc29zXG4gICAgICBjb25zdCBwZXJtaXNzaW9uID0gdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmdldFBlcm1pc3Npb25TdGF0ZSgpO1xuICAgICAgaWYgKHBlcm1pc3Npb24gIT09ICdncmFudGVkJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIE5vIHNvbGljaXRhciBhdXRvbcOhdGljYW1lbnRlLCBzb2xvIHJlZ2lzdHJhciBzaSB5YSB0aWVuZSBwZXJtaXNvXG4gICAgICB9XG5cbiAgICAgIC8vIE9idGVuZXIgdG9rZW4gZXhpc3RlbnRlIChubyBzb2xpY2l0YXIgbnVldm8pXG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMubWVzc2FnaW5nU2VydmljZS5nZXRUb2tlbigpO1xuICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZ2lzdHJhciBlbiBiYWNrZW5kXG4gICAgICBjb25zdCB7IHBsYXRmb3JtLCBicm93c2VyLCBvcyB9ID0gdGhpcy5kZXRlY3RQbGF0Zm9ybUluZm8oKTtcbiAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLmh0dHAucG9zdDxSZWdpc3RlckRldmljZVJlc3BvbnNlPihgJHt0aGlzLmNvbmZpZz8uYXBpVXJsfS92Mi91c2Vycy9tZS9kZXZpY2VzYCwge1xuICAgICAgICAgIHRva2VuLFxuICAgICAgICAgIHBsYXRmb3JtLFxuICAgICAgICAgIGFwcElkOiB0aGlzLmNvbmZpZz8uYXBwSWQsXG4gICAgICAgICAgYnJvd3NlcixcbiAgICAgICAgICBvcyxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIERldmljZSByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIE5vIGJsb3F1ZWFyIGF1dGggc2kgZmFsbGEgZGV2aWNlIHJlZ2lzdHJhdGlvblxuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIERldmljZSByZWdpc3RyYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRWxpbWluYSBlbCBkaXNwb3NpdGl2byBkZWwgYmFja2VuZCB5IGJvcnJhIGVsIHRva2VuIEZDTS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdW5yZWdpc3RlckRldmljZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVEZXZpY2VSZWdpc3RyYXRpb24gfHwgIXRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHRoaXMubWVzc2FnaW5nU2VydmljZS5jdXJyZW50VG9rZW47XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgLy8gRGVsZXRlIGZyb20gYmFja2VuZCAoZmlyZSBhbmQgZm9yZ2V0KVxuICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAucmVxdWVzdCgnREVMRVRFJywgYCR7dGhpcy5jb25maWc/LmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlcy9ieS10b2tlbmAsIHtcbiAgICAgICAgICAgIGJvZHk6IHsgdG9rZW4gfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgICAgICAvLyBEZWxldGUgZnJvbSBGQ01cbiAgICAgICAgYXdhaXQgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmRlbGV0ZVRva2VuKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIERldmljZSB1bnJlZ2lzdGVyZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIElnbm9yYXIgZXJyb3JlcyBlbiBjbGVhbnVwXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdGEgaW5mb3JtYWNpw7NuIGRlIGxhIHBsYXRhZm9ybWEgZGVsIGRpc3Bvc2l0aXZvLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RQbGF0Zm9ybUluZm8oKTogeyBwbGF0Zm9ybTogJ3dlYic7IGJyb3dzZXI6IHN0cmluZzsgb3M6IHN0cmluZyB9IHtcbiAgICBjb25zdCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7XG5cbiAgICAvLyBEZXRlY3RhciBuYXZlZ2Fkb3JcbiAgICBsZXQgYnJvd3NlciA9ICdVbmtub3duJztcbiAgICBpZiAodWEuaW5jbHVkZXMoJ0ZpcmVmb3gnKSkge1xuICAgICAgYnJvd3NlciA9ICdGaXJlZm94JztcbiAgICB9IGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdFZGcnKSkge1xuICAgICAgYnJvd3NlciA9ICdFZGdlJztcbiAgICB9IGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdDaHJvbWUnKSkge1xuICAgICAgYnJvd3NlciA9ICdDaHJvbWUnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ1NhZmFyaScpKSB7XG4gICAgICBicm93c2VyID0gJ1NhZmFyaSc7XG4gICAgfVxuXG4gICAgLy8gRGV0ZWN0YXIgT1NcbiAgICBsZXQgb3MgPSAnVW5rbm93bic7XG4gICAgaWYgKHVhLmluY2x1ZGVzKCdXaW5kb3dzJykpIHtcbiAgICAgIG9zID0gJ1dpbmRvd3MnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ01hYyBPUycpKSB7XG4gICAgICBvcyA9ICdtYWNPUyc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnTGludXgnKSkge1xuICAgICAgb3MgPSAnTGludXgnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ0FuZHJvaWQnKSkge1xuICAgICAgb3MgPSAnQW5kcm9pZCc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnaU9TJykgfHwgdWEuaW5jbHVkZXMoJ2lQaG9uZScpIHx8IHVhLmluY2x1ZGVzKCdpUGFkJykpIHtcbiAgICAgIG9zID0gJ2lPUyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcGxhdGZvcm06ICd3ZWInLCBicm93c2VyLCBvcyB9O1xuICB9XG59XG4iXX0=
|
|
1752
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9hdXRoL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQWEsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR25GLE9BQU8sRUFBYyxVQUFVLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3RGLE9BQU8sRUFDTCxHQUFHLEVBQ0gsVUFBVSxFQUNWLFNBQVMsRUFDVCxHQUFHLEVBQ0gsTUFBTSxFQUNOLElBQUksRUFDSixPQUFPLEVBQ1AsV0FBVyxFQUNYLFFBQVEsR0FDVCxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQXVGL0MsT0FBTyxFQUFhLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDOzs7Ozs7Ozs7Ozs7O0FBdkYzQzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7QUFpRmpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxNQUFNLE9BQU8sV0FBVztJQWN0QixZQUNtRCxNQUFnQyxFQUN6RSxJQUFnQixFQUNoQixNQUFjLEVBQ2QsWUFBOEIsRUFDOUIsWUFBMEIsRUFDMUIsY0FBa0MsRUFDbEMsV0FBNEIsRUFDNUIsZUFBZ0MsRUFDaEMsWUFBMEIsRUFDZCxnQkFBeUMsRUFDekMsV0FBK0IsRUFDM0MsbUJBQThDLEVBQ2xDLGlCQUFtQztRQVpOLFdBQU0sR0FBTixNQUFNLENBQTBCO1FBQ3pFLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsV0FBTSxHQUFOLE1BQU0s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QUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUMxQyxDQUFDOytHQTE1RFUsV0FBVyxrQkFlQSxtQkFBbUI7bUhBZjlCLFdBQVcsY0FERSxNQUFNOzs0RkFDbkIsV0FBVztrQkFEdkIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQWdCN0IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxtQkFBbUI7OzBCQVN0QyxRQUFROzswQkFDUixRQUFROzswQkFFUixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBpc0Rldk1vZGUsIE9uRGVzdHJveSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IsIG9mLCBmcm9tLCBmaXJzdFZhbHVlRnJvbSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICB0YXAsXG4gIGNhdGNoRXJyb3IsXG4gIHN3aXRjaE1hcCxcbiAgbWFwLFxuICBmaWx0ZXIsXG4gIHRha2UsXG4gIHRpbWVvdXQsXG4gIHNoYXJlUmVwbGF5LFxuICBmaW5hbGl6ZSxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBWQUxURUNIX0FVVEhfQ09ORklHIH0gZnJvbSAnLi9jb25maWcnO1xuXG4vKipcbiAqIFRpbWVvdXQgZHVybyBwYXJhIGVsIGAvcmVmcmVzaGAgKG1zKS4gVW5hIExhbWJkYSBmcsOtYSArIHJlZCBtw7N2aWwgZmxha3kgcHVlZGVuXG4gKiBkZWphciBlbCBQT1NUIGNvbGdhZG8gaW5kZWZpbmlkYW1lbnRlOyBzaW4gZXN0ZSBsw61taXRlIGVsIGBhd2FpdGAgZGVcbiAqIGBpbml0aWFsaXplKClgIChBUFBfSU5JVElBTElaRVIpIGNvbmdlbGEgZWwgYm9vdHN0cmFwIGVuIGVsIHNrZWxldG9uLCB5IGVsIGZsYWdcbiAqIGBpc1JlZnJlc2hpbmdgIGRlbCBpbnRlcmNlcHRvciBzZSBxdWVkYSBwZWdhZG8gYmxvcXVlYW5kbyB0b2RhIHJlcXVlc3QgcG9zdGVyaW9yLlxuICogQ29uIHRpbWVvdXQsIGVsIHJlZnJlc2ggU0lFTVBSRSByZXN1ZWx2ZSAob2sgbyBlcnJvcikg4oaSIGxhIFVJIG51bmNhIGN1ZWxnYTogZWxcbiAqIGJvb3RzdHJhcCBjb250aW7DumEgY29tbyBpbnZpdGFkbyB5IGVsIGludGVyY2VwdG9yIGxpYmVyYSBsYSBjb2xhLlxuICovXG5jb25zdCBSRUZSRVNIX1RJTUVPVVRfTVMgPSAxMDAwMDtcbmltcG9ydCB7IEF1dGhTdGF0ZVNlcnZpY2UgfSBmcm9tICcuL2F1dGgtc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBUb2tlblNlcnZpY2UgfSBmcm9tICcuL3Rva2VuLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFN5bmNTZXJ2aWNlIH0gZnJvbSAnLi9zeW5jLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgU2lnbmluUmVxdWVzdCxcbiAgU2lnbmluUmVzcG9uc2UsXG4gIFNpZ251cFJlcXVlc3QsXG4gIFNpZ251cFJlc3BvbnNlLFxuICBWZXJpZnlFbWFpbFJlcXVlc3QsXG4gIFZlcmlmeUVtYWlsUmVzcG9uc2UsXG4gIFJlc2VuZENvZGVSZXF1ZXN0LFxuICBSZXNlbmRDb2RlUmVzcG9uc2UsXG4gIE1GQVZlcmlmeVJlc3BvbnNlLFxuICBSZWZyZXNoUmVxdWVzdCxcbiAgUmVmcmVzaFJlc3BvbnNlLFxuICBHZXRQZXJtaXNzaW9uc1Jlc3BvbnNlLFxuICBHZXRQcm9maWxlUmVzcG9uc2UsXG4gIFVwZGF0ZVByb2ZpbGVSZXF1ZXN0LFxuICBVcGRhdGVQcm9maWxlUmVzcG9uc2UsXG4gIE1GQVNldHVwUmVzcG9uc2UsXG4gIE1GQUNvbmZpcm1SZXNwb25zZSxcbiAgTUZBRGlzYWJsZVJlcXVlc3QsXG4gIE1GQURpc2FibGVSZXNwb25zZSxcbiAgRm9yZ290UGFzc3dvcmRSZXF1ZXN0LFxuICBGb3Jnb3RQYXNzd29yZFJlc3BvbnNlLFxuICBSZXNldFBhc3N3b3JkUmVxdWVzdCxcbiAgUmVzZXRQYXNzd29yZFJlc3BvbnNlLFxuICBNRkFSZXNldFJlcXVlc3RSZXF1ZXN0LFxuICBNRkFSZXNldFJlcXVlc3RSZXNwb25zZSxcbiAgTUZBUmVzZXRDb25maXJtUmVxdWVzdCxcbiAgTUZBUmVzZXRDb25maXJtUmVzcG9uc2UsXG4gIEFjdGl2YXRlQWNjb3VudFJlcXVlc3QsXG4gIEFjdGl2YXRlQWNjb3VudFJlc3BvbnNlLFxuICBDaGFuZ2VQYXNzd29yZFJlcXVlc3QsXG4gIENoYW5nZVBhc3N3b3JkUmVzcG9uc2UsXG4gIERlbGV0ZUFjY291bnRSZXF1ZXN0LFxuICBEZWxldGVBY2NvdW50UmVzcG9uc2UsXG4gIFNlbmREZWxldGVBY2NvdW50Q29kZVJlc3BvbnNlLFxuICBTd2l0Y2hPcmdSZXNwb25zZSxcbiAgTUZBTWV0aG9kLFxuICBBdXRoRXJyb3IsXG4gIEF1dGhTeW5jRXZlbnQsXG4gIFZhbHRlY2hBdXRoQ29uZmlnLFxuICBSZWdpc3RlckRldmljZVJlc3BvbnNlLFxuICBFbmFibGVOb3RpZmljYXRpb25zUmVzdWx0LFxuICBOb3RpZmljYXRpb25QZXJtaXNzaW9uU3RhdGUsXG4gIFJlZ2lzdGVyRGV2aWNlUmVzdWx0LFxuICAvLyBUT1RQIE1GQSB0eXBlc1xuICBUT1RQU2V0dXBSZXNwb25zZSxcbiAgVE9UUFZlcmlmeVNldHVwUmVzcG9uc2UsXG4gIFRPVFBEaXNhYmxlUmVzcG9uc2UsXG4gIFJlZ2VuZXJhdGVCYWNrdXBDb2Rlc1Jlc3BvbnNlLFxuICBCYWNrdXBDb2Rlc0NvdW50UmVzcG9uc2UsXG4gIC8vIE9BdXRoIHR5cGVzXG4gIE9BdXRoUHJvdmlkZXIsXG4gIE9BdXRoUmVzdWx0LFxuICBMaW5rZWRQcm92aWRlcixcbiAgSGFzUGFzc3dvcmRSZXNwb25zZSxcbiAgLy8gSGFuZGxlIHR5cGVzXG4gIFVwZGF0ZUhhbmRsZVJlc3BvbnNlLFxuICBDaGVja0hhbmRsZVJlc3BvbnNlLFxuICAvLyBBdmF0YXIgdHlwZXNcbiAgVXBkYXRlQXZhdGFyUmVxdWVzdCxcbiAgVXBkYXRlQXZhdGFyUmVzcG9uc2UsXG4gIC8vIEVtYWlsIGNoYW5nZVxuICBJbml0aWF0ZUVtYWlsQ2hhbmdlUmVxdWVzdCxcbiAgSW5pdGlhdGVFbWFpbENoYW5nZVJlc3BvbnNlLFxuICBDb25maXJtRW1haWxDaGFuZ2VTdGVwMVJlcXVlc3QsXG4gIENvbmZpcm1FbWFpbENoYW5nZVN0ZXAxUmVzcG9uc2UsXG4gIENvbmZpcm1FbWFpbENoYW5nZVN0ZXAyUmVxdWVzdCxcbiAgQ29uZmlybUVtYWlsQ2hhbmdlU3RlcDJSZXNwb25zZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBPQXV0aFNlcnZpY2UgfSBmcm9tICcuL29hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlyZWJhc2VTZXJ2aWNlLCBNZXNzYWdpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vZmlyZWJhc2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UsIEkxOG5MYW5nIH0gZnJvbSAnLi4vaTE4bic7XG5pbXBvcnQgeyBGaXJlc3RvcmUsIGRvYywgb25TbmFwc2hvdCB9IGZyb20gJ0Bhbmd1bGFyL2ZpcmUvZmlyZXN0b3JlJztcbmltcG9ydCB7IENvbmZpcm1hdGlvbkRpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi9jb25maXJtYXRpb24tZGlhbG9nL2NvbmZpcm1hdGlvbi1kaWFsb2cuc2VydmljZSc7XG5pbXBvcnQgeyBpbnRlcnByZXRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8qKlxuICogU2VydmljaW8gcHJpbmNpcGFsIGRlIGF1dGVudGljYWNpw7NuLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJ3ZhbHRlY2gtY29tcG9uZW50cyc7XG4gKlxuICogQENvbXBvbmVudCh7Li4ufSlcbiAqIGV4cG9ydCBjbGFzcyBMb2dpbkNvbXBvbmVudCB7XG4gKiAgIHByaXZhdGUgYXV0aCA9IGluamVjdChBdXRoU2VydmljZSk7XG4gKlxuICogICBhc3luYyBsb2dpbigpIHtcbiAqICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmF1dGguc2lnbmluKHsgZW1haWwsIHBhc3N3b3JkIH0pKTtcbiAqICAgICBpZiAodGhpcy5hdXRoLm1mYVBlbmRpbmcoKS5yZXF1aXJlZCkge1xuICogICAgICAgLy8gTW9zdHJhciBVSSBkZSBNRkFcbiAqICAgICB9IGVsc2Uge1xuICogICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvJ10pO1xuICogICAgIH1cbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAvLyBUaW1lciBwYXJhIHJlZnJlc2ggcHJvYWN0aXZvXG4gIHByaXZhdGUgcmVmcmVzaFRpbWVySWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3luY1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZmlyZXN0b3JlUkJBQ1Vuc3Vic2NyaWJlOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICAvLyBTaW5nbGUtZmxpZ2h0IHJlZnJlc2g6IHVuIHNvbG8gUE9TVCAvcmVmcmVzaCBlbiB2dWVsbyBhIGxhIHZlei4gVG9kb3MgbG9zXG4gIC8vIGNhbGxlcnMgKGJvb3RzdHJhcCwgcmVlc3RhYmxlY2VyIEZpcmViYXNlLCBpbnRlcmNlcHRvciA0MDEsIHRpbWVyIHByb2FjdGl2bylcbiAgLy8gY29tcGFydGVuIGVsIE1JU01PIG9ic2VydmFibGUuIFNpbiBlc3RvLCByZWZyZXNoZXMgY29uY3VycmVudGVzIGNob2NhbiBjb250cmFcbiAgLy8gbGEgcm90YWNpw7NuIGRlIHJlZnJlc2ggdG9rZW4gZGVsIGJhY2tlbmQ6IGVsIHByaW1lcm8gcm90YSBlbCB0b2tlbiB5IGVsXG4gIC8vIHNlZ3VuZG8gbGxlZ2EgY29uIGVsIHRva2VuIHlhIGludmFsaWRhZG8g4oaSIDQwMSDihpIgbG9nb3V0IGVzcHVyaW8gKGVsIHVzdWFyaW9cbiAgLy8gY2FlIGEgbGEgbGFuZGluZyBhbCBhY3R1YWxpemFyKS4gVmVyIHByb2plY3RfcHdhLWxvZ2luLWZyZWV6ZS5cbiAgcHJpdmF0ZSBpbkZsaWdodFJlZnJlc2gkOiBPYnNlcnZhYmxlPFJlZnJlc2hSZXNwb25zZT4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFZBTFRFQ0hfQVVUSF9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBWYWx0ZWNoQXV0aENvbmZpZyB8IG51bGwsXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBzdGF0ZVNlcnZpY2U6IEF1dGhTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2tlblNlcnZpY2U6IFRva2VuU2VydmljZSxcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBBdXRoU3RvcmFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzeW5jU2VydmljZTogQXV0aFN5bmNTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmlyZWJhc2VTZXJ2aWNlOiBGaXJlYmFzZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvYXV0aFNlcnZpY2U6IE9BdXRoU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIG1lc3NhZ2luZ1NlcnZpY2U6IE1lc3NhZ2luZ1NlcnZpY2UgfCBudWxsLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlIHwgbnVsbCxcbiAgICBwcml2YXRlIGNvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvbkRpYWxvZ1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBmaXJlc3RvcmVJbnN0YW5jZTogRmlyZXN0b3JlIHwgbnVsbFxuICApIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdbdmFsdGVjaC1jb21wb25lbnRzXSBBdXRoU2VydmljZTogcHJvdmlkZVZhbHRlY2hBdXRoKCkgbm8gZXN0w6EgZW4gbWFpbi50cy4gJyArXG4gICAgICAgICAgJ0xvZ2luLCByZWdpc3RybyB5IHNlc2nDs24gbm8gZnVuY2lvbmFyw6FuLidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVTVEFETyBQw5pCTElDTyAoU2lnbmFscyByZWFkb25seSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEVzdGFkbyBjb21wbGV0byBkZSBhdXRlbnRpY2FjacOzbiAqL1xuICByZWFkb25seSBzdGF0ZSA9IHRoaXMuc3RhdGVTZXJ2aWNlLnN0YXRlO1xuXG4gIC8qKiBVc3VhcmlvIGVzdMOhIGF1dGVudGljYWRvICovXG4gIHJlYWRvbmx5IGlzQXV0aGVudGljYXRlZCA9IHRoaXMuc3RhdGVTZXJ2aWNlLmlzQXV0aGVudGljYXRlZDtcblxuICAvKiogRXN0YWRvIGRlIGNhcmdhICovXG4gIHJlYWRvbmx5IGlzTG9hZGluZyA9IHRoaXMuc3RhdGVTZXJ2aWNlLmlzTG9hZGluZztcblxuICAvKiogSW5mb3JtYWNpw7NuIGRlbCB1c3VhcmlvICovXG4gIHJlYWRvbmx5IHVzZXIgPSB0aGlzLnN0YXRlU2VydmljZS51c2VyO1xuXG4gIC8qKiBDYW1iaW9zIGRlIG9yZ2FuaXphY2nDs24gYWN0aXZhIGRldGVjdGFkb3MgZGVzZGUgdG9rZW4gcmVmcmVzaCwgc3dpdGNoLW9yZyBvIHN5bmMgZW50cmUgcGVzdGHDsWFzLiAqL1xuICByZWFkb25seSBhY3RpdmVPcmdDaGFuZ2VkJCA9IHRoaXMuc3RhdGVTZXJ2aWNlLmFjdGl2ZU9yZ0NoYW5nZWQkO1xuXG4gIC8qKiBUb2tlbiBkZSBhY2Nlc28gKi9cbiAgcmVhZG9ubHkgYWNjZXNzVG9rZW4gPSB0aGlzLnN0YXRlU2VydmljZS5hY2Nlc3NUb2tlbjtcblxuICAvKiogUm9sZXMgZGVsIHVzdWFyaW8gKi9cbiAgcmVhZG9ubHkgcm9sZXMgPSB0aGlzLnN0YXRlU2VydmljZS5yb2xlcztcblxuICAvKiogUGVybWlzb3MgZGVsIHVzdWFyaW8gKi9cbiAgcmVhZG9ubHkgcGVybWlzc2lvbnMgPSB0aGlzLnN0YXRlU2VydmljZS5wZXJtaXNzaW9ucztcblxuICAvKiogVXN1YXJpbyBlcyBzdXBlciBhZG1pbiAqL1xuICByZWFkb25seSBpc1N1cGVyQWRtaW4gPSB0aGlzLnN0YXRlU2VydmljZS5pc1N1cGVyQWRtaW47XG5cbiAgLyoqIEVzdGFkbyBkZSBNRkEgcGVuZGllbnRlICovXG4gIHJlYWRvbmx5IG1mYVBlbmRpbmcgPSB0aGlzLnN0YXRlU2VydmljZS5tZmFQZW5kaW5nO1xuXG4gIC8qKiBFcnJvciBhY3R1YWwgKi9cbiAgcmVhZG9ubHkgZXJyb3IgPSB0aGlzLnN0YXRlU2VydmljZS5lcnJvcjtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSU5JQ0lBTElaQUNJw5NOXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbmljaWFsaXphIGVsIHNlcnZpY2lvIGRlIGF1dGVudGljYWNpw7NuLlxuICAgKiBMbGFtYWRvIGF1dG9tw6F0aWNhbWVudGUgcG9yIHByb3ZpZGVWYWx0ZWNoQXV0aC5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gMS4gQ2FyZ2FyIGVzdGFkbyBkZXNkZSBzdG9yYWdlXG4gICAgY29uc3Qgc3RvcmVkU3RhdGUgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWRTdGF0ZSgpO1xuXG4gICAgaWYgKHN0b3JlZFN0YXRlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAvLyAyLiBWZXJpZmljYXIgc2kgdG9rZW4gZXMgdsOhbGlkb1xuICAgICAgaWYgKHRoaXMudG9rZW5TZXJ2aWNlLmlzVG9rZW5WYWxpZChzdG9yZWRTdGF0ZS5hY2Nlc3NUb2tlbikpIHtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UucmVzdG9yZUZyb21TdG9yYWdlKHN0b3JlZFN0YXRlKTtcblxuICAgICAgICAvLyBFeHRyYWVyIGluZm8gZGVsIHRva2VuXG4gICAgICAgIGNvbnN0IGNsYWltcyA9IHRoaXMudG9rZW5TZXJ2aWNlLnBhcnNlVG9rZW4oc3RvcmVkU3RhdGUuYWNjZXNzVG9rZW4pO1xuICAgICAgICBjb25zdCB0YWJBY3RpdmVPcmcgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldEFjdGl2ZU9yZygpO1xuICAgICAgICBpZiAoY2xhaW1zKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlVXNlckluZm8oY2xhaW1zLnVpZCwgY2xhaW1zLmVtYWlsKTtcbiAgICAgICAgICBjb25zdCBhY3RpdmVPcmcgPSB0YWJBY3RpdmVPcmcgfHwgY2xhaW1zLm9yZztcbiAgICAgICAgICBpZiAoYWN0aXZlT3JnKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVBY3RpdmVPcmcoYWN0aXZlT3JnKTtcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZUFjdGl2ZU9yZyhhY3RpdmVPcmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBTeW5jIGlzU3VwZXJBZG1pbiBmcm9tIEpXVCBpbiBjYXNlIElzUGxhdGZvcm1BZG1pbiBjaGFuZ2VkIHNpbmNlIGxhc3QgbG9naW5cbiAgICAgICAgICBjb25zdCBqd3RBZG1pbiA9IGNsYWltcy5hZG1pbiA9PT0gdHJ1ZTtcbiAgICAgICAgICBpZiAoand0QWRtaW4gIT09IChzdG9yZWRTdGF0ZS5pc1N1cGVyQWRtaW4gPz8gZmFsc2UpKSB7XG4gICAgICAgICAgICBjb25zdCByb2xlcyA9IHN0b3JlZFN0YXRlLnJvbGVzID8/IFtdO1xuICAgICAgICAgICAgY29uc3QgcGVybXMgPSBzdG9yZWRTdGF0ZS5wZXJtaXNzaW9ucyA/PyBbXTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVBlcm1pc3Npb25zKHJvbGVzLCBwZXJtcywgand0QWRtaW4pO1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlUGVybWlzc2lvbnMoe1xuICAgICAgICAgICAgICBvcGVyYXRpb25JZDogJycsXG4gICAgICAgICAgICAgIHJvbGVzLFxuICAgICAgICAgICAgICBwZXJtaXNzaW9uczogcGVybXMsXG4gICAgICAgICAgICAgIGlzU3VwZXJBZG1pbjogand0QWRtaW4sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbCBhY2Nlc3MgdG9rZW4gZXN0w6EgZW4gbG9jYWxTdG9yYWdlIHkgcHVlZGUgaGFiZXIgc2lkbyBlc2NyaXRvIHBvclxuICAgICAgICAvLyBvdHJhIHBlc3Rhw7FhIGVuIG90cmEgb3JnYW5pemFjacOzbi4gU2kgZXN0YSBwZXN0YcOxYSByZWN1ZXJkYSB1bmEgb3JnXG4gICAgICAgIC8vIGRpc3RpbnRhIGVuIHNlc3Npb25TdG9yYWdlLCByZWZyZXNjYW1vcyBkZSBmb3JtYSBibG9xdWVhbnRlIGFudGVzIGRlXG4gICAgICAgIC8vIGRlamFyIHF1ZSBsYXMgcnV0YXMgb3JnLXNjb3BlZCBwaWRhbiBkYXRvcyBjb24gdW4gSldUIGVxdWl2b2NhZG8uXG4gICAgICAgIGlmICh0YWJBY3RpdmVPcmcgJiYgY2xhaW1zPy5vcmcgJiYgY2xhaW1zLm9yZyAhPT0gdGFiQWN0aXZlT3JnKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgW1ZhbHRlY2hBdXRoXSBib290c3RyYXAg4oCUIHN0b3JlZCBKV1Qgb3JnICR7Y2xhaW1zLm9yZ30gZGlmZmVycyBmcm9tIHRhYiBvcmcgJHt0YWJBY3RpdmVPcmd9OyByZWZyZXNoaW5nIGJlZm9yZSByb3V0ZSBkYXRhYFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBJbmljaWFyIHRpbWVyIGRlIHJlZnJlc2NvIHByb2FjdGl2b1xuICAgICAgICB0aGlzLnN0YXJ0UmVmcmVzaFRpbWVyKCk7XG5cbiAgICAgICAgLy8gNC4gUmUtZXN0YWJsZWNlciBsYSBzZXNpw7NuIGRlIEZpcmViYXNlIGVuIGJvb3RzdHJhcC5cbiAgICAgICAgLy8gRWwgYWNjZXNzIHRva2VuIHNpZ3VlIHbDoWxpZG8sIGFzw60gcXVlIE5PIHBhc2Ftb3MgcG9yIGxhIHJhbWEgZGVcbiAgICAgICAgLy8gcmVmcmVzaCDigJQgcGVybyBsYSBwZXJzaXN0ZW5jaWEgSW5kZXhlZERCIHByb3BpYSBkZSBGaXJlYmFzZSBBdXRoIG5vXG4gICAgICAgIC8vIHNvYnJldml2ZSBlbCBjb250ZW5lZG9yIGRlIHN0b3JhZ2UgZGUgdW5hIFBXQSBzdGFuZGFsb25lIGVuIGlPUy5cbiAgICAgICAgLy8gU2luIGVzdG8sIGBmaXJlYmFzZUF1dGhSZWFkeWAgc2UgcXVlZGEgZW4gYGZhbHNlYCBwYXJhIHNpZW1wcmUgeVxuICAgICAgICAvLyBjdWFscXVpZXIgbGlzdGVuZXIgRmlyZXN0b3JlIChlai4gZWwgaW5ib3ggZGUgbm90aWZpY2FjaW9uZXMpIGN1ZWxnYS5cbiAgICAgICAgLy8gRmlyZS1hbmQtZm9yZ2V0OiBOTyBkZWJlIGRlbW9yYXIgZWwgcmVzb2x2ZSBkZSBpbml0aWFsaXplKCkuXG4gICAgICAgIHZvaWQgdGhpcy5lbnN1cmVGaXJlYmFzZVNlc3Npb25PbkJvb3RzdHJhcCgpO1xuXG4gICAgICAgIC8vIDUuIExpc3RlbmVyIFJCQUMgRmlyZXN0b3JlIOKAlCByZS1lc3RhYmxlY2VyIHRyYXMgcmVsb2FkIGRlIHDDoWdpbmEuXG4gICAgICAgIC8vIGhhbmRsZVN1Y2Nlc3NmdWxBdXRoIGxvIGNvbmZpZ3VyYSBlbiBlbCBsb2dpbiBpbmljaWFsLCBwZXJvIG5vIHNvYnJldml2ZVxuICAgICAgICAvLyByZWNhcmdhczogaW5pdGlhbGl6ZSgpIHJlc3RhdXJhIGVsIHN0YXRlIGRlc2RlIHN0b3JhZ2UgcGVybyBubyBlbCBsaXN0ZW5lci5cbiAgICAgICAgLy8gc2V0dXBGaXJlc3RvcmVSQkFDU3luYyBlc3BlcmEgaW50ZXJuYW1lbnRlIGEgcXVlIEZpcmViYXNlIEF1dGggZXN0w6kgbGlzdGEuXG4gICAgICAgIGlmIChjbGFpbXM/LnVpZCkge1xuICAgICAgICAgIHRoaXMuc2V0dXBGaXJlc3RvcmVSQkFDU3luYyhjbGFpbXMudWlkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdG9yZWRTdGF0ZS5hY2Nlc3NUb2tlbikge1xuICAgICAgICAvLyA0LiBUb2tlbiBkZSBhY2Nlc28gZXhwaXJhZG8uIENvb2tpZS1vbmx5IChILTA1KTogZWwgcmVmcmVzaCB5YSBOTyBlc3TDoVxuICAgICAgICAvLyBlbiBzdG9yYWdlLCBhc8OtIHF1ZSBlbCBkaXNwYXJhZG9yIGVzIFwiaGFiw61hIHVuIGFjY2VzcyB0b2tlblwiIChzZXNpw7NuXG4gICAgICAgIC8vIHByZXZpYSk7IGVsIC9yZWZyZXNoIGRlIGZvbmRvIHVzYSBsYSBjb29raWUgSHR0cE9ubHkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE5PIGJsb3F1ZWFtb3MgZWwgYm9vdHN0cmFwIGVzcGVyYW5kbyBsYSByZWQ6IHVuIC9yZWZyZXNoIGVuIHVuYVxuICAgICAgICAvLyBMYW1iZGEgZnLDrWEgc29uIDItNXMgZGUgcGFudGFsbGEgZW4gYmxhbmNvIChBbmd1bGFyIG5vIHJlbmRlcml6YVxuICAgICAgICAvLyBuYWRhIGhhc3RhIHF1ZSBlbCBBUFBfSU5JVElBTElaRVIgcmVzdWVsdmUpLlxuICAgICAgICAvL1xuICAgICAgICAvLyBSZXN0YXVyYWNpw7NuIG9wdGltaXN0YTogZWwgYWNjZXNzIHRva2VuIGV4cGlyw7MgcGVybyBzdXMgY2xhaW1zXG4gICAgICAgIC8vICh1aWQvZW1haWwvcm9sZXMpIHNpZ3VlbiBkZWNvZGlmaWNhYmxlcyDigJQgYHBhcnNlVG9rZW5gIE5PIHZhbGlkYVxuICAgICAgICAvLyBgZXhwYC4gUmVzdGF1cmFtb3MgbGEgc2VzacOzbiBkZXNkZSBlc29zIGNsYWltcyBwYXJhIHF1ZSBsYSBhcHBcbiAgICAgICAgLy8gcmVuZGVyaWNlIGVsIHNoZWxsIGF1dGVudGljYWRvIGRlIGlubWVkaWF0bywgeSBkaXNwYXJhbW9zIGVsXG4gICAgICAgIC8vIC9yZWZyZXNoIGVuIHNlZ3VuZG8gcGxhbm8gKGZpcmUtYW5kLWZvcmdldCkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNlZ3VyaWRhZCBkZSBsYSB2ZW50YW5hIHN1Yi1zZWd1bmRvIGFudGVzIGRlIHF1ZSBlbCByZWZyZXNoIGxsZWd1ZTpcbiAgICAgICAgLy8gY3VhbHF1aWVyIEFQSSBjYWxsIHNhbGUgY29uIGVsIHRva2VuIGV4cGlyYWRvIOKGkiA0MDEg4oaSIGVsXG4gICAgICAgIC8vIGF1dGhJbnRlcmNlcHRvciByZWZyZXNjYSArIHJlaW50ZW50YSBhdXRvbcOhdGljYW1lbnRlLiBTaSBlbCByZWZyZXNoXG4gICAgICAgIC8vIGRlIGZvbmRvIGZhbGxhIOKGkiBzaWduT3V0ICsgY2xlYXJTdGF0ZS5cbiAgICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gYm9vdHN0cmFwIOKAlCBhY2Nlc3MgdG9rZW4gZXhwaXJlZCwgcmVmcmVzaGluZyBpbiBiYWNrZ3JvdW5kJyk7XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlc3RvcmVGcm9tU3RvcmFnZShzdG9yZWRTdGF0ZSk7XG5cbiAgICAgICAgY29uc3QgZXhwaXJlZENsYWltcyA9IHRoaXMudG9rZW5TZXJ2aWNlLnBhcnNlVG9rZW4oc3RvcmVkU3RhdGUuYWNjZXNzVG9rZW4pO1xuICAgICAgICBjb25zdCB0YWJBY3RpdmVPcmcgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldEFjdGl2ZU9yZygpO1xuICAgICAgICBpZiAoZXhwaXJlZENsYWltcykge1xuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVVzZXJJbmZvKGV4cGlyZWRDbGFpbXMudWlkLCBleHBpcmVkQ2xhaW1zLmVtYWlsKTtcbiAgICAgICAgICBjb25zdCBhY3RpdmVPcmcgPSB0YWJBY3RpdmVPcmcgfHwgZXhwaXJlZENsYWltcy5vcmc7XG4gICAgICAgICAgaWYgKGFjdGl2ZU9yZykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKGFjdGl2ZU9yZyk7XG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVBY3RpdmVPcmcoYWN0aXZlT3JnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV4cGlyZWRDbGFpbXMudWlkKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwRmlyZXN0b3JlUkJBQ1N5bmMoZXhwaXJlZENsYWltcy51aWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlZnJlc2ggZW4gc2VndW5kbyBwbGFubyDigJQgTk8gc2UgaGFjZSBhd2FpdDogaW5pdGlhbGl6ZSgpIHJlc3VlbHZlIHlhLlxuICAgICAgICBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIGJvb3RzdHJhcCDigJQgYmFja2dyb3VuZCByZWZyZXNoIGZhaWxlZCwgc2lnbmluZyBvdXQnKTtcbiAgICAgICAgICB0aGlzLnNpZ25PdXRGaXJlYmFzZSgpO1xuICAgICAgICAgIHRoaXMuY2xlYXJTdGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2lnbk91dEZpcmViYXNlKCk7XG4gICAgICAgIHRoaXMuY2xlYXJTdGF0ZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmNvbmZpZz8uYm9vdHN0cmFwU2Vzc2lvbkZyb21IaW50ICYmXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmhhc0xvZ2dlZEluSGludCh0aGlzLmNvbmZpZz8ubG9nZ2VkSW5IaW50Q29va2llKVxuICAgICkge1xuICAgICAgLy8gTm8gaGF5IHRva2VuIGxvY2FsIGVuIGVzdGUgb3JpZ2luLCBwZXJvIGxhIGNvb2tpZS1oaW50IGluZGljYSBzZXNpw7NuXG4gICAgICAvLyBhY3RpdmEgZW4gbGEgZmFtaWxpYSAobG9ndWVhZG8gZW4gb3RyYSBhcHAgZGVsIGZhY3RvcnkpLiBCb290c3RyYXBlYW1vc1xuICAgICAgLy8gbGEgc2VzacOzbiBjcm9zcy1vcmlnaW4gdsOtYSAvcmVmcmVzaCDigJQgYmxvcXVlYW50ZSBwYXJhIHF1ZSBsb3MgZ3VhcmRzIGxhXG4gICAgICAvLyB2ZWFuLiBWZXIgVmFsdGVjaEF1dGhDb25maWcuYm9vdHN0cmFwU2Vzc2lvbkZyb21IaW50LlxuICAgICAgYXdhaXQgdGhpcy5ib290c3RyYXBTZXNzaW9uRnJvbUhpbnRDb29raWUoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2hvdWxkQm9vdHN0cmFwVmlhU1NPQnJpZGdlKCkpIHtcbiAgICAgIC8vIEFEUi0wNTAgTW9kbyBCOiBlc3RhIGFwcCBubyBjb21wYXJ0ZSBkb21pbmlvIHJhw616IGNvbiBlbCByZXN0byBkZWxcbiAgICAgIC8vIGZhY3RvcnkgKGJvb3RzdHJhcFNlc3Npb25Gcm9tSGludCBubyBhcGxpY2Eg4oCUIGxhIGNvb2tpZS1oaW50IG51bmNhXG4gICAgICAvLyBsbGVnYSBhcXXDrSkuIE5hdmVnYWNpw7NuIGRlIHDDoWdpbmEgY29tcGxldGEgYWwgQXV0aCBQcm94eSBDZW50cmFsO1xuICAgICAgLy8gdnVlbHZlIGNvbiBgP2hhbmRvZmY9YCBzaSBoYXkgc2VzacOzbiBhY3RpdmEuIFZlclxuICAgICAgLy8gVmFsdGVjaEF1dGhDb25maWcuYm9vdHN0cmFwU2Vzc2lvbkZyb21CcmlkZ2UuXG4gICAgICB0aGlzLnJlZGlyZWN0VG9TU09CcmlkZ2UoKTtcbiAgICAgIC8vIE5vIHNlZ3VpbW9zIGVsIHJlc3RvIGRlIGluaXRpYWxpemUoKSDigJQgbGEgcMOhZ2luYSBlc3TDoSBwb3IgbmF2ZWdhclxuICAgICAgLy8gZnVlcmEuIERlamFtb3MgbG9hZGluZz10cnVlIGEgcHJvcMOzc2l0bzogZWwgdW5sb2FkIGVzIGlubWluZW50ZS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyA1LiBJbmljaWFyIHNpbmNyb25pemFjacOzbiBlbnRyZSBwZXN0YcOxYXNcbiAgICBpZiAodGhpcy5jb25maWc/LmVuYWJsZVRhYlN5bmMpIHtcbiAgICAgIHRoaXMuc3luY1NlcnZpY2Uuc3RhcnQoKTtcbiAgICAgIHRoaXMuc3luY1N1YnNjcmlwdGlvbiA9IHRoaXMuc3luY1NlcnZpY2Uub25FdmVudCQuc3Vic2NyaWJlKGV2ZW50ID0+XG4gICAgICAgIHRoaXMuaGFuZGxlU3luY0V2ZW50KGV2ZW50KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRMb2FkaW5nKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDCv0hheSBzZXNpw7NuIGFjdGl2YSBlbiBsYSBmYW1pbGlhIHNlZ8O6biBsYSBjb29raWUtaGludCBKUy1yZWFkYWJsZT9cbiAgICpcbiAgICogRXNwZWpvIGxlZ2libGUgZGUgbGEgY29va2llIEh0dHBPbmx5IGB2YWx0ZWNoX3JlZnJlc2hgIChxdWUgSlMgbm8gcHVlZGUgbGVlcikuXG4gICAqIMOadGlsIHBhcmEgcXVlIHVuIHNpdGlvIHDDumJsaWNvIGRlY2lkYSBsYW5kaW5nLXZzLWFwcCBkZSBmb3JtYSBzw61uY3JvbmEsIHNpblxuICAgKiBlc3BlcmFyIGVsIGAvcmVmcmVzaGAuIE5PIGVzIHBydWViYSBkZSBzZXNpw7NuIHbDoWxpZGEgKGxhIGhpbnQgcHVlZGUgcXVlZGFyXG4gICAqIHN0YWxlKSDigJQgcGFyYSB1bmEgc2VzacOzbiByZWFsIHVzYXIgYGlzQXV0aGVudGljYXRlZCgpYCArIGBib290c3RyYXBTZXNzaW9uRnJvbUhpbnRgLlxuICAgKi9cbiAgaGFzTG9nZ2VkSW5IaW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmhhc0xvZ2dlZEluSGludCh0aGlzLmNvbmZpZz8ubG9nZ2VkSW5IaW50Q29va2llKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCb290c3RyYXAgY3Jvc3Mtb3JpZ2luIGRlIGxhIHNlc2nDs24gZGVzZGUgbGEgY29va2llLWhpbnQgZGUgZmFtaWxpYS5cbiAgICpcbiAgICogU2UgaW52b2NhIGRlc2RlIGBpbml0aWFsaXplKClgIGN1YW5kbyBubyBoYXkgdG9rZW4gbG9jYWwgcGVybyBsYSBhcHAgb3B0w7MgcG9yXG4gICAqIGBib290c3RyYXBTZXNzaW9uRnJvbUhpbnRgIHkgbGEgaGludCBlc3TDoSBwcmVzZW50ZS4gRWwgYC9yZWZyZXNoYCB1c2EgZWxcbiAgICogcmVmcmVzaCB0b2tlbiBIdHRwT25seSAoYFNhbWVTaXRlPU5vbmVgKSB2w6FsaWRvIGNyb3NzLW9yaWdpbi4gYHJlZnJlc2hBY2Nlc3NUb2tlbmBcbiAgICogcGVyc2lzdGUgZWwgdG9rZW4gKyBGaXJlYmFzZSArIHRpbWVyLCBwZXJvIE5PIG1hcmNhIGBpc0F1dGhlbnRpY2F0ZWRgIG5pXG4gICAqIHJlc3RhdXJhIGNsYWltcy9yb2xlcyDihpIgc2UgY29tcGxldGEgbGEgc2VzacOzbiBhY8OhLiBGYWxsYSBsaW1waW8gKGhpbnQgc3RhbGUgb1xuICAgKiBkZXYgY3Jvc3Mtc2l0ZSBjb24gY29va2llIGRlIHRlcmNlcm9zIGJsb3F1ZWFkYSkg4oaSIGludml0YWRvLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBib290c3RyYXBTZXNzaW9uRnJvbUhpbnRDb29raWUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gYm9vdHN0cmFwIOKAlCBubyBsb2NhbCB0b2tlbiBidXQgZmFtaWx5IGhpbnQgcHJlc2VudCwgcmVmcmVzaGluZycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKSk7XG4gICAgICBjb25zdCBjbGFpbXMgPSB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHJlc3AuYWNjZXNzVG9rZW4pO1xuICAgICAgY29uc3QgZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIHJlc3AuZXhwaXJlc0luICogMTAwMDtcbiAgICAgIGNvbnN0IGlzU3VwZXJBZG1pbiA9IChyZXNwLnBlcm1pc3Npb25zPy5pbmNsdWRlcygnKjoqJykgfHwgY2xhaW1zPy5hZG1pbiA9PT0gdHJ1ZSkgPz8gZmFsc2U7XG4gICAgICBjb25zdCBpc1ByZW1pdW0gPSBjbGFpbXM/LnByZW1pdW0gPT09IHRydWU7XG5cbiAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldEF1dGhlbnRpY2F0ZWQoe1xuICAgICAgICBhY2Nlc3NUb2tlbjogcmVzcC5hY2Nlc3NUb2tlbixcbiAgICAgICAgcmVmcmVzaFRva2VuOiByZXNwLnJlZnJlc2hUb2tlbixcbiAgICAgICAgdXNlcklkOiBjbGFpbXM/LnVpZCxcbiAgICAgICAgZW1haWw6IGNsYWltcz8uZW1haWwsXG4gICAgICAgIHJvbGVzOiByZXNwLnJvbGVzID8/IFtdLFxuICAgICAgICBwZXJtaXNzaW9uczogcmVzcC5wZXJtaXNzaW9ucyA/PyBbXSxcbiAgICAgICAgaXNTdXBlckFkbWluLFxuICAgICAgICBpc1ByZW1pdW0sXG4gICAgICAgIGV4cGlyZXNBdCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlU3RhdGUoe1xuICAgICAgICBhY2Nlc3NUb2tlbjogcmVzcC5hY2Nlc3NUb2tlbixcbiAgICAgICAgcmVmcmVzaFRva2VuOiByZXNwLnJlZnJlc2hUb2tlbixcbiAgICAgICAgcm9sZXM6IHJlc3Aucm9sZXMgPz8gW10sXG4gICAgICAgIHBlcm1pc3Npb25zOiByZXNwLnBlcm1pc3Npb25zID8/IFtdLFxuICAgICAgICBpc1N1cGVyQWRtaW4sXG4gICAgICAgIGlzUHJlbWl1bSxcbiAgICAgICAgZXhwaXJlc0F0LFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChjbGFpbXM/Lm9yZykge1xuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVBY3RpdmVPcmcoY2xhaW1zLm9yZyk7XG4gICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZUFjdGl2ZU9yZyhjbGFpbXMub3JnKTtcbiAgICAgIH1cbiAgICAgIGlmIChjbGFpbXM/LnVpZCkge1xuICAgICAgICB0aGlzLnNldHVwRmlyZXN0b3JlUkJBQ1N5bmMoY2xhaW1zLnVpZCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tWYWx0ZWNoQXV0aF0gYm9vdHN0cmFwIOKAlCBmYW1pbHkgaGludCByZWZyZXNoIGZhaWxlZCwgY29udGludWluZyBhcyBndWVzdCcpO1xuICAgICAgdGhpcy5jbGVhclN0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vbWJyZSBkZSBsYSBzZXNzaW9uU3RvcmFnZSBrZXkgdXNhZGEgY29tbyBndWFyZGEgYW50aS1sb29wIGRlbCBicmlkZ2UuXG4gICAqIGBzZXNzaW9uU3RvcmFnZWAgKG5vIGxvY2FsU3RvcmFnZSkg4oCUIGVsIGd1YXJkIGRlYmUgZXhwaXJhciBuYXR1cmFsbWVudGUgYWxcbiAgICogY2VycmFyIGxhIHBlc3Rhw7FhOyB1bmEgc2VzacOzbiBkZSBmYW1pbGlhIHJlY2nDqW4gaW5pY2lhZGEgZW4gb3RyYSBwZXN0YcOxYVxuICAgKiBkZWJlIHBvZGVyIHJlaW50ZW50YXIgZWwgYnJpZGdlIGVuIHVuYSBwZXN0YcOxYSBudWV2YS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNTT19CUklER0VfR1VBUkRfS0VZID0gJ3ZhbHRlY2hfc3NvX2JyaWRnZV9hdHRlbXB0ZWQnO1xuXG4gIC8qKlxuICAgKiDCv0NvcnJlc3BvbmRlIGRpc3BhcmFyIGVsIHJlZGlyZWN0IGFsIEF1dGggUHJveHkgQ2VudHJhbCAoQURSLTA1MCBNb2RvIEIpP1xuICAgKlxuICAgKiBGYWxzbyBzaTogbGEgY29uZmlnIG5vIGxvIGhhYmlsaXRhLCBmYWx0YSBgc3NvQnJpZGdlVXJsYCwgbm8gY29ycmVtb3MgZW5cbiAgICogdW4gYnJvd3NlciByZWFsIChTU1IvdGVzdHMpLCBvIGVzdGEgcGVzdGHDsWEgWUEgdm9sdmnDsyBkZSB1biBpbnRlbnRvIGRlXG4gICAqIGJyaWRnZSDigJQgc2luIGVzdGUgw7psdGltbyBndWFyZCwgdW4gYnJpZGdlIHF1ZSByZWRpcmlnZSBzaW4gYD9oYW5kb2ZmYFxuICAgKiAoc2luIHNlc2nDs24pIGRpc3BhcmFyw61hIHVuIGJ1Y2xlIGluZmluaXRvIGRlIHJlZGlyZWN0cyBlbiBjYWRhXG4gICAqIGBpbml0aWFsaXplKClgIHBvc3RlcmlvciBkZSBsYSBtaXNtYSBwZXN0YcOxYS5cbiAgICovXG4gIHByaXZhdGUgc2hvdWxkQm9vdHN0cmFwVmlhU1NPQnJpZGdlKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jb25maWc/LmJvb3RzdHJhcFNlc3Npb25Gcm9tQnJpZGdlIHx8ICF0aGlzLmNvbmZpZz8uc3NvQnJpZGdlVXJsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygc2Vzc2lvblN0b3JhZ2UgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShBdXRoU2VydmljZS5TU09fQlJJREdFX0dVQVJEX0tFWSkgPT09ICcxJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBzZXNzaW9uU3RvcmFnZSBibG9xdWVhZG8gKG1vZG8gcHJpdmFkbyBhZ3Jlc2l2bykg4oCUIG5vIGFycmllc2dhciB1blxuICAgICAgLy8gbG9vcCBzaW4gcG9kZXIgbWFyY2FyIGVsIGd1YXJkOyBub3MgYWJzdGVuZW1vcyBkZWwgYnJpZGdlLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZlZ2EgbGEgcMOhZ2luYSBjb21wbGV0YSBhbCBBdXRoIFByb3h5IENlbnRyYWwgY29uIGByZWRpcmVjdF91cmlgID0gbGFcbiAgICogVVJMIGFjdHVhbC4gRWwgYmFja2VuZCB2YWxpZGEgbGEgY29va2llIGB2YWx0ZWNoX3JlZnJlc2hgICh2aXNpYmxlIHNvbG9cbiAgICogZW4gc3UgcHJvcGlvIGRvbWluaW8sIHBvciBlc28gZWwgcmVkaXJlY3QgZGViZSBzZXIgdG9wLWxldmVsIG5hdmlnYXRpb25cbiAgICogeSBubyB1biBmZXRjaCkgeSByZWRpcmlnZSBkZSB2dWVsdGEgY29uIGA/aGFuZG9mZj1UT0tFTmAgc2kgaGF5IHNlc2nDs24uXG4gICAqXG4gICAqIE1hcmNhIGVsIGd1YXJkIEFOVEVTIGRlIG5hdmVnYXIg4oCUIHNpIGVsIGJyaWRnZSByZWRpcmlnZSBzaW4gYD9oYW5kb2ZmYFxuICAgKiAoc2luIHNlc2nDs24pLCBlbCBzaWd1aWVudGUgYGluaXRpYWxpemUoKWAgZGUgZXN0YSBwZXN0YcOxYSBubyBkZWJlIHZvbHZlclxuICAgKiBhIGludGVudGFyIGVsIGJyaWRnZS5cbiAgICovXG4gIHByaXZhdGUgcmVkaXJlY3RUb1NTT0JyaWRnZSgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShBdXRoU2VydmljZS5TU09fQlJJREdFX0dVQVJEX0tFWSwgJzEnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFNpIG5vIHBvZGVtb3MgbWFyY2FyIGVsIGd1YXJkLCBtZWpvciBubyBuYXZlZ2FyIOKAlCBldml0YSBlbCBsb29wLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWRpcmVjdFVyaSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIGNvbnN0IGJyaWRnZVVybCA9IG5ldyBVUkwodGhpcy5jb25maWchLnNzb0JyaWRnZVVybCEpO1xuICAgIGJyaWRnZVVybC5zZWFyY2hQYXJhbXMuc2V0KCdyZWRpcmVjdF91cmknLCByZWRpcmVjdFVyaSk7XG4gICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gYm9vdHN0cmFwIOKAlCBubyBsb2NhbCBzZXNzaW9uLCByZWRpcmVjdGluZyB0byBTU08gYnJpZGdlJyk7XG4gICAgdGhpcy5uYXZpZ2F0ZVRvU1NPQnJpZGdlVXJsKGJyaWRnZVVybC50b1N0cmluZygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZlZ2FjacOzbiByZWFsIChhaXNsYWRhIGVuIHN1IHByb3BpbyBtw6l0b2RvIHBhcmEgcG9kZXIgZXNwaWFybGEgZW5cbiAgICogdGVzdHMgdW5pdGFyaW9zIHNpbiBxdWUgS2FybWEgbmF2ZWd1ZSBkZSB2ZXJkYWQgZWwgcnVubmVyKS5cbiAgICovXG4gIHByaXZhdGUgbmF2aWdhdGVUb1NTT0JyaWRnZVVybCh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVmcmVzaFRpbWVyKCk7XG4gICAgdGhpcy5zeW5jU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMudGVhcmRvd25GaXJlc3RvcmVSQkFDU3luYygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFVVEVOVElDQUNJw5NOXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbmljaWEgc2VzacOzbiBjb24gZW1haWwgeSBjb250cmFzZcOxYS5cbiAgICogRGV0ZWN0YSBhdXRvbcOhdGljYW1lbnRlIGxhIHBsYXRhZm9ybWEgcGFyYSBpZGVudGlmaWNhciBkaXNwb3NpdGl2b3MgbnVldm9zLlxuICAgKi9cbiAgc2lnbmluKHJlcXVlc3Q6IFNpZ25pblJlcXVlc3QpOiBPYnNlcnZhYmxlPFNpZ25pblJlc3BvbnNlPiB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyTUZBUGVuZGluZygpO1xuXG4gICAgLy8gQWdyZWdhciBpbmZvIGRlIHBsYXRhZm9ybWEgcGFyYSBkZXZpY2UgZGV0ZWN0aW9uXG4gICAgY29uc3QgcGxhdGZvcm1JbmZvID0gdGhpcy5kZXRlY3RQbGF0Zm9ybUluZm8oKTtcbiAgICBjb25zdCBlbnJpY2hlZFJlcXVlc3Q6IFNpZ25pblJlcXVlc3QgPSB7XG4gICAgICAuLi5yZXF1ZXN0LFxuICAgICAgcGxhdGZvcm06IHJlcXVlc3QucGxhdGZvcm0gPz8gcGxhdGZvcm1JbmZvLnBsYXRmb3JtLFxuICAgICAgYnJvd3NlcjogcmVxdWVzdC5icm93c2VyID8/IHBsYXRmb3JtSW5mby5icm93c2VyLFxuICAgICAgb3M6IHJlcXVlc3Qub3MgPz8gcGxhdGZvcm1JbmZvLm9zLFxuICAgIH07XG5cbiAgICAvLyB3aXRoQ3JlZGVudGlhbHM6IGVsIGJhY2tlbmQgc2V0ZWEgbGEgY29va2llIEh0dHBPbmx5IGRlIHJlZnJlc2ggKHZhbHRlY2hfcmVmcmVzaClcbiAgICAvLyBlbiBsYSByZXNwdWVzdGEuIEVsIGJyb3dzZXIgc29sbyBhbG1hY2VuYSBlc2UgU2V0LUNvb2tpZSBjcm9zcy1vcmlnaW4gc2kgbGFcbiAgICAvLyByZXF1ZXN0IHNlIGhpem8gY29uIGNyZWRlbmNpYWxlcy4gU2luIGVzdG8gbGEgY29va2llIG5vIHBlcnNpc3RlIHkgL3JlZnJlc2hcbiAgICAvLyBmYWxsYSBzaWVtcHJlICg0MDApIOKGkiBsYSBzZXNpw7NuIG5vIGR1cmEgKEgtMDUpLlxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFNpZ25pblJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3NpZ25pbmAsIGVucmljaGVkUmVxdWVzdCwgeyB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5tZmFSZXF1aXJlZCkge1xuICAgICAgICAgICAgLy8gTUZBIHJlcXVlcmlkbyAtIGd1YXJkYXIgZXN0YWRvIHRlbXBvcmFsXG4gICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRNRkFQZW5kaW5nKHtcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIG1mYVRva2VuOiByZXNwb25zZS5tZmFUb2tlbiEsXG4gICAgICAgICAgICAgIG1ldGhvZDogcmVzcG9uc2UubWZhTWV0aG9kISxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgIC8vIExvZ2luIGV4aXRvc28gc2luIE1GQVxuICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsQXV0aChyZXNwb25zZSk7XG5cbiAgICAgICAgICAgIC8vIE5vdGlmaWNhciBzaSBlcyB1biBkaXNwb3NpdGl2byBudWV2b1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmlzTmV3RGV2aWNlKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIE5ldyBkZXZpY2UgZGV0ZWN0ZWQ6JywgcmVzcG9uc2UuZGV2aWNlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPQVVUSCAoTG9naW4gc29jaWFsKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pY2lhIHNlc2nDs24gY29uIE9BdXRoIChHb29nbGUsIEFwcGxlLCBNaWNyb3NvZnQpLlxuICAgKiBBYnJlIHVuIHBvcHVwIHBhcmEgZWwgZmx1am8gZGUgYXV0ZW50aWNhY2nDs24uXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFByb3ZlZWRvciBPQXV0aCAoJ2dvb2dsZScsICdhcHBsZScsICdtaWNyb3NvZnQnKVxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHF1ZSBlbWl0ZSBTaWduaW5SZXNwb25zZSBjdWFuZG8gc2UgY29tcGxldGFcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB0aGlzLmF1dGguc2lnbmluV2l0aE9BdXRoKCdnb29nbGUnKS5zdWJzY3JpYmUoe1xuICAgKiAgIG5leHQ6ICgpID0+IHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLyddKSxcbiAgICogICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcignT0F1dGggZmFpbGVkOicsIGVycilcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgc2lnbmluV2l0aE9BdXRoKHByb3ZpZGVyOiBPQXV0aFByb3ZpZGVyKTogT2JzZXJ2YWJsZTxTaWduaW5SZXNwb25zZT4ge1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyRXJyb3IoKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhck1GQVBlbmRpbmcoKTtcblxuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5zdGFydEZsb3cocHJvdmlkZXIpLnBpcGUoXG4gICAgICB0YXAocmVzdWx0ID0+IHtcbiAgICAgICAgLy8gTUZBIHJlcXVlcmlkbyB0cmFzIE9BdXRoIOKAlCBndWFyZGFyIGVzdGFkbyB0ZW1wb3JhbCwgTk8gYXV0ZW50aWNhci5cbiAgICAgICAgLy8gRWwgbG9naW4gY29tcG9uZW50IHJlYWNjaW9uYSBhIGBtZmFQZW5kaW5nKClgIHkgYWJyZSBlbCBtb2RhbCB2ZXJpZnkuXG4gICAgICAgIGlmIChyZXN1bHQubWZhUmVxdWlyZWQpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRNRkFQZW5kaW5nKHtcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbWZhVG9rZW46IHJlc3VsdC5tZmFUb2tlbiEsXG4gICAgICAgICAgICBtZXRob2Q6IHJlc3VsdC5tZmFNZXRob2QhLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnRpciBPQXV0aFJlc3VsdCBhIFNpZ25pblJlc3BvbnNlIGNvbXBhdGlibGVcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IFNpZ25pblJlc3BvbnNlID0ge1xuICAgICAgICAgIG9wZXJhdGlvbklkOiAnb2F1dGgnLFxuICAgICAgICAgIGFjY2Vzc1Rva2VuOiByZXN1bHQuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgcmVmcmVzaFRva2VuOiByZXN1bHQucmVmcmVzaFRva2VuLFxuICAgICAgICAgIGZpcmViYXNlVG9rZW46IHJlc3VsdC5maXJlYmFzZVRva2VuLFxuICAgICAgICAgIGV4cGlyZXNJbjogcmVzdWx0LmV4cGlyZXNJbixcbiAgICAgICAgICByb2xlczogcmVzdWx0LnJvbGVzLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiByZXN1bHQucGVybWlzc2lvbnMsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlU3VjY2Vzc2Z1bEF1dGgocmVzcG9uc2UpO1xuICAgICAgfSksXG4gICAgICBtYXAocmVzdWx0ID0+XG4gICAgICAgIHJlc3VsdC5tZmFSZXF1aXJlZFxuICAgICAgICAgID8gKHtcbiAgICAgICAgICAgICAgb3BlcmF0aW9uSWQ6ICdvYXV0aCcsXG4gICAgICAgICAgICAgIG1mYVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBtZmFUb2tlbjogcmVzdWx0Lm1mYVRva2VuLFxuICAgICAgICAgICAgICBtZmFNZXRob2Q6IHJlc3VsdC5tZmFNZXRob2QsXG4gICAgICAgICAgICB9IGFzIFNpZ25pblJlc3BvbnNlKVxuICAgICAgICAgIDogKHtcbiAgICAgICAgICAgICAgb3BlcmF0aW9uSWQ6ICdvYXV0aCcsXG4gICAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiByZXN1bHQuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogcmVzdWx0LnJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgICAgZmlyZWJhc2VUb2tlbjogcmVzdWx0LmZpcmViYXNlVG9rZW4sXG4gICAgICAgICAgICAgIGV4cGlyZXNJbjogcmVzdWx0LmV4cGlyZXNJbixcbiAgICAgICAgICAgICAgcm9sZXM6IHJlc3VsdC5yb2xlcyxcbiAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IHJlc3VsdC5wZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIH0gYXMgU2lnbmluUmVzcG9uc2UpXG4gICAgICApLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgIGNvbnN0IGF1dGhFcnJvcjogQXV0aEVycm9yID0ge1xuICAgICAgICAgIGNvZGU6IGVycm9yLmNvZGUgfHwgJ09BVVRIX0VSUk9SJyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIHx8ICdFcnJvciBkZSBhdXRlbnRpY2FjacOzbiBPQXV0aCcsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldEVycm9yKGF1dGhFcnJvcik7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGF1dGhFcnJvcik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ29udGluw7phIHVuIGxvZ2luIE9BdXRoIHF1ZSB2b2x2acOzIHBvciByZWRpcmVjdCBwcmluY2lwYWwgY29uIE1GQSByZXF1ZXJpZG8uXG4gICAqIEVuIGVzZSBjYXNvIGBzaWduaW5XaXRoT0F1dGgoKWAgbm8gcHVlZGUgZW1pdGlyIHBvcnF1ZSBsYSBww6FnaW5hIG5hdmVnw7MgYWxcbiAgICogYmFja2VuZCBPQXV0aCB5IGVsIGNhbGxiYWNrIGNvcnJlIGVuIHVuYSBydXRhIG51ZXZhIGRlIGxhIG1pc21hIFNQQS5cbiAgICovXG4gIHNldE9BdXRoTUZBUGVuZGluZyhtZmFUb2tlbjogc3RyaW5nLCBtZXRob2Q6IE1GQU1ldGhvZCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyRXJyb3IoKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRNRkFQZW5kaW5nKHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgbWZhVG9rZW4sXG4gICAgICBtZXRob2QsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmluY3VsYSB1biBwcm92ZWVkb3IgT0F1dGggYWRpY2lvbmFsIGEgbGEgY3VlbnRhIGFjdHVhbC5cbiAgICogUmVxdWllcmUgcXVlIGVsIHVzdWFyaW8gZXN0w6kgYXV0ZW50aWNhZG8uXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFByb3ZlZWRvciBPQXV0aCBhIHZpbmN1bGFyXG4gICAqL1xuICBsaW5rT0F1dGhQcm92aWRlcihwcm92aWRlcjogT0F1dGhQcm92aWRlcik6IE9ic2VydmFibGU8eyBzdWNjZXNzOiBib29sZWFuIH0+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2Uuc3RhcnRMaW5rRmxvdyhwcm92aWRlcikucGlwZShcbiAgICAgIG1hcCgoKSA9PiAoeyBzdWNjZXNzOiB0cnVlIH0pKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICBjb25zdCBhdXRoRXJyb3I6IEF1dGhFcnJvciA9IHtcbiAgICAgICAgICBjb2RlOiBlcnJvci5jb2RlIHx8ICdMSU5LX0VSUk9SJyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIHx8ICdFcnJvciBhbCB2aW5jdWxhciBwcm92ZWVkb3InLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRFcnJvcihhdXRoRXJyb3IpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBhdXRoRXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbG9zIHByb3ZlZWRvcmVzIE9BdXRoIHZpbmN1bGFkb3MgYWwgdXN1YXJpby5cbiAgICovXG4gIGdldExpbmtlZFByb3ZpZGVycygpOiBPYnNlcnZhYmxlPExpbmtlZFByb3ZpZGVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2UuZ2V0TGlua2VkUHJvdmlkZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdmluY3VsYSB1biBwcm92ZWVkb3IgT0F1dGggZGUgbGEgY3VlbnRhLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBQcm92ZWVkb3IgYSBkZXN2aW5jdWxhclxuICAgKi9cbiAgdW5saW5rT0F1dGhQcm92aWRlcihwcm92aWRlcjogT0F1dGhQcm92aWRlcik6IE9ic2VydmFibGU8eyBzdWNjZXNzOiBib29sZWFuIH0+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2UudW5saW5rUHJvdmlkZXIocHJvdmlkZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGFibGVjZSBjb250cmFzZcOxYSBwYXJhIHVzdWFyaW9zIHF1ZSBzb2xvIHRpZW5lbiBPQXV0aC5cbiAgICogUGVybWl0ZSBxdWUgdXN1YXJpb3MgT0F1dGgtb25seSBwdWVkYW4gdGFtYmnDqW4gdXNhciBlbWFpbC9wYXNzd29yZC5cbiAgICpcbiAgICogQHBhcmFtIHBhc3N3b3JkIC0gTnVldmEgY29udHJhc2XDsWFcbiAgICovXG4gIHNldFBhc3N3b3JkRm9yT0F1dGhVc2VyKHBhc3N3b3JkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHsgc3VjY2VzczogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLnNldFBhc3N3b3JkKHBhc3N3b3JkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHRpZW5lIGNvbnRyYXNlw7FhIGVzdGFibGVjaWRhLlxuICAgKiDDmnRpbCBwYXJhIG1vc3RyYXIvb2N1bHRhciBvcGNpb25lcyBkZSBjYW1iaW8gZGUgY29udHJhc2XDsWEuXG4gICAqL1xuICBjaGVja0hhc1Bhc3N3b3JkKCk6IE9ic2VydmFibGU8SGFzUGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5oYXNQYXNzd29yZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdHJhIHVuIG51ZXZvIHVzdWFyaW8uXG4gICAqIEVsIHVzdWFyaW8gcXVlZGEgZW4gZXN0YWRvIFBFTkRJTkcgaGFzdGEgdmVyaWZpY2FyIHN1IGVtYWlsLlxuICAgKi9cbiAgc2lnbnVwKHJlcXVlc3Q6IFNpZ251cFJlcXVlc3QpOiBPYnNlcnZhYmxlPFNpZ251cFJlc3BvbnNlPiB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8U2lnbnVwUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vc2lnbnVwYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2EgZW1haWwgY29uIGPDs2RpZ28gZGUgNiBkw61naXRvcy5cbiAgICogU2kgZXMgZXhpdG9zbywgaGFjZSBhdXRvLWxvZ2luIHkgcmV0b3JuYSB0b2tlbnMuXG4gICAqL1xuICB2ZXJpZnlFbWFpbChyZXF1ZXN0OiBWZXJpZnlFbWFpbFJlcXVlc3QpOiBPYnNlcnZhYmxlPFZlcmlmeUVtYWlsUmVzcG9uc2U+IHtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhckVycm9yKCk7XG5cbiAgICAvLyB3aXRoQ3JlZGVudGlhbHM6IGVsIHZlcmlmeS1lbWFpbCBhdXRvLWxvZ3VlYSB5IHNldGVhIGxhIGNvb2tpZSBIdHRwT25seSBkZVxuICAgIC8vIHJlZnJlc2guIFNpbiBjcmVkZW5jaWFsZXMgZWwgYnJvd3NlciBkZXNjYXJ0YSBlbCBTZXQtQ29va2llIOKGkiAvcmVmcmVzaCA0MDAgKEgtMDUpLlxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFZlcmlmeUVtYWlsUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vdmVyaWZ5LWVtYWlsYCwgcmVxdWVzdCwgeyB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZS52ZXJpZmllZCAmJiByZXNwb25zZS5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgLy8gQXV0by1sb2dpbjogZ3VhcmRhciB0b2tlbnMgeSBhY3R1YWxpemFyIGVzdGFkb1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsQXV0aChyZXNwb25zZSBhcyB1bmtub3duIGFzIFNpZ25pblJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVlbnbDrWEgY8OzZGlnbyBkZSB2ZXJpZmljYWNpw7NuIGFsIGVtYWlsLlxuICAgKi9cbiAgcmVzZW5kQ29kZShyZXF1ZXN0OiBSZXNlbmRDb2RlUmVxdWVzdCk6IE9ic2VydmFibGU8UmVzZW5kQ29kZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8UmVzZW5kQ29kZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Jlc2VuZC1jb2RlYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2EgY8OzZGlnbyBNRkEuXG4gICAqL1xuICB2ZXJpZnlNRkEoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxNRkFWZXJpZnlSZXNwb25zZT4ge1xuICAgIGNvbnN0IG1mYVN0YXRlID0gdGhpcy5tZmFQZW5kaW5nKCk7XG4gICAgaWYgKCFtZmFTdGF0ZS5tZmFUb2tlbikge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gKHtcbiAgICAgICAgY29kZTogJ01GQV9OT1RfUEVORElORycsXG4gICAgICAgIG1lc3NhZ2U6ICdObyBoYXkgdmVyaWZpY2FjacOzbiBNRkEgcGVuZGllbnRlJyxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFWZXJpZnlSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvdmVyaWZ5YCwge1xuICAgICAgICBtZmFUb2tlbjogbWZhU3RhdGUubWZhVG9rZW4sXG4gICAgICAgIGNvZGUsXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJNRkFQZW5kaW5nKCk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsQXV0aChyZXNwb25zZSk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzY2EgZWwgdG9rZW4gZGUgYWNjZXNvLlxuICAgKiBJbXBsZW1lbnRhIHRva2VuIHJvdGF0aW9uOiBjYWRhIHJlZnJlc2ggZ2VuZXJhIHVuIG51ZXZvIHJlZnJlc2ggdG9rZW5cbiAgICogcXVlIGVsIGNsaWVudGUgZGViZSBndWFyZGFyIHBhcmEgZWwgcHLDs3hpbW8gcmVmcmVzaC5cbiAgICovXG4gIHJlZnJlc2hBY2Nlc3NUb2tlbigpOiBPYnNlcnZhYmxlPFJlZnJlc2hSZXNwb25zZT4ge1xuICAgIC8vIFNpbmdsZS1mbGlnaHQ6IHNpIHlhIGhheSB1biAvcmVmcmVzaCBlbiB2dWVsbywgZGV2b2x2ZW1vcyBlbCBNSVNNT1xuICAgIC8vIG9ic2VydmFibGUgKG11bHRpY2FzdCB2w61hIHNoYXJlUmVwbGF5KS4gRXZpdGEgbGEgY2FycmVyYSBjb250cmEgbGEgcm90YWNpw7NuXG4gICAgLy8gZGUgcmVmcmVzaCB0b2tlbiBkZWwgYmFja2VuZCwgcXVlIHByb2R1Y8OtYSA0MDEgZXNwdXJpb3Mg4oaSIGxvZ291dCBhbFxuICAgIC8vIGFjdHVhbGl6YXIuIFZlciBpbkZsaWdodFJlZnJlc2gkIHkgcHJvamVjdF9wd2EtbG9naW4tZnJlZXplLlxuICAgIGlmICh0aGlzLmluRmxpZ2h0UmVmcmVzaCQpIHtcbiAgICAgIHJldHVybiB0aGlzLmluRmxpZ2h0UmVmcmVzaCQ7XG4gICAgfVxuXG4gICAgLy8gSC0wNSBzYW1lLXNpdGUtYXdhcmU6IGVuIHNhbWUtc2l0ZSAocHJvZCkgZWwgcmVmcmVzaCB2YSBTT0xPIHBvciBsYSBjb29raWVcbiAgICAvLyBIdHRwT25seSAoYm9keSB2YWPDrW8pLCBubyBzZSBwZXJzaXN0ZSBlbiBsb2NhbFN0b3JhZ2Ug4oaSIHVuIFhTUyBubyBsbyByb2JhLlxuICAgIC8vIEVuIGNyb3NzLXNpdGUgKGRldikgbGEgY29va2llIGRlIHRlcmNlcm9zIHNlIGJsb3F1ZWEgKFNhZmFyaSBJVFAgLyBDaHJvbWVcbiAgICAvLyAzcmQtcGFydHkgcGhhc2Utb3V0KSDihpIgc2UgbWFuZGEgZW4gZWwgYm9keSArIHNlIHBlcnNpc3RlIChmYWxsYmFjaykuXG4gICAgLy8gd2l0aENyZWRlbnRpYWxzIGFkanVudGEgbGEgY29va2llIGN1YW5kbyBlbCBicm93c2VyIGxhIHBlcm1pdGUuXG4gICAgY29uc3QgY3VycmVudEFjdGl2ZU9yZyA9IHRoaXMuc3RhdGUoKS5hY3RpdmVPcmcgfHwgdGhpcy5zdG9yYWdlU2VydmljZS5nZXRBY3RpdmVPcmcoKTtcbiAgICBjb25zdCBib2R5OiBSZWZyZXNoUmVxdWVzdCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuY29va2llT25seVxuICAgICAgPyB7IGFjdGl2ZU9yZ0lkOiBjdXJyZW50QWN0aXZlT3JnIH1cbiAgICAgIDogeyByZWZyZXNoVG9rZW46IHRoaXMuc3RhdGUoKS5yZWZyZXNoVG9rZW4sIGFjdGl2ZU9yZ0lkOiBjdXJyZW50QWN0aXZlT3JnIH07XG5cbiAgICB0aGlzLmluRmxpZ2h0UmVmcmVzaCQgPSB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFJlZnJlc2hSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9yZWZyZXNoYCwgYm9keSwgeyB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICAvLyBOdW5jYSBkZWphciBlbCByZWZyZXNoIGNvbGdhZG86IHNpIGxhIHJlZC9MYW1iZGEgbm8gcmVzcG9uZGUgYSB0aWVtcG8sXG4gICAgICAgIC8vIGVtaXRpbW9zIGVycm9yIOKGkiBsb3MgY2FsbGVycyAoaW5pdGlhbGl6ZSwgaW50ZXJjZXB0b3IpIGxvIG1hbmVqYW4geSBsYVxuICAgICAgICAvLyBVSSBkZWphIGRlIGVzcGVyYXIuIFZlciBSRUZSRVNIX1RJTUVPVVRfTVMuXG4gICAgICAgIHRpbWVvdXQoUkVGUkVTSF9USU1FT1VUX01TKSxcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgcmVzcG9uc2UuZXhwaXJlc0luICogMTAwMDtcblxuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjY2Vzc1Rva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuLCByZXNwb25zZS5leHBpcmVzSW4pO1xuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVJlZnJlc2hUb2tlbihyZXNwb25zZS5yZWZyZXNoVG9rZW4pO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZUFjY2Vzc1Rva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuLCBleHBpcmVzQXQpO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVJlZnJlc2hUb2tlbihyZXNwb25zZS5yZWZyZXNoVG9rZW4pOyAvLyBzZWxmLWdhdGU6IG5vLW9wIGVuIGNvb2tpZU9ubHlcblxuICAgICAgICAgIC8vIFN5bmMgaXNTdXBlckFkbWluIGZyb20gcmVmcmVzaGVkIEpXVCBzbyBwbGF0Zm9ybSBhZG1pbiBwcm9tb3Rpb24vcmV2b2NhdGlvblxuICAgICAgICAgIC8vIHRha2VzIGVmZmVjdCB3aXRob3V0IHJlcXVpcmluZyBhIGZ1bGwgcmUtbG9naW4uXG4gICAgICAgICAgY29uc3QgcGFyc2VkVG9rZW4gPSB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgICBpZiAocGFyc2VkVG9rZW4/Lm9yZykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKHBhcnNlZFRva2VuLm9yZyk7XG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVBY3RpdmVPcmcocGFyc2VkVG9rZW4ub3JnLCB7IHBlcnNpc3RQcmVmZXJyZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBuZXdJc1N1cGVyQWRtaW4gPVxuICAgICAgICAgICAgcmVzcG9uc2UucGVybWlzc2lvbnM/LmluY2x1ZGVzKCcqOionKSB8fCBwYXJzZWRUb2tlbj8uYWRtaW4gPT09IHRydWUgfHwgZmFsc2U7XG4gICAgICAgICAgY29uc3QgbmV3Um9sZXMgPSByZXNwb25zZS5yb2xlcyA/PyB0aGlzLnN0YXRlKCkucm9sZXM7XG4gICAgICAgICAgY29uc3QgbmV3UGVybXMgPSByZXNwb25zZS5wZXJtaXNzaW9ucyA/PyB0aGlzLnN0YXRlKCkucGVybWlzc2lvbnM7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUGVybWlzc2lvbnMobmV3Um9sZXMsIG5ld1Blcm1zLCBuZXdJc1N1cGVyQWRtaW4pO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVBlcm1pc3Npb25zKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbklkOiAnJyxcbiAgICAgICAgICAgIHJvbGVzOiBuZXdSb2xlcyxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBuZXdQZXJtcyxcbiAgICAgICAgICAgIGlzU3VwZXJBZG1pbjogbmV3SXNTdXBlckFkbWluLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnPy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uICYmIHJlc3BvbnNlLmZpcmViYXNlVG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2lnbkluV2l0aEZpcmViYXNlKHJlc3BvbnNlLmZpcmViYXNlVG9rZW4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcbiAgICAgICAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7XG4gICAgICAgICAgICB0eXBlOiAnVE9LRU5fUkVGUkVTSCcsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZS5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgICAgcmVmcmVzaFRva2VuOiByZXNwb25zZS5yZWZyZXNoVG9rZW4sIC8vIE5VRVZPOiBzaW5jcm9uaXphciBlbnRyZSB0YWJzXG4gICAgICAgICAgICAgIGV4cGlyZXNBdCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICAvLyBEbyBOT1QgY2FsbCBsb2dvdXQoKSBoZXJlIOKAlCBjYWxsZXJzIGRlY2lkZSB3aGF0IHRvIGRvIG9uIGZhaWx1cmUuXG4gICAgICAgICAgLy8gVGhlIGF1dGggaW50ZXJjZXB0b3IgYWxyZWFkeSBjYWxscyBsb2dvdXQoKSBleHBsaWNpdGx5LCBhbmRcbiAgICAgICAgICAvLyBpbml0aWFsaXplKCkgb25seSBjbGVhcnMgc3RhdGUgKG5vIHJlZGlyZWN0KS4gQXV0by1uYXZpZ2F0aW5nIHRvXG4gICAgICAgICAgLy8gL2xvZ2luIGZyb20gdGhpcyBtZXRob2QgcmVkaXJlY3RzIGV2ZW4gdXNlcnMgb24gcHVibGljIHJvdXRlcy5cbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICAgIH0pLFxuICAgICAgICAvLyBMaWJlcmFyIGVsIHNsb3QgYWwgdGVybWluYXIgKMOpeGl0bywgZXJyb3IgbyB0aW1lb3V0KSBwYXJhIHF1ZSBlbFxuICAgICAgICAvLyBwcsOzeGltbyByZWZyZXNoIHJlYWwgYXJyYW5xdWUgdW5vIG51ZXZvLlxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbkZsaWdodFJlZnJlc2gkID0gbnVsbDtcbiAgICAgICAgfSksXG4gICAgICAgIC8vIE11bHRpY2FzdDogbG9zIHNpZGUtZWZmZWN0cyBkZWwgdGFwIGNvcnJlbiBVTkEgdmV6IHkgdG9kb3MgbG9zIGNhbGxlcnNcbiAgICAgICAgLy8gY29uY3VycmVudGVzIHJlY2liZW4gbGEgbWlzbWEgcmVzcHVlc3RhL2Vycm9yLiByZWZDb3VudDpmYWxzZSDihpIgcXVlIHVuXG4gICAgICAgIC8vIGNhbGxlciBzZSBkZXN1c2NyaWJlIHRlbXByYW5vIE5PIGNhbmNlbGEgbGEgcm90YWNpw7NuIGRlIHRva2VuIGVuIHZ1ZWxvLlxuICAgICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiBmYWxzZSB9KVxuICAgICAgKTtcblxuICAgIHJldHVybiB0aGlzLmluRmxpZ2h0UmVmcmVzaCQ7XG4gIH1cblxuICAvKipcbiAgICogTWFuZWphIGF1dGVudGljYWNpw7NuIGV4aXRvc2EgZGVzZGUgZnVlbnRlcyBleHRlcm5hcyAoT0F1dGgsIGV0YykuXG4gICAqIEd1YXJkYSB0b2tlbnMsIGFjdHVhbGl6YSBlc3RhZG8sIGluaWNpYSBGaXJlYmFzZSBzaSBjb3JyZXNwb25kZS5cbiAgICpcbiAgICogQHBhcmFtIGF1dGhSZXN1bHQgLSBSZXN1bHRhZG8gZGUgYXV0ZW50aWNhY2nDs24gY29uIHRva2Vuc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlc2RlIHVuIGZsdWpvIE9BdXRoIGV4dGVybm9cbiAgICogZXh0ZXJuYWxPQXV0aC5zaWduSW4oKS5zdWJzY3JpYmUoe1xuICAgKiAgIG5leHQ6IChyZXN1bHQpID0+IHtcbiAgICogICAgIHRoaXMuYXV0aFNlcnZpY2Uuc2V0RXh0ZXJuYWxBdXRoKHJlc3VsdCk7XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBzZXRFeHRlcm5hbEF1dGgoYXV0aFJlc3VsdDoge1xuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gICAgZmlyZWJhc2VUb2tlbj86IHN0cmluZztcbiAgICBleHBpcmVzSW46IG51bWJlcjtcbiAgICByb2xlcz86IHN0cmluZ1tdO1xuICAgIHBlcm1pc3Npb25zPzogc3RyaW5nW107XG4gIH0pOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHtcbiAgICAgIC4uLmF1dGhSZXN1bHQsXG4gICAgICBvcGVyYXRpb25JZDogJ2V4dGVybmFsLWF1dGgnLFxuICAgICAgdG9rZW5UeXBlOiAnQmVhcmVyJyxcbiAgICB9IGFzIFNpZ25pblJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaWVycmEgc2VzacOzbiB0cmFzIHBlZGlyIGNvbmZpcm1hY2nDs24gYWwgdXN1YXJpby5cbiAgICpcbiAgICogTXVlc3RyYSB1biBkacOhbG9nbyBuYXRpdm8gKGVzdGlsbyBkZXN0cnVjdGl2bykuIFNpIGVsIHVzdWFyaW8gY29uZmlybWEsXG4gICAqIGVqZWN1dGEgYGxvZ291dCgpYC4gU2kgY2FuY2VsYSwgbm8gcGFzYSBuYWRhLlxuICAgKlxuICAgKiBUZXh0byBwb3IgZGVmZWN0byBkZXNkZSBgX2dsb2JhbGAgaTE4bjogYGxvZ291dENvbmZpcm1UaXRsZWAsXG4gICAqIGBsb2dvdXRDb25maXJtTWVzc2FnZWAsIGBsb2dvdXRgLCBgY2FuY2VsYC4gT3ZlcnJpZGUgdmlhIGBvcHRzYC5cbiAgICpcbiAgICogQHJldHVybnMgdHJ1ZSBzaSBlbCB1c3VhcmlvIGNvbmZpcm3DsyAobG9nb3V0IGVqZWN1dGFkbyksIGZhbHNlIHNpIGNhbmNlbMOzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBvbkxvZ291dENsaWNrKCkgeyB0aGlzLmF1dGgubG9nb3V0V2l0aENvbmZpcm1hdGlvbigpOyB9XG4gICAqL1xuICBhc3luYyBsb2dvdXRXaXRoQ29uZmlybWF0aW9uKG9wdHM/OiB7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgbWVzc2FnZT86IHN0cmluZztcbiAgICBjb25maXJtVGV4dD86IHN0cmluZztcbiAgICBjYW5jZWxUZXh0Pzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdCA9IChrZXk6IHN0cmluZywgZmFsbGJhY2s6IHN0cmluZykgPT4gdGhpcy5pMThuU2VydmljZT8udChrZXkpIHx8IGZhbGxiYWNrO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtRGVzdHJ1Y3RpdmUoe1xuICAgICAgdGl0bGU6IG9wdHM/LnRpdGxlID8/IHQoJ2xvZ291dENvbmZpcm1UaXRsZScsICdDZXJyYXIgc2VzacOzbicpLFxuICAgICAgbWVzc2FnZTogb3B0cz8ubWVzc2FnZSA/PyB0KCdsb2dvdXRDb25maXJtTWVzc2FnZScsICfCv1NlZ3VybyBxdWUgZGVzZWFzIGNlcnJhciBzZXNpw7NuPycpLFxuICAgICAgY29uZmlybUJ1dHRvbjogeyB0ZXh0OiBvcHRzPy5jb25maXJtVGV4dCA/PyB0KCdsb2dvdXQnLCAnQ2VycmFyIHNlc2nDs24nKSB9LFxuICAgICAgY2FuY2VsQnV0dG9uOiB7IHRleHQ6IG9wdHM/LmNhbmNlbFRleHQgPz8gdCgnY2FuY2VsJywgJ0NhbmNlbGFyJykgfSxcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQuY29uZmlybWVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvZ291dCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaWVycmEgc2VzacOzbi5cbiAgICovXG4gIGFzeW5jIGxvZ291dChvcHRpb25zOiB7IHJlZGlyZWN0PzogYm9vbGVhbjsgYnJvYWRjYXN0PzogYm9vbGVhbiB9ID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZWRpcmVjdCA9IG9wdGlvbnMucmVkaXJlY3QgPz8gIXRoaXMuaXNDdXJyZW50Um91dGVQdWJsaWMoKTtcbiAgICBjb25zdCBicm9hZGNhc3QgPSBvcHRpb25zLmJyb2FkY2FzdCA/PyB0cnVlO1xuXG4gICAgLy8gRWxpbWluYXIgZGlzcG9zaXRpdm8gZGVsIGJhY2tlbmQgYW50ZXMgZGUgY2VycmFyIHNlc2nDs25cbiAgICBhd2FpdCB0aGlzLnVucmVnaXN0ZXJEZXZpY2UoKTtcblxuICAgIC8vIE5vdGlmaWNhciBhbCBiYWNrZW5kIChmaXJlIGFuZCBmb3JnZXQpLiBILTA1IHNhbWUtc2l0ZS1hd2FyZTogZW4gc2FtZS1zaXRlXG4gICAgLy8gZWwgcmVmcmVzaCB2YSBwb3IgbGEgY29va2llIEh0dHBPbmx5OyBlbiBjcm9zcy1zaXRlIHNlIG1hbmRhIGVuIGVsIGJvZHkuXG4gICAgLy8gd2l0aENyZWRlbnRpYWxzIGFkanVudGEgbGEgY29va2llOyBlbCBiYWNrZW5kIHJldm9jYSBsYSBzZXNpw7NuICsgbGEgZXhwaXJhLlxuICAgIGNvbnN0IGJvZHkgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmNvb2tpZU9ubHkgPyB7fSA6IHsgcmVmcmVzaFRva2VuOiB0aGlzLnN0YXRlKCkucmVmcmVzaFRva2VuIH07XG4gICAgdGhpcy5odHRwXG4gICAgICAucG9zdChgJHt0aGlzLmJhc2VVcmx9L2xvZ291dGAsIGJvZHksIHsgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSlcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIC8vIENlcnJhciBzZXNpw7NuIGRlIEZpcmViYXNlIHNpIGVzdMOhIGludGVncmFkb1xuICAgIHRoaXMuc2lnbk91dEZpcmViYXNlKCk7XG5cbiAgICB0aGlzLmNsZWFyU3RhdGUoKTtcbiAgICBpZiAoYnJvYWRjYXN0KSB7XG4gICAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7IHR5cGU6ICdMT0dPVVQnIH0pO1xuICAgIH1cbiAgICBpZiAocmVkaXJlY3QpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmNvbmZpZz8ubG9naW5Sb3V0ZV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNRkEgU0VUVVAgKHVzdWFyaW8gYXV0ZW50aWNhZG8pXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmEgTUZBIHBhcmEgZWwgdXN1YXJpby5cbiAgICovXG4gIHNldHVwTUZBKG1ldGhvZDogTUZBTWV0aG9kLCBwaG9uZT86IHN0cmluZyk6IE9ic2VydmFibGU8TUZBU2V0dXBSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PE1GQVNldHVwUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3NldHVwYCwgeyBtZXRob2QsIHBob25lIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm1hIGxhIGNvbmZpZ3VyYWNpw7NuIGRlIE1GQS5cbiAgICovXG4gIGNvbmZpcm1NRkEoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxNRkFDb25maXJtUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFDb25maXJtUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL2NvbmZpcm1gLCB7IGNvZGUgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogRGVzaGFiaWxpdGEgTUZBLiBBY2VwdGEgYHBhc3N3b3JkYCBvIGBtZmFDb2RlYCAodW5vIHJlcXVlcmlkbykuXG4gICAqIGBtZmFDb2RlYCBlcyBwYXJhIHVzdWFyaW9zIE9BdXRoLW9ubHkgY29uIFRPVFAgcXVlIG5vIHRpZW5lbiBjb250cmFzZcOxYS5cbiAgICovXG4gIGRpc2FibGVNRkEoaW5wdXQ6IE1GQURpc2FibGVSZXF1ZXN0KTogT2JzZXJ2YWJsZTxNRkFEaXNhYmxlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFEaXNhYmxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL2Rpc2FibGVgLCBpbnB1dClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICBzZW5kTUZBRGlzYWJsZUNvZGUoKTogT2JzZXJ2YWJsZTx7IG9wZXJhdGlvbklkOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PHsgb3BlcmF0aW9uSWQ6IHN0cmluZyB9PihgJHt0aGlzLmJhc2VVcmx9L21mYS9kaXNhYmxlLWNvZGVgLCB7fSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVE9UUCBNRkEgKEdvb2dsZSBBdXRoZW50aWNhdG9yKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pY2lhIGNvbmZpZ3VyYWNpw7NuIGRlIFRPVFAgTUZBLlxuICAgKiBSZXRvcm5hIGVsIHNlY3JldG8sIFVSTCBwYXJhIFFSIGNvZGUgeSBjw7NkaWdvcyBkZSByZXNwYWxkby5cbiAgICovXG4gIHNldHVwVE9UUCgpOiBPYnNlcnZhYmxlPFRPVFBTZXR1cFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8VE9UUFNldHVwUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3RvdHAvc2V0dXBgLCB7fSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2EgZWwgY8OzZGlnbyBUT1RQIHkgYWN0aXZhIE1GQS5cbiAgICogRGViZSBsbGFtYXJzZSBkZXNwdcOpcyBkZSBzZXR1cFRPVFAgY29uIGVsIGPDs2RpZ28gZGVsIGF1dGhlbnRpY2F0b3IuXG4gICAqL1xuICB2ZXJpZnlUT1RQU2V0dXAoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxUT1RQVmVyaWZ5U2V0dXBSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFRPVFBWZXJpZnlTZXR1cFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS90b3RwL3ZlcmlmeWAsIHsgY29kZSB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdlbmVyYSBsb3MgY8OzZGlnb3MgZGUgcmVzcGFsZG8gVE9UUC5cbiAgICogTG9zIGPDs2RpZ29zIGFudGVyaW9yZXMgc29uIGludmFsaWRhZG9zLlxuICAgKi9cbiAgcmVnZW5lcmF0ZUJhY2t1cENvZGVzKCk6IE9ic2VydmFibGU8UmVnZW5lcmF0ZUJhY2t1cENvZGVzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxSZWdlbmVyYXRlQmFja3VwQ29kZXNSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvdG90cC9iYWNrdXAtY29kZXNgLCB7fSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsYSBjYW50aWRhZCBkZSBjw7NkaWdvcyBkZSByZXNwYWxkbyByZXN0YW50ZXMuXG4gICAqL1xuICBnZXRCYWNrdXBDb2Rlc0NvdW50KCk6IE9ic2VydmFibGU8QmFja3VwQ29kZXNDb3VudFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldDxCYWNrdXBDb2Rlc0NvdW50UmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3RvdHAvYmFja3VwLWNvZGVzL2NvdW50YClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogRGVzYWN0aXZhIFRPVFAgTUZBIChyZXF1aWVyZSBjb250cmFzZcOxYSkuXG4gICAqL1xuICBkaXNhYmxlVE9UUChwYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxUT1RQRGlzYWJsZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8VE9UUERpc2FibGVSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvdG90cC9kaXNhYmxlYCwgeyBwYXNzd29yZCB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPUkdBTklaQUNJT05FU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQ2FtYmlhIGxhIG9yZ2FuaXphY2nDs24gYWN0aXZhIGRlbCB1c3VhcmlvLlxuICAgKiBHZW5lcmEgdW4gbnVldm8gRmlyZWJhc2UgdG9rZW4gY29uIGVsIGFjdGl2ZU9yZyBhY3R1YWxpemFkby5cbiAgICpcbiAgICogQHBhcmFtIG9yZ2FuaXphdGlvbklkIC0gSUQgZGUgbGEgb3JnYW5pemFjacOzbiBhIGxhIHF1ZSBjYW1iaWFyXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgY29uIGVsIG51ZXZvIEZpcmViYXNlIHRva2VuIHkgYWN0aXZlT3JnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hdXRoLnN3aXRjaE9yZygnb3JnX3h5ejc4OScpKTtcbiAgICogLy8gRmlyZWJhc2UgeWEgZXN0w6EgcmUtYXV0ZW50aWNhZG8gY29uIGxhIG51ZXZhIG9yZ1xuICAgKiBjb25zdCBhY3RpdmVPcmcgPSBhd2FpdCB0aGlzLmZpcmViYXNlLmdldEFjdGl2ZU9yZygpO1xuICAgKiBgYGBcbiAgICovXG4gIHN3aXRjaE9yZyhvcmdhbml6YXRpb25JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTd2l0Y2hPcmdSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxTd2l0Y2hPcmdSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9zd2l0Y2gtb3JnYCwgeyBvcmdhbml6YXRpb25JZCB9KS5waXBlKFxuICAgICAgc3dpdGNoTWFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgLy8gUmUtYXV0ZW50aWNhciBlbiBGaXJlYmFzZSBjb24gZWwgbnVldm8gdG9rZW5cbiAgICAgICAgLy8gVXNhciBzd2l0Y2hNYXAgKyBmcm9tIHBhcmEgZXNwZXJhciBhIHF1ZSBGaXJlYmFzZSBjb21wbGV0ZVxuICAgICAgICBjb25zdCBmaXJlYmFzZUF1dGgkID0gcmVzcG9uc2UuZmlyZWJhc2VUb2tlblxuICAgICAgICAgID8gZnJvbSh0aGlzLnNpZ25JbldpdGhGaXJlYmFzZShyZXNwb25zZS5maXJlYmFzZVRva2VuKSlcbiAgICAgICAgICA6IG9mKHVuZGVmaW5lZCk7XG5cbiAgICAgICAgcmV0dXJuIGZpcmViYXNlQXV0aCQucGlwZShcbiAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQWN0dWFsaXphciBhY3RpdmVPcmcgZW4gZWwgc3RhdGUgbG9jYWxcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjdGl2ZU9yZyhyZXNwb25zZS5hY3RpdmVPcmcpO1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlQWN0aXZlT3JnKHJlc3BvbnNlLmFjdGl2ZU9yZyk7XG4gICAgICAgICAgICAvLyBQZXJzaXN0aXIgZWwgbnVldm8gYWNjZXNzIHRva2VuIChpbmNsdXllIGFjdGl2ZU9yZyBhY3R1YWxpemFkbykuXG4gICAgICAgICAgICAvLyBTaW4gZXN0bywgZWwgYm9vdHN0cmFwIHBvc3QtcmVmcmVzaCB1c2EgZWwgSldUIGNhY2hlYWRvIGNvbiBsYSBvcmcgYW50ZXJpb3IuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIChyZXNwb25zZS5leHBpcmVzSW4gPz8gOTAwKSAqIDEwMDA7XG4gICAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjY2Vzc1Rva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuLCByZXNwb25zZS5leHBpcmVzSW4gPz8gOTAwKTtcbiAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlQWNjZXNzVG9rZW4ocmVzcG9uc2UuYWNjZXNzVG9rZW4sIGV4cGlyZXNBdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBOb3RpZmljYXIgY2FtYmlvIGEgb3RyYXMgcGVzdGHDsWFzXG4gICAgICAgICAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdPUkdfU1dJVENIJyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogeyBhY3RpdmVPcmc6IHJlc3BvbnNlLmFjdGl2ZU9yZyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgLy8gUmV0b3JuYXIgcmVzcG9uc2Ugb3JpZ2luYWwgZGVzcHXDqXMgZGUgcXVlIEZpcmViYXNlIGNvbXBsZXRlXG4gICAgICAgICAgbWFwKCgpID0+IHJlc3BvbnNlKVxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBFUkZJTCBERSBVU1VBUklPXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGVsIHBlcmZpbCBkZWwgdXN1YXJpbyBhdXRlbnRpY2Fkby5cbiAgICogSW5jbHV5ZSBpbmZvcm1hY2nDs24gZGUgTUZBIHkgdGVsw6lmb25vLiBIaWRyYXRhIGVsIHN0YXRlIGF1dG9tw6F0aWNhbWVudGVcbiAgICogY29uIGBuYW1lL2hhbmRsZS9hdmF0YXJVcmwvcGhvbmVgIHBhcmEgcXVlIGBhdXRoLnVzZXIoKWAgbG9zIHJldG9ybmUuXG4gICAqL1xuICBnZXRQcm9maWxlKCk6IE9ic2VydmFibGU8R2V0UHJvZmlsZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8R2V0UHJvZmlsZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Byb2ZpbGVgKS5waXBlKFxuICAgICAgdGFwKHByb2ZpbGUgPT5cbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUHJvZmlsZUZpZWxkcyh7XG4gICAgICAgICAgbmFtZTogcHJvZmlsZS5uYW1lLFxuICAgICAgICAgIGhhbmRsZTogcHJvZmlsZS5oYW5kbGUgPz8gbnVsbCxcbiAgICAgICAgICBhdmF0YXJVcmw6IHByb2ZpbGUuYXZhdGFyVXJsID8/IG51bGwsXG4gICAgICAgICAgcGhvbmU6IHByb2ZpbGUucGhvbmUgPz8gbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdHVhbGl6YSBlbCBwZXJmaWwgZGVsIHVzdWFyaW8uIFNpbmNyb25pemEgc3RhdGUgY29uIGxvcyBudWV2b3MgdmFsdWVzXG4gICAqIChuYW1lL3Bob25lKSDigJQgZWwgYmFja2VuZCByZXNwb25zZSBubyBsb3MgZWNobydhIHBlcm8gZWwgY2FsbGVyIHlhIHRpZW5lXG4gICAqIGxvcyB2YWxvcmVzIHF1ZSBtYW5kw7MuXG4gICAqL1xuICB1cGRhdGVQcm9maWxlKHJlcXVlc3Q6IFVwZGF0ZVByb2ZpbGVSZXF1ZXN0KTogT2JzZXJ2YWJsZTxVcGRhdGVQcm9maWxlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxVcGRhdGVQcm9maWxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcHJvZmlsZWAsIHJlcXVlc3QpLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUHJvZmlsZUZpZWxkcyhyZXF1ZXN0KSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdHVhbGl6YSBlbCBhdmF0YXIgZGVsIHVzdWFyaW8gZW4gZWwgYmFja2VuZC4gU2luY3Jvbml6YSBzdGF0ZSBjb24gZWxcbiAgICogYGF2YXRhclVybGAgcmV0b3JuYWRvIHBhcmEgcXVlIGVsIGhlYWRlciAvIGRhc2hib2FyZCBzZSByZWZyZXNxdWVuIHNpblxuICAgKiBuZWNlc2lkYWQgZGUgdW4gZ2V0UHJvZmlsZSBhZGljaW9uYWwuXG4gICAqL1xuICB1cGRhdGVBdmF0YXIocmVxdWVzdDogVXBkYXRlQXZhdGFyUmVxdWVzdCk6IE9ic2VydmFibGU8VXBkYXRlQXZhdGFyUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxVcGRhdGVBdmF0YXJSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9wcm9maWxlL2F2YXRhcmAsIHJlcXVlc3QpLnBpcGUoXG4gICAgICB0YXAocmVzID0+IHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVByb2ZpbGVGaWVsZHMoeyBhdmF0YXJVcmw6IHJlcy5hdmF0YXJVcmwgfSkpLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSRUNVUEVSQUNJw5NOIERFIENPTlRSQVNFw5FBXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbmljaWEgZWwgcHJvY2VzbyBkZSByZWN1cGVyYWNpw7NuIGRlIGNvbnRyYXNlw7FhLlxuICAgKiBFbnbDrWEgdW4gY8OzZGlnbyBhbCBlbWFpbCBkZWwgdXN1YXJpby5cbiAgICovXG4gIGZvcmdvdFBhc3N3b3JkKHJlcXVlc3Q6IEZvcmdvdFBhc3N3b3JkUmVxdWVzdCk6IE9ic2VydmFibGU8Rm9yZ290UGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PEZvcmdvdFBhc3N3b3JkUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vZm9yZ290LXBhc3N3b3JkYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRlYSBsYSBjb250cmFzZcOxYSB1c2FuZG8gZWwgY8OzZGlnbyBlbnZpYWRvIHBvciBlbWFpbC5cbiAgICovXG4gIHJlc2V0UGFzc3dvcmQocmVxdWVzdDogUmVzZXRQYXNzd29yZFJlcXVlc3QpOiBPYnNlcnZhYmxlPFJlc2V0UGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFJlc2V0UGFzc3dvcmRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9yZXNldC1wYXNzd29yZGAsIHJlcXVlc3QpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaWNpYSBlbCByZXNldCBkZSBNRkEgcG9yIGVtYWlsIGN1YW5kbyBlbCB1c2VyIHBlcmRpw7Mgc3UgMsK6IGZhY3RvclxuICAgKiAoVE9UUCArIGJhY2t1cCBjb2RlcykuIEVudsOtYSB1biBjw7NkaWdvIGRlIDYgZMOtZ2l0b3MgYWwgZW1haWwgdmVyaWZpY2Fkby5cbiAgICogUmVzcG9uc2Ugc2llbXByZSBnZW7DqXJpY2EgKGFudGktZW51bWVyYWNpw7NuKS5cbiAgICovXG4gIHJlcXVlc3RNRkFSZXNldChyZXF1ZXN0OiBNRkFSZXNldFJlcXVlc3RSZXF1ZXN0KTogT2JzZXJ2YWJsZTxNRkFSZXNldFJlcXVlc3RSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PE1GQVJlc2V0UmVxdWVzdFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS9yZXNldC1yZXF1ZXN0YCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlybWEgZWwgcmVzZXQgZGUgTUZBIGNvbiBlbCBjw7NkaWdvIHJlY2liaWRvIHBvciBlbWFpbCDihpIgZGVzaGFiaWxpdGEgTUZBLlxuICAgKiBUcmFzIGVzdG8gZWwgdXNlciBpbmljaWEgc2VzacOzbiBub3JtYWxtZW50ZSAoc2luIDLCuiBmYWN0b3IpIHkgcmUtZW5yb2xhLlxuICAgKi9cbiAgY29uZmlybU1GQVJlc2V0KHJlcXVlc3Q6IE1GQVJlc2V0Q29uZmlybVJlcXVlc3QpOiBPYnNlcnZhYmxlPE1GQVJlc2V0Q29uZmlybVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8TUZBUmVzZXRDb25maXJtUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3Jlc2V0YCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhIHVuYSBjdWVudGEgcHJlLWFwcm92aXNpb25hZGEgcG9yIHVuYSBvcmdhbml6YWNpw7NuIChBRFItMDIzKTogZGVmaW5lXG4gICAqIGxhIGNvbnRyYXNlw7FhIGNvbiBlbCB0b2tlbiBkZWwgZW5sYWNlIGRlIGVtYWlsLiBFbiDDqXhpdG8gZWwgYmFja2VuZCBkZXZ1ZWx2ZVxuICAgKiB0b2tlbnMgZGUgYXV0by1zaWduaW4g4oaSIGVsIHVzdWFyaW8gcXVlZGEgbG9ndWVhZG8gKG1pc21vIGZsdWpvIHF1ZSB2ZXJpZnktZW1haWwpLlxuICAgKi9cbiAgYWN0aXZhdGVBY2NvdW50KHJlcXVlc3Q6IEFjdGl2YXRlQWNjb3VudFJlcXVlc3QpOiBPYnNlcnZhYmxlPEFjdGl2YXRlQWNjb3VudFJlc3BvbnNlPiB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuICAgIC8vIHdpdGhDcmVkZW50aWFsczogYWN0aXZhdGUgYXV0by1sb2d1ZWEgeSBzZXRlYSBsYSBjb29raWUgSHR0cE9ubHkgZGUgcmVmcmVzaC5cbiAgICAvLyBTaW4gY3JlZGVuY2lhbGVzIGVsIGJyb3dzZXIgZGVzY2FydGEgZWwgU2V0LUNvb2tpZSDihpIgL3JlZnJlc2ggNDAwIChILTA1KS5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxBY3RpdmF0ZUFjY291bnRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9hY3RpdmF0ZWAsIHJlcXVlc3QsIHsgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UuYWN0aXZhdGVkICYmIHJlc3BvbnNlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHJlc3BvbnNlIGFzIHVua25vd24gYXMgU2lnbmluUmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW1iaWEgbGEgY29udHJhc2XDsWEgZGVsIHVzdWFyaW8gYXV0ZW50aWNhZG8uXG4gICAqIFJlcXVpZXJlIGxhIGNvbnRyYXNlw7FhIGFjdHVhbCBwYXJhIHZlcmlmaWNhY2nDs24uXG4gICAqL1xuICBjaGFuZ2VQYXNzd29yZChjdXJyZW50UGFzc3dvcmQ6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hhbmdlUGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3Q6IENoYW5nZVBhc3N3b3JkUmVxdWVzdCA9IHsgY3VycmVudFBhc3N3b3JkLCBuZXdQYXNzd29yZCB9O1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PENoYW5nZVBhc3N3b3JkUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vY2hhbmdlLXBhc3N3b3JkYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ0FNQklPIERFIEVNQUlMIOKAlCBmbHVqbyBkZSAzIHBhc29zXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGluaXRpYXRlRW1haWxDaGFuZ2UoXG4gICAgY3VycmVudFBhc3N3b3JkOiBzdHJpbmcsXG4gICAgbmV3RW1haWw6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPEluaXRpYXRlRW1haWxDaGFuZ2VSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3Q6IEluaXRpYXRlRW1haWxDaGFuZ2VSZXF1ZXN0ID0geyBjdXJyZW50UGFzc3dvcmQsIG5ld0VtYWlsIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8SW5pdGlhdGVFbWFpbENoYW5nZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2VtYWlsL2luaXRpYXRlYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICBjb25maXJtRW1haWxDaGFuZ2VTdGVwMShjb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENvbmZpcm1FbWFpbENoYW5nZVN0ZXAxUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0OiBDb25maXJtRW1haWxDaGFuZ2VTdGVwMVJlcXVlc3QgPSB7IGNvZGUgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxDb25maXJtRW1haWxDaGFuZ2VTdGVwMVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2VtYWlsL2NvbmZpcm0vMWAsIHJlcXVlc3QpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgY29uZmlybUVtYWlsQ2hhbmdlU3RlcDIoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxDb25maXJtRW1haWxDaGFuZ2VTdGVwMlJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdDogQ29uZmlybUVtYWlsQ2hhbmdlU3RlcDJSZXF1ZXN0ID0geyBjb2RlIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8Q29uZmlybUVtYWlsQ2hhbmdlU3RlcDJSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9lbWFpbC9jb25maXJtLzJgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFTElNSU5BQ0nDk04gREUgQ1VFTlRBXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBFbGltaW5hIGxhIGN1ZW50YSBkZWwgdXN1YXJpbyAoc29mdCBkZWxldGUpLlxuICAgKiBSZXF1aWVyZSBjb25maXJtYWNpw7NuIGRlIGNvbnRyYXNlw7FhIHBvciBzZWd1cmlkYWQuXG4gICAqIERlc3B1w6lzIGRlIGVsaW1pbmFyLCBjaWVycmEgc2VzacOzbiBhdXRvbcOhdGljYW1lbnRlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFzc3dvcmQgLSBDb250cmFzZcOxYSBhY3R1YWwgcGFyYSBjb25maXJtYXJcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBjb24gcmVzdWx0YWRvIGRlIGxhIGVsaW1pbmFjacOzblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIGNvbmZpcm1EZWxldGVBY2NvdW50KHBhc3N3b3JkOiBzdHJpbmcpIHtcbiAgICogICB0cnkge1xuICAgKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hdXRoLmRlbGV0ZUFjY291bnQocGFzc3dvcmQpKTtcbiAgICogICAgIGNvbnNvbGUubG9nKHJlc3VsdC5tZXNzYWdlKTsgLy8gXCJUdSBjdWVudGEgaGEgc2lkbyBlbGltaW5hZGEuLi5cIlxuICAgKiAgICAgLy8gVXN1YXJpbyBlcyByZWRpcmlnaWRvIGF1dG9tw6F0aWNhbWVudGUgYWwgbG9naW5cbiAgICogICB9IGNhdGNoIChlcnJvcikge1xuICAgKiAgICAgLy8gTWFuZWphciBlcnJvciAoY29udHJhc2XDsWEgaW5jb3JyZWN0YSwgZXRjKVxuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIC8qKlxuICAgKiBFbnbDrWEgdW4gY8OzZGlnbyBPVFAgYWwgZW1haWwgZGVsIHVzdWFyaW8gcGFyYSBjb25maXJtYXIgbGEgZWxpbWluYWNpw7NuLlxuICAgKiBTb2xvIGFwbGljYSBhIHVzdWFyaW9zIE9BdXRoIHNpbiBjb250cmFzZcOxYSAoYGhhc1Bhc3N3b3JkKCkgPT09IGZhbHNlYCkuXG4gICAqL1xuICBzZW5kRGVsZXRlQWNjb3VudENvZGUoKTogT2JzZXJ2YWJsZTxTZW5kRGVsZXRlQWNjb3VudENvZGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFNlbmREZWxldGVBY2NvdW50Q29kZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2FjY291bnQvZGVsZXRlLWNvZGVgLCB7fSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogRWxpbWluYSBsYSBjdWVudGEgZGVsIHVzdWFyaW8gKHNvZnQgZGVsZXRlKS5cbiAgICogLSBVc3VhcmlvcyBjb24gY29udHJhc2XDsWE6IHBhc2FyIGB7IHBhc3N3b3JkIH1gLlxuICAgKiAtIFVzdWFyaW9zIE9BdXRoIHNpbiBjb250cmFzZcOxYTogcGFzYXIgYHsgY29kZSB9YCAob2J0ZW5pZG8gdmlhIHNlbmREZWxldGVBY2NvdW50Q29kZSkuXG4gICAqIERlc3B1w6lzIGRlIGVsaW1pbmFyLCBjaWVycmEgc2VzacOzbiB5IHJlZGlyaWdlIGFsIGxvZ2luIGF1dG9tw6F0aWNhbWVudGUuXG4gICAqL1xuICBkZWxldGVBY2NvdW50KGNyZWRlbnRpYWxzOiB7XG4gICAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gICAgY29kZT86IHN0cmluZztcbiAgfSk6IE9ic2VydmFibGU8RGVsZXRlQWNjb3VudFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmRlbGV0ZTxEZWxldGVBY2NvdW50UmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vYWNjb3VudGAsIHsgYm9keTogY3JlZGVudGlhbHMgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5kZWxldGVkKSB7XG4gICAgICAgICAgICAvLyBMaW1waWFyIGVzdGFkbyB5IGNlcnJhciBzZXNpw7NuIHNpbiBub3RpZmljYXIgYWwgYmFja2VuZFxuICAgICAgICAgICAgLy8gKGxhIHNlc2nDs24geWEgZnVlIHJldm9jYWRhIHBvciBlbCBiYWNrZW5kKVxuICAgICAgICAgICAgdGhpcy5zaWduT3V0RmlyZWJhc2UoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5zeW5jU2VydmljZS5icm9hZGNhc3QoeyB0eXBlOiAnTE9HT1VUJyB9KTtcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmNvbmZpZz8ubG9naW5Sb3V0ZV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQRVJNSVNPU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT2J0aWVuZSBsb3MgcGVybWlzb3MgYWN0dWFsaXphZG9zIGRlbCBiYWNrZW5kLlxuICAgKi9cbiAgZmV0Y2hQZXJtaXNzaW9ucygpOiBPYnNlcnZhYmxlPEdldFBlcm1pc3Npb25zUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxHZXRQZXJtaXNzaW9uc1Jlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Blcm1pc3Npb25zYCkucGlwZShcbiAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVBlcm1pc3Npb25zKFxuICAgICAgICAgIHJlc3BvbnNlLnJvbGVzLFxuICAgICAgICAgIHJlc3BvbnNlLnBlcm1pc3Npb25zLFxuICAgICAgICAgIHJlc3BvbnNlLmlzU3VwZXJBZG1pblxuICAgICAgICApO1xuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVQZXJtaXNzaW9ucyhyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuc3luY1NlcnZpY2UuYnJvYWRjYXN0KHsgdHlwZTogJ1BFUk1JU1NJT05TX1VQREFURScgfSk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyB0aWVuZSB1biBwZXJtaXNvIGVzcGVjw61maWNvLlxuICAgKiBGb3JtYXRvOiBcInJlc291cmNlOmFjdGlvblwiIChlajogXCJ0ZW1wbGF0ZXM6ZWRpdFwiKVxuICAgKi9cbiAgaGFzUGVybWlzc2lvbihwZXJtaXNzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1N1cGVyQWRtaW4oKSkgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCBbcmVzb3VyY2UsIGFjdGlvbl0gPSBwZXJtaXNzaW9uLnNwbGl0KCc6Jyk7XG4gICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbnMoKS5zb21lKHAgPT4ge1xuICAgICAgY29uc3QgW3BSZXNvdXJjZSwgcEFjdGlvbl0gPSBwLnNwbGl0KCc6Jyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAocFJlc291cmNlID09PSAnKicgfHwgcFJlc291cmNlID09PSByZXNvdXJjZSkgJiYgKHBBY3Rpb24gPT09ICcqJyB8fCBwQWN0aW9uID09PSBhY3Rpb24pXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gdGllbmUgYWxndW5vIGRlIGxvcyBwZXJtaXNvcyBkYWRvcy5cbiAgICovXG4gIGhhc0FueVBlcm1pc3Npb24ocGVybWlzc2lvbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zLnNvbWUocCA9PiB0aGlzLmhhc1Blcm1pc3Npb24ocCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gdGllbmUgdG9kb3MgbG9zIHBlcm1pc29zIGRhZG9zLlxuICAgKi9cbiAgaGFzQWxsUGVybWlzc2lvbnMocGVybWlzc2lvbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zLmV2ZXJ5KHAgPT4gdGhpcy5oYXNQZXJtaXNzaW9uKHApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHRpZW5lIHVuIHJvbCBlc3BlY8OtZmljby5cbiAgICovXG4gIGhhc1JvbGUocm9sZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucm9sZXMoKS5zb21lKHIgPT4gci50b0xvd2VyQ2FzZSgpID09PSByb2xlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhBTkRMRSAoVVNFUk5BTUUpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBBY3R1YWxpemEgZWwgaGFuZGxlIChAdXNlcm5hbWUpIGRlbCB1c3VhcmlvLlxuICAgKiBAcGFyYW0gaGFuZGxlIC0gTnVldm8gaGFuZGxlIChzaW4gQCwgZWo6IFwidmljdG9ydlwiKVxuICAgKi9cbiAgdXBkYXRlSGFuZGxlKGhhbmRsZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxVcGRhdGVIYW5kbGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFVwZGF0ZUhhbmRsZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Byb2ZpbGUvaGFuZGxlYCwgeyBoYW5kbGUgfSkucGlwZShcbiAgICAgIHRhcCgoKSA9PiB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQcm9maWxlRmllbGRzKHsgaGFuZGxlIH0pKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgdW4gaGFuZGxlIGVzdMOhIGRpc3BvbmlibGUuXG4gICAqIEBwYXJhbSBoYW5kbGUgLSBIYW5kbGUgYSB2ZXJpZmljYXIgKHNpbiBAKVxuICAgKi9cbiAgY2hlY2tIYW5kbGVBdmFpbGFiaWxpdHkoaGFuZGxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoZWNrSGFuZGxlUmVzcG9uc2U+IHtcbiAgICAvLyBTZXJ2ZXIgcmVzcG9uc2U6IHsgb3BlcmF0aW9uSWQsIHVzZXI/LCBmb3VuZCB9LiBmb3VuZD10cnVlIOKGkiBoYW5kbGUgdGFrZW4uXG4gICAgLy8gTGliIHNlbWFudGljOiBhdmFpbGFibGUgPSAhZm91bmQuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldDx7XG4gICAgICAgIG9wZXJhdGlvbklkOiBzdHJpbmc7XG4gICAgICAgIGZvdW5kOiBib29sZWFuO1xuICAgICAgfT4oYCR7dGhpcy51c2Vyc0Jhc2VVcmx9L2hhbmRsZS8ke2VuY29kZVVSSUNvbXBvbmVudChoYW5kbGUpfWApXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKHJhdyA9PiAoe1xuICAgICAgICAgIG9wZXJhdGlvbklkOiByYXcub3BlcmF0aW9uSWQsXG4gICAgICAgICAgaGFuZGxlLFxuICAgICAgICAgIGF2YWlsYWJsZTogIXJhdy5mb3VuZCxcbiAgICAgICAgfSkpLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICAgICk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgZ2V0IGJhc2VVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5jb25maWc/LmFwaVVybH0ke3RoaXMuY29uZmlnPy5hdXRoUHJlZml4fWA7XG4gIH1cblxuICAvKiogQmFzZSBmb3IgL3YyL3VzZXJzIGVuZHBvaW50cyAoc2VwYXJhdGUgZnJvbSAvdjIvYXV0aCkuICovXG4gIHByaXZhdGUgZ2V0IHVzZXJzQmFzZVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmNvbmZpZz8uYXBpVXJsfS92Mi91c2Vyc2A7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHJlc3BvbnNlOiBTaWduaW5SZXNwb25zZSB8IE1GQVZlcmlmeVJlc3BvbnNlKTogdm9pZCB7XG4gICAgY29uc3QgZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIHJlc3BvbnNlLmV4cGlyZXNJbiEgKiAxMDAwO1xuICAgIGNvbnN0IHRva2VuRGF0YSA9IHRoaXMudG9rZW5TZXJ2aWNlLnBhcnNlVG9rZW4ocmVzcG9uc2UuYWNjZXNzVG9rZW4hKTtcbiAgICBjb25zdCBpc1ByZW1pdW0gPSB0b2tlbkRhdGE/LnByZW1pdW0gPT09IHRydWU7XG5cbiAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRBdXRoZW50aWNhdGVkKHtcbiAgICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZS5hY2Nlc3NUb2tlbiEsXG4gICAgICByZWZyZXNoVG9rZW46IHJlc3BvbnNlLnJlZnJlc2hUb2tlbiEsXG4gICAgICB1c2VySWQ6IHRva2VuRGF0YT8udWlkLFxuICAgICAgZW1haWw6IHRva2VuRGF0YT8uZW1haWwsXG4gICAgICByb2xlczogcmVzcG9uc2Uucm9sZXMgfHwgW10sXG4gICAgICBwZXJtaXNzaW9uczogcmVzcG9uc2UucGVybWlzc2lvbnMgfHwgW10sXG4gICAgICBpc1N1cGVyQWRtaW46IHJlc3BvbnNlLnBlcm1pc3Npb25zPy5pbmNsdWRlcygnKjoqJykgfHwgdG9rZW5EYXRhPy5hZG1pbiA9PT0gdHJ1ZSB8fCBmYWxzZSxcbiAgICAgIGlzUHJlbWl1bSxcbiAgICAgIGV4cGlyZXNBdCxcbiAgICB9KTtcblxuICAgIGlmICh0b2tlbkRhdGE/Lm9yZykge1xuICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKHRva2VuRGF0YS5vcmcpO1xuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlQWN0aXZlT3JnKHRva2VuRGF0YS5vcmcpO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVN0YXRlKHtcbiAgICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZS5hY2Nlc3NUb2tlbiEsXG4gICAgICByZWZyZXNoVG9rZW46IHJlc3BvbnNlLnJlZnJlc2hUb2tlbiEsXG4gICAgICByb2xlczogcmVzcG9uc2Uucm9sZXMgfHwgW10sXG4gICAgICBwZXJtaXNzaW9uczogcmVzcG9uc2UucGVybWlzc2lvbnMgfHwgW10sXG4gICAgICBpc1N1cGVyQWRtaW46IHJlc3BvbnNlLnBlcm1pc3Npb25zPy5pbmNsdWRlcygnKjoqJykgfHwgdG9rZW5EYXRhPy5hZG1pbiA9PT0gdHJ1ZSB8fCBmYWxzZSxcbiAgICAgIGlzUHJlbWl1bSxcbiAgICAgIGV4cGlyZXNBdCxcbiAgICB9KTtcblxuICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7IHR5cGU6ICdMT0dJTicgfSk7XG5cbiAgICAvLyBJbnRlZ3JhY2nDs24gY29uIEZpcmViYXNlXG4gICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gaGFuZGxlU3VjY2Vzc2Z1bEF1dGggLSBGaXJlYmFzZSBjaGVjazonLCB7XG4gICAgICBlbmFibGVGaXJlYmFzZUludGVncmF0aW9uOiB0aGlzLmNvbmZpZz8uZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbixcbiAgICAgIGhhc0ZpcmViYXNlVG9rZW5LZXk6ICdmaXJlYmFzZVRva2VuJyBpbiByZXNwb25zZSxcbiAgICAgIGZpcmViYXNlVG9rZW5WYWx1ZTogISEocmVzcG9uc2UgYXMgYW55KS5maXJlYmFzZVRva2VuLFxuICAgICAgZmlyZWJhc2VUb2tlbkxlbmd0aDogKHJlc3BvbnNlIGFzIGFueSkuZmlyZWJhc2VUb2tlbj8ubGVuZ3RoIHx8IDAsXG4gICAgfSk7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbmZpZz8uZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbiAmJlxuICAgICAgJ2ZpcmViYXNlVG9rZW4nIGluIHJlc3BvbnNlICYmXG4gICAgICByZXNwb25zZS5maXJlYmFzZVRva2VuXG4gICAgKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ1tWYWx0ZWNoQXV0aF0gQ2FsbGluZyBzaWduSW5XaXRoRmlyZWJhc2Ugd2l0aCB0b2tlbiBsZW5ndGg6JyxcbiAgICAgICAgcmVzcG9uc2UuZmlyZWJhc2VUb2tlbi5sZW5ndGhcbiAgICAgICk7XG4gICAgICB0aGlzLnNpZ25JbldpdGhGaXJlYmFzZShyZXNwb25zZS5maXJlYmFzZVRva2VuKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnPy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uKSB7XG4gICAgICAvLyBFbCBsb2dpbiBOTyB0cmFqbyBmaXJlYmFzZVRva2VuIChlai4gZmx1am8gT0F1dGggcXVlIGxvIHBlcmRpw7MpLiBFbiB2ZXpcbiAgICAgIC8vIGRlIHF1ZWRhciBzaW4gc2VzacOzbiBkZSBGaXJlYmFzZSwgcmVjdXJyaW1vcyBhbCBmYWxsYmFjayBzZWxmLWhlYWxpbmc6XG4gICAgICAvLyAvcmVmcmVzaCBzw60gZGV2dWVsdmUgdW4gZmlyZWJhc2VUb2tlbiBjb25maWFibGUuXG4gICAgICBjb25zb2xlLmxvZygnW0ZCQXV0aF0gbG9naW4gcmVzcG9uc2Ugc2luIGZpcmViYXNlVG9rZW4g4oaSIHJlY3VycmllbmRvIGEgZmFsbGJhY2sgL3JlZnJlc2gnKTtcbiAgICAgIHZvaWQgdGhpcy5yZWVzdGFibGlzaEZpcmViYXNlVmlhUmVmcmVzaCgnbG9naW4tbWlzc2luZy1maXJlYmFzZS10b2tlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWduaW4gc2tpcHBlZCAtIGludGVncmFjacOzbiBGaXJlYmFzZSBkZXNhY3RpdmFkYScpO1xuICAgIH1cblxuICAgIC8vIFJlZ2lzdHJvIGF1dG9tw6F0aWNvIGRlIGRpc3Bvc2l0aXZvIHBhcmEgcHVzaCBub3RpZmljYXRpb25zXG4gICAgaWYgKHRoaXMuY29uZmlnPy5lbmFibGVEZXZpY2VSZWdpc3RyYXRpb24pIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJEZXZpY2VJZk5lZWRlZCgpOyAvLyBmaXJlLWFuZC1mb3JnZXRcbiAgICB9XG5cbiAgICAvLyBTaW5jcm9uaXphciBpZGlvbWEgZGVsIHVzdWFyaW8gY29uIGkxOG5cbiAgICBpZiAodGhpcy5pMThuU2VydmljZSAmJiAnbGFuZ3VhZ2UnIGluIHJlc3BvbnNlICYmIHJlc3BvbnNlLmxhbmd1YWdlKSB7XG4gICAgICBjb25zdCB1c2VyTGFuZyA9IHJlc3BvbnNlLmxhbmd1YWdlIGFzIEkxOG5MYW5nO1xuICAgICAgY29uc3QgY3VycmVudExhbmcgPSB0aGlzLmkxOG5TZXJ2aWNlLmxhbmcoKTtcbiAgICAgIGlmICh1c2VyTGFuZyAhPT0gY3VycmVudExhbmcpIHtcbiAgICAgICAgdGhpcy5pMThuU2VydmljZS5zZXRMYW5ndWFnZSh1c2VyTGFuZyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbVmFsdGVjaEF1dGhdIExhbmd1YWdlIHN5bmNlZCB0bzogJHt1c2VyTGFuZ31gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMaXN0ZW5lciBGaXJlc3RvcmUgUkJBQyDigJQgb3B0LWluIHZpYSBlbmFibGVGaXJlc3RvcmVSQkFDOiB0cnVlXG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5zdGF0ZVNlcnZpY2Uuc3RhdGUoKS51c2VySWQ7XG4gICAgaWYgKHVzZXJJZCkge1xuICAgICAgdGhpcy5zZXR1cEZpcmVzdG9yZVJCQUNTeW5jKHVzZXJJZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFJlZnJlc2hUaW1lcigpO1xuICAgIHRoaXMudGVhcmRvd25GaXJlc3RvcmVSQkFDU3luYygpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlc2V0KCk7XG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5jbGVhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEZpcmVzdG9yZVJCQUNTeW5jKHVzZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uZW5hYmxlRmlyZXN0b3JlUkJBQyB8fCAhdGhpcy5maXJlc3RvcmVJbnN0YW5jZSkgcmV0dXJuO1xuICAgIHRoaXMudGVhcmRvd25GaXJlc3RvcmVSQkFDU3luYygpO1xuXG4gICAgaWYgKCF0aGlzLmZpcmViYXNlU2VydmljZSB8fCB0aGlzLmZpcmViYXNlU2VydmljZS5maXJlYmFzZUF1dGhSZWFkeSgpKSB7XG4gICAgICAvLyBGaXJlYmFzZSBub3QgdXNlZCBvciBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQg4oCUIGF0dGFjaCBsaXN0ZW5lciBub3cuXG4gICAgICB0aGlzLl9hdHRhY2hGaXJlc3RvcmVSQkFDTGlzdGVuZXIodXNlcklkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmlyZWJhc2UgQXV0aCBub3QgcmVhZHkgeWV0LiBGaXJlc3RvcmUgcGVybWlzc2lvbi1kZW5pZWQgZXJyb3JzIHRlcm1pbmF0ZVxuICAgICAgLy8gb25TbmFwc2hvdCBwZXJtYW5lbnRseSAobm8gYXV0b21hdGljIHJldHJ5IHdoZW4gYXV0aCBzdGF0ZSBjaGFuZ2VzKS5cbiAgICAgIC8vIFdhaXQgdW50aWwgdGhlIHVzZXIgaXMgYXV0aGVudGljYXRlZCwgdGhlbiBhdHRhY2guXG4gICAgICB0aGlzLmZpcmViYXNlU2VydmljZS5maXJlYmFzZUF1dGhSZWFkeSRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKHJlYWR5ID0+IHJlYWR5KSxcbiAgICAgICAgICB0YWtlKDEpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9hdHRhY2hGaXJlc3RvcmVSQkFDTGlzdGVuZXIodXNlcklkKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXR0YWNoRmlyZXN0b3JlUkJBQ0xpc3RlbmVyKHVzZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZG9jUmVmID0gZG9jKHRoaXMuZmlyZXN0b3JlSW5zdGFuY2UhLCAndXNlcnMnLCB1c2VySWQpO1xuICAgIHRoaXMuZmlyZXN0b3JlUkJBQ1Vuc3Vic2NyaWJlID0gb25TbmFwc2hvdChkb2NSZWYsIHNuYXAgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHNuYXAuZGF0YSgpO1xuICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG5cbiAgICAgIC8vIFN5bmMgZGUgcGVyZmlsIOKAlCBlbCBtaXJyb3IgRmlyZXN0b3JlIGAvdXNlcnMve3VpZH1gIGVzIGVsIGVzcGVqbyBjYW7Ds25pY29cbiAgICAgIC8vIHF1ZSBlbCBiYWNrZW5kIGVzY3JpYmUgKGBTeW5jUHJvZmlsZVRvRmlyZXN0b3JlYCkuIFJlZnJlc2NhciBhY8OhIG1hbnRpZW5lXG4gICAgICAvLyBgYXV0aC51c2VyKClgIFZJVk8gKGF2YXRhciBkZWwgaGVhZGVyLCBncmVldGluZywgZXRjLikgc2luIGRlcGVuZGVyIGRlIHVuXG4gICAgICAvLyBgZ2V0UHJvZmlsZSgpYCBtYW51YWw6IGVkaXRhciBlbCBwZXJmaWwgZW4gdW5hIHZpc3RhIHNlIHJlZmxlamEgZW4gdG9kYXNcbiAgICAgIC8vIChob21lIGluY2x1aWRvKSBlbiBjdWFudG8gZWwgYmFja2VuZCBhY3R1YWxpemEgZWwgbWlycm9yLlxuICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUHJvZmlsZUZpZWxkcyh7XG4gICAgICAgIG5hbWU6IGRhdGFbJ25hbWUnXSA/PyB1bmRlZmluZWQsXG4gICAgICAgIGhhbmRsZTogZGF0YVsnaGFuZGxlJ10gPz8gdW5kZWZpbmVkLFxuICAgICAgICBhdmF0YXJVcmw6IGRhdGFbJ2F2YXRhclVybCddID8/IHVuZGVmaW5lZCxcbiAgICAgICAgcGhvbmU6IGRhdGFbJ3Bob25lJ10gPz8gdW5kZWZpbmVkLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJiYWMgPSBkYXRhWydyYmFjJ107XG4gICAgICBpZiAoIXJiYWMpIHJldHVybjtcbiAgICAgIGNvbnN0IGFjdGl2ZU9yZyA9IHRoaXMuc3RhdGVTZXJ2aWNlLnN0YXRlKCkuYWN0aXZlT3JnO1xuICAgICAgaWYgKHJiYWNbJ2FjdGl2ZU9yZyddICYmIHJiYWNbJ2FjdGl2ZU9yZyddICE9PSBhY3RpdmVPcmcpIHJldHVybjtcbiAgICAgIGNvbnN0IHJvbGVzOiBzdHJpbmdbXSA9IHJiYWNbJ3JvbGVzJ10gPz8gW107XG4gICAgICBjb25zdCBwZXJtaXNzaW9uczogc3RyaW5nW10gPSByYmFjWydwZXJtaXNzaW9ucyddID8/IFtdO1xuICAgICAgLy8gUHJlc2VydmUgcGxhdGZvcm0gYWRtaW4gc3RhdHVzIGZyb20gSldUIOKAlCBGaXJlc3RvcmUgUkJBQyByZWZsZWN0cyBvcmctbGV2ZWxcbiAgICAgIC8vIHBlcm1pc3Npb25zIHdoaWNoIGRvbid0IGluY2x1ZGUgKjoqIGZvciBvcmdzIHRoZSBhZG1pbiBkb2Vzbid0IG93bi5cbiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5zdGF0ZVNlcnZpY2UuYWNjZXNzVG9rZW4oKTtcbiAgICAgIGNvbnN0IGp3dEFkbWluID0gdG9rZW4gPyB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHRva2VuKT8uYWRtaW4gPT09IHRydWUgOiBmYWxzZTtcbiAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVBlcm1pc3Npb25zKFxuICAgICAgICByb2xlcyxcbiAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgIHBlcm1pc3Npb25zLmluY2x1ZGVzKCcqOionKSB8fCBqd3RBZG1pblxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdGVhcmRvd25GaXJlc3RvcmVSQkFDU3luYygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maXJlc3RvcmVSQkFDVW5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMuZmlyZXN0b3JlUkJBQ1Vuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLmZpcmVzdG9yZVJCQUNVbnN1YnNjcmliZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFJlZnJlc2hUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BSZWZyZXNoVGltZXIoKTtcblxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZVNlcnZpY2Uuc3RhdGUoKTtcbiAgICBpZiAoIXN0YXRlLmV4cGlyZXNBdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVmcmVzaEJlZm9yZU1zID0gKHRoaXMuY29uZmlnPy5yZWZyZXNoQmVmb3JlRXhwaXJ5IHx8IDYwKSAqIDEwMDA7XG4gICAgY29uc3QgcmVmcmVzaEF0ID0gc3RhdGUuZXhwaXJlc0F0IC0gcmVmcmVzaEJlZm9yZU1zO1xuICAgIGNvbnN0IGRlbGF5ID0gcmVmcmVzaEF0IC0gRGF0ZS5ub3coKTtcblxuICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVySWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmxvZ291dCgpLFxuICAgICAgICB9KTtcbiAgICAgIH0sIGRlbGF5KTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLnJlZnJlc2hUb2tlbikge1xuICAgICAgLy8gVG9rZW4geWEgZGViZXLDrWEgcmVmcmVzY2Fyc2UsIGludGVudGFyIGFob3JhXG4gICAgICB0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpLnN1YnNjcmliZSh7XG4gICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmxvZ291dCgpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUmVmcmVzaFRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lcklkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWZyZXNoVGltZXJJZCk7XG4gICAgICB0aGlzLnJlZnJlc2hUaW1lcklkID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN5bmNFdmVudChldmVudDogQXV0aFN5bmNFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgY2FzZSAnTE9HSU4nOiB7XG4gICAgICAgIC8vIFJlY2FyZ2FyIGVzdGFkbyBkZXNkZSBzdG9yYWdlXG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkU3RhdGUoKTtcbiAgICAgICAgaWYgKHN0YXRlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UucmVzdG9yZUZyb21TdG9yYWdlKHN0YXRlKTtcbiAgICAgICAgICBjb25zdCBjbGFpbXMgPSB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHN0YXRlLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgICBpZiAoY2xhaW1zKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVVc2VySW5mbyhjbGFpbXMudWlkLCBjbGFpbXMuZW1haWwpO1xuICAgICAgICAgICAgaWYgKGNsYWltcy5vcmcpIHtcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKGNsYWltcy5vcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnN0YXJ0UmVmcmVzaFRpbWVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdUT0tFTl9SRUZSRVNIJzoge1xuICAgICAgICAvLyBSZWNhcmdhciBjcmVkZW5jaWFsZXMgZGVzZGUgc3RvcmFnZSBzb2xvIHNpIGNvcnJlc3BvbmRlbiBhIGxhIG1pc21hXG4gICAgICAgIC8vIG9yZyBkZSBlc3RhIHBlc3Rhw7FhLiBFbCBhY2Nlc3MgdG9rZW4gZXN0w6EgZW4gbG9jYWxTdG9yYWdlIHkgb3RyYVxuICAgICAgICAvLyBwZXN0YcOxYSBwdWVkZSByZWZyZXNjYXIgZW4gdW5hIG9yZyBkaXN0aW50YTsgZXNvIE5PIGRlYmUgY2FtYmlhciBlbFxuICAgICAgICAvLyBjb250ZXh0byB2aXNpYmxlIGFjdHVhbC4gUGFyYSBjYW1iaWFyIG9yZyBleGlzdGUgT1JHX1NXSVRDSC5cbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWRTdGF0ZSgpO1xuICAgICAgICBpZiAoc3RhdGUuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICBjb25zdCBjbGFpbXMgPSB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHN0YXRlLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50T3JnID1cbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnN0YXRlKCkuYWN0aXZlT3JnIHx8IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0QWN0aXZlT3JnKCk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRPcmcgJiYgY2xhaW1zPy5vcmcgJiYgY2xhaW1zLm9yZyAhPT0gY3VycmVudE9yZykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGBbVmFsdGVjaEF1dGhdIHN5bmMg4oCUIGlnbm9yaW5nIFRPS0VOX1JFRlJFU0ggZm9yIG9yZyAke2NsYWltcy5vcmd9OyBjdXJyZW50IHRhYiBvcmcgaXMgJHtjdXJyZW50T3JnfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UucmVzdG9yZUZyb21TdG9yYWdlKHN0YXRlKTtcbiAgICAgICAgICBpZiAoY2xhaW1zKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVVc2VySW5mbyhjbGFpbXMudWlkLCBjbGFpbXMuZW1haWwpO1xuICAgICAgICAgICAgaWYgKGNsYWltcy5vcmcpIHtcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKGNsYWltcy5vcmcpO1xuICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVBY3RpdmVPcmcoY2xhaW1zLm9yZywgeyBwZXJzaXN0UHJlZmVycmVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zdGFydFJlZnJlc2hUaW1lcigpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnTE9HT1VUJzpcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UucmVzZXQoKTtcbiAgICAgICAgdGhpcy5zdG9wUmVmcmVzaFRpbWVyKCk7XG4gICAgICAgIGlmICghdGhpcy5pc0N1cnJlbnRSb3V0ZVB1YmxpYygpKSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuY29uZmlnPy5sb2dpblJvdXRlXSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdQRVJNSVNTSU9OU19VUERBVEUnOiB7XG4gICAgICAgIGNvbnN0IHBlcm1zID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkUGVybWlzc2lvbnMoKTtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUGVybWlzc2lvbnMocGVybXMucm9sZXMsIHBlcm1zLnBlcm1pc3Npb25zLCBwZXJtcy5pc1N1cGVyQWRtaW4pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ09SR19TV0lUQ0gnOlxuICAgICAgICAvLyBPdHJhIHBlc3Rhw7FhIGNhbWJpw7MgZGUgb3JnYW5pemFjacOzbi4gTm8gcmVjYXJnYW1vcyBsYSBVUkwgYWN0dWFsOlxuICAgICAgICAvLyBwdWVkZSBzZXIgdW5hIHJ1dGEgb3JnLXNjb3BlZCAoZXZlbnRzLzppZCwgc2V0dGluZ3MgZGUgdW5hIG9yZywgZXRjLilcbiAgICAgICAgLy8gcXVlIHF1ZWRhIGludsOhbGlkYSBiYWpvIGxhIG51ZXZhIG9yZy4gVm9sdmVtb3MgYSBsYSBob21lIGF1dGVudGljYWRhLlxuICAgICAgICBpZiAoIXRoaXMuaXNDdXJyZW50Um91dGVQdWJsaWMoKSkge1xuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwodGhpcy5jb25maWc/LmhvbWVSb3V0ZSB8fCAnLycsIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnV0YXMgcMO6YmxpY2FzIGNvbXBhcnRpYmxlcyBubyBkZWJlbiBzZXIgc2VjdWVzdHJhZGFzIHBvciBldmVudG9zIGdsb2JhbGVzXG4gICAqIGRlIHNlc2nDs24uIFVuIGxvZ291dCBlbiBvdHJhIHBlc3Rhw7FhIG5vIGRlYmUgbWFuZGFyIGEgYC9sb2dpbmAgYSBhbGd1aWVuIHF1ZVxuICAgKiBlc3TDoSBjb21wcmFuZG8gcG9yIGAvYnV5Lzp0b2tlbmAsIG5pIHJvbXBlciB1biBsaW5rIGRlIHZlbmRlZG9yLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0N1cnJlbnRSb3V0ZVB1YmxpYygpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmVmaXhlcyA9IHRoaXMuY29uZmlnPy5wdWJsaWNSb3V0ZVByZWZpeGVzID8/IFtdO1xuICAgIGlmIChwcmVmaXhlcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJvdXRlci51cmwgfHwgJy8nO1xuICAgIGNvbnN0IHBhdGggPSBjdXJyZW50LnNwbGl0KCc/JylbMF0uc3BsaXQoJyMnKVswXSB8fCAnLyc7XG4gICAgcmV0dXJuIHByZWZpeGVzLnNvbWUocHJlZml4ID0+IHtcbiAgICAgIGlmICghcHJlZml4KSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gcHJlZml4LnN0YXJ0c1dpdGgoJy8nKSA/IHByZWZpeCA6IGAvJHtwcmVmaXh9YDtcbiAgICAgIHJldHVybiBwYXRoID09PSBub3JtYWxpemVkIHx8IHBhdGguc3RhcnRzV2l0aChgJHtub3JtYWxpemVkfS9gKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQXV0aEVycm9yKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSk6IE9ic2VydmFibGU8bmV2ZXI+IHtcbiAgICAvLyBgaW50ZXJwcmV0RXJyb3JgIChoZWxwZXIgY29tcGFydGlkbyBkZSBsYSBsaWIpIG5vcm1hbGl6YSBlbFxuICAgIC8vIEh0dHBFcnJvclJlc3BvbnNlIOKAlCBpbmNsdXllbmRvIGZhbGxvcyBkZSByZWQgKHN0YXR1cyAwKS4gQXBsYW5hbW9zIGFcbiAgICAvLyBBdXRoRXJyb3IgcGFyYSBtYW50ZW5lciBsYSBBUEkgcMO6YmxpY2EgZGUgQXV0aFNlcnZpY2UgZXN0YWJsZS5cbiAgICBjb25zdCBpbnRlcnByZXRlZCA9IGludGVycHJldEVycm9yKGVycm9yKTtcbiAgICBjb25zdCBhdXRoRXJyb3I6IEF1dGhFcnJvciA9IHtcbiAgICAgIGNvZGU6IGludGVycHJldGVkLmNvZGUsXG4gICAgICBtZXNzYWdlOiBpbnRlcnByZXRlZC5tZXNzYWdlLFxuICAgIH07XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0RXJyb3IoYXV0aEVycm9yKTtcbiAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBhdXRoRXJyb3IpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZJUkVCQVNFIElOVEVHUkFUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgYXN5bmMgc2lnbkluV2l0aEZpcmViYXNlKGZpcmViYXNlVG9rZW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFtGQkF1dGhdIGF1dGggZmxvdyDihpIgc2lnbkluV2l0aEZpcmViYXNlIGF0dGVtcHQgdG9rZW5MZW49JHtmaXJlYmFzZVRva2VuPy5sZW5ndGggPz8gMH0gYCArXG4gICAgICAgIGBmaXJlYmFzZVNlcnZpY2VQcmVzZW50PSR7ISF0aGlzLmZpcmViYXNlU2VydmljZX1gXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuZmlyZWJhc2VTZXJ2aWNlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlyZWJhc2VTZXJ2aWNlLnNpZ25JbldpdGhDdXN0b21Ub2tlbihmaXJlYmFzZVRva2VuKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRmlyZWJhc2Ugc2lnbmluIHN1Y2Nlc3NmdWwnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZVNlcnZpY2Ugbm90IHByb3ZpZGVkLiBBZGQgcHJvdmlkZVZhbHRlY2hGaXJlYmFzZSgpIHRvIHlvdXIgcHJvdmlkZXJzLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTm8gYmxvcXVlYXIgZWwgbG9naW4gcHJpbmNpcGFsIHNpIEZpcmViYXNlIGZhbGxhXG4gICAgICBjb25zb2xlLmVycm9yKCdbVmFsdGVjaEF1dGhdIEZpcmViYXNlIHNpZ25pbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2lnbk91dEZpcmViYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25maWc/LmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24pIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5maXJlYmFzZVNlcnZpY2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5maXJlYmFzZVNlcnZpY2Uuc2lnbk91dCgpO1xuICAgICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWdub3V0IHN1Y2Nlc3NmdWwnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWdub3JhciBlcnJvcmVzIGRlIEZpcmViYXNlIHNpZ25vdXRcbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWdub3V0IGZhaWxlZDonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLWVzdGFibGVjZSBsYSBzZXNpw7NuIGRlIEZpcmViYXNlIEF1dGggZW4gZWwgYm9vdHN0cmFwIGRlIGxhIGFwcCBjdWFuZG9cbiAgICogZWwgYWNjZXNzIHRva2VuIGRlIGxhIGFwcCBzaWd1ZSB2w6FsaWRvIChsYSByYW1hIGRlIGluaXRpYWxpemUoKSBxdWUgTk9cbiAgICogcGFzYSBwb3IgcmVmcmVzaCkuXG4gICAqXG4gICAqIEZpcmViYXNlIEF1dGggbWFudGllbmUgc3UgUFJPUElBIHNlc2nDs24gY29uIHBlcnNpc3RlbmNpYSBJbmRleGVkREJcbiAgICogaW5kZXBlbmRpZW50ZSBkZWwgc3RvcmFnZSBkZSB0b2tlbnMgZGUgbGEgYXBwLiBFbiB1biBuYXZlZ2Fkb3Igbm9ybWFsIGVzYVxuICAgKiBwZXJzaXN0ZW5jaWEgc2UgYXV0by1yZXN0YXVyYSBzb2xhOyBlbiB1bmEgUFdBIHN0YW5kYWxvbmUgZW4gaU9TIGVsXG4gICAqIGNvbnRlbmVkb3IgZGUgc3RvcmFnZSBubyBzb2JyZXZpdmUsIHkgYGZpcmViYXNlQXV0aFJlYWR5YCBzZSBxdWVkYSBlblxuICAgKiBgZmFsc2VgIGluZGVmaW5pZGFtZW50ZSDihpIgbG9zIGxpc3RlbmVycyBGaXJlc3RvcmUgY3VlbGdhbiAofjQwcyB0aW1lb3V0KS5cbiAgICpcbiAgICogRXN0cmF0ZWdpYTogZGFyIHVuYSB2ZW50YW5hIGNvcnRhIGEgbGEgYXV0by1yZXN0YXVyYWNpw7NuIGRlIEZpcmViYXNlIHksIHNpXG4gICAqIG5vIG9jdXJyZSwgZm9yemFyIHVuIGByZWZyZXNoQWNjZXNzVG9rZW4oKWAg4oCUIHF1ZSB5YSBoYWNlIGBzaWduSW5XaXRoRmlyZWJhc2VgXG4gICAqIGNvbiBlbCBgZmlyZWJhc2VUb2tlbmAgcXVlIGRldnVlbHZlIGAvcmVmcmVzaGAuXG4gICAqXG4gICAqIEZpcmUtYW5kLWZvcmdldDogc2UgaW52b2NhIGNvbiBgdm9pZGAgcGFyYSBubyBkZW1vcmFyIGBpbml0aWFsaXplKClgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVGaXJlYmFzZVNlc3Npb25PbkJvb3RzdHJhcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uIHx8ICF0aGlzLmZpcmViYXNlU2VydmljZSkgcmV0dXJuO1xuXG4gICAgLy8gRGFyIGEgbGEgcGVyc2lzdGVuY2lhIEluZGV4ZWREQiBwcm9waWEgZGUgRmlyZWJhc2UgQXV0aCB1bmEgb3BvcnR1bmlkYWRcbiAgICAvLyBkZSBhdXRvLXJlc3RhdXJhcnNlIChuYXZlZ2Fkb3Igbm9ybWFsKS4gRW4gdW5hIFBXQSBzdGFuZGFsb25lIGRlIGlPU1xuICAgIC8vIG5vcm1hbG1lbnRlIE5PIGxvIGhhcsOhLlxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAyNTAwKSk7XG5cbiAgICBpZiAodGhpcy5maXJlYmFzZVNlcnZpY2UuZmlyZWJhc2VBdXRoUmVhZHkoKSkge1xuICAgICAgY29uc29sZS5sb2coJ1tGQkF1dGhdIGJvb3RzdHJhcCDigJQgRmlyZWJhc2Ugc2Vzc2lvbiByZXN0b3JlZCBvbiBpdHMgb3duJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coXG4gICAgICAnW0ZCQXV0aF0gYm9vdHN0cmFwIOKAlCBzZXNzaW9uIHZhbGlkIGJ1dCBGaXJlYmFzZSBOT1QgcmVhZHkg4oaSIHJlY3VycmllbmRvIGEgZmFsbGJhY2snXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnJlZXN0YWJsaXNoRmlyZWJhc2VWaWFSZWZyZXNoKCdib290c3RyYXAtc2Vzc2lvbi1yZXN0b3JlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmFsbGJhY2sgc2VsZi1oZWFsaW5nIGRlIEZpcmViYXNlIEF1dGguIFBpZGUgdW4gZmlyZWJhc2VUb2tlbiBmcmVzY28gdsOtYVxuICAgKiBgL3JlZnJlc2hgIChxdWUgc8OtIGxvIGRldnVlbHZlIGRlIGZvcm1hIGNvbmZpYWJsZSkgeSwgZW4gw6l4aXRvLFxuICAgKiBgcmVmcmVzaEFjY2Vzc1Rva2VuKClgIHlhIGVqZWN1dGEgYHNpZ25JbldpdGhGaXJlYmFzZSgpYC5cbiAgICpcbiAgICogU2UgaW52b2NhIGN1YW5kbyB1biBwYXRoIGRlIGF1dGggZGVqw7MgbGEgc2VzacOzbiBkZSBGaXJlYmFzZSBzaW4gZXN0YWJsZWNlcjpcbiAgICogIC0gbG9naW4gT0F1dGgvcGFzc3dvcmQgcXVlIHZvbHZpw7Mgc2luIGBmaXJlYmFzZVRva2VuYCxcbiAgICogIC0gY29sZCBsYXVuY2ggZGUgUFdBIGlPUyBzaW4gcGVyc2lzdGVuY2lhIGRlIEZpcmViYXNlLlxuICAgKlxuICAgKiBgcmVhc29uYCBhcGFyZWNlIGVuIGxvcyBsb2dzIGBbRkJBdXRoXSBmYWxsYmFja2AgcGFyYSBwb2RlciBhdGVzdGlndWFyXG4gICAqIGRlc2RlIGVsIGRlYnVnLWNvbnNvbGUgcXXDqSBkaXNwYXLDsyBlbCBmYWxsYmFjay5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVlc3RhYmxpc2hGaXJlYmFzZVZpYVJlZnJlc2gocmVhc29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uIHx8ICF0aGlzLmZpcmViYXNlU2VydmljZSkgcmV0dXJuO1xuXG4gICAgY29uc29sZS5sb2coYFtGQkF1dGhdIGZhbGxiYWNrIOKAlCByZS1lc3RhYmxlY2llbmRvIEZpcmViYXNlIHbDrWEgL3JlZnJlc2ggKG1vdGl2bzogJHtyZWFzb259KWApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbRkJBdXRoXSBmYWxsYmFjayDigJQgL3JlZnJlc2ggT0ssIEZpcmViYXNlIHJlLWVzdGFibGVjaWRvIChtb3Rpdm86ICR7cmVhc29ufSlgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtGQkF1dGhdIGZhbGxiYWNrIOKAlCAvcmVmcmVzaCBmYWxsw7MgKG1vdGl2bzogJHtyZWFzb259KTpgLCBlKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gREVWSUNFIFJFR0lTVFJBVElPTiAoUHVzaCBOb3RpZmljYXRpb25zKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogU29saWNpdGEgcGVybWlzb3MgZGUgbm90aWZpY2FjacOzbiB5IHJlZ2lzdHJhIGVsIGRpc3Bvc2l0aXZvLlxuICAgKiBVc2FyIGN1YW5kbyBlbCB1c3VhcmlvIGFjZXB0YSByZWNpYmlyIG5vdGlmaWNhY2lvbmVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIG9uRW5hYmxlTm90aWZpY2F0aW9ucygpIHtcbiAgICogICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGguZW5hYmxlTm90aWZpY2F0aW9ucygpO1xuICAgKiAgIGlmIChyZXN1bHQuZ3JhbnRlZCkge1xuICAgKiAgICAgY29uc29sZS5sb2coJ05vdGlmaWNhY2lvbmVzIGhhYmlsaXRhZGFzJyk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZW5hYmxlTm90aWZpY2F0aW9ucygpOiBQcm9taXNlPEVuYWJsZU5vdGlmaWNhdGlvbnNSZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIE1lc3NhZ2luZ1NlcnZpY2Ugbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIHsgZ3JhbnRlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoIShhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuaXNTdXBwb3J0ZWQoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBQdXNoIG5vdGlmaWNhdGlvbnMgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgcmV0dXJuIHsgZ3JhbnRlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMubWVzc2FnaW5nU2VydmljZS5yZXF1ZXN0UGVybWlzc2lvbigpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiB7IGdyYW50ZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0cmFyIGRpc3Bvc2l0aXZvIGVuIGJhY2tlbmRcbiAgICBjb25zdCByZWdpc3RlcmVkID0gYXdhaXQgdGhpcy5yZWdpc3RlckRldmljZUlmTmVlZGVkKCk7XG5cbiAgICByZXR1cm4geyBncmFudGVkOiB0cnVlLCB0b2tlbiwgcmVnaXN0ZXJlZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2FjdGl2YSBsYXMgbm90aWZpY2FjaW9uZXMgcGFyYSBlc3RlIGRpc3Bvc2l0aXZvLlxuICAgKiBFbGltaW5hIGVsIHRva2VuIGRlbCBiYWNrZW5kIHkgZGUgRkNNLlxuICAgKiBVc2FyIGRlc2RlIHVuIHRvZ2dsZSBkZSBwcmVmZXJlbmNpYXMgY3VhbmRvIGVsIHVzdWFyaW8gZGVzYWN0aXZhIG5vdGlmaWNhY2lvbmVzLlxuICAgKlxuICAgKiBOT1RBOiBFc3RvIE5PIHJldm9jYSBlbCBwZXJtaXNvIGRlbCBuYXZlZ2Fkb3IgKGVsIHVzdWFyaW8gZGViZSBoYWNlcmxvIG1hbnVhbG1lbnRlXG4gICAqIGRlc2RlIGxhIGNvbmZpZ3VyYWNpw7NuIGRlbCBuYXZlZ2Fkb3IpLiBTb2xvIGVsaW1pbmEgZWwgcmVnaXN0cm8gZGVsIGRpc3Bvc2l0aXZvLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIG9uVG9nZ2xlTm90aWZpY2F0aW9ucyhlbmFibGVkOiBib29sZWFuKSB7XG4gICAqICAgaWYgKGVuYWJsZWQpIHtcbiAgICogICAgIGF3YWl0IHRoaXMuYXV0aC5lbmFibGVOb3RpZmljYXRpb25zKCk7XG4gICAqICAgfSBlbHNlIHtcbiAgICogICAgIGF3YWl0IHRoaXMuYXV0aC5kaXNhYmxlTm90aWZpY2F0aW9ucygpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGRpc2FibGVOb3RpZmljYXRpb25zKCk6IFByb21pc2U8eyBkaXNhYmxlZDogYm9vbGVhbiB9PiB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2luZ1NlcnZpY2UpIHtcbiAgICAgIHJldHVybiB7IGRpc2FibGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHRoaXMubWVzc2FnaW5nU2VydmljZS5jdXJyZW50VG9rZW47XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgLy8gRWxpbWluYXIgZGVsIGJhY2tlbmRcbiAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgICAucmVxdWVzdCgnREVMRVRFJywgYCR7dGhpcy5jb25maWc/LmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlcy9ieS10b2tlbmAsIHtcbiAgICAgICAgICAgICAgYm9keTogeyB0b2tlbiB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVsaW1pbmFyIHRva2VuIGRlIEZDTVxuICAgICAgICBhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZGVsZXRlVG9rZW4oKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gTm90aWZpY2F0aW9ucyBkaXNhYmxlZCcpO1xuICAgICAgICByZXR1cm4geyBkaXNhYmxlZDogdHJ1ZSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBkaXNhYmxlZDogZmFsc2UgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIEZhaWxlZCB0byBkaXNhYmxlIG5vdGlmaWNhdGlvbnM6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgZGlzYWJsZWQ6IGZhbHNlIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgZWwgZXN0YWRvIGFjdHVhbCBkZSBwZXJtaXNvcyBkZSBub3RpZmljYWNpw7NuLlxuICAgKlxuICAgKiBAcmV0dXJucyAnZ3JhbnRlZCcgfCAnZGVuaWVkJyB8ICdkZWZhdWx0JyB8ICd1bnN1cHBvcnRlZCdcbiAgICovXG4gIGdldE5vdGlmaWNhdGlvblBlcm1pc3Npb25TdGF0ZSgpOiBOb3RpZmljYXRpb25QZXJtaXNzaW9uU3RhdGUge1xuICAgIGlmICghdGhpcy5tZXNzYWdpbmdTZXJ2aWNlKSB7XG4gICAgICByZXR1cm4gJ3Vuc3VwcG9ydGVkJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnaW5nU2VydmljZS5nZXRQZXJtaXNzaW9uU3RhdGUoKSBhcyBOb3RpZmljYXRpb25QZXJtaXNzaW9uU3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0cmEgbWFudWFsbWVudGUgZWwgZGlzcG9zaXRpdm8gZW4gZWwgYmFja2VuZC5cbiAgICogw5p0aWwgcGFyYSBzaW5jcm9uaXphciBkaXNwb3NpdGl2b3MgcXVlIHRpZW5lbiB0b2tlbiBGQ00gcGVybyBubyBlc3TDoW4gcmVnaXN0cmFkb3MuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlZFRva2VuIFRva2VuIEZDTSBvcGNpb25hbC4gU2kgc2UgcHJvcG9yY2lvbmEsIHNlIHVzYSBkaXJlY3RhbWVudGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgc2luIGRlcGVuZGVyIGRlbCBNZXNzYWdpbmdTZXJ2aWNlIChldml0YSB0aW1pbmcgaXNzdWVzKS5cbiAgICogQHJldHVybnMgUmVzdWx0YWRvIGRlbCByZWdpc3RybyBjb24gZGV2aWNlSWQgc2kgZnVlIGV4aXRvc29cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBTaW5jcm9uaXphciBjb24gdG9rZW4gZXhpc3RlbnRlIChyZWNvbWVuZGFkbylcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnJlZ2lzdGVyRGV2aWNlKG15VG9rZW4pO1xuICAgKlxuICAgKiAvLyBTaW4gdG9rZW4sIGludGVudGFyw6Egb2J0ZW5lcmxvIGRlbCBNZXNzYWdpbmdTZXJ2aWNlXG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5yZWdpc3RlckRldmljZSgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyRGV2aWNlKHByb3ZpZGVkVG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPFJlZ2lzdGVyRGV2aWNlUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdVc3VhcmlvIG5vIGF1dGVudGljYWRvJyB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBWZXJpZmljYXIgcGVybWlzb3Mgc2kgdGVuZW1vcyBNZXNzYWdpbmdTZXJ2aWNlXG4gICAgICBpZiAodGhpcy5tZXNzYWdpbmdTZXJ2aWNlKSB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb24gPSB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZ2V0UGVybWlzc2lvblN0YXRlKCk7XG4gICAgICAgIGlmIChwZXJtaXNzaW9uICE9PSAnZ3JhbnRlZCcpIHtcbiAgICAgICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdQZXJtaXNvIGRlIG5vdGlmaWNhY2lvbmVzIG5vIG90b3JnYWRvJyB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVzYXIgdG9rZW4gcHJvcG9yY2lvbmFkbyBwcmltZXJvIChldml0YSB0aW1pbmcgaXNzdWVzIGNvbiBJbmplY3RvcilcbiAgICAgIGxldCB0b2tlbiA9IHByb3ZpZGVkVG9rZW4gfHwgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlPy5jdXJyZW50VG9rZW47XG5cbiAgICAgIC8vIFNpIG5vIGhheSB0b2tlbiwgaW50ZW50YXIgb2J0ZW5lcmxvIGRlbCBNZXNzYWdpbmdTZXJ2aWNlXG4gICAgICBpZiAoIXRva2VuICYmIHRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuaXNTdXBwb3J0ZWQoKSkpIHtcbiAgICAgICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdGQ00gbm8gc29wb3J0YWRvIGVuIGVzdGUgbmF2ZWdhZG9yJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRva2VuID0gYXdhaXQgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmdldFRva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHsgcmVnaXN0ZXJlZDogZmFsc2UsIGVycm9yOiAnTm8gc2UgcHVkbyBvYnRlbmVyIHRva2VuIEZDTScgfTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVnaXN0cmFyIGVuIGJhY2tlbmRcbiAgICAgIGNvbnN0IHsgcGxhdGZvcm0sIGJyb3dzZXIsIG9zIH0gPSB0aGlzLmRldGVjdFBsYXRmb3JtSW5mbygpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5odHRwLnBvc3Q8UmVnaXN0ZXJEZXZpY2VSZXNwb25zZT4oYCR7dGhpcy5jb25maWc/LmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlc2AsIHtcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgICBhcHBJZDogdGhpcy5jb25maWc/LmFwcElkLFxuICAgICAgICAgIGJyb3dzZXIsXG4gICAgICAgICAgb3MsXG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBEZXZpY2UgcmVnaXN0ZXJlZCBtYW51YWxseTonLCByZXNwb25zZS5kZXZpY2UuZGV2aWNlSWQpO1xuICAgICAgcmV0dXJuIHsgcmVnaXN0ZXJlZDogdHJ1ZSwgZGV2aWNlSWQ6IHJlc3BvbnNlLmRldmljZS5kZXZpY2VJZCwgdG9rZW4gfTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tWYWx0ZWNoQXV0aF0gTWFudWFsIGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZ2lzdGVyZWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogZXJyb3I/LmVycm9yPy5tZXNzYWdlIHx8IGVycm9yPy5tZXNzYWdlIHx8ICdFcnJvciBhbCByZWdpc3RyYXIgZGlzcG9zaXRpdm8nLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0cmEgZWwgZGlzcG9zaXRpdm8gZW4gZWwgYmFja2VuZCBzaSB0aWVuZSBwZXJtaXNvcyBkZSBub3RpZmljYWNpw7NuLlxuICAgKiBTZSBsbGFtYSBhdXRvbcOhdGljYW1lbnRlIGRlc3B1w6lzIGRlIHVuIGxvZ2luIGV4aXRvc28gc2kgZW5hYmxlRGV2aWNlUmVnaXN0cmF0aW9uPXRydWUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyRGV2aWNlSWZOZWVkZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gU29sbyBzaSBlc3TDoSBoYWJpbGl0YWRvIHkgbWVzc2FnaW5nIGVzdMOhIGRpc3BvbmlibGVcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVEZXZpY2VSZWdpc3RyYXRpb24gfHwgIXRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBWZXJpZmljYXIgc2kgRkNNIGVzdMOhIHNvcG9ydGFkb1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmlzU3VwcG9ydGVkKCkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZpY2FyIHNpIHlhIHRpZW5lIHBlcm1pc29zXG4gICAgICBjb25zdCBwZXJtaXNzaW9uID0gdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmdldFBlcm1pc3Npb25TdGF0ZSgpO1xuICAgICAgaWYgKHBlcm1pc3Npb24gIT09ICdncmFudGVkJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIE5vIHNvbGljaXRhciBhdXRvbcOhdGljYW1lbnRlLCBzb2xvIHJlZ2lzdHJhciBzaSB5YSB0aWVuZSBwZXJtaXNvXG4gICAgICB9XG5cbiAgICAgIC8vIE9idGVuZXIgdG9rZW4gZXhpc3RlbnRlIChubyBzb2xpY2l0YXIgbnVldm8pXG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMubWVzc2FnaW5nU2VydmljZS5nZXRUb2tlbigpO1xuICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZ2lzdHJhciBlbiBiYWNrZW5kXG4gICAgICBjb25zdCB7IHBsYXRmb3JtLCBicm93c2VyLCBvcyB9ID0gdGhpcy5kZXRlY3RQbGF0Zm9ybUluZm8oKTtcbiAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLmh0dHAucG9zdDxSZWdpc3RlckRldmljZVJlc3BvbnNlPihgJHt0aGlzLmNvbmZpZz8uYXBpVXJsfS92Mi91c2Vycy9tZS9kZXZpY2VzYCwge1xuICAgICAgICAgIHRva2VuLFxuICAgICAgICAgIHBsYXRmb3JtLFxuICAgICAgICAgIGFwcElkOiB0aGlzLmNvbmZpZz8uYXBwSWQsXG4gICAgICAgICAgYnJvd3NlcixcbiAgICAgICAgICBvcyxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIERldmljZSByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIE5vIGJsb3F1ZWFyIGF1dGggc2kgZmFsbGEgZGV2aWNlIHJlZ2lzdHJhdGlvblxuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIERldmljZSByZWdpc3RyYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRWxpbWluYSBlbCBkaXNwb3NpdGl2byBkZWwgYmFja2VuZCB5IGJvcnJhIGVsIHRva2VuIEZDTS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdW5yZWdpc3RlckRldmljZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVEZXZpY2VSZWdpc3RyYXRpb24gfHwgIXRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHRoaXMubWVzc2FnaW5nU2VydmljZS5jdXJyZW50VG9rZW47XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgLy8gRGVsZXRlIGZyb20gYmFja2VuZCAoZmlyZSBhbmQgZm9yZ2V0KVxuICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAucmVxdWVzdCgnREVMRVRFJywgYCR7dGhpcy5jb25maWc/LmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlcy9ieS10b2tlbmAsIHtcbiAgICAgICAgICAgIGJvZHk6IHsgdG9rZW4gfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgICAgICAvLyBEZWxldGUgZnJvbSBGQ01cbiAgICAgICAgYXdhaXQgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmRlbGV0ZVRva2VuKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIERldmljZSB1bnJlZ2lzdGVyZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIElnbm9yYXIgZXJyb3JlcyBlbiBjbGVhbnVwXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdGEgaW5mb3JtYWNpw7NuIGRlIGxhIHBsYXRhZm9ybWEgZGVsIGRpc3Bvc2l0aXZvLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RQbGF0Zm9ybUluZm8oKTogeyBwbGF0Zm9ybTogJ3dlYic7IGJyb3dzZXI6IHN0cmluZzsgb3M6IHN0cmluZyB9IHtcbiAgICBjb25zdCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7XG5cbiAgICAvLyBEZXRlY3RhciBuYXZlZ2Fkb3JcbiAgICBsZXQgYnJvd3NlciA9ICdVbmtub3duJztcbiAgICBpZiAodWEuaW5jbHVkZXMoJ0ZpcmVmb3gnKSkge1xuICAgICAgYnJvd3NlciA9ICdGaXJlZm94JztcbiAgICB9IGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdFZGcnKSkge1xuICAgICAgYnJvd3NlciA9ICdFZGdlJztcbiAgICB9IGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdDaHJvbWUnKSkge1xuICAgICAgYnJvd3NlciA9ICdDaHJvbWUnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ1NhZmFyaScpKSB7XG4gICAgICBicm93c2VyID0gJ1NhZmFyaSc7XG4gICAgfVxuXG4gICAgLy8gRGV0ZWN0YXIgT1NcbiAgICBsZXQgb3MgPSAnVW5rbm93bic7XG4gICAgaWYgKHVhLmluY2x1ZGVzKCdXaW5kb3dzJykpIHtcbiAgICAgIG9zID0gJ1dpbmRvd3MnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ01hYyBPUycpKSB7XG4gICAgICBvcyA9ICdtYWNPUyc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnTGludXgnKSkge1xuICAgICAgb3MgPSAnTGludXgnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ0FuZHJvaWQnKSkge1xuICAgICAgb3MgPSAnQW5kcm9pZCc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnaU9TJykgfHwgdWEuaW5jbHVkZXMoJ2lQaG9uZScpIHx8IHVhLmluY2x1ZGVzKCdpUGFkJykpIHtcbiAgICAgIG9zID0gJ2lPUyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcGxhdGZvcm06ICd3ZWInLCBicm93c2VyLCBvcyB9O1xuICB9XG59XG4iXX0=
|