UNPKG

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

Version:

MAT Detect plug-in for Zowe CLI

215 lines 21.7 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. */ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const imperative_1 = require("@zowe/imperative"); const cli_1 = require("@zowe/cli"); const util_1 = require("util"); const fs = require("fs"); const mustache = require("mustache"); const PMAProfileValidationPlan = require("../../PMAProfileValidationPlan"); const ErrorValidationPlan = require("../../ErrorValidationPlan"); /** * * "pma get-alert-by-job $jobname " Get today's performance status for the job. * @export * @class SubmitJobHandler * @implements {ICommandHandler} */ class SharedSubmitHandler { /** * Command handler process * @param {IHandlerParameters} params - Command handler parameters * @returns {Promise<void>} - Fulfilled when the command completes successfully OR rejected with imperative error * @memberof SubmitDataSetHandler */ process(params) { return __awaiter(this, void 0, void 0, function* () { // Save the needed parameters for convenience this.console = params.response.console; this.data = params.response.data; this.arguments = params.arguments; const parms = { jclSource: undefined, viewAllSpoolContent: this.arguments.viewAllSpoolContent, }; parms.viewAllSpoolContent = true; // setting default viewspool true let apiObj; // API Object to set in the command JSON response let spoolFilesResponse; // Response from view all spool content option // let source: any; // The actual JCL source (i.e. data-set name, file name, etc.) this.arguments = params.arguments; const pmajob = "job$$$"; let jobname1 = "jobname"; const jobname = this.arguments.jobname; let Fileavail; let Fileavail1; // Read parm from config/default.json file // const pmaProfile: IProfile = params.profiles.get("pma", false); const sysparm = { job_acct: params.arguments.job_acct, job_class: params.arguments.job_class, job_mclass: params.arguments.job_mclass, dsn_steplib: params.arguments.job_load, dsn_ksdsalt: params.arguments.job_pmahlq, }; // sysparm.job_class = ErrorValidationPlan.valarg(params.arguments.job_class, pmaProfile.job_class); // sysparm.job_mclass = ErrorValidationPlan.valarg(params.arguments.job_mclass, pmaProfile.job_mclass); // sysparm.job_acct = ErrorValidationPlan.valarg(params.arguments.job_acct, pmaProfile.job_acct); // sysparm.dsn_steplib = ErrorValidationPlan.valarg(params.arguments.job_load, pmaProfile.job_load); // sysparm.dsn_ksdsalt = ErrorValidationPlan.valarg(params.arguments.job_pmahlq, pmaProfile.job_pmahlq); if (!(0, util_1.isNullOrUndefined)(sysparm.dsn_ksdsalt)) { sysparm.dsn_ksdsalt = sysparm.dsn_ksdsalt + ".KSDSALT"; } // validating pma parameters provided const errorClass = PMAProfileValidationPlan.checkJobClass(sysparm.job_class); const errorMClass = PMAProfileValidationPlan.checkJobMClass(sysparm.job_mclass); const errorAcct = PMAProfileValidationPlan.checkJobAcct(sysparm.job_acct); const errorJob = PMAProfileValidationPlan.checkDsName(sysparm.dsn_ksdsalt); const errorLib = PMAProfileValidationPlan.checkDsName(sysparm.dsn_steplib); const errorJobn = PMAProfileValidationPlan.checkjobname(jobname); if ((0, util_1.isNullOrUndefined)(errorJob) && (0, util_1.isNullOrUndefined)(errorLib) && (0, util_1.isNullOrUndefined)(errorClass) && (0, util_1.isNullOrUndefined)(errorMClass) && (0, util_1.isNullOrUndefined)(errorAcct) && (0, util_1.isNullOrUndefined)(errorJobn)) { // this.profile = params.profiles.get("zosmf", true); sysparm.dsn_steplib = sysparm.dsn_steplib.toUpperCase(); sysparm.dsn_ksdsalt = sysparm.dsn_ksdsalt.toUpperCase(); sysparm.job_class = PMAProfileValidationPlan.toUpperclass(sysparm.job_class); sysparm.job_mclass = PMAProfileValidationPlan.toUpperclass(sysparm.job_mclass); // Create a z/OSMF session & submit the JCL // this.profile = params.profiles.get("zosmf", false); const sessCfg = cli_1.ZosmfSession.createSessCfgFromArgs(params.arguments); const sessCfgWithCreds = yield imperative_1.ConnectionPropsForSessCfg.addPropsOrPrompt(sessCfg, params.arguments, { parms: params }); const session = new cli_1.imperative.Session(sessCfgWithCreds); Fileavail = yield cli_1.List.dataSet(session, sysparm.dsn_steplib, { /* test */}); Fileavail1 = yield cli_1.List.dataSet(session, sysparm.dsn_ksdsalt, { /* test */}); // checking profile data is valid or not if ((Fileavail.apiResponse.items.length > 0) && (Fileavail1.apiResponse.items.length > 0)) { const path = require("path"); const k = -24; const cliLib = __dirname.slice(0, k); let cliJcl = path.join("zossrc", "jcl", "GetAlertByjob.jcl"); let cliBuild = cliLib; cliJcl = cliLib + cliJcl; // if the build folde not created if (!fs.existsSync(cliBuild + "/build")) { fs.mkdirSync(cliBuild + "/build"); } cliBuild = cliBuild + "/build/GetAlertByjob.jcl"; // Reading the jcl template and updating with default.json values const jcl = fs.readFileSync(cliJcl).toString(); const rndrracf = mustache.render(jcl, sysparm); fs.writeFileSync(cliBuild, rndrracf); let jobText = fs.readFileSync(cliBuild).toString(); // Getting system today's date with proper format and then replace with Variable for job submission. const today = "day$$$"; 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 = PMAProfileValidationPlan.getformatdate(); jobText = jobText.replace(today, todaystring); jobname1 = ErrorValidationPlan.valjobname(jobname, jobname1, "NO"); jobText = jobText.replace(pmajob, jobname1); // replacing the template pmajob with user input job // Execute the final jobText using the submitJclString method apiObj = yield cli_1.SubmitJobs.submitJclString(session, jobText, parms); // source = "jobname"; if (parms.viewAllSpoolContent === true) { spoolFilesResponse = apiObj; } let count = 0; // Print the response to the command if ((0, util_1.isNullOrUndefined)(spoolFilesResponse)) { params.response.format.output({ fields: ["jobid", "retcode", "jobname", "status"], output: apiObj, format: "object" }); // Set the API object to the correct this.data.setObj(apiObj); // Print data from spool content } else { let APCTAB_FOUND = "NO"; let JESMSGLG_CHECK = "NO"; for (const spoolFile of spoolFilesResponse) { if (spoolFile.ddName === "APCTAB") { APCTAB_FOUND = "YES"; spoolFile.data = spoolFile.data.replace("0JOBNAME |", " JOBNAME |"); const count1 = (spoolFile.data.match(new RegExp(jobname1, "g"))); if (!(0, util_1.isNullOrUndefined)(count1)) { count = count1.length; if (count === 1) { this.console.log(`No ALERTS generated today, "${todaystring}", for jobname ${jobname1}`); } else { this.console.log(spoolFile.data); } } else { APCTAB_FOUND = "NO"; } } else { if (spoolFile.ddName === "JESMSGLG") { JESMSGLG_CHECK = spoolFile.data.toString(); } } } ErrorValidationPlan.throwjeserrorALT(APCTAB_FOUND, JESMSGLG_CHECK, "PMAALT", jobname1); // Set the API object to the correct this.data.setObj(spoolFilesResponse); } params.response.progress.endBar(); this.data.setMessage(`Submitted JCL jobname "PMAPERF" `); } else { ErrorValidationPlan.throwfileerrorALT(Fileavail.apiResponse.items.length, "lib", sysparm.dsn_steplib); ErrorValidationPlan.throwfileerrorALT(Fileavail1.apiResponse.items.length, "KSDSALT", sysparm.dsn_ksdsalt); } } else { ErrorValidationPlan.throwparmerrorALT(errorJobn, "jobname", jobname); ErrorValidationPlan.throwparmerror(errorJob, "KSDSALT"); ErrorValidationPlan.throwparmerror(errorLib, "lib"); ErrorValidationPlan.throwparmerror(errorClass, "class"); ErrorValidationPlan.throwparmerror(errorMClass, "Mclass"); ErrorValidationPlan.throwparmerror(errorAcct, "Acct"); } }); } } exports.default = SharedSubmitHandler; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2V0YWxlcnRieWpvYi5oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NsaS9nZXQvZ2V0LWFsZXJ0LWJ5LWpvYi9HZXRhbGVydGJ5am9iLmhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7Ozs7Ozs7Ozs7O0FBRUgsaURBQTRHO0FBQzVHLG1DQUEwRjtBQUUxRiwrQkFBeUM7QUFDekMseUJBQXlCO0FBQ3pCLHFDQUFxQztBQUNyQywyRUFBNEU7QUFDNUUsaUVBQWtFO0FBRWxFOzs7OztHQUtHO0FBQ0gsTUFBcUIsbUJBQW1CO0lBMEJwQzs7Ozs7T0FLRztJQUNVLE9BQU8sQ0FBQyxNQUEwQjs7WUFDM0MsNkNBQTZDO1lBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDdkMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDbEMsTUFBTSxLQUFLLEdBQWlCO2dCQUN4QixTQUFTLEVBQUUsU0FBUztnQkFDcEIsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUI7YUFDMUQsQ0FBQztZQUNGLEtBQUssQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsQ0FBRSxpQ0FBaUM7WUFDcEUsSUFBSSxNQUFXLENBQUMsQ0FBSSxpREFBaUQ7WUFDckUsSUFBSSxrQkFBZ0MsQ0FBQyxDQUFDLDhDQUE4QztZQUNwRixxRkFBcUY7WUFDckYsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1lBQ2xDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQztZQUN4QixJQUFJLFFBQVEsR0FBVyxTQUFTLENBQUM7WUFDakMsTUFBTSxPQUFPLEdBQVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFFL0MsSUFBSSxTQUE0QixDQUFDO1lBQ2pDLElBQUksVUFBNkIsQ0FBQztZQUNsQywwQ0FBMEM7WUFDMUMsa0VBQWtFO1lBQ2xFLE1BQU0sT0FBTyxHQUFHO2dCQUNaLFFBQVEsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVE7Z0JBQ25DLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVM7Z0JBQ3JDLFVBQVUsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVU7Z0JBQ3ZDLFdBQVcsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVE7Z0JBQ3RDLFdBQVcsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVU7YUFDM0MsQ0FBQztZQUNGLG9HQUFvRztZQUNwRyx1R0FBdUc7WUFDdkcsaUdBQWlHO1lBQ2pHLG9HQUFvRztZQUNwRyx3R0FBd0c7WUFDeEcsSUFBSSxDQUFDLElBQUEsd0JBQWlCLEVBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFDLENBQUM7Z0JBQ3pDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7WUFDM0QsQ0FBQztZQUNELHFDQUFxQztZQUNyQyxNQUFNLFVBQVUsR0FBVyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JGLE1BQU0sV0FBVyxHQUFXLHdCQUF3QixDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDeEYsTUFBTSxTQUFTLEdBQVcsd0JBQXdCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRixNQUFNLFFBQVEsR0FBVyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ25GLE1BQU0sUUFBUSxHQUFXLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbkYsTUFBTSxTQUFTLEdBQVcsd0JBQXdCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pFLElBQUksSUFBQSx3QkFBaUIsRUFBQyxRQUFRLENBQUMsSUFBSSxJQUFBLHdCQUFpQixFQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUEsd0JBQWlCLEVBQUMsVUFBVSxDQUFDO21CQUM1RixJQUFBLHdCQUFpQixFQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUEsd0JBQWlCLEVBQUMsU0FBUyxDQUFDLElBQUksSUFBQSx3QkFBaUIsRUFBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUNoRyxxREFBcUQ7Z0JBQ3JELE9BQU8sQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDeEQsT0FBTyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN4RCxPQUFPLENBQUMsU0FBUyxHQUFHLHdCQUF3QixDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzdFLE9BQU8sQ0FBQyxVQUFVLEdBQUcsd0JBQXdCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDL0UsMkNBQTJDO2dCQUMzQyxzREFBc0Q7Z0JBQ3RELE1BQU0sT0FBTyxHQUFhLGtCQUFZLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMvRSxNQUFNLGdCQUFnQixHQUFHLE1BQU0sc0NBQXlCLENBQUMsZ0JBQWdCLENBQVcsT0FBTyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQ3BGLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUM7Z0JBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksZ0JBQVUsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDekQsU0FBUyxHQUFHLE1BQU0sVUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFDLFVBQVUsQ0FBRSxDQUFDLENBQUM7Z0JBQzVFLFVBQVUsR0FBRyxNQUFNLFVBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBQyxVQUFVLENBQUUsQ0FBQyxDQUFDO2dCQUM3RSx3Q0FBd0M7Z0JBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDeEYsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM3QixNQUFNLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQztvQkFDdEIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3JDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO29CQUM3RCxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUM7b0JBQ3RCLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO29CQUV6QixpQ0FBaUM7b0JBQ2pDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDO3dCQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUFDO29CQUFDLENBQUM7b0JBQy9FLFFBQVEsR0FBRyxRQUFRLEdBQUcsMEJBQTBCLENBQUM7b0JBRWpELGlFQUFpRTtvQkFDakUsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDL0MsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQy9DLEVBQUUsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUNyQyxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUVuRCxvR0FBb0c7b0JBQ3BHLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQztvQkFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQy9DLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQzt3QkFDbEIsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7b0JBQ2xCLENBQUM7b0JBQ0QsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNwRCxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQ2xCLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO29CQUNsQixDQUFDO29CQUNELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDL0IsTUFBTSxXQUFXLEdBQVcsd0JBQXdCLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ3JFLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztvQkFDOUMsUUFBUSxHQUFHLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNuRSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxvREFBb0Q7b0JBRWpHLDZEQUE2RDtvQkFDN0QsTUFBTSxHQUFHLE1BQU0sZ0JBQVUsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDbkUsc0JBQXNCO29CQUN0QixJQUFJLEtBQUssQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDckMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDO29CQUNoQyxDQUFDO29CQUNELElBQUksS0FBSyxHQUFXLENBQUMsQ0FBQztvQkFDdEIsb0NBQW9DO29CQUNwQyxJQUFJLElBQUEsd0JBQWlCLEVBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO3dCQUN4QyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7NEJBQzFCLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQzs0QkFDakQsTUFBTSxFQUFFLE1BQU07NEJBQ2QsTUFBTSxFQUFFLFFBQVE7eUJBQ25CLENBQUMsQ0FBQzt3QkFDSCxvQ0FBb0M7d0JBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUV6QixnQ0FBZ0M7b0JBQ3BDLENBQUM7eUJBRUQsQ0FBQzt3QkFFRyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7d0JBQ3hCLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQzt3QkFDMUIsS0FBSyxNQUFNLFNBQVMsSUFBSSxrQkFBa0IsRUFDMUMsQ0FBQzs0QkFDRyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7Z0NBQ2hDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0NBQ3JCLFNBQVMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO2dDQUNwRSxNQUFNLE1BQU0sR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ2pFLElBQUksQ0FBQyxJQUFBLHdCQUFpQixFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0NBQzdCLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO29DQUN0QixJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQzt3Q0FDZCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsV0FBVyxrQkFBa0IsUUFBUSxFQUFFLENBQUMsQ0FBQztvQ0FDN0YsQ0FBQzt5Q0FDSSxDQUFDO3dDQUNGLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQ0FDckMsQ0FBQztnQ0FDTCxDQUFDO3FDQUNHLENBQUM7b0NBQ0QsWUFBWSxHQUFHLElBQUksQ0FBQztnQ0FDeEIsQ0FBQzs0QkFDTCxDQUFDO2lDQUNJLENBQUM7Z0NBQ0YsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO29DQUNsQyxjQUFjLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQ0FDL0MsQ0FBQzs0QkFDTCxDQUFDO3dCQUNMLENBQUM7d0JBQ0QsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7d0JBQ3ZGLG9DQUFvQzt3QkFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQkFDekMsQ0FBQztvQkFDRCxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsa0NBQWtDLENBQUMsQ0FBQztnQkFDN0QsQ0FBQztxQkFFRCxDQUFDO29CQUNHLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUN0RyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFFL0csQ0FBQztZQUNMLENBQUM7aUJBQ0ksQ0FBQztnQkFDRixtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNyRSxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUN4RCxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNwRCxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUN4RCxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUMxRCxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzFELENBQUM7UUFDTCxDQUFDO0tBQUE7Q0FDSjtBQXZNRCxzQ0F1TUMifQ==