cdk-amazon-chime-resources
Version:

89 lines • 15.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.voiceConnectorValidator = void 0;
const voiceConnector_1 = require("./voiceConnector");
var ISO_3166_ALPHA_2 = /^A[^ABCHJKNPVY]|B[^CKPUX]|C[^BEJPQST]|D[EJKMOZ]|E[CEGHRST]|F[IJKMOR]|G[^CJKOVXZ]|H[KMNRTU]|I[DEL-OQ-T]|J[EMOP]|K[EGHIMNPRWYZ]|L[ABCIKR-VY]|M[^BIJ]|N[ACEFGILOPRUZ]|OM|P[AE-HK-NRSTWY]|QA|R[EOSUW]|S[^FPQUW]|T[^ABEIPQSUXY]|U[AGMSYZ]|V[ACEGINU]|WF|WS|YE|YT|Z[AMW]$/;
var RFC_1918 = /(^192\.168\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])$)|(^172\.([1][6-9]|[2][0-9]|[3][0-1])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])$)|(^10\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])$)/;
var IP_ADDRESS = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
var VALID_CIDR = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/(2[7-9])|(3[0-2])$/;
var RFC_1918_CIDR = /(^192\.168\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])(\/((2[7-9])|(3[0-2]))$))|(^172\.([1][6-9]|[2][0-9]|[3][0-1])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])(\/((2[7-9])|(3[0-2]))$)$)|(^10\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])(\/((2[7-9])|(3[0-2]))$))/;
var FQDN = /^(?!.*?_.*?)(?!(?:[\w]+?\.)?\-[\w\.\-]*?)(?![\w]+?\-\.(?:[\w\.\-]+?))(?=[\w])(?=[\w\.\-]*?\.+[\w\.\-]*?)(?![\w\.\-]{254})(?!(?:\.?[\w\-\.]*?[\w\-]{64,}\.)+?)[\w\.\-]+?(?<![\w\-\.]*?\.[\d]+?)(?<=[\w\-]{2,})(?<![\w\-]{25})$/;
function voiceConnectorValidator(props) {
if (props.region) {
if (!(props.region.includes('Token[AWS.Region.') ||
props.region === 'us-east-1' ||
props.region === 'us-west-2' ||
props.region === 'ap-northeast-1' ||
props.region === 'ap-northeast-2' ||
props.region === 'ap-southeast-1' ||
props.region === 'ap-southeast-2' ||
props.region === 'ca-central-1' ||
props.region === 'eu-central-1' ||
props.region === 'eu-west-1' ||
props.region === 'eu-west-2')) {
throw new Error('Region must be a valid region: https://docs.aws.amazon.com/chime-sdk/latest/dg/sdk-available-regions.html#sdk-pstn-regions');
}
}
if (props.termination && props.termination.cps !== undefined) {
if (props.termination.cps < 1) {
throw new Error('CPS must be between 1 and 256');
}
if (props.termination.cps > 256) {
throw new Error('CPS must be between 1 and 256');
}
}
if (props.termination && props.termination.callingRegions) {
for (var country of props.termination.callingRegions) {
if (!ISO_3166_ALPHA_2.test(country)) {
throw new Error(`Invalid Country: ${country}`);
}
}
}
if (props.termination && props.termination.terminationCidrs) {
for (var terminationCidr of props.termination.terminationCidrs) {
if (terminationCidr.includes('Token')) {
}
else if (!VALID_CIDR.test(terminationCidr)) {
throw new Error('Termination CIDR must be a valid non-RFC1918 IPv4 CIDR block (/27-/32)');
}
}
}
if (props.termination && props.termination.terminationCidrs) {
for (var terminationCidr of props.termination.terminationCidrs) {
if (RFC_1918_CIDR.test(terminationCidr)) {
throw new Error('Termination CIDR must not be RFC1918 CIDR block (/27-/32)');
}
}
}
if (props.origination) {
for (var route of props.origination) {
if (route.host.includes('Token')) {
}
else if (IP_ADDRESS.test(route.host)) {
if (RFC_1918.test(route.host)) {
throw new Error('Origination IP must not be RFC1918 IP Address');
}
}
else if (!FQDN.test(route.host)) {
throw new Error('Origination IP must be valid, non-RFC1918 IPv4 Address or FQDN');
}
}
}
if (props.origination) {
for (var route of props.origination) {
if (route.port < 1 || route.port > 65535) {
throw new Error('Port range must be valid: 1-65535');
}
}
}
if (props.origination && props.encryption) {
for (var route of props.origination) {
if (route.protocol === voiceConnector_1.Protocol.UDP) {
throw new Error('TCP must be used with Encryption enabled');
}
}
}
return true;
}
exports.voiceConnectorValidator = voiceConnectorValidator;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2VDb25uZWN0b3JWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHN0bi92b2ljZUNvbm5lY3RvclZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBaUU7QUFFakUsSUFBSSxnQkFBZ0IsR0FDbEIscVFBQXFRLENBQUM7QUFFeFEsSUFBSSxRQUFRLEdBQ1YsdVRBQXVULENBQUM7QUFFMVQsSUFBSSxVQUFVLEdBQ1osNkZBQTZGLENBQUM7QUFFaEcsSUFBSSxVQUFVLEdBQ1osZ0hBQWdILENBQUM7QUFFbkgsSUFBSSxhQUFhLEdBQ2YsNlhBQTZYLENBQUM7QUFFaFksSUFBSSxJQUFJLEdBQ04sK05BQStOLENBQUM7QUFFbE8sU0FBZ0IsdUJBQXVCLENBQUMsS0FBMEI7SUFDaEUsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDakIsSUFDRSxDQUFDLENBQ0MsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7WUFDMUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxXQUFXO1lBQzVCLEtBQUssQ0FBQyxNQUFNLEtBQUssV0FBVztZQUM1QixLQUFLLENBQUMsTUFBTSxLQUFLLGdCQUFnQjtZQUNqQyxLQUFLLENBQUMsTUFBTSxLQUFLLGdCQUFnQjtZQUNqQyxLQUFLLENBQUMsTUFBTSxLQUFLLGdCQUFnQjtZQUNqQyxLQUFLLENBQUMsTUFBTSxLQUFLLGdCQUFnQjtZQUNqQyxLQUFLLENBQUMsTUFBTSxLQUFLLGNBQWM7WUFDL0IsS0FBSyxDQUFDLE1BQU0sS0FBSyxjQUFjO1lBQy9CLEtBQUssQ0FBQyxNQUFNLEtBQUssV0FBVztZQUM1QixLQUFLLENBQUMsTUFBTSxLQUFLLFdBQVcsQ0FDN0IsRUFDRCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYiw0SEFBNEgsQ0FDN0gsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzdELElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFELEtBQUssSUFBSSxPQUFPLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNyRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDakQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUM1RCxLQUFLLElBQUksZUFBZSxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMvRCxJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxDQUFDO2lCQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLE1BQU0sSUFBSSxLQUFLLENBQ2Isd0VBQXdFLENBQ3pFLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVELEtBQUssSUFBSSxlQUFlLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQy9ELElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO2dCQUN4QyxNQUFNLElBQUksS0FBSyxDQUNiLDJEQUEyRCxDQUM1RCxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEIsS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDcEMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ25DLENBQUM7aUJBQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztnQkFDbkUsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0VBQWdFLENBQ2pFLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0QixLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztZQUN2RCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzFDLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyx5QkFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7WUFDOUQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBN0ZELDBEQTZGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb3RvY29sLCBWb2ljZUNvbm5lY3RvclByb3BzIH0gZnJvbSAnLi92b2ljZUNvbm5lY3Rvcic7XG5cbnZhciBJU09fMzE2Nl9BTFBIQV8yID1cbiAgL15BW15BQkNISktOUFZZXXxCW15DS1BVWF18Q1teQkVKUFFTVF18RFtFSktNT1pdfEVbQ0VHSFJTVF18RltJSktNT1JdfEdbXkNKS09WWFpdfEhbS01OUlRVXXxJW0RFTC1PUS1UXXxKW0VNT1BdfEtbRUdISU1OUFJXWVpdfExbQUJDSUtSLVZZXXxNW15CSUpdfE5bQUNFRkdJTE9QUlVaXXxPTXxQW0FFLUhLLU5SU1RXWV18UUF8UltFT1NVV118U1teRlBRVVddfFRbXkFCRUlQUVNVWFldfFVbQUdNU1laXXxWW0FDRUdJTlVdfFdGfFdTfFlFfFlUfFpbQU1XXSQvO1xuXG52YXIgUkZDXzE5MTggPVxuICAvKF4xOTJcXC4xNjhcXC4oWzAtOV18WzAtOV1bMC05XXxbMC0yXVswLTVdWzAtNV0pXFwuKFswLTldfFswLTldWzAtOV18WzAtMl1bMC01XVswLTVdKSQpfCheMTcyXFwuKFsxXVs2LTldfFsyXVswLTldfFszXVswLTFdKVxcLihbMC05XXxbMC05XVswLTldfFswLTJdWzAtNV1bMC01XSlcXC4oWzAtOV18WzAtOV1bMC05XXxbMC0yXVswLTVdWzAtNV0pJCl8KF4xMFxcLihbMC05XXxbMC05XVswLTldfFswLTJdWzAtNV1bMC01XSlcXC4oWzAtOV18WzAtOV1bMC05XXxbMC0yXVswLTVdWzAtNV0pXFwuKFswLTldfFswLTldWzAtOV18WzAtMl1bMC01XVswLTVdKSQpLztcblxudmFyIElQX0FERFJFU1MgPVxuICAvXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KSQvO1xuXG52YXIgVkFMSURfQ0lEUiA9XG4gIC9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwvKDJbNy05XSl8KDNbMC0yXSkkLztcblxudmFyIFJGQ18xOTE4X0NJRFIgPVxuICAvKF4xOTJcXC4xNjhcXC4oWzAtOV18WzAtOV1bMC05XXxbMC0yXVswLTVdWzAtNV0pXFwuKFswLTldfFswLTldWzAtOV18WzAtMl1bMC01XVswLTVdKShcXC8oKDJbNy05XSl8KDNbMC0yXSkpJCkpfCheMTcyXFwuKFsxXVs2LTldfFsyXVswLTldfFszXVswLTFdKVxcLihbMC05XXxbMC05XVswLTldfFswLTJdWzAtNV1bMC01XSlcXC4oWzAtOV18WzAtOV1bMC05XXxbMC0yXVswLTVdWzAtNV0pKFxcLygoMls3LTldKXwoM1swLTJdKSkkKSQpfCheMTBcXC4oWzAtOV18WzAtOV1bMC05XXxbMC0yXVswLTVdWzAtNV0pXFwuKFswLTldfFswLTldWzAtOV18WzAtMl1bMC01XVswLTVdKVxcLihbMC05XXxbMC05XVswLTldfFswLTJdWzAtNV1bMC01XSkoXFwvKCgyWzctOV0pfCgzWzAtMl0pKSQpKS87XG5cbnZhciBGUUROID1cbiAgL14oPyEuKj9fLio/KSg/ISg/OltcXHddKz9cXC4pP1xcLVtcXHdcXC5cXC1dKj8pKD8hW1xcd10rP1xcLVxcLig/OltcXHdcXC5cXC1dKz8pKSg/PVtcXHddKSg/PVtcXHdcXC5cXC1dKj9cXC4rW1xcd1xcLlxcLV0qPykoPyFbXFx3XFwuXFwtXXsyNTR9KSg/ISg/OlxcLj9bXFx3XFwtXFwuXSo/W1xcd1xcLV17NjQsfVxcLikrPylbXFx3XFwuXFwtXSs/KD88IVtcXHdcXC1cXC5dKj9cXC5bXFxkXSs/KSg/PD1bXFx3XFwtXXsyLH0pKD88IVtcXHdcXC1dezI1fSkkLztcblxuZXhwb3J0IGZ1bmN0aW9uIHZvaWNlQ29ubmVjdG9yVmFsaWRhdG9yKHByb3BzOiBWb2ljZUNvbm5lY3RvclByb3BzKSB7XG4gIGlmIChwcm9wcy5yZWdpb24pIHtcbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICBwcm9wcy5yZWdpb24uaW5jbHVkZXMoJ1Rva2VuW0FXUy5SZWdpb24uJykgfHxcbiAgICAgICAgcHJvcHMucmVnaW9uID09PSAndXMtZWFzdC0xJyB8fFxuICAgICAgICBwcm9wcy5yZWdpb24gPT09ICd1cy13ZXN0LTInIHx8XG4gICAgICAgIHByb3BzLnJlZ2lvbiA9PT0gJ2FwLW5vcnRoZWFzdC0xJyB8fFxuICAgICAgICBwcm9wcy5yZWdpb24gPT09ICdhcC1ub3J0aGVhc3QtMicgfHxcbiAgICAgICAgcHJvcHMucmVnaW9uID09PSAnYXAtc291dGhlYXN0LTEnIHx8XG4gICAgICAgIHByb3BzLnJlZ2lvbiA9PT0gJ2FwLXNvdXRoZWFzdC0yJyB8fFxuICAgICAgICBwcm9wcy5yZWdpb24gPT09ICdjYS1jZW50cmFsLTEnIHx8XG4gICAgICAgIHByb3BzLnJlZ2lvbiA9PT0gJ2V1LWNlbnRyYWwtMScgfHxcbiAgICAgICAgcHJvcHMucmVnaW9uID09PSAnZXUtd2VzdC0xJyB8fFxuICAgICAgICBwcm9wcy5yZWdpb24gPT09ICdldS13ZXN0LTInXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdSZWdpb24gbXVzdCBiZSBhIHZhbGlkIHJlZ2lvbjogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NoaW1lLXNkay9sYXRlc3QvZGcvc2RrLWF2YWlsYWJsZS1yZWdpb25zLmh0bWwjc2RrLXBzdG4tcmVnaW9ucycsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9wcy50ZXJtaW5hdGlvbiAmJiBwcm9wcy50ZXJtaW5hdGlvbi5jcHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChwcm9wcy50ZXJtaW5hdGlvbi5jcHMgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NQUyBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMjU2Jyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy50ZXJtaW5hdGlvbi5jcHMgPiAyNTYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ1BTIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAyNTYnKTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJvcHMudGVybWluYXRpb24gJiYgcHJvcHMudGVybWluYXRpb24uY2FsbGluZ1JlZ2lvbnMpIHtcbiAgICBmb3IgKHZhciBjb3VudHJ5IG9mIHByb3BzLnRlcm1pbmF0aW9uLmNhbGxpbmdSZWdpb25zKSB7XG4gICAgICBpZiAoIUlTT18zMTY2X0FMUEhBXzIudGVzdChjb3VudHJ5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgQ291bnRyeTogJHtjb3VudHJ5fWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9wcy50ZXJtaW5hdGlvbiAmJiBwcm9wcy50ZXJtaW5hdGlvbi50ZXJtaW5hdGlvbkNpZHJzKSB7XG4gICAgZm9yICh2YXIgdGVybWluYXRpb25DaWRyIG9mIHByb3BzLnRlcm1pbmF0aW9uLnRlcm1pbmF0aW9uQ2lkcnMpIHtcbiAgICAgIGlmICh0ZXJtaW5hdGlvbkNpZHIuaW5jbHVkZXMoJ1Rva2VuJykpIHtcbiAgICAgIH0gZWxzZSBpZiAoIVZBTElEX0NJRFIudGVzdCh0ZXJtaW5hdGlvbkNpZHIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnVGVybWluYXRpb24gQ0lEUiBtdXN0IGJlIGEgdmFsaWQgbm9uLVJGQzE5MTggSVB2NCBDSURSIGJsb2NrICgvMjctLzMyKScsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb3BzLnRlcm1pbmF0aW9uICYmIHByb3BzLnRlcm1pbmF0aW9uLnRlcm1pbmF0aW9uQ2lkcnMpIHtcbiAgICBmb3IgKHZhciB0ZXJtaW5hdGlvbkNpZHIgb2YgcHJvcHMudGVybWluYXRpb24udGVybWluYXRpb25DaWRycykge1xuICAgICAgaWYgKFJGQ18xOTE4X0NJRFIudGVzdCh0ZXJtaW5hdGlvbkNpZHIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnVGVybWluYXRpb24gQ0lEUiBtdXN0IG5vdCBiZSBSRkMxOTE4IENJRFIgYmxvY2sgKC8yNy0vMzIpJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocHJvcHMub3JpZ2luYXRpb24pIHtcbiAgICBmb3IgKHZhciByb3V0ZSBvZiBwcm9wcy5vcmlnaW5hdGlvbikge1xuICAgICAgaWYgKHJvdXRlLmhvc3QuaW5jbHVkZXMoJ1Rva2VuJykpIHtcbiAgICAgIH0gZWxzZSBpZiAoSVBfQUREUkVTUy50ZXN0KHJvdXRlLmhvc3QpKSB7XG4gICAgICAgIGlmIChSRkNfMTkxOC50ZXN0KHJvdXRlLmhvc3QpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPcmlnaW5hdGlvbiBJUCBtdXN0IG5vdCBiZSBSRkMxOTE4IElQIEFkZHJlc3MnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghRlFETi50ZXN0KHJvdXRlLmhvc3QpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnT3JpZ2luYXRpb24gSVAgbXVzdCBiZSB2YWxpZCwgbm9uLVJGQzE5MTggSVB2NCBBZGRyZXNzIG9yIEZRRE4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9wcy5vcmlnaW5hdGlvbikge1xuICAgIGZvciAodmFyIHJvdXRlIG9mIHByb3BzLm9yaWdpbmF0aW9uKSB7XG4gICAgICBpZiAocm91dGUucG9ydCA8IDEgfHwgcm91dGUucG9ydCA+IDY1NTM1KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUG9ydCByYW5nZSBtdXN0IGJlIHZhbGlkOiAxLTY1NTM1Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb3BzLm9yaWdpbmF0aW9uICYmIHByb3BzLmVuY3J5cHRpb24pIHtcbiAgICBmb3IgKHZhciByb3V0ZSBvZiBwcm9wcy5vcmlnaW5hdGlvbikge1xuICAgICAgaWYgKHJvdXRlLnByb3RvY29sID09PSBQcm90b2NvbC5VRFApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUQ1AgbXVzdCBiZSB1c2VkIHdpdGggRW5jcnlwdGlvbiBlbmFibGVkJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=