@flxbl-io/sfp
Version:
sfp is a CLI tool to help you manage your Salesforce projects in an artifact centric model
249 lines • 24.3 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
const SfpCommand_1 = __importDefault(require("../SfpCommand"));
const core_1 = require("@salesforce/core");
const SFPStatsSender_1 = __importDefault(require("../core/stats/SFPStatsSender"));
const ReleaseImpl_1 = __importDefault(require("../impl/release/ReleaseImpl"));
const ReleaseDefinitionLoader_1 = __importDefault(require("../impl/release/ReleaseDefinitionLoader"));
const ReleaseError_1 = __importDefault(require("../errors/ReleaseError"));
const path = require("path");
const sfp_logger_1 = __importStar(require("@flxbl-io/sfp-logger"));
const sfdxflags_1 = require("../flags/sfdxflags");
const core_2 = require("@oclif/core");
core_1.Messages.importMessagesDirectory(__dirname);
const messages = core_1.Messages.loadMessages('@flxbl-io/sfp', 'release');
class Release extends SfpCommand_1.default {
async execute() {
this.validateFlags();
let tags = {
targetOrg: this.flags.targetorg,
};
if (this.flags.tag != null) {
tags['tag'] = this.flags.tag;
}
let executionStartTime = Date.now();
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`command: ${(0, sfp_logger_1.COLOR_KEY_MESSAGE)(`release`)}`));
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Target Org: ${this.flags.targetorg}`));
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Release Definitions: ${this.flags.releasedefinition}`));
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Artifact Directory: ${path.resolve('artifacts')}`));
sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, core_1.LoggerLevel.INFO);
let releaseDefinitions = [];
for (const pathToReleaseDefintion of this.flags.releasedefinition) {
let releaseDefinition = await ReleaseDefinitionLoader_1.default.loadReleaseDefinition(pathToReleaseDefintion);
//Support Legacy by taking the existing single workItemFilter and pushing it to the new model
if (releaseDefinition.changelog?.workItemFilter) {
releaseDefinition.changelog.workItemFilters = new Array();
releaseDefinition.changelog.workItemFilters.push(releaseDefinition.changelog?.workItemFilter);
}
if (this.flags.isGenerateChangelog && !releaseDefinition.changelog)
throw new Error('changelog parameters must be specified in release definition to generate changelog');
if (releaseDefinition.promotePackagesBeforeDeploymentToOrg &&
this.flags.targetorg == releaseDefinition.promotePackagesBeforeDeploymentToOrg &&
!this.flags.devhubalias)
throw new Error('DevHub is mandatory when promote is used within release definition');
releaseDefinitions.push(releaseDefinition);
}
let releaseResult;
try {
let props = {
releaseDefinitions: releaseDefinitions,
targetOrg: this.flags.targetorg,
fetchArtifactScript: this.flags.scriptpath,
isNpm: this.flags.npm,
scope: this.flags.scope,
npmrcPath: this.flags.npmrcpath,
logsGroupSymbol: this.flags.logsgroupsymbol,
tags: tags,
isDryRun: this.flags.dryrun,
waitTime: this.flags.waittime,
keys: this.flags.keys,
isGenerateChangelog: this.flags.generatechangelog,
devhubUserName: this.flags.devhubalias,
branch: this.flags.branchname,
directory: this.flags.directory,
};
let releaseImpl = new ReleaseImpl_1.default(props, new sfp_logger_1.ConsoleLogger());
releaseResult = await releaseImpl.exec();
if (!this.flags.dryrun)
SFPStatsSender_1.default.logCount('release.succeeded', tags);
}
catch (err) {
if (err instanceof ReleaseError_1.default) {
releaseResult = err.data;
}
else
sfp_logger_1.default.log(err.message);
if (!this.flags.dryrun)
SFPStatsSender_1.default.logCount('release.failed', tags);
// Fail the task when an error occurs
process.exitCode = 1;
}
finally {
let totalElapsedTime = Date.now() - executionStartTime;
if (releaseResult) {
this.printReleaseSummary(releaseResult, totalElapsedTime);
this.sendMetrics(releaseResult, tags, totalElapsedTime);
}
}
}
sendMetrics(releaseResult, tags, totalElapsedTime) {
if (!this.flags.dryrun) {
SFPStatsSender_1.default.logCount('release.scheduled', tags);
SFPStatsSender_1.default.logGauge('release.duration', totalElapsedTime, tags);
let packagesScheduled = 0;
let packagesSucceeded = 0;
let packagesFailed = 0;
for (const deploymentResults of releaseResult.succeededDeployments) {
packagesScheduled += deploymentResults.result.scheduled;
packagesSucceeded += deploymentResults.result.deployed.length;
}
for (const deploymentResults of releaseResult.failedDeployments) {
packagesScheduled += deploymentResults.result.scheduled;
packagesSucceeded += deploymentResults.result.deployed.length;
packagesFailed += deploymentResults.result.failed.length;
}
SFPStatsSender_1.default.logGauge('release.packages.scheduled', packagesScheduled, tags);
SFPStatsSender_1.default.logGauge('release.packages.succeeded', packagesSucceeded, tags);
SFPStatsSender_1.default.logGauge('release.packages.failed', packagesFailed, tags);
}
}
printReleaseSummary(releaseResult, totalElapsedTime) {
if (this.flags.logsgroupsymbol?.[0])
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(this.flags.logsgroupsymbol[0], 'Release Summary'));
sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, core_1.LoggerLevel.INFO);
if (releaseResult.installDependenciesResult) {
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`\nPackage Dependencies`));
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_SUCCESS)(` ${releaseResult.installDependenciesResult.success.length} succeeded`));
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_WARNING)(` ${releaseResult.installDependenciesResult.skipped.length} skipped`));
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_ERROR)(` ${releaseResult.installDependenciesResult.failed.length} failed`));
}
for (const succeededDeployment of releaseResult.succeededDeployments) {
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`\n Release Definition: ${succeededDeployment.releaseDefinition.release} for Release Config: ${succeededDeployment.releaseDefinition.releaseConfigName
? succeededDeployment.releaseDefinition.releaseConfigName
: 'N/A'}`));
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_SUCCESS)(` ${succeededDeployment.result.deployed.length} succeeded`));
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_ERROR)(` ${succeededDeployment.result.failed.length} failed`));
}
for (const failedDeployment of releaseResult.failedDeployments) {
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`\n Release Definition: ${failedDeployment.releaseDefinition.release} for for Release Config: ${failedDeployment.releaseDefinition.releaseConfigName
? failedDeployment.releaseDefinition.releaseConfigName
: 'N/A'}`));
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_SUCCESS)(` ${failedDeployment.result.deployed.length} succeeded`));
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_ERROR)(`\nPackages Failed to Deploy`, failedDeployment.result.failed.map((packageInfo) => packageInfo.sfpPackage.packageName)));
}
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_TIME)(`\nElapsed Time: ${new Date(totalElapsedTime).toISOString().substring(11, 19)}`));
sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, core_1.LoggerLevel.INFO);
}
validateFlags() {
if (this.flags.npm && !this.flags.scope)
throw new Error('--scope parameter is required for NPM');
}
}
_a = Release;
Release.description = messages.getMessage('commandDescription');
Release.aliases = ['orchestrator:release'];
Release.examples = [
`sfp release -p path/to/releasedefinition.yml -u myorg --npm --scope myscope --generatechangelog`,
];
Release.requiresUsername = false;
Release.requiresDevhubUsername = false;
Release.requiresProject = false;
Release.flags = {
releasedefinition: (0, sfdxflags_1.arrayFlagSfdxStyle)({
char: 'p',
description: messages.getMessage('releaseDefinitionFlagDescription'),
required: true,
}),
targetorg: sfdxflags_1.requiredUserNameFlag,
scriptpath: core_2.Flags.file({
char: 'f',
description: messages.getMessage('scriptPathFlagDescription'),
}),
npm: core_2.Flags.boolean({
description: messages.getMessage('npmFlagDescription'),
exclusive: ['scriptpath'],
}),
scope: core_2.Flags.string({
description: messages.getMessage('scopeFlagDescription'),
dependsOn: ['npm'],
parse: async (scope) => scope.replace(/@/g, '').toLowerCase(),
}),
npmrcpath: core_2.Flags.file({
description: messages.getMessage('npmrcPathFlagDescription'),
dependsOn: ['npm'],
required: false,
}),
logsgroupsymbol: sfdxflags_1.logsgroupsymbol,
tag: core_2.Flags.string({
char: 't',
description: messages.getMessage('tagFlagDescription'),
}),
dryrun: core_2.Flags.boolean({
description: messages.getMessage('dryRunFlagDescription'),
default: false,
hidden: true,
}),
waittime: core_2.Flags.integer({
description: messages.getMessage('waitTimeFlagDescription'),
default: 120,
}),
keys: core_2.Flags.string({
required: false,
description: messages.getMessage('keysFlagDescription'),
}),
generatechangelog: core_2.Flags.boolean({
default: false,
description: messages.getMessage('generateChangelogFlagDescription'),
}),
directory: core_2.Flags.string({
char: 'd',
description: messages.getMessage('directoryFlagDescription'),
}),
branchname: core_2.Flags.string({
dependsOn: ['generatechangelog'],
char: 'b',
description: messages.getMessage('branchNameFlagDescription'),
}),
allowunpromotedpackages: core_2.Flags.boolean({
description: messages.getMessage('allowUnpromotedPackagesFlagDescription'),
hidden: true,
deprecated: {
message: '--allowunpromotedpackages is deprecated, All packages are allowed',
},
}),
changelogByDomains: core_2.Flags.boolean({
description: messages.getMessage('changelogByDomainsFlagDescription'),
hidden: true,
}),
devhubalias: sfdxflags_1.optionalDevHubFlag,
loglevel: sfdxflags_1.loglevel,
};
exports.default = Release;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsZWFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9yZWxlYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0RBQXVDO0FBQ3ZDLDJDQUF5RDtBQUN6RCxrRkFBMEQ7QUFDMUQsOEVBQXVGO0FBQ3ZGLHNHQUE4RTtBQUM5RSwwRUFBa0Q7QUFDbEQsNkJBQThCO0FBQzlCLG1FQVE4QjtBQUU5QixrREFNNEI7QUFDNUIsc0NBQW9DO0FBRXBDLGVBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM1QyxNQUFNLFFBQVEsR0FBRyxlQUFRLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUVuRSxNQUFxQixPQUFRLFNBQVEsb0JBQVU7SUFtRnBDLEtBQUssQ0FBQyxPQUFPO1FBQ2hCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUVyQixJQUFJLElBQUksR0FBRztZQUNQLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVM7U0FDbEMsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQ2pDLENBQUM7UUFFRCxJQUFJLGtCQUFrQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVwQyxvQkFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFBLHlCQUFZLEVBQUMsWUFBWSxJQUFBLDhCQUFpQixFQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLG9CQUFTLENBQUMsR0FBRyxDQUFDLElBQUEseUJBQVksRUFBQyxlQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25FLG9CQUFTLENBQUMsR0FBRyxDQUFDLElBQUEseUJBQVksRUFBQyx3QkFBd0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRixvQkFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFBLHlCQUFZLEVBQUMsdUJBQXVCLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFaEYsb0JBQVMsQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLHlCQUFZLEVBQUUsa0JBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU5RCxJQUFJLGtCQUFrQixHQUF3QixFQUFFLENBQUM7UUFDakQsS0FBSyxNQUFNLHNCQUFzQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNoRSxJQUFJLGlCQUFpQixHQUFHLE1BQU0saUNBQXVCLENBQUMscUJBQXFCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUVwRyw2RkFBNkY7WUFDN0YsSUFBSSxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLENBQUM7Z0JBQzlDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztnQkFDbEUsaUJBQWlCLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ2xHLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTO2dCQUM5RCxNQUFNLElBQUksS0FBSyxDQUFDLG9GQUFvRixDQUFDLENBQUM7WUFFMUcsSUFDSSxpQkFBaUIsQ0FBQyxvQ0FBb0M7Z0JBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLGlCQUFpQixDQUFDLG9DQUFvQztnQkFDOUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVc7Z0JBRXZCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0VBQW9FLENBQUMsQ0FBQztZQUUxRixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsSUFBSSxhQUE0QixDQUFDO1FBQ2pDLElBQUksQ0FBQztZQUNELElBQUksS0FBSyxHQUFpQjtnQkFDdEIsa0JBQWtCLEVBQUUsa0JBQWtCO2dCQUN0QyxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTO2dCQUMvQixtQkFBbUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVU7Z0JBQzFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUc7Z0JBQ3JCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUs7Z0JBQ3ZCLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVM7Z0JBQy9CLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWU7Z0JBQzNDLElBQUksRUFBRSxJQUFJO2dCQUNWLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQzNCLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVE7Z0JBQzdCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7Z0JBQ3JCLG1CQUFtQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCO2dCQUNqRCxjQUFjLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXO2dCQUN0QyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO2dCQUM3QixTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTO2FBQ2xDLENBQUM7WUFFRixJQUFJLFdBQVcsR0FBZ0IsSUFBSSxxQkFBVyxDQUFDLEtBQUssRUFBRSxJQUFJLDBCQUFhLEVBQUUsQ0FBQyxDQUFDO1lBRTNFLGFBQWEsR0FBRyxNQUFNLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO2dCQUFFLHdCQUFjLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ1gsSUFBSSxHQUFHLFlBQVksc0JBQVksRUFBRSxDQUFDO2dCQUM5QixhQUFhLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztZQUM3QixDQUFDOztnQkFBTSxvQkFBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtnQkFBRSx3QkFBYyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUV4RSxxQ0FBcUM7WUFDckMsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDekIsQ0FBQztnQkFBUyxDQUFDO1lBQ1AsSUFBSSxnQkFBZ0IsR0FBVyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsa0JBQWtCLENBQUM7WUFFL0QsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUM1RCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFTyxXQUFXLENBQUMsYUFBNEIsRUFBRSxJQUFTLEVBQUUsZ0JBQXdCO1FBQ2pGLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3JCLHdCQUFjLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBRW5ELHdCQUFjLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBRXBFLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztZQUV2QixLQUFLLE1BQU0saUJBQWlCLElBQUksYUFBYSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQ2pFLGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ3hELGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ2xFLENBQUM7WUFFRCxLQUFLLE1BQU0saUJBQWlCLElBQUksYUFBYSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzlELGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ3hELGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUM5RCxjQUFjLElBQUksaUJBQWlCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDN0QsQ0FBQztZQUVELHdCQUFjLENBQUMsUUFBUSxDQUFDLDRCQUE0QixFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9FLHdCQUFjLENBQUMsUUFBUSxDQUFDLDRCQUE0QixFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9FLHdCQUFjLENBQUMsUUFBUSxDQUFDLHlCQUF5QixFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3RSxDQUFDO0lBQ0wsQ0FBQztJQUVPLG1CQUFtQixDQUFDLGFBQTRCLEVBQUUsZ0JBQXdCO1FBQzlFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0Isb0JBQVMsQ0FBQyxHQUFHLENBQUMsSUFBQSx5QkFBWSxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUVsRixvQkFBUyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUseUJBQVksRUFBRSxrQkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELElBQUksYUFBYSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDMUMsb0JBQVMsQ0FBQyxHQUFHLENBQUMsSUFBQSx5QkFBWSxFQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztZQUN0RCxvQkFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFBLDBCQUFhLEVBQUMsTUFBTSxhQUFhLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLE1BQU0sWUFBWSxDQUFDLENBQUMsQ0FBQztZQUN2RyxvQkFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFBLDBCQUFhLEVBQUMsTUFBTSxhQUFhLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNyRyxvQkFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFBLHdCQUFXLEVBQUMsTUFBTSxhQUFhLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLE1BQU0sU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNyRyxDQUFDO1FBRUQsS0FBSyxNQUFNLG1CQUFtQixJQUFJLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ25FLG9CQUFTLENBQUMsR0FBRyxDQUNULElBQUEseUJBQVksRUFDUiwwQkFBMEIsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsT0FBTyx3QkFDbkUsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCO2dCQUNuRCxDQUFDLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCO2dCQUN6RCxDQUFDLENBQUMsS0FDVixFQUFFLENBQ0wsQ0FDSixDQUFDO1lBQ0Ysb0JBQVMsQ0FBQyxHQUFHLENBQUMsSUFBQSwwQkFBYSxFQUFDLE1BQU0sbUJBQW1CLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDM0Ysb0JBQVMsQ0FBQyxHQUFHLENBQUMsSUFBQSx3QkFBVyxFQUFDLE1BQU0sbUJBQW1CLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUVELEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxhQUFhLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM3RCxvQkFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFBLHlCQUFZLEVBQUMsMEJBQTBCLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sNEJBQzNGLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLGlCQUFpQjtnQkFDaEQsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLGlCQUFpQjtnQkFDdEQsQ0FBQyxDQUFDLEtBQ1YsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNMLG9CQUFTLENBQUMsR0FBRyxDQUFDLElBQUEsMEJBQWEsRUFBQyxNQUFNLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3hGLG9CQUFTLENBQUMsR0FBRyxDQUNULElBQUEsd0JBQVcsRUFDUCw2QkFBNkIsRUFDN0IsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQzFGLENBQ0osQ0FBQztRQUNOLENBQUM7UUFFRCxvQkFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFBLHVCQUFVLEVBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxRyxvQkFBUyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUseUJBQVksRUFBRSxrQkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFUyxhQUFhO1FBQ25CLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUs7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7SUFDdEcsQ0FBQzs7O0FBbFBhLG1CQUFXLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxBQUE1QyxDQUE2QztBQUMvRCxlQUFPLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxBQUEzQixDQUEyQjtBQUUzQixnQkFBUSxHQUFHO0lBQ3JCLGlHQUFpRztDQUNwRyxBQUZxQixDQUVwQjtBQUVlLHdCQUFnQixHQUFHLEtBQUssQUFBUixDQUFTO0FBQ3pCLDhCQUFzQixHQUFHLEtBQUssQUFBUixDQUFTO0FBQy9CLHVCQUFlLEdBQUcsS0FBSyxBQUFSLENBQVM7QUFFM0IsYUFBSyxHQUFHO0lBQ2xCLGlCQUFpQixFQUFFLElBQUEsOEJBQWtCLEVBQUM7UUFDbEMsSUFBSSxFQUFFLEdBQUc7UUFDVCxXQUFXLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxrQ0FBa0MsQ0FBQztRQUNwRSxRQUFRLEVBQUUsSUFBSTtLQUNqQixDQUFDO0lBQ0YsU0FBUyxFQUFFLGdDQUFvQjtJQUMvQixVQUFVLEVBQUUsWUFBSyxDQUFDLElBQUksQ0FBQztRQUNuQixJQUFJLEVBQUUsR0FBRztRQUNULFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLDJCQUEyQixDQUFDO0tBQ2hFLENBQUM7SUFDRixHQUFHLEVBQUUsWUFBSyxDQUFDLE9BQU8sQ0FBQztRQUNmLFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDO1FBQ3RELFNBQVMsRUFBRSxDQUFDLFlBQVksQ0FBQztLQUM1QixDQUFDO0lBQ0YsS0FBSyxFQUFFLFlBQUssQ0FBQyxNQUFNLENBQUM7UUFDaEIsV0FBVyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUM7UUFDeEQsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQ2xCLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUU7S0FDaEUsQ0FBQztJQUNGLFNBQVMsRUFBRSxZQUFLLENBQUMsSUFBSSxDQUFDO1FBQ2xCLFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLDBCQUEwQixDQUFDO1FBQzVELFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQztRQUNsQixRQUFRLEVBQUUsS0FBSztLQUNsQixDQUFDO0lBQ0YsZUFBZSxFQUFmLDJCQUFlO0lBQ2YsR0FBRyxFQUFFLFlBQUssQ0FBQyxNQUFNLENBQUM7UUFDZCxJQUFJLEVBQUUsR0FBRztRQUNULFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDO0tBQ3pELENBQUM7SUFDRixNQUFNLEVBQUUsWUFBSyxDQUFDLE9BQU8sQ0FBQztRQUNsQixXQUFXLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQztRQUN6RCxPQUFPLEVBQUUsS0FBSztRQUNkLE1BQU0sRUFBRSxJQUFJO0tBQ2YsQ0FBQztJQUNGLFFBQVEsRUFBRSxZQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3BCLFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLHlCQUF5QixDQUFDO1FBQzNELE9BQU8sRUFBRSxHQUFHO0tBQ2YsQ0FBQztJQUNGLElBQUksRUFBRSxZQUFLLENBQUMsTUFBTSxDQUFDO1FBQ2YsUUFBUSxFQUFFLEtBQUs7UUFDZixXQUFXLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQztLQUMxRCxDQUFDO0lBQ0YsaUJBQWlCLEVBQUUsWUFBSyxDQUFDLE9BQU8sQ0FBQztRQUM3QixPQUFPLEVBQUUsS0FBSztRQUNkLFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLGtDQUFrQyxDQUFDO0tBQ3ZFLENBQUM7SUFDRixTQUFTLEVBQUUsWUFBSyxDQUFDLE1BQU0sQ0FBQztRQUNwQixJQUFJLEVBQUUsR0FBRztRQUNULFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLDBCQUEwQixDQUFDO0tBQy9ELENBQUM7SUFDRixVQUFVLEVBQUUsWUFBSyxDQUFDLE1BQU0sQ0FBQztRQUNyQixTQUFTLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztRQUNoQyxJQUFJLEVBQUUsR0FBRztRQUNULFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLDJCQUEyQixDQUFDO0tBQ2hFLENBQUM7SUFDRix1QkFBdUIsRUFBRSxZQUFLLENBQUMsT0FBTyxDQUFDO1FBQ25DLFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLHdDQUF3QyxDQUFDO1FBQzFFLE1BQU0sRUFBRSxJQUFJO1FBQ1osVUFBVSxFQUFFO1lBQ1IsT0FBTyxFQUFFLG1FQUFtRTtTQUMvRTtLQUNKLENBQUM7SUFDRixrQkFBa0IsRUFBRSxZQUFLLENBQUMsT0FBTyxDQUFDO1FBQzlCLFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLG1DQUFtQyxDQUFDO1FBQ3JFLE1BQU0sRUFBRSxJQUFJO0tBQ2YsQ0FBQztJQUNGLFdBQVcsRUFBRSw4QkFBa0I7SUFDL0IsUUFBUSxFQUFSLG9CQUFRO0NBQ1gsQUFyRWtCLENBcUVqQjtrQkFqRmUsT0FBTyJ9