qrcode-framework
Version:
158 lines • 15.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const Common_1 = require("../common/Common");
const ErrorCode_1 = require("../common/ErrorCode");
const BaseService_1 = require("../core/BaseService");
const model_1 = require("../model");
const recommendation_1 = require("../model/recommendation");
const NumberUtil_1 = require("../util/NumberUtil");
class RecommendService extends BaseService_1.default {
async getRecommendsByGroup(groupId, pageSize, pageNumber, options) {
const limit = pageSize || 100;
const offset = pageNumber ? (pageNumber - 1) * limit : 0;
const platform = options ? options.platform : undefined;
const version = options ? options.version : undefined;
const tag = options ? options.tag : undefined;
let result;
// 如果是主推荐内容
if (NumberUtil_1.isEqual(groupId, 1)) {
result = await this.getMaterialRecommends(offset, limit, platform, version, tag);
}
if (NumberUtil_1.isEqual(groupId, 2)) {
result = await this.getBannerRecommends(offset, limit, platform, version);
}
if (NumberUtil_1.isEqual(groupId, 3)) {
result = await this.getADRecommends(offset, limit, platform, version);
}
return result;
}
async getRecommendation(id, platform, version) {
const r = await recommendation_1.RView.findOne({
where: {
rid: id,
},
});
if (!r) {
throw new ErrorCode_1.HttpError({
message: '当前推荐不存在',
errorCode: ErrorCode_1.ERROR_CODE.COMMON.NOT_FOUND,
status: 404,
});
}
let extra = null;
switch (r.rType) {
case model_1.R_TYPE.PICTURE:
extra = await this.ctx.service.pictureService.getById(r.meta.id);
break;
case model_1.R_TYPE.MATERIAL:
extra = await this.ctx.service.materialService.getMaterialGroup(r.meta.id, platform, version);
break;
case model_1.R_TYPE.MODEL:
extra = await this.ctx.service.htmlModelService.getModelById(r.meta.id);
break;
default:
break;
}
const result = r.toJSON();
Object.assign(result.meta, { extra });
return result;
}
async getMaterialRecommends(offset, size, platform, version, tag) {
const currentKey = `${Common_1.REDIS_KEY.MAIN_RECOMMEND}_${platform}_${version}_${tag}`;
if (!await this.ctx.app.redis.exists(currentKey)) {
await this.addMRToRedis(platform, version, tag);
}
return await this.getRecommends(offset, size, currentKey);
}
async getBannerRecommends(offset, size, platform, version) {
const currentKey = `${Common_1.REDIS_KEY.BANNER_RECOMMEND}_${platform}_${version}`;
if (!await this.ctx.app.redis.exists(currentKey)) {
await this.addBannerToRedis(platform, version);
}
return await this.getRecommends(offset, size, currentKey);
}
async getADRecommends(offset, size, platform, version) {
const currentKey = `${Common_1.REDIS_KEY.AD_RECOMMEND}_${platform}_${version}`;
if (!await this.ctx.app.redis.exists(currentKey)) {
await this.addADToRedis(platform, version);
}
return await this.getRecommends(offset, size, currentKey);
}
async getRecommends(offset, size, key) {
const rArray = await this.ctx.app.redis.zrevrangebyscore(key, '+inf', 0, 'LIMIT', offset + '', size + '');
const count = await this.ctx.app.redis.zcard(key);
return {
rows: rArray.map((r) => {
return recommendation_1.RView.fromDBScheme(JSON.parse(r));
}),
count,
};
}
async addMRToRedis(platform, version, tag) {
const versionWhere = platform === Common_1.PLATFORM.IOS
? `(ios_version is null or ios_version <= '${version}')`
: `(android_version is null or android_version <= '${version}')`;
const tagWhere = tag && parseInt(tag, 10) > 0 ? `and find_in_set(${tag}, tags) > 0` : null;
const result = await global.sequelize.query(`
SELECT *
FROM r_view
where gid = 1
and ${versionWhere}
${tagWhere || ''}
and (start_at is null or start_at <= now())
and (end_at is null or end_at >= now());
`);
const arg = this.convertRecommends(result[0]);
const key = `${Common_1.REDIS_KEY.MAIN_RECOMMEND}_${platform}_${version}_${tag}`;
await this.ctx.app.redis.zadd(key, ...arg.default);
await this.ctx.app.redis.expire(key, 60 * 60 * 24);
}
async addBannerToRedis(platform, version) {
const versionWhere = platform === Common_1.PLATFORM.IOS
? `(ios_version is null or ios_version <= '${version}')`
: `(android_version is null or android_version <= '${version}')`;
const result = await global.sequelize.query(`
SELECT *
FROM r_view
where gid = 2
and ${versionWhere}
and (start_at is null or start_at <= now())
and (end_at is null or end_at >= now());
`);
const arg = this.convertRecommends(result[0]);
await this.ctx.app.redis.zadd(`${Common_1.REDIS_KEY.BANNER_RECOMMEND}_${platform}_${version}`, ...arg.default);
await this.ctx.app.redis.expire(`${Common_1.REDIS_KEY.BANNER_RECOMMEND}_${platform}_${version}`, 60 * 60 * 24);
}
async addADToRedis(platform, version) {
const versionWhere = platform === Common_1.PLATFORM.IOS
? `(ios_version is null or ios_version <= '${version}')`
: `(android_version is null or android_version <= '${version}')`;
const result = await global.sequelize.query(`
SELECT *
FROM r_view
where gid = 3
and ${versionWhere}
and (start_at is null or start_at <= now())
and (end_at is null or end_at >= now());
`);
const arg = this.convertRecommends(result[0]);
await this.ctx.app.redis.zadd(`${Common_1.REDIS_KEY.AD_RECOMMEND}_${platform}_${version}`, ...arg.default);
await this.ctx.app.redis.expire(`${Common_1.REDIS_KEY.AD_RECOMMEND}_${platform}_${version}`, 60 * 60 * 24);
}
convertRecommends(rArray) {
const args = [];
rArray.forEach((r) => {
const obj = JSON.stringify(r);
args.push(this.getScore(r.level));
args.push(obj);
});
return {
default: args,
};
}
getScore(level) {
return level * 1000 + Math.random() * 100;
}
}
exports.default = RecommendService;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb21tZW5kU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIlJlY29tbWVuZFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2Q0FBcUQ7QUFDckQsbURBQTBEO0FBQzFELHFEQUE4QztBQUM5QyxvQ0FFa0I7QUFDbEIsNERBQThDO0FBQzlDLG1EQUEyQztBQUUzQyxNQUFxQixnQkFBaUIsU0FBUSxxQkFBVztJQUM5QyxLQUFLLENBQUMsb0JBQW9CLENBQUMsT0FBZSxFQUFFLFFBQWlCLEVBQUUsVUFBbUIsRUFDdkQsT0FBMEQ7UUFDeEYsTUFBTSxLQUFLLEdBQUcsUUFBUSxJQUFJLEdBQUcsQ0FBQztRQUM5QixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3hELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3RELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlDLElBQUksTUFBTSxDQUFDO1FBQ1gsV0FBVztRQUNYLElBQUksb0JBQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDckIsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNwRjtRQUNELElBQUksb0JBQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDckIsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQzdFO1FBQ0QsSUFBSSxvQkFBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRTtZQUNyQixNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ3pFO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFVLEVBQUUsUUFBZ0IsRUFBRSxPQUFlO1FBQ3hFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sc0JBQUssQ0FBQyxPQUFPLENBQUM7WUFDMUIsS0FBSyxFQUFFO2dCQUNILEdBQUcsRUFBRSxFQUFFO2FBQ1Y7U0FDSixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ0osTUFBTSxJQUFJLHFCQUFTLENBQUM7Z0JBQ2hCLE9BQU8sRUFBRSxTQUFTO2dCQUNsQixTQUFTLEVBQUUsc0JBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUztnQkFDdEMsTUFBTSxFQUFFLEdBQUc7YUFDZCxDQUFDLENBQUM7U0FDTjtRQUVELElBQUksS0FBSyxHQUFRLElBQUksQ0FBQztRQUN0QixRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUU7WUFDYixLQUFLLGNBQU0sQ0FBQyxPQUFPO2dCQUNmLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDakUsTUFBTTtZQUNWLEtBQUssY0FBTSxDQUFDLFFBQVE7Z0JBQ2hCLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzlGLE1BQU07WUFDVixLQUFLLGNBQU0sQ0FBQyxLQUFLO2dCQUNiLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RSxNQUFNO1lBQ1Y7Z0JBQ0ksTUFBTTtTQUNiO1FBRUQsTUFBTSxNQUFNLEdBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUM7UUFFcEMsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVPLEtBQUssQ0FBQyxxQkFBcUIsQ0FDL0IsTUFBYyxFQUNkLElBQVksRUFDWixRQUFpQixFQUNqQixPQUFnQixFQUNoQixHQUFZO1FBRVosTUFBTSxVQUFVLEdBQVcsR0FBRyxrQkFBUyxDQUFDLGNBQWMsSUFBSSxRQUFRLElBQUksT0FBTyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDOUMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDbkQ7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTyxLQUFLLENBQUMsbUJBQW1CLENBQUMsTUFBYyxFQUFFLElBQVksRUFBRSxRQUFpQixFQUFFLE9BQWdCO1FBQy9GLE1BQU0sVUFBVSxHQUFXLEdBQUcsa0JBQVMsQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLElBQUksT0FBTyxFQUFFLENBQUM7UUFDbEYsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUM5QyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDbEQ7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQWMsRUFBRSxJQUFZLEVBQUUsUUFBaUIsRUFBRSxPQUFnQjtRQUMzRixNQUFNLFVBQVUsR0FBVyxHQUFHLGtCQUFTLENBQUMsWUFBWSxJQUFJLFFBQVEsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM5RSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQzlDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDOUM7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRztRQUN6QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDMUcsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xELE9BQU87WUFDSCxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNuQixPQUFPLHNCQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QyxDQUFDLENBQUM7WUFDRixLQUFLO1NBQ1IsQ0FBQztJQUNOLENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRztRQUM3QyxNQUFNLFlBQVksR0FBRyxRQUFRLEtBQUssaUJBQVEsQ0FBQyxHQUFHO1lBQzFDLENBQUMsQ0FBQywyQ0FBMkMsT0FBTyxJQUFJO1lBQ3hELENBQUMsQ0FBQyxtREFBbUQsT0FBTyxJQUFJLENBQUM7UUFDckUsTUFBTSxRQUFRLEdBQUcsR0FBRyxJQUFJLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMzRixNQUFNLE1BQU0sR0FBVSxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDOzs7O2tCQUl6QyxZQUFZO2NBQ2hCLFFBQVEsSUFBSSxFQUFFOzs7U0FHbkIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sR0FBRyxHQUFHLEdBQUcsa0JBQVMsQ0FBQyxjQUFjLElBQUksUUFBUSxJQUFJLE9BQU8sSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN4RSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxPQUFPO1FBQzVDLE1BQU0sWUFBWSxHQUFHLFFBQVEsS0FBSyxpQkFBUSxDQUFDLEdBQUc7WUFDMUMsQ0FBQyxDQUFDLDJDQUEyQyxPQUFPLElBQUk7WUFDeEQsQ0FBQyxDQUFDLG1EQUFtRCxPQUFPLElBQUksQ0FBQztRQUNyRSxNQUFNLE1BQU0sR0FBVSxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDOzs7O2tCQUl6QyxZQUFZOzs7U0FHckIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLGtCQUFTLENBQUMsZ0JBQWdCLElBQUksUUFBUSxJQUFJLE9BQU8sRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLGtCQUFTLENBQUMsZ0JBQWdCLElBQUksUUFBUSxJQUFJLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDMUcsQ0FBQztJQUVPLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE9BQU87UUFDeEMsTUFBTSxZQUFZLEdBQUcsUUFBUSxLQUFLLGlCQUFRLENBQUMsR0FBRztZQUMxQyxDQUFDLENBQUMsMkNBQTJDLE9BQU8sSUFBSTtZQUN4RCxDQUFDLENBQUMsbURBQW1ELE9BQU8sSUFBSSxDQUFDO1FBQ3JFLE1BQU0sTUFBTSxHQUFVLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7Ozs7a0JBSXpDLFlBQVk7OztTQUdyQixDQUFDLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsa0JBQVMsQ0FBQyxZQUFZLElBQUksUUFBUSxJQUFJLE9BQU8sRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLGtCQUFTLENBQUMsWUFBWSxJQUFJLFFBQVEsSUFBSSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3RHLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxNQUFhO1FBQ25DLE1BQU0sSUFBSSxHQUFVLEVBQUUsQ0FBQztRQUN2QixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDakIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU87WUFDSCxPQUFPLEVBQUUsSUFBSTtTQUNoQixDQUFDO0lBQ04sQ0FBQztJQUVPLFFBQVEsQ0FBQyxLQUFhO1FBQzFCLE9BQU8sS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBQzlDLENBQUM7Q0FDSjtBQTdLRCxtQ0E2S0MifQ==