From c5cf4d2730ef344665902b0d6bf82776176aa1f2 Mon Sep 17 00:00:00 2001 From: Behzad Rabiei <53224485+Behzad-rabiei@users.noreply.github.com> Date: Mon, 23 Oct 2023 19:57:02 +0330 Subject: [PATCH] [FIXBUG]: set redis attempts to 0 --- lib/config/index.js | 60 ++++ lib/config/logger.js | 22 ++ lib/database/connection.js | 24 ++ lib/database/index.js | 19 ++ lib/database/services/channel.service.js | 150 +++++++++ lib/database/services/guild.service.js | 75 +++++ lib/database/services/guildMember.service.js | 184 ++++++++++ lib/database/services/index.js | 16 + lib/database/services/rawInfo.service.js | 166 +++++++++ lib/database/services/role.service.js | 144 ++++++++ lib/events/channel/channelCreate.js | 33 ++ lib/events/channel/channelDelete.js | 38 +++ lib/events/channel/channelUpdate.js | 35 ++ lib/events/client/ready.js | 40 +++ lib/events/member/guildMemberAdd.js | 31 ++ lib/events/member/guildMemberRemove.js | 32 ++ lib/events/member/guildMemberUpdate.js | 31 ++ lib/events/role/roleCreate.js | 31 ++ lib/events/role/roleDelete.js | 32 ++ lib/events/role/roleUpdate.js | 31 ++ lib/events/user/userUpdate.js | 35 ++ lib/functions/cronJon.js | 51 +++ lib/functions/fetchChannels.js | 43 +++ lib/functions/fetchMembers.js | 44 +++ lib/functions/fetchMessages.js | 205 ++++++++++++ lib/functions/fetchRoles.js | 42 +++ lib/functions/guildExtraction.js | 43 +++ lib/functions/loadEvents.js | 51 +++ lib/functions/sendDirectMessage.js | 17 + lib/functions/thread.js | 22 ++ lib/index.js | 209 ++++++++++++ ...isgeneratedbyweebhook-to-rawinfo-schema.js | 33 ++ lib/migrations/utils/template.js | 20 ++ lib/migrations/utils/webhookLogic.js | 153 +++++++++ lib/tsconfig.tsbuildinfo | 1 + src/functions/fetchMessages.ts | 24 +- src/index.ts | 6 +- ...isgeneratedbyweebhook-to-rawinfo-schema.ts | 37 +- src/migrations/utils/template.ts | 11 +- src/migrations/utils/webhookLogic.ts | 316 +++++++++--------- 40 files changed, 2360 insertions(+), 197 deletions(-) create mode 100644 lib/config/index.js create mode 100644 lib/config/logger.js create mode 100644 lib/database/connection.js create mode 100644 lib/database/index.js create mode 100644 lib/database/services/channel.service.js create mode 100644 lib/database/services/guild.service.js create mode 100644 lib/database/services/guildMember.service.js create mode 100644 lib/database/services/index.js create mode 100644 lib/database/services/rawInfo.service.js create mode 100644 lib/database/services/role.service.js create mode 100644 lib/events/channel/channelCreate.js create mode 100644 lib/events/channel/channelDelete.js create mode 100644 lib/events/channel/channelUpdate.js create mode 100644 lib/events/client/ready.js create mode 100644 lib/events/member/guildMemberAdd.js create mode 100644 lib/events/member/guildMemberRemove.js create mode 100644 lib/events/member/guildMemberUpdate.js create mode 100644 lib/events/role/roleCreate.js create mode 100644 lib/events/role/roleDelete.js create mode 100644 lib/events/role/roleUpdate.js create mode 100644 lib/events/user/userUpdate.js create mode 100644 lib/functions/cronJon.js create mode 100644 lib/functions/fetchChannels.js create mode 100644 lib/functions/fetchMembers.js create mode 100644 lib/functions/fetchMessages.js create mode 100644 lib/functions/fetchRoles.js create mode 100644 lib/functions/guildExtraction.js create mode 100644 lib/functions/loadEvents.js create mode 100644 lib/functions/sendDirectMessage.js create mode 100644 lib/functions/thread.js create mode 100644 lib/index.js create mode 100644 lib/migrations/db/1695210587863-add-isgeneratedbyweebhook-to-rawinfo-schema.js create mode 100644 lib/migrations/utils/template.js create mode 100644 lib/migrations/utils/webhookLogic.js create mode 100644 lib/tsconfig.tsbuildinfo diff --git a/lib/config/index.js b/lib/config/index.js new file mode 100644 index 00000000..1c054abb --- /dev/null +++ b/lib/config/index.js @@ -0,0 +1,60 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const joi_1 = __importDefault(require("joi")); +const envVarsSchema = joi_1.default.object() + .keys({ + NODE_ENV: joi_1.default.string().valid('production', 'development', 'test').required(), + DB_HOST: joi_1.default.string().required().description('Mongo DB url'), + DB_PORT: joi_1.default.string().required().description('Mongo DB port'), + DB_USER: joi_1.default.string().required().description('Mongo DB username'), + DB_PASSWORD: joi_1.default.string().required().description('Mongo DB password'), + DB_NAME: joi_1.default.string().required().description('Mongo DB name'), + RABBIT_HOST: joi_1.default.string().required().description('RabbitMQ url'), + RABBIT_PORT: joi_1.default.string().required().description('RabbitMQ port'), + RABBIT_USER: joi_1.default.string().required().description('RabbitMQ username'), + RABBIT_PASSWORD: joi_1.default.string().required().description('RabbitMQ password'), + DISCROD_CLIENT_ID: joi_1.default.string().required().description('Discord clinet id'), + DISCORD_CLIENT_SECRET: joi_1.default.string().required().description('Discord clinet secret'), + DISCORD_BOT_TOKEN: joi_1.default.string().required().description('Discord bot token'), + SENTRY_DSN: joi_1.default.string().required().description('Sentry DSN'), + SENTRY_ENV: joi_1.default.string().valid('production', 'development', 'local', 'test').required(), + REDIS_HOST: joi_1.default.string().required().description('Reids host'), + REDIS_PORT: joi_1.default.string().required().description('Reids port'), + REDIS_PASSWORD: joi_1.default.string().required().description('Reids password').allow(''), + LOG_LEVEL: joi_1.default.string().required().description('Min allowed log level'), +}) + .unknown(); +const { value: envVars, error } = envVarsSchema.prefs({ errors: { label: 'key' } }).validate(process.env); +if (error) { + throw new Error(`Config validation error: ${error.message}`); +} +exports.default = { + env: envVars.NODE_ENV, + mongoose: { + serverURL: `mongodb://${envVars.DB_USER}:${envVars.DB_PASSWORD}@${envVars.DB_HOST}:${envVars.DB_PORT}/${envVars.DB_NAME}`, + dbURL: `mongodb://${envVars.DB_USER}:${envVars.DB_PASSWORD}@${envVars.DB_HOST}:${envVars.DB_PORT}`, + }, + redis: { + host: envVars.REDIS_HOST, + port: envVars.REDIS_PORT, + password: envVars.REDIS_PASSWORD, + }, + rabbitMQ: { + url: `amqp://${envVars.RABBIT_USER}:${envVars.RABBIT_PASSWORD}@${envVars.RABBIT_HOST}:${envVars.RABBIT_PORT}`, + }, + discord: { + clientId: envVars.DISCROD_CLIENT_ID, + clientSecret: envVars.DISCORD_CLIENT_SECRET, + botToken: envVars.DISCORD_BOT_TOKEN, + }, + sentry: { + dsn: envVars.SENTRY_DSN, + env: envVars.SENTRY_ENV, + }, + logger: { + level: envVars.LOG_LEVEL, + }, +}; diff --git a/lib/config/logger.js b/lib/config/logger.js new file mode 100644 index 00000000..e12c2cfb --- /dev/null +++ b/lib/config/logger.js @@ -0,0 +1,22 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const pino_1 = __importDefault(require("pino")); +const index_1 = __importDefault(require("./index")); +exports.default = (0, pino_1.default)({ + level: index_1.default.logger.level, + formatters: { + level: label => { + return { level: label.toUpperCase() }; + }, + }, + timestamp: () => `,"timestamp":"${new Date(Date.now()).toISOString()}"`, + bindings: (bindings) => { + return { + pid: bindings.pid, + host: bindings.hostname, + }; + }, +}); diff --git a/lib/database/connection.js b/lib/database/connection.js new file mode 100644 index 00000000..6ec46306 --- /dev/null +++ b/lib/database/connection.js @@ -0,0 +1,24 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.closeConnection = void 0; +const logger_1 = __importDefault(require("../config/logger")); +const logger = logger_1.default.child({ module: 'Connection' }); +/** + * Closes a given Mongoose connection. + * @param {Connection} connection - The Mongoose connection object to be closed. + * @returns {Promise} - A promise that resolves when the connection has been successfully closed. + * @throws {MongooseError} - If there is an error closing the connection, it is logged to the console and the error is thrown. + */ +async function closeConnection(connection) { + try { + await connection.close(); + logger.info({ database: connection.name }, 'The connection to database has been successfully closed'); + } + catch (error) { + logger.fatal({ database: connection.name, error }, 'Failed to close the connection to the database'); + } +} +exports.closeConnection = closeConnection; diff --git a/lib/database/index.js b/lib/database/index.js new file mode 100644 index 00000000..7a6e506f --- /dev/null +++ b/lib/database/index.js @@ -0,0 +1,19 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.connectDB = void 0; +const mongoose_1 = __importDefault(require("mongoose")); +const config_1 = __importDefault(require("../config")); +const logger_1 = __importDefault(require("../config/logger")); +async function connectDB() { + mongoose_1.default.set('strictQuery', false); + mongoose_1.default + .connect(config_1.default.mongoose.serverURL) + .then(() => { + logger_1.default.info({ url: config_1.default.mongoose.serverURL }, 'Connected to MongoDB!'); + }) + .catch(error => logger_1.default.error({ url: config_1.default.mongoose.serverURL, error }, 'Failed to connect to MongoDB!')); +} +exports.connectDB = connectDB; diff --git a/lib/database/services/channel.service.js b/lib/database/services/channel.service.js new file mode 100644 index 00000000..b0e54c59 --- /dev/null +++ b/lib/database/services/channel.service.js @@ -0,0 +1,150 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const logger_1 = __importDefault(require("../../config/logger")); +const logger = logger_1.default.child({ module: 'ChannelService' }); +/** + * Create a channel in the database. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {IChannel} channel - The channel object to be created. + * @returns {Promise} - A promise that resolves to the created channel object. + */ +async function createChannel(connection, channel) { + try { + return await connection.models.Channel.create(channel); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } + catch (error) { + if (error.code == 11000) { + logger.warn({ database: connection.name, channel_id: channel.channelId }, 'Failed to create duplicate channel'); + return null; + } + logger.error({ database: connection.name, channel_id: channel.channelId, error }, 'Failed to create channel'); + return null; + } +} +/** + * Create channels in the database. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {IChannel[]} channels - An array of channel objects to be created. + * @returns {Promise} - A promise that resolves to an array of the created channel objects. + */ +async function createChannels(connection, channels) { + try { + return await connection.models.Channel.insertMany(channels, { ordered: false }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } + catch (error) { + if (error.code == 11000) { + logger.warn({ database: connection.name }, 'Failed to create duplicate channels'); + return []; + } + logger.error({ database: connection.name, error }, 'Failed to create channels'); + return []; + } +} +/** + * Get a channel from the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match the desired channel entry. + * @returns {Promise} - A promise that resolves to the matching channel object or null if not found. + */ +async function getChannel(connection, filter) { + return await connection.models.Channel.findOne(filter); +} +/** + * Get channels from the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match the desired channel entries. + * @returns {Promise} - A promise that resolves to an array of the matching channel objects. + */ +async function getChannels(connection, filter) { + return await connection.models.Channel.find(filter); +} +/** + * Update a channel in the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match the desired channel entry. + * @param {IChannelUpdateBody} updateBody - An object containing the updated channel data. + * @returns {Promise} - A promise that resolves to the updated channel object or null if not found. + */ +async function updateChannel(connection, filter, updateBody) { + try { + const channel = await connection.models.Channel.findOne(filter); + if (!channel) { + return null; + } + Object.assign(channel, updateBody); + return await channel.save(); + } + catch (error) { + logger.error({ database: connection.name, filter, updateBody, error }, 'Failed to update channel'); + return null; + } +} +/** + * Update multiple channels in the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match multiple channel entries. + * @param {IChannelUpdateBody} updateBody - An object containing the updated channel data. + * @returns {Promise} - A promise that resolves to the number of updated channel entries. + */ +async function updateChannels(connection, filter, updateBody) { + try { + const updateResult = await connection.models.Channel.updateMany(filter, updateBody); + return updateResult.modifiedCount || 0; + } + catch (error) { + logger.error({ database: connection.name, filter, updateBody, error }, 'Failed to update channels'); + return 0; + } +} +/** + * Handle the logic for creating or updating channels in the database. + * @param {Connection} connection - Mongoose connection object for the specific guild database. + * @param {TextChannel | VoiceChannel | CategoryChannel} channel - The Discord.js Channel object containing the full channel details. + * @returns {Promise} - A promise that resolves when the create or update operation is complete. + * + */ +async function handelChannelChanges(connection, channel) { + const commonFields = getNeededDateFromChannel(channel); + try { + const channelDoc = await updateChannel(connection, { channelId: channel.id }, commonFields); + if (!channelDoc) { + await createChannel(connection, commonFields); + } + } + catch (error) { + logger.error({ guild_id: connection.name, channel_id: channel.id, error }, 'Failed to handle channel changes'); + } +} +/** + * Extracts necessary fields from a Discord.js GuildMember object to form an IGuildMember object. + * @param {TextChannel | VoiceChannel | CategoryChannel} channel - The Discord.js Channel object containing the full channel details. + * @returns {IChannel} - The extracted data in the form of an IChannel object. + */ +function getNeededDateFromChannel(channel) { + return { + channelId: channel.id, + name: channel.name, + parentId: channel.parentId, + permissionOverwrites: Array.from(channel.permissionOverwrites.cache.values()).map(overwrite => ({ + id: overwrite.id, + type: overwrite.type, + allow: overwrite.allow.bitfield.toString(), + deny: overwrite.deny.bitfield.toString(), + })), + }; +} +exports.default = { + createChannel, + createChannels, + updateChannel, + getChannel, + getChannels, + updateChannels, + handelChannelChanges, + getNeededDateFromChannel, +}; diff --git a/lib/database/services/guild.service.js b/lib/database/services/guild.service.js new file mode 100644 index 00000000..045b9959 --- /dev/null +++ b/lib/database/services/guild.service.js @@ -0,0 +1,75 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const db_1 = require("@togethercrew.dev/db"); +const logger_1 = __importDefault(require("../../config/logger")); +const logger = logger_1.default.child({ module: 'GuildService' }); +/** + * get guild by query + * @param {Object} filter + * @returns {Promise} + */ +async function getGuild(filter) { + return db_1.Guild.findOne(filter); +} +/** + * Retrieve and return multiple guild entries that match the provided filter. + * @param {object} filter - Filter criteria to match the desired guild entries. + * @returns {Promise} - A promise that resolves to an array of matching guild entries. + */ +async function getGuilds(filter) { + return await db_1.Guild.find(filter); +} +/** + * Update the guild entry that matches the provided filter with the provided data. + * @param {object} filter - Filter criteria to match the desired guild entry for update. + * @param {IGuildUpdateBody} updateBody - Updated information for the guild entry. + * @returns {Promise} - A promise that resolves to the updated guild entry, or null if not found. + */ +async function updateGuild(filter, updateBody) { + try { + const guild = await db_1.Guild.findOne(filter); + if (!guild) { + return null; + } + Object.assign(guild, updateBody); + return await guild.save(); + } + catch (error) { + logger.error({ database: 'RnDAO', filter, updateBody, error }, 'Failed to update guild'); + return null; + } +} +/** + * Update multiple guild entries that match the provided filter with the provided data. + * @param {object} filter - Filter criteria to match the desired guild entries for update. + * @param {IGuildUpdateBody} updateBody - Updated information for the guild entry. + * @returns {Promise} - A promise that resolves to the number of guild entries updated. + */ +async function updateManyGuilds(filter, updateBody) { + try { + const updateResult = await db_1.Guild.updateMany(filter, updateBody); + const modifiedCount = updateResult.modifiedCount; + return modifiedCount; + } + catch (error) { + logger.error({ database: 'RnDAO', filter, updateBody, error }, 'Failed to update guilds'); + return 0; + } +} +async function checkBotAccessToGuild(client, guildId) { + if (!client.guilds.cache.has(guildId)) { + await updateGuild({ guildId }, { isDisconnected: false }); + return false; + } + return true; +} +exports.default = { + getGuild, + getGuilds, + updateGuild, + updateManyGuilds, + checkBotAccessToGuild, +}; diff --git a/lib/database/services/guildMember.service.js b/lib/database/services/guildMember.service.js new file mode 100644 index 00000000..f69aa5e6 --- /dev/null +++ b/lib/database/services/guildMember.service.js @@ -0,0 +1,184 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const logger_1 = __importDefault(require("../../config/logger")); +const logger = logger_1.default.child({ module: 'GuildMemberService' }); +/** + * Create a guild member in the database. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {IGuildMember} guildMember - The guild member object to be created. + * @returns {Promise} - A promise that resolves to the created guild member object. + */ +async function createGuildMember(connection, guildMember) { + try { + return await connection.models.GuildMember.create(guildMember); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } + catch (error) { + if (error.code == 11000) { + logger.warn({ database: connection.name, guild_member_id: guildMember.discordId }, 'Failed to create duplicate guild member'); + return null; + } + logger.error({ database: connection.name, guild_member_id: guildMember.discordId, error }, 'Failed to create guild member'); + return null; + } +} +/** + * Create guild members in the database. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {IGuildMember[]} guildMembers - An array of guild member objects to be created. + * @returns {Promise} - A promise that resolves to an array of the created guild member objects. + */ +async function createGuildMembers(connection, guildMembers) { + try { + return await connection.models.GuildMember.insertMany(guildMembers, { ordered: false }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } + catch (error) { + if (error.code == 11000) { + logger.warn({ database: connection.name }, 'Failed to create duplicate guild members'); + return []; + } + logger.error({ database: connection.name, error }, 'Failed to create guild members'); + return []; + } +} +/** + * Get a guild member from the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match the desired guild member entry. + * @returns {Promise} - A promise that resolves to the matching guild member object or null if not found. + */ +async function getGuildMember(connection, filter) { + return await connection.models.GuildMember.findOne(filter); +} +/** + * Get guild members from the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match the desired guild member entries. + * @returns {Promise} - A promise that resolves to an array of the matching guild member objects. + */ +async function getGuildMembers(connection, filter) { + return await connection.models.GuildMember.find(filter); +} +/** + * Update a guild member in the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match the desired guild member entry. + * @param {IGuildMemberUpdateBody} updateBody - An object containing the updated guild member data. + * @returns {Promise} - A promise that resolves to the updated guild member object or null if not found. + */ +async function updateGuildMember(connection, filter, updateBody) { + try { + const guildMember = await connection.models.GuildMember.findOne(filter); + if (!guildMember) { + return null; + } + Object.assign(guildMember, updateBody); + return await guildMember.save(); + } + catch (error) { + logger.error({ database: connection.name, filter, updateBody, error }, 'Failed to update guild member'); + return null; + } +} +/** + * Update multiple guild members in the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match multiple guild member entries. + * @param {IGuildMemberUpdateBody} updateBody - An object containing the updated guild member data. + * @returns {Promise} - A promise that resolves to the number of updated guild member entries. + */ +async function updateGuildMembers(connection, filter, updateBody) { + try { + const updateResult = await connection.models.GuildMember.updateMany(filter, updateBody); + return updateResult.modifiedCount || 0; + } + catch (error) { + logger.error({ database: connection.name, filter, updateBody, error }, 'Failed to update guild members'); + return 0; + } +} +/** + * Delete a guild member from the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match the desired guild member entry for deletion. + * @returns {Promise} - A promise that resolves to true if the guild member was successfully deleted, or false otherwise. + */ +async function deleteGuildMember(connection, filter) { + try { + const deleteResult = await connection.models.GuildMember.deleteOne(filter); + return deleteResult.deletedCount === 1; + } + catch (error) { + logger.error({ database: connection.name, filter, error }, 'Failed to delete guild member'); + return false; + } +} +/** + * Delete multiple guild members from the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match multiple guild member entries for deletion. + * @returns {Promise} - A promise that resolves to the number of deleted guild member entries. + */ +async function deleteGuildMembers(connection, filter) { + try { + const deleteResult = await connection.models.GuildMember.deleteMany(filter); + return deleteResult.deletedCount; + } + catch (error) { + logger.error({ database: connection.name, filter, error }, 'Failed to delete guild members'); + return 0; + } +} +/** + * Handle the logic for creating or updating guild members in the database. + * @param {Connection} connection - Mongoose connection object for the specific guild database. + * @param {GuildMember} guildMember - The Discord.js GuildMember object containing the member details. + * @returns {Promise} - A promise that resolves when the create or update operation is complete. + * + */ +async function handelGuildMemberChanges(connection, guildMember) { + const commonFields = getNeededDateFromGuildMember(guildMember); + try { + const guildMemberDoc = await updateGuildMember(connection, { discordId: guildMember.user.id }, commonFields); + if (!guildMemberDoc) { + await createGuildMember(connection, Object.assign(Object.assign({}, commonFields), { isBot: guildMember.user.bot })); + } + } + catch (error) { + logger.error({ guild_id: connection.name, guild_member_id: guildMember.id, error }, 'Failed to handle guild member changes'); + } +} +/** + * Extracts necessary fields from a Discord.js GuildMember object to form an IGuildMember object. + * @param {GuildMember} guildMember - The Discord.js GuildMember object containing the full member details. + * @returns {IGuildMember} - An object that adheres to the IGuildMember interface, containing selected fields from the provided guild member. + */ +function getNeededDateFromGuildMember(guildMember) { + return { + discordId: guildMember.user.id, + username: guildMember.user.username, + avatar: guildMember.user.avatar, + joinedAt: guildMember.joinedAt, + roles: guildMember.roles.cache.map(role => role.id), + discriminator: guildMember.user.discriminator, + permissions: guildMember.permissions.bitfield.toString(), + nickname: guildMember.nickname, + globalName: guildMember.user.globalName, + }; +} +exports.default = { + createGuildMember, + createGuildMembers, + updateGuildMember, + getGuildMember, + getGuildMembers, + updateGuildMembers, + deleteGuildMember, + deleteGuildMembers, + handelGuildMemberChanges, + getNeededDateFromGuildMember, +}; diff --git a/lib/database/services/index.js b/lib/database/services/index.js new file mode 100644 index 00000000..01ca9abe --- /dev/null +++ b/lib/database/services/index.js @@ -0,0 +1,16 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.channelService = exports.roleService = exports.rawInfoService = exports.guildService = exports.guildMemberService = void 0; +const guildMember_service_1 = __importDefault(require("./guildMember.service")); +exports.guildMemberService = guildMember_service_1.default; +const rawInfo_service_1 = __importDefault(require("./rawInfo.service")); +exports.rawInfoService = rawInfo_service_1.default; +const guild_service_1 = __importDefault(require("./guild.service")); +exports.guildService = guild_service_1.default; +const role_service_1 = __importDefault(require("./role.service")); +exports.roleService = role_service_1.default; +const channel_service_1 = __importDefault(require("./channel.service")); +exports.channelService = channel_service_1.default; diff --git a/lib/database/services/rawInfo.service.js b/lib/database/services/rawInfo.service.js new file mode 100644 index 00000000..0875d3df --- /dev/null +++ b/lib/database/services/rawInfo.service.js @@ -0,0 +1,166 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const logger_1 = __importDefault(require("../../config/logger")); +const logger = logger_1.default.child({ module: 'rawInfoService' }); +/** + * Create a rawInfo entry in the database. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {IRawInfo} rawInfo - The rawInfo object to be created. + * @returns {Promise} - A promise that resolves to the created rawInfo object. + */ +async function createRawInfo(connection, rawInfo) { + try { + return await connection.models.RawInfo.create(rawInfo); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } + catch (error) { + if (error.code == 11000) { + logger.warn({ database: connection.name, channel_id: rawInfo.channelId, message_id: rawInfo.messageId }, 'Failed to create duplicate rawInfo'); + return null; + } + logger.error({ database: connection.name, channel_id: rawInfo.channelId, message_id: rawInfo.messageId }, 'Failed to create rawInfo'); + return null; + } +} +/** + * Create multiple rawInfo entries in the database. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {IRawInfo[]} rawInfos - An array of rawInfo objects to be created. + * @returns {Promise} - A promise that resolves to an array of the created rawInfo objects. + */ +async function createRawInfos(connection, rawInfos) { + try { + return await connection.models.RawInfo.insertMany(rawInfos, { ordered: false }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } + catch (error) { + if (error.code == 11000) { + logger.warn({ database: connection.name }, 'Failed to create duplicate rawInfos'); + return []; + } + logger.error({ database: connection.name, error }, 'Failed to create rawInfos'); + return []; + } +} +/** + * Get a rawInfo entry from the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match the desired rawInfo entry. + * @returns {Promise} - A promise that resolves to the matching rawInfo object or null if not found. + */ +async function getRawInfo(connection, filter) { + return await connection.models.RawInfo.findOne(filter); +} +/** + * Get rawInfo entries from the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match the desired rawInfo entries. + * @returns {Promise} - A promise that resolves to an array of the matching rawInfo objects. + */ +async function getRawInfos(connection, filter) { + return await connection.models.RawInfo.find(filter); +} +/** + * Update a rawInfo entry in the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match the desired rawInfo entry. + * @param {IRawInfo} updateBody - An object containing the updated rawInfo data. + * @returns {Promise} - A promise that resolves to the updated rawInfo object or null if not found. + */ +async function updateRawInfo(connection, filter, updateBody) { + try { + const rawInfo = await connection.models.RawInfo.findOne(filter); + if (!rawInfo) { + return null; + } + Object.assign(rawInfo, updateBody); + return await rawInfo.save(); + } + catch (error) { + logger.error({ database: connection.name, filter, updateBody, error }, 'Failed to update rawInfo'); + return null; + } +} +/** + * Update multiple rawInfo entries in the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match multiple rawInfo entries. + * @param {IRawInfo} updateBody - An object containing the updated rawInfo data. + * @returns {Promise} - A promise that resolves to the number of updated rawInfo entries. + */ +async function updateManyRawInfo(connection, filter, updateBody) { + try { + const updateResult = await connection.models.RawInfo.updateMany(filter, updateBody); + return updateResult.modifiedCount || 0; + } + catch (error) { + logger.error({ database: connection.name, filter, updateBody, error }, 'Failed to update rawInfos'); + return 0; + } +} +/** + * Delete a rawInfo entry from the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match the desired rawInfo entry for deletion. + * @returns {Promise} - A promise that resolves to true if the rawInfo entry was successfully deleted, or false otherwise. + */ +async function deleteRawInfo(connection, filter) { + try { + const deleteResult = await connection.models.RawInfo.deleteOne(filter); + return deleteResult.deletedCount === 1; + } + catch (error) { + logger.error({ database: connection.name, filter, error }, 'Failed to delete rawInfo'); + return false; + } +} +/** + * Delete multiple rawInfo entries from the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match multiple rawInfo entries for deletion. + * @returns {Promise} - A promise that resolves to the number of deleted rawInfo entries. + * @throws {Error} - If there is an error while deleting the rawInfo entries. + */ +async function deleteManyRawInfo(connection, filter) { + try { + const deleteResult = await connection.models.RawInfo.deleteMany(filter); + return deleteResult.deletedCount; + } + catch (error) { + logger.error({ database: connection.name, filter, error }, 'Failed to delete rawInfos'); + return 0; + } +} +/** + * Retrieves the oldest rawInfo object from the database. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match the desired rawInfo entry. + * @returns {Promise} - A promise that resolves to the oldest rawInfo object for the channel, or null if not found. + */ +async function getNewestRawInfo(connection, filter) { + return await connection.models.RawInfo.findOne(filter).sort({ createdDate: -1 }); +} +/** + * Retrieves the oldest rawInfo object from the database. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match the desired rawInfo entry. + * @returns {Promise} - A promise that resolves to the oldest rawInfo object for the channel, or null if not found. + */ +async function getOldestRawInfo(connection, filter) { + return await connection.models.RawInfo.findOne(filter).sort({ createdDate: 1 }); +} +exports.default = { + createRawInfo, + createRawInfos, + updateRawInfo, + updateManyRawInfo, + deleteRawInfo, + deleteManyRawInfo, + getRawInfo, + getRawInfos, + getNewestRawInfo, + getOldestRawInfo, +}; diff --git a/lib/database/services/role.service.js b/lib/database/services/role.service.js new file mode 100644 index 00000000..7b3af28a --- /dev/null +++ b/lib/database/services/role.service.js @@ -0,0 +1,144 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const logger_1 = __importDefault(require("../../config/logger")); +const logger = logger_1.default.child({ module: 'roleService' }); +/** + * Create a role in the database. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {IRole} role - The role object to be created. + * @returns {Promise} - A promise that resolves to the created role object. + */ +async function createRole(connection, role) { + try { + return await connection.models.Role.create(role); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } + catch (error) { + if (error.code == 11000) { + logger.warn({ database: connection.name, role_id: role.roleId }, 'Failed to create duplicate role'); + return null; + } + logger.error({ database: connection.name, role_id: role.roleId, error }, 'Failed to create role'); + return null; + } +} +/** + * Create roles in the database. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {IRole[]} roles - An array of role objects to be created. + * @returns {Promise} - A promise that resolves to an array of the created role objects. + */ +async function createRoles(connection, roles) { + try { + return await connection.models.Role.insertMany(roles, { ordered: false }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } + catch (error) { + if (error.code == 11000) { + logger.warn({ database: connection.name }, 'Failed to create duplicate roles'); + return []; + } + logger.error({ database: connection.name, error }, 'Failed to create roles'); + return []; + } +} +/** + * Get a role from the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match the desired role entry. + * @returns {Promise} - A promise that resolves to the matching role object or null if not found. + */ +async function getRole(connection, filter) { + return await connection.models.Role.findOne(filter); +} +/** + * Get roles from the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match the desired role entries. + * @returns {Promise} - A promise that resolves to an array of the matching role objects. + */ +async function getRoles(connection, filter) { + return await connection.models.Role.find(filter); +} +/** + * Update a role in the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match the desired role entry. + * @param {IRoleUpdateBody} updateBody - An object containing the updated role data. + * @returns {Promise} - A promise that resolves to the updated role object or null if not found. + */ +async function updateRole(connection, filter, updateBody) { + try { + const role = await connection.models.Role.findOne(filter); + if (!role) { + return null; + } + Object.assign(role, updateBody); + return await role.save(); + } + catch (error) { + logger.error({ database: connection.name, filter, updateBody, error }, 'Failed to update role'); + return null; + } +} +/** + * Update multiple roles in the database based on the filter criteria. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {object} filter - An object specifying the filter criteria to match multiple role entries. + * @param {IRoleUpdateBody} updateBody - An object containing the updated role data. + * @returns {Promise} - A promise that resolves to the number of updated role entries. + */ +async function updateRoles(connection, filter, updateBody) { + try { + const updateResult = await connection.models.Role.updateMany(filter, updateBody); + return updateResult.modifiedCount || 0; + } + catch (error) { + logger.error({ database: connection.name, filter, updateBody, error }, 'Failed to update roles'); + return 0; + } +} +/** + * Handle the logic for creating or updating roles in the database. + * @param {Connection} connection - Mongoose connection object for the specific guild database. + * @param {Role} role - The Discord.js Role object containing the role details. + * @returns {Promise} - A promise that resolves when the create or update operation is complete. + * + */ +async function handelRoleChanges(connection, role) { + const commonFields = getNeededDateFromRole(role); + try { + const roleDoc = await updateRole(connection, { roleId: role.id }, commonFields); + if (!roleDoc) { + await createRole(connection, commonFields); + } + } + catch (error) { + logger.error({ guild_id: connection.name, role_id: role.id, error }, 'Failed to handle role changes'); + } +} +/** + * Extracts necessary fields from a Discord.js Role object to form an IRole object. + * @param {Role} guildMember - The Discord.js Role object containing the full role details. + * @returns {IRole} - An object that adheres to the Role interface, containing selected fields from the provided role. + */ +function getNeededDateFromRole(role) { + return { + roleId: role.id, + name: role.name, + color: role.color, + }; +} +exports.default = { + createRole, + createRoles, + updateRole, + getRole, + getRoles, + updateRoles, + handelRoleChanges, + getNeededDateFromRole, +}; diff --git a/lib/events/channel/channelCreate.js b/lib/events/channel/channelCreate.js new file mode 100644 index 00000000..6859a323 --- /dev/null +++ b/lib/events/channel/channelCreate.js @@ -0,0 +1,33 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const services_1 = require("../../database/services"); +const db_1 = require("@togethercrew.dev/db"); +const config_1 = __importDefault(require("../../config")); +const connection_1 = require("../../database/connection"); +const logger_1 = __importDefault(require("../../config/logger")); +const logger = logger_1.default.child({ event: 'ChannelCreate' }); +exports.default = { + name: discord_js_1.Events.ChannelCreate, + once: false, + async execute(channel) { + if (channel instanceof discord_js_1.TextChannel || channel instanceof discord_js_1.VoiceChannel || channel instanceof discord_js_1.CategoryChannel) { + const logFields = { guild_id: channel.guild.id, channel_id: channel.id }; + logger.info(logFields, 'event is running'); + const connection = db_1.databaseService.connectionFactory(channel.guild.id, config_1.default.mongoose.dbURL); + try { + await services_1.channelService.handelChannelChanges(connection, channel); + } + catch (err) { + logger.error(Object.assign(Object.assign({}, logFields), { err }), 'Failed to handle channel changes'); + } + finally { + await (0, connection_1.closeConnection)(connection); + logger.info(logFields, 'event is done'); + } + } + }, +}; diff --git a/lib/events/channel/channelDelete.js b/lib/events/channel/channelDelete.js new file mode 100644 index 00000000..3aff4dc7 --- /dev/null +++ b/lib/events/channel/channelDelete.js @@ -0,0 +1,38 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const services_1 = require("../../database/services"); +const db_1 = require("@togethercrew.dev/db"); +const config_1 = __importDefault(require("../../config")); +const connection_1 = require("../../database/connection"); +const logger_1 = __importDefault(require("../../config/logger")); +const logger = logger_1.default.child({ event: 'ChannelDelete' }); +exports.default = { + name: discord_js_1.Events.ChannelDelete, + once: false, + async execute(channel) { + var _a; + if (channel instanceof discord_js_1.TextChannel || channel instanceof discord_js_1.VoiceChannel || channel instanceof discord_js_1.CategoryChannel) { + const logFields = { guild_id: channel.guild.id, channel_id: channel.id }; + logger.info(logFields, 'event is running'); + const connection = db_1.databaseService.connectionFactory(channel.guild.id, config_1.default.mongoose.dbURL); + try { + const channelDoc = await services_1.channelService.getChannel(connection, { channelId: channel.id }); + await (channelDoc === null || channelDoc === void 0 ? void 0 : channelDoc.softDelete()); + const guildDoc = await services_1.guildService.getGuild({ guildId: channel.guild.id }); + const updatedSelecetdChannels = (_a = guildDoc === null || guildDoc === void 0 ? void 0 : guildDoc.selectedChannels) === null || _a === void 0 ? void 0 : _a.filter(selectedChannel => selectedChannel.channelId !== channel.id); + await services_1.guildService.updateGuild({ guildId: channel.guild.id }, { selectedChannels: updatedSelecetdChannels }); + } + catch (err) { + logger.error(Object.assign(Object.assign({}, logFields), { err }), 'Failed to soft delete the channel'); + } + finally { + await (0, connection_1.closeConnection)(connection); + logger.info(logFields, 'event is done'); + } + } + }, +}; diff --git a/lib/events/channel/channelUpdate.js b/lib/events/channel/channelUpdate.js new file mode 100644 index 00000000..1f244730 --- /dev/null +++ b/lib/events/channel/channelUpdate.js @@ -0,0 +1,35 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const services_1 = require("../../database/services"); +const db_1 = require("@togethercrew.dev/db"); +const config_1 = __importDefault(require("../../config")); +const connection_1 = require("../../database/connection"); +const logger_1 = __importDefault(require("../../config/logger")); +const logger = logger_1.default.child({ event: 'ChannelUpdate' }); +exports.default = { + name: discord_js_1.Events.ChannelUpdate, + once: false, + async execute(oldChannel, newChannel) { + if (newChannel instanceof discord_js_1.TextChannel || + newChannel instanceof discord_js_1.VoiceChannel || + newChannel instanceof discord_js_1.CategoryChannel) { + const logFields = { guild_id: newChannel.guild.id, channel_id: newChannel.id }; + logger.info(logFields, 'event is running'); + const connection = db_1.databaseService.connectionFactory(newChannel.guild.id, config_1.default.mongoose.dbURL); + try { + await services_1.channelService.handelChannelChanges(connection, newChannel); + } + catch (err) { + logger.error(Object.assign(Object.assign({}, logFields), { err }), 'Failed to handle channel changes'); + } + finally { + await (0, connection_1.closeConnection)(connection); + logger.info(logFields, 'event is done'); + } + } + }, +}; diff --git a/lib/events/client/ready.js b/lib/events/client/ready.js new file mode 100644 index 00000000..d47a985b --- /dev/null +++ b/lib/events/client/ready.js @@ -0,0 +1,40 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const db_1 = require("@togethercrew.dev/db"); +const services_1 = require("../../database/services"); +const fetchMembers_1 = __importDefault(require("../../functions/fetchMembers")); +const fetchChannels_1 = __importDefault(require("../../functions/fetchChannels")); +const fetchRoles_1 = __importDefault(require("../../functions/fetchRoles")); +const connection_1 = require("../../database/connection"); +const logger_1 = __importDefault(require("../../config/logger")); +const config_1 = __importDefault(require("../../config")); +const logger = logger_1.default.child({ event: 'ClientReady' }); +exports.default = { + name: discord_js_1.Events.ClientReady, + once: true, + async execute(client) { + logger.info('event is running'); + const guilds = await services_1.guildService.getGuilds({ isDisconnected: false }); + for (let i = 0; i < guilds.length; i++) { + const connection = db_1.databaseService.connectionFactory(guilds[i].guildId, config_1.default.mongoose.dbURL); + try { + logger.info({ guild_id: guilds[i].guildId }, 'Fetching guild members, roles,and channels'); + await (0, fetchMembers_1.default)(connection, client, guilds[i].guildId); + await (0, fetchRoles_1.default)(connection, client, guilds[i].guildId); + await (0, fetchChannels_1.default)(connection, client, guilds[i].guildId); + logger.info({ guild_id: guilds[i].guildId }, 'Fetching guild members, roles, channels is done'); + } + catch (err) { + logger.error({ guild_id: guilds[i].guildId, err }, 'Fetching guild members, roles,and channels failed'); + } + finally { + await (0, connection_1.closeConnection)(connection); + } + } + logger.info('event is done'); + }, +}; diff --git a/lib/events/member/guildMemberAdd.js b/lib/events/member/guildMemberAdd.js new file mode 100644 index 00000000..484dfc8f --- /dev/null +++ b/lib/events/member/guildMemberAdd.js @@ -0,0 +1,31 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const services_1 = require("../../database/services"); +const db_1 = require("@togethercrew.dev/db"); +const config_1 = __importDefault(require("../../config")); +const connection_1 = require("../../database/connection"); +const logger_1 = __importDefault(require("../../config/logger")); +const logger = logger_1.default.child({ event: 'GuildMemberAdd' }); +exports.default = { + name: discord_js_1.Events.GuildMemberAdd, + once: false, + async execute(member) { + const logFields = { guild_id: member.guild.id, guild_member_id: member.user.id }; + logger.info(logFields, 'event is running'); + const connection = db_1.databaseService.connectionFactory(member.guild.id, config_1.default.mongoose.dbURL); + try { + await services_1.guildMemberService.handelGuildMemberChanges(connection, member); + } + catch (err) { + logger.error(Object.assign(Object.assign({}, logFields), { err }), 'Failed to handle guild member changes'); + } + finally { + await (0, connection_1.closeConnection)(connection); + logger.info(logFields, 'event is done'); + } + }, +}; diff --git a/lib/events/member/guildMemberRemove.js b/lib/events/member/guildMemberRemove.js new file mode 100644 index 00000000..67a94906 --- /dev/null +++ b/lib/events/member/guildMemberRemove.js @@ -0,0 +1,32 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const services_1 = require("../../database/services"); +const db_1 = require("@togethercrew.dev/db"); +const config_1 = __importDefault(require("../../config")); +const connection_1 = require("../../database/connection"); +const logger_1 = __importDefault(require("../../config/logger")); +const logger = logger_1.default.child({ event: 'GuildMemberRemove' }); +exports.default = { + name: discord_js_1.Events.GuildMemberRemove, + once: false, + async execute(member) { + const logFields = { guild_id: member.guild.id, guild_member_id: member.user.id }; + logger.info(logFields, 'event is running'); + const connection = db_1.databaseService.connectionFactory(member.guild.id, config_1.default.mongoose.dbURL); + try { + const guildMemberDoc = await services_1.guildMemberService.getGuildMember(connection, { discordId: member.user.id }); + await (guildMemberDoc === null || guildMemberDoc === void 0 ? void 0 : guildMemberDoc.softDelete()); + } + catch (err) { + logger.error(Object.assign(Object.assign({}, logFields), { err }), 'Failed to soft delete the guild member'); + } + finally { + await (0, connection_1.closeConnection)(connection); + logger.info(logFields, 'event is done'); + } + }, +}; diff --git a/lib/events/member/guildMemberUpdate.js b/lib/events/member/guildMemberUpdate.js new file mode 100644 index 00000000..cb5d72a5 --- /dev/null +++ b/lib/events/member/guildMemberUpdate.js @@ -0,0 +1,31 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const services_1 = require("../../database/services"); +const db_1 = require("@togethercrew.dev/db"); +const config_1 = __importDefault(require("../../config")); +const connection_1 = require("../../database/connection"); +const logger_1 = __importDefault(require("../../config/logger")); +const logger = logger_1.default.child({ event: 'GuildMemberUpdate' }); +exports.default = { + name: discord_js_1.Events.GuildMemberUpdate, + once: false, + async execute(oldMember, newMember) { + const logFields = { guild_id: newMember.guild.id, guild_member_id: newMember.user.id }; + logger.info(logFields, 'event is running'); + const connection = db_1.databaseService.connectionFactory(newMember.guild.id, config_1.default.mongoose.dbURL); + try { + await services_1.guildMemberService.handelGuildMemberChanges(connection, newMember); + } + catch (err) { + logger.error(Object.assign(Object.assign({}, logFields), { err }), 'Failed to handle guild member changes'); + } + finally { + await (0, connection_1.closeConnection)(connection); + logger.info(logFields, 'event is done'); + } + }, +}; diff --git a/lib/events/role/roleCreate.js b/lib/events/role/roleCreate.js new file mode 100644 index 00000000..5b5cc023 --- /dev/null +++ b/lib/events/role/roleCreate.js @@ -0,0 +1,31 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const services_1 = require("../../database/services"); +const db_1 = require("@togethercrew.dev/db"); +const config_1 = __importDefault(require("../../config")); +const connection_1 = require("../../database/connection"); +const logger_1 = __importDefault(require("../../config/logger")); +const logger = logger_1.default.child({ event: 'GuildRoleCreate' }); +exports.default = { + name: discord_js_1.Events.GuildRoleCreate, + once: false, + async execute(role) { + const logFields = { guild_id: role.guild.id, role_id: role.id }; + logger.info(logFields, 'event is running'); + const connection = db_1.databaseService.connectionFactory(role.guild.id, config_1.default.mongoose.dbURL); + try { + await services_1.roleService.handelRoleChanges(connection, role); + } + catch (err) { + logger.error(Object.assign(Object.assign({}, logFields), { err }), 'Failed to handle role changes'); + } + finally { + await (0, connection_1.closeConnection)(connection); + logger.info(logFields, 'event is done'); + } + }, +}; diff --git a/lib/events/role/roleDelete.js b/lib/events/role/roleDelete.js new file mode 100644 index 00000000..b2c86c44 --- /dev/null +++ b/lib/events/role/roleDelete.js @@ -0,0 +1,32 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const services_1 = require("../../database/services"); +const db_1 = require("@togethercrew.dev/db"); +const config_1 = __importDefault(require("../../config")); +const connection_1 = require("../../database/connection"); +const logger_1 = __importDefault(require("../../config/logger")); +const logger = logger_1.default.child({ event: 'GuildRoleDelete' }); +exports.default = { + name: discord_js_1.Events.GuildRoleDelete, + once: false, + async execute(role) { + const logFields = { guild_id: role.guild.id, role_id: role.id }; + logger.info(logFields, 'event is running'); + const connection = db_1.databaseService.connectionFactory(role.guild.id, config_1.default.mongoose.dbURL); + try { + const roleDoc = await services_1.roleService.getRole(connection, { roleId: role.id }); + await (roleDoc === null || roleDoc === void 0 ? void 0 : roleDoc.softDelete()); + } + catch (err) { + logger.error(Object.assign(Object.assign({}, logFields), { err }), 'Failed to soft delete the role'); + } + finally { + await (0, connection_1.closeConnection)(connection); + logger.info(logFields, 'event is done'); + } + }, +}; diff --git a/lib/events/role/roleUpdate.js b/lib/events/role/roleUpdate.js new file mode 100644 index 00000000..6fdcdd0b --- /dev/null +++ b/lib/events/role/roleUpdate.js @@ -0,0 +1,31 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const services_1 = require("../../database/services"); +const db_1 = require("@togethercrew.dev/db"); +const config_1 = __importDefault(require("../../config")); +const connection_1 = require("../../database/connection"); +const logger_1 = __importDefault(require("../../config/logger")); +const logger = logger_1.default.child({ event: 'GuildRoleUpdate' }); +exports.default = { + name: discord_js_1.Events.GuildRoleUpdate, + once: false, + async execute(oldRole, newRole) { + const logFields = { guild_id: newRole.guild.id, role_id: newRole.id }; + logger.info(logFields, 'event is running'); + const connection = db_1.databaseService.connectionFactory(newRole.guild.id, config_1.default.mongoose.dbURL); + try { + await services_1.roleService.handelRoleChanges(connection, newRole); + } + catch (err) { + logger.error(Object.assign(Object.assign({}, logFields), { err }), 'Failed to handle role changes'); + } + finally { + await (0, connection_1.closeConnection)(connection); + logger.info(logFields, 'event is done'); + } + }, +}; diff --git a/lib/events/user/userUpdate.js b/lib/events/user/userUpdate.js new file mode 100644 index 00000000..ac66728c --- /dev/null +++ b/lib/events/user/userUpdate.js @@ -0,0 +1,35 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const services_1 = require("../../database/services"); +const db_1 = require("@togethercrew.dev/db"); +const config_1 = __importDefault(require("../../config")); +const connection_1 = require("../../database/connection"); +const logger_1 = __importDefault(require("../../config/logger")); +const logger = logger_1.default.child({ event: 'UserUpdate' }); +exports.default = { + name: discord_js_1.Events.UserUpdate, + once: false, + async execute(oldUser, newUser) { + const logFields = { user_id: newUser.id }; + logger.info(logFields, 'event is running'); + try { + const guilds = await services_1.guildService.getGuilds({}); + for (let i = 0; i < guilds.length; i++) { + const connection = db_1.databaseService.connectionFactory(guilds[i].guildId, config_1.default.mongoose.dbURL); + await services_1.guildMemberService.updateGuildMember(connection, { discordId: newUser.id }, { + username: newUser.username, + globalName: newUser.globalName, + }); + await (0, connection_1.closeConnection)(connection); + } + } + catch (err) { + logger.error(Object.assign(Object.assign({}, logFields), { err }), 'Failed to handle user changes'); + } + logger.info(logFields, 'event is done'); + }, +}; diff --git a/lib/functions/cronJon.js b/lib/functions/cronJon.js new file mode 100644 index 00000000..447d5c59 --- /dev/null +++ b/lib/functions/cronJon.js @@ -0,0 +1,51 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const services_1 = require("../database/services"); +const db_1 = require("@togethercrew.dev/db"); +const tc_messagebroker_1 = require("@togethercrew.dev/tc-messagebroker"); +const config_1 = __importDefault(require("../config")); +const guildExtraction_1 = __importDefault(require("./guildExtraction")); +const connection_1 = require("../database/connection"); +const logger_1 = __importDefault(require("../config/logger")); +const logger = logger_1.default.child({ event: 'CronJob' }); +async function createAndStartCronJobSaga(guildId) { + try { + const saga = await tc_messagebroker_1.MBConnection.models.Saga.create({ + status: tc_messagebroker_1.Status.NOT_STARTED, + data: { guildId }, + choreography: tc_messagebroker_1.ChoreographyDict.DISCORD_SCHEDULED_JOB, + }); + await saga.start(); + } + catch (err) { + logger.error({ guild_Id: guildId, err }, 'Faield to create saga'); + } +} +/** + * Runs the extraction process for multiple guilds. + * @param {Client} client - The discord.js client object used to fetch the guilds. + */ +async function cronJob(client) { + logger.info('event is running'); + const guilds = await services_1.guildService.getGuilds({ isDisconnected: false }); + for (let i = 0; i < guilds.length; i++) { + const connection = db_1.databaseService.connectionFactory(guilds[i].guildId, config_1.default.mongoose.dbURL); + try { + logger.info({ guild_id: guilds[i].guildId }, 'is running cronJob for guild'); + await (0, guildExtraction_1.default)(connection, client, guilds[i].guildId); + await createAndStartCronJobSaga(guilds[i].guildId); + logger.info({ guild_id: guilds[i].guildId }, 'cronJob is done for guild'); + } + catch (err) { + logger.error({ guild_id: guilds[i].guildId, err }, 'CronJob faield for guild'); + } + finally { + await (0, connection_1.closeConnection)(connection); + } + } + logger.info('event is done'); +} +exports.default = cronJob; diff --git a/lib/functions/fetchChannels.js b/lib/functions/fetchChannels.js new file mode 100644 index 00000000..123aa19f --- /dev/null +++ b/lib/functions/fetchChannels.js @@ -0,0 +1,43 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const services_1 = require("../database/services"); +const logger_1 = __importDefault(require("../config/logger")); +const logger = logger_1.default.child({ module: 'FetchChannels' }); +/** + * Iterates over a list of channels and pushes extracted data from each channel to an array. + * @param {IChannel[]} arr - The array to which extracted data will be pushed. + * @param {Array} channelArray - An array of channels from which data is to be extracted. + * @returns {IChannel[]} - The updated array containing the extracted data. + */ +function pushChannelsToArray(arr, channelArray) { + for (const channel of channelArray) { + arr.push(services_1.channelService.getNeededDateFromChannel(channel)); + } + return arr; +} +/** + * Fetches and saves text and voice channel information from a given guild. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {Client} client - The discord.js client object used to fetch the guild. + * @param {Snowflake} guildId - The identifier of the guild to extract text and voice channels from. + */ +async function fetchGuildChannels(connection, client, guildId) { + try { + if (!client.guilds.cache.has(guildId)) { + await services_1.guildService.updateGuild({ guildId }, { isDisconnected: false }); + return; + } + const guild = await client.guilds.fetch(guildId); + const channelsToStore = []; + const textAndVoiceChannels = [...guild.channels.cache.values()].filter(channel => channel.type === 0 || channel.type === 2 || channel.type === 4); + pushChannelsToArray(channelsToStore, textAndVoiceChannels); + await services_1.channelService.createChannels(connection, channelsToStore); // assuming a 'channelService' + } + catch (error) { + logger.error({ guildId, error }, 'Failed to fetch channels'); + } +} +exports.default = fetchGuildChannels; diff --git a/lib/functions/fetchMembers.js b/lib/functions/fetchMembers.js new file mode 100644 index 00000000..b988ff20 --- /dev/null +++ b/lib/functions/fetchMembers.js @@ -0,0 +1,44 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const services_1 = require("../database/services"); +const logger_1 = __importDefault(require("../config/logger")); +const logger = logger_1.default.child({ module: 'FetchMembers' }); +/** + * Iterates over a list of guild members and pushes extracted data from each guild member to an array. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {IRawInfo[]} arr - The array to which extracted data will be pushed. + * @param {GuildMember[]} guildMembersArray - An array of guild members from which data is to be extracted. + * @returns {Promise} - A promise that resolves to the updated array containing the extracted data. + */ +function pushMembersToArray(arr, guildMembersArray) { + for (const guildMember of guildMembersArray) { + arr.push(services_1.guildMemberService.getNeededDateFromGuildMember(guildMember)); + } + return arr; +} +/** + * Extracts information from a given guild. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {Client} client - The discord.js client object used to fetch the guild. + * @param {Snowflake} guildId - The identifier of the guild to extract information from. + */ +async function fetchGuildMembers(connection, client, guildId) { + try { + if (!client.guilds.cache.has(guildId)) { + await services_1.guildService.updateGuild({ guildId }, { isDisconnected: false }); + return; + } + const guild = await client.guilds.fetch(guildId); + const membersToStore = []; + const fetchMembers = await guild.members.fetch(); + pushMembersToArray(membersToStore, [...fetchMembers.values()]); + await services_1.guildMemberService.createGuildMembers(connection, membersToStore); + } + catch (error) { + logger.error({ guildId, error }, 'Failed to fetch guild members'); + } +} +exports.default = fetchGuildMembers; diff --git a/lib/functions/fetchMessages.js b/lib/functions/fetchMessages.js new file mode 100644 index 00000000..f0e2fa7d --- /dev/null +++ b/lib/functions/fetchMessages.js @@ -0,0 +1,205 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const services_1 = require("../database/services"); +const logger_1 = __importDefault(require("../config/logger")); +const logger = logger_1.default.child({ module: 'FetchMessages' }); +/** + * Fetches reaction details from a message. + * @param {Message} message - The message object from which reactions are to be fetched. + * @returns {Promise} - A promise that resolves to an array of strings where each string is a comma-separated list of user IDs who reacted followed by the reaction emoji. + */ +async function getReactions(message) { + try { + const reactions = message.reactions.cache; + const reactionsArray = [...reactions.values()]; + const reactionsArr = []; + for (const reaction of reactionsArray) { + const emoji = reaction.emoji; + const users = await reaction.users.fetch(); + let usersString = users.map(user => `${user.id}`).join(','); + usersString += `,${emoji.name}`; + reactionsArr.push(usersString); + } + return reactionsArr; + } + catch (err) { + logger.error({ message, err }, 'Faild to get reactions'); + return []; + } +} +/** + * Extracts necessary data from a given message. + * @param {Message} message - The message object from which data is to be extracted. + * @param {threadInfo} threadInfo - An optional thread info object containing details about the thread the message is part of. + * @returns {Promise} - A promise that resolves to an object of type IRawInfo containing the extracted data. + */ +async function getNeedDataFromMessage(message, threadInfo) { + var _a, _b; + if (threadInfo) { + return { + type: message.type, + author: message.author.id, + content: message.content, + createdDate: message.createdAt, + role_mentions: message.mentions.roles.map((role) => role.id), + user_mentions: message.mentions.users.map((user) => user.id), + replied_user: message.type === 19 ? (_a = message.mentions.repliedUser) === null || _a === void 0 ? void 0 : _a.id : null, + reactions: await getReactions(message), + messageId: message.id, + channelId: (threadInfo === null || threadInfo === void 0 ? void 0 : threadInfo.channelId) ? threadInfo === null || threadInfo === void 0 ? void 0 : threadInfo.channelId : '', + channelName: (threadInfo === null || threadInfo === void 0 ? void 0 : threadInfo.channelName) ? threadInfo === null || threadInfo === void 0 ? void 0 : threadInfo.channelName : '', + threadId: (threadInfo === null || threadInfo === void 0 ? void 0 : threadInfo.threadId) ? threadInfo === null || threadInfo === void 0 ? void 0 : threadInfo.threadId : null, + threadName: (threadInfo === null || threadInfo === void 0 ? void 0 : threadInfo.threadName) ? threadInfo === null || threadInfo === void 0 ? void 0 : threadInfo.threadName : null, + isGeneratedByWebhook: message.webhookId ? true : false, + }; + } + else { + return { + type: message.type, + author: message.author.id, + content: message.content, + createdDate: message.createdAt, + role_mentions: message.mentions.roles.map((role) => role.id), + user_mentions: message.mentions.users.map((user) => user.id), + replied_user: message.type === 19 ? (_b = message.mentions.repliedUser) === null || _b === void 0 ? void 0 : _b.id : null, + reactions: await getReactions(message), + messageId: message.id, + channelId: message.channelId, + channelName: message.channel instanceof discord_js_1.TextChannel ? message.channel.name : null, + threadId: null, + threadName: null, + isGeneratedByWebhook: message.webhookId ? true : false, + }; + } +} +/** + * Iterates over a list of messages and pushes extracted data from each message to an array. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {IRawInfo[]} arr - The array to which extracted data will be pushed. + * @param {Message[]} messagesArray - An array of messages from which data is to be extracted. + * @param {threadInfo} threadInfo - An optional thread info object containing details about the thread the messages are part of. + * @returns {Promise} - A promise that resolves to the updated array containing the extracted data. + */ +async function pushMessagesToArray(connection, arr, messagesArray, threadInfo) { + const allowedTypes = [0, 18, 19]; + for (const message of messagesArray) { + if (message.type === 21) { + // const res = await rawInfoService.updateRawInfo(connection, { messageId: message.id }, { threadId: threadInfo?.threadId, threadName: threadInfo?.threadName }); + } + if (allowedTypes.includes(message.type)) { + await arr.push(await getNeedDataFromMessage(message, threadInfo)); + } + } + return arr; +} +/** + * Fetches a list of messages from a specified channel and stores their extracted data. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {TextChannel | ThreadChannel} channel - The channel from which messages are to be fetched. + * @param {IRawInfo} rawInfo - An optional raw info object used for message fetching options. + * @param {Date} period - A date object specifying the oldest date for the messages to be fetched. + * @param {'before' | 'after'} fetchDirection - The direction of message fetching: 'before' fetches older messages and 'after' fetches newer messages. + * @throws Will throw an error if an issue is encountered during processing. + */ +async function fetchMessages(connection, channel, rawInfo = undefined, period, fetchDirection = 'before') { + var _a, _b, _c, _d; + try { + logger.info({ guild_id: connection.name, channel_id: channel.id, fetchDirection }, 'Fetching channel messages is running'); + const messagesToStore = []; + const options = { limit: 100 }; + if (rawInfo) { + options[fetchDirection] = rawInfo.messageId; + } + let fetchedMessages = await channel.messages.fetch(options); + while (fetchedMessages.size > 0) { + const boundaryMessage = fetchDirection === 'before' ? fetchedMessages.last() : fetchedMessages.first(); + if (!boundaryMessage || (period && boundaryMessage.createdAt < period)) { + if (period) { + fetchedMessages = fetchedMessages.filter(msg => msg.createdAt > period); + } + channel instanceof discord_js_1.ThreadChannel + ? await pushMessagesToArray(connection, messagesToStore, [...fetchedMessages.values()], { + threadId: channel.id, + threadName: channel.name, + channelId: (_a = channel.parent) === null || _a === void 0 ? void 0 : _a.id, + channelName: (_b = channel.parent) === null || _b === void 0 ? void 0 : _b.name, + }) + : await pushMessagesToArray(connection, messagesToStore, [...fetchedMessages.values()]); + break; + } + channel instanceof discord_js_1.ThreadChannel + ? await pushMessagesToArray(connection, messagesToStore, [...fetchedMessages.values()], { + threadId: channel.id, + threadName: channel.name, + channelId: (_c = channel.parent) === null || _c === void 0 ? void 0 : _c.id, + channelName: (_d = channel.parent) === null || _d === void 0 ? void 0 : _d.name, + }) + : await pushMessagesToArray(connection, messagesToStore, [...fetchedMessages.values()]); + options[fetchDirection] = boundaryMessage.id; + fetchedMessages = await channel.messages.fetch(options); + } + await services_1.rawInfoService.createRawInfos(connection, messagesToStore); + } + catch (err) { + logger.error({ guild_id: connection.name, channel_id: channel.id, fetchDirection, err }, 'Fetching channel messages failed'); + } + logger.info({ guild_id: connection.name, channel_id: channel.id, fetchDirection }, 'Fetching channel messages is done'); +} +/** + * Fetches messages from a specified channel and its threads and stores their extracted data. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {TextChannel} channel - The channel from which messages are to be fetched. + * @param {Date} period - A date object specifying the oldest date for the messages to be fetched. + * @throws Will throw an error if an issue is encountered during processing. + */ +async function handleFetchChannelMessages(connection, channel, period) { + logger.info({ guild_id: connection.name, channel_id: channel.id }, 'Handle channel messages for channel is running'); + try { + const oldestChannelRawInfo = await services_1.rawInfoService.getOldestRawInfo(connection, { + channelId: channel === null || channel === void 0 ? void 0 : channel.id, + threadId: null, + }); + const newestChannelRawInfo = await services_1.rawInfoService.getNewestRawInfo(connection, { + channelId: channel === null || channel === void 0 ? void 0 : channel.id, + threadId: null, + }); + if (oldestChannelRawInfo && oldestChannelRawInfo.createdDate > period) { + await fetchMessages(connection, channel, oldestChannelRawInfo, period, 'before'); + } + if (newestChannelRawInfo) { + await fetchMessages(connection, channel, newestChannelRawInfo, period, 'after'); + } + if (!newestChannelRawInfo && !oldestChannelRawInfo) { + await fetchMessages(connection, channel, undefined, period, 'before'); + } + const threads = channel.threads.cache.values(); + for (const thread of threads) { + const oldestThreadRawInfo = await services_1.rawInfoService.getOldestRawInfo(connection, { + channelId: channel === null || channel === void 0 ? void 0 : channel.id, + threadId: thread.id, + }); + const newestThreadRawInfo = await services_1.rawInfoService.getNewestRawInfo(connection, { + channelId: channel === null || channel === void 0 ? void 0 : channel.id, + threadId: thread.id, + }); + if (oldestThreadRawInfo && oldestThreadRawInfo.createdDate > period) { + await fetchMessages(connection, thread, oldestThreadRawInfo, period, 'before'); + } + if (newestThreadRawInfo) { + await fetchMessages(connection, thread, newestThreadRawInfo, period, 'after'); + } + if (!newestThreadRawInfo && !oldestThreadRawInfo) { + await fetchMessages(connection, thread, undefined, period, 'before'); + } + } + } + catch (err) { + logger.error({ guild_id: connection.name, channel_id: channel.id, err }, 'Handle fetch channel messages failed'); + } + logger.info({ guild_id: connection.name, channel_id: channel.id }, 'Handle fetch channel messages is done'); +} +exports.default = handleFetchChannelMessages; diff --git a/lib/functions/fetchRoles.js b/lib/functions/fetchRoles.js new file mode 100644 index 00000000..a259ee0c --- /dev/null +++ b/lib/functions/fetchRoles.js @@ -0,0 +1,42 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const services_1 = require("../database/services"); +const logger_1 = __importDefault(require("../config/logger")); +const logger = logger_1.default.child({ module: 'FetchRoles' }); +/** + * Iterates over a list of roles and pushes extracted data from each role to an array. + * @param {IRole[]} arr - The array to which extracted data will be pushed. + * @param {Role[]} roleArray - An array of roles from which data is to be extracted. + * @returns {IRole[]} - The updated array containing the extracted data. + */ +function pushRolesToArray(arr, roleArray) { + for (const role of roleArray) { + arr.push(services_1.roleService.getNeededDateFromRole(role)); + } + return arr; +} +/** + * Fetches and saves role information from a given guild. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {Client} client - The discord.js client object used to fetch the guild. + * @param {Snowflake} guildId - The identifier of the guild to extract roles from. + */ +async function fetchGuildRoles(connection, client, guildId) { + try { + if (!client.guilds.cache.has(guildId)) { + await services_1.guildService.updateGuild({ guildId }, { isDisconnected: false }); + return; + } + const guild = await client.guilds.fetch(guildId); + const rolesToStore = []; + pushRolesToArray(rolesToStore, [...guild.roles.cache.values()]); + await services_1.roleService.createRoles(connection, rolesToStore); // assuming a 'roleService' + } + catch (error) { + logger.error({ guildId, error }, 'Failed to fetch roles'); + } +} +exports.default = fetchGuildRoles; diff --git a/lib/functions/guildExtraction.js b/lib/functions/guildExtraction.js new file mode 100644 index 00000000..4f014cac --- /dev/null +++ b/lib/functions/guildExtraction.js @@ -0,0 +1,43 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const services_1 = require("../database/services"); +const fetchMessages_1 = __importDefault(require("./fetchMessages")); +const logger_1 = __importDefault(require("../config/logger")); +const logger = logger_1.default.child({ module: 'GuildExtraction' }); +/** + * Extracts information from a given guild. + * @param {Connection} connection - Mongoose connection object for the database. + * @param {Client} client - The discord.js client object used to fetch the guild. + * @param {Snowflake} guildId - The identifier of the guild to extract information from. + */ +async function guildExtraction(connection, client, guildId) { + logger.info({ guild_id: guildId }, 'Guild extraction for guild is running'); + try { + const hasBotAccessToGuild = await services_1.guildService.checkBotAccessToGuild(client, guildId); + if (!hasBotAccessToGuild) { + return; + } + const guild = await client.guilds.fetch(guildId); + const guildDoc = await services_1.guildService.getGuild({ guildId }); + if (guildDoc && guildDoc.selectedChannels && guildDoc.period) { + await services_1.guildService.updateGuild({ guildId }, { isInProgress: true }); + const selectedChannelsIds = guildDoc.selectedChannels.map(selectedChannel => selectedChannel.channelId); + for (const channelId of selectedChannelsIds) { + const channel = await guild.channels.fetch(channelId); + if (channel) { + if (channel.type !== 0) + continue; + await (0, fetchMessages_1.default)(connection, channel, guildDoc === null || guildDoc === void 0 ? void 0 : guildDoc.period); + } + } + } + } + catch (err) { + logger.error({ guild_id: guildId, err }, 'Guild extraction CronJob failed for guild'); + } + logger.info({ guild_id: guildId }, 'Guild extraction for guild is done'); +} +exports.default = guildExtraction; diff --git a/lib/functions/loadEvents.js b/lib/functions/loadEvents.js new file mode 100644 index 00000000..d55e5b72 --- /dev/null +++ b/lib/functions/loadEvents.js @@ -0,0 +1,51 @@ +"use strict"; +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 }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const path_1 = __importDefault(require("path")); +const promises_1 = require("node:fs/promises"); +async function loadEvents(client) { + const foldersPath = path_1.default.join(__dirname, '../events'); + const eventFolders = await (0, promises_1.readdir)(foldersPath); + for (const folder of eventFolders) { + const eventsPath = path_1.default.join(foldersPath, folder); + const eventFiles = (await (0, promises_1.readdir)(eventsPath)).filter(file => file.endsWith('.ts') || file.endsWith('.js')); + for (const file of eventFiles) { + const filePath = path_1.default.join(eventsPath, file); + const event = (await Promise.resolve(`${filePath}`).then(s => __importStar(require(s)))).default; + if (event.once) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + client.once(event.name, (...args) => event.execute(...args)); + } + else { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + client.on(event.name, (...args) => event.execute(...args)); + } + } + } +} +exports.default = loadEvents; diff --git a/lib/functions/sendDirectMessage.js b/lib/functions/sendDirectMessage.js new file mode 100644 index 00000000..326d4cf0 --- /dev/null +++ b/lib/functions/sendDirectMessage.js @@ -0,0 +1,17 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * + * @param client + * @param info + * @returns throw error if User has DMs closed or has no mutual servers with the bot + */ +async function sendDirectMessage(client, info) { + const { discordId, message } = info; + // Fetch the user object + const user = await client.users.fetch(discordId); + // Send a private message + const sendResponse = await user.send(message); + return sendResponse; +} +exports.default = sendDirectMessage; diff --git a/lib/functions/thread.js b/lib/functions/thread.js new file mode 100644 index 00000000..d6e36323 --- /dev/null +++ b/lib/functions/thread.js @@ -0,0 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createPrivateThreadAndSendMessage = void 0; +const discord_js_1 = require("discord.js"); +/** + * create a private thread on specific channel and send a message to it + * @param channel channel you want create a thread on it + * @param info + * @returns thread object + */ +async function createPrivateThreadAndSendMessage(channel, info) { + const { threadName, message, threadReason } = info; + const thread = await channel.threads.create({ + name: threadName, + reason: threadReason, + type: discord_js_1.ChannelType.PrivateThread, + invitable: false, + }); + await thread.send(message); + return thread; +} +exports.createPrivateThreadAndSendMessage = createPrivateThreadAndSendMessage; diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 00000000..3d52f5e6 --- /dev/null +++ b/lib/index.js @@ -0,0 +1,209 @@ +"use strict"; +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 }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const config_1 = __importDefault(require("./config")); +const Sentry = __importStar(require("@sentry/node")); +const loadEvents_1 = __importDefault(require("./functions/loadEvents")); +const cronJon_1 = __importDefault(require("./functions/cronJon")); +const bullmq_1 = require("bullmq"); +const tc_messagebroker_1 = __importStar(require("@togethercrew.dev/tc-messagebroker")); +// import './rabbitmqEvents' // we need this import statement here to initialize RabbitMQ events +const database_1 = require("./database"); +const db_1 = require("@togethercrew.dev/db"); +const guildExtraction_1 = __importDefault(require("./functions/guildExtraction")); +const sendDirectMessage_1 = __importDefault(require("./functions/sendDirectMessage")); +const thread_1 = require("./functions/thread"); +const fetchMembers_1 = __importDefault(require("./functions/fetchMembers")); +const fetchChannels_1 = __importDefault(require("./functions/fetchChannels")); +const fetchRoles_1 = __importDefault(require("./functions/fetchRoles")); +const connection_1 = require("./database/connection"); +const logger_1 = __importDefault(require("./config/logger")); +const logger = logger_1.default.child({ module: 'App' }); +Sentry.init({ + dsn: config_1.default.sentry.dsn, + environment: config_1.default.sentry.env, + tracesSampleRate: 1.0, +}); +const client = new discord_js_1.Client({ + intents: [ + discord_js_1.GatewayIntentBits.Guilds, + discord_js_1.GatewayIntentBits.GuildMembers, + discord_js_1.GatewayIntentBits.GuildMessages, + discord_js_1.GatewayIntentBits.GuildPresences, + discord_js_1.GatewayIntentBits.DirectMessages, + ], +}); +const partial = (func, ...args) => (...rest) => func(...args, ...rest); +const fetchMethod = async (msg) => { + logger.info({ msg }, 'fetchMethod is running'); + if (!msg) + return; + const { content } = msg; + const saga = await tc_messagebroker_1.MBConnection.models.Saga.findOne({ sagaId: content.uuid }); + logger.info({ saga: saga.data }, 'the saga info'); + const guildId = saga.data['guildId']; + const isGuildCreated = saga.data['created']; + const connection = await db_1.databaseService.connectionFactory(guildId, config_1.default.mongoose.dbURL); + if (isGuildCreated) { + await (0, fetchMembers_1.default)(connection, client, guildId); + await (0, fetchRoles_1.default)(connection, client, guildId); + await (0, fetchChannels_1.default)(connection, client, guildId); + } + else { + await (0, guildExtraction_1.default)(connection, client, guildId); + } + await (0, connection_1.closeConnection)(connection); + logger.info({ msg }, 'fetchMethod is done'); +}; +const notifyUserAboutAnalysisFinish = async (discordId, info) => { + // related issue https://github.com/RnDAO/tc-discordBot/issues/68 + const { guildId, message, useFallback } = info; + const guild = await client.guilds.fetch(guildId); + const channels = await guild.channels.fetch(); + const arrayChannels = Array.from(channels, ([name, value]) => (Object.assign({}, value))); + const textChannels = arrayChannels.filter(channel => channel.type == discord_js_1.ChannelType.GuildText); + const rawPositionBasedSortedTextChannels = textChannels.sort((textChannelA, textChannelB) => textChannelA.rawPosition > textChannelB.rawPosition ? 1 : -1); + const upperTextChannel = rawPositionBasedSortedTextChannels[0]; + try { + (0, sendDirectMessage_1.default)(client, { discordId, message }); + } + catch (error) { + // can not send DM to the user + // Will create a private thread and notify him/her about the status if useFallback is true + if (useFallback) + (0, thread_1.createPrivateThreadAndSendMessage)(upperTextChannel, { + threadName: 'TogetherCrew Status', + message: `<@${discordId}> ${message}`, + }); + } +}; +const fetchInitialData = async (guildId) => { + const connection = await db_1.databaseService.connectionFactory(guildId, config_1.default.mongoose.dbURL); + await (0, fetchRoles_1.default)(connection, client, guildId); + await (0, fetchChannels_1.default)(connection, client, guildId); + await (0, fetchMembers_1.default)(connection, client, guildId); + await (0, connection_1.closeConnection)(connection); +}; +// APP +async function app() { + await (0, loadEvents_1.default)(client); + await client.login(config_1.default.discord.botToken); + await (0, database_1.connectDB)(); + // *****************************RABBITMQ + try { + await tc_messagebroker_1.MBConnection.connect(config_1.default.mongoose.dbURL); + } + catch (error) { + logger.fatal({ url: config_1.default.mongoose.dbURL, error }, 'Failed to connect to MongoDB!'); + } + await tc_messagebroker_1.default.connect(config_1.default.rabbitMQ.url, tc_messagebroker_1.Queue.DISCORD_BOT) + .then(() => { + logger.info({ url: config_1.default.rabbitMQ.url, queue: tc_messagebroker_1.Queue.DISCORD_BOT }, 'Connected to RabbitMQ!'); + }) + .catch(error => logger.fatal({ url: config_1.default.rabbitMQ.url, queue: tc_messagebroker_1.Queue.DISCORD_BOT, error }, 'Failed to connect to RabbitMQ!')); + tc_messagebroker_1.default.onEvent(tc_messagebroker_1.Event.DISCORD_BOT.FETCH, async (msg) => { + logger.info({ msg, event: tc_messagebroker_1.Event.DISCORD_BOT.FETCH }, 'is running'); + if (!msg) + return; + const { content } = msg; + const saga = await tc_messagebroker_1.MBConnection.models.Saga.findOne({ sagaId: content.uuid }); + const fn = partial(fetchMethod, msg); + await saga.next(fn); + logger.info({ msg, event: tc_messagebroker_1.Event.DISCORD_BOT.FETCH }, 'is done'); + }); + tc_messagebroker_1.default.onEvent(tc_messagebroker_1.Event.DISCORD_BOT.SEND_MESSAGE, async (msg) => { + logger.info({ msg, event: tc_messagebroker_1.Event.DISCORD_BOT.SEND_MESSAGE }, 'is running'); + if (!msg) + return; + const { content } = msg; + const saga = await tc_messagebroker_1.MBConnection.models.Saga.findOne({ sagaId: content.uuid }); + const guildId = saga.data['guildId']; + const discordId = saga.data['discordId']; + const message = saga.data['message']; + const useFallback = saga.data['useFallback']; + const fn = notifyUserAboutAnalysisFinish.bind({}, discordId, { guildId, message, useFallback }); + await saga.next(fn); + logger.info({ msg, event: tc_messagebroker_1.Event.DISCORD_BOT.SEND_MESSAGE }, 'is done'); + }); + tc_messagebroker_1.default.onEvent(tc_messagebroker_1.Event.DISCORD_BOT.FETCH_MEMBERS, async (msg) => { + logger.info({ msg, event: tc_messagebroker_1.Event.DISCORD_BOT.FETCH_MEMBERS }, 'is running'); + if (!msg) + return; + const { content } = msg; + const saga = await tc_messagebroker_1.MBConnection.models.Saga.findOne({ sagaId: content.uuid }); + const guildId = saga.data['guildId']; + const fn = fetchInitialData.bind({}, guildId); + await saga.next(fn); + logger.info({ msg, event: tc_messagebroker_1.Event.DISCORD_BOT.FETCH_MEMBERS }, 'is done'); + }); + // *****************************BULLMQ + // Create a queue instance with the Redis connection + const queue = new bullmq_1.Queue('cronJobQueue', { + connection: { + host: config_1.default.redis.host, + port: config_1.default.redis.port, + password: config_1.default.redis.password, + }, + }); + queue.add('cronJob', {}, { + repeat: { + cron: '0 0 * * *', // Run once 00:00 UTC + // cron: '* * * * *', // Run every minute + // every: 10000 + }, + jobId: 'cronJob', + attempts: 0, + backoff: { + type: 'exponential', + delay: 1000, // Initial delay between retries in milliseconds + }, + }); + // Create a worker to process the job + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const worker = new bullmq_1.Worker('cronJobQueue', async (job) => { + if (job) { + // Call the extractMessagesDaily function + await (0, cronJon_1.default)(client); + } + }, { + connection: { + host: config_1.default.redis.host, + port: config_1.default.redis.port, + password: config_1.default.redis.password, + }, + }); + // Listen for completed and failed events to log the job status + worker.on('completed', job => { + logger.info({ job }, 'Job is done'); + }); + worker.on('failed', (job, error) => { + logger.error({ job, error }, 'Job failed'); + }); +} +app(); diff --git a/lib/migrations/db/1695210587863-add-isgeneratedbyweebhook-to-rawinfo-schema.js b/lib/migrations/db/1695210587863-add-isgeneratedbyweebhook-to-rawinfo-schema.js new file mode 100644 index 00000000..d1385ca9 --- /dev/null +++ b/lib/migrations/db/1695210587863-add-isgeneratedbyweebhook-to-rawinfo-schema.js @@ -0,0 +1,33 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.down = exports.up = void 0; +require("dotenv/config"); +const discord_js_1 = require("discord.js"); +const services_1 = require("../../database/services"); +const database_1 = require("../../database"); +const db_1 = require("@togethercrew.dev/db"); +const config_1 = __importDefault(require("../../config")); +const connection_1 = require("../../database/connection"); +const webhookLogic_1 = __importDefault(require("../utils/webhookLogic")); +const { Guilds, GuildMembers, GuildMessages, GuildPresences, DirectMessages } = discord_js_1.GatewayIntentBits; +const up = async () => { + const client = new discord_js_1.Client({ + intents: [Guilds, GuildMembers, GuildMessages, GuildPresences, DirectMessages], + }); + await client.login(config_1.default.discord.botToken); + await (0, database_1.connectDB)(); + const guilds = await services_1.guildService.getGuilds({}); + for (let i = 0; i < guilds.length; i++) { + const connection = db_1.databaseService.connectionFactory(guilds[i].guildId, config_1.default.mongoose.dbURL); + await (0, webhookLogic_1.default)(connection, client, guilds[i].guildId); + await (0, connection_1.closeConnection)(connection); + } +}; +exports.up = up; +const down = async () => { + // TODO: Implement rollback logic if needed +}; +exports.down = down; diff --git a/lib/migrations/utils/template.js b/lib/migrations/utils/template.js new file mode 100644 index 00000000..9ff0abc3 --- /dev/null +++ b/lib/migrations/utils/template.js @@ -0,0 +1,20 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.down = exports.up = void 0; +const database_1 = require("../../database"); +const db_1 = require("@togethercrew.dev/db"); +require("dotenv/config"); +const config_1 = __importDefault(require("../../config")); +const up = async () => { + await (0, database_1.connectDB)(); + const connection = db_1.databaseService.connectionFactory('681946187490000803', config_1.default.mongoose.dbURL); + await connection.createCollection('my_collection'); +}; +exports.up = up; +const down = async () => { + await (0, database_1.connectDB)(); +}; +exports.down = down; diff --git a/lib/migrations/utils/webhookLogic.js b/lib/migrations/utils/webhookLogic.js new file mode 100644 index 00000000..74a788cd --- /dev/null +++ b/lib/migrations/utils/webhookLogic.js @@ -0,0 +1,153 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const logger_1 = __importDefault(require("../../config/logger")); +const services_1 = require("../../database/services"); +const logger = logger_1.default.child({ module: 'Migration' }); +async function fetchMessagesBetweenOldestAndNewest(connection, channel, oldestRawInfo, newestRawInfo) { + var _a; + try { + let allMessages = []; + logger.info({ guild_id: connection.name, channel_id: channel.id }, 'Fetching channel messages is running'); + const options = { limit: 100 }; + options.after = oldestRawInfo.messageId; + let fetchedMessages = await channel.messages.fetch(options); + while (fetchedMessages.size > 0) { + allMessages = allMessages.concat(Array.from(fetchedMessages.values())); + if (fetchedMessages.has(newestRawInfo.messageId)) { + break; + } + options.after = (_a = fetchedMessages.first()) === null || _a === void 0 ? void 0 : _a.id; + fetchedMessages = await channel.messages.fetch(options); + } + return allMessages; + } + catch (err) { + logger.error({ guild_id: connection.name, channel_id: channel.id, err }, 'Fetching channel messages failed'); + } + logger.info({ guild_id: connection.name, channel_id: channel.id }, 'Fetching channel messages is done'); +} +async function migrateIsGeneratedByWebhook(connection, channel) { + try { + logger.info({ guild_id: connection.name, channel_id: channel.id }, 'Migration for isGeneratedByWebhook is running'); + // Fetch oldest rawInfo from DB + const oldestChannelRawInfo = await services_1.rawInfoService.getOldestRawInfo(connection, { + channelId: channel === null || channel === void 0 ? void 0 : channel.id, + threadId: null, + }); + // Fetch newest rawInfo from DB + const newestChannelRawInfo = await services_1.rawInfoService.getNewestRawInfo(connection, { + channelId: channel === null || channel === void 0 ? void 0 : channel.id, + threadId: null, + }); + if (!oldestChannelRawInfo || !newestChannelRawInfo) { + logger.info({ guild_id: connection.name, channel_id: channel.id }, 'No oldest rawInfo found, skipping migration'); + return; + } + const fetchedMessages = await fetchMessagesBetweenOldestAndNewest(connection, channel, oldestChannelRawInfo, newestChannelRawInfo); + const messagesToUpdateTrue = []; + const messagesToUpdateFalse = []; + const oldestMessage = await channel.messages.fetch(oldestChannelRawInfo.messageId); + const newestMessage = await channel.messages.fetch(newestChannelRawInfo.messageId); + if (oldestMessage.webhookId) + messagesToUpdateTrue.push(oldestMessage.id); + else + messagesToUpdateFalse.push(oldestMessage.id); + if (newestMessage.webhookId) + messagesToUpdateTrue.push(newestMessage.id); + else + messagesToUpdateFalse.push(newestMessage.id); + if (fetchedMessages) { + for (const message of fetchedMessages) { + if (message.webhookId) { + messagesToUpdateTrue.push(message.id); + } + else { + messagesToUpdateFalse.push(message.id); + } + } + } + if (messagesToUpdateTrue.length > 0) { + await services_1.rawInfoService.updateManyRawInfo(connection, { messageId: { $in: messagesToUpdateTrue } }, { isGeneratedByWebhook: true }); + } + if (messagesToUpdateFalse.length > 0) { + await services_1.rawInfoService.updateManyRawInfo(connection, { messageId: { $in: messagesToUpdateFalse } }, { isGeneratedByWebhook: false }); + } + const threads = channel.threads.cache.values(); + // Handle threads of the channel + for (const thread of threads) { + const oldestThreadRawInfo = await services_1.rawInfoService.getOldestRawInfo(connection, { + channelId: channel === null || channel === void 0 ? void 0 : channel.id, + threadId: thread.id, + }); + const newestThreadRawInfo = await services_1.rawInfoService.getNewestRawInfo(connection, { + channelId: channel === null || channel === void 0 ? void 0 : channel.id, + threadId: thread.id, + }); + if (!oldestThreadRawInfo || !newestThreadRawInfo) { + continue; // No data to migrate for this thread + } + const fetchedThreadMessages = await fetchMessagesBetweenOldestAndNewest(connection, thread, oldestThreadRawInfo, newestThreadRawInfo); + const threadMessagesToUpdateTrue = []; + const threadMessagesToUpdateFalse = []; + const oldestThreadMessage = await thread.messages.fetch(oldestThreadRawInfo.messageId); + const newestThreadMessage = await thread.messages.fetch(newestThreadRawInfo.messageId); + if (oldestThreadMessage.webhookId) + threadMessagesToUpdateTrue.push(oldestThreadMessage.id); + else + threadMessagesToUpdateFalse.push(oldestThreadMessage.id); + if (newestThreadMessage.webhookId) + threadMessagesToUpdateTrue.push(newestThreadMessage.id); + else + threadMessagesToUpdateFalse.push(newestThreadMessage.id); + if (fetchedThreadMessages) { + for (const message of fetchedThreadMessages) { + if (message.webhookId) { + threadMessagesToUpdateTrue.push(message.id); + } + else { + threadMessagesToUpdateFalse.push(message.id); + } + } + } + if (threadMessagesToUpdateTrue.length > 0) { + await services_1.rawInfoService.updateManyRawInfo(connection, { messageId: { $in: threadMessagesToUpdateTrue } }, { isGeneratedByWebhook: true }); + } + if (threadMessagesToUpdateFalse.length > 0) { + await services_1.rawInfoService.updateManyRawInfo(connection, { messageId: { $in: threadMessagesToUpdateFalse } }, { isGeneratedByWebhook: false }); + } + } + logger.info({ guild_id: connection.name, channel_id: channel.id }, 'Migration for isGeneratedByWebhook is done'); + } + catch (err) { + logger.error({ guild_id: connection.name, channel_id: channel.id, err }, 'Migration for isGeneratedByWebhook failed'); + } +} +/** + * + * @param {Connection} connection - Mongoose connection object for the database. + * @param {Client} client - The discord.js client object used to fetch the guild. + * @param {Snowflake} guildId - The identifier of the guild to extract information from. + */ +async function runRawInfoMigration(connection, client, guildId) { + logger.info({ guild_id: guildId }, 'Migration is running'); + try { + const guild = await client.guilds.fetch(guildId); + const channels = await services_1.channelService.getChannels(connection, {}); + for (let i = 0; i < channels.length; i++) { + const channel = await guild.channels.fetch(channels[i].channelId); + if (channel) { + if (channel.type !== 0) + continue; + await migrateIsGeneratedByWebhook(connection, channel); + } + } + } + catch (err) { + logger.error({ guild_id: guildId, err }, 'Migration is failed'); + } + logger.info({ guild_id: guildId }, 'Migration is done'); +} +exports.default = runRawInfoMigration; diff --git a/lib/tsconfig.tsbuildinfo b/lib/tsconfig.tsbuildinfo new file mode 100644 index 00000000..b3ccf621 --- /dev/null +++ b/lib/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"program":{"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.dom.iterable.d.ts","../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../node_modules/typescript/lib/lib.scripthost.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.esnext.intl.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/typescript/lib/lib.es2017.full.d.ts","../node_modules/@sapphire/shapeshift/dist/index.d.ts","../node_modules/discord-api-types/globals.d.ts","../node_modules/discord-api-types/rest/common.d.ts","../node_modules/discord-api-types/payloads/common.d.ts","../node_modules/discord-api-types/payloads/v10/permissions.d.ts","../node_modules/discord-api-types/payloads/v10/user.d.ts","../node_modules/discord-api-types/payloads/v10/emoji.d.ts","../node_modules/discord-api-types/payloads/v10/oauth2.d.ts","../node_modules/discord-api-types/payloads/v10/sticker.d.ts","../node_modules/discord-api-types/payloads/v10/guild.d.ts","../node_modules/discord-api-types/payloads/v10/teams.d.ts","../node_modules/discord-api-types/payloads/v10/application.d.ts","../node_modules/discord-api-types/payloads/v10/automoderation.d.ts","../node_modules/discord-api-types/payloads/v10/guildscheduledevent.d.ts","../node_modules/discord-api-types/payloads/v10/stageinstance.d.ts","../node_modules/discord-api-types/payloads/v10/webhook.d.ts","../node_modules/discord-api-types/payloads/v10/auditlog.d.ts","../node_modules/discord-api-types/payloads/v10/invite.d.ts","../node_modules/discord-api-types/rest/v10/application.d.ts","../node_modules/discord-api-types/rest/v10/auditlog.d.ts","../node_modules/discord-api-types/rest/v10/automoderation.d.ts","../node_modules/discord-api-types/utils/internals.d.ts","../node_modules/discord-api-types/rest/v10/channel.d.ts","../node_modules/discord-api-types/rest/v10/emoji.d.ts","../node_modules/discord-api-types/rest/v10/gateway.d.ts","../node_modules/discord-api-types/rest/v10/guild.d.ts","../node_modules/discord-api-types/rest/v10/guildscheduledevent.d.ts","../node_modules/discord-api-types/rest/v10/webhook.d.ts","../node_modules/discord-api-types/rest/v10/interactions.d.ts","../node_modules/discord-api-types/rest/v10/invite.d.ts","../node_modules/discord-api-types/rest/v10/oauth2.d.ts","../node_modules/discord-api-types/rest/v10/stageinstance.d.ts","../node_modules/discord-api-types/rest/v10/sticker.d.ts","../node_modules/discord-api-types/rest/v10/template.d.ts","../node_modules/discord-api-types/rest/v10/user.d.ts","../node_modules/discord-api-types/rest/v10/voice.d.ts","../node_modules/discord-api-types/rest/v10/index.d.ts","../node_modules/discord-api-types/payloads/v10/template.d.ts","../node_modules/discord-api-types/payloads/v10/voice.d.ts","../node_modules/discord-api-types/payloads/v10/index.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/responses.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/base.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/shared.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/base.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/attachment.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/boolean.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/channel.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/integer.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/mentionable.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/number.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/role.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/string.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/subcommand.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/subcommandgroup.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/user.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/internals.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/chatinput.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/contextmenu.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/permissions.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/applicationcommands.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/autocomplete.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/messagecomponents.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/modalsubmit.d.ts","../node_modules/discord-api-types/payloads/v10/_interactions/ping.d.ts","../node_modules/discord-api-types/payloads/v10/interactions.d.ts","../node_modules/discord-api-types/payloads/v10/channel.d.ts","../node_modules/discord-api-types/payloads/v10/gateway.d.ts","../node_modules/discord-api-types/gateway/common.d.ts","../node_modules/discord-api-types/gateway/v10.d.ts","../node_modules/discord-api-types/rpc/common.d.ts","../node_modules/discord-api-types/rpc/v10.d.ts","../node_modules/discord-api-types/utils/v10.d.ts","../node_modules/discord-api-types/v10.d.ts","../node_modules/@discordjs/formatters/dist/index.d.ts","../node_modules/@discordjs/util/dist/index.d.ts","../node_modules/@discordjs/builders/dist/index.d.ts","../node_modules/@discordjs/collection/dist/index.d.ts","../node_modules/buffer/index.d.ts","../node_modules/undici/types/header.d.ts","../node_modules/undici/types/readable.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/dom-events.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/globals.global.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/undici/types/file.d.ts","../node_modules/undici/types/fetch.d.ts","../node_modules/undici/types/formdata.d.ts","../node_modules/undici/types/connector.d.ts","../node_modules/undici/types/client.d.ts","../node_modules/undici/types/errors.d.ts","../node_modules/undici/types/dispatcher.d.ts","../node_modules/undici/types/global-dispatcher.d.ts","../node_modules/undici/types/global-origin.d.ts","../node_modules/undici/types/pool-stats.d.ts","../node_modules/undici/types/pool.d.ts","../node_modules/undici/types/handlers.d.ts","../node_modules/undici/types/balanced-pool.d.ts","../node_modules/undici/types/agent.d.ts","../node_modules/undici/types/mock-interceptor.d.ts","../node_modules/undici/types/mock-agent.d.ts","../node_modules/undici/types/mock-client.d.ts","../node_modules/undici/types/mock-pool.d.ts","../node_modules/undici/types/mock-errors.d.ts","../node_modules/undici/types/proxy-agent.d.ts","../node_modules/undici/types/api.d.ts","../node_modules/undici/types/cookies.d.ts","../node_modules/undici/types/patch.d.ts","../node_modules/undici/types/filereader.d.ts","../node_modules/undici/types/diagnostics-channel.d.ts","../node_modules/undici/types/websocket.d.ts","../node_modules/undici/types/content-type.d.ts","../node_modules/undici/types/cache.d.ts","../node_modules/undici/types/interceptors.d.ts","../node_modules/undici/index.d.ts","../node_modules/@discordjs/rest/dist/types-65527f29.d.ts","../node_modules/@vladfrangu/async_event_emitter/dist/index.d.ts","../node_modules/@discordjs/rest/dist/index.d.ts","../node_modules/@sapphire/async-queue/dist/index.d.ts","../node_modules/@discordjs/ws/dist/index.d.ts","../node_modules/@types/ws/index.d.ts","../node_modules/discord.js/typings/rawdatatypes.d.ts","../node_modules/@sapphire/snowflake/dist/index.d.ts","../node_modules/discord.js/typings/index.d.ts","../node_modules/joi/lib/index.d.ts","../src/config/index.ts","../node_modules/@sentry/types/types/attachment.d.ts","../node_modules/@sentry/types/types/severity.d.ts","../node_modules/@sentry/types/types/breadcrumb.d.ts","../node_modules/@sentry/types/types/request.d.ts","../node_modules/@sentry/types/types/misc.d.ts","../node_modules/@sentry/types/types/context.d.ts","../node_modules/@sentry/types/types/checkin.d.ts","../node_modules/@sentry/types/types/datacategory.d.ts","../node_modules/@sentry/types/types/clientreport.d.ts","../node_modules/@sentry/types/types/dsn.d.ts","../node_modules/@sentry/types/types/debugmeta.d.ts","../node_modules/@sentry/types/types/mechanism.d.ts","../node_modules/@sentry/types/types/stackframe.d.ts","../node_modules/@sentry/types/types/stacktrace.d.ts","../node_modules/@sentry/types/types/exception.d.ts","../node_modules/@sentry/types/types/extra.d.ts","../node_modules/@sentry/types/types/measurement.d.ts","../node_modules/@sentry/types/types/eventprocessor.d.ts","../node_modules/@sentry/types/types/user.d.ts","../node_modules/@sentry/types/types/session.d.ts","../node_modules/@sentry/types/types/instrumenter.d.ts","../node_modules/@sentry/types/types/polymorphics.d.ts","../node_modules/@sentry/types/types/transaction.d.ts","../node_modules/@sentry/types/types/span.d.ts","../node_modules/@sentry/types/types/tracing.d.ts","../node_modules/@sentry/types/types/scope.d.ts","../node_modules/@sentry/types/types/package.d.ts","../node_modules/@sentry/types/types/sdkinfo.d.ts","../node_modules/@sentry/types/types/thread.d.ts","../node_modules/@sentry/types/types/event.d.ts","../node_modules/@sentry/types/types/replay.d.ts","../node_modules/@sentry/types/types/envelope.d.ts","../node_modules/@sentry/types/types/hub.d.ts","../node_modules/@sentry/types/types/integration.d.ts","../node_modules/@sentry/types/types/sdkmetadata.d.ts","../node_modules/@sentry/types/types/textencoder.d.ts","../node_modules/@sentry/types/types/transport.d.ts","../node_modules/@sentry/types/types/options.d.ts","../node_modules/@sentry/types/types/client.d.ts","../node_modules/@sentry/types/types/error.d.ts","../node_modules/@sentry/types/types/globals.d.ts","../node_modules/@sentry/types/types/profiling.d.ts","../node_modules/@sentry/types/types/runtime.d.ts","../node_modules/@sentry/types/types/wrappedfunction.d.ts","../node_modules/@sentry/types/types/instrument.d.ts","../node_modules/@sentry/types/types/browseroptions.d.ts","../node_modules/@sentry/types/types/index.d.ts","../node_modules/@sentry/utils/types/aggregate-errors.d.ts","../node_modules/@sentry/utils/types/browser.d.ts","../node_modules/@sentry/utils/types/dsn.d.ts","../node_modules/@sentry/utils/types/logger.d.ts","../node_modules/@sentry/utils/types/error.d.ts","../node_modules/@sentry/utils/types/env.d.ts","../node_modules/@sentry/utils/types/worldwide.d.ts","../node_modules/@sentry/utils/types/instrument.d.ts","../node_modules/@sentry/utils/types/is.d.ts","../node_modules/@sentry/utils/types/memo.d.ts","../node_modules/@sentry/utils/types/misc.d.ts","../node_modules/@sentry/utils/types/node.d.ts","../node_modules/@sentry/utils/types/normalize.d.ts","../node_modules/@sentry/utils/types/object.d.ts","../node_modules/@sentry/utils/types/path.d.ts","../node_modules/@sentry/utils/types/promisebuffer.d.ts","../node_modules/@sentry/utils/types/requestdata.d.ts","../node_modules/@sentry/utils/types/severity.d.ts","../node_modules/@sentry/utils/types/node-stack-trace.d.ts","../node_modules/@sentry/utils/types/stacktrace.d.ts","../node_modules/@sentry/utils/types/vendor/escapestringforregex.d.ts","../node_modules/@sentry/utils/types/string.d.ts","../node_modules/@sentry/utils/types/vendor/supportshistory.d.ts","../node_modules/@sentry/utils/types/supports.d.ts","../node_modules/@sentry/utils/types/syncpromise.d.ts","../node_modules/@sentry/utils/types/time.d.ts","../node_modules/@sentry/utils/types/baggage.d.ts","../node_modules/@sentry/utils/types/tracing.d.ts","../node_modules/@sentry/utils/types/envelope.d.ts","../node_modules/@sentry/utils/types/clientreport.d.ts","../node_modules/@sentry/utils/types/ratelimit.d.ts","../node_modules/@sentry/utils/types/url.d.ts","../node_modules/@sentry/utils/types/userintegrations.d.ts","../node_modules/@sentry/utils/types/cache.d.ts","../node_modules/@sentry/utils/types/eventbuilder.d.ts","../node_modules/@sentry/utils/types/index.d.ts","../node_modules/@sentry/node/types/requestdata.d.ts","../node_modules/@sentry/core/types/sdk.d.ts","../node_modules/@sentry/core/types/scope.d.ts","../node_modules/@sentry/core/types/hub.d.ts","../node_modules/@sentry/core/types/transports/offline.d.ts","../node_modules/@sentry/core/types/integration.d.ts","../node_modules/@sentry/core/types/baseclient.d.ts","../node_modules/@sentry/core/types/server-runtime-client.d.ts","../node_modules/@sentry/core/types/tracing/span.d.ts","../node_modules/@sentry/core/types/tracing/transaction.d.ts","../node_modules/@sentry/core/types/tracing/idletransaction.d.ts","../node_modules/@sentry/core/types/tracing/hubextensions.d.ts","../node_modules/@sentry/core/types/tracing/utils.d.ts","../node_modules/@sentry/core/types/tracing/spanstatus.d.ts","../node_modules/@sentry/core/types/tracing/trace.d.ts","../node_modules/@sentry/core/types/tracing/dynamicsamplingcontext.d.ts","../node_modules/@sentry/core/types/tracing/measurement.d.ts","../node_modules/@sentry/core/types/tracing/index.d.ts","../node_modules/@sentry/core/types/exports.d.ts","../node_modules/@sentry/core/types/session.d.ts","../node_modules/@sentry/core/types/sessionflusher.d.ts","../node_modules/@sentry/core/types/api.d.ts","../node_modules/@sentry/core/types/transports/base.d.ts","../node_modules/@sentry/core/types/transports/multiplexed.d.ts","../node_modules/@sentry/core/types/version.d.ts","../node_modules/@sentry/core/types/integrations/functiontostring.d.ts","../node_modules/@sentry/core/types/integrations/inboundfilters.d.ts","../node_modules/@sentry/core/types/integrations/index.d.ts","../node_modules/@sentry/core/types/utils/prepareevent.d.ts","../node_modules/@sentry/core/types/checkin.d.ts","../node_modules/@sentry/core/types/utils/hastracingenabled.d.ts","../node_modules/@sentry/core/types/constants.d.ts","../node_modules/@sentry/core/types/integrations/metadata.d.ts","../node_modules/@sentry/core/types/index.d.ts","../node_modules/@sentry/node/types/client.d.ts","../node_modules/@sentry/node/types/transports/http-module.d.ts","../node_modules/@sentry/node/types/transports/http.d.ts","../node_modules/@sentry/node/types/transports/index.d.ts","../node_modules/@sentry/node/types/types.d.ts","../node_modules/@sentry/node/types/tracing/index.d.ts","../node_modules/@sentry/node/types/integrations/console.d.ts","../node_modules/@sentry/node/types/integrations/http.d.ts","../node_modules/@sentry/node/types/integrations/onuncaughtexception.d.ts","../node_modules/@sentry/node/types/integrations/onunhandledrejection.d.ts","../node_modules/@sentry/node/types/integrations/linkederrors.d.ts","../node_modules/@sentry/node/types/integrations/modules.d.ts","../node_modules/@sentry/node/types/integrations/contextlines.d.ts","../node_modules/@sentry/node/types/integrations/context.d.ts","../node_modules/@sentry/node/types/integrations/requestdata.d.ts","../node_modules/@sentry/node/types/integrations/localvariables.d.ts","../node_modules/@sentry/node/types/integrations/undici/index.d.ts","../node_modules/@sentry/node/types/integrations/index.d.ts","../node_modules/@sentry/node/types/sdk.d.ts","../node_modules/@sentry/node/types/utils.d.ts","../node_modules/@sentry/node/types/module.d.ts","../node_modules/@sentry/node/types/requestdatadeprecated.d.ts","../node_modules/@sentry/node/types/handlers.d.ts","../node_modules/@sentry-internal/tracing/types/exports/index.d.ts","../node_modules/@sentry-internal/tracing/types/node/integrations/express.d.ts","../node_modules/@sentry-internal/tracing/types/node/integrations/lazy.d.ts","../node_modules/@sentry-internal/tracing/types/node/integrations/postgres.d.ts","../node_modules/@sentry-internal/tracing/types/node/integrations/mysql.d.ts","../node_modules/@sentry-internal/tracing/types/node/integrations/mongo.d.ts","../node_modules/@sentry-internal/tracing/types/node/integrations/prisma.d.ts","../node_modules/@sentry-internal/tracing/types/node/integrations/graphql.d.ts","../node_modules/@sentry-internal/tracing/types/node/integrations/apollo.d.ts","../node_modules/@sentry-internal/tracing/types/node/integrations/index.d.ts","../node_modules/@sentry-internal/tracing/types/node/index.d.ts","../node_modules/@sentry-internal/tracing/types/browser/request.d.ts","../node_modules/@sentry-internal/tracing/types/browser/browsertracing.d.ts","../node_modules/@sentry-internal/tracing/types/browser/index.d.ts","../node_modules/@sentry-internal/tracing/types/extensions.d.ts","../node_modules/@sentry-internal/tracing/types/index.d.ts","../node_modules/@sentry/node/types/tracing/integrations.d.ts","../node_modules/@sentry/node/types/index.d.ts","../src/functions/loadevents.ts","../node_modules/mongoose/node_modules/bson/bson.d.ts","../node_modules/mongoose/node_modules/mongodb/mongodb.d.ts","../node_modules/mongoose/types/aggregate.d.ts","../node_modules/mongoose/types/callback.d.ts","../node_modules/mongoose/types/collection.d.ts","../node_modules/mongoose/types/connection.d.ts","../node_modules/mongoose/types/cursor.d.ts","../node_modules/mongoose/types/document.d.ts","../node_modules/mongoose/types/error.d.ts","../node_modules/mongoose/types/expressions.d.ts","../node_modules/mongoose/types/helpers.d.ts","../node_modules/mongoose/types/middlewares.d.ts","../node_modules/mongoose/types/indexes.d.ts","../node_modules/mongoose/types/models.d.ts","../node_modules/mongoose/types/mongooseoptions.d.ts","../node_modules/mongoose/types/pipelinestage.d.ts","../node_modules/mongoose/types/populate.d.ts","../node_modules/mongoose/types/query.d.ts","../node_modules/mongoose/types/schemaoptions.d.ts","../node_modules/mongoose/types/schematypes.d.ts","../node_modules/mongoose/types/session.d.ts","../node_modules/mongoose/types/types.d.ts","../node_modules/mongoose/types/utility.d.ts","../node_modules/mongoose/types/validation.d.ts","../node_modules/mongoose/types/inferschematype.d.ts","../node_modules/mongoose/types/virtuals.d.ts","../node_modules/mongoose/types/augmentations.d.ts","../node_modules/mongoose/types/index.d.ts","../node_modules/@togethercrew.dev/db/dist/interfaces/guild.interface.d.ts","../node_modules/@togethercrew.dev/db/dist/interfaces/rawinfo.interface.d.ts","../node_modules/@togethercrew.dev/db/dist/interfaces/heatmap.interface.d.ts","../node_modules/@togethercrew.dev/db/dist/interfaces/token.interface.d.ts","../node_modules/@togethercrew.dev/db/dist/interfaces/memberactivity.interface.d.ts","../node_modules/@togethercrew.dev/db/dist/interfaces/guildmember.interface.d.ts","../node_modules/@togethercrew.dev/db/dist/interfaces/channel.interface.d.ts","../node_modules/@togethercrew.dev/db/dist/interfaces/role.interface.d.ts","../node_modules/@togethercrew.dev/db/dist/interfaces/user.interface.d.ts","../node_modules/@togethercrew.dev/db/dist/interfaces/discord.interface.d.ts","../node_modules/@togethercrew.dev/db/dist/interfaces/index.d.ts","../node_modules/@togethercrew.dev/db/dist/models/user.model.d.ts","../node_modules/@togethercrew.dev/db/dist/models/token.model.d.ts","../node_modules/@togethercrew.dev/db/dist/models/guild.model.d.ts","../node_modules/@togethercrew.dev/db/dist/models/heatmap.model.d.ts","../node_modules/@togethercrew.dev/db/dist/models/rawinfo.model.d.ts","../node_modules/@togethercrew.dev/db/dist/models/memberactivity.model.d.ts","../node_modules/@togethercrew.dev/db/dist/models/guildmember.model.d.ts","../node_modules/@togethercrew.dev/db/dist/models/channel.model.d.ts","../node_modules/@togethercrew.dev/db/dist/models/role.model.d.ts","../node_modules/@togethercrew.dev/db/dist/models/index.d.ts","../node_modules/@togethercrew.dev/db/dist/models/schemas/user.schema.d.ts","../node_modules/@togethercrew.dev/db/dist/models/schemas/token.schema.d.ts","../node_modules/@togethercrew.dev/db/dist/models/schemas/guild.schema.d.ts","../node_modules/@togethercrew.dev/db/dist/models/schemas/heatmap.schema.d.ts","../node_modules/@togethercrew.dev/db/dist/models/schemas/rawinfo.schema.d.ts","../node_modules/@togethercrew.dev/db/dist/models/schemas/memberactivity.schema.d.ts","../node_modules/@togethercrew.dev/db/dist/models/schemas/guildmember.schema.d.ts","../node_modules/@togethercrew.dev/db/dist/models/schemas/channel.schema.d.ts","../node_modules/@togethercrew.dev/db/dist/models/schemas/role.schema.d.ts","../node_modules/@togethercrew.dev/db/dist/models/schemas/index.d.ts","../node_modules/@togethercrew.dev/db/dist/service/database.service.d.ts","../node_modules/@togethercrew.dev/db/dist/service/index.d.ts","../node_modules/@togethercrew.dev/db/dist/index.d.ts","../node_modules/pino-std-serializers/index.d.ts","../node_modules/sonic-boom/types/index.d.ts","../node_modules/pino/pino.d.ts","../src/config/logger.ts","../src/database/services/guildmember.service.ts","../src/database/services/rawinfo.service.ts","../src/database/services/guild.service.ts","../src/database/services/role.service.ts","../src/database/services/channel.service.ts","../src/database/services/index.ts","../node_modules/@types/amqplib/properties.d.ts","../node_modules/@types/amqplib/index.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/rabbitmq/rabbit.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/rabbitmq/index.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/enums/status.enum.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/enums/event.enum.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/enums/queue.enum.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/enums/index.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/interfaces/transaction.interface.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/interfaces/choreography.interface.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/interfaces/event-message.interface.d.ts","../node_modules/bson/bson.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongodb/mongodb.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/aggregate.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/callback.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/collection.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/connection.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/cursor.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/document.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/error.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/expressions.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/helpers.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/middlewares.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/indexes.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/models.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/mongooseoptions.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/pipelinestage.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/populate.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/query.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/schemaoptions.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/schematypes.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/session.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/types.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/utility.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/validation.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/inferschematype.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/virtuals.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/augmentations.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose/types/index.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/interfaces/saga.interface.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/interfaces/index.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/models/schemas/choreography.schema.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/models/schemas/saga.schema.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/models/index.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/saga/choreography.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/saga/transaction.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/saga/index.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/mongo/connection.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/mongo/index.d.ts","../node_modules/@togethercrew.dev/tc-messagebroker/dist/index.d.ts","../src/functions/fetchmessages.ts","../src/functions/guildextraction.ts","../src/database/connection.ts","../src/functions/cronjon.ts","../node_modules/bullmq/dist/esm/classes/async-fifo-queue.d.ts","../node_modules/bullmq/dist/esm/interfaces/parent.d.ts","../node_modules/bullmq/dist/esm/interfaces/job-json.d.ts","../node_modules/bullmq/dist/esm/interfaces/minimal-job.d.ts","../node_modules/bullmq/dist/esm/types/backoff-strategy.d.ts","../node_modules/bullmq/dist/esm/types/finished-status.d.ts","../node_modules/bullmq/dist/esm/classes/redis-connection.d.ts","../node_modules/ioredis/built/types.d.ts","../node_modules/ioredis/built/command.d.ts","../node_modules/ioredis/built/scanstream.d.ts","../node_modules/ioredis/built/utils/rediscommander.d.ts","../node_modules/ioredis/built/transaction.d.ts","../node_modules/ioredis/built/utils/commander.d.ts","../node_modules/ioredis/built/connectors/abstractconnector.d.ts","../node_modules/ioredis/built/connectors/connectorconstructor.d.ts","../node_modules/ioredis/built/connectors/sentinelconnector/types.d.ts","../node_modules/ioredis/built/connectors/sentinelconnector/sentineliterator.d.ts","../node_modules/ioredis/built/connectors/sentinelconnector/index.d.ts","../node_modules/ioredis/built/connectors/standaloneconnector.d.ts","../node_modules/ioredis/built/redis/redisoptions.d.ts","../node_modules/ioredis/built/cluster/util.d.ts","../node_modules/ioredis/built/cluster/clusteroptions.d.ts","../node_modules/ioredis/built/cluster/index.d.ts","../node_modules/denque/index.d.ts","../node_modules/ioredis/built/subscriptionset.d.ts","../node_modules/ioredis/built/datahandler.d.ts","../node_modules/ioredis/built/redis.d.ts","../node_modules/ioredis/built/pipeline.d.ts","../node_modules/ioredis/built/index.d.ts","../node_modules/bullmq/dist/esm/classes/scripts.d.ts","../node_modules/bullmq/dist/esm/classes/queue-events.d.ts","../node_modules/bullmq/dist/esm/classes/job.d.ts","../node_modules/bullmq/dist/esm/classes/queue-keys.d.ts","../node_modules/bullmq/dist/esm/classes/queue-base.d.ts","../node_modules/bullmq/dist/esm/types/minimal-queue.d.ts","../node_modules/bullmq/dist/esm/types/job-json-sandbox.d.ts","../node_modules/bullmq/dist/esm/types/job-options.d.ts","../node_modules/bullmq/dist/esm/types/job-type.d.ts","../node_modules/cron-parser/types/common.d.ts","../node_modules/cron-parser/types/index.d.ts","../node_modules/bullmq/dist/esm/interfaces/repeat-options.d.ts","../node_modules/bullmq/dist/esm/types/repeat-strategy.d.ts","../node_modules/bullmq/dist/esm/types/index.d.ts","../node_modules/bullmq/dist/esm/interfaces/advanced-options.d.ts","../node_modules/bullmq/dist/esm/interfaces/backoff-options.d.ts","../node_modules/bullmq/dist/esm/interfaces/base-job-options.d.ts","../node_modules/bullmq/dist/esm/interfaces/child-command.d.ts","../node_modules/bullmq/dist/esm/interfaces/parent-command.d.ts","../node_modules/bullmq/dist/esm/interfaces/child-message.d.ts","../node_modules/bullmq/dist/esm/interfaces/connection.d.ts","../node_modules/bullmq/dist/esm/interfaces/redis-options.d.ts","../node_modules/bullmq/dist/esm/interfaces/queue-options.d.ts","../node_modules/bullmq/dist/esm/interfaces/flow-job.d.ts","../node_modules/bullmq/dist/esm/interfaces/ioredis-events.d.ts","../node_modules/bullmq/dist/esm/interfaces/keep-jobs.d.ts","../node_modules/bullmq/dist/esm/interfaces/metrics-options.d.ts","../node_modules/bullmq/dist/esm/interfaces/metrics.d.ts","../node_modules/bullmq/dist/esm/interfaces/parent-message.d.ts","../node_modules/bullmq/dist/esm/interfaces/rate-limiter-options.d.ts","../node_modules/bullmq/dist/esm/interfaces/redis-streams.d.ts","../node_modules/bullmq/dist/esm/interfaces/sandboxed-job.d.ts","../node_modules/bullmq/dist/esm/interfaces/sandboxed-job-processor.d.ts","../node_modules/bullmq/dist/esm/interfaces/worker-options.d.ts","../node_modules/bullmq/dist/esm/interfaces/index.d.ts","../node_modules/bullmq/dist/esm/classes/backoffs.d.ts","../node_modules/bullmq/dist/esm/classes/child.d.ts","../node_modules/bullmq/dist/esm/classes/child-pool.d.ts","../node_modules/bullmq/dist/esm/classes/child-processor.d.ts","../node_modules/bullmq/dist/esm/classes/delayed-error.d.ts","../node_modules/bullmq/dist/esm/classes/flow-producer.d.ts","../node_modules/bullmq/dist/esm/classes/queue-getters.d.ts","../node_modules/bullmq/dist/esm/classes/repeat.d.ts","../node_modules/bullmq/dist/esm/classes/queue.d.ts","../node_modules/bullmq/dist/esm/classes/sandbox.d.ts","../node_modules/bullmq/dist/esm/classes/unrecoverable-error.d.ts","../node_modules/bullmq/dist/esm/classes/waiting-children-error.d.ts","../node_modules/bullmq/dist/esm/classes/worker.d.ts","../node_modules/bullmq/dist/esm/classes/index.d.ts","../node_modules/bullmq/dist/esm/commands/script-loader.d.ts","../node_modules/bullmq/dist/esm/commands/index.d.ts","../node_modules/bullmq/dist/esm/enums/error-code.enum.d.ts","../node_modules/bullmq/dist/esm/enums/metrics-time.d.ts","../node_modules/bullmq/dist/esm/enums/index.d.ts","../node_modules/bullmq/dist/esm/utils.d.ts","../node_modules/bullmq/dist/esm/index.d.ts","../src/database/index.ts","../src/functions/senddirectmessage.ts","../src/functions/thread.ts","../src/functions/fetchmembers.ts","../src/functions/fetchchannels.ts","../src/functions/fetchroles.ts","../src/index.ts","../src/events/channel/channelcreate.ts","../src/events/channel/channeldelete.ts","../src/events/channel/channelupdate.ts","../src/events/client/ready.ts","../src/events/member/guildmemberadd.ts","../src/events/member/guildmemberremove.ts","../src/events/member/guildmemberupdate.ts","../src/events/role/rolecreate.ts","../src/events/role/roledelete.ts","../src/events/role/roleupdate.ts","../src/events/user/userupdate.ts","../node_modules/dotenv/config.d.ts","../src/migrations/utils/webhooklogic.ts","../src/migrations/db/1695210587863-add-isgeneratedbyweebhook-to-rawinfo-schema.ts","../src/migrations/utils/template.ts","../node_modules/@babel/types/lib/index.d.ts","../node_modules/@types/babel__generator/index.d.ts","../node_modules/@babel/parser/typings/babel-parser.d.ts","../node_modules/@types/babel__template/index.d.ts","../node_modules/@types/babel__traverse/index.d.ts","../node_modules/@types/babel__core/index.d.ts","../node_modules/@types/cookiejar/index.d.ts","../node_modules/@types/graceful-fs/index.d.ts","../node_modules/@types/istanbul-lib-coverage/index.d.ts","../node_modules/@types/istanbul-lib-report/index.d.ts","../node_modules/@types/istanbul-reports/index.d.ts","../node_modules/@jest/expect-utils/build/index.d.ts","../node_modules/jest-matcher-utils/node_modules/chalk/index.d.ts","../node_modules/@sinclair/typebox/typebox.d.ts","../node_modules/@jest/schemas/build/index.d.ts","../node_modules/pretty-format/build/index.d.ts","../node_modules/jest-diff/build/index.d.ts","../node_modules/jest-matcher-utils/build/index.d.ts","../node_modules/expect/build/index.d.ts","../node_modules/@types/jest/index.d.ts","../node_modules/@types/json-schema/index.d.ts","../node_modules/@types/json5/index.d.ts","../node_modules/form-data/index.d.ts","../node_modules/@types/node-fetch/externals.d.ts","../node_modules/@types/node-fetch/index.d.ts","../node_modules/@types/semver/classes/semver.d.ts","../node_modules/@types/semver/functions/parse.d.ts","../node_modules/@types/semver/functions/valid.d.ts","../node_modules/@types/semver/functions/clean.d.ts","../node_modules/@types/semver/functions/inc.d.ts","../node_modules/@types/semver/functions/diff.d.ts","../node_modules/@types/semver/functions/major.d.ts","../node_modules/@types/semver/functions/minor.d.ts","../node_modules/@types/semver/functions/patch.d.ts","../node_modules/@types/semver/functions/prerelease.d.ts","../node_modules/@types/semver/functions/compare.d.ts","../node_modules/@types/semver/functions/rcompare.d.ts","../node_modules/@types/semver/functions/compare-loose.d.ts","../node_modules/@types/semver/functions/compare-build.d.ts","../node_modules/@types/semver/functions/sort.d.ts","../node_modules/@types/semver/functions/rsort.d.ts","../node_modules/@types/semver/functions/gt.d.ts","../node_modules/@types/semver/functions/lt.d.ts","../node_modules/@types/semver/functions/eq.d.ts","../node_modules/@types/semver/functions/neq.d.ts","../node_modules/@types/semver/functions/gte.d.ts","../node_modules/@types/semver/functions/lte.d.ts","../node_modules/@types/semver/functions/cmp.d.ts","../node_modules/@types/semver/functions/coerce.d.ts","../node_modules/@types/semver/classes/comparator.d.ts","../node_modules/@types/semver/classes/range.d.ts","../node_modules/@types/semver/functions/satisfies.d.ts","../node_modules/@types/semver/ranges/max-satisfying.d.ts","../node_modules/@types/semver/ranges/min-satisfying.d.ts","../node_modules/@types/semver/ranges/to-comparators.d.ts","../node_modules/@types/semver/ranges/min-version.d.ts","../node_modules/@types/semver/ranges/valid.d.ts","../node_modules/@types/semver/ranges/outside.d.ts","../node_modules/@types/semver/ranges/gtr.d.ts","../node_modules/@types/semver/ranges/ltr.d.ts","../node_modules/@types/semver/ranges/intersects.d.ts","../node_modules/@types/semver/ranges/simplify.d.ts","../node_modules/@types/semver/ranges/subset.d.ts","../node_modules/@types/semver/internals/identifiers.d.ts","../node_modules/@types/semver/index.d.ts","../node_modules/@types/stack-utils/index.d.ts","../node_modules/@types/superagent/index.d.ts","../node_modules/@types/supertest/index.d.ts","../node_modules/@types/uuid/index.d.ts","../node_modules/@types/webidl-conversions/index.d.ts","../node_modules/@types/whatwg-url/index.d.ts","../node_modules/@types/yargs-parser/index.d.ts","../node_modules/@types/yargs/index.d.ts","../../../../../node_modules/bson/bson.d.ts","../../../../../node_modules/mongodb/mongodb.d.ts","../../../../../node_modules/mongoose/types/aggregate.d.ts","../../../../../node_modules/mongoose/types/callback.d.ts","../../../../../node_modules/mongoose/types/collection.d.ts","../../../../../node_modules/mongoose/types/connection.d.ts","../../../../../node_modules/mongoose/types/cursor.d.ts","../../../../../node_modules/mongoose/types/document.d.ts","../../../../../node_modules/mongoose/types/error.d.ts","../../../../../node_modules/mongoose/types/expressions.d.ts","../../../../../node_modules/mongoose/types/helpers.d.ts","../../../../../node_modules/mongoose/types/middlewares.d.ts","../../../../../node_modules/mongoose/types/indexes.d.ts","../../../../../node_modules/mongoose/types/models.d.ts","../../../../../node_modules/mongoose/types/mongooseoptions.d.ts","../../../../../node_modules/mongoose/types/pipelinestage.d.ts","../../../../../node_modules/mongoose/types/populate.d.ts","../../../../../node_modules/mongoose/types/query.d.ts","../../../../../node_modules/mongoose/types/schemaoptions.d.ts","../../../../../node_modules/mongoose/types/schematypes.d.ts","../../../../../node_modules/mongoose/types/session.d.ts","../../../../../node_modules/mongoose/types/types.d.ts","../../../../../node_modules/mongoose/types/utility.d.ts","../../../../../node_modules/mongoose/types/validation.d.ts","../../../../../node_modules/mongoose/types/inferschematype.d.ts","../../../../../node_modules/mongoose/types/virtuals.d.ts","../../../../../node_modules/mongoose/types/index.d.ts","../../../../../node_modules/@types/mongoose-unique-validator/index.d.ts"],"fileInfos":[{"version":"2ac9cdcfb8f8875c18d14ec5796a8b029c426f73ad6dc3ffb580c228b58d1c44","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","dc48272d7c333ccf58034c0026162576b7d50ea0e69c3b9292f803fc20720fd5","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4",{"version":"0075fa5ceda385bcdf3488e37786b5a33be730e8bc4aa3cf1e78c63891752ce8","affectsGlobalScope":true},{"version":"35299ae4a62086698444a5aaee27fc7aa377c68cbb90b441c9ace246ffd05c97","affectsGlobalScope":true},{"version":"c5c5565225fce2ede835725a92a28ece149f83542aa4866cfb10290bff7b8996","affectsGlobalScope":true},{"version":"7d2dbc2a0250400af0809b0ad5f84686e84c73526de931f84560e483eb16b03c","affectsGlobalScope":true},{"version":"f296963760430fb65b4e5d91f0ed770a91c6e77455bacf8fa23a1501654ede0e","affectsGlobalScope":true},{"version":"09226e53d1cfda217317074a97724da3e71e2c545e18774484b61562afc53cd2","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"8b41361862022eb72fcc8a7f34680ac842aca802cf4bc1f915e8c620c9ce4331","affectsGlobalScope":true},{"version":"f7bd636ae3a4623c503359ada74510c4005df5b36de7f23e1db8a5c543fd176b","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"0c20f4d2358eb679e4ae8a4432bdd96c857a2960fd6800b21ec4008ec59d60ea","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"82d0d8e269b9eeac02c3bd1c9e884e85d483fcb2cd168bccd6bc54df663da031","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"b8deab98702588840be73d67f02412a2d45a417a3c097b2e96f7f3a42ac483d1","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"376d554d042fb409cb55b5cbaf0b2b4b7e669619493c5d18d5fa8bd67273f82a","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"c4138a3dd7cd6cf1f363ca0f905554e8d81b45844feea17786cdf1626cb8ea06","affectsGlobalScope":true},{"version":"6ff3e2452b055d8f0ec026511c6582b55d935675af67cdb67dd1dc671e8065df","affectsGlobalScope":true},{"version":"03de17b810f426a2f47396b0b99b53a82c1b60e9cba7a7edda47f9bb077882f4","affectsGlobalScope":true},{"version":"8184c6ddf48f0c98429326b428478ecc6143c27f79b79e85740f17e6feb090f1","affectsGlobalScope":true},{"version":"261c4d2cf86ac5a89ad3fb3fafed74cbb6f2f7c1d139b0540933df567d64a6ca","affectsGlobalScope":true},{"version":"6af1425e9973f4924fca986636ac19a0cf9909a7e0d9d3009c349e6244e957b6","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"15a630d6817718a2ddd7088c4f83e4673fde19fa992d2eae2cf51132a302a5d3","affectsGlobalScope":true},{"version":"b7e9f95a7387e3f66be0ed6db43600c49cec33a3900437ce2fd350d9b7cb16f2","affectsGlobalScope":true},{"version":"01e0ee7e1f661acedb08b51f8a9b7d7f959e9cdb6441360f06522cc3aea1bf2e","affectsGlobalScope":true},{"version":"ac17a97f816d53d9dd79b0d235e1c0ed54a8cc6a0677e9a3d61efb480b2a3e4e","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"9cc66b0513ad41cb5f5372cca86ef83a0d37d1c1017580b7dace3ea5661836df","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"307c8b7ebbd7f23a92b73a4c6c0a697beca05b06b036c23a34553e5fe65e4fdc","affectsGlobalScope":true},{"version":"f35a831e4f0fe3b3697f4a0fe0e3caa7624c92b78afbecaf142c0f93abfaf379","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"994c234848afc14a2586b6565777f4c0b05dc479ede0a041bfd5becf6dceb586","989750ba85cd04fadc038b9f4227fb027ebc21bc85add75a6767dcf8ba818b1e","b5557e20f64bcf823a12d8fc205dbc948f79300dcd5c58e9c2c41477cfb47046","776fbcf0281f1a5ad97e1e9b6ceeeaf03c9b30b6aad8dd88c602e7dab1c8167f","4e4d607daf1ac557a8cc2fd303d5585e219478ed146af5c9ade13509424ba427","b2a27ef2e69709fadb83acba5658695598073f8c1e6c2c535a19b75200c5be0f","9b98035ff4196cea3e960e2d62ff56472287702642bca83c2be5b397b8346daa","d0863f81c9f2c13fca21445a0ae679e6f51b57283719f30c64d85a5d08a02a0c","7dcfa67ddc7767293a28ffad01f6af160b0f63c16637310bed5ab4989c5871cd","62e5d61d0f3540ee1b2f75761d622c845c06fcc248cb6e1ea376a7aa47516fbb","21c6ec133a7ad5c9a6c0f63eee2f5d61e59159df94769f2aaf822a580ba45c60","bd60f70df082c057fec3876674ff69446f1bfc9cda16011dd1c24f6280bb90d1","5751455a168ee6da83f5038ba347a21b9fcc0de21d417db3edff726403223a51","75700defb2dd3a05768e05d996b520a7e061725dbbc48972f0445d594884856b","16385f7e0dc63990dc76518a746cf746d8995ee1c0baacb145008a7640a62ceb","3708bf2edecf61ca3952f98885467428610b34e299ec18a40644c2845bd0141f","5d310ff3cc8e4a88bc14327b847af9f2fe5cfea07a0d97c6569aba7e6b8bc85f","8bb9a6aca71a7836c1459ec6d48e602168c12830f52893f568ec3797555613b2","94347fa94bb6b81dbb0ab2831440e5322da4343fba14f1cba655573b6919905e","f0af83010ef3141786bce0c39ea41545fcb3904e0270df9945daf9efd9dbe29e","d53bacf6bea149fd81f4c4812f7b3d28cf104697eb3e370aa6d7c1fd0b254535","4ef86f6b4715067fb89f82f5e2c04b7c6629adb80286fe9149b5a4cde1e69bba","73394ce9714812b221409a554bf0f9d22013e9ed3b57f62ad7297b1d96199159","3b80f9ed9b6d8f9d6bb04fa542e9e0e94585193f00614d6fb0d1894bf37fb9f6","6627b63f41c59d7186d5bfa8eea261e530d2d14a663284850dc51a7a6301f471","4236ff71b9fdc1b6441be8b98a8426f8bf5dabf775a72fdf53b459122d128b1c","727190e81e96956bb41fb7f944e87ed04b82f1f7c5f73c0567844f733637040c","cd798d80c4496e7ee3c328935869d5fca63f4bc38cf71889524c627c3e5e519d","2267bd5c8c0e6325eab2dfc0ca19831760d69f34cbb97aeeafd4874b20faade1","5eb2704e974336910e46374c9dadce7816ea8ceb8ff3853e534339abcba0e128","115e358a8ea88f92998a862985bbc766e4145ebd460cda1f3dc28f33567256b7","0f8a1ce795276f7e1c966625ab7ede9b9fa50c480c9e9db0b92dbb6dc9740c42","640314deba414fc82925005d8450afbd6ad4d97785506aa740f501348464d762","869e73f068f94d20a0851f9ccc351d0b902f07bbbcb0b3f6a80570c84651f443","fe13392d4d214ceba1aea269cc2799f2d14ba553945738a3db25c2608f663a40","513a03462108ca41c6524d50d60bb09f5fbd1b2990679a15df994a61a26037a4","7254777d3c5c0b3678ee73417c361a90e68317beb4dd16cf5d02d88203cd1691","ae411fe6273a9d3aa590f55a0f27a6021525ef7fefb7b2981baf7686bea19f3f","98d5d5c53e7ee6b9a1e26d438869e40a35c4b29077e3517733152482ab290ac7","fec471dab196078c0805e766caee6f4f1d811e87d87afaed3f71550f2272e2f6","4b8295b3edde1a2ef5960f86a2ece378612884a752bcd0515f590bbf6758ad8a","4d8bd200c915c47dac0aac78d8aa98f302ec253d525b0169b22867feb90f577c","ae765d84d003caecaeb2cba90927cea7edd4368a313832ffddc139b9eefa60cb","c89df049268ebd41d0aaea665630468270c60fdf9c15a9f6b1ae1fdb371591f7","265a4739974854eb43539419a6c86faab7e161b1133496c62f8bf2725542244d","a1accfaac01020c1b866634f7a698fdd48612caccf305e16844665cb7ecac399","ec00441ae4838b8d595acfe3b2750750e4335802b06ba1f41fb03453c2c776b5","ac1689d264991e5f58deb5a82ee44940f091a709b8ca815b38d5a7cb1305ce9f","a6965d48ee610b134de51099ead16d6392545911b1be22a80333cc4ff3be912f","c548226db013facd262a4bc1c32c44a13eda7e1181aa6f569f9bdd531c95b0d5","208c6a8bd5529257694b07dc1f8ed085c89bd5e18134de61da4e95a1ec896461","543f461070fbd4b33bd05a5ba3e472e1297bb1db3c3101092bd69bfdddd3b1a1","8aa0740691fc5b898cc04641c3ecc589c297ac27337c3b8ec053f4f4cb11c253","32e0cd3a65bd475e955272ba0cc0fbaceac58de169baec25b3bb3f81234f6d4a","a73ba7d094b61e88566e3577166f63389a945f209a3ec20c6a151545f0d7544d","3745762b83e5d49983a4183821125e3417473f992c4bf1d6dd6cea91efb4166f","ade458e350eda79fa74ecb678d9c51cc17f592d56df3e47286ef28e71401a989","178ac9279c9101b9934ed75add06c199e69db64c610f5166c067da88899a3487","c1e3ec3c36609fe038069a4495d766c7d06632414b0f378e5c1cfb12968944e9","f1f09a4d4980fff269ef55be9859a8fdaf952d58ea6fd412d2c466136ca5a07d","934f0684c43ef4a99dcdb7681355e76059f1fcb1019a3a556be1831353ab8179","444b53f5769d9b2c284316f1b1fbaed64a75b0ccb6c3953861a9eaa3e38c5ed9","437dc010bb4d4825b745ef251582ead265e9ec29d9bb5abc83d7100320c91e2b","3dd3a106a9b038c53f8e16bdf8ea1b04f2236d576f982e91b59c9d0b22877eb0","4359e8ba73374bb7d25c0d4181c4e9f9fd6174569897788596feac600ec69639","9afe9aff95bec9e834df862ce3cdbc549e0afe6f1a31310b63ab064be70348d3","d97e64dedeab76eb7a9039b6747dc48f44214960dd9022e0628530fbde8285c8","65f79d78834cd203de808145cf102708e56a695d182713db6905da83c549b208","8aa0114b613291e78cb972962b83492aed92807fad0a316428258758952f7369","732626ef320f7860bb8fc30b2137591fae02f261e940e3ad9eb7bb89ae4aac4a","39a1119b0bc182c5ddbc82f945e18e944c898c95628d3294662c207d28b018ca","ea6af8604356c23c42ac3ac436f6b0d8300142e0f64573f8c3f67f259b8786cb","4d520fef6ce674f1cc21c5cd524e02d9ad45cd59051090b5d9a4986a36d41d2c","c2b976310a797531e7b098d4c615d36e68cf849f904bce95a40e1fc1f1e2fdb1","6f14716917febc7a93f63ac62494de23cf570e3811c18dbdb0d64e94298c0e81","5d6592cc5addc8b377ec8d0d057d398c1700dbeb6aa396696c3f0a16f519a3b1","1e774d917cbcd6f30689580285fbbe91c5466504033970dddfa1aa54eb1bddd6","66181539572954871da89df777217a2feb17640a32c993fd25f9a004ff4bd1b2","8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","0589c85b507c2b90458bf7f87c2aebb0879a251fa119f2464350113d93113a32","8820d4b6f3277e897854b14519e56fea0877b0c22d33815081d0ac42c758b75c","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"d32f90e6cf32e99c86009b5f79fa50bc750fe54e17137d9bb029c377a2822ee2","affectsGlobalScope":true},"71b4526fb5932511db801d844180291cbe1d74985ef0994b6e2347b7a9b39e10",{"version":"625b214f6ef885f37e5e38180897227075f4df11e7ac8f89d8c5f12457a791b2","affectsGlobalScope":true},"5d43adfdfaeebcf67b08e28eec221b0898ca55fe3cfdcbce2b571d6bdb0fa6f4","8fe65c60df7504b1bcbaec2a088a2bff5d7b368dc0a7966d0dbe8f1c8939c146",{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true},"9e390110944981c9428647e2aa14fcffafe99cfe87b15f5e805203f0a4ab0153","e2d8f78894fd5164be13866c76774c43c90ca09d139062665d9be8676989ea5e","76f3fbf450d6a290f6dfc4b255d845e3d3983ebe97d355b1549d3ef324389d4b","5c8bd6a332f932c7f7374b95d3cb4f37b3851c0a9ab58a9133944588b14d2675","0434286811d0ec5b4d828aff611fdf86e33d46dd6419f3df9ed92c644d92a14d","9113b9f010e6bf1ff940e1742fd733d66a3d4b020f14800b8d632a9f61a0dc01","2c5517a55ec36c37320f3202e87905bded4d9625b8e30b779c9ba635df599430",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"32a7b6e7275912b8fbb8c143ff4eeb92b72f83155b48988c30761d69ffeb60f7","affectsGlobalScope":true},"2fb37a76de96cabd401e61bbdd4016799fc24585f96f494bfccb63825ed3fea6","c9cf880485dd30cda73200d52fe126accab426bbb21dc6d3fcdf8541265675c1","cb0cda9e99405f1b8118d46f9535e8f9681bb47c9f83bb3ceb80e99af4d93fee","1bedee1d03d259bf856a1c8cd7c183f1eea9a905f5b02978ecfa47161e597602","5262206d8fe3089bbd1a076cea3da9c9ef6a340e5fa4059c392d400c1964b679","47a0fda775c89671a3705ce925a837cf12b5268bf4ee46a129e12344791c17b6",{"version":"d0a454adb7d0ce354a8c145ef6245d81e2b717fe6908142522eafc2661229e75","affectsGlobalScope":true},"6467de6d1b3c0f03867347567d2d4c33fbea7a572082203149b2c2a591fea13f","4de63c30726b2c653278d8432f5b28cd8ac2afd112dd2f9b025b9bec70d53655","9aff938f442b8e8d5fc5e78c79fed33db2149a3428518519a5fc4d1b7d269d62",{"version":"e626f299569eefa361164975aae1df5e43d2f1b4fde2dc73f882920c6c8db51c","affectsGlobalScope":true},{"version":"087686bf5f9ed81b703f92a2e0544ed494dac0da42aba0ec517f8ffd8352da8b","affectsGlobalScope":true},"bfe95d6a23ba0bc20a0cde03b53d4530ba2bc7f98a92da6ef36bb3ed8ee1a8ab","61e02d13e598146b83a754e285b186da796ff1372893fa64ee1f939284958a07","9b974e1a1d5df0df99045d82407704e5e9ff0e66f497ae4fed5a3a091d46fbea","0db6e6dc5e6caad7389b6287f74e62c0e7fe3dd5b6cd39de0c62907fffbd0576","4e1e712f478183a6a3ff8937a22557d6327e403d7467bfb6b3372c11d82cb76f","24f824ad358f6799e6a2409e248ede18652cae6ce124e9fd41faf13d7a0a1324","f59166827125fba0699710f461c206a25889636c23e2c1383b3053010717ca24","e94f2232bbd613dfaa65c586fe6911734cabc679670e5915b374bec69a716c36","4b73a5ad969173b5ab7047023e477eed5faee5aabb768439b75cee6e9d0b03a2","6d581bc758d3f4c35052d87f6f40c9a4c87f1906ce80de842ce1ef4df17f5b97",{"version":"a54ee34c2cc03ec4bbf0c9b10a08b9f909a21b3314f90a743de7b12b85867cef","affectsGlobalScope":true},{"version":"da89bfd4e3191339bb141434d8e714039617939fa7fc92b3924c288d053ec804","affectsGlobalScope":true},"b860ef7c7864bc87e8e0ebbf1cc6e51a6733926c017f8282e595490495a3f0eb","d3295359ae7abb41a1781105fefb501065ae81d4957ce539b8e513d0ac720c1d","b8e1cba3aedc0673796772a9c30b1343a0f188454b48ddf507b56e0fccbcb7a8","18af2140d025adf83a9a2933c245b4c95f822020e7fedb02c92592e72dfae12a",{"version":"66d3421e032f6fb8474f31e7ff0d54994dea1ff736d4303d24ea67240116f806","affectsGlobalScope":true},{"version":"803daee46683593a3cfd2949bed70bb21b4e36adcaa3d3b43ffd036ed361f832","affectsGlobalScope":true},"b76a0cbccf8d46bfbdf34f20af3de072b613813327e7eea74a5f9bdd55bb683a","6d4161785afef5bbfa5ffb4e607fcb2594b6e8dcbc40557f01ae22b3f67a4b72","30a211c426e095de60924262e4e43455ee7c88975aba4136eced97ee0de9b22d",{"version":"31a3c2c16b0d7e45f15c13648e22635bc873068a1cc1c36a2b4894711587202a","affectsGlobalScope":true},"9a6a91f0cd6a2bd8635bb68c4ae38e3602d4064c9fb74617e7094ae3bf5fe7c2",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"13e851ee5f3dad116583e14e9d3f4aaf231194bbb6f4b969dc7446ae98a3fa73","25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","54cb85a47d760da1c13c00add10d26b5118280d44d58e6908d8e89abbd9d7725","3e4825171442666d31c845aeb47fcd34b62e14041bb353ae2b874285d78482aa","adda9e3915c6bf15e360356a41d950881a51dbe44f9a6088155836b040820663","4bbbb97e15ac9616ba78725207dbb9a9d9438b8bfa184b65d70112b30ca516ad","e9775e97ac4877aebf963a0289c81abe76d1ec9a2a7778dbe637e5151f25c5f3","4ab9bb609bdc749cf48b9bd03b3ab8b10d188778ba01ae4bb09b88ec9b3ced5b","cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","db3435f3525cd785bf21ec6769bf8da7e8a776be1a99e2e7efb5f244a2ef5fee","c3b170c45fc031db31f782e612adf7314b167e60439d304b49e704010e7bafe5","40383ebef22b943d503c6ce2cb2e060282936b952a01bea5f9f493d5fb487cc7","80ad053918e96087d9da8d092ff9f90520c9fc199c8bfd9340266dd8f38f364e","3a84b7cb891141824bd00ef8a50b6a44596aded4075da937f180c90e362fe5f6","13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","33203609eba548914dc83ddf6cadbc0bcb6e8ef89f6d648ca0908ae887f9fcc5","0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","9f0a92164925aa37d4a5d9dd3e0134cff8177208dba55fd2310cd74beea40ee2","8bfdb79bf1a9d435ec48d9372dc93291161f152c0865b81fc0b2694aedb4578d","2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","d32275be3546f252e3ad33976caf8c5e842c09cb87d468cb40d5f4cf092d1acc","9d2ebbab3db7e91d5c2eee84685f083e7e4c08df5f2f4b1df2f55f645983b751","563c49c59847cdbf39108068231e69932331db111acff12f2b5ccab08a94dd95","05419d274f3373853310c682cff36ca90b639a14df8da81a4cf3e895a692e13b","22541b27029a6423c74638d6345e54c8043de53dcc40afd84397cda21dbf027f","dfdc3f121baa4b8cea4d7bfb72351fcc18a50f75330970aa78ac1062fa50b488","908688711bb3d64b3b2d13a8ec63b266a13e942cf45bbc6ecd6d7aeeedd08dd2","2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","82937cfc984c10b156da863cc1ebe430101415462201a57cb4d351bd20699614","b230d46d743e02fd801601d3e067298edf85ced719d0e0096d2aae41429f8f6a","cc0fbc17a1835491d5fa9aa9188623284d4e30fbc9ce30dfef79f885abf82ff8","bd7b73ef8ed8db3f3e753776d89d5965d4bfad0cccbd92924a6477411f9489e4","f28f7beacd5e1269416d9f28db2dc404e6f9023738147bde854d9520c44ec521","2fc88dcd2de7a2e0e069143a76682f88932b67ed6549f2edf69f1669e9da7b03","8821c83b8a433f579d99436ddb086aab26246a827bc13bda9075de38dedb2ec1","c9898566516c6526f86ca7adb8d62fdc1159ab62631677fe11c9d6864f0979d4","ef502252aa85c97b518577112f69e66df9e08063a5d02a055ab33b64374f429f","cf840ecf6d5e70ac184ed2db77b76ddcc90a2671a10e445009dcf46bbf2d3b62","4d584f14a8acbd8d3510af032bbce047c32873335cc87e10e78b21f909f1a370","5b1514ad67218d9deb1c8398da279d09bec34a5ccc15573ceb38f2f0fdce92f3","8b5f7fab5baef0db5c6d2326ae6e680a26cac9bde3cf7be20684870d29126f4b","f8773770763a34494c9d8a510f27b67ff5570e74fd6f4fa3c8688cef0017d204","7d194ef85fc529c41556658bb2132d059b901cf2d784669a2de5142665841e1e","c383274aff5d92b92e57ca00563ceeb40cd0fc5678152b5c31241e5082a092d1","f5f1aa46103fed9d50a2786a77374846562dba264a8f1d056e96e798281a4a65","c03f6401f9fc9bd9038c1127377cbef25697116a3b95c0f28ec296076cd0fed5","79ef7f117d939b7487dc1c29a69ef299e72018d3878b3228c169ad9aa3b8e747","ed36312a1e44ee77321878fef2a2101a707278fe764066f1075dc2749aa6656c","0c5c15c6fa329c0c3020d2b9bfd4626a372baedb0f943c5f8b5731fab802da4e","467743fe014ba642d20c5bf9e682284edd096567f62107aa64331f90650cbcec","3e178e4537115d8063f10f556d9b9724038de1ba4a512806c2bbb3ca68bb94d3","d923700737f7180403be93555783948ec30d171e0124746bea7142599aa83787","4760a9dbdcca42f8204b675c29e1ed57b22abb32c2aa4fc980c683a393bdf0d2","b4418cedae688f689c9b619faeb54a3b8aa873801e863041b9d9a825891c4ca5","1c87fd04f1ddde27d5b96c578bfaae540f63d6fa22d091c58748abe8bb9178b7","9ac59ceeae663ead785450e35318e7b3f5a78eb6af74bbea13416f0a4822cb88","11f0dedc730412dc58116712841edd5ef6846c26db94667ec71c9c781ee534f3","af7cde9b4f90d28a98b7734e72b557daef5b9ee3add771485604891e36337f30","5e91532e7e72c5069d3ae92967913af1e24a091929176ca557ababaa25728587","e552130d7d49731d16365b4d0b52bc3490c280e946b702403648e3c4d4ebfa3b","6f0d9487ac57f96240e4e3f6fd077787b77e2ccf3940d18fe7f6ae8030579423","f5766bb7d01e7fa1a97282001ec5c6b28bcd18ed36583739a9a4877e4f7f7439","4a5e8214b13c280003205cffba46814ecd773cc19b9b1722076f546208bc691a","d01fa7e8b57175358ee691e2b29be1bd716c72f4460e0ce0f8e1583e205738cc","8c866e9decca6bfd850ea9bd4aa078d4705ab3011d6414e8d66ed337266d00a5","11fa4d7f3c5f38f47a6cd88d6be4aa619fc2562f9fc37f21f04eed06f344a92f","31318598eec147c123ff7dd75056b3097421d83de2358ba45cd5ebe039065f47","41682402ed20d243a756012f952c399fcb60870acd17652521a4298fd4507343","32b8322b9746df307e26ef49edbdc59c3203db44b3f53996a5fe53ad08e930ae","73b1384eea66f24ad6ed0308254e73a11d33b3e3bc561cb7c46553af550a9be9","cd4dfb8a0470cdfab8d084b917d599b8c24a829fe517d306f306ca736d3f1411","a8d9294c9ac558dacf5049e4affd8dc68c55ce881543c1b74fdd06d9bd2407d0","13876cb9c05af8df22376541ade85c77c568469dfe6ca2dfa100c3269b5d391a",{"version":"84af2cc87aefbfa3b99a433c449c5a9b9b0a06934ce24ef7134f785fe23d040c","affectsGlobalScope":true},"f71726378696d602921499cca2e9417a534e79a151a47ce6a8a2a4e3cf376bd9","017524481107a062d0d25510ee37db024c4007f9718c1e8ebfc462e1f3e6546b","a243529890213a40dba60a173613d435605ece18366734f1c8950826d0cd6f8a","768f877b5385cec9851e0e89c5d64362fbad39a1a253f925f5c77c8f900a8f51","e6905e7e8ed08d1ec5281218945f3081a5c90a18b320e790a2bfb1a4e78b7d6b","4c7e19c05a70a19be8881e716f14a435a59a016d17f9635c939be054a2cc9cc4","408058b1a24ee5c152ad9de60da0d69126944ba600db58bb85bc0448a2665c2a","24a98852c1b14518a6c51d31e6144bdca39f5c6f342b5d46e08d1d5f1da1891d","fab5f194cabbebdd463144b4d33d539eb954f3d3345d2d5cf9fad07b808e02ee","5532184237610eb3389e5104910485027ee40ddaadb953ddd9d9c6e45deff803","50b634b88fbb241630b6870ff11419a075b3c920ae90589f6067c645d623f117","c48bcf82ff24005d0c56ce9cdff2bb477eeb0ab86d67599311aba08e5e354bcd","aaf88a98e2c1cb993cc5c6c3f980c033ce7bd807abaec0d0ba148d67f949a4ef","c23afa79fca92996dfa3be4cb5554a6e5477b3b0a7e18df2ea022736dc11d679","b22a2cd198aafc157f0b70a534b4f653c70dae2d20f71c1fcd0bbe4677ba963c","5baf9264ce09ea2c0a08b963048fe3c6f433f81dfa1f9ba7a994b3b597893764","7ac0d3ec06b6c0e6f702913ae0023146d90cf53a3364f680995758344b54b131","41f780c89746e1a766c3cb07acf85f7973da0a4ba65a0915a010c0293a93c805","eb16becc814ddf1eeb3bf1e362f3263fc9423357a627e021e3afc9414d026320","12115eed900169e5e825eafeb18223e47b3b80451c04442e98da8d0721502d8b","32afc6399293b6f02842c4d4adba5bae6bab865bba3c68bfb10df06f11132e96","9dd0be6847539f9312c6335e1ecf11bac36e7347d0bda10c7d7806da4f5a792c","82c8fdfc03111f79358952b203bb59abe057029f38532bc73e87fc22bdabd23e","2234a49d2763c055d2e6ed841023d509d73a229ddb7351c3a0017bf69c376eae","f9c73aec9bd3a6c44f1221f5d9085b76537afdcaa0897b56d4ab49d88071a5aa","2b9fbe6c3d3c085b39925abd2b94655ddfe42b4d52a4f0127b8f728012e99d51","f3e7892784b7d862ec0a3534c7c87048b9c1ec30aed3cd6255f817b528b38691","6b46bd4dac0e20cc9e2eb0f93d7829eb67b533a845d4f62d27e1bbe6e94f7ff8","af8cde857b81f490a92effd7deca1bbd78d81c08eb63bb3fba583584130df179","306987f768b1d0d7192f32a135f0a5d53861727a553bd42a4e732807713fe3da","189bbb0a23d5c57f849e404c36aa3a603b16553f340196ae20a753fcaba601be","82cd967332d8e634bf0afd2b54e83e66f6e7d55babddb01be7ae9342c468bf50","3b7a203d858cf431ad25be9444eff8caea38a3f9217a5246c5059ca778c79f3f","7d14db3cdaf95ec9314c180b09c6841d2a4b5da3a4df65da97e82312d6a2c08b","8cc5ec98834e269593432f9364bf7d3ea652257d0b95b1f169fc1b3adda92dec","f5716c136d06197a89ed7815d847e97c852d3fd6d7b975f9ca8676acf83de80f","a8fb711637931a801a85fa2fbeac3746c3d3495cdf954c5f1b7c730509e8f23e","b90bae887672f987e2550f5c0a75f3e0bc4e2db72917dc9c947fad2e2fea9438","ab134215a78be7b46c2206680655e17747067a44e4b3c571a8f1f4f982d7b9ad","a1e60762cc468372f0ea129db7152f900c727521ca43ff1cf8ba5eebad5f34eb","e57bf02f3df6f2e435f8685702313a1edd5396d05bda3e3d9408aed34cc7ecf4","7791eb2710bb3cc6983976b5fff8dc45e9db9f725cca4995ee8643d4f653879b","8ea585e971742e88f80c93ed4b8f707b587d4ceab5a8424d0ae5eac3a8acc7cd","6741c809d30d16f9432cd149c6907a4c0592f9a346fb265dc24819246131a727","b1516c388f578f769567d8e250b7110bfe94b5b258f8773b0c3c8ccb16dbce21","8432bba6020d451a04008cb5fb9d23b03d462b5cf7036a90442d958400562973","8b90141e4a66785bd276bd946b8f6ced3ab4408216a4725fbe2a4ddbc2ef1211","cc662138b5ba43c6641faeaa626820e0c46670d820b835c9a389f35d18b83447","623840eb6056ac0d20a1de30e98878f8e48e5a63b670c95d73b207ccb59ba55d","b517d07aaf61bf9eb74bbc9b09070f1e86f86a6acd84f2915f2281dc87358aea","ab41efac852fa38a4a6053f0e344d0dbb89b68ec7899080ce37bfa10756a337c","25e03f36c96d573aabe11220155ab76812e79c62071f547c852b50bdb7e323fa","8cba2ff4da2093a48c51c3ac4398dfcc31a309338bed4ebf98082cc359df358e","d1670058ccefc69ec8d9a62dc03ec7ae039f7861ac18789d33facdd558352191","e0eae056c5801ee2c2747d4ae461c5e89876194043716aa3a0c6a32ef9899a57","3f9f27c6d3c0993cb5e7aaf4693ec6efe8577c7f217182c2e7d5cee233ca0ed2","2cf5ff16ea0a7c9ae86ee80ed04669d4c1e2f0914fc1abe0cce1fba54051338e","9eee6867f2c7af4e256e41193a28ed403a00748c9f2a7662b6d1aebc5606ddd1","90b779121eb1bc53156821f7d97e3de119ae9c700de5dfb225d6f29cdf4283c4","42bcf3dab68b68b1ca54224cd9de721fe1475535ccdb592eaec473612365eadf","6188c7c509ab2eaeb6c40cdee5b64110ec69ba9815c6f9f848b9d7f3b082fe78","64e2f9ba1910dc0066c41c2ac3a3adcd2c29f99851ee084113fbddecc6f5a7aa","aaaac5cc177703d23916e4f2295cf444fcdacc1f38e342db66fd38080086604c","7735c9f3d1fa53aa06fbaa983c5387c24b96d7e7abb78ee687c71e18eb43858f","7644ce9315a67a97815fffc9d66707d5336b083cbffdebf3eba1765ae6c74afc","4bf953a9b4fa510a0fbf27207d6fa5b1f675ab2df46977bd0d0a4459aded5af7","427b1f81a245e2ab19754420b8a1cc0092cf5400ab613fa3a7375ff2f6ef2447","cdba5e983e392fdfec41f034cc5fca8db9861b2a906c0c418a9b8671f46f3cfd","54d8f8a65ab5d1c2929570b0bb501044723d88bfa1c285e3735ea5598edd83dc","ded58f8c97f3162d5bf076aff04919ac883da12208a079f9fc729279d05a7cf2","553d58d2aff78ddecb9d4e5410e5bded226e3b85d53825c2eee80d166e802794","0c96008f38d5b1b8eb7efdcbbf04c1ecf8fca3ff3554913493bd677ec20b1c02","6f882b38ee30c236bcfbedd5b5ba04fd78753b225b336ed502a3ad4e8e3eabc0","0e61ab0c786c3e3825af3c359208f682aab24f72294497d92afea0bd6652ac35","9d497f652c0f211887dd999beb5746c0b9eb22fd8f8bf765fa45f2c3685e392c","7a372c09d1c890fbd7d5ab3cc46517f8f925cf4bc502ffaad71f8c9fc0d45919","4aa383f89f5bc9bc60eeec8ba2f37b48c6a1387617da1048c890031c15da1ae5","4d38b1dcb6d3694fef5d95376ee6ef0746a840a38b97f15b238852c6be67e5f5","250762971406833cc8a85baff42a1aa09be5da14dccaa67125517c8c169d60e1","e96dc917d49c213d8ddb9eb28e5c9d1dbde2555ce565fbbb7556051deb4287c8","fdd6d3d08c7080b235f4da91e41e62ed7c07d70d9acaae3d24c19eee84ea6581","7ce8f816bee2239db361b24d4bc89b54e24da282d5dce8c10a23d7df9d5644d2","c2ce626bef288a2dac2f575256ee4d269fdad19c0103454066c48bb9b434ac97","98774f7b41f55df6f3f6af7fbc425317931ea33b84df24b84c207f002067de59","f22b4d98b56749f50b8ea7a35971b6926670875ddebadc79cef00abe5810d782","83ca78ca5b4fbc9432a0343a41958876441659c2237853d7032a9d644f495577","7e43a22e382b203dd84409c50e5c1396378e6d42a1dcfd9532ff4f6d43da1477","0b3993d8c241af76f1f1d20eb143d79d65ec6769e2c70e461bdbc34316870e94","b23ad15512239fda5e06eb5eb80b9e00b88034729f720dc64dc40c9fd680aa8e","be200fd8a75d4b96715e099d724098c488b5504640f5c680cdcbedf789eea5be","e180560e900c9b7b3f40505632447f52ef260286f6715353d86cf87685f223fc","9a8a6389db706e0ac3c89d3ef5028da7a009cfde8813217b1d0695e038e331d3","4d2d03c1121f879339275904b6f04296ec7f9c0d0cfa854d2647d6ef26fb6200","d5e1c73a3d9699565ae5e8055120ec53eda7135f005dacaf0e28fc03e2d5a7fb","e1196c39082ba949f8e00ebd3d91d44285dff30e4f0393bd373b2aa9ceb4424e","7ee3dc5f71302600464552f84bdb4e17a7f0af2cd1510e3ed4d414ffcc467fc7","0935b9ac6b39f3dd9c9ab433506e4277daa0f437da2af80c32fcd960e75711bb","d913dc9e6f8870cda092d8f22ab2f24ab4ddbc2cc352f628ef0f407a731bec1c","c24ee68b66589c7799d741af43277b891e17e9788b861c4c79db2686f32925d2","e2db30053869251ac17a718cf1b961f973986574b3cc895b042d7e2e8daa0e70","2f7de9471db77e2f0194d6bb3d11a57a8b42631cad7ef6c1493bff695ad4369e","abf68863e1e09b9f930d94db1897b99a6f0327ff4036da0ddcc1862a30718fc8","9f0afa5781a7779b10997f40dffd942d812629fb9b03289752824d1c04a402bf","ac6396452ee659faab18f81e1f96b9de7d039b982f29ba6f2c704ca9fb6f3692","8fb9c6d67fe4bb49bfb006af70129e78dc27d4c0e817e8ee5c8639a4edd5af53","d17b75f4e48f362c6516a0e702d1b9f520d116efd6169d2c167b05abcbb132c4","1cc4726f7e38aa6931bb9982920053bf46f6ecb8ac16abed9d2681f4774e7a53","0d0dac9b34b8dce387a57ce638b34635bb2ab10a60718b5c6a6f624f45d4feac","35e517b4c7763bd8401078a370e20c019afae0e22bb4d4eac709c1752dedd631","55edbba39e0409eba9872fbd68c80f978b1e77c11df5c98a443bd7ae62438682","a9a0b5d14eecf930f4074b3319de403f1fc9cff06c6632109a1f153a24b02e68","a2fe8bf9b03972d1666af2752a533a514926917a6a1520348eea3034475fb5a1","aaee732ece8492fe52859174418806262441b950a241ed627dd71a679f262d25","051e0f02bea1c69d383d86d22e1264131dfca5df741ee23f8e353942cad4728a","7ad648879e59d89e4d2ac2539fd155ca32470fb1184f8e011acc8e9aefc37d60","01e47e35f50848c4b51cb5390bcfb52654342b9f30a686ca28b45044c9fbd0e5","ead16393534a93d876e1947aaf5edda414e12d172b6f36e5c3018323ce1beb34","32ecfe968407bbbad8cf1c0d9b92467a93b6e98a7a135ff87c6b57f5e6138cec","78058b4bb5b052718f6794d96b9207df1e4fbc361c36bf97d46ac628fc19a932","925b88dacd32f828d70b5090891b1893d15c26cb30fbb041dbd5352c5301618d","221398efde5901c7e6bdfe3b400bb3e96997f99a767064c69cc0a7d770963fab","0339d33fe49fbc1c70842c886195e01eafd37f7431dd7f32209dd0544c289474","35855ea1dd13580e3a3f4ada5c25395c4977c62b93fd5116411e7b9dff32d7ce","bcbbdc1b43848a14ae6853aff36f1837718712f8064a60c83cb2773a27e3e557","afa5db70e37d887a78c83a3fe3b097362c73cbba790eae0961e588d73d3766c8","cc1b50b9b8774baec7e485e39e907e5426ba8e1a3e6c3d76578b76ba64c6c8d0",{"version":"6ae9828e3ccf4eb8549bc4f38f37b3bbbff3d66664b24552c4cec71756e7ccbe","affectsGlobalScope":true},"5cf5ca4ac2a1137899d82f498490704b0bdc685f257288281465b90387480b71","3b251e4edc903f60ab560be43d72840f58a5bb6f6b297a78147436b6dba0bf51","b8249aec06337670b5835ed8cd907fc478a9e4081a150d4c554d14c8224a85a9","927cbe428dff22c4f30d3f10e83b0888c1d31e94e59cc99d86571032a3f1ca25","926f32577cb84640d406ebc29efbaa6f1eff20d93ab595b0dd963cf1b9128311","1317898e781d65ec2f952659ec569883fd5c8c13fc46754114c3f1330f4399d8","fd9d67d7d7cbbcf3cee6cb2abe2f17597502ddfb54c7225c3ae1d76d8ea6e2ee","1def7345d072569461d4ec7a9d22a4ecb294f080d68ad5792dfda31fbaa7e1f3","35848644a877c749ba465fe07b67b2d00d579a24c0d5fc3577f95d53d5be2960","0cc50eb615570f23d29bddb4c85c8a2dfec16252244a86cfdea2d2b2ce38d11b","4ce8f30caf02eb00b7a9492b684bd2372b06ed73dc48876e35743ebf9d7b9c19","df619b8c146f745687c435b8d81dd23f29bddfe5742cc8ad22c5041bbf91dac0","3130b5cfd6ca1dd1fc329d71eb8fd2eeb2bed14bdcd9a29adcecb63d6adb24b1","aa1c6517bfd85495cd39b163fadbb9dd7c9a0f53332c9e80cc25f891de977269","9a30407da46d2859a7e600ac6767df7621718f69a5bf5564a7d60833535c4f20","cca7fb765c9d543f1b1a8704e13717b0fd698801feb53a626a991d468c2ced9d","f967724c16fb47d360ad8fa1cedeacc045bd4b199535a3adcc85a1216b045ab8","448ae408883377930fb80d69635f949f3425c0f32c49c5656c73f8a6ae90d702",{"version":"d8cfb45595508066bb39be784b85db453652b41f54a1708b89d9c6806d2a453f","affectsGlobalScope":true},"f33a51a19bf72032dbcade966413719eecc32d79372e0df63f92ab031ef80bff","de32a822c7047b24981950b705439c9fb271994eaf115cce9e36bb9dfc15f409","5027cfc08ef5cbf2c0b29352daf29ca68c9cd5ceb28705ca697b7e653fe47ff9","95cf728f5c5063aacd9eb2352e1177877985912c2f727523ecc23c13d7e06ffb","dfe870eb510053665151c0d6c5cfc17c19098e561bfba688695c14c6318df0a8","ead587f25c31fd4d4df47c7fa9bc16a46ade601e160655326163ad937e8f6177","e13f51cb8c1cb630c30efc8800ef4bf13f05665da49d05af4dfabae337b88579","728333bf6d8e9b5b9b3c798d841f3316d3c6cb268c54ed2dc4d85ebaf2af7d27","109f1f3ef25b1074a1053fa9b5a093ffb8bc3d645660475cbcd605872341c8b1","3c06d158c1c97521559412e6e9010b351cd92815f824122db50775d29ba50694","f245ba14336a55c277b17acbf7210144129b4385b8d98b39a8cc0a1a6734f5eb","29b3a29af6c2f9bde2d616af935a0477f79682ed2b50cacf8e2c9a4f8532ea6a","566c66bf8088eadf5d262b48925581b65a7df254acd5fc1ff170f5c55c705dd2","a01d3ba665d6babed5d61a2a51fa6f37a2948b48212bc5b1072c1bcb35d283a5","cd36cef78862ce79057bee7a2186d43bf92fd3af3abaf687fe1777d4a0d71716","958860a8c9900f84c384b7ea3a2e96168336ddb91cf2563192ec0a4bcfe658b7","428fc53d8e74b339638b7d5fd91da60ee6a87e00382ed7eed8e3fbe0a54b0179","1eb28d968573a4653a1dec517a57331abff3387380ddaadd9a3dc3908f41afad","547c10848c3abf98e1872bd8f2456d19d6d28c268d4e8e213890519180089c16","7eb700d8e136b621b7939997e4602c4c69d8bbce5eee10b77313254d55bc871a","1318a93395d929923a2012f960e482c1cf1bfaa0c0f9594d4619f584c5f7a7a0","4ab72dd77fd80332cc114134f08f809ff6de0ad72a212ef80c9f299cda033013","70ee23a9da74462de4ccf53c35a3d83bc5f821b3eb958433cd42bc096bab5ee6","f6dad5225c287608c42022292254ca57c318a726bcb60fed8fde72ed611fe046","7a262bcd06b7d9faf605d1287ee7619bb190e84142fbc57b3b6e45daa15f67a7","c2c72951a6d8f4f32b93712ca76d1fd3bb950178a0a15277fdc65b419add486c","017573b81e29beeb9071f4d910c1857e1979a0d8c9fb382c3aebe00cba08fcfb","99dd7f00e3e3d4cd8803ecc6a4481c3bad8f3b09b34adb612e54b540db7fc0b7","c1fc743d6108b35abb03e3a9343fadb778a3fb8166a07adac70687a3b8b30218","717ae12547707f79d41fb095031a4f31c4336f85976bff898270c97253736de4","f3670d5dd5f207ebabfcac7f26f66e6d17fca94b70846b82c31c136bb4c1aa0a","ba868b5dfe54e249835e97296c07a21953c03b3ca0b5bff6e579ca5ca84800b5","e4308db1dafce535eb2542ba5742c69ec525dacd437213bf776c6e48b3012c14","67933f8f432778c751f9165b84640ba9093adbf7de46e71d7c492698b864b491","4fe80f12b1d5189384a219095c2eabadbb389c2d3703aae7c5376dbaa56061df","9d9f4da63084ac107eddda8b4ea92d7ee443e0c86601e8c844943b82fd3ef6f8","46725a07ceed57b97d3aa1d9fca8712bcaf3e97b72cdb8c2534c52fa7a03ed2e","ca7fd49348e73550b18c5dfeeb55d9f81af7f58c7528592c574209acffd8d4dd","0c0b17bc0f86dec66c1b96e9939f3c5a4162532809372dd8079e5ff1c43a1e42","75cb53ce72c70380f5ddff8f736dad3d7f49e5ecda6c0089c8840c1cf228d9d6","b01f67e771fa0dfb333a619457db6426ff15ee0f1af04dbd7cebbcc53887b9be","e6affbdaef7b26480addadacdefb0ceadcdc9a82ea69f366aeaa4994abc47e87","abc70d5f043a6d0912eaa4ec0b2bc87efc48c5b8fdcc958f32d1e5d0b3c06fbe","2f3dfe2ef8acea5b01de4e2471941855768dcd8ed31061444fad51c5cdf77507","b97cc1db771cf580d56411fe9221b23f313e9b0d559e5bcf311b8ceccae6f397","d79c28cab8fa9532bee9445c3c36df4835627a0189f714cf857b89024c1c71eb","7a359c9e377fa2dab569bf157300b8122b39d63ecee9960b16513eebe134b166","5da2838cdf127ca84f303bb2320abf7e7acb49c480d12b44b54db8050f68a4fe","9fc4791778c55a530282a1ff18985a72b1793e0cb5732cd383f2c526ce7517f8","2b29001851257d58c5238f6e731855bb428afb04577558e07b98aaff24cc078b","fcbbf9046aaa78ad01c928a4aacface5a3f5b72943b7a6348f9b872853449bda","ec84a335ab5b7558af97f6dc9c0bbbe4e7d5688369becb12cb907ba909fb1758","a87162e47afac288eb7e8513a26d04aad44d4811c5dfcac60729d21cc0d33ba2","92af475db47361a5c2bbce98d666735f45abc69bfef0193850ad4f8a211de545","d6820e5631ef1c9ee05669f84074ddaf53dc824c50d5b16fda4c8182937532df","de3367f8a20cddb78a9405a7c8836c6e9c1c66d1c585e3aea1fa75237df73df6","edb2e52736ee05033f2aed91aaaf4e931d505282bf21a683cd2487f81e428245","6e2b41167b56dd9ee05abf782ac4ab36544e2ffd4cd4e265726dc8a3c1a7974f","0339d33fe49fbc1c70842c886195e01eafd37f7431dd7f32209dd0544c289474","35855ea1dd13580e3a3f4ada5c25395c4977c62b93fd5116411e7b9dff32d7ce","60cd8ff9333079eb7c4b336ec1ecb990bef1e86903b4dc76bd245ed83391857b","95d3fe855d03661b4aac9700a7c2ea90bbb07ec18e0d3f4515721782b34409b1","5efdd065270fac78f42cd41a4324a01618e84c87e2e6538debf0681f76a7bbbd",{"version":"994ea1a800a17dd70c8347a04b4eb4752dfb828597469612df0fd554036a494a","affectsGlobalScope":true},"d73ca92af355ca91d51dd4e91aeb1ded8d6fc7f698a90a6c549f8120975ee7db","3b251e4edc903f60ab560be43d72840f58a5bb6f6b297a78147436b6dba0bf51","437b4f81a7be8c1951cb24db221599cb0f587bfb324ac0174e3291ca7241167f","f058b0597336bf9349e1729bba98df02ecdc905ae0b1edb08563d03118e3883b","d14f3966c579f07b914d3d0ee713ae4ec794dbabc67597f2f781ac4e79693304","5c66dfbb0423690c019843fa4f10865ed16890286db8a7491e1fe383efb8f5ec","d54475d1cb52f925f055ecd1ed89bf691637111d5c6fb775271a53f9e1fb9d42","1def7345d072569461d4ec7a9d22a4ecb294f080d68ad5792dfda31fbaa7e1f3","4a0c81530c9023712cecd0869131ad0dc13c07d5ef91e2b66f4580f6e4633e74","56a83fb07d95794d15c68703d912e0838e81a251b57e86018a4991d7da218003","c1e3f648848633d00db75fdd19ce69e838cb91d355ab5d0d1d41328d1171dab9","861b3b1cea0c4dbfd58cd3cb7a630ea8270b4ce92091941c263f4b4c6c21119b","d012d26ca0148813e455facf1936d8a458a503168083633ab0aba06b0a1e43fc","9e23430406aeb4fbe57179d46cebf0d2877981ffb3e8cdfa36b7879caf190e75","9a30407da46d2859a7e600ac6767df7621718f69a5bf5564a7d60833535c4f20","e649f2e20206419ee5894be46792c899eebdd18dfcb40012e170a6a9ac392414","f967724c16fb47d360ad8fa1cedeacc045bd4b199535a3adcc85a1216b045ab8","448ae408883377930fb80d69635f949f3425c0f32c49c5656c73f8a6ae90d702",{"version":"122ba3db2d07d3b7fa3887501da945d923e742358291adb174e63a400d4b265f","affectsGlobalScope":true},"83354d75b795c88d353696243b803bf42dddcaef030d7f18186670a026d882ab","fd50594b6245378e3c6c097b45f4fc5e17aa2d835e2767176698eabdc76d658e","d05615dadb587d93c681f0bf7e2203b9dd1942ae9d2a3d82601efc2377638aef","e0ed90796761800dbd36ebfd2f71b8662a9e4fa71df83f7e8ea0773957228b02","70973b0c88de0d033e37cd7c9bf29e893acf22311c08a72cd1ba2ac1b5a6e3c4","a8289ec2ba93c5f379219cdd9e07bc9f072449c0bb5d902acd9fa8ceaa8b5aa2","2a75426c666cc5fe15e9c3e911bb1f777dcd9d9a7488150f9252eec6f8ced89a","8500a97e09f21b7ce677ec188557b8ead7f9de6f2d6988e0e3ece9be7d2e309d","c2d47c1628ebc1d3e54b0d33435d0c73eb1050d1b25cec2f2f17b3760a3bad96","d7a7698aa014f7e4a3486262d59e897ae124573ee64e9c78052829561bdca6f5","31735c68adda8be1361c87032f45b13b0145959278ef4e333d9ba4ba48152552","afbe7e2e84e622a7d29017bab5871c306341ff71ceaab31854642fe9a66b3662","51c102fa4fc649394ba0d8afc13d2109cbcb3122b3673dd50a708fe4f95df65a","7b35a34827202f045acc9b59d059f4d569babaf19986fb6eb0331e4038d55c3b","e087ea8aaacd4d1e8e54dc473b0fb67e2a7a6835a2310e309ae994e41a59406d","c46e331d9d38883844484be24a1646644c19762579a90429a3885cc9573adb5b","1a8d643f73d0ab632af081ee95a7b7a49c6f8154037f604fbdcf9317b8e18c35","ffe2bf9f20912922194168517378279ba0247c940ae1dfa704b15c3e1b8fef25","0758103b16b3092fcd4a75c196fd70d60ab7b2c34946776474cfe4f440de89ae","471486ab7c5c95c3df63c0fbebe6871b9535eedff8b582557dfd66fcbf946d5b","b88645280562793af76ab59052d87e4846ac5ef19af054c729fbb87c73481a59","4aed3246962787add7fa61f7680ec835785afe65af70abc7512d892a1a561217","e8a5beb73e49b5a4899f12b21fa436f4088f5c6b22ed3e6718fcdf526539d851","911484710eb1feaf615cb68eb5875cbfb8edab2a032f0e4fe5a7f8b17e3a997c","4b16f3af68c203b4518ce37421fbb64d8e52f3b454796cd62157cfca503b1e08","4fc05cd35f313ea6bc2cd52bfd0d3d1a79c894aeaeffd7c285153cb7d243f19b","29994a97447d10d003957bcc0c9355c272d8cf0f97143eb1ade331676e860945","6865b4ef724cb739f8f1511295f7ce77c52c67ff4af27e07b61471d81de8ecfc","9cddf06f2bc6753a8628670a737754b5c7e93e2cfe982a300a0b43cf98a7d032","3f8e68bd94e82fe4362553aa03030fcf94c381716ce3599d242535b0d9953e49","63e628515ec7017458620e1624c594c9bd76382f606890c8eebf2532bcab3b7c","355d5e2ba58012bc059e347a70aa8b72d18d82f0c3491e9660adaf852648f032","0c543e751bbd130170ed4efdeca5ff681d06a99f70b5d6fe7defad449d08023d","c301dded041994ed4899a7cf08d1d6261a94788da88a4318c1c2338512431a03","236c2990d130b924b4442194bdafefa400fcbd0c125a5e2c3e106a0dbe43eaad","ded3d0fb8ac3980ae7edcc723cc2ad35da1798d52cceff51c92abe320432ceeb","fbb60baf8c207f19aa1131365e57e1c7974a4f7434c1f8d12e13508961fb20ec","00011159f97bde4bdb1913f30ef185e6948b8d7ad022b1f829284dfc78feaabf","ed849d616865076f44a41c87f27698f7cdf230290c44bafc71d7c2bc6919b202","9a0a0af04065ddfecc29d2b090659fce57f46f64c7a04a9ba63835ef2b2d0efa","10297d22a9209a718b9883a384db19249b206a0897e95f2b9afeed3144601cb0","620d6e0143dba8d88239e321315ddfb662283da3ada6b00cbc935d5c2cee4202","34d206f6ba993e601dade2791944bdf742ab0f7a8caccc661106c87438f4f904","05ca49cc7ba9111f6c816ecfadb9305fffeb579840961ee8286cc89749f06ebd","3e46708022cd82fcca46db1e5cc5d6c7656fb3b56c21120ca194adcc6d51e980","2477e58a1b6081ef7aff37a0a323bd229ed8d6c7b9bf703116d574da6b18dc9b","c2135fd01aa4fa323c2817fcf60a13d9dc80e6b706e1165f612ed0d04619db2c","037e682b03a64bfca52c079ac3bbc4468350a88395d1b95e1d9b9989f5b33db5","e6f6bb9b1226af15dc2353f6ac963b35ad80533238dcb43b832bbce67b84f6db","0390f848dcc0122c64e6b3ceb44d0fdcf774b6387a6648f8635445d444920eaf","682dbe95ec15117b96b297998e93e552aaf6aaa2c61d5c80a3967e1342365dcf","7ecc6b194cf318e482396c5072a48cd7486ee0ea20ee12495a1425139c63da81","ef0299cd84cde7478aea9b074060d6226c08785ac2438d345c2100eed6d00f29","827eb54656695635a6e25543f711f0fe86d1083e5e1c0e84f394ffc122bd3ad7","2309cee540edc190aa607149b673b437cb8807f4e8d921bf7f5a50e6aa8d609c","d29310de4f4cb95eb799b2d9c33241620a8e7478d0c6a593b58f81f91bb9d426","11355efc9d63777571e1837d4652afa9f278b88199bb91a34a4d5429990bb942","87f6005fea388478a175e8438f826d6efd4d1d0e0a61aa6e8d41bb1ce7c2f1d6","b88e287856d134eca74672af9a665b3e973e568d7e26b79e68671b0e5f6eb243","5caa9c6c5fae89f648fe0a0009e8efc1c6092b8ade5d0399bac63a42a4fe2d96","d3b67b14560d50cfebc74b6709b5e826562c5de0d2a3a3cd1cfd4d4452c8a827","624b9fe6138de1e6f8fcbd06d98bddbe38a3767b679a695803897e9e2a7e3681","22f1f9bf02140cf1cf1ed45180678413c92c64b1ec472269b2012362ee6d1b20","b67744cd9afab4cf6e395708860294d0c5e8626f04cb18b6812d8bfcb4b8b776","2cca2c2c97f0b38de79eb7bbd81bf0cfe957639b0b674e2154b0cda2a896ce65","9f2de3cbe4fd0a83cb3652b44acbf32f95ec3c70ca69844f77a71ef2203b8d6a","28c447b027fe576647e8740f69ab0edb89da35a964e89b2d240961fa574150b7","01fc8936d43f51c4c1e3c531805accd389edb0d873a822000c4b2a411d9ba6e7","397b46c6a95826d26714b5481addc606de72d8229b092e236f0d78a9e7226d29","bca49ca4673e7865583f42dc504f8608248582de9840a236613896b5a56c8b4b","617891438559a97ae02a795d529a25acf128744cf1e150ab6b70a2db38600abb","225deff02f4d1c91e2d6c71dec9f18feae510aa729a9774024f30278f4c6b8fe","d8337a630cb3ab7d3914e9e1ee287b9ddd1bc78edd7cdbbf8e506a2203a64085","0ea47413eaffe144782a44058205c31130b382dee0e2f66b62b5188eac57039e","c0591738dbfe11a36959f16ab40bc98b2a430c4565770ef6257574546079d791","1f431ae074057feff41ee4e2d12fa692eace9aa44c408aa637ff40c731a02c2c","fced7c59acecb0ac631505fcbc5a1ce0c6420e2494a256321e9359093efb7a1f","e89675e6b333924577c6b0ab48770fa705f78fef88705e744164fc044260c985","01d036f559ad142cbb792e4f439dbe2b926bfe2719e87c7f56020ea16795e206","cf23a14c2a9261bea877a35a1b001351a03ec90a348b297c4798705da0baf6fe","73e11ca2ca1f58f97a282076971c21e626916ad78c794e06c6a82e7b812661a9","a293184a13ec1d83203b4251e2348a083ab906667b3e5ee087a7994ed077d167","c0bbf4c95f76ece09e8e7ee73d483dd638fa990df690f86dc7d76c33c97fd9fc","1707105775978d102d4a76c324692ca13fdfced1a8e2631086ee8115cb827a3c","ec56f1a0eddf069ed9e5231a5d9fdcf867104a950da73c88df675f603cc34abe","983ff5468d5c7f59cd5ee35400bdef6edec3364c65c61fe8830d8e3fde11b8cb","d1cce35f00a4436368df2c5cbbda382abcad4aa3f7dc50245f59c3a8526839af","08ab05c46350c03949823311f29096143654dad09364e00a176b6e58b74c5577","2d3ce5486c420bc6830ba656519e132aa94bb6454bac53c7812ffd5843f69b2a","16b7189c1babe51147ef7f4eb24f2b4db2c588b27f6783f96df92ee1600306fc","bda0aeeb1c3bcd8b7f4ea304a61e3d70ac260154899c28db36a56768390890d8","f9a5eadaa9bc7b9abd1cac6554b430460b0aeafb07f052692b96d800165a924f","ff18dab39d2b5ec2373f108b400a92d395780db1b22af01fdb46a9eadcfcda56","fed59e10bfc0468ed911d273dafb6bcb4f9878dbc64bdd3a9f73e76ec97d517b","d2ea5492735fb536a7f3043655928d7e30661b96f5e4077a5c8ce48317e81ecf","aa825c9bf53b7019eec8365c169be8f0300e65d09474ec3b323a201b7b246eff","d0f62192ec787f1592a5b86760a44350d1c925883a573eadc12d60862890dffe","2bb6e561e93655b6112d81725d8738533e12e54bb13a20b0696dfa25e02b5694","c9a1e255b1862f9eadba341ec1897a4c5930035156d76431cd09a505653ca018","1413b324972c795019b54a9cc76b8ac2de07b8ebf2da5080adee65ff12f08f57","2747f57a63c56217e0e4d34a919b6714936d2f52db59fe77d5cc5d631011591f","b2edc60c629d8ff34e7bffd6d2852125f0f99c5a208882172807db0d3c28fad2","586c8f663c2fbea3a1c8cf2422b032266bd4f98b1245c857f6a869b27470238d","95c3a601abbb00bf7337a79f850c69b0616767a4df3c01053183d694a17b3cdc","8a8eb7100a22ee3b7631387f3078c2009695da6f0f49e0959d6ebe910e15c6cc","6806beb13419403b6e304fbad8307796613b7f479cb943efa0643fcba97b5fb2","4598ffadaae99c1a1275828382a6976344fb4ce2216dfeddcb467ed442ed7110","20b82cc45b5dcb516285e178eac8d593394f1cf9ad7b390798c97134fb8ba3ca","fd2c83ba154f92f844a4bb6d033e352077cf74c42be6dbbfa8be9288fbc64065","7807f456f2762d2e897cbaae7db06bbe93f4da0e6c62a226b45405f761eeebf6","af7c2d1e879376379e587438bd752e2c37d39429ea7a58694814ec8dc1a092b2","d55375c9949723272052da253a7d41e89e443068095e62a04ab8a98edfe7e943","81e155481baca8b9ef480cd1a15ee8bcd83139d91fe68f85e7b66f905b16750b","8b7417201029f2dc4b8269edb8f782064a8c7f2952e9308edc861bf20747bae2","360249135b6a0ee1b4259ba07c971826412398408c99514bf3c2cbca8eeb2ef9","571312c3a6919bda7741c88059043ab6d398e9932241b8a6b2bdcc01b2d14fbb","b9df516235f72b0f3684d8b1948e2488d766619552537ef7d05a3f791710ab48","c9893996967a7a51e2271f0eadfcf93fc6c94afee83b6a8df0b3f66aa51103a7","8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","a1e760bea27ee98f7a92158cd0384a78fb13adf5e9ddc5d4f3bca7c9dcfeea10","7a4e03d139c6a58c71ba79b269f0c3b9fabfea8df6d0209e6d0c5956e36c3f9e","2aaba0dafc56ec904c24bf9f6e5dc834782cc4ffc30ca550dc000ac605e7bc60","f713064ca751dc588bc13832137c418cb70cf0446de92ade60ad631071558fca","dfefd34e8ab60f41d0c130527d5092d6ce662dc9fa85bc8c97682baf65830b51","96c23535f4f9dd15beb767e070559ea672f6a35f103152836a67100605136a96","b0f4dd1a825912da8f12fd3388d839ef4aa51165ea0e60e4869b50b7ccb4f6fc","9cb7c5f710dc84d2e9500831a3e9a27afd3c3710f5a1b8744a50473e565b41fc","cf6b2edde490f303918809bfab1da8b6d059b50c160bec72005ff4c248bdd079","8d48b8f8a377ade8dd1f000625bc276eea067f2529cc9cafdf082d17142107d6","bf88ef4208a770ca39a844b182b3695df536326ea566893fdc5b8418702a331e","8b06ac3faeacb8484d84ddb44571d8f410697f98d7bfa86c0fda60373a9f5215","7eb06594824ada538b1d8b48c3925a83e7db792f47a081a62cf3e5c4e23cf0ee","f5638f7c2f12a9a1a57b5c41b3c1ea7db3876c003bab68e6a57afd6bcc169af0","cdcc132f207d097d7d3aa75615ab9a2e71d6a478162dde8b67f88ea19f3e54de","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","c085e9aa62d1ae1375794c1fb927a445fa105fed891a7e24edbb1c3300f7384a","f315e1e65a1f80992f0509e84e4ae2df15ecd9ef73df975f7c98813b71e4c8da","5b9586e9b0b6322e5bfbd2c29bd3b8e21ab9d871f82346cb71020e3d84bae73e","3e70a7e67c2cb16f8cd49097360c0309fe9d1e3210ff9222e9dac1f8df9d4fb6","ab68d2a3e3e8767c3fba8f80de099a1cfc18c0de79e42cb02ae66e22dfe14a66","d96cc6598148bf1a98fb2e8dcf01c63a4b3558bdaec6ef35e087fd0562eb40ec",{"version":"c8950367d1812758e9e354c695c60c3e6311bf2cd98b9f9eb469a19df8a9a486","affectsGlobalScope":true},"dd89872dd0647dfd63665f3d525c06d114310a2f7a5a9277e5982a152b31be2b","96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","736097ddbb2903bef918bb3b5811ef1c9c5656f2a73bd39b22a91b9cc2525e50","626bccaba2f61f03abe558a39501631565389a748bc47dd52b305c80176333c1","3663d1b50f356656a314e5df169bb51cb9d5fd75905fa703f75db6bb32030568","2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","55e103448f452988dbdf65e293607c77fb91a967744bad2a72f1a36765e7e88d","7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","3865ef9eb6900d3efa27d96edf3576bd52fe57c2ff3247daf00f575d32626719","b0d10e46cfe3f6c476b69af02eaa38e4ccc7430221ce3109ae84bb9fb8282298","214f291323316651737db8ca0db4c14ae568a429e59fc5b4f364dd80fe72d5f6","76232dbb982272b182a76ad8745a9b02724dc9896e2328ce360e2c56c64c9778","f875e913ef24873eb2a469605402595f1c783070b52a98e53686b32c0f827f7f","ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","70e9a18da08294f75bf23e46c7d69e67634c0765d355887b9b41f0d959e1426e","e9eb1b173aa166892f3eddab182e49cfe59aa2e14d33aedb6b49d175ed6a3750","78058b4bb5b052718f6794d96b9207df1e4fbc361c36bf97d46ac628fc19a932","5caf5834a07628b655f243717ea8d371c670565911ae176efedb5b7b822fc9ab","221398efde5901c7e6bdfe3b400bb3e96997f99a767064c69cc0a7d770963fab","0339d33fe49fbc1c70842c886195e01eafd37f7431dd7f32209dd0544c289474","35855ea1dd13580e3a3f4ada5c25395c4977c62b93fd5116411e7b9dff32d7ce","bcbbdc1b43848a14ae6853aff36f1837718712f8064a60c83cb2773a27e3e557","afa5db70e37d887a78c83a3fe3b097362c73cbba790eae0961e588d73d3766c8","cc1b50b9b8774baec7e485e39e907e5426ba8e1a3e6c3d76578b76ba64c6c8d0",{"version":"6ae9828e3ccf4eb8549bc4f38f37b3bbbff3d66664b24552c4cec71756e7ccbe","affectsGlobalScope":true},"5cf5ca4ac2a1137899d82f498490704b0bdc685f257288281465b90387480b71","3b251e4edc903f60ab560be43d72840f58a5bb6f6b297a78147436b6dba0bf51","b8249aec06337670b5835ed8cd907fc478a9e4081a150d4c554d14c8224a85a9","927cbe428dff22c4f30d3f10e83b0888c1d31e94e59cc99d86571032a3f1ca25","926f32577cb84640d406ebc29efbaa6f1eff20d93ab595b0dd963cf1b9128311","1317898e781d65ec2f952659ec569883fd5c8c13fc46754114c3f1330f4399d8","fd9d67d7d7cbbcf3cee6cb2abe2f17597502ddfb54c7225c3ae1d76d8ea6e2ee","1def7345d072569461d4ec7a9d22a4ecb294f080d68ad5792dfda31fbaa7e1f3","35848644a877c749ba465fe07b67b2d00d579a24c0d5fc3577f95d53d5be2960","0cc50eb615570f23d29bddb4c85c8a2dfec16252244a86cfdea2d2b2ce38d11b","4ce8f30caf02eb00b7a9492b684bd2372b06ed73dc48876e35743ebf9d7b9c19","df619b8c146f745687c435b8d81dd23f29bddfe5742cc8ad22c5041bbf91dac0","ea452088b9f32bfcceda273bf6b0ef90a8353b24cda674623ae7914fe9668f42","aa1c6517bfd85495cd39b163fadbb9dd7c9a0f53332c9e80cc25f891de977269","9a30407da46d2859a7e600ac6767df7621718f69a5bf5564a7d60833535c4f20","cca7fb765c9d543f1b1a8704e13717b0fd698801feb53a626a991d468c2ced9d","f967724c16fb47d360ad8fa1cedeacc045bd4b199535a3adcc85a1216b045ab8",{"version":"2caa950e6d070450e158f98cd686ef3f90de3047498620dd8f8a7713efee4cf1","affectsGlobalScope":true},"d5ec87241dfd892c1d1f7b96d17a8a9e983dc7ffc997fca4ecc7c2976f98f023"],"root":[224,383,[449,455],[506,509],[595,612],[614,616]],"options":{"allowSyntheticDefaultImports":true,"declaration":false,"emitDecoratorMetadata":true,"esModuleInterop":true,"experimentalDecorators":true,"module":1,"noImplicitAny":true,"outDir":"./","removeComments":false,"skipLibCheck":true,"sourceMap":false,"strict":true,"target":4},"fileIdsList":[[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,617,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[50,122,123,124,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,175,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[122,126,164,167,175,176,213,214,215,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[126,164,167,176,213,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[122,124,126,176,215,216,217,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,630,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,313,341,376,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,365,376,377,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,307,313,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,307,341,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,365,375,378,379,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,365,374,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,313,341,367,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,313,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,366,367,368,369,370,371,372,373,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,310,313,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,310,311,313,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,309,310,311,312,313,314,315,325,326,327,328,329,330,331,332,335,336,337,338,339,340,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,333,334,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,310,313,314,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,311,313,318,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,311,313,316,317,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,316,317,318,319,320,321,322,323,324,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,313,316,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,311,313,316,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,307,311,313,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,313,341,346,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[149,176,183,307,363,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,307,308,313,341,342,345,346,347,359,360,361,362,364,381,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[147,176,183,271,313,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,313,341,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,348,349,350,351,352,353,354,355,356,357,358,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[152,176,271,313,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,308,313,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,313,341,342,346,359,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,380,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[149,151,164,175,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,183,271,313,343,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,344,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,313,342,345,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,226,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,230,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,226,227,231,232,233,234,244,247,250,254,256,258,259,261,262,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,232,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,229,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,231,233,234,243,244,247,252,254,255,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,225,226,227,228,229,230,235,239,240,241,243,247,248,250,252,253,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,254,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,236,238,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,226,227,229,240,243,244,247,250,254,258,263,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,242,254,257,263,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,228,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,227,238,245,247,249,250,254,258,259,261,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,235,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,225,226,227,229,230,240,242,243,244,247,248,249,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,251,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,252,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,243,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,229,245,247,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,237,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,238,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,256,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,229,230,241,245,246,248,256,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,256,260,263,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,275,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,291,293,295,296,297,298,299,300,301,302,303,304,305,306,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,281,313,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,290,313,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,292,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,294,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,298,313,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,271,277,313,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,422,432,442,444,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,222,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,222,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,420,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,412,413,414,415,416,417,418,419,420,421,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,422,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,423,424,425,426,427,428,429,430,431,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,413,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,433,434,435,436,437,438,439,440,441,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,443,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,460,461,462,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,459,463,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,496,499,502,504,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,464,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,464,465,466,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,495,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,465,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,463,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,497,498,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,496,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,495,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,503,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,458,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,457,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,500,501,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[142,146,154,164,172,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,467,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,468,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,467,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,468,469,470,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,468,469,470,471,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[164,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,468,469,470,471,472,473,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,468,469,470,471,472,473,474,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,468,469,470,471,472,473,474,475,476,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,468,469,470,471,472,473,474,475,476,477,478,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,468,469,470,471,472,473,474,475,476,477,478,479,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[164,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,456,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,617,618,619,620,621,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,617,619,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[147,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,625,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,626,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,632,635,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[149,175,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,639,640,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[130,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[133,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[134,139,167,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[135,146,147,154,164,175,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[135,136,146,154,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[137,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[138,139,147,155,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[139,164,172,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[140,142,146,154,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[141,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[142,143,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[144,146,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,147,148,164,175,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,147,148,161,164,167,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,180,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[142,146,149,154,164,175,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,147,149,150,154,164,172,175,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[149,151,164,172,175,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,152,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[153,175,176,180,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[142,146,154,164,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[155,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[156,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[133,157,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[158,174,176,180,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[159,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[160,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,161,162,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[161,163,176,178,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[134,146,164,165,166,167,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[134,164,166,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[164,165,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[167,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[168,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[133,164,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,170,171,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[170,171,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[139,154,164,172,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[173,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[154,174,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[134,149,160,175,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[139,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[164,176,177,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[153,176,178,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,179,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[134,139,146,148,157,164,175,176,178,180,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[164,176,181,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,642,681,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,642,666,681,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,681,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,642,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,642,667,681,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,667,681,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[134,147,149,164,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,623,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,683,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,149,151,164,172,175,176,181,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,688,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,552,573,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,575,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,573,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[135,146,176,180,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,516,538,541,542,573,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,510,516,539,540,541,542,543,574,576,577,578,579,580,581,582,583,584,585,586,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,538,539,540,552,573,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,516,539,541,542,552,573,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,516,543,573,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,541,543,552,573,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,516,541,552,573,580,581,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,573,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,516,541,543,552,573,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,541,576,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,538,552,573,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,516,541,543,573,581,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,588,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,590,591,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,552,573,587,589,592,593,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,552,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,557,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,538,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,552,561,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,511,512,513,550,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,511,552,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,511,512,552,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,512,556,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,553,555,560,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,538,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,549,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,570,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,512,552,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,541,553,561,564,565,568,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,513,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,514,515,544,545,546,547,551,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,515,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,543,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,550,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,538,573,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,548,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,71,89,116,117,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[52,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,92,93,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[92,122,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[92,93,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,92,93,115,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[122,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[92,93,106,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[92,93,102,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[89,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,109,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,91,105,109,115,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,109,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,90,91,106,107,108,122,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[89,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,55,59,90,115,122,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,91,114,115,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[89,115,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[90,91,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[89,109,115,122,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,53,55,57,59,60,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,54,55,58,59,62,63,64,65,114,115,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,54,55,56,58,59,61,114,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,54,55,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,55,56,115,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,54,55,56,57,58,116,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,55,59,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,87,88,114,115,116,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[90,91,109,110,111,112,113,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[55,59,61,63,64,115,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,59,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,55,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,55,86,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,89,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[61,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,66,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,71,89,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,71,72,89,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,71,122,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,52,68,69,70,72,73,74,75,76,77,78,79,80,81,82,83,84,85,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[71,77,89,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[71,89,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[119,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[51,86,89,118,120,121,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[122,123,124,125,126,135,146,164,176,180,216,218,219,220,221,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[122,176,222,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,628,634,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[149,164,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[142,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,522,529,530,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,517,518,519,521,522,530,531,536,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[142,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,517,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,517,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,523,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,172,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,517,523,525,526,531,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,525,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,529,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[154,172,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,517,523,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,517,533,534,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,517,518,519,520,523,527,528,529,530,531,532,536,537,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,518,522,532,536,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,517,518,519,521,522,529,532,533,535,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,522,524,527,528,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[164,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,518,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,520,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[154,172,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,517,518,520,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,632,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,629,633,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[134,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[142,146,154,164,172,176,183,384,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,385,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,384,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,385,386,387,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,176,385,386,387,388,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[164,176,386,387,388,389,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,385,386,387,388,389,390,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,385,386,387,388,389,390,391,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,385,386,387,388,389,390,391,392,393,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,176,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,385,386,387,388,389,390,391,392,393,394,395,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,385,386,387,388,389,390,391,392,393,394,395,396,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[164,176,386,387,388,389,390,391,392,393,394,395,396,397,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[149,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,176,180,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,446,447,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,631,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,184,185,186,187,188,189,190,191,192,194,195,196,197,198,199,200,201,202,203,204,205,207,208,209,210,211,212,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[175,176,190,194,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[164,175,176,190,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,185,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[172,175,176,187,190,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[154,172,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,183,185,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[154,175,176,187,190,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[128,129,134,146,164,175,176,186,189,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[128,176,188,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[134,167,175,176,183,186,190,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[134,176,183,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[134,176,183,206,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,183,184,185,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,190,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,190,197,198,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,188,190,198,199,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,189,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[128,176,185,190,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,190,194,198,199,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,194,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[175,176,188,190,193,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[128,176,187,188,190,194,197,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[134,164,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[134,176,180,183,185,190,206,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,223,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,224,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,448,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,449,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,224,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,449,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,222,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,445,449,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,450,451,452,453,454,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,445,449,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,222,224,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,445,449,455,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,508,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,222,224,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,445,449,455,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,508,598,599,600,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,222,224,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,445,449,455,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,505,507,508,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,222,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,445,449,455,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,222,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,449,455,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,506,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[148,156,176,222,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,222,224,382,383,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,445,449,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,505,507,508,509,594,595,596,597,598,599,600,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,222,224,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,445,455,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,508,595,613,614,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,224,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,445,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,595,613,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,691,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,691,692,693,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,691,692,693,694,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[164,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,691,692,693,694,695,696,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,691,692,693,694,695,696,697,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,691,692,693,694,695,696,697,698,699,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[146,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,691,692,693,694,695,696,697,698,699,700,701,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,691,692,693,694,695,696,697,698,699,700,701,702,704,705,706,707,708,709,710,711,712,713,714,715,716],[164,176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,705,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,706,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,707,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,708,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,709,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,710,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,711,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,712,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,713,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,714,715,716],[176,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,494,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,716]],"referencedMap":[[619,1],[617,2],[125,3],[126,2],[123,4],[216,5],[214,6],[124,2],[218,7],[628,2],[631,8],[217,2],[50,2],[221,2],[377,9],[378,10],[376,11],[365,12],[379,2],[380,13],[375,14],[373,15],[366,16],[372,15],[374,17],[367,16],[370,15],[369,15],[368,15],[371,16],[329,16],[314,18],[337,16],[339,2],[326,19],[311,18],[341,20],[313,16],[333,16],[334,16],[335,21],[340,16],[310,16],[309,16],[315,22],[327,16],[328,16],[323,16],[319,23],[318,24],[325,25],[324,16],[316,16],[321,2],[322,26],[317,27],[320,28],[330,11],[331,16],[312,16],[338,16],[336,18],[332,2],[342,29],[364,30],[382,31],[348,16],[355,32],[354,16],[349,33],[359,34],[352,16],[357,35],[353,16],[350,16],[351,16],[356,36],[358,16],[362,2],[308,16],[363,36],[360,37],[347,16],[381,38],[343,39],[344,40],[345,41],[346,42],[361,2],[225,2],[227,43],[270,2],[231,44],[263,45],[233,46],[230,47],[232,2],[235,2],[234,2],[256,48],[264,2],[254,49],[242,50],[239,51],[240,2],[265,2],[257,52],[271,53],[269,2],[245,2],[258,54],[241,2],[236,2],[229,55],[262,56],[251,2],[246,2],[266,57],[255,50],[228,2],[267,2],[250,58],[252,59],[259,60],[244,61],[226,2],[248,62],[237,2],[238,63],[260,2],[253,64],[249,65],[247,66],[261,67],[243,2],[268,2],[272,16],[298,16],[273,2],[305,2],[301,16],[274,16],[277,2],[300,16],[276,68],[306,16],[307,69],[279,2],[280,16],[275,2],[281,2],[282,16],[290,16],[283,2],[284,70],[285,16],[286,2],[287,2],[302,16],[288,16],[289,16],[291,71],[293,72],[295,73],[296,2],[297,2],[299,74],[303,2],[304,16],[292,2],[294,2],[278,75],[630,2],[445,76],[418,77],[421,78],[412,77],[417,77],[414,77],[422,79],[416,2],[413,77],[419,77],[415,77],[420,77],[430,80],[425,80],[429,80],[426,80],[432,81],[428,80],[427,82],[431,80],[440,80],[435,80],[439,80],[436,80],[442,83],[438,80],[437,80],[441,80],[434,80],[433,80],[424,80],[423,80],[443,77],[444,84],[461,2],[463,85],[462,2],[460,2],[505,86],[465,87],[466,2],[496,88],[495,89],[464,90],[499,91],[497,92],[498,93],[503,2],[504,94],[459,95],[458,96],[500,89],[502,97],[501,87],[468,98],[469,99],[493,100],[470,101],[471,102],[472,103],[473,104],[474,105],[475,106],[476,107],[477,108],[494,109],[479,110],[491,2],[478,111],[480,112],[481,113],[482,114],[483,115],[484,116],[485,117],[486,118],[487,119],[488,120],[489,121],[490,122],[492,123],[457,124],[456,2],[622,125],[618,1],[620,126],[621,1],[623,2],[624,127],[625,2],[626,128],[627,129],[636,130],[637,2],[638,2],[640,2],[641,131],[130,132],[131,132],[133,133],[134,134],[135,135],[136,136],[137,137],[138,138],[139,139],[140,140],[141,141],[142,142],[143,142],[145,143],[144,144],[146,143],[147,145],[148,146],[132,147],[182,2],[149,148],[150,149],[151,150],[183,151],[152,152],[153,153],[154,154],[155,155],[156,156],[157,157],[158,158],[159,159],[160,160],[161,161],[162,161],[163,162],[164,163],[166,164],[165,165],[167,166],[168,167],[169,168],[170,169],[171,170],[172,171],[173,172],[174,173],[175,174],[176,175],[177,176],[178,177],[179,178],[180,179],[181,180],[666,181],[667,182],[642,183],[645,183],[664,181],[665,181],[655,181],[654,184],[652,181],[647,181],[660,181],[658,181],[662,181],[646,181],[659,181],[663,181],[648,181],[649,181],[661,181],[643,181],[650,181],[651,181],[653,181],[657,181],[668,185],[656,181],[644,181],[681,186],[680,2],[675,185],[677,187],[676,185],[669,185],[670,185],[672,185],[674,185],[678,187],[679,187],[671,187],[673,187],[682,2],[683,188],[684,189],[685,2],[686,2],[687,190],[219,191],[688,2],[689,192],[215,190],[467,2],[127,2],[510,2],[574,193],[576,194],[577,195],[575,196],[578,2],[579,197],[587,198],[541,199],[543,200],[540,201],[580,202],[542,2],[582,203],[516,204],[581,205],[583,206],[539,207],[584,2],[585,2],[586,208],[589,209],[588,195],[590,2],[592,210],[591,2],[594,211],[553,212],[554,2],[555,195],[556,2],[558,213],[559,214],[562,215],[573,216],[563,2],[512,217],[564,2],[565,2],[566,2],[513,218],[557,2],[567,219],[511,212],[561,220],[568,2],[560,221],[569,2],[550,222],[571,223],[570,224],[572,225],[514,226],[515,2],[552,227],[545,195],[546,195],[547,228],[544,229],[551,230],[593,231],[548,2],[549,232],[533,2],[117,2],[118,233],[51,2],[53,234],[94,235],[93,236],[95,237],[96,238],[97,237],[98,235],[99,237],[100,235],[92,239],[101,237],[102,240],[103,241],[104,235],[106,242],[107,243],[105,244],[108,245],[109,246],[110,247],[91,248],[111,249],[112,250],[113,251],[90,252],[61,253],[66,254],[62,245],[115,255],[56,256],[116,257],[59,258],[63,259],[89,260],[114,261],[67,262],[57,2],[54,245],[64,263],[58,264],[60,264],[87,265],[55,263],[88,263],[65,266],[52,2],[68,267],[69,268],[70,266],[72,269],[73,266],[74,247],[75,270],[76,271],[86,272],[78,273],[79,266],[80,266],[81,266],[82,247],[83,274],[84,266],[85,247],[77,269],[119,2],[120,275],[71,2],[121,247],[122,276],[222,277],[220,278],[613,2],[635,279],[639,280],[531,281],[532,282],[530,283],[518,284],[523,285],[524,286],[527,287],[526,288],[525,289],[528,290],[535,291],[538,292],[537,293],[536,294],[529,295],[519,296],[534,297],[521,298],[517,299],[522,300],[520,284],[633,301],[634,302],[629,2],[223,2],[384,303],[385,304],[386,305],[410,306],[387,307],[388,308],[389,309],[390,310],[391,311],[392,312],[393,313],[394,314],[411,315],[396,316],[408,2],[395,317],[397,318],[398,319],[399,320],[400,321],[401,322],[402,323],[403,324],[404,325],[405,326],[406,327],[407,328],[409,329],[446,330],[448,331],[632,332],[447,333],[47,2],[48,2],[8,2],[9,2],[13,2],[12,2],[2,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[3,2],[4,2],[22,2],[49,2],[26,2],[23,2],[24,2],[25,2],[27,2],[28,2],[29,2],[5,2],[30,2],[31,2],[32,2],[33,2],[6,2],[37,2],[34,2],[35,2],[36,2],[38,2],[7,2],[39,2],[44,2],[45,2],[40,2],[41,2],[42,2],[43,2],[1,2],[46,2],[11,2],[10,2],[213,334],[197,335],[204,336],[196,335],[211,337],[188,338],[187,339],[210,190],[205,340],[208,341],[190,342],[189,343],[185,344],[184,345],[207,346],[186,347],[191,348],[192,2],[195,348],[128,2],[212,348],[199,349],[200,350],[202,351],[198,352],[201,353],[206,190],[193,354],[194,355],[203,356],[129,357],[209,358],[224,359],[449,360],[508,361],[595,362],[454,363],[452,363],[450,363],[455,364],[451,365],[453,363],[602,366],[603,366],[604,366],[605,367],[606,366],[607,366],[608,366],[609,366],[610,366],[611,366],[612,366],[509,368],[599,369],[598,369],[506,369],[600,369],[507,370],[383,371],[596,77],[597,77],[601,372],[615,373],[616,374],[614,369],[717,2],[690,303],[691,304],[692,375],[693,376],[694,377],[695,378],[696,379],[697,380],[698,381],[699,382],[700,383],[716,384],[702,385],[714,2],[701,386],[703,387],[704,388],[705,389],[706,390],[707,391],[708,392],[709,393],[710,394],[711,395],[712,396],[713,397],[715,398]],"exportedModulesMap":[[619,1],[617,2],[125,3],[126,2],[123,4],[216,5],[214,6],[124,2],[218,7],[628,2],[631,8],[217,2],[50,2],[221,2],[377,9],[378,10],[376,11],[365,12],[379,2],[380,13],[375,14],[373,15],[366,16],[372,15],[374,17],[367,16],[370,15],[369,15],[368,15],[371,16],[329,16],[314,18],[337,16],[339,2],[326,19],[311,18],[341,20],[313,16],[333,16],[334,16],[335,21],[340,16],[310,16],[309,16],[315,22],[327,16],[328,16],[323,16],[319,23],[318,24],[325,25],[324,16],[316,16],[321,2],[322,26],[317,27],[320,28],[330,11],[331,16],[312,16],[338,16],[336,18],[332,2],[342,29],[364,30],[382,31],[348,16],[355,32],[354,16],[349,33],[359,34],[352,16],[357,35],[353,16],[350,16],[351,16],[356,36],[358,16],[362,2],[308,16],[363,36],[360,37],[347,16],[381,38],[343,39],[344,40],[345,41],[346,42],[361,2],[225,2],[227,43],[270,2],[231,44],[263,45],[233,46],[230,47],[232,2],[235,2],[234,2],[256,48],[264,2],[254,49],[242,50],[239,51],[240,2],[265,2],[257,52],[271,53],[269,2],[245,2],[258,54],[241,2],[236,2],[229,55],[262,56],[251,2],[246,2],[266,57],[255,50],[228,2],[267,2],[250,58],[252,59],[259,60],[244,61],[226,2],[248,62],[237,2],[238,63],[260,2],[253,64],[249,65],[247,66],[261,67],[243,2],[268,2],[272,16],[298,16],[273,2],[305,2],[301,16],[274,16],[277,2],[300,16],[276,68],[306,16],[307,69],[279,2],[280,16],[275,2],[281,2],[282,16],[290,16],[283,2],[284,70],[285,16],[286,2],[287,2],[302,16],[288,16],[289,16],[291,71],[293,72],[295,73],[296,2],[297,2],[299,74],[303,2],[304,16],[292,2],[294,2],[278,75],[630,2],[445,76],[418,77],[421,78],[412,77],[417,77],[414,77],[422,79],[416,2],[413,77],[419,77],[415,77],[420,77],[430,80],[425,80],[429,80],[426,80],[432,81],[428,80],[427,82],[431,80],[440,80],[435,80],[439,80],[436,80],[442,83],[438,80],[437,80],[441,80],[434,80],[433,80],[424,80],[423,80],[443,77],[444,84],[461,2],[463,85],[462,2],[460,2],[505,86],[465,87],[466,2],[496,88],[495,89],[464,90],[499,91],[497,92],[498,93],[503,2],[504,94],[459,95],[458,96],[500,89],[502,97],[501,87],[468,98],[469,99],[493,100],[470,101],[471,102],[472,103],[473,104],[474,105],[475,106],[476,107],[477,108],[494,109],[479,110],[491,2],[478,111],[480,112],[481,113],[482,114],[483,115],[484,116],[485,117],[486,118],[487,119],[488,120],[489,121],[490,122],[492,123],[457,124],[456,2],[622,125],[618,1],[620,126],[621,1],[623,2],[624,127],[625,2],[626,128],[627,129],[636,130],[637,2],[638,2],[640,2],[641,131],[130,132],[131,132],[133,133],[134,134],[135,135],[136,136],[137,137],[138,138],[139,139],[140,140],[141,141],[142,142],[143,142],[145,143],[144,144],[146,143],[147,145],[148,146],[132,147],[182,2],[149,148],[150,149],[151,150],[183,151],[152,152],[153,153],[154,154],[155,155],[156,156],[157,157],[158,158],[159,159],[160,160],[161,161],[162,161],[163,162],[164,163],[166,164],[165,165],[167,166],[168,167],[169,168],[170,169],[171,170],[172,171],[173,172],[174,173],[175,174],[176,175],[177,176],[178,177],[179,178],[180,179],[181,180],[666,181],[667,182],[642,183],[645,183],[664,181],[665,181],[655,181],[654,184],[652,181],[647,181],[660,181],[658,181],[662,181],[646,181],[659,181],[663,181],[648,181],[649,181],[661,181],[643,181],[650,181],[651,181],[653,181],[657,181],[668,185],[656,181],[644,181],[681,186],[680,2],[675,185],[677,187],[676,185],[669,185],[670,185],[672,185],[674,185],[678,187],[679,187],[671,187],[673,187],[682,2],[683,188],[684,189],[685,2],[686,2],[687,190],[219,191],[688,2],[689,192],[215,190],[467,2],[127,2],[510,2],[574,193],[576,194],[577,195],[575,196],[578,2],[579,197],[587,198],[541,199],[543,200],[540,201],[580,202],[542,2],[582,203],[516,204],[581,205],[583,206],[539,207],[584,2],[585,2],[586,208],[589,209],[588,195],[590,2],[592,210],[591,2],[594,211],[553,212],[554,2],[555,195],[556,2],[558,213],[559,214],[562,215],[573,216],[563,2],[512,217],[564,2],[565,2],[566,2],[513,218],[557,2],[567,219],[511,212],[561,220],[568,2],[560,221],[569,2],[550,222],[571,223],[570,224],[572,225],[514,226],[515,2],[552,227],[545,195],[546,195],[547,228],[544,229],[551,230],[593,231],[548,2],[549,232],[533,2],[117,2],[118,233],[51,2],[53,234],[94,235],[93,236],[95,237],[96,238],[97,237],[98,235],[99,237],[100,235],[92,239],[101,237],[102,240],[103,241],[104,235],[106,242],[107,243],[105,244],[108,245],[109,246],[110,247],[91,248],[111,249],[112,250],[113,251],[90,252],[61,253],[66,254],[62,245],[115,255],[56,256],[116,257],[59,258],[63,259],[89,260],[114,261],[67,262],[57,2],[54,245],[64,263],[58,264],[60,264],[87,265],[55,263],[88,263],[65,266],[52,2],[68,267],[69,268],[70,266],[72,269],[73,266],[74,247],[75,270],[76,271],[86,272],[78,273],[79,266],[80,266],[81,266],[82,247],[83,274],[84,266],[85,247],[77,269],[119,2],[120,275],[71,2],[121,247],[122,276],[222,277],[220,278],[613,2],[635,279],[639,280],[531,281],[532,282],[530,283],[518,284],[523,285],[524,286],[527,287],[526,288],[525,289],[528,290],[535,291],[538,292],[537,293],[536,294],[529,295],[519,296],[534,297],[521,298],[517,299],[522,300],[520,284],[633,301],[634,302],[629,2],[223,2],[384,303],[385,304],[386,305],[410,306],[387,307],[388,308],[389,309],[390,310],[391,311],[392,312],[393,313],[394,314],[411,315],[396,316],[408,2],[395,317],[397,318],[398,319],[399,320],[400,321],[401,322],[402,323],[403,324],[404,325],[405,326],[406,327],[407,328],[409,329],[446,330],[448,331],[632,332],[447,333],[47,2],[48,2],[8,2],[9,2],[13,2],[12,2],[2,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[3,2],[4,2],[22,2],[49,2],[26,2],[23,2],[24,2],[25,2],[27,2],[28,2],[29,2],[5,2],[30,2],[31,2],[32,2],[33,2],[6,2],[37,2],[34,2],[35,2],[36,2],[38,2],[7,2],[39,2],[44,2],[45,2],[40,2],[41,2],[42,2],[43,2],[1,2],[46,2],[11,2],[10,2],[213,334],[197,335],[204,336],[196,335],[211,337],[188,338],[187,339],[210,190],[205,340],[208,341],[190,342],[189,343],[185,344],[184,345],[207,346],[186,347],[191,348],[192,2],[195,348],[128,2],[212,348],[199,349],[200,350],[202,351],[198,352],[201,353],[206,190],[193,354],[194,355],[203,356],[129,357],[209,358],[224,359],[449,360],[508,361],[595,362],[454,363],[452,363],[450,363],[455,364],[451,365],[453,363],[602,366],[603,366],[604,366],[605,367],[606,366],[607,366],[608,366],[609,366],[610,366],[611,366],[612,366],[509,368],[599,369],[598,369],[506,369],[600,369],[507,370],[383,371],[596,77],[597,77],[601,372],[615,373],[616,374],[614,369],[717,2],[690,303],[691,304],[692,375],[693,376],[694,377],[695,378],[696,379],[697,380],[698,381],[699,382],[700,383],[716,384],[702,385],[714,2],[701,386],[703,387],[704,388],[705,389],[706,390],[707,391],[708,392],[709,393],[710,394],[711,395],[712,396],[713,397],[715,398]],"semanticDiagnosticsPerFile":[619,617,125,126,123,216,214,124,218,628,631,217,50,221,377,378,376,365,379,380,375,373,366,372,374,367,370,369,368,371,329,314,337,339,326,311,341,313,333,334,335,340,310,309,315,327,328,323,319,318,325,324,316,321,322,317,320,330,331,312,338,336,332,342,364,382,348,355,354,349,359,352,357,353,350,351,356,358,362,308,363,360,347,381,343,344,345,346,361,225,227,270,231,263,233,230,232,235,234,256,264,254,242,239,240,265,257,271,269,245,258,241,236,229,262,251,246,266,255,228,267,250,252,259,244,226,248,237,238,260,253,249,247,261,243,268,272,298,273,305,301,274,277,300,276,306,307,279,280,275,281,282,290,283,284,285,286,287,302,288,289,291,293,295,296,297,299,303,304,292,294,278,630,445,418,421,412,417,414,422,416,413,419,415,420,430,425,429,426,432,428,427,431,440,435,439,436,442,438,437,441,434,433,424,423,443,444,461,463,462,460,505,465,466,496,495,464,499,497,498,503,504,459,458,500,502,501,468,469,493,470,471,472,473,474,475,476,477,494,479,491,478,480,481,482,483,484,485,486,487,488,489,490,492,457,456,622,618,620,621,623,624,625,626,627,636,637,638,640,641,130,131,133,134,135,136,137,138,139,140,141,142,143,145,144,146,147,148,132,182,149,150,151,183,152,153,154,155,156,157,158,159,160,161,162,163,164,166,165,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,666,667,642,645,664,665,655,654,652,647,660,658,662,646,659,663,648,649,661,643,650,651,653,657,668,656,644,681,680,675,677,676,669,670,672,674,678,679,671,673,682,683,684,685,686,687,219,688,689,215,467,127,510,574,576,577,575,578,579,587,541,543,540,580,542,582,516,581,583,539,584,585,586,589,588,590,592,591,594,553,554,555,556,558,559,562,573,563,512,564,565,566,513,557,567,511,561,568,560,569,550,571,570,572,514,515,552,545,546,547,544,551,593,548,549,533,117,118,51,53,94,93,95,96,97,98,99,100,92,101,102,103,104,106,107,105,108,109,110,91,111,112,113,90,61,66,62,115,56,116,59,63,89,114,67,57,54,64,58,60,87,55,88,65,52,68,69,70,72,73,74,75,76,86,78,79,80,81,82,83,84,85,77,119,120,71,121,122,222,220,613,635,639,531,532,530,518,523,524,527,526,525,528,535,538,537,536,529,519,534,521,517,522,520,633,634,629,223,384,385,386,410,387,388,389,390,391,392,393,394,411,396,408,395,397,398,399,400,401,402,403,404,405,406,407,409,446,448,632,447,47,48,8,9,13,12,2,14,15,16,17,18,19,20,21,3,4,22,49,26,23,24,25,27,28,29,5,30,31,32,33,6,37,34,35,36,38,7,39,44,45,40,41,42,43,1,46,11,10,213,197,204,196,211,188,187,210,205,208,190,189,185,184,207,186,191,192,195,128,212,199,200,202,198,201,206,193,194,203,129,209,224,449,508,595,454,452,450,455,451,453,602,603,604,605,606,607,608,609,610,611,612,509,599,598,506,600,507,383,596,597,601,615,616,614,717,690,691,692,693,694,695,696,697,698,699,700,716,702,714,701,703,704,705,706,707,708,709,710,711,712,713,715]},"version":"5.2.2"} \ No newline at end of file diff --git a/src/functions/fetchMessages.ts b/src/functions/fetchMessages.ts index 49804d19..ddb3af5c 100644 --- a/src/functions/fetchMessages.ts +++ b/src/functions/fetchMessages.ts @@ -66,7 +66,7 @@ async function getNeedDataFromMessage(message: Message, threadInfo?: threadInfo) channelName: threadInfo?.channelName ? threadInfo?.channelName : '', threadId: threadInfo?.threadId ? threadInfo?.threadId : null, threadName: threadInfo?.threadName ? threadInfo?.threadName : null, - isGeneratedByWebhook: message.webhookId ? true : false + isGeneratedByWebhook: message.webhookId ? true : false, }; } else { return { @@ -83,7 +83,7 @@ async function getNeedDataFromMessage(message: Message, threadInfo?: threadInfo) channelName: message.channel instanceof TextChannel ? message.channel.name : null, threadId: null, threadName: null, - isGeneratedByWebhook: message.webhookId ? true : false + isGeneratedByWebhook: message.webhookId ? true : false, }; } } @@ -152,22 +152,22 @@ async function fetchMessages( } channel instanceof ThreadChannel ? await pushMessagesToArray(connection, messagesToStore, [...fetchedMessages.values()], { - threadId: channel.id, - threadName: channel.name, - channelId: channel.parent?.id, - channelName: channel.parent?.name, - }) + threadId: channel.id, + threadName: channel.name, + channelId: channel.parent?.id, + channelName: channel.parent?.name, + }) : await pushMessagesToArray(connection, messagesToStore, [...fetchedMessages.values()]); break; } channel instanceof ThreadChannel ? await pushMessagesToArray(connection, messagesToStore, [...fetchedMessages.values()], { - threadId: channel.id, - threadName: channel.name, - channelId: channel.parent?.id, - channelName: channel.parent?.name, - }) + threadId: channel.id, + threadName: channel.name, + channelId: channel.parent?.id, + channelName: channel.parent?.name, + }) : await pushMessagesToArray(connection, messagesToStore, [...fetchedMessages.values()]); options[fetchDirection] = boundaryMessage.id; fetchedMessages = await channel.messages.fetch(options); diff --git a/src/index.ts b/src/index.ts index 8b2e6c1b..af79d3bb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -37,8 +37,8 @@ const client = new Client({ const partial = (func: any, ...args: any) => - (...rest: any) => - func(...args, ...rest); + (...rest: any) => + func(...args, ...rest); const fetchMethod = async (msg: any) => { logger.info({ msg }, 'fetchMethod is running'); @@ -179,7 +179,7 @@ async function app() { // every: 10000 }, jobId: 'cronJob', // Optional: Provide a unique ID for the job - attempts: 1, // Number of times to retry the job if it fails + attempts: 0, // Number of times to retry the job if it fails backoff: { type: 'exponential', delay: 1000, // Initial delay between retries in milliseconds diff --git a/src/migrations/db/1695210587863-add-isgeneratedbyweebhook-to-rawinfo-schema.ts b/src/migrations/db/1695210587863-add-isgeneratedbyweebhook-to-rawinfo-schema.ts index f54c567e..a6ef1c09 100644 --- a/src/migrations/db/1695210587863-add-isgeneratedbyweebhook-to-rawinfo-schema.ts +++ b/src/migrations/db/1695210587863-add-isgeneratedbyweebhook-to-rawinfo-schema.ts @@ -1,5 +1,5 @@ import 'dotenv/config'; -import { Client, GatewayIntentBits, } from 'discord.js'; +import { Client, GatewayIntentBits } from 'discord.js'; import { guildService } from '../../database/services'; import { connectDB } from '../../database'; import { databaseService } from '@togethercrew.dev/db'; @@ -7,32 +7,23 @@ import config from '../../config'; import { closeConnection } from '../../database/connection'; import webhookLogic from '../utils/webhookLogic'; -const { - Guilds, - GuildMembers, - GuildMessages, - GuildPresences, - DirectMessages -} = GatewayIntentBits; - +const { Guilds, GuildMembers, GuildMessages, GuildPresences, DirectMessages } = GatewayIntentBits; export const up = async () => { - const client = new Client({ - intents: [Guilds, GuildMembers, GuildMessages, GuildPresences, DirectMessages], - }); + const client = new Client({ + intents: [Guilds, GuildMembers, GuildMessages, GuildPresences, DirectMessages], + }); - await client.login(config.discord.botToken); - await connectDB(); - const guilds = await guildService.getGuilds({}); - for (let i = 0; i < guilds.length; i++) { - const connection = databaseService.connectionFactory(guilds[i].guildId, config.mongoose.dbURL); - await webhookLogic(connection, client, guilds[i].guildId); - await closeConnection(connection); - } + await client.login(config.discord.botToken); + await connectDB(); + const guilds = await guildService.getGuilds({}); + for (let i = 0; i < guilds.length; i++) { + const connection = databaseService.connectionFactory(guilds[i].guildId, config.mongoose.dbURL); + await webhookLogic(connection, client, guilds[i].guildId); + await closeConnection(connection); + } }; export const down = async () => { - // TODO: Implement rollback logic if needed + // TODO: Implement rollback logic if needed }; - - diff --git a/src/migrations/utils/template.ts b/src/migrations/utils/template.ts index 1bb0f4e2..080196cd 100644 --- a/src/migrations/utils/template.ts +++ b/src/migrations/utils/template.ts @@ -4,12 +4,11 @@ import 'dotenv/config'; import config from '../../config'; export const up = async () => { - await connectDB(); - const connection = databaseService.connectionFactory("681946187490000803", config.mongoose.dbURL); - await connection.createCollection('my_collection'); + await connectDB(); + const connection = databaseService.connectionFactory('681946187490000803', config.mongoose.dbURL); + await connection.createCollection('my_collection'); }; export const down = async () => { - await connectDB() - -}; \ No newline at end of file + await connectDB(); +}; diff --git a/src/migrations/utils/webhookLogic.ts b/src/migrations/utils/webhookLogic.ts index 0e8e1784..c2621b8a 100644 --- a/src/migrations/utils/webhookLogic.ts +++ b/src/migrations/utils/webhookLogic.ts @@ -7,188 +7,198 @@ import { rawInfoService, channelService } from '../../database/services'; const logger = parentLogger.child({ module: 'Migration' }); interface FetchOptions { - limit: number; - before?: Snowflake; - after?: Snowflake; + limit: number; + before?: Snowflake; + after?: Snowflake; } async function fetchMessagesBetweenOldestAndNewest( - connection: Connection, - channel: TextChannel | ThreadChannel, - oldestRawInfo: IRawInfo, - newestRawInfo: IRawInfo + connection: Connection, + channel: TextChannel | ThreadChannel, + oldestRawInfo: IRawInfo, + newestRawInfo: IRawInfo ) { - try { - let allMessages: Message[] = []; - logger.info( - { guild_id: connection.name, channel_id: channel.id }, - 'Fetching channel messages is running' - ); - const options: FetchOptions = { limit: 100 }; - options.after = oldestRawInfo.messageId; - let fetchedMessages = await channel.messages.fetch(options); - while (fetchedMessages.size > 0) { - allMessages = allMessages.concat(Array.from(fetchedMessages.values())); - if (fetchedMessages.has(newestRawInfo.messageId)) { - break; - } - options.after = fetchedMessages.first()?.id; - fetchedMessages = await channel.messages.fetch(options); - } - return allMessages; - } catch (err) { - logger.error( - { guild_id: connection.name, channel_id: channel.id, err }, - 'Fetching channel messages failed' - ); + try { + let allMessages: Message[] = []; + logger.info({ guild_id: connection.name, channel_id: channel.id }, 'Fetching channel messages is running'); + const options: FetchOptions = { limit: 100 }; + options.after = oldestRawInfo.messageId; + let fetchedMessages = await channel.messages.fetch(options); + while (fetchedMessages.size > 0) { + allMessages = allMessages.concat(Array.from(fetchedMessages.values())); + if (fetchedMessages.has(newestRawInfo.messageId)) { + break; + } + options.after = fetchedMessages.first()?.id; + fetchedMessages = await channel.messages.fetch(options); } - logger.info( - { guild_id: connection.name, channel_id: channel.id }, - 'Fetching channel messages is done' - ); + return allMessages; + } catch (err) { + logger.error({ guild_id: connection.name, channel_id: channel.id, err }, 'Fetching channel messages failed'); + } + logger.info({ guild_id: connection.name, channel_id: channel.id }, 'Fetching channel messages is done'); } async function migrateIsGeneratedByWebhook(connection: Connection, channel: TextChannel) { - try { - logger.info({ guild_id: connection.name, channel_id: channel.id }, 'Migration for isGeneratedByWebhook is running'); - - // Fetch oldest rawInfo from DB - const oldestChannelRawInfo = await rawInfoService.getOldestRawInfo(connection, { - channelId: channel?.id, - threadId: null, - }); - - // Fetch newest rawInfo from DB - const newestChannelRawInfo = await rawInfoService.getNewestRawInfo(connection, { - channelId: channel?.id, - threadId: null, - }); - - if (!oldestChannelRawInfo || !newestChannelRawInfo) { - logger.info({ guild_id: connection.name, channel_id: channel.id }, 'No oldest rawInfo found, skipping migration'); - return; - } - - - - const fetchedMessages = await fetchMessagesBetweenOldestAndNewest(connection, channel, oldestChannelRawInfo, newestChannelRawInfo); - const messagesToUpdateTrue = []; - const messagesToUpdateFalse = []; - - const oldestMessage = await channel.messages.fetch(oldestChannelRawInfo.messageId); - const newestMessage = await channel.messages.fetch(newestChannelRawInfo.messageId); - + try { + logger.info({ guild_id: connection.name, channel_id: channel.id }, 'Migration for isGeneratedByWebhook is running'); + + // Fetch oldest rawInfo from DB + const oldestChannelRawInfo = await rawInfoService.getOldestRawInfo(connection, { + channelId: channel?.id, + threadId: null, + }); + + // Fetch newest rawInfo from DB + const newestChannelRawInfo = await rawInfoService.getNewestRawInfo(connection, { + channelId: channel?.id, + threadId: null, + }); + + if (!oldestChannelRawInfo || !newestChannelRawInfo) { + logger.info({ guild_id: connection.name, channel_id: channel.id }, 'No oldest rawInfo found, skipping migration'); + return; + } - if (oldestMessage.webhookId) messagesToUpdateTrue.push(oldestMessage.id); - else messagesToUpdateFalse.push(oldestMessage.id); + const fetchedMessages = await fetchMessagesBetweenOldestAndNewest( + connection, + channel, + oldestChannelRawInfo, + newestChannelRawInfo + ); + const messagesToUpdateTrue = []; + const messagesToUpdateFalse = []; - if (newestMessage.webhookId) messagesToUpdateTrue.push(newestMessage.id); - else messagesToUpdateFalse.push(newestMessage.id); + const oldestMessage = await channel.messages.fetch(oldestChannelRawInfo.messageId); + const newestMessage = await channel.messages.fetch(newestChannelRawInfo.messageId); - if (fetchedMessages) { - for (const message of fetchedMessages) { - if (message.webhookId) { - messagesToUpdateTrue.push(message.id); - } else { - messagesToUpdateFalse.push(message.id); - } - } + if (oldestMessage.webhookId) messagesToUpdateTrue.push(oldestMessage.id); + else messagesToUpdateFalse.push(oldestMessage.id); - } + if (newestMessage.webhookId) messagesToUpdateTrue.push(newestMessage.id); + else messagesToUpdateFalse.push(newestMessage.id); - if (messagesToUpdateTrue.length > 0) { - await rawInfoService.updateManyRawInfo(connection, { messageId: { $in: messagesToUpdateTrue } }, { isGeneratedByWebhook: true }); + if (fetchedMessages) { + for (const message of fetchedMessages) { + if (message.webhookId) { + messagesToUpdateTrue.push(message.id); + } else { + messagesToUpdateFalse.push(message.id); } + } + } - if (messagesToUpdateFalse.length > 0) { - - await rawInfoService.updateManyRawInfo(connection, { messageId: { $in: messagesToUpdateFalse } }, { isGeneratedByWebhook: false }); - } - - const threads = channel.threads.cache.values(); - - // Handle threads of the channel - for (const thread of threads) { - const oldestThreadRawInfo = await rawInfoService.getOldestRawInfo(connection, { - channelId: channel?.id, - threadId: thread.id, - }); - - const newestThreadRawInfo = await rawInfoService.getNewestRawInfo(connection, { - channelId: channel?.id, - threadId: thread.id, - }); - - if (!oldestThreadRawInfo || !newestThreadRawInfo) { - continue; // No data to migrate for this thread - } - - const fetchedThreadMessages = await fetchMessagesBetweenOldestAndNewest(connection, thread, oldestThreadRawInfo, newestThreadRawInfo); - - const threadMessagesToUpdateTrue = []; - const threadMessagesToUpdateFalse = []; - - - const oldestThreadMessage = await thread.messages.fetch(oldestThreadRawInfo.messageId); - const newestThreadMessage = await thread.messages.fetch(newestThreadRawInfo.messageId); - - if (oldestThreadMessage.webhookId) threadMessagesToUpdateTrue.push(oldestThreadMessage.id); - else threadMessagesToUpdateFalse.push(oldestThreadMessage.id); - - if (newestThreadMessage.webhookId) threadMessagesToUpdateTrue.push(newestThreadMessage.id); - else threadMessagesToUpdateFalse.push(newestThreadMessage.id); - - - - if (fetchedThreadMessages) { - for (const message of fetchedThreadMessages) { - if (message.webhookId) { - threadMessagesToUpdateTrue.push(message.id); - } else { - threadMessagesToUpdateFalse.push(message.id); - } - } - } + if (messagesToUpdateTrue.length > 0) { + await rawInfoService.updateManyRawInfo( + connection, + { messageId: { $in: messagesToUpdateTrue } }, + { isGeneratedByWebhook: true } + ); + } - if (threadMessagesToUpdateTrue.length > 0) { - await rawInfoService.updateManyRawInfo(connection, { messageId: { $in: threadMessagesToUpdateTrue } }, { isGeneratedByWebhook: true }); - } + if (messagesToUpdateFalse.length > 0) { + await rawInfoService.updateManyRawInfo( + connection, + { messageId: { $in: messagesToUpdateFalse } }, + { isGeneratedByWebhook: false } + ); + } - if (threadMessagesToUpdateFalse.length > 0) { - await rawInfoService.updateManyRawInfo(connection, { messageId: { $in: threadMessagesToUpdateFalse } }, { isGeneratedByWebhook: false }); - } + const threads = channel.threads.cache.values(); + + // Handle threads of the channel + for (const thread of threads) { + const oldestThreadRawInfo = await rawInfoService.getOldestRawInfo(connection, { + channelId: channel?.id, + threadId: thread.id, + }); + + const newestThreadRawInfo = await rawInfoService.getNewestRawInfo(connection, { + channelId: channel?.id, + threadId: thread.id, + }); + + if (!oldestThreadRawInfo || !newestThreadRawInfo) { + continue; // No data to migrate for this thread + } + + const fetchedThreadMessages = await fetchMessagesBetweenOldestAndNewest( + connection, + thread, + oldestThreadRawInfo, + newestThreadRawInfo + ); + + const threadMessagesToUpdateTrue = []; + const threadMessagesToUpdateFalse = []; + + const oldestThreadMessage = await thread.messages.fetch(oldestThreadRawInfo.messageId); + const newestThreadMessage = await thread.messages.fetch(newestThreadRawInfo.messageId); + + if (oldestThreadMessage.webhookId) threadMessagesToUpdateTrue.push(oldestThreadMessage.id); + else threadMessagesToUpdateFalse.push(oldestThreadMessage.id); + + if (newestThreadMessage.webhookId) threadMessagesToUpdateTrue.push(newestThreadMessage.id); + else threadMessagesToUpdateFalse.push(newestThreadMessage.id); + + if (fetchedThreadMessages) { + for (const message of fetchedThreadMessages) { + if (message.webhookId) { + threadMessagesToUpdateTrue.push(message.id); + } else { + threadMessagesToUpdateFalse.push(message.id); + } } + } - logger.info({ guild_id: connection.name, channel_id: channel.id }, 'Migration for isGeneratedByWebhook is done'); + if (threadMessagesToUpdateTrue.length > 0) { + await rawInfoService.updateManyRawInfo( + connection, + { messageId: { $in: threadMessagesToUpdateTrue } }, + { isGeneratedByWebhook: true } + ); + } - } catch (err) { - logger.error({ guild_id: connection.name, channel_id: channel.id, err }, 'Migration for isGeneratedByWebhook failed'); + if (threadMessagesToUpdateFalse.length > 0) { + await rawInfoService.updateManyRawInfo( + connection, + { messageId: { $in: threadMessagesToUpdateFalse } }, + { isGeneratedByWebhook: false } + ); + } } -} + logger.info({ guild_id: connection.name, channel_id: channel.id }, 'Migration for isGeneratedByWebhook is done'); + } catch (err) { + logger.error( + { guild_id: connection.name, channel_id: channel.id, err }, + 'Migration for isGeneratedByWebhook failed' + ); + } +} /** - * + * * @param {Connection} connection - Mongoose connection object for the database. * @param {Client} client - The discord.js client object used to fetch the guild. * @param {Snowflake} guildId - The identifier of the guild to extract information from. */ async function runRawInfoMigration(connection: Connection, client: Client, guildId: Snowflake) { - logger.info({ guild_id: guildId }, 'Migration is running'); - try { - const guild = await client.guilds.fetch(guildId); - const channels = await channelService.getChannels(connection, {}); - for (let i = 0; i < channels.length; i++) { - const channel = await guild.channels.fetch(channels[i].channelId); - if (channel) { - if (channel.type !== 0) continue; - await migrateIsGeneratedByWebhook(connection, channel); - } - } - } catch (err) { - logger.error({ guild_id: guildId, err }, 'Migration is failed'); + logger.info({ guild_id: guildId }, 'Migration is running'); + try { + const guild = await client.guilds.fetch(guildId); + const channels = await channelService.getChannels(connection, {}); + for (let i = 0; i < channels.length; i++) { + const channel = await guild.channels.fetch(channels[i].channelId); + if (channel) { + if (channel.type !== 0) continue; + await migrateIsGeneratedByWebhook(connection, channel); + } } - logger.info({ guild_id: guildId }, 'Migration is done'); + } catch (err) { + logger.error({ guild_id: guildId, err }, 'Migration is failed'); + } + logger.info({ guild_id: guildId }, 'Migration is done'); } -export default runRawInfoMigration; \ No newline at end of file +export default runRawInfoMigration;