UNPKG

@broadcom/mat-detect-for-zowe-cli

Version:

MAT Detect plug-in for Zowe CLI

264 lines 24.9 kB
"use strict"; /* * Copyright (c) 2019 Broadcom. All Rights Reserved. The term * "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. * * This software and all information contained therein is * confidential and proprietary and shall not be duplicated, * used, disclosed, or disseminated in any way except as * authorized by the applicable license agreement, without the * express written permission of Broadcom. All authorized * reproductions must be marked with this language. * * EXCEPT AS SET FORTH IN THE APPLICABLE LICENSE AGREEMENT, TO * THE EXTENT PERMITTED BY APPLICABLE LAW, BROADCOM PROVIDES THIS * SOFTWARE WITHOUT WARRANTY OF ANY KIND, INCLUDING WITHOUT * LIMITATION, ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL BROADCOM * BE LIABLE TO THE END USER OR ANY THIRD PARTY FOR ANY LOSS OR * DAMAGE, DIRECT OR INDIRECT, FROM THE USE OF THIS SOFTWARE, * INCLUDING WITHOUT LIMITATION, LOST PROFITS, BUSINESS * INTERRUPTION, GOODWILL, OR LOST DATA, EVEN IF BROADCOM IS * EXPRESSLY ADVISED OF SUCH LOSS OR DAMAGE. */ const util_1 = require("util"); const erroSeg = "The length is more than 8 characters"; class PMAProfileValidationPlan /*implements IProfileValidationPlan*/ { static getformatdate() { // Getting system today's date with proper format and then replace with Variable for job submission. const tod = new Date(); let dd = String(tod.getDate()).substring(0, 2); if (dd.length === 1) { dd = "0" + dd; } let mm = String(tod.getMonth() + 1).substring(0, 2); if (mm.length === 1) { mm = "0" + mm; } const yyyy = tod.getFullYear(); const todaystring = yyyy + "-" + mm + "-" + dd; return todaystring; } static checkJobAcct(jobAcct) { const ALLOWED_NUMBER = /^[0-9]+$/; let errors; const jobAcct1 = jobAcct.toString(); if (!jobAcct1.match(ALLOWED_NUMBER)) { errors = `job_acct value provided - "${jobAcct}" - is not valid. Valid values are any numbers from 0 to 9 `; } return errors; } static checkJobClass(jobClass) { const ALLOWED_NUMBER = /^[0-9a-zA-Z]+$/; let errors; if (!String(jobClass).match(ALLOWED_NUMBER) || (jobClass.length > 1)) { errors = `job_class value provided - "${jobClass}" - is not valid. Valid values are any characters from A to Z and any numbers from 0 to 9 `; } return errors; } static checkJobMClass(jobMClass) { const ALLOWED_NUMBER = /^[0-9a-zA-Z]+$/; let errors; if (!String(jobMClass).match(ALLOWED_NUMBER) || (jobMClass.length > 1)) { errors = `MSGCLASS value provided - "${jobMClass}" - is not valid. Valid values are any characters from A to Z and any numbers from 0 to 9 `; } return errors; } static toUpperclass(jobKClass) { const ALLOWED_CHAR = /[a-z]/; if (String(jobKClass).match(ALLOWED_CHAR)) { jobKClass = jobKClass.toLocaleUpperCase(); } return jobKClass; } /* checkDsName function is for checking dataset name validity */ static checkDsName(dsName) { const MAX_SEGMENTS_COUNT = 22; const MIN_SEGMENTS_COUNT = 1; let errors; if (dsName === " " || (0, util_1.isNullOrUndefined)(dsName)) { errors = dsName + " data set name is empty"; } else { dsName = dsName.toUpperCase(); errors = PMAProfileValidationPlan.checkDsNameErr(dsName, "max", errors); errors = PMAProfileValidationPlan.checkDsNameErr(dsName, "start", errors); errors = PMAProfileValidationPlan.checkDsNameErr(dsName, "end", errors); errors = PMAProfileValidationPlan.checkDsNameErr(dsName, "inc", errors); errors = PMAProfileValidationPlan.checkDsNameErr(dsName, "ninc", errors); const num = 30; const nameSegments = dsName.toUpperCase().split(".", num); switch (true) { case (nameSegments.length < MIN_SEGMENTS_COUNT): errors = dsName + " data set name doesn't contain any node "; break; case (nameSegments.length > MAX_SEGMENTS_COUNT): errors = dsName + " data set name contains too many nodes (more than 22) "; break; } for (const dsNameSegment of nameSegments) { const temp = PMAProfileValidationPlan.checkDsNameSegmentFromDataSet(dsName, dsNameSegment); if (!(0, util_1.isNullOrUndefined)(temp)) { errors = temp; } } } return errors; } static checkDsNameErr(dsName, cond, errors) { const MAX_DSNAME_LENGTH = 44; switch (true) { case (dsName.length > MAX_DSNAME_LENGTH && cond === "max"): errors = dsName + " data set name is too long "; break; case (dsName.startsWith(".") && cond === "start"): errors = dsName + " data set name starts with a \",\". "; break; case (dsName.endsWith(".") && cond === "end"): errors = dsName + " data set name ends with a \",\". "; break; case (dsName.toLowerCase().includes("..") && cond === "inc"): errors = dsName + " data set contains \",\".. "; break; case (!dsName.toLowerCase().includes(".") && cond === "ninc"): errors = dsName + " data set is too short, it must contain at least 2 nodes/segments "; break; } return errors; } /* checkDsNameSegmentFromDataSet function is for checking each nodes from dataset name validity */ static checkDsNameSegmentFromDataSet(dsName, dsNameSegment) { let errorsSegment; const MAX_SEGMENT_LENGTH = 8; const MIN_SEGMENT_LENGTH = 1; const ALLOWED_CHARACTERS1 = /^[a-zA-Z]+$/; const ALLOWED_CHARACTERS2 = /^[0-9a-zA-Z#@$]/; let firstChar = null; if (dsNameSegment.length < MIN_SEGMENT_LENGTH) { errorsSegment = " contains a node that is too short, contains .., or starts with a . "; } if (dsNameSegment.length > MAX_SEGMENT_LENGTH) { errorsSegment = " the following node is too long: " + dsNameSegment; } switch (true) { // check node with first letter case (dsNameSegment.length === 1): firstChar = dsNameSegment.charAt(0); if ((!firstChar.match(new RegExp(ALLOWED_CHARACTERS1, "g"))) && firstChar !== "#" && firstChar !== "@" && firstChar !== "$") { errorsSegment = " the first character of data set " + dsName + " node is invalid " + dsNameSegment.charAt(0); } break; // check first letter should be A-Z or @#$ case (dsNameSegment.length > 1): firstChar = dsNameSegment.charAt(0); if (!(firstChar.match(new RegExp(ALLOWED_CHARACTERS1, "g"))) && firstChar !== "#" && firstChar !== "@" && firstChar !== "$") { errorsSegment = " the following node \"" + ",\"" + dsNameSegment + "\" " + ",\" starts with a prohibited character: " + dsNameSegment.charAt(0); } // check the rest of the name, should be A-Z, 0-9 or @#$- for (let i = 1; i < dsNameSegment.length; ++i) { const iChar = dsNameSegment.charAt(i); if ((!iChar.match(new RegExp(ALLOWED_CHARACTERS2, "g"))) && iChar !== "#" && iChar !== "@" && iChar !== "$") { errorsSegment = " the following node \"" + ",\"" + dsNameSegment + "\" " + ",\" contains a prohibited character: " + dsNameSegment.charAt(i); } } break; default: break; } return errorsSegment; } static checkjobname(dsNameSegment) { if (!(0, util_1.isNullOrUndefined)(dsNameSegment)) { let errorsSegment; const MAX_SEGMENT_LENGTH = 8; const ALLOWED_CHARACTERS1 = /^[a-zA-Z#@$]/; const ALLOWED_CHARACTERS2 = /^[0-9a-zA-Z#@$]/; if (dsNameSegment.length > MAX_SEGMENT_LENGTH) { errorsSegment = erroSeg; } // check node with first letter const firstChar = dsNameSegment.toString().substring(0, 1); if (!firstChar.match(new RegExp(ALLOWED_CHARACTERS1, "g"))) { errorsSegment = ` the first character of jobname is "${firstChar}". The first character in the name must be an alphabetic character (the letters A through Z) or a special character (the symbols #, @, and $).`; } // check the rest of the name, should be A-Z, 0-9 or @#$- if ((0, util_1.isNullOrUndefined)(errorsSegment)) { for (let i = 1; i <= dsNameSegment.length; ++i) { const iChar = dsNameSegment.toString().substring(i - 1, i); if (!iChar.match(new RegExp(ALLOWED_CHARACTERS2, "g"))) { errorsSegment = ` contains a prohibited character: "${iChar}". The remaining characters can be alphanumeric (the letters A through Z and numbers 0 through 9) or special characters.`; } } } return errorsSegment; } } static checkpmajobname(dsNameSegment) { if (!(0, util_1.isNullOrUndefined)(dsNameSegment)) { let errorsSegment; const MAX_SEGMENT_LENGTH = 8; const ALLOWED_CHARACTERS1 = /^[a-zA-Z#@$_]/; const ALLOWED_CHARACTERS2 = /^[0-9a-zA-Z#@$_*]/; if (dsNameSegment.length > MAX_SEGMENT_LENGTH) { errorsSegment = erroSeg; } // check node with first letter const firstChar = dsNameSegment.toString().substring(0, 1); if (!firstChar.match(new RegExp(ALLOWED_CHARACTERS1, "g"))) { errorsSegment = ` the first character is "${firstChar}". The first character in the name must be an alphabetic character (the letters A through Z) or a special character (the symbols #, @, and $).`; } // check the rest of the name, should be A-Z, 0-9 or @#$- for (let i = 1; i <= dsNameSegment.length; ++i) { const iChar = dsNameSegment.toString().substring(i - 1, i); if (!iChar.match(new RegExp(ALLOWED_CHARACTERS2, "g")) && (0, util_1.isNullOrUndefined)(errorsSegment)) { errorsSegment = ` contains a prohibited character: "${iChar}". The remaining characters can be alphanumeric (the letters A through Z and numbers 0 through 9) or special characters.`; } if ((iChar === "*") && (i !== dsNameSegment.length) && (0, util_1.isNullOrUndefined)(errorsSegment)) { errorsSegment = ` character after * is prohibited`; } } return errorsSegment; } } static checkpmaproname(dsNameSegment) { let errorsSegment; const MAX_SEGMENT_LENGTH = 8; const ALLOWED_CHARACTERS1 = /^[0-9a-zA-Z#@$_]/; const ALLOWED_CHARACTERS2 = /^[0-9a-zA-Z#@$_*]/; if (dsNameSegment.length > MAX_SEGMENT_LENGTH) { errorsSegment = erroSeg; } // check node with first letter const firstChar = dsNameSegment.toString().substring(0, 1); if (!firstChar.match(new RegExp(ALLOWED_CHARACTERS1, "g"))) { errorsSegment = ` the first character is "${firstChar}". The first character in the name must be an alphabetic character (the letters A through Z) or a special character (the symbols #, @, and $).`; } // check the rest of the name, should be A-Z, 0-9 or @#$- if ((0, util_1.isNullOrUndefined)(errorsSegment)) { for (let i = 1; i <= dsNameSegment.length; ++i) { const iChar = dsNameSegment.toString().substring(i - 1, i); if (!iChar.match(new RegExp(ALLOWED_CHARACTERS2, "g"))) { errorsSegment = ` contains a prohibited character: "${iChar}". The remaining characters can be alphanumeric (the letters A through Z and numbers 0 through 9) or special characters.`; } if (iChar === "*") { if (i !== dsNameSegment.length) { errorsSegment = ` character after * is prohibited`; } } } } return errorsSegment; } } module.exports = PMAProfileValidationPlan; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUE1BUHJvZmlsZVZhbGlkYXRpb25QbGFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS9QTUFQcm9maWxlVmFsaWRhdGlvblBsYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCwrQkFBeUM7QUFDekMsTUFBTSxPQUFPLEdBQUcsc0NBQXNDLENBQUM7QUFDdkQsTUFBTSx3QkFBd0IsQ0FBQyxxQ0FBcUM7SUFDekQsTUFBTSxDQUFDLGFBQWE7UUFDdkIsb0dBQW9HO1FBQ3BHLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xCLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEQsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xCLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsTUFBTSxXQUFXLEdBQVcsSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUN2RCxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBQ00sTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFlO1FBQ3RDLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQztRQUNsQyxJQUFJLE1BQWMsQ0FBQztRQUNuQixNQUFNLFFBQVEsR0FBVyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLEdBQUcsOEJBQThCLE9BQU8sOERBQThELENBQUM7UUFDakgsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFDTSxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQWdCO1FBQ3hDLE1BQU0sY0FBYyxHQUFHLGdCQUFnQixDQUFDO1FBQ3hDLElBQUksTUFBYyxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ25FLE1BQU0sR0FBRywrQkFBK0IsUUFBUSw0RkFBNEYsQ0FBQztRQUNqSixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBaUI7UUFDMUMsTUFBTSxjQUFjLEdBQUcsZ0JBQWdCLENBQUM7UUFDeEMsSUFBSSxNQUFjLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckUsTUFBTSxHQUFHLDhCQUE4QixTQUFTLDRGQUE0RixDQUFDO1FBQ2pKLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRU0sTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFpQjtRQUN4QyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUM7UUFDN0IsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUN6QyxDQUFDO1lBQ0csU0FBUyxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzlDLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBQ0Q7TUFDRTtJQUNLLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBYztRQUNwQyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztRQUM5QixNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUM3QixJQUFJLE1BQWMsQ0FBQztRQUVuQixJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBQSx3QkFBaUIsRUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzlDLE1BQU0sR0FBRyxNQUFNLEdBQUcseUJBQXlCLENBQUM7UUFDaEQsQ0FBQzthQUNJLENBQUM7WUFDRixNQUFNLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzlCLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN4RSxNQUFNLEdBQUcsd0JBQXdCLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDMUUsTUFBTSxHQUFHLHdCQUF3QixDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN4RSxNQUFNLEdBQUcsd0JBQXdCLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDekUsTUFBTSxHQUFHLEdBQVcsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sWUFBWSxHQUFVLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBRWpFLFFBQVEsSUFBSSxFQUNaLENBQUM7Z0JBQ0csS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLENBQUM7b0JBQzNDLE1BQU0sR0FBRyxNQUFNLEdBQUcsMENBQTBDLENBQUM7b0JBQzdELE1BQU07Z0JBRVYsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLENBQUM7b0JBQzNDLE1BQU0sR0FBRyxNQUFNLEdBQUcsd0RBQXdELENBQUM7b0JBQzNFLE1BQU07WUFDZCxDQUFDO1lBRUQsS0FBSyxNQUFNLGFBQWEsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDdkMsTUFBTSxJQUFJLEdBQUcsd0JBQXdCLENBQUMsNkJBQTZCLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO2dCQUMzRixJQUFJLENBQUMsSUFBQSx3QkFBaUIsRUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUMzQixNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNsQixDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBQ00sTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFjLEVBQUUsSUFBWSxFQUFFLE1BQWM7UUFFckUsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDN0IsUUFBUSxJQUFJLEVBQ1osQ0FBQztZQUNHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLGlCQUFpQixJQUFJLElBQUksS0FBSyxLQUFLLENBQUM7Z0JBQ3RELE1BQU0sR0FBRyxNQUFNLEdBQUcsNkJBQTZCLENBQUM7Z0JBQ2hELE1BQU07WUFDVixLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEtBQUssT0FBTyxDQUFDO2dCQUM3QyxNQUFNLEdBQUcsTUFBTSxHQUFHLHNDQUFzQyxDQUFDO2dCQUN6RCxNQUFNO1lBQ1YsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxLQUFLLEtBQUssQ0FBQztnQkFDekMsTUFBTSxHQUFHLE1BQU0sR0FBRyxvQ0FBb0MsQ0FBQztnQkFDdkQsTUFBTTtZQUNWLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxLQUFLLENBQUM7Z0JBQ3hELE1BQU0sR0FBRyxNQUFNLEdBQUcsNkJBQTZCLENBQUM7Z0JBQ2hELE1BQU07WUFDVixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksS0FBSyxNQUFNLENBQUM7Z0JBQ3pELE1BQU0sR0FBRyxNQUFNLEdBQUcsb0VBQW9FLENBQUM7Z0JBQ3ZGLE1BQU07UUFDZCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVEO01BQ0U7SUFDSyxNQUFNLENBQUMsNkJBQTZCLENBQUMsTUFBYyxFQUFFLGFBQXFCO1FBRTdFLElBQUksYUFBcUIsQ0FBQztRQUMxQixNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUM3QixNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUM3QixNQUFNLG1CQUFtQixHQUFHLGFBQWEsQ0FBQztRQUMxQyxNQUFNLG1CQUFtQixHQUFHLGlCQUFpQixDQUFDO1FBQzlDLElBQUksU0FBUyxHQUFXLElBQUksQ0FBQztRQUU3QixJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QyxhQUFhLEdBQUcsdUVBQXVFLENBQUM7UUFDNUYsQ0FBQztRQUVELElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVDLGFBQWEsR0FBRyxtQ0FBbUM7a0JBQzdDLGFBQWEsQ0FBQztRQUN4QixDQUFDO1FBRUQsUUFBUSxJQUFJLEVBQ1osQ0FBQztZQUNHLCtCQUErQjtZQUMvQixLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7Z0JBQzdCLFNBQVMsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLEtBQUssR0FBRzt1QkFDMUUsU0FBUyxLQUFLLEdBQUcsSUFBSSxTQUFTLEtBQUssR0FBRyxFQUM3QyxDQUFDO29CQUNHLGFBQWEsR0FBRyxtQ0FBbUMsR0FBRyxNQUFNLEdBQUcsbUJBQW1CLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakgsQ0FBQztnQkFDRCxNQUFPO1lBRVgsMENBQTBDO1lBQzFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDM0IsU0FBUyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsS0FBSyxHQUFHO3VCQUMxRSxTQUFTLEtBQUssR0FBRyxJQUFJLFNBQVMsS0FBSyxHQUFHLEVBQzdDLENBQUM7b0JBQ0csYUFBYSxHQUFHLHdCQUF3QixHQUFHLEtBQUssR0FBRyxhQUFhLEdBQUcsS0FBSzswQkFDbEUsMENBQTBDOzBCQUMxQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxDQUFDO2dCQUNELHlEQUF5RDtnQkFDekQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQzdDLENBQUM7b0JBQ0csTUFBTSxLQUFLLEdBQVcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDOUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxLQUFLLEdBQUc7MkJBQ2xFLEtBQUssS0FBSyxHQUFHLElBQUksS0FBSyxLQUFLLEdBQUcsRUFDckMsQ0FBQzt3QkFDRyxhQUFhLEdBQUcsd0JBQXdCLEdBQUcsS0FBSyxHQUFHLGFBQWEsR0FBRyxLQUFLOzhCQUNsRSx1Q0FBdUM7OEJBQ3ZDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxNQUFPO1lBQ1g7Z0JBQ0ksTUFBTTtRQUNkLENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN6QixDQUFDO0lBRU0sTUFBTSxDQUFDLFlBQVksQ0FBQyxhQUFxQjtRQUM1QyxJQUFJLENBQUMsSUFBQSx3QkFBaUIsRUFBQyxhQUFhLENBQUMsRUFDckMsQ0FBQztZQUNHLElBQUksYUFBcUIsQ0FBQztZQUMxQixNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztZQUM3QixNQUFNLG1CQUFtQixHQUFHLGNBQWMsQ0FBQztZQUMzQyxNQUFNLG1CQUFtQixHQUFHLGlCQUFpQixDQUFDO1lBQzlDLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxrQkFBa0IsRUFBRSxDQUFDO2dCQUM1QyxhQUFhLEdBQUcsT0FBTyxDQUFDO1lBQzVCLENBQUM7WUFDRCwrQkFBK0I7WUFDL0IsTUFBTSxTQUFTLEdBQVcsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN6RCxhQUFhLEdBQUcsd0NBQXdDLFNBQVMsZ0pBQWdKLENBQUM7WUFDdE4sQ0FBQztZQUNELHlEQUF5RDtZQUN6RCxJQUFJLElBQUEsd0JBQWlCLEVBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDN0MsTUFBTSxLQUFLLEdBQVcsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNuRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ3JELGFBQWEsR0FBRyxzQ0FBc0MsS0FBSywwSEFBMEgsQ0FBQztvQkFDMUwsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQztZQUNELE9BQU8sYUFBYSxDQUFDO1FBQ3pCLENBQUM7SUFDTCxDQUFDO0lBQ00sTUFBTSxDQUFDLGVBQWUsQ0FBQyxhQUFxQjtRQUUvQyxJQUFJLENBQUMsSUFBQSx3QkFBaUIsRUFBQyxhQUFhLENBQUMsRUFDckMsQ0FBQztZQUNHLElBQUksYUFBcUIsQ0FBQztZQUMxQixNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztZQUM3QixNQUFNLG1CQUFtQixHQUFHLGVBQWUsQ0FBQztZQUM1QyxNQUFNLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO1lBQ2hELElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxrQkFBa0IsRUFBRSxDQUFDO2dCQUM1QyxhQUFhLEdBQUcsT0FBTyxDQUFDO1lBQzVCLENBQUM7WUFDRCwrQkFBK0I7WUFDL0IsTUFBTSxTQUFTLEdBQVcsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN6RCxhQUFhLEdBQUcsNkJBQTZCLFNBQVMsZ0pBQWdKLENBQUM7WUFDM00sQ0FBQztZQUNELHlEQUF5RDtZQUN6RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFDOUMsQ0FBQztnQkFDRyxNQUFNLEtBQUssR0FBVyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBQSx3QkFBaUIsRUFBQyxhQUFhLENBQUMsRUFDMUYsQ0FBQztvQkFDRyxhQUFhLEdBQUcsc0NBQXNDLEtBQUssMEhBQTBILENBQUM7Z0JBQzFMLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksSUFBQSx3QkFBaUIsRUFBQyxhQUFhLENBQUMsRUFDdkYsQ0FBQztvQkFDRyxhQUFhLEdBQUcsa0NBQWtDLENBQUM7Z0JBQ3ZELENBQUM7WUFDTCxDQUFDO1lBQ0QsT0FBTyxhQUFhLENBQUM7UUFDekIsQ0FBQztJQUNMLENBQUM7SUFDTSxNQUFNLENBQUMsZUFBZSxDQUFDLGFBQXFCO1FBRS9DLElBQUksYUFBcUIsQ0FBQztRQUMxQixNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUM3QixNQUFNLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDO1FBQy9DLE1BQU0sbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7UUFDaEQsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLGtCQUFrQixFQUFFLENBQUM7WUFDNUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztRQUM1QixDQUFDO1FBQ0QsK0JBQStCO1FBQy9CLE1BQU0sU0FBUyxHQUFXLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN6RCxhQUFhLEdBQUcsNkJBQTZCLFNBQVMsZ0pBQWdKLENBQUM7UUFDM00sQ0FBQztRQUNELHlEQUF5RDtRQUN6RCxJQUFJLElBQUEsd0JBQWlCLEVBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxNQUFNLEtBQUssR0FBVyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDckQsYUFBYSxHQUFHLHNDQUFzQyxLQUFLLDBIQUEwSCxDQUFDO2dCQUMxTCxDQUFDO2dCQUNELElBQUksS0FBSyxLQUFLLEdBQUcsRUFBRyxDQUFDO29CQUNqQixJQUFJLENBQUMsS0FBSyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7d0JBQzdCLGFBQWEsR0FBRyxrQ0FBa0MsQ0FBQztvQkFDdkQsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN6QixDQUFDO0NBRUo7QUFFRCxpQkFBUyx3QkFBd0IsQ0FBQyJ9