diff --git a/api/package.json b/api/package.json index 7eb7715..b0791d2 100644 --- a/api/package.json +++ b/api/package.json @@ -4,7 +4,7 @@ "description": "a basic API for interacting with databases of literacy app data", "main": "app.js", "scripts": { - "test": "mocha --recursive -reporter spec -require test/setup.js" + "test": "mocha --recursive -reporter spec" }, "repository": { "type": "git", diff --git a/api/src/CL-IRIs.json b/api/src/CL-IRIs.json deleted file mode 100644 index 4e5b6b6..0000000 --- a/api/src/CL-IRIs.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "splashScreen": { - "id": "https://curiouslearning.org/FTM/screens/splash", - "display": { - "en-US": "Splash Screen", - } - }, - "Profile": { - "id": "https://curiouslearning.org/FTM/screens/profile", - "display": { - "en-US": "Profile Screen", - } - }, - "Map": { - "id": "https://curiouslearning.org/FTM/screens/map", - "display": { - "en-US": "Map", - } - }, - "Settings": { - "id": "https://curiouslearning.org/FTM/screens/settings", - "display": { - "en-US": "Settings Screen", - } - }, - "Settings": { - "id": "https://curiouslearning.org/FTM/screens/settings", - "display": { - "en-US": "Settings Screen", - } - }, -} diff --git a/api/src/api.js b/api/src/api.js index 46bb9e1..05ae305 100644 --- a/api/src/api.js +++ b/api/src/api.js @@ -1,33 +1,20 @@ -const http = require('http'); -const url = require('url'); const express = require('express'); -const router = express.Router(); const mustache = require('mustache'); const config = require('./config'); const tableMap = require('./tableMap'); -const { - MissingDataError, - MalformedArgumentError, - BigQueryManager, - BigQueryParser, - SqlLoader -} = require('./helperClasses'); -const queryStrings = new SqlLoader(config.sqlFiles, './src/sql'); - -const DAYINSECONDS = 86400; -/** -* returns the table containing records from the given app id -* @param{string} id the app id -* @returns{string} the table name in SQL table format -*/ -const getDataset = function (map, id, getHistoric) { +const { BigQuery } = require('@google-cloud/bigquery'); +const fs = require('fs'); + +const getDataset = function (id) { + const map = tableMap; + const regex = /(^[a-z]{2,3})([\.][a-z0-9]*)+$/gmi; if (!id.match(regex)) { const msg = `cannot parse app id: '${id}'. Check formatting and try again`; throw new MalformedArgumentError(msg); } const obj = map[id]; - if (!obj ) { + if (!obj) { const msg = `could not find a table for app id: '${id}'`; const err = new MissingDataError(msg); throw err; @@ -35,91 +22,66 @@ const getDataset = function (map, id, getHistoric) { return `${obj.project}.${obj.dataset}`; } -function sendRows(res, rows, nextCursor) { - const parser = new BigQueryParser(config.sourceMapping); - const resObj = parser.formatRowsToJson(rows); - return res.status(200).json({nextCursor, size: resObj.length, data: resObj}); +function getDayOffset(timestamp) { + return Math.ceil((new Date() - new Date(Math.round(timestamp / 1000))) / 1000 / 60 / 60 / 24) } -/** -* handler for GET requests to /fetch_latest -* returns all records for app_id logged after the given cursor -* @param{obj} req the request -* @param{obj} res the response -*/ -async function fetchLatestHandler (req, res, next) { - const searchParams = req.query; +async function fetchEvents(params) { + const { appId, source, from, country, limit } = params; + console.log(`Fetching data for: ${JSON.stringify(params)}`) - if (!searchParams.app_id) { //TODO: Edit proofreading to allow timestamp OR job hash - return res.status(400).send({msg: config.errNoId}); - } else if (!searchParams.from && !searchParams.token) { - return res.status(400).send({msg: config.errNoCursor}); - } else if (!searchParams.from.match(/[0-9]{1,10}/gmi)) { - return res.status(400).send({msg: config.errBadTimestamp}); - } - const sql = queryStrings.getQueryString(config.sqlFiles.fetchLatest) + const dataset = getDataset(appId) + const sql = fs.readFileSync('src/sql/fetch_latest.sql').toString(); + + const query = mustache.render(sql, { dataset }) const options = { - query: sql, - location: config.fetchLatestQuery.loc, + query: query, params: { - pkg_id: searchParams.app_id, - ref_id: searchParams.attribution_id || '', - user_id: searchParams.user_id || '', - event: searchParams.event || '', - cursor: Number(searchParams.from) * 1000000, //convert to micros - //only search back as far as we need to - range: Math.ceil(((Date.now()/1000) - searchParams.from)/DAYINSECONDS), - }, - types: { - pkg_id: 'STRING', - ref_id: 'STRING', - cursor: 'INT64', - range: 'INT64', + traffic_source: source, + range: getDayOffset(from), + cursor: from, + country: country, + limit: limit, }, + location: 'US', }; - try{ - const dataset = getDataset(tableMap, options.params.pkg_id); - options.query = mustache.render(options.query, {dataset: dataset}); - const maxRows = config.fetchLatestQuery.MAXROWS; - const callback = (rows, id, token) => { - if(id && token) { - let combinedToken = encodeURIComponent(`${id}/${token}`); - sendRows(res, rows, combinedToken); - } else { - sendRows(res, rows, null); - } - }; - if(searchParams.token) { - let params = decodeURIComponent(searchParams.token).split('/'); - const job = {id: params[0], token: params[1]}; - //TODO decode token into job id and token - const bq = new BigQueryManager(options, maxRows, job.id, job.token); - bq.fetchNext(callback); - } - else { - const bq = new BigQueryManager(options, maxRows); - bq.start(callback); - } - } catch (e) { - next(e) - } + const bigquery = new BigQuery(); + + const [job] = await bigquery.createQueryJob(options); + console.log(`Job ${job.id} started.`); + + const [rows] = await job.getQueryResults(); + return rows } -function apiErrorHandler(err, req, res, next) { - if(err.name === 'MalformedArgumentError') { - return res.status(400).send({ - msg: err.message, - err: err, - }); +async function fetchLatestHandler(req, res, next) { + const searchParams = req.query; + + const { app_id: appId, from, traffic_source: source, limit, country } = searchParams; + + + // TODO: cleanup checks, preferably with a Type or something simple + if (!appId) { + return res.status(400).send({ msg: config.errNoId }); + } else if (!from) { + return res.status(400).send({ msg: config.errNoCursor }); + } else if (!from.match(/[0-9]{1,10}/gmi)) { + return res.status(400).send({ msg: config.errBadTimestamp }); + } else if (!source) { + return res.status(400).send({ msg: "No source" }) + } + + try { + const rows = await fetchEvents({ appId, source, from: Number(from), country, limit: Number(limit) }) + res.status(200).json({ data: rows }) } - if(err.name === 'MissingDataError') { - return res.status(404).send({ - msg: err.message, - err: err, - }); + catch (e) { + next(e) } - console.log(err.stack); +} + +function apiErrorHandler(err, _, res) { return res.status(500).send({ msg: err.message, err: err, @@ -127,7 +89,9 @@ function apiErrorHandler(err, req, res, next) { } module.exports = (app) => { - app.use('/', router); - router.get('/fetch_latest*', fetchLatestHandler); - app.use('/', apiErrorHandler); + const router = express.Router(); + router.get('/fetch_latest*', fetchLatestHandler); + + app.use('/', router); + app.use('/', apiErrorHandler); }; diff --git a/api/src/bigQueryStatementBuilder.js b/api/src/bigQueryStatementBuilder.js deleted file mode 100644 index 5e14ba1..0000000 --- a/api/src/bigQueryStatementBuilder.js +++ /dev/null @@ -1,108 +0,0 @@ - -const ADL['verbs'] = require('verbs.min.js'); -class BigQueryStatementBuilder { - constructor() {} - - createXapiStatement (row) { - let statement = { - id: generateStatementId(row), - actor: { - objectType: "Agent", - account: { - "homePage": "https://curiouslearning.org", - "name": row.user_pseudo_id, - } - }, - verb: getVerbObject(row), - object: { - objectType: selectObjectType(row), - id: getObjectIri(row), - }, - timestamp: row.event_timestamp, - }; - statement = checkForAndAddResult(statement); - } - - generateStatementId(row) { - //TODO: determine method for generating statement uuid - } - - getVerbObject(row) { - let actionArray = row.action.split('_'); - switch(actionArray[0]) { - case "SegmentFail": - return ADL.verbs.failed; - case "LevelFail": - return ADL.verbs.failed; - case "SegmentSuccess": - return ADL.verbs.completed; - case "LevelSuccess": - return ADL.verbs.completed; - case "MonsterPettingDone": - return ADL.verbs.completed; - case "SubSkillIncrease": - return ADL.verbs.progressed; - case "MonsterEvolve": - return ADL.verbs.progressed; - case "NewMonster": - return ADL.verbs.experienced; - default: - return ADL.verbs.interacted; - - } - } - - selectObjectType(row){ - /* Object Types: - * Splash Screen - * Profile - * Screen - * Map - * Settings - * Level - * Segment - * Monster - * Puzzle Letter - * Puzzle Sound Letter - * Puzzle Letter In Word - * Puzzle Word - * Puzzle Sound Word - * Letter Tracing - * Parents Report - * Memory Game - * Monster Petting - * SubSkill - * Session - */ - //TODO: determine scope of objects in BigQuery results - } - - getObjectIri(row) { - //TODO: build IRI library for FTM/CuriousReader objects - } - - checkForAndAddResult(statement) { - if(requiresResult(statement.verb.id)) { - let result= { - score: { - scaled: , - raw: , - min: , - max: , - }, - success: , - completion: , - duration: , - response: , - duration: , - }; - statement['result'] = result; - } - return statement; - } - -} - -module.exports = { - BigQueryStatementBuilder, -}; diff --git a/api/src/config.json b/api/src/config.json index ae13d99..3038c4a 100644 --- a/api/src/config.json +++ b/api/src/config.json @@ -1,12 +1,7 @@ { - "port":"3000", - "sqlFiles": { - "fetchLatest": "fetch_latest.sql" - }, + "port": "3000", "fetchLatestQuery": { - "loc": "US", - "cacheDuration": 300, - "MAXROWS": 1000 + "loc": "US" }, "errNoId": "Please provide an app id to search against", "errNoAttr": "Please provide an attribution id to filter results", diff --git a/api/src/helperClasses.js b/api/src/helperClasses.js deleted file mode 100644 index f79d7a0..0000000 --- a/api/src/helperClasses.js +++ /dev/null @@ -1,336 +0,0 @@ -const { BigQuery } = require('@google-cloud/bigquery'); -const Memcached = require('memcached'); -const fs = require('fs'); - -class MissingDataError extends Error { - constructor(message) { - super(message); - this.name = 'MissingDataError'; - } -} - -class MalformedArgumentError extends Error { - constructor(message) { - super(message); - this.name = "MalformedArgumentError"; - } -} - -class BigQueryParser { - constructor(mapping){ - this.mapping = mapping; - } - - formatRowsToJson (rows) { - let resObj = rows.map((row) => { - return { - attribution_url: row.attribution_id, - app_id: row.app_package_name, - ordered_id: row.event_timestamp, - user: { - id: row.user_pseudo_id, - metadata: { - continent: row.geo.continent, - country: row.geo.country, - region: row.geo.region, - city: row.geo.city, - }, - ad_attribution: { - source: this.getSource(row.attribution_id), - data: { - advertising_id: row.device.advertising_id, - }, - }, - }, - event: { - name: this.parseName(row.action), - date: row.event_date, - timestamp: row.event_timestamp, - value_type: this.getValueType(row.label), - value: this.getValue(row.label) || row.val, - level: this.getLevel(row.screen) || this.getLevel(row.label)||this.getLevel(row.action)||"0", - profile: this.getProfile(row.screen) || 'unknown', - rawData: { - action: row.action, - label: row.label, - screen: row.screen, - value: row.value, - } - }, - }; - }); - return resObj; - } - - getLevel(input) { - try { - if(input.split('-').length > 1) { - return input.split('-')[0].split(' ')[1]; - } else if (input.split('_').length > 1) { - let arr = input.split('_'); - let val = arr[arr.length-1]; - if(Number(val)){ - return val; - } - } else if(input === 'Splash Screen' || input === 'Map'){ - return input; - } else { - return null; - } - } catch(e) { - return null; - } - } - - getProfile(screen) { - try { - return screen.split(':')[1].trim(); - } catch(e) { - return null; - } - } - - parseName(action) { - if(action.indexOf('Segment') !== -1 || action.indexOf('Level') !== -1 || action.indexOf('Monster') !==-1) { - return action.split('_')[0].trim(); - } else { - return action; - } - } - - getValueType(label) { - if (label === '') { - return 'N/A'; - } - let spacesSplit = label.split(' '); - if (spacesSplit[0] === 'Puzzle') { - return label.split(':')[0].replace('Puzzle ', ''); - } else if (spacesSplit[1] === 'puzzles') { - return spacesSplit[1]; - } else if (spacesSplit[0] === 'days_since_last') { - return 'days'; - } else if (spacesSplit[0] === 'total_playtime' || spacesSplit[0] === 'average_session' || spacesSplit[0] === 'timestamp') { - return 'seconds'; - } else if (spacesSplit[0].indexOf('Level') !== -1){ - return 'Monster Level' - }else{ - return null; - } - } - - getValue(label) { - if(label.indexOf('Puzzle') !== -1) { - return label.split(':')[1].trim(); - } else if (label.indexOf('puzzles') != -1) { - return label.split(' ')[0].trim(); - } else { - return null; - } - } - - getSource(referralString) { - if (!referralString) return "no-source"; - const group = referralString.split('_'); - let source = group[0].toString().toLowerCase(); - if(this.mapping[source]) - { - return this.mapping[source]; - } - return 'no-source'; - } -} - -class BigQueryManager { - constructor (queryOptions, maxRows, jobId, token) { - this.queryOptions = queryOptions; - this.MAXROWS = maxRows; - this.rows = []; - this.bq = new BigQuery(); - this.allResultsFetched = false; - if(jobId) { - this.jobId = jobId; - } - if (token) { - this.token = token; - } - } - - async start (onCompleteCallback) { - this.setCompleteCallback(onCompleteCallback); - this.bq.createQueryJob(this.queryOptions).then((response) => { - const job = response[0] - this.jobId = job.id; - if(job) { - const queryResultOptions = { - maxResults: this.MAXROWS, - autopaginate: false, - timeoutMs: 60000 - }; - return job.getQueryResults(queryResultOptions, this.paginationCallback.bind(this)); - } - }).catch((err)=> { - console.error(err); - throw err; - }); - } - - paginationCallback(err, rows, nextQuery, apiResponse) { - if (err) throw err; - this.rows = rows; - if(nextQuery) { - this.token = nextQuery.pageToken; - if(this.onComplete) { - this.onComplete(this.rows, this.jobId, this.token); - } - } else { - this.allResultsFetched = true; - if (this.onComplete) { - this.onComplete(this.rows, null, null); - } - } - } - - fetchNext(onCompleteCallback) { - if(!this.jobId || this.allResultsFetched) { - if(onCompleteCallback) { - onCompleteCallback ([], null, null); - } - return; - } - const job = this.bq.job(this.jobId); - if(onCompleteCallback) { - this.setCompleteCallback(onCompleteCallback); - } - const queryOptions = { - maxResults: this.MAXROWS, - autopaginate: false, - pageToken: this.token, - }; - try { - job.getQueryResults(queryOptions, this.paginationCallback.bind(this)); - } catch (e) { - throw e; - } - } - - setCompleteCallback(callback) { - this.onComplete = callback; - } - isComplete() { - return this.allResultsFetched; - } - getOptions() { - return this.queryOptions; - } -} - -//currently unused, keeping it around in case we need it -class MemcachedManager { - constructor(address) { - if(!address) { - throw new Error('Please provide a cache address'); - } - console.log(`memcached endpoint: ${address}`); - this.memcached = new Memcached(address); - } - createKey (prefix, params) { - if(typeof(prefix) !== 'string' && typeof(prefix) !== 'number') { - throw new Error("Keys can only be made with strings or numbers!"); - } - let key = `__${prefix}__`; - for(let param in params) { - if (params[param]) { - if (typeof(param) !== 'string' && typeof(param) !== 'number') { - throw new Error("Keys can only be made with strings or numbers!"); - } - key += params[param].toString(); - } - } - return key; - } - cacheResults (key, data, duration) { - this.memcached.set(key, data, duration, function (err) { - if(err) { - console.error(err); - throw err; - } - }); - } - - removeCache(key) { - this.memcached.del(key, (err) => { - if(err) { - console.error(err); - throw err; - } - }); - } - - get(key, callback) { - this.memcached.get(key, callback); - } - - set (key, data, callback) { - this.memcached.set(key, data, callback); - } -} - -class SqlLoader { - constructor (paths, basePath = '.', encoding = 'utf-8') { - if(!paths) { - throw new Error('you must provide an array or map of paths to sql files'); - } - this.basePath = basePath; - this.fileStrings = {}; - this.encoding = encoding; - this.loadPaths(paths); - } - - loadPaths(paths) { - if(Array.isArray(paths)) { - this.loadPathsFromArray(paths); - } else if (typeof(paths) === 'object') { - this.loadPathsFromMap(paths); - } - } - - loadPathsFromArray(paths) { - try { - paths.forEach((path) => { - const filePath = `${this.basePath}/${path}`; - const file = fs.readFileSync(filePath, this.encoding); - this.fileStrings[path] = file.toString(); - }); - } catch (e) { - console.error('error loading one or more sql files'); - throw e; - } - } - - loadPathsFromMap(paths) { - try { - for (let path in paths) { - const filePath = `${this.basePath}/${paths[path]}`; - const file = fs.readFileSync(filePath, this.encoding); - this.fileStrings[paths[path]] = file.toString(); - } - } catch (e) { - console.error('error loading one or more sql files'); - throw e - } - } - - getQueryString(path) { - if(!this.fileStrings[path]) throw new Error(`no query for path ${path}!`); - return this.fileStrings[path]; - } -} - -module.exports = { - MissingDataError, - MalformedArgumentError, - BigQueryManager, - BigQueryParser, - MemcachedManager, - SqlLoader -}; diff --git a/api/src/index.js b/api/src/index.js index d19c199..e0d7b3a 100644 --- a/api/src/index.js +++ b/api/src/index.js @@ -1,9 +1,5 @@ -const http = require('http'); -const url = require('url'); const express = require('express'); const app = express(); -const fs = require('fs'); -const { BigQuery } = require('@google-cloud/bigquery'); const litApiRoutes = require('./api'); const config = require('./config.json'); const port = config.port || 3000; diff --git a/api/src/sql/fetch_latest.sql b/api/src/sql/fetch_latest.sql index 7af3b8d..4150f3b 100644 --- a/api/src/sql/fetch_latest.sql +++ b/api/src/sql/fetch_latest.sql @@ -1,148 +1,36 @@ -CREATE FUNCTION IF NOT EXISTS `{{dataset}}.getValue`(vals STRUCT) -AS( - CASE - WHEN - vals.string_value IS NOT NULL THEN vals.string_value - WHEN vals.int_value IS NOT NULL THEN CAST(vals.int_value AS STRING) - WHEN vals.float_value IS NOT NULL THEN CAST(vals.float_value AS STRING) - WHEN vals.double_value IS NOT NULL then CAST(vals.double_value AS STRING) - ELSE NULL - END -); -WITH - APP_INITIALIZED AS ( - SELECT - params.value.string_value as attribution_id, - CAST(event_timestamp as STRING) as val, - "app_initialized" as action, - "timestamp" as label, - * EXCEPT(user_properties, key, value) - FROM - `{{dataset}}.events_*`, - UNNEST(event_params) AS params - WHERE - _TABLE_SUFFIX BETWEEN '20210801' AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)) - AND event_name = 'app_initialized' - AND params.value.string_value = @ref_id OR @ref_id=''), - INIT_SCREEN AS ( - SELECT - attribution_id, - action, - label, - val, - `{{dataset}}.getValue`(params.value) as screen, - * EXCEPT(attribution_id, val, action, label, event_params, key, value) - FROM - APP_INITIALIZED, - UNNEST(APP_INITIALIZED.event_params) as params - WHERE - params.key = 'screen' - ), - DEFAULT_SCREEN AS ( - SELECT - attribution_id, - action, - label, - val, - "Splash Screen" as screen, - * EXCEPT(attribution_id, val, action, label, event_params) - FROM - APP_INITIALIZED - WHERE - NOT EXISTS( - SELECT - * - FROM - UNNEST(event_params) as params - WHERE params.key = 'firebase_screen' - ) -), - LITERACY_DATA AS ( - SELECT - * - FROM - `{{dataset}}.events_*` - WHERE - _TABLE_SUFFIX BETWEEN FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL @range DAY)) - AND FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)) - AND app_info.id = @pkg_id - AND event_timestamp > @cursor - AND (event_name = 'SubSkill' - OR event_name = 'TimeTracking' - OR event_name = 'GamePlay') - AND (device.advertising_id = @user_id OR user_pseudo_id = @user_id OR @user_id = '') - ), -FILTERED_LIT_DATA AS ( - SELECT - `{{dataset}}.getValue`(params.value) as action, - * EXCEPT(key, value) - FROM - LITERACY_DATA, - UNNEST(LITERACY_DATA.event_params) as params - WHERE - params.key = "action" - AND (params.value.string_value LIKE CONCAT(@event, '%') OR @event = '') -), SCREENS AS ( - SELECT - `{{dataset}}.getValue`(params.value) as screen, - action, - * EXCEPT(action, key, value) - FROM - FILTERED_LIT_DATA, - UNNEST(FILTERED_LIT_DATA.event_params) as params - WHERE - params.key = "firebase_screen" -), LABELS AS ( - SELECT - action, - `{{dataset}}.getValue`(params.value) as label, - screen, - * EXCEPT(action, screen, key, value) - FROM SCREENS, - UNNEST(SCREENS.event_params) as params - WHERE params.key = "label" -), -VALS AS ( - SELECT - action, - label, - `{{dataset}}.getValue`(params.value) as val, - screen, - * EXCEPT(label, action, screen, key, value) - FROM LABELS, - UNNEST(LABELS.event_params) as params - WHERE params.key = "value" -) -SELECT - APP_INITIALIZED.attribution_id, - VALS.action, - VALS.label, - VALS.val, - VALS.screen, - VALS.* EXCEPT(action, label, val, screen, event_params, user_properties) -FROM - VALS -INNER JOIN APP_INITIALIZED on APP_INITIALIZED.user_pseudo_id = VALS.user_pseudo_id -UNION ALL( - SELECT - attribution_id, - action, - label, - val, - screen, - * EXCEPT(attribution_id, action, screen, label, val) - FROM - INIT_SCREEN -) -UNION ALL ( - SELECT - attribution_id, - action, - label, - val, - screen, - * EXCEPT(attribution_id, action, screen, label, val) - FROM - DEFAULT_SCREEN -) -ORDER BY event_timestamp DESC + SELECT user_pseudo_id, + event_name, + event_timestamp, + traffic_source, + geo, + device, + (select as struct + (select params.value.string_value from unnest(event_params) as params where params.key = 'label') as label, + (select as struct + (select case + when event_name = 'FirstOpenRefer' then (select params.value.string_value from unnest(event_params) as params where params.key = 'referrer') + when event_name = 'UUIDGenerated' then (select params.value.string_value from unnest(event_params) as params where params.key = 'uuid') + else (select params.value.string_value from unnest(event_params) as params where params.key = 'value') + end) as string_value, + (select case + when event_name = 'GamePlay' then (select CAST(REGEXP_EXTRACT(params.value.string_value, r'_(\d+)$') AS INT64) from unnest(event_params) as params where params.key = 'action') + else (select params.value.int_value from unnest(event_params) as params where params.key = 'value') + end) as int_value, + (select params.value.float_value from unnest(event_params) as params where params.key = 'value') as float_value, + (select params.value.double_value from unnest(event_params) as params where params.key = 'value') as double_value + ) as value, + (select case + when event_name = 'GamePlay' then (select REGEXP_EXTRACT(params.value.string_value, r'([^_]+)(?:_Level)?_\d+$') from unnest(event_params) as params where params.key = 'action') + else (select params.value.string_value from unnest(event_params) as params where params.key = 'action') + end + ) as action + ) as event_params + FROM `{{dataset}}.events_*` as events +WHERE (_TABLE_SUFFIX BETWEEN FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL @range DAY)) + AND FORMAT_DATE("%Y%m%d", CURRENT_DATE()) + OR _TABLE_SUFFIX LIKE 'intraday%') +AND event_timestamp >= @cursor +AND traffic_source.source = @traffic_source +AND geo.country = @country +ORDER BY event_timestamp +LIMIT @limit diff --git a/api/src/sql/mustache.json b/api/src/sql/mustache.json deleted file mode 100644 index e69de29..0000000 diff --git a/api/src/tableMap.json b/api/src/tableMap.json index 69b7ba4..93ba882 100644 --- a/api/src/tableMap.json +++ b/api/src/tableMap.json @@ -1,54 +1,54 @@ { - "com.eduapp4syria.feedthemonsterENGLISH": { "project": "ftm-english", "dataset": "analytics_152408808", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterHindi": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterNepali": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterThai": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterKannada": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterUrdu": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterMalay": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterAmharic": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterGujarati": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterKurdish": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterTajik": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterWolof": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterArabic": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterMarathi": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterPashto": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterHausa": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterSesotho": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterEnglishIndian": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterSiswati": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterYoruba": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterShona": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterJavanese": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterMalagasy": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterHatianCreole": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterTagalog": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterIgbo": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterVenda": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterAzerbaijani": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterBangla": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterVietnamese": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterENGLISHAUS": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterTsonga": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterWAENGLISH": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterBrazilianPortuguese": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterTswana": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterLugandan": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*"}, - "com.eduapp4syria.FeedTheMonsterZULU": { "project": "ftm-zulu", "dataset": "analytics_155849122", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterSwahili": { "project": "ftm-swahili", "dataset": "analytics_160694316", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterFrench": { "project": "ftm-french", "dataset": "analytics_173880465", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterAfrikaans": { "project": "ftm-afrikaans", "dataset": "analytics_177200876", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterTURKISH": { "project": "ftm-b9d99", "dataset": "analytics_159643920", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterGeorgian": { "project": "ftm-b9d99", "dataset": "analytics_159643920", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterWAENGLISH": { "project": "ftm-b9d99", "dataset": "analytics_159643920", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterFarsi": { "project": "ftm-b9d99", "dataset": "analytics_159643920", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterUkranian": { "project": "ftm-b9d99", "dataset": "analytics_159643920", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterisiXhosa": { "project": "ftm-isixhosa", "dataset": "analytics_180747962", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterKinyarwanda": { "project": "ftm-kinyarwanda", "dataset": "analytics_177922191", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterOromo": { "project": "ftm-oromo", "dataset": "analytics_167539175", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterSePedi": { "project": "ftm-sepedi", "dataset": "analytics_180755978", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterSOMALI": { "project": "ftm-somali", "dataset": "analytics_159630038", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterSAEnglish": { "project": "ftm-southafricanenglish", "dataset": "analytics_173750850", "table": "events_*"}, - "com.eduapp4syria.feedthemonsterSPANISH": { "project": "ftm-spanish", "dataset": "analytics_158656398", "table": "events_*"} + "com.eduapp4syria.feedthemonsterENGLISH": { "project": "ftm-english", "dataset": "analytics_152408808", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterHindi": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterNepali": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterThai": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterKannada": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterUrdu": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterMalay": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterAmharic": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterGujarati": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterKurdish": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterTajik": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterWolof": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterArabic": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterMarathi": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterPashto": { "project": "ftm-hindi", "dataset": "analytics_174638281", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterHausa": { "project": "ftm-zulu", "dataset": "analytics_155849122", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterSesotho": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterEnglishIndian": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterSiswati": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterYoruba": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterShona": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterJavanese": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterMalagasy": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterHatianCreole": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterTagalog": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterIgbo": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterVenda": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterAzerbaijani": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterBangla": { "project": "ftm-zulu", "dataset": "analytics_155849122", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterVietnamese": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterENGLISHAUS": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterTsonga": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterWAENGLISH": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterBrazilianPortuguese": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterTswana": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterLugandan": { "project": "ftm-brazilian-portuguese", "dataset": "analytics_161789655", "table": "events_*" }, + "com.eduapp4syria.FeedTheMonsterZULU": { "project": "ftm-zulu", "dataset": "analytics_155849122", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterSwahili": { "project": "ftm-swahili", "dataset": "analytics_160694316", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterFrench": { "project": "ftm-zulu", "dataset": "analytics_155849122", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterAfrikaans": { "project": "ftm-afrikaans", "dataset": "analytics_177200876", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterTURKISH": { "project": "ftm-b9d99", "dataset": "analytics_159643920", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterGeorgian": { "project": "ftm-b9d99", "dataset": "analytics_159643920", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterWAENGLISH": { "project": "ftm-b9d99", "dataset": "analytics_159643920", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterFarsi": { "project": "ftm-b9d99", "dataset": "analytics_159643920", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterUkranian": { "project": "ftm-b9d99", "dataset": "analytics_159643920", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterisiXhosa": { "project": "ftm-isixhosa", "dataset": "analytics_180747962", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterKinyarwanda": { "project": "ftm-kinyarwanda", "dataset": "analytics_177922191", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterOromo": { "project": "ftm-oromo", "dataset": "analytics_167539175", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterSePedi": { "project": "ftm-sepedi", "dataset": "analytics_180755978", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterSOMALI": { "project": "ftm-somali", "dataset": "analytics_159630038", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterSAEnglish": { "project": "ftm-southafricanenglish", "dataset": "analytics_173750850", "table": "events_*" }, + "com.eduapp4syria.feedthemonsterSPANISH": { "project": "ftm-spanish", "dataset": "analytics_158656398", "table": "events_*" } } diff --git a/api/src/verbs.json b/api/src/verbs.json deleted file mode 100644 index ad2f207..0000000 --- a/api/src/verbs.json +++ /dev/null @@ -1,190 +0,0 @@ - { - "abandoned" : { - "id" : "https://w3id.org/xapi/adl/verbs/abandoned", - "display" : {"en-US" : "abandoned", - "fr-FR" : "a abandonné"} - }, - "answered" : { - "id" : "http://adlnet.gov/expapi/verbs/answered", - "display" : {"de-DE" : "beantwortete", - "en-US" : "answered", - "fr-FR" : "a répondu", - "es-ES" : "contestó"} - }, - "asked" : { - "id" : "http://adlnet.gov/expapi/verbs/asked", - "display" : {"de-DE" : "fragte", - "en-US" : "asked", - "fr-FR" : "a demandé", - "es-ES" : "preguntó"} - }, - "attempted" : { - "id" : "http://adlnet.gov/expapi/verbs/attempted", - "display" : {"de-DE" : "versuchte", - "en-US" : "attempted", - "fr-FR" : "a essayé", - "es-ES" : "intentó"} - }, - "attended" : { - "id" : "http://adlnet.gov/expapi/verbs/attended", - "display" : {"de-DE" : "nahm teil an", - "en-US" : "attended", - "fr-FR" : "a suivi", - "es-ES" : "asistió"} - }, - "commented" : { - "id" : "http://adlnet.gov/expapi/verbs/commented", - "display" : {"de-DE" : "kommentierte", - "en-US" : "commented", - "fr-FR" : "a commenté", - "es-ES" : "comentó"} - }, - "completed" : { - "id" : "http://adlnet.gov/expapi/verbs/completed", - "display" : {"de-DE" : "beendete", - "en-US" : "completed", - "fr-FR" : "a terminé", - "es-ES" : "completó"} - }, - "exited" : { - "id" : "http://adlnet.gov/expapi/verbs/exited", - "display" : {"de-DE" : "verließ", - "en-US" : "exited", - "fr-FR" : "a quitté", - "es-ES" : "salió"} - }, - "experienced" : { - "id" : "http://adlnet.gov/expapi/verbs/experienced", - "display" : {"de-DE" : "erlebte", - "en-US" : "experienced", - "fr-FR" : "a éprouvé", - "es-ES" : "experimentó"} - }, - "failed" : { - "id" : "http://adlnet.gov/expapi/verbs/failed", - "display" : {"de-DE" : "verfehlte", - "en-US" : "failed", - "fr-FR" : "a échoué", - "es-ES" : "fracasó"} - }, - "imported" : { - "id" : "http://adlnet.gov/expapi/verbs/imported", - "display" : {"de-DE" : "importierte", - "en-US" : "imported", - "fr-FR" : "a importé", - "es-ES" : "importó"} - }, - "initialized" : { - "id" : "http://adlnet.gov/expapi/verbs/initialized", - "display" : {"de-DE" : "initialisierte", - "en-US" : "initialized", - "fr-FR" : "a initialisé", - "es-ES" : "inicializó"} - }, - "interacted" : { - "id" : "http://adlnet.gov/expapi/verbs/interacted", - "display" : {"de-DE" : "interagierte", - "en-US" : "interacted", - "fr-FR" : "a interagi", - "es-ES" : "interactuó"} - }, - "launched" : { - "id" : "http://adlnet.gov/expapi/verbs/launched", - "display" : {"de-DE" : "startete", - "en-US" : "launched", - "fr-FR" : "a lancé", - "es-ES" : "lanzó"} - }, - "mastered" : { - "id" : "http://adlnet.gov/expapi/verbs/mastered", - "display" : {"de-DE" : "meisterte", - "en-US" : "mastered", - "fr-FR" : "a maîtrisé", - "es-ES" : "dominó"} - }, - "passed" : { - "id" : "http://adlnet.gov/expapi/verbs/passed", - "display" : {"de-DE" : "bestand", - "en-US" : "passed", - "fr-FR" : "a réussi", - "es-ES" : "aprobó"} - }, - "preferred" : { - "id" : "http://adlnet.gov/expapi/verbs/preferred", - "display" : {"de-DE" : "bevorzugte", - "en-US" : "preferred", - "fr-FR" : "a préféré", - "es-ES" : "prefirió"} - }, - "progressed" : { - "id" : "http://adlnet.gov/expapi/verbs/progressed", - "display" : {"de-DE" : "machte Fortschritt mit", - "en-US" : "progressed", - "fr-FR" : "a progressé", - "es-ES" : "progresó"} - }, - "registered" : { - "id" : "http://adlnet.gov/expapi/verbs/registered", - "display" : {"de-DE" : "registrierte", - "en-US" : "registered", - "fr-FR" : "a enregistré", - "es-ES" : "registró"} - }, - "responded" : { - "id" : "http://adlnet.gov/expapi/verbs/responded", - "display" : {"de-DE" : "reagierte", - "en-US" : "responded", - "fr-FR" : "a répondu", - "es-ES" : "respondió"} - }, - "resumed" : { - "id" : "http://adlnet.gov/expapi/verbs/resumed", - "display" : {"de-DE" : "setzte fort", - "en-US" : "resumed", - "fr-FR" : "a repris", - "es-ES" : "continuó"} - }, - "satisfied" : { - "id" : "https://w3id.org/xapi/adl/verbs/satisfied", - "display" : {"en-US" : "satisfied"} - }, - "scored" : { - "id" : "http://adlnet.gov/expapi/verbs/scored", - "display" : {"de-DE" : "erreichte", - "en-US" : "scored", - "fr-FR" : "a marqué", - "es-ES" : "anotó"} - }, - "shared" : { - "id" : "http://adlnet.gov/expapi/verbs/shared", - "display" : {"de-DE" : "teilte", - "en-US" : "shared", - "fr-FR" : "a partagé", - "es-ES" : "compartió"} - }, - "suspended" : { - "id" : "http://adlnet.gov/expapi/verbs/suspended", - "display" : {"de-DE" : "pausierte", - "en-US" : "suspended", - "fr-FR" : "a suspendu", - "es-ES" : "aplazó"} - }, - "terminated" : { - "id" : "http://adlnet.gov/expapi/verbs/terminated", - "display" : {"de-DE" : "beendete", - "en-US" : "terminated", - "fr-FR" : "a terminé", - "es-ES" : "terminó"} - }, - "voided" : { - "id" : "http://adlnet.gov/expapi/verbs/voided", - "display" : {"de-DE" : "entwertete", - "en-US" : "voided", - "fr-FR" : "a annulé", - "es-ES" : "anuló"} - }, - "waived" : { - "id" : "https://w3id.org/xapi/adl/verbs/waived", - "display" : {"en-US" : "waived"} - } - } diff --git a/api/test/api.spec.js b/api/test/api.spec.js deleted file mode 100644 index 88b5e9e..0000000 --- a/api/test/api.spec.js +++ /dev/null @@ -1,385 +0,0 @@ -const sinon = require('sinon'); -const proxyquire = require('proxyquire').noPreserveCache(); -const supertest = require('supertest'); -const express = require('express'); -const sandbox = sinon.createSandbox(); -const queryResults = require('./fixtures/queryResults.json'); -const {BigQueryParser} = require('../src/helperClasses.js'); -const config = require('../src/config.json'); - -describe('Literacy API Routes', () => { - let app, request, cacheManager, bqManager, sqlLoader; - let pkgId, attrId, from, queryOptions; - let resultSet, jobId, token; - let api; - const bqParser = new BigQueryParser(config.sourceMapping); - beforeEach(() => { - pkgId = 'fake-pkg'; - attrId = ''; - from = 123456789000000; - resultSet = queryResults.set3; - jobId= 'fake-job'; - token= 'th1s1safak3t0k3n'; - queryOptions= { - string: 'fake querystring', - params: { - pkg_id: pkgId, - attr_id: attrId, - cursor: from - } - }; - cacheManager = { - createKey: sandbox.stub().returns(`__test__${token}${attrId}${from}`), - cacheResults: sandbox.stub(), - removeCache: sandbox.stub(), - get: sandbox.stub() - .onCall(0).callsArgWith(1, null, null) - .onCall(1).callsArgWith(1, null, {jobId: jobId, token: token}), - set: sandbox.stub(), - }; - bqManager = { - start: sandbox.stub().callsArgWith(0, resultSet, jobId, token), - fetchNext: sandbox.stub().callsArgWith(0, resultSet, null, null), - getOptions: sandbox.stub().returns(queryOptions), - isComplete: sandbox.stub().returns(false), - }; - sqlLoader = { - getQueryString: sandbox.stub().returns('fake-query-string'), - } - api = proxyquire('../src/api', { - './helperClasses': { - MemcachedManager: sinon.stub().callsFake(() => {return cacheManager;}), - BigQueryManager: sinon.stub().callsFake(()=> {return bqManager;}), - SqlLoader: sinon.stub().callsFake(()=> {return sqlLoader;}), - }, - }); - app = express(); - api(app); - request = supertest(app); - }); - - afterEach(() => { - sandbox.restore(); - sandbox.reset(); - }); - it('it should successfully stub the dependencies', () => { - cacheManager.createKey().should.equal(`__test__${token}${attrId}${from}`); - cacheManager.cacheResults.should.exist; - cacheManager.removeCache.should.exist; - cacheManager.get.should.exist; - cacheManager.set.should.exist; - bqManager.start.should.exist; - bqManager.fetchNext.should.exist; - bqManager.getOptions().should.deep.equal(queryOptions); - bqManager.isComplete().should.equal(false); - }) - it('we can make a get request at the api endpoint', (done) => { - request - .get('/fetch_latest') - .query({ - app_id: 'com.eduapp4syria.feedthemonsterENGLISH', - attribution_id: 'referral_source_8675309', - from: 0, - }) - .expect('Content-Type', /json/) - .expect(200) - .end(done); - }); - it('we can successfully omit the referral id if desired', (done) => { - request - .get('/fetch_latest') - .query({ - app_id: 'com.eduapp4syria.feedthemonsterENGLISH', - from: 0, - }) - .expect(200) - .end(done); - }); - it('we receive a 400 error if we omit the app id', (done) => { - request - .get('/fetch_latest') - .query({ - attribution_id: 'referral_source_8675309', - from: 0, - }) - .expect(400) - .end(done); - }); - it('we receive a 400 error if we omit the cursor', (done) => { - request - .get('/fetch_latest') - .query({ - app_id: 'com.eduapp4syria.feedthemonsterENGLISH', - attribution_id: 'referral_source_8675309', - }) - .expect(400) - .end(done); - }); - it('we receive a 404 error if we submit a missing app id', (done) => { - request - .get('/fetch_latest') - .query({ - app_id: 'com.missing.pkg', - attribution_id: 'referral_source_8675309', - from: 0, - }) - .expect(404) - .end(done); - }); - it('we receive a 400 error if we submit an improperly formatted app id', (done) => { - request - .get('/fetch_latest') - .query({ - app_id: 'fake-pkg', - attribution_id: 'referral_source_8675309', - from: 0, - }) - .expect(400) - .end(done); - }); - it('we receive a 400 error if we submit an improperly formatted cursor', (done) => { - request - .get('/fetch_latest') - .query({ - app_id: 'fake-pkg', - attribution_id: 'referral_source_8675309', - from: 'A75A&FD569^&', - }) - .expect(400) - .end(done); - - }); - it('we receive a 500 error if BigQuery fails to fetch data', (done) => { - bqManager.start = sandbox.stub().throws('auth failure'); - request - .get('/fetch_latest') - .query({ - app_id: 'com.eduapp4syria.feedthemonsterENGLISH', - attribution_id: 'referral_source_8675309', - from: 0, - }) - .expect(500) - .end(done); - }); - it('the data we receive are properly formatted', (done) => { - let expected = resultSet.map((row)=> { - return { - attribution_url: row.attribution_id, - app_id: row.app_package_name, - ordered_id: row.event_timestamp, - user: { - id: row.user_pseudo_id, - metadata: { - continent: row.geo.continent, - country: row.geo.country, - region: row.geo.region, - city: row.geo.city, - }, - ad_attribution: { - source: 'no-source', - data: { - advertising_id: row.device.advertising_id, - }, - }, - }, - event: { - name: bqParser.parseName(row.action), - date: row.event_date, - timestamp: row.event_timestamp, - value_type: bqParser.getValueType(row.label), - value: bqParser.getValue(row.label) || row.val, - level: bqParser.getLevel(row.screen) || row.label.split('_')[1], - profile: bqParser.getProfile(row.screen) || 'unknown', - rawData: { - action: row.action, - label: row.label, - screen: row.screen, - value: row.value, - } - }, - }; - }); - request - .get('/fetch_latest') - .query({ - app_id: 'com.eduapp4syria.feedthemonsterENGLISH', - attribution_id: 'referral_source_8675309', - from: 0, - }) - .expect(200) - .end((err, res)=> { - if (err) return done(err); - res.body.data.should.deep.equal(expected); - done(); - }) - }); - it('we receive a cursor when there is more data', (done) => { - request - .get('/fetch_latest') - .query({ - app_id: 'com.eduapp4syria.feedthemonsterENGLISH', - attribution_id: 'referral_source_8675309', - from: 0, - }) - .expect(200) - .end((err, res)=> { - if (err) return done(err); - res.body.nextCursor.should.equal(encodeURIComponent(`${jobId}/${token}`)); - done(); - }) - }); - it('we receive no cursor when there is no more data', (done) => { - bqManager.start.callsArgWith(0, resultSet, null, null); - request - .get('/fetch_latest') - .query({ - app_id: 'com.eduapp4syria.feedthemonsterENGLISH', - attribution_id: 'referral_source_8675309', - from: 0, - }) - .expect(200) - .end((err, res)=> { - if (err) return done(err); - should.equal(res.body.nextCursor, null); - done(); - }) - }); - - it('we receive a second subset of data when passing the returned cursor', (done) => { - let secondResults = queryResults.set4 - let expected = secondResults.map((row) => { - return { - attribution_url: row.attribution_id, - app_id: row.app_package_name, - ordered_id: row.event_timestamp, - user: { - id: row.user_pseudo_id, - metadata: { - continent: row.geo.continent, - country: row.geo.country, - region: row.geo.region, - city: row.geo.city, - }, - ad_attribution: { - source: 'no-source', - data: { - advertising_id: row.device.advertising_id, - }, - }, - }, - event: { - name: bqParser.parseName(row.action), - date: row.event_date, - timestamp: row.event_timestamp, - value_type: bqParser.getValueType(row.label), - value: bqParser.getValue(row.label) || row.val, - level: bqParser.getLevel(row.screen) || row.label.split('_')[1], - profile: bqParser.getProfile(row.screen) || 'unknown', - rawData: { - action: row.action, - label: row.label, - screen: row.screen, - value: row.value, - } - }, - }; - }); - bqManager.fetchNext.callsArgWith(0, secondResults, null, null); - request - .get('/fetch_latest') - .query({ - app_id: 'com.eduapp4syria.feedthemonsterENGLISH', - attribution_id: 'referral_source_8675309', - from: 0, - }) - .expect(200) - .end((err, res)=> { - if (err) return done(err); - console.log("beep"); - request - .get('/fetch_latest') - .query({ - app_id: 'com.eduapp4syria.feedthemonsterENGLISH', - attribution_id: 'referral_source_8675309', - from: 0, - token: res.body.nextCursor, - }) - .expect(200) - .end((err, fi) => { - if (err) return done(err); - console.log("boop"); - fi.body.data.should.deep.equal(expected); - done(); - }); - }); - }); - it('we do not receive the same cursor when submitting a returned cursor', (done) => { - let secondResults = queryResults.set4 - let expected = secondResults.map((row) => { - return { - attribution_url: row.attribution_id, - app_id: row.app_package_name, - ordered_id: row.event_timestamp, - user: { - id: row.user_pseudo_id, - metadata: { - continent: row.geo.continent, - country: row.geo.country, - region: row.geo.region, - city: row.geo.city, - }, - ad_attribution: { - source: 'no-source', - data: { - advertising_id: row.device.advertising_id, - }, - }, - }, - event: { - name: bqParser.parseName(row.action), - date: row.event_date, - timestamp: row.event_timestamp, - value_type: bqParser.getValueType(row.label), - value: bqParser.getValue(row.label) || row.val, - level: bqParser.getLevel(row.screen) || row.label.split('_')[1], - profile: bqParser.getProfile(row.screen) || 'unknown', - rawData: { - action: row.action, - label: row.label, - screen: row.screen, - value: row.value, - } - }, - }; - }); - bqManager.fetchNext.callsArgWith(0, secondResults, null, null); - request - .get('/fetch_latest') - .query({ - app_id: 'com.eduapp4syria.feedthemonsterENGLISH', - attribution_id: 'referral_source_8675309', - from: 0, - }) - .expect(200) - .end((err, res)=> { - if (err) return done(err); - - console.log(`cursor: ${res.body.nextCursor}`) - request - .get('/fetch_latest') - .query({ - app_id: 'com.eduapp4syria.feedthemonsterENGLISH', - attribution_id: 'referral_source_8675309', - from: 0, - token: res.body.nextCursor, - }) - .expect(200) - .end((err, fi) => { - if (err) return done(err); - - should.equal(fi.body.nextCursor, null); - done(); - }); - }) - }) -}); diff --git a/api/test/api.test.js b/api/test/api.test.js new file mode 100644 index 0000000..561d6b5 --- /dev/null +++ b/api/test/api.test.js @@ -0,0 +1,21 @@ +const { expect } = require('chai') +const express = require('express') +const routes = require('../src/api') +const request = require('supertest'); + + +describe('/fetch_latest', () => { + + it('Returns 400 if missing query params', async () => { + const app = express() + routes(app) + + const response = await request(app) + .get('/fetch_latest') + .set('Accept', 'application/json') + .expect('Content-Type', /json/) + .expect(400); + + expect(response.body.msg).to.contain('app id') + }) +}) diff --git a/api/test/bigQueryManager.spec.js b/api/test/bigQueryManager.spec.js deleted file mode 100644 index 969c9e0..0000000 --- a/api/test/bigQueryManager.spec.js +++ /dev/null @@ -1,164 +0,0 @@ -const sinon = require('sinon'); -const proxyquire = require('proxyquire'); -const sandbox = sinon.createSandbox(); -const queryResults = require('./fixtures/queryResults.json'); -describe('BigQueryManager', () => { - let job; - let bigQuery; - let queryOptions; - let maxRows; - let jobId; - let token; - beforeEach(() => { - jobId = 'fake-job-id-01'; - token = 'thisisafaket0k3n'; - maxRows = 1000; - queryOptions = { - string: 'fake-query-string', - location: 'fake-loc', - params: { - pkg_id: 'fake-pkg', - ref_id: 'fake-ref-source', - cursor: 123456789000000, - range: Math.ceil((Date.now() - 123456789)/86400), - }, - types: { - pkg_id: 'STRING', - ref_id: 'STRING', - cursor: 'INT64', - }, - }; - job = { - id: jobId, - getQueryResults: sandbox.stub(), - } - job.getQueryResults.onCall(0).callsArgWith(1, null, queryResults.set1, { - maxResults: maxRows, - autopaginate: false, - pageToken: token}, {msg: 'fake-api-response'}); - job.getQueryResults.onCall(1).callsArgWith(1, null, queryResults.set2, null, {msg:'fake-api-response'}); - bigQuery = { - createQueryJob: sandbox.stub().resolves([job, {msg: 'fake-api-response'}]), - job: sandbox.stub().returns(job), - } - }); - - afterEach(() => { - sandbox.restore(); - }); - - const { BigQueryManager } = proxyquire('../src/helperClasses', { - '@google-cloud/bigquery': { - BigQuery: sinon.stub().callsFake(() => { - return bigQuery; - }), - } - }); - - it('should take a query options object and a max row value in constructor', ()=> { - try { - const test = new BigQueryManager(queryOptions, maxRows); - test.MAXROWS.should.equal(maxRows); - const res = test.getOptions(); - res.should.deep.equal(queryOptions); - } catch(e) { - e.should.equal(null); - } - }); - it('should take an optional job id and token in constructor', () => { - try { - const test = new BigQueryManager(queryOptions, maxRows, jobId, token); - test.jobId.should.equal(jobId); - test.token.should.equal(token); - } catch (e) { //an error should not happen - e.should.equal(null); - } - }); - it('should start a new bigquery job on start', async () => { - const test = new BigQueryManager(queryOptions, maxRows); - await test.start(() => {}); - bigQuery.createQueryJob.should.have.been.calledWith(queryOptions); - }); - it('should get the results when the new query has finished', async () => { - const test = new BigQueryManager(queryOptions, maxRows); - const spy = sandbox.spy(test, 'paginationCallback'); - await test.start(() => {}); - job.getQueryResults.should.have.been.calledWith({ - maxResults: maxRows, - autopaginate: false, - timeoutMs: 60000 - }, sinon.match.func); - }); - it('should call the pagination callback after a new job is complete', async ()=> { - const test = new BigQueryManager(queryOptions, maxRows); - const spy = sandbox.spy(test, 'paginationCallback'); - await test.start(() => {}); - spy.should.have.been.calledWith(null, queryResults.set1, { - maxResults: maxRows, - autopaginate: false, - pageToken: token, - }, {msg: 'fake-api-response'}); - }); - it('should pass the proper arguments to the client callback', async ()=> { - const test = new BigQueryManager(queryOptions, maxRows); - const callback= sandbox.stub(); - await test.start(callback); - callback.should.have.been.calledWith(queryResults.set1, jobId, token); - }); - it('should inform the client when all results fetched', async () => { - job.getQueryResults.onCall(0).callsArgWith(1, null, queryResults.set2, null, {msg: 'fake-api-response'}); - const test = new BigQueryManager(queryOptions, maxRows); - const callback = sandbox.stub(); - await test.start(callback); - callback.should.have.been.calledWith(queryResults.set2, null, null); - }); - it('should create a job object with the id', () => { - try{ - const test = new BigQueryManager(queryOptions, maxRows, jobId, token); - test.fetchNext(); - bigQuery.job.should.have.been.calledWith(jobId); - } catch (e) { - should.not.exist(e); - } - }) - it('should not start a new job if a jobId is present', () => { - const test = new BigQueryManager(queryOptions, maxRows, jobId); - test.fetchNext(); - bigQuery.createQueryJob.should.not.have.been.called; - }); - it('should not fetch results if all results have been fetched', () => { - const test = new BigQueryManager(queryOptions, maxRows, jobId, null); - test.allResultsFetched = true; - const callback = sandbox.stub(); - test.fetchNext(callback); - callback.should.have.been.calledWith([], null, null); - }) - it('should pass the token when resuming a job', () => { - const test = new BigQueryManager(queryOptions, maxRows, jobId, token); - test.fetchNext(); - job.getQueryResults.should.have.been.calledWith({ - maxResults: maxRows, - autopaginate: false, - pageToken: token - }, sinon.match.func); - }); - it('should not re-query the database when all results fetched', () => { - const test = new BigQueryManager(queryOptions, maxRows); - const callback = sandbox.stub(); - test.fetchNext(callback); - callback.should.have.been.calledWith([], null, null); - }); - - it('should fetch the next set of results', (done) => { - const test = new BigQueryManager(queryOptions, maxRows); - const callback = (rows, jobId, token) => { - if (!token) { - rows.should.deep.equal(queryResults.set2); - done(); - } else { - test.fetchNext(); - } - }; - test.start(callback) - }); -}); diff --git a/api/test/bigQueryParser.spec.js b/api/test/bigQueryParser.spec.js deleted file mode 100644 index d03c39f..0000000 --- a/api/test/bigQueryParser.spec.js +++ /dev/null @@ -1,227 +0,0 @@ - -const sinon = require('sinon'); -const proxyquire = require('proxyquire').noPreserveCache(); -const supertest = require('supertest'); -const express = require('express'); -const sandbox = sinon.createSandbox(); -const fixtures = require('./fixtures/parserFixtures.json'); -const {BigQueryParser} = require('../src/helperClasses.js'); -const config = require('../src/config'); - -beforeEach(()=> {}); - -afterEach(()=> { - sandbox.restore(); -}); - -describe('BigQueryHelper', () => { - let bqParser = new BigQueryParser(config.sourceMapping); - beforeEach(() => { - - }); - - afterEach(() => { - sandbox.restore(); - }); - - describe('parseName', () => { - - }); - - describe('getLevel', () => { - it('should successfully parse the string', () => { - const row = fixtures[0].row; - const expected = fixtures[0].expected; - let actual = bqParser.getLevel(row.screen); - actual.should.equal(expected.event.level); - }); - - it('should return null on an improperly formatted string', () => { - const row = fixtures[6].row; - const actual = bqParser.getLevel(row.screen); - expect(actual).to.be.null; - }); - - it('should return null on an improperly formatted string', () => { - const row = fixtures[2].row; - const actual = bqParser.getLevel(row.screen); - expect(actual).to.be.null; - }); - - it('should return null on an improperly formatted string', () => { - const screen = "Monster Select"; - const actual = bqParser.getLevel(screen); - expect(actual).to.be.null - }); - - it('should return the level number', () => { - const row = fixtures[2].row; - const expected = fixtures[2].expected; - const actual = bqParser.getLevel(row.label); - actual.should.equal(expected.event.level); - }); - - it('should return the level number', () => { - const row = fixtures[6].row; - const expected = fixtures[6].expected; - const actual = bqParser.getLevel(row.action); - actual.should.equal(expected.event.level); - }); - it('should return the level number', () => { - const row = fixtures[7].row; - const expected = fixtures[7].expected; - const actual = bqParser.getLevel(row.action); - actual.should.equal(expected.event.level); - }); - - it('should return null on improperly formatted input', () => { - const row = fixtures[6].row; - const expected = fixtures[6].expected; - const actual = bqParser.getLevel(row.label); - expect(actual).to.be.null; - }); - - it('should return null on improperly formatted input', () => { - const label = "fjhwkdcagds"; - const actual = bqParser.getLevel(label); - expect(actual).to.be.null; - }); - }); - - describe('getProfile', () => { - it('should successfully parse the string', () => { - const row = fixtures[0].row; - const expected = fixtures[0].expected; - let actual = bqParser.getProfile(row.screen); - actual.should.equal(expected.event.profile); - }); - - it('should return null on an improperly formatted string', () => { - const row = fixtures[6].row; - const actual = bqParser.getProfile(row.screen); - expect(actual).to.be.null; - }); - - it('should return null on an improperly formatted string', () => { - const row = fixtures[2].row; - const actual = bqParser.getProfile(row.screen); - expect(actual).to.be.null; - }); - }); - - describe('getValueType', ()=>{ - it('should return the stimulus type', () => { - const row = fixtures[5].row; - const expected = fixtures[5].expected; - const actual = bqParser.getValueType(row.label); - actual.should.equal(expected.event.value_type); - }); - it('should return "puzzles"', () => { - const row = fixtures[4].row; - const actual = bqParser.getValueType(row.label); - actual.should.equal("puzzles"); - }); - it('should return "seconds"', () => { - const row = fixtures[0].row; - const actual = bqParser.getValueType(row.label); - actual.should.equal("seconds"); - }); - it('should return "seconds"', () => { - const row = fixtures[1].row; - const actual = bqParser.getValueType(row.label); - actual.should.equal("seconds"); - }); - it('should return "days"', () => { - const row = fixtures[8].row; - const actual = bqParser.getValueType(row.label); - actual.should.equal('days'); - }); - it('should return "Monster Level"', () => { - const row = fixtures[2].row; - const actual = bqParser.getValueType(row.label); - actual.should.equal('Monster Level'); - }); - it('should return "null"', () => { - const label = 'fhwkqgads'; - const actual = bqParser.getValueType(label); - expect(actual).to.be.null; - }); - }); - - describe('getValue', () => { - - it('should return the stimulus', () => { - const row = fixtures[5].row; - const expected = fixtures[5].expected; - const actual = bqParser.getValue(row.label); - actual.should.equal(expected.event.value); - }); - - it('should return the number of puzzles', () => { - const row = fixtures[4].row; - const expected = fixtures[4].expected; - const actual = bqParser.getValue(row.label); - actual.should.equal(expected.event.value); - }); - - it('should return null on a non-value label', () => { - const row = fixtures[2].row; - const expected = fixtures[2].expected; - const actual = bqParser.getValue(row.label); - expect(actual).to.be.null; - }); - }); - - describe('getSource', () => { - it('should return "no-source"', () => { - const row = fixtures[0].row; - const actual = bqParser.getSource(row.attribution_id); - actual.should.equal('no-source'); - }); - it('should return "Facebook"', () => { - const attr = "FB_Language_App_6_2022"; - const actual = bqParser.getSource(attr); - actual.should.equal('Facebook'); - }); - it('should return "Google"', () => { - const attr = "Google_Bangla_App_Test"; - const actual = bqParser.getSource(attr); - actual.should.equal('Google'); - }); - it('should return "direct"', () => { - const attr = "(direct)"; - const actual = bqParser.getSource(attr); - actual.should.equal('direct'); - }); - }); - - describe('formatRowsToJson', () => { - it('should parse data correctly', () => { - const rows = [ - fixtures[0].row, - fixtures[1].row, - fixtures[2].row, - fixtures[3].row, - fixtures[4].row, - fixtures[5].row, - fixtures[6].row, - fixtures[7].row, - fixtures[8].row - ]; - const expected = [ - fixtures[0].expected, - fixtures[1].expected, - fixtures[2].expected, - fixtures[3].expected, - fixtures[4].expected, - fixtures[5].expected, - fixtures[6].expected, - fixtures[7].expected, - fixtures[8].expected - ]; - const actual = bqParser.formatRowsToJson(rows); - actual.should.deep.equal(expected); - }); - - }); -}); diff --git a/api/test/cacheManager.spec.js b/api/test/cacheManager.spec.js deleted file mode 100644 index 4818644..0000000 --- a/api/test/cacheManager.spec.js +++ /dev/null @@ -1,86 +0,0 @@ -const sinon = require('sinon'); -const proxyquire = require('proxyquire'); -const sandbox = sinon.createSandbox(); - -describe('CacheManager', () => { - let memcached; - let cache; - let params; - - beforeEach(() => { - cache = { - jobId: 'fake-job', - token: 'th1s1safak3t0k3n' - }; - memcached = { - set: sandbox.stub(), - get: sandbox.stub().returns(cache), - del: sandbox.stub() - }; - params = { - pkg_id: 'pkg', - cursor: 123456789000000, - }; - }); - - const { MemcachedManager } = proxyquire('../src/helperClasses', { - 'memcached': sinon.stub().callsFake(() => { - return memcached; - }), - }); - - afterEach(() => { - sandbox.restore(); - }); - - it('should initialize successfully', () => { - const test = new MemcachedManager('fakeaddr'); - test.memcached.should.deep.equal(memcached); - }); - it('should throw an error if no address specified', () => { - try { - const test = new MemcachedManager(); - test.should.equal(null); - } catch (e) { - e.message.should.equal('Please provide a cache address'); - } - }); - it('should set a key-value pair in the cache', ()=>{ - const test = new MemcachedManager('fakeaddr'); - test.cacheResults('fake-key', cache, 3600); - memcached.set.should.have.been.calledWith('fake-key', cache, 3600, sinon.match.func); - }); - it('should get the corresponding cache from the key', () => { - const test = new MemcachedManager('fakeaddr'); - test.get('fake-key', (err, data) => { - }); - memcached.get.should.have.been.calledWith('fake-key', sinon.match.func); - }); - it('should delete the key-value pair from the cache', ()=>{ - const test = new MemcachedManager('fakeaddr'); - test.removeCache('fake-key'); - memcached.del.should.have.been.calledWith('fake-key', sinon.match.func); - }); - it('should create a key from the prefix and parameters', () => { - const test = new MemcachedManager('fakeaddr'); - const newKey = test.createKey('test', params); - newKey.should.equal(`__test__${params.pkg_id}${params.cursor}`); - }); - it('should throw an error on bad prefix arguments', () => { - try { - const test = new MemcachedManager('fakeaddr'); - const newKey = test.createKey(() => {return 'test'}, params); - } catch(e) { - e.message.should.equal('Keys can only be made with strings or numbers!'); - } - }); - it('should throw an error on bad key params', () => { - params.pkg_id = true; - try { - const test = new MemcachedManager('fakeaddr'); - const newKey = test.createKey('test', params); - } catch(e) { - e.message.should.equal('Keys can only be made with strings or numbers!'); - } - }); -}); diff --git a/api/test/fixtures/parserFixtures.json b/api/test/fixtures/parserFixtures.json deleted file mode 100644 index 890b073..0000000 --- a/api/test/fixtures/parserFixtures.json +++ /dev/null @@ -1,622 +0,0 @@ -[{ - "row": { - "user_pseudo_id": "pseudo_id_1", - "attribution_id": "referral_source_8675309", - "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", - "event_timestamp": 1001, - "device": { - "advertising_id": "fake-ad-id-1" - }, - "event_date": "fake-date", - "geo": { - "continent": "fake-continent", - "country": "fake-country", - "city": "fake-city", - "region": "fake-region" - }, - "event_name": "fake-event", - "label": "total_playtime", - "screen": "Level 1 - Profile: 2", - "action": "TotalPlaytime", - "val": "120000", - "value": { - "string_value": "fake-value", - "int_value": "NULL", - "float_value": "NULL", - "double_value": "NULL" - } - }, - "expected": { - "attribution_url": "referral_source_8675309", - "app_id": "com.eduapp4syria.feedthemonsterENGLISH", - "ordered_id": 1001, - "user": { - "id": "pseudo_id_1", - "metadata": { - "continent": "fake-continent", - "country": "fake-country", - "region": "fake-region", - "city": "fake-city" - }, - "ad_attribution": { - "source": "no-source", - "data": { - "advertising_id": "fake-ad-id-1" - } - } - }, - "event": { - "name": "TotalPlaytime", - "date": "fake-date", - "timestamp": 1001, - "value_type": "seconds", - "value": "120000", - "level": "1", - "profile": "2", - "rawData": { - "label": "total_playtime", - "screen": "Level 1 - Profile: 2", - "action": "TotalPlaytime", - "value": { - "string_value": "fake-value", - "int_value": "NULL", - "float_value": "NULL", - "double_value": "NULL" - } - } - } - } - }, - { - "row": { - "user_pseudo_id": "pseudo_id_22", - "attribution_id": "referral_source_8675309", - "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", - "event_timestamp": 10022, - "device": { - "advertising_id": "fake-ad-id-22" - }, - "event_date": "fake-date", - "geo": { - "continent": "fake-continent", - "country": "fake-country", - "city": "fake-city", - "region": "fake-region" - }, - "event_name": "fake-event", - "label": "average_session", - "screen": "Level 1 - Profile: 0", - "action": "AvgSession", - "val": "477.80062866210938", - "value": { - "string_value": "fake-value", - "int_value": "NULL", - "float_value": "NULL", - "double_value": "NULL" - } - }, - "expected": { - "attribution_url": "referral_source_8675309", - "app_id": "com.eduapp4syria.feedthemonsterENGLISH", - "ordered_id": 10022, - "user": { - "id": "pseudo_id_22", - "metadata": { - "continent": "fake-continent", - "country": "fake-country", - "region": "fake-region", - "city": "fake-city" - }, - "ad_attribution": { - "source": "no-source", - "data": { - "advertising_id": "fake-ad-id-22" - } - } - }, - "event": { - "name": "AvgSession", - "date": "fake-date", - "timestamp": 10022, - "value_type": "seconds", - "value": "477.80062866210938", - "level": "1", - "profile": "0", - "rawData": { - "label": "average_session", - "screen": "Level 1 - Profile: 0", - "action": "AvgSession", - "value": { - "string_value": "fake-value", - "int_value": "NULL", - "float_value": "NULL", - "double_value": "NULL" - } - } - } - } - }, - { - "row": { - "user_pseudo_id": "pseudo_id_52", - "attribution_id": "referral_source_8675309", - "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", - "event_timestamp": 10052, - "device": { - "advertising_id": "fake-ad-id-52" - }, - "event_date": "fake-date", - "geo": { - "continent": "fake-continent", - "country": "fake-country", - "city": "fake-city", - "region": "fake-region" - }, - "event_name": "fake-event", - "label": "Level_6", - "action": "SelectMonster Magnet Evolve_4", - "screen": "Monster Select", - "val": "1", - "value": { - "string_value": "fake-value", - "int_value": "NULL", - "float_value": "NULL", - "double_value": "NULL" - } - }, - "expected": { - "attribution_url": "referral_source_8675309", - "app_id": "com.eduapp4syria.feedthemonsterENGLISH", - "ordered_id": 10052, - "user": { - "id": "pseudo_id_52", - "metadata": { - "continent": "fake-continent", - "country": "fake-country", - "region": "fake-region", - "city": "fake-city" - }, - "ad_attribution": { - "source": "no-source", - "data": { - "advertising_id": "fake-ad-id-52" - } - } - }, - "event": { - "name": "SelectMonster Magnet Evolve", - "date": "fake-date", - "timestamp": 10052, - "value_type": "Monster Level", - "value": "1", - "level": "6", - "profile": "unknown", - "rawData": { - "label": "Level_6", - "screen": "Monster Select", - "action": "SelectMonster Magnet Evolve_4", - "value": { - "string_value": "fake-value", - "int_value": "NULL", - "float_value": "NULL", - "double_value": "NULL" - } - } - } - } - }, - { - "row": { - "user_pseudo_id": "pseudo_id_53", - "attribution_id": "referral_source_8675309", - "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", - "event_timestamp": 10053, - "device": { - "advertising_id": "fake-ad-id-53" - }, - "event_date": "fake-date", - "geo": { - "continent": "fake-continent", - "country": "fake-country", - "city": "fake-city", - "region": "fake-region" - }, - "event_name": "fake-event", - "label": "3 puzzles", - "screen": "Level 1 - Profile: 1", - "action": "LevelSuccess_1", - "val": "0", - "value": { - "string_value": "fake-value", - "int_value": "NULL", - "float_value": "NULL", - "double_value": "NULL" - } - }, - "expected": { - "attribution_url": "referral_source_8675309", - "app_id": "com.eduapp4syria.feedthemonsterENGLISH", - "ordered_id": 10053, - "user": { - "id": "pseudo_id_53", - "metadata": { - "continent": "fake-continent", - "country": "fake-country", - "region": "fake-region", - "city": "fake-city" - }, - "ad_attribution": { - "source": "no-source", - "data": { - "advertising_id": "fake-ad-id-53" - } - } - }, - "event": { - "name": "LevelSuccess", - "date": "fake-date", - "timestamp": 10053, - "value_type": "puzzles", - "value": "3", - "level": "1", - "profile": "1", - "rawData": { - "label": "3 puzzles", - "screen": "Level 1 - Profile: 1", - "action": "LevelSuccess_1", - "value": { - "string_value": "fake-value", - "int_value": "NULL", - "float_value": "NULL", - "double_value": "NULL" - } - } - } - } - }, - { - "row": { - "user_pseudo_id": "pseudo_id_77", - "attribution_id": "referral_source_8675309", - "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", - "event_timestamp": 10077, - "device": { - "advertising_id": "fake-ad-id-77" - }, - "event_date": "fake-date", - "geo": { - "continent": "fake-continent", - "country": "fake-country", - "city": "fake-city", - "region": "fake-region" - }, - "event_name": "fake-event", - "label": "1 puzzles", - "screen": "Level 2 - Profile: 1", - "action": "LevelFail_2", - "val": "0", - "value": { - "string_value": "fake-value", - "int_value": "NULL", - "float_value": "NULL", - "double_value": "NULL" - } - }, - "expected": { - "attribution_url": "referral_source_8675309", - "app_id": "com.eduapp4syria.feedthemonsterENGLISH", - "ordered_id": 10077, - "user": { - "id": "pseudo_id_77", - "metadata": { - "continent": "fake-continent", - "country": "fake-country", - "region": "fake-region", - "city": "fake-city" - }, - "ad_attribution": { - "source": "no-source", - "data": { - "advertising_id": "fake-ad-id-77" - } - } - }, - "event": { - "name": "LevelFail", - "date": "fake-date", - "timestamp": 10077, - "value_type": "puzzles", - "value": "1", - "level": "2", - "profile": "1", - "rawData": { - "label": "1 puzzles", - "screen": "Level 2 - Profile: 1", - "action": "LevelFail_2", - "value": { - "string_value": "fake-value", - "int_value": "NULL", - "float_value": "NULL", - "double_value": "NULL" - } - } - } - } - }, - { - "row": { - "user_pseudo_id": "pseudo_id_77", - "attribution_id": "referral_source_8675309", - "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", - "event_timestamp": 10077, - "device": { - "advertising_id": "fake-ad-id-77" - }, - "event_date": "fake-date", - "geo": { - "continent": "fake-continent", - "country": "fake-country", - "city": "fake-city", - "region": "fake-region" - }, - "event_name": "fake-event", - "label": "Puzzle Letter: A", - "screen": "Level 2 - Profile: 1", - "action": "SegmentSuccess_Level_2", - "val": "0", - "value": { - "string_value": "fake-value", - "int_value": "NULL", - "float_value": "NULL", - "double_value": "NULL" - } - }, - "expected": { - "attribution_url": "referral_source_8675309", - "app_id": "com.eduapp4syria.feedthemonsterENGLISH", - "ordered_id": 10077, - "user": { - "id": "pseudo_id_77", - "metadata": { - "continent": "fake-continent", - "country": "fake-country", - "region": "fake-region", - "city": "fake-city" - }, - "ad_attribution": { - "source": "no-source", - "data": { - "advertising_id": "fake-ad-id-77" - } - } - }, - "event": { - "name": "SegmentSuccess", - "date": "fake-date", - "timestamp": 10077, - "value_type": "Letter", - "value": "A", - "level": "2", - "profile": "1", - "rawData": { - "label": "Puzzle Letter: A", - "screen": "Level 2 - Profile: 1", - "action": "SegmentSuccess_Level_2", - "value": { - "string_value": "fake-value", - "int_value": "NULL", - "float_value": "NULL", - "double_value": "NULL" - } - } - } - } - }, - { - "row": { - "user_pseudo_id": "pseudo_id_77", - "attribution_id": "referral_source_8675309", - "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", - "event_timestamp": 10077, - "device": { - "advertising_id": "fake-ad-id-77" - }, - "event_date": "fake-date", - "geo": { - "continent": "fake-continent", - "country": "fake-country", - "city": "fake-city", - "region": "fake-region" - }, - "event_name": "fake-event", - "label": "Puzzle Letter: A", - "screen": "Monster Select", - "action": "SegmentSuccess_Level_2", - "val": "0", - "value": { - "string_value": "fake-value", - "int_value": "NULL", - "float_value": "NULL", - "double_value": "NULL" - } - }, - "expected": { - "attribution_url": "referral_source_8675309", - "app_id": "com.eduapp4syria.feedthemonsterENGLISH", - "ordered_id": 10077, - "user": { - "id": "pseudo_id_77", - "metadata": { - "continent": "fake-continent", - "country": "fake-country", - "region": "fake-region", - "city": "fake-city" - }, - "ad_attribution": { - "source": "no-source", - "data": { - "advertising_id": "fake-ad-id-77" - } - } - }, - "event": { - "name": "SegmentSuccess", - "date": "fake-date", - "timestamp": 10077, - "value_type": "Letter", - "value": "A", - "level": "2", - "profile": "unknown", - "rawData": { - "label": "Puzzle Letter: A", - "screen": "Monster Select", - "action": "SegmentSuccess_Level_2", - "value": { - "string_value": "fake-value", - "int_value": "NULL", - "float_value": "NULL", - "double_value": "NULL" - } - } - } - } - }, - { - "row": { - "user_pseudo_id": "pseudo_id_77", - "attribution_id": "referral_source_8675309", - "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", - "event_timestamp": 10077, - "device": { - "advertising_id": "fake-ad-id-77" - }, - "event_date": "fake-date", - "geo": { - "continent": "fake-continent", - "country": "fake-country", - "city": "fake-city", - "region": "fake-region" - }, - "event_name": "fake-event", - "label": "Puzzle Letter Word: A", - "screen": "Monster Select", - "action": "SegmentFail_Level_2", - "val": "0", - "value": { - "string_value": "fake-value", - "int_value": "NULL", - "float_value": "NULL", - "double_value": "NULL" - } - }, - "expected": { - "attribution_url": "referral_source_8675309", - "app_id": "com.eduapp4syria.feedthemonsterENGLISH", - "ordered_id": 10077, - "user": { - "id": "pseudo_id_77", - "metadata": { - "continent": "fake-continent", - "country": "fake-country", - "region": "fake-region", - "city": "fake-city" - }, - "ad_attribution": { - "source": "no-source", - "data": { - "advertising_id": "fake-ad-id-77" - } - } - }, - "event": { - "name": "SegmentFail", - "date": "fake-date", - "timestamp": 10077, - "value_type": "Letter Word", - "value": "A", - "level": "2", - "profile": "unknown", - "rawData": { - "label": "Puzzle Letter Word: A", - "screen": "Monster Select", - "action": "SegmentFail_Level_2", - "value": { - "string_value": "fake-value", - "int_value": "NULL", - "float_value": "NULL", - "double_value": "NULL" - } - } - } - } - }, - { - "row": { - "user_pseudo_id": "pseudo_id_22", - "attribution_id": "referral_source_8675309", - "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", - "event_timestamp": 10022, - "device": { - "advertising_id": "fake-ad-id-22" - }, - "event_date": "fake-date", - "geo": { - "continent": "fake-continent", - "country": "fake-country", - "city": "fake-city", - "region": "fake-region" - }, - "event_name": "fake-event", - "label": "days_since_last", - "screen": "Level 1 - Profile: 0", - "action": "DaysSinceLast", - "val": "0.80062866210938", - "value": { - "string_value": "fake-value", - "int_value": "NULL", - "float_value": "NULL", - "double_value": "NULL" - } - }, - "expected": { - "attribution_url": "referral_source_8675309", - "app_id": "com.eduapp4syria.feedthemonsterENGLISH", - "ordered_id": 10022, - "user": { - "id": "pseudo_id_22", - "metadata": { - "continent": "fake-continent", - "country": "fake-country", - "region": "fake-region", - "city": "fake-city" - }, - "ad_attribution": { - "source": "no-source", - "data": { - "advertising_id": "fake-ad-id-22" - } - } - }, - "event": { - "name": "DaysSinceLast", - "date": "fake-date", - "timestamp": 10022, - "value_type": "days", - "value": "0.80062866210938", - "level": "1", - "profile": "0", - "rawData": { - "label": "days_since_last", - "screen": "Level 1 - Profile: 0", - "action": "DaysSinceLast", - "value": { - "string_value": "fake-value", - "int_value": "NULL", - "float_value": "NULL", - "double_value": "NULL" - } - } - } - } - } -] diff --git a/api/test/fixtures/queryResults.json b/api/test/fixtures/queryResults.json deleted file mode 100644 index 73ab513..0000000 --- a/api/test/fixtures/queryResults.json +++ /dev/null @@ -1,207 +0,0 @@ -{"set1": [ {"row": 1 }, {"row": 2 }, {"row": 3}, {"row": 4}, {"row": 5}, {"row": 6}, {"row": 7}, {"row": 8}, {"row": 9}, {"row": 10 }, {"row": 11 }, {"row": 12 }, {"row": 13 }, {"row": 14 }, {"row": 15 }, {"row": 16 }, {"row": 17 }, {"row": 18 }, {"row": 19 }, {"row": 20 }, {"row": 21 }, {"row": 22 }, {"row": 23 }, {"row": 24 }, {"row": 25 }, {"row": 26 }, {"row": 27 }, {"row": 28 }, {"row": 29 }, {"row": 30 }, {"row": 31 }, {"row": 32 }, {"row": 33 }, {"row": 34 }, {"row": 35 }, {"row": 36 }, {"row": 37 }, {"row": 38 }, {"row": 39 }, {"row": 40 }, {"row": 41 }, {"row": 42 }, {"row": 43 }, {"row": 44 }, {"row": 45 }, {"row": 46 }, {"row": 47 }, {"row": 48 }, {"row": 49 }, {"row": 50 }, {"row": 51 }, {"row": 52 }, {"row": 53 }, {"row": 54 }, {"row": 55 }, {"row": 56 }, {"row": 57 }, {"row": 58 }, {"row": 59 }, {"row": 60 }, {"row": 61 }, {"row": 62 }, {"row": 63 }, {"row": 64 }, {"row": 65 }, {"row": 66 }, {"row": 67 }, {"row": 68 }, {"row": 69 }, {"row": 70 }, {"row": 71 }, {"row": 72 }, {"row": 73 }, {"row": 74 }, {"row": 75 }, {"row": 76 }, {"row": 77 }, {"row": 78 }, {"row": 79 }, {"row": 80 }, {"row": 81 }, {"row": 82 }, {"row": 83 }, {"row": 84 }, {"row": 85 }, {"row": 86 }, {"row": 87 }, {"row": 88 }, {"row": 89 }, {"row": 90 }, {"row": 91 }, {"row": 92 }, {"row": 93 }, {"row": 94 }, {"row": 95 }, {"row": 96 }, {"row": 97 }, {"row": 98 }, {"row": 99 }, {"row": 100 }, {"row": 101 }, {"row": 102 }, {"row": 103 }, {"row": 104 }, {"row": 105 }, {"row": 106 }, {"row": 107 }, {"row": 108 }, {"row": 109 }, {"row": 110 }, {"row": 111 }, {"row": 112 }, {"row": 113 }, {"row": 114 }, {"row": 115 }, {"row": 116 }, {"row": 117 }, {"row": 118 }, {"row": 119 }, {"row": 120 }, {"row": 121 }, {"row": 122 }, {"row": 123 }, {"row": 124 }, {"row": 125 }, {"row": 126 }, {"row": 127 }, {"row": 128 }, {"row": 129 }, {"row": 130 }, {"row": 131 }, {"row": 132 }, {"row": 133 }, {"row": 134 }, {"row": 135 }, {"row": 136 }, {"row": 137 }, {"row": 138 }, {"row": 139 }, {"row": 140 }, {"row": 141 }, {"row": 142 }, {"row": 143 }, {"row": 144 }, {"row": 145 }, {"row": 146 }, {"row": 147 }, {"row": 148 }, {"row": 149 }, {"row": 150 }, {"row": 151 }, {"row": 152 }, {"row": 153 }, {"row": 154 }, {"row": 155 }, {"row": 156 }, {"row": 157 }, {"row": 158 }, {"row": 159 }, {"row": 160 }, {"row": 161 }, {"row": 162 }, {"row": 163 }, {"row": 164 }, {"row": 165 }, {"row": 166 }, {"row": 167 }, {"row": 168 }, {"row": 169 }, {"row": 170 }, {"row": 171 }, {"row": 172 }, {"row": 173 }, {"row": 174 }, {"row": 175 }, {"row": 176 }, {"row": 177 }, {"row": 178 }, {"row": 179 }, {"row": 180 }, {"row": 181 }, {"row": 182 }, {"row": 183 }, {"row": 184 }, {"row": 185 }, {"row": 186 }, {"row": 187 }, {"row": 188 }, {"row": 189 }, {"row": 190 }, {"row": 191 }, {"row": 192 }, {"row": 193 }, {"row": 194 }, {"row": 195 }, {"row": 196 }, {"row": 197 }, {"row": 198 }, {"row": 199 }, {"row": 200 }, {"row": 201 }, {"row": 202 }, {"row": 203 }, {"row": 204 }, {"row": 205 }, {"row": 206 }, {"row": 207 }, {"row": 208 }, {"row": 209 }, {"row": 210 }, {"row": 211 }, {"row": 212 }, {"row": 213 }, {"row": 214 }, {"row": 215 }, {"row": 216 }, {"row": 217 }, {"row": 218 }, {"row": 219 }, {"row": 220 }, {"row": 221 }, {"row": 222 }, {"row": 223 }, {"row": 224 }, {"row": 225 }, {"row": 226 }, {"row": 227 }, {"row": 228 }, {"row": 229 }, {"row": 230 }, {"row": 231 }, {"row": 232 }, {"row": 233 }, {"row": 234 }, {"row": 235 }, {"row": 236 }, {"row": 237 }, {"row": 238 }, {"row": 239 }, {"row": 240 }, {"row": 241 }, {"row": 242 }, {"row": 243 }, {"row": 244 }, {"row": 245 }, {"row": 246 }, {"row": 247 }, {"row": 248 }, {"row": 249 }, {"row": 250 }, {"row": 251 }, {"row": 252 }, {"row": 253 }, {"row": 254 }, {"row": 255 }, {"row": 256 }, {"row": 257 }, {"row": 258 }, {"row": 259 }, {"row": 260 }, {"row": 261 }, {"row": 262 }, {"row": 263 }, {"row": 264 }, {"row": 265 }, {"row": 266 }, {"row": 267 }, {"row": 268 }, {"row": 269 }, {"row": 270 }, {"row": 271 }, {"row": 272 }, {"row": 273 }, {"row": 274 }, {"row": 275 }, {"row": 276 }, {"row": 277 }, {"row": 278 }, {"row": 279 }, {"row": 280 }, {"row": 281 }, {"row": 282 }, {"row": 283 }, {"row": 284 }, {"row": 285 }, {"row": 286 }, {"row": 287 }, {"row": 288 }, {"row": 289 }, {"row": 290 }, {"row": 291 }, {"row": 292 }, {"row": 293 }, {"row": 294 }, {"row": 295 }, {"row": 296 }, {"row": 297 }, {"row": 298 }, {"row": 299 }, {"row": 300 }, {"row": 301 }, {"row": 302 }, {"row": 303 }, {"row": 304 }, {"row": 305 }, {"row": 306 }, {"row": 307 }, {"row": 308 }, {"row": 309 }, {"row": 310 }, {"row": 311 }, {"row": 312 }, {"row": 313 }, {"row": 314 }, {"row": 315 }, {"row": 316 }, {"row": 317 }, {"row": 318 }, {"row": 319 }, {"row": 320 }, {"row": 321 }, {"row": 322 }, {"row": 323 }, {"row": 324 }, {"row": 325 }, {"row": 326 }, {"row": 327 }, {"row": 328 }, {"row": 329 }, {"row": 330 }, {"row": 331 }, {"row": 332 }, {"row": 333 }, {"row": 334 }, {"row": 335 }, {"row": 336 }, {"row": 337 }, {"row": 338 }, {"row": 339 }, {"row": 340 }, {"row": 341 }, {"row": 342 }, {"row": 343 }, {"row": 344 }, {"row": 345 }, {"row": 346 }, {"row": 347 }, {"row": 348 }, {"row": 349 }, {"row": 350 }, {"row": 351 }, {"row": 352 }, {"row": 353 }, {"row": 354 }, {"row": 355 }, {"row": 356 }, {"row": 357 }, {"row": 358 }, {"row": 359 }, {"row": 360 }, {"row": 361 }, {"row": 362 }, {"row": 363 }, {"row": 364 }, {"row": 365 }, {"row": 366 }, {"row": 367 }, {"row": 368 }, {"row": 369 }, {"row": 370 }, {"row": 371 }, {"row": 372 }, {"row": 373 }, {"row": 374 }, {"row": 375 }, {"row": 376 }, {"row": 377 }, {"row": 378 }, {"row": 379 }, {"row": 380 }, {"row": 381 }, {"row": 382 }, {"row": 383 }, {"row": 384 }, {"row": 385 }, {"row": 386 }, {"row": 387 }, {"row": 388 }, {"row": 389 }, {"row": 390 }, {"row": 391 }, {"row": 392 }, {"row": 393 }, {"row": 394 }, {"row": 395 }, {"row": 396 }, {"row": 397 }, {"row": 398 }, {"row": 399 }, {"row": 400 }, {"row": 401 }, {"row": 402 }, {"row": 403 }, {"row": 404 }, {"row": 405 }, {"row": 406 }, {"row": 407 }, {"row": 408 }, {"row": 409 }, {"row": 410 }, {"row": 411 }, {"row": 412 }, {"row": 413 }, {"row": 414 }, {"row": 415 }, {"row": 416 }, {"row": 417 }, {"row": 418 }, {"row": 419 }, {"row": 420 }, {"row": 421 }, {"row": 422 }, {"row": 423 }, {"row": 424 }, {"row": 425 }, {"row": 426 }, {"row": 427 }, {"row": 428 }, {"row": 429 }, {"row": 430 }, {"row": 431 }, {"row": 432 }, {"row": 433 }, {"row": 434 }, {"row": 435 }, {"row": 436 }, {"row": 437 }, {"row": 438 }, {"row": 439 }, {"row": 440 }, {"row": 441 }, {"row": 442 }, {"row": 443 }, {"row": 444 }, {"row": 445 }, {"row": 446 }, {"row": 447 }, {"row": 448 }, {"row": 449 }, {"row": 450 }, {"row": 451 }, {"row": 452 }, {"row": 453 }, {"row": 454 }, {"row": 455 }, {"row": 456 }, {"row": 457 }, {"row": 458 }, {"row": 459 }, {"row": 460 }, {"row": 461 }, {"row": 462 }, {"row": 463 }, {"row": 464 }, {"row": 465 }, {"row": 466 }, {"row": 467 }, {"row": 468 }, {"row": 469 }, {"row": 470 }, {"row": 471 }, {"row": 472 }, {"row": 473 }, {"row": 474 }, {"row": 475 }, {"row": 476 }, {"row": 477 }, {"row": 478 }, {"row": 479 }, {"row": 480 }, {"row": 481 }, {"row": 482 }, {"row": 483 }, {"row": 484 }, {"row": 485 }, {"row": 486 }, {"row": 487 }, {"row": 488 }, {"row": 489 }, {"row": 490 }, {"row": 491 }, {"row": 492 }, {"row": 493 }, {"row": 494 }, {"row": 495 }, {"row": 496 }, {"row": 497 }, {"row": 498 }, {"row": 499 }, {"row": 500 }, {"row": 501 }, {"row": 502 }, {"row": 503 }, {"row": 504 }, {"row": 505 }, {"row": 506 }, {"row": 507 }, {"row": 508 }, {"row": 509 }, {"row": 510 }, {"row": 511 }, {"row": 512 }, {"row": 513 }, {"row": 514 }, {"row": 515 }, {"row": 516 }, {"row": 517 }, {"row": 518 }, {"row": 519 }, {"row": 520 }, {"row": 521 }, {"row": 522 }, {"row": 523 }, {"row": 524 }, {"row": 525 }, {"row": 526 }, {"row": 527 }, {"row": 528 }, {"row": 529 }, {"row": 530 }, {"row": 531 }, {"row": 532 }, {"row": 533 }, {"row": 534 }, {"row": 535 }, {"row": 536 }, {"row": 537 }, {"row": 538 }, {"row": 539 }, {"row": 540 }, {"row": 541 }, {"row": 542 }, {"row": 543 }, {"row": 544 }, {"row": 545 }, {"row": 546 }, {"row": 547 }, {"row": 548 }, {"row": 549 }, {"row": 550 }, {"row": 551 }, {"row": 552 }, {"row": 553 }, {"row": 554 }, {"row": 555 }, {"row": 556 }, {"row": 557 }, {"row": 558 }, {"row": 559 }, {"row": 560 }, {"row": 561 }, {"row": 562 }, {"row": 563 }, {"row": 564 }, {"row": 565 }, {"row": 566 }, {"row": 567 }, {"row": 568 }, {"row": 569 }, {"row": 570 }, {"row": 571 }, {"row": 572 }, {"row": 573 }, {"row": 574 }, {"row": 575 }, {"row": 576 }, {"row": 577 }, {"row": 578 }, {"row": 579 }, {"row": 580 }, {"row": 581 }, {"row": 582 }, {"row": 583 }, {"row": 584 }, {"row": 585 }, {"row": 586 }, {"row": 587 }, {"row": 588 }, {"row": 589 }, {"row": 590 }, {"row": 591 }, {"row": 592 }, {"row": 593 }, {"row": 594 }, {"row": 595 }, {"row": 596 }, {"row": 597 }, {"row": 598 }, {"row": 599 }, {"row": 600 }, {"row": 601 }, {"row": 602 }, {"row": 603 }, {"row": 604 }, {"row": 605 }, {"row": 606 }, {"row": 607 }, {"row": 608 }, {"row": 609 }, {"row": 610 }, {"row": 611 }, {"row": 612 }, {"row": 613 }, {"row": 614 }, {"row": 615 }, {"row": 616 }, {"row": 617 }, {"row": 618 }, {"row": 619 }, {"row": 620 }, {"row": 621 }, {"row": 622 }, {"row": 623 }, {"row": 624 }, {"row": 625 }, {"row": 626 }, {"row": 627 }, {"row": 628 }, {"row": 629 }, {"row": 630 }, {"row": 631 }, {"row": 632 }, {"row": 633 }, {"row": 634 }, {"row": 635 }, {"row": 636 }, {"row": 637 }, {"row": 638 }, {"row": 639 }, {"row": 640 }, {"row": 641 }, {"row": 642 }, {"row": 643 }, {"row": 644 }, {"row": 645 }, {"row": 646 }, {"row": 647 }, {"row": 648 }, {"row": 649 }, {"row": 650 }, {"row": 651 }, {"row": 652 }, {"row": 653 }, {"row": 654 }, {"row": 655 }, {"row": 656 }, {"row": 657 }, {"row": 658 }, {"row": 659 }, {"row": 660 }, {"row": 661 }, {"row": 662 }, {"row": 663 }, {"row": 664 }, {"row": 665 }, {"row": 666 }, {"row": 667 }, {"row": 668 }, {"row": 669 }, {"row": 670 }, {"row": 671 }, {"row": 672 }, {"row": 673 }, {"row": 674 }, {"row": 675 }, {"row": 676 }, {"row": 677 }, {"row": 678 }, {"row": 679 }, {"row": 680 }, {"row": 681 }, {"row": 682 }, {"row": 683 }, {"row": 684 }, {"row": 685 }, {"row": 686 }, {"row": 687 }, {"row": 688 }, {"row": 689 }, {"row": 690 }, {"row": 691 }, {"row": 692 }, {"row": 693 }, {"row": 694 }, {"row": 695 }, {"row": 696 }, {"row": 697 }, {"row": 698 }, {"row": 699 }, {"row": 700 }, {"row": 701 }, {"row": 702 }, {"row": 703 }, {"row": 704 }, {"row": 705 }, {"row": 706 }, {"row": 707 }, {"row": 708 }, {"row": 709 }, {"row": 710 }, {"row": 711 }, {"row": 712 }, {"row": 713 }, {"row": 714 }, {"row": 715 }, {"row": 716 }, {"row": 717 }, {"row": 718 }, {"row": 719 }, {"row": 720 }, {"row": 721 }, {"row": 722 }, {"row": 723 }, {"row": 724 }, {"row": 725 }, {"row": 726 }, {"row": 727 }, {"row": 728 }, {"row": 729 }, {"row": 730 }, {"row": 731 }, {"row": 732 }, {"row": 733 }, {"row": 734 }, {"row": 735 }, {"row": 736 }, {"row": 737 }, {"row": 738 }, {"row": 739 }, {"row": 740 }, {"row": 741 }, {"row": 742 }, {"row": 743 }, {"row": 744 }, {"row": 745 }, {"row": 746 }, {"row": 747 }, {"row": 748 }, {"row": 749 }, {"row": 750 }, {"row": 751 }, {"row": 752 }, {"row": 753 }, {"row": 754 }, {"row": 755 }, {"row": 756 }, {"row": 757 }, {"row": 758 }, {"row": 759 }, {"row": 760 }, {"row": 761 }, {"row": 762 }, {"row": 763 }, {"row": 764 }, {"row": 765 }, {"row": 766 }, {"row": 767 }, {"row": 768 }, {"row": 769 }, {"row": 770 }, {"row": 771 }, {"row": 772 }, {"row": 773 }, {"row": 774 }, {"row": 775 }, {"row": 776 }, {"row": 777 }, {"row": 778 }, {"row": 779 }, {"row": 780 }, {"row": 781 }, {"row": 782 }, {"row": 783 }, {"row": 784 }, {"row": 785 }, {"row": 786 }, {"row": 787 }, {"row": 788 }, {"row": 789 }, {"row": 790 }, {"row": 791 }, {"row": 792 }, {"row": 793 }, {"row": 794 }, {"row": 795 }, {"row": 796 }, {"row": 797 }, {"row": 798 }, {"row": 799 }, {"row": 800 }, {"row": 801 }, {"row": 802 }, {"row": 803 }, {"row": 804 }, {"row": 805 }, {"row": 806 }, {"row": 807 }, {"row": 808 }, {"row": 809 }, {"row": 810 }, {"row": 811 }, {"row": 812 }, {"row": 813 }, {"row": 814 }, {"row": 815 }, {"row": 816 }, {"row": 817 }, {"row": 818 }, {"row": 819 }, {"row": 820 }, {"row": 821 }, {"row": 822 }, {"row": 823 }, {"row": 824 }, {"row": 825 }, {"row": 826 }, {"row": 827 }, {"row": 828 }, {"row": 829 }, {"row": 830 }, {"row": 831 }, {"row": 832 }, {"row": 833 }, {"row": 834 }, {"row": 835 }, {"row": 836 }, {"row": 837 }, {"row": 838 }, {"row": 839 }, {"row": 840 }, {"row": 841 }, {"row": 842 }, {"row": 843 }, {"row": 844 }, {"row": 845 }, {"row": 846 }, {"row": 847 }, {"row": 848 }, {"row": 849 }, {"row": 850 }, {"row": 851 }, {"row": 852 }, {"row": 853 }, {"row": 854 }, {"row": 855 }, {"row": 856 }, {"row": 857 }, {"row": 858 }, {"row": 859 }, {"row": 860 }, {"row": 861 }, {"row": 862 }, {"row": 863 }, {"row": 864 }, {"row": 865 }, {"row": 866 }, {"row": 867 }, {"row": 868 }, {"row": 869 }, {"row": 870 }, {"row": 871 }, {"row": 872 }, {"row": 873 }, {"row": 874 }, {"row": 875 }, {"row": 876 }, {"row": 877 }, {"row": 878 }, {"row": 879 }, {"row": 880 }, {"row": 881 }, {"row": 882 }, {"row": 883 }, {"row": 884 }, {"row": 885 }, {"row": 886 }, {"row": 887 }, {"row": 888 }, {"row": 889 }, {"row": 890 }, {"row": 891 }, {"row": 892 }, {"row": 893 }, {"row": 894 }, {"row": 895 }, {"row": 896 }, {"row": 897 }, {"row": 898 }, {"row": 899 }, {"row": 900 }, {"row": 901 }, {"row": 902 }, {"row": 903 }, {"row": 904 }, {"row": 905 }, {"row": 906 }, {"row": 907 }, {"row": 908 }, {"row": 909 }, {"row": 910 }, {"row": 911 }, {"row": 912 }, {"row": 913 }, {"row": 914 }, {"row": 915 }, {"row": 916 }, {"row": 917 }, {"row": 918 }, {"row": 919 }, {"row": 920 }, {"row": 921 }, {"row": 922 }, {"row": 923 }, {"row": 924 }, {"row": 925 }, {"row": 926 }, {"row": 927 }, {"row": 928 }, {"row": 929 }, {"row": 930 }, {"row": 931 }, {"row": 932 }, {"row": 933 }, {"row": 934 }, {"row": 935 }, {"row": 936 }, {"row": 937 }, {"row": 938 }, {"row": 939 }, {"row": 940 }, {"row": 941 }, {"row": 942 }, {"row": 943 }, {"row": 944 }, {"row": 945 }, {"row": 946 }, {"row": 947 }, {"row": 948 }, {"row": 949 }, {"row": 950 }, {"row": 951 }, {"row": 952 }, {"row": 953 }, {"row": 954 }, {"row": 955 }, {"row": 956 }, {"row": 957 }, {"row": 958 }, {"row": 959 }, {"row": 960 }, {"row": 961 }, {"row": 962 }, {"row": 963 }, {"row": 964 }, {"row": 965 }, {"row": 966 }, {"row": 967 }, {"row": 968 }, {"row": 969 }, {"row": 970 }, {"row": 971 }, {"row": 972 }, {"row": 973 }, {"row": 974 }, {"row": 975 }, {"row": 976 }, {"row": 977 }, {"row": 978 }, {"row": 979 }, {"row": 980 }, {"row": 981 }, {"row": 982 }, {"row": 983 }, {"row": 984 }, {"row": 985 }, {"row": 986 }, {"row": 987 }, {"row": 988 }, {"row": 989 }, {"row": 990 }, {"row": 991 }, {"row": 992 }, {"row": 993 }, {"row": 994 }, {"row": 995 }, {"row": 996 }, {"row": 997 }, {"row": 998 }, {"row": 999 }, {"row": 1000 } ], -"set2": [ {"row": 1001}, {"row": 1002}, {"row": 1003}, {"row": 1004}, {"row": 1005}, {"row": 1006}, {"row": 1007}, {"row": 1008}, {"row": 1009}, {"row": 1010}, {"row": 1011}, {"row": 1012}, {"row": 1013}, {"row": 1014}, {"row": 1015}, {"row": 1016}, {"row": 1017}, {"row": 1018}, {"row": 1019}, {"row": 1020}, {"row": 1021}, {"row": 1022}, {"row": 1023}, {"row": 1024}, {"row": 1025}, {"row": 1026}, {"row": 1027}, {"row": 1028}, {"row": 1029}, {"row": 1030}, {"row": 1031}, {"row": 1032}, {"row": 1033}, {"row": 1034}, {"row": 1035}, {"row": 1036}, {"row": 1037}, {"row": 1038}, {"row": 1039}, {"row": 1040}, {"row": 1041}, {"row": 1042}, {"row": 1043}, {"row": 1044}, {"row": 1045}, {"row": 1046}, {"row": 1047}, {"row": 1048}, {"row": 1049}, {"row": 1050}, {"row": 1051}, {"row": 1052}, {"row": 1053}, {"row": 1054}, {"row": 1055}, {"row": 1056}, {"row": 1057}, {"row": 1058}, {"row": 1059}, {"row": 1060}, {"row": 1061}, {"row": 1062}, {"row": 1063}, {"row": 1064}, {"row": 1065}, {"row": 1066}, {"row": 1067}, {"row": 1068}, {"row": 1069}, {"row": 1070}, {"row": 1071}, {"row": 1072}, {"row": 1073}, {"row": 1074}, {"row": 1075}, {"row": 1076}, {"row": 1077}, {"row": 1078}, {"row": 1079}, {"row": 1080}, {"row": 1081}, {"row": 1082}, {"row": 1083}, {"row": 1084}, {"row": 1085}, {"row": 1086}, {"row": 1087}, {"row": 1088}, {"row": 1089}, {"row": 1090}, {"row": 1091}, {"row": 1092}, {"row": 1093}, {"row": 1094}, {"row": 1095}, {"row": 1096}, {"row": 1097}, {"row": 1098}, {"row": 1099}, {"row": 1100}, {"row": 1101}, {"row": 1102}, {"row": 1103}, {"row": 1104}, {"row": 1105}, {"row": 1106}, {"row": 1107}, {"row": 1108}, {"row": 1109}, {"row": 1111}, {"row": 1112}, {"row": 1113}, {"row": 1114}, {"row": 1115}, {"row": 1116}, {"row": 1117}, {"row": 1118}, {"row": 1119}, {"row": 1110}, {"row": 1111}, {"row": 1112}, {"row": 1113}, {"row": 1114}, {"row": 1115}, {"row": 1116}, {"row": 1117}, {"row": 1118}, {"row": 1119}, {"row": 1120}, {"row": 1121}, {"row": 1122}, {"row": 1123}, {"row": 1124}, {"row": 1125}, {"row": 1126}, {"row": 1127}, {"row": 1128}, {"row": 1129}, {"row": 1130}, {"row": 1131}, {"row": 1132}, {"row": 1133}, {"row": 1134}, {"row": 1135}, {"row": 1136}, {"row": 1137}, {"row": 1138}, {"row": 1139}, {"row": 1140}, {"row": 1141}, {"row": 1142}, {"row": 1143}, {"row": 1144}, {"row": 1145}, {"row": 1146}, {"row": 1147}, {"row": 1148}, {"row": 1149}, {"row": 1150}, {"row": 1151}, {"row": 1152}, {"row": 1153}, {"row": 1154}, {"row": 1155}, {"row": 1156}, {"row": 1157}, {"row": 1158}, {"row": 1159}, {"row": 1160}, {"row": 1161}, {"row": 1162}, {"row": 1163}, {"row": 1164}, {"row": 1165}, {"row": 1166}, {"row": 1167}, {"row": 1168}, {"row": 1169}, {"row": 1170}, {"row": 1171}, {"row": 1172}, {"row": 1173}, {"row": 1174}, {"row": 1175}, {"row": 1176}, {"row": 1177}, {"row": 1178}, {"row": 1179}, {"row": 1180}, {"row": 1181}, {"row": 1182}, {"row": 1183}, {"row": 1184}, {"row": 1185}, {"row": 1186}, {"row": 1187}, {"row": 1188}, {"row": 1189}, {"row": 1190}, {"row": 1191}, {"row": 1192}, {"row": 1193}, {"row": 1194}, {"row": 1195}, {"row": 1196}, {"row": 1197}, {"row": 1198}, {"row": 1199}, {"row": 1200}, {"row": 1201}, {"row": 1202}, {"row": 1203}, {"row": 1204}, {"row": 1205}, {"row": 1206}, {"row": 1207}, {"row": 1208}, {"row": 1209}, {"row": 1210}, {"row": 1211}, {"row": 1212}, {"row": 1213}, {"row": 1214}, {"row": 1215}, {"row": 1216}, {"row": 1217}, {"row": 1218}, {"row": 1219}, {"row": 1220}, {"row": 1221}, {"row": 1222}, {"row": 1223}, {"row": 1224}, {"row": 1225}, {"row": 1226}, {"row": 1227}, {"row": 1228}, {"row": 1229}, {"row": 1230}, {"row": 1231}, {"row": 1232}, {"row": 1233}, {"row": 1234}, {"row": 1235}, {"row": 1236}, {"row": 1237}, {"row": 1238}, {"row": 1239}, {"row": 1240}, {"row": 1241}, {"row": 1242}, {"row": 1243}, {"row": 1244}, {"row": 1245}, {"row": 1246}, {"row": 1247}, {"row": 1248}, {"row": 1249}, {"row": 1250}, {"row": 1251}, {"row": 1252}, {"row": 1253}, {"row": 1254}, {"row": 1255}, {"row": 1256}, {"row": 1257}, {"row": 1258}, {"row": 1259}, {"row": 1260}, {"row": 1261}, {"row": 1262}, {"row": 1263}, {"row": 1264}, {"row": 1265}, {"row": 1266}, {"row": 1267}, {"row": 1268}, {"row": 1269}, {"row": 1270}, {"row": 1271}, {"row": 1272}, {"row": 1273}, {"row": 1274}, {"row": 1275}, {"row": 1276}, {"row": 1277}, {"row": 1278}, {"row": 1279}, {"row": 1280}, {"row": 1281}, {"row": 1282}, {"row": 1283}, {"row": 1284}, {"row": 1285}, {"row": 1286}, {"row": 1287}, {"row": 1288}, {"row": 1289}, {"row": 1290}, {"row": 1291}, {"row": 1292}, {"row": 1293}, {"row": 1294}, {"row": 1295}, {"row": 1296}, {"row": 1297}, {"row": 1298}, {"row": 1299}, {"row": 1300}, {"row": 1301}, {"row": 1302}, {"row": 1303}, {"row": 1304}, {"row": 1305}, {"row": 1306}, {"row": 1307}, {"row": 1308}, {"row": 1309}, {"row": 1310}, {"row": 1311}, {"row": 1312}, {"row": 1313}, {"row": 1314}, {"row": 1315}, {"row": 1316}, {"row": 1317}, {"row": 1318}, {"row": 1319}, {"row": 1320}, {"row": 1321}, {"row": 1322}, {"row": 1323}, {"row": 1324}, {"row": 1325}, {"row": 1326}, {"row": 1327}, {"row": 1328}, {"row": 1329}, {"row": 1330}, {"row": 1331}, {"row": 1332}, {"row": 1333}, {"row": 1334}, {"row": 1335}, {"row": 1336}, {"row": 1337}, {"row": 1338}, {"row": 1339}, {"row": 1340}, {"row": 1341}, {"row": 1342}, {"row": 1343}, {"row": 1344}, {"row": 1345}, {"row": 1346}, {"row": 1347}, {"row": 1348}, {"row": 1349}, {"row": 1350}, {"row": 1351}, {"row": 1352}, {"row": 1353}, {"row": 1354}, {"row": 1355}, {"row": 1356}, {"row": 1357}, {"row": 1358}, {"row": 1359}, {"row": 1360}, {"row": 1361}, {"row": 1362}, {"row": 1363}, {"row": 1364}, {"row": 1365}, {"row": 1366}, {"row": 1367}, {"row": 1368}, {"row": 1369}, {"row": 1370}, {"row": 1371}, {"row": 1372}, {"row": 1373}, {"row": 1374}, {"row": 1375}, {"row": 1376}, {"row": 1377}, {"row": 1378}, {"row": 1379}, {"row": 1380}, {"row": 1381}, {"row": 1382}, {"row": 1383}, {"row": 1384}, {"row": 1385}, {"row": 1386}, {"row": 1387}, {"row": 1388}, {"row": 1389}, {"row": 1390}, {"row": 1391}, {"row": 1392}, {"row": 1393}, {"row": 1394}, {"row": 1395}, {"row": 1396}, {"row": 1397}, {"row": 1398}, {"row": 1399}, {"row": 1400}, {"row": 1401}, {"row": 1402}, {"row": 1403}, {"row": 1404}, {"row": 1405}, {"row": 1406}, {"row": 1407}, {"row": 1408}, {"row": 1409}, {"row": 1410}, {"row": 1411}, {"row": 1412}, {"row": 1413}, {"row": 1414}, {"row": 1415}, {"row": 1416}, {"row": 1417}, {"row": 1418}, {"row": 1419}, {"row": 1420}, {"row": 1421}, {"row": 1422}, {"row": 1423}, {"row": 1424}, {"row": 1425}, {"row": 1426}, {"row": 1427}, {"row": 1428}, {"row": 1429}, {"row": 1430}, {"row": 1431}, {"row": 1432}, {"row": 1433}, {"row": 1434}, {"row": 1435}, {"row": 1436}, {"row": 1437}, {"row": 1438}, {"row": 1439}, {"row": 1440}, {"row": 1441}, {"row": 1442}, {"row": 1443}, {"row": 1444}, {"row": 1445}, {"row": 1446}, {"row": 1447}, {"row": 1448}, {"row": 1449}, {"row": 1450}, {"row": 1451}, {"row": 1452}, {"row": 1453}, {"row": 1454}, {"row": 1455}, {"row": 1456}, {"row": 1457}, {"row": 1458}, {"row": 1459}, {"row": 1460}, {"row": 1461}, {"row": 1462}, {"row": 1463}, {"row": 1464}, {"row": 1465}, {"row": 1466}, {"row": 1467}, {"row": 1468}, {"row": 1469}, {"row": 1470}, {"row": 1471}, {"row": 1472}, {"row": 1473}, {"row": 1474}, {"row": 1475}, {"row": 1476}, {"row": 1477}, {"row": 1478}, {"row": 1479}, {"row": 1480}, {"row": 1481}, {"row": 1482}, {"row": 1483}, {"row": 1484}, {"row": 1485}, {"row": 1486}, {"row": 1487}, {"row": 1488}, {"row": 1489}, {"row": 1490}, {"row": 1491}, {"row": 1492}, {"row": 1493}, {"row": 1494}, {"row": 1495}, {"row": 1496}, {"row": 1497}, {"row": 1498}, {"row": 1499}, {"row": 1500}, {"row": 1501}, {"row": 1502}, {"row": 1503}, {"row": 1504}, {"row": 1505}, {"row": 1506}, {"row": 1507}, {"row": 1508}, {"row": 1509}, {"row": 1510}, {"row": 1511}, {"row": 1512}, {"row": 1513}, {"row": 1514}, {"row": 1515}, {"row": 1516}, {"row": 1517}, {"row": 1518}, {"row": 1519}, {"row": 1520}, {"row": 1521}, {"row": 1522}, {"row": 1523}, {"row": 1524}, {"row": 1525}, {"row": 1526}, {"row": 1527}, {"row": 1528}, {"row": 1529}, {"row": 1530}, {"row": 1531}, {"row": 1532}, {"row": 1533}, {"row": 1534}, {"row": 1535}, {"row": 1536}, {"row": 1537}, {"row": 1538}, {"row": 1539}, {"row": 1540}, {"row": 1541}, {"row": 1542}, {"row": 1543}, {"row": 1544}, {"row": 1545}, {"row": 1546}, {"row": 1547}, {"row": 1548}, {"row": 1549}, {"row": 1550}, {"row": 1551}, {"row": 1552}, {"row": 1553}, {"row": 1554}, {"row": 1555}, {"row": 1556}, {"row": 1557}, {"row": 1558}, {"row": 1559}, {"row": 1560}, {"row": 1561}, {"row": 1562}, {"row": 1563}, {"row": 1564}, {"row": 1565}, {"row": 1566}, {"row": 1567}, {"row": 1568}, {"row": 1569}, {"row": 1570}, {"row": 1571}, {"row": 1572}, {"row": 1573}, {"row": 1574}, {"row": 1575}, {"row": 1576}, {"row": 1577}, {"row": 1578}, {"row": 1579}, {"row": 1580}, {"row": 1581}, {"row": 1582}, {"row": 1583}, {"row": 1584}, {"row": 1585}, {"row": 1586}, {"row": 1587}, {"row": 1588}, {"row": 1589}, {"row": 1590}, {"row": 1591}, {"row": 1592}, {"row": 1593}, {"row": 1594}, {"row": 1595}, {"row": 1596}, {"row": 1597}, {"row": 1598}, {"row": 1599}, {"row": 1600}, {"row": 1601}, {"row": 1602}, {"row": 1603}, {"row": 1604}, {"row": 1605}, {"row": 1606}, {"row": 1607}, {"row": 1608}, {"row": 1609}, {"row": 1610}, {"row": 1611}, {"row": 1612}, {"row": 1613}, {"row": 1614}, {"row": 1615}, {"row": 1616}, {"row": 1617}, {"row": 1618}, {"row": 1619}, {"row": 1620}, {"row": 1621}, {"row": 1622}, {"row": 1623}, {"row": 1624}, {"row": 1625}, {"row": 1626}, {"row": 1627}, {"row": 1628}, {"row": 1629}, {"row": 1630}, {"row": 1631}, {"row": 1632}, {"row": 1633}, {"row": 1634}, {"row": 1635}, {"row": 1636}, {"row": 1637}, {"row": 1638}, {"row": 1639}, {"row": 1640}, {"row": 1641}, {"row": 1642}, {"row": 1643}, {"row": 1644}, {"row": 1645}, {"row": 1646}, {"row": 1647}, {"row": 1648}, {"row": 1649}, {"row": 1650}, {"row": 1651}, {"row": 1652}, {"row": 1653}, {"row": 1654}, {"row": 1655}, {"row": 1656}, {"row": 1657}, {"row": 1658}, {"row": 1659}, {"row": 1660}, {"row": 1661}, {"row": 1662}, {"row": 1663}, {"row": 1664}, {"row": 1665}, {"row": 1666}, {"row": 1667}, {"row": 1668}, {"row": 1669}, {"row": 1670}, {"row": 1671}, {"row": 1672}, {"row": 1673}, {"row": 1674}, {"row": 1675}, {"row": 1676}, {"row": 1677}, {"row": 1678}, {"row": 1679}, {"row": 1680}, {"row": 1681}, {"row": 1682}, {"row": 1683}, {"row": 1684}, {"row": 1685}, {"row": 1686}, {"row": 1687}, {"row": 1688}, {"row": 1689}, {"row": 1690}, {"row": 1691}, {"row": 1692}, {"row": 1693}, {"row": 1694}, {"row": 1695}, {"row": 1696}, {"row": 1697}, {"row": 1698}, {"row": 1699}, {"row": 1700}, {"row": 1701}, {"row": 1702}, {"row": 1703}, {"row": 1704}, {"row": 1705}, {"row": 1706}, {"row": 1707}, {"row": 1708}, {"row": 1709}, {"row": 1710}, {"row": 1711}, {"row": 1712}, {"row": 1713}, {"row": 1714}, {"row": 1715}, {"row": 1716}, {"row": 1717}, {"row": 1718}, {"row": 1719}, {"row": 1720}, {"row": 1721}, {"row": 1722}, {"row": 1723}, {"row": 1724}, {"row": 1725}, {"row": 1726}, {"row": 1727}, {"row": 1728}, {"row": 1729}, {"row": 1730}, {"row": 1731}, {"row": 1732}, {"row": 1733}, {"row": 1734}, {"row": 1735}, {"row": 1736}, {"row": 1737}, {"row": 1738}, {"row": 1739}, {"row": 1740}, {"row": 1741}, {"row": 1742}, {"row": 1743}, {"row": 1744}, {"row": 1745}, {"row": 1746}, {"row": 1747}, {"row": 1748}, {"row": 1749}, {"row": 1750}, {"row": 1751}, {"row": 1752}, {"row": 1753}, {"row": 1754}, {"row": 1755}, {"row": 1756}, {"row": 1757}, {"row": 1758}, {"row": 1759}, {"row": 1760}, {"row": 1761}, {"row": 1762}, {"row": 1763}, {"row": 1764}, {"row": 1765}, {"row": 1766}, {"row": 1767}, {"row": 1768}, {"row": 1769}, {"row": 1770}, {"row": 1771}, {"row": 1772}, {"row": 1773}, {"row": 1774}, {"row": 1775}, {"row": 1776}, {"row": 1777}, {"row": 1778}, {"row": 1779}, {"row": 1780}, {"row": 1781}, {"row": 1782}, {"row": 1783}, {"row": 1784}, {"row": 1785}, {"row": 1786}, {"row": 1787}, {"row": 1788}, {"row": 1789}, {"row": 1790}, {"row": 1791}, {"row": 1792}, {"row": 1793}, {"row": 1794}, {"row": 1795}, {"row": 1796}, {"row": 1797}, {"row": 1798}, {"row": 1799}, {"row": 1800}, {"row": 1801}, {"row": 1802}, {"row": 1803}, {"row": 1804}, {"row": 1805}, {"row": 1806}, {"row": 1807}, {"row": 1808}, {"row": 1809}, {"row": 1810}, {"row": 1811}, {"row": 1812}, {"row": 1813}, {"row": 1814}, {"row": 1815}, {"row": 1816}, {"row": 1817}, {"row": 1818}, {"row": 1819}, {"row": 1820}, {"row": 1821}, {"row": 1822}, {"row": 1823}, {"row": 1824}, {"row": 1825}, {"row": 1826}, {"row": 1827}, {"row": 1828}, {"row": 1829}, {"row": 1830}, {"row": 1831}, {"row": 1832}, {"row": 1833}, {"row": 1834}, {"row": 1835}, {"row": 1836}, {"row": 1837}, {"row": 1838}, {"row": 1839}, {"row": 1840}, {"row": 1841}, {"row": 1842}, {"row": 1843}, {"row": 1844}, {"row": 1845}, {"row": 1846}, {"row": 1847}, {"row": 1848}, {"row": 1849}, {"row": 1850}, {"row": 1851}, {"row": 1852}, {"row": 1853}, {"row": 1854}, {"row": 1855}, {"row": 1856}, {"row": 1857}, {"row": 1858}, {"row": 1859}, {"row": 1860}, {"row": 1861}, {"row": 1862}, {"row": 1863}, {"row": 1864}, {"row": 1865}, {"row": 1866}, {"row": 1867}, {"row": 1868}, {"row": 1869}, {"row": 1870}, {"row": 1871}, {"row": 1872}, {"row": 1873}, {"row": 1874}, {"row": 1875}, {"row": 1876}, {"row": 1877}, {"row": 1878}, {"row": 1879}, {"row": 1880}, {"row": 1881}, {"row": 1882}, {"row": 1883}, {"row": 1884}, {"row": 1885}, {"row": 1886}, {"row": 1887}, {"row": 1888}, {"row": 1889}, {"row": 1890}, {"row": 1891}, {"row": 1892}, {"row": 1893}, {"row": 1894}, {"row": 1895}, {"row": 1896}, {"row": 1897}, {"row": 1898}, {"row": 1899}, {"row": 1900}, {"row": 1901}, {"row": 1902}, {"row": 1903}, {"row": 1904}, {"row": 1905}, {"row": 1906}, {"row": 1907}, {"row": 1908}, {"row": 1909}, {"row": 1910}, {"row": 1911}, {"row": 1912}, {"row": 1913}, {"row": 1914}, {"row": 1915}, {"row": 1916}, {"row": 1917}, {"row": 1918}, {"row": 1919}, {"row": 1920}, {"row": 1921}, {"row": 1922}, {"row": 1923}, {"row": 1924}, {"row": 1925}, {"row": 1926}, {"row": 1927}, {"row": 1928}, {"row": 1929}, {"row": 1930}, {"row": 1931}, {"row": 1932}, {"row": 1933}, {"row": 1934}, {"row": 1935}, {"row": 1936}, {"row": 1937}, {"row": 1938}, {"row": 1939}, {"row": 1940}, {"row": 1941}, {"row": 1942}, {"row": 1943}, {"row": 1944}, {"row": 1945}, {"row": 1946}, {"row": 1947}, {"row": 1948}, {"row": 1949}, {"row": 1950}, {"row": 1951}, {"row": 1952}, {"row": 1953}, {"row": 1954}, {"row": 1955}, {"row": 1956}, {"row": 1957}, {"row": 1958}, {"row": 1959}, {"row": 1960}, {"row": 1961}, {"row": 1962}, {"row": 1963}, {"row": 1964}, {"row": 1965}, {"row": 1966}, {"row": 1967}, {"row": 1968}, {"row": 1969}, {"row": 1970}, {"row": 1971}, {"row": 1972}, {"row": 1973}, {"row": 1974}, {"row": 1975}, {"row": 1976}, {"row": 1977}, {"row": 1978}, {"row": 1979}, {"row": 1980}, {"row": 1981}, {"row": 1982}, {"row": 1983}, {"row": 1984}, {"row": 1985}, {"row": 1986}, {"row": 1987}, {"row": 1988}, {"row": 1989}, {"row": 1990}, {"row": 1991}, {"row": 1992}, {"row": 1993}, {"row": 1994}, {"row": 1995}, {"row": 1996}, {"row": 1997}, {"row": 1998}, {"row": 1999}, {"row": 2000} ], -"set3": [ - {"user_pseudo_id": "pseudo_id_1", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 1,"device": {"advertising_id": "fake-ad-id-1"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: a", "screen": "Level 1 - Profile: 1", "action": "SegmentStart_Level_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_2", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 2,"device": {"advertising_id": "fake-ad-id-2"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: a", "screen": "Level 1 - Profile: 1", "action": "SegmentStart_Level_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_3", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 3,"device": {"advertising_id": "fake-ad-id-3"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: a", "screen": "Level 1 - Profile: 1", "action": "SegmentStart_Level_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_4", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 4,"device": {"advertising_id": "fake-ad-id-4"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: a", "screen": "Level 1 - Profile: 1", "action": "SegmentStart_Level_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_5", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 5,"device": {"advertising_id": "fake-ad-id-5"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: a", "screen": "Level 1 - Profile: 1", "action": "SegmentStart_Level_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_6", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 6,"device": {"advertising_id": "fake-ad-id-6"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: a", "screen": "Level 1 - Profile: 1", "action": "SegmentSuccess_Level_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_7", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 7,"device": {"advertising_id": "fake-ad-id-7"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: a", "screen": "Level 1 - Profile: 1", "action": "SegmentSuccess_Level_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_8", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 8,"device": {"advertising_id": "fake-ad-id-8"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: a", "screen": "Level 1 - Profile: 1", "action": "SegmentSuccess_Level_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_9", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 9,"device": {"advertising_id": "fake-ad-id-9"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: a", "screen": "Level 1 - Profile: 1", "action": "SegmentSuccess_Level_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_10", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10,"device": {"advertising_id": "fake-ad-id-10"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: a", "screen": "Level 1 - Profile: 1", "action": "Segment_Level_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_11", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 11,"device": {"advertising_id": "fake-ad-id-11"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentStart_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_12", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 12,"device": {"advertising_id": "fake-ad-id-12"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentStart_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_13", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 13,"device": {"advertising_id": "fake-ad-id-13"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentStart_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_14", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 14,"device": {"advertising_id": "fake-ad-id-14"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentStart_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_15", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 15,"device": {"advertising_id": "fake-ad-id-15"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentStart_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_16", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 16,"device": {"advertising_id": "fake-ad-id-16"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_17", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 17,"device": {"advertising_id": "fake-ad-id-17"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_18", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 18,"device": {"advertising_id": "fake-ad-id-18"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_19", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 19,"device": {"advertising_id": "fake-ad-id-19"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_20", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 20,"device": {"advertising_id": "fake-ad-id-20"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_21", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 21,"device": {"advertising_id": "fake-ad-id-21"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_22", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 22,"device": {"advertising_id": "fake-ad-id-22"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_23", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 23,"device": {"advertising_id": "fake-ad-id-23"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_24", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 24,"device": {"advertising_id": "fake-ad-id-24"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_25", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 25,"device": {"advertising_id": "fake-ad-id-25"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_26", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 26,"device": {"advertising_id": "fake-ad-id-26"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_27", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 27,"device": {"advertising_id": "fake-ad-id-27"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_28", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 28,"device": {"advertising_id": "fake-ad-id-28"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_29", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 29,"device": {"advertising_id": "fake-ad-id-29"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_30", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 30,"device": {"advertising_id": "fake-ad-id-30"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_31", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 31,"device": {"advertising_id": "fake-ad-id-31"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_32", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 32,"device": {"advertising_id": "fake-ad-id-32"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_33", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 33,"device": {"advertising_id": "fake-ad-id-33"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_34", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 34,"device": {"advertising_id": "fake-ad-id-34"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_35", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 35,"device": {"advertising_id": "fake-ad-id-35"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_36", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 36,"device": {"advertising_id": "fake-ad-id-36"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_37", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 37,"device": {"advertising_id": "fake-ad-id-37"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_38", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 38,"device": {"advertising_id": "fake-ad-id-38"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_39", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 39,"device": {"advertising_id": "fake-ad-id-39"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Puzzle Letter: b", "screen": "Level 2 - Profile: 1", "action": "SegmentSuccess_Level_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_40", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 40,"device": {"advertising_id": "fake-ad-id-40"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_41", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 41,"device": {"advertising_id": "fake-ad-id-41"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_42", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 42,"device": {"advertising_id": "fake-ad-id-42"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_43", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 43,"device": {"advertising_id": "fake-ad-id-43"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_44", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 44,"device": {"advertising_id": "fake-ad-id-44"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_45", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 45,"device": {"advertising_id": "fake-ad-id-45"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_46", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 46,"device": {"advertising_id": "fake-ad-id-46"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_47", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 47,"device": {"advertising_id": "fake-ad-id-47"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_48", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 48,"device": {"advertising_id": "fake-ad-id-48"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_49", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 49,"device": {"advertising_id": "fake-ad-id-49"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_50", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 50,"device": {"advertising_id": "fake-ad-id-50"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_51", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 51,"device": {"advertising_id": "fake-ad-id-51"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_52", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 52,"device": {"advertising_id": "fake-ad-id-52"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_53", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 53,"device": {"advertising_id": "fake-ad-id-53"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_54", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 54,"device": {"advertising_id": "fake-ad-id-54"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_55", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 55,"device": {"advertising_id": "fake-ad-id-55"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_56", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 56,"device": {"advertising_id": "fake-ad-id-56"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_57", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 57,"device": {"advertising_id": "fake-ad-id-57"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_58", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 58,"device": {"advertising_id": "fake-ad-id-58"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_59", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 59,"device": {"advertising_id": "fake-ad-id-59"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_60", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 60,"device": {"advertising_id": "fake-ad-id-60"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_61", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 61,"device": {"advertising_id": "fake-ad-id-61"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_62", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 62,"device": {"advertising_id": "fake-ad-id-62"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_63", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 63,"device": {"advertising_id": "fake-ad-id-63"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_64", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 64,"device": {"advertising_id": "fake-ad-id-64"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_65", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 65,"device": {"advertising_id": "fake-ad-id-65"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_66", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 66,"device": {"advertising_id": "fake-ad-id-66"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_67", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 67,"device": {"advertising_id": "fake-ad-id-67"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_68", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 68,"device": {"advertising_id": "fake-ad-id-68"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_69", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 69,"device": {"advertising_id": "fake-ad-id-69"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_70", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 70,"device": {"advertising_id": "fake-ad-id-70"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_71", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 71,"device": {"advertising_id": "fake-ad-id-71"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_72", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 72,"device": {"advertising_id": "fake-ad-id-72"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_73", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 73,"device": {"advertising_id": "fake-ad-id-73"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_74", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 74,"device": {"advertising_id": "fake-ad-id-74"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_75", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 75,"device": {"advertising_id": "fake-ad-id-75"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_76", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 76,"device": {"advertising_id": "fake-ad-id-76"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_77", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 77,"device": {"advertising_id": "fake-ad-id-77"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_78", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 78,"device": {"advertising_id": "fake-ad-id-78"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_79", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 79,"device": {"advertising_id": "fake-ad-id-79"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_80", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 80,"device": {"advertising_id": "fake-ad-id-80"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_81", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 81,"device": {"advertising_id": "fake-ad-id-81"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_82", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 82,"device": {"advertising_id": "fake-ad-id-82"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_83", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 83,"device": {"advertising_id": "fake-ad-id-83"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_84", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 84,"device": {"advertising_id": "fake-ad-id-84"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_85", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 85,"device": {"advertising_id": "fake-ad-id-85"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_86", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 86,"device": {"advertising_id": "fake-ad-id-86"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_87", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 87,"device": {"advertising_id": "fake-ad-id-87"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_88", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 88,"device": {"advertising_id": "fake-ad-id-88"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_89", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 89,"device": {"advertising_id": "fake-ad-id-89"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_90", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 90,"device": {"advertising_id": "fake-ad-id-90"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_91", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 91,"device": {"advertising_id": "fake-ad-id-91"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_92", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 92,"device": {"advertising_id": "fake-ad-id-92"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_93", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 93,"device": {"advertising_id": "fake-ad-id-93"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_94", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 94,"device": {"advertising_id": "fake-ad-id-94"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_95", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 95,"device": {"advertising_id": "fake-ad-id-95"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "days_since_last", "screen": "Level 1 - Profile: 1", "action": "DaysSinceLast", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_96", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 96,"device": {"advertising_id": "fake-ad-id-96"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_97", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 97,"device": {"advertising_id": "fake-ad-id-97"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_98", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 98,"device": {"advertising_id": "fake-ad-id-98"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_99", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 99,"device": {"advertising_id": "fake-ad-id-99"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_100", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 100,"device": {"advertising_id": "fake-ad-id-100"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_101", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 101,"device": {"advertising_id": "fake-ad-id-101"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}} -], "set4": [ - {"user_pseudo_id": "pseudo_id_1", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 1001,"device": {"advertising_id": "fake-ad-id-1"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_2", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 1002,"device": {"advertising_id": "fake-ad-id-2"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_3", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 1003,"device": {"advertising_id": "fake-ad-id-3"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_4", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 1004,"device": {"advertising_id": "fake-ad-id-4"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_5", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 1005,"device": {"advertising_id": "fake-ad-id-5"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_6", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 1006,"device": {"advertising_id": "fake-ad-id-6"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_7", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 1007,"device": {"advertising_id": "fake-ad-id-7"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_8", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 1008,"device": {"advertising_id": "fake-ad-id-8"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_9", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 1009,"device": {"advertising_id": "fake-ad-id-9"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_10", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10010,"device": {"advertising_id": "fake-ad-id-10"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_11", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10011,"device": {"advertising_id": "fake-ad-id-11"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_12", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10012,"device": {"advertising_id": "fake-ad-id-12"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_13", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10013,"device": {"advertising_id": "fake-ad-id-13"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_14", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10014,"device": {"advertising_id": "fake-ad-id-14"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_15", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10015,"device": {"advertising_id": "fake-ad-id-15"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_16", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10016,"device": {"advertising_id": "fake-ad-id-16"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_17", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10017,"device": {"advertising_id": "fake-ad-id-17"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_18", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10018,"device": {"advertising_id": "fake-ad-id-18"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_19", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10019,"device": {"advertising_id": "fake-ad-id-19"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_20", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10020,"device": {"advertising_id": "fake-ad-id-20"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_21", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10021,"device": {"advertising_id": "fake-ad-id-21"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "total_playtime", "screen": "Level 1 - Profile: 2", "action": "TotalPlaytime", "val": "120000", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_22", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10022,"device": {"advertising_id": "fake-ad-id-22"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_23", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10023,"device": {"advertising_id": "fake-ad-id-23"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_24", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10024,"device": {"advertising_id": "fake-ad-id-24"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_25", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10025,"device": {"advertising_id": "fake-ad-id-25"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_26", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10026,"device": {"advertising_id": "fake-ad-id-26"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_27", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10027,"device": {"advertising_id": "fake-ad-id-27"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_28", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10028,"device": {"advertising_id": "fake-ad-id-28"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_29", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10029,"device": {"advertising_id": "fake-ad-id-29"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_30", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10030,"device": {"advertising_id": "fake-ad-id-30"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_31", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10031,"device": {"advertising_id": "fake-ad-id-31"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_32", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10032,"device": {"advertising_id": "fake-ad-id-32"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_33", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10033,"device": {"advertising_id": "fake-ad-id-33"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_34", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10034,"device": {"advertising_id": "fake-ad-id-34"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_35", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10035,"device": {"advertising_id": "fake-ad-id-35"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_36", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10036,"device": {"advertising_id": "fake-ad-id-36"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_37", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10037,"device": {"advertising_id": "fake-ad-id-37"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_38", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10038,"device": {"advertising_id": "fake-ad-id-38"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_39", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10039,"device": {"advertising_id": "fake-ad-id-39"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_40", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10040,"device": {"advertising_id": "fake-ad-id-40"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_41", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10041,"device": {"advertising_id": "fake-ad-id-41"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_42", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10042,"device": {"advertising_id": "fake-ad-id-42"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_43", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10043,"device": {"advertising_id": "fake-ad-id-43"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_44", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10044,"device": {"advertising_id": "fake-ad-id-44"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_45", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10045,"device": {"advertising_id": "fake-ad-id-45"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_46", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10046,"device": {"advertising_id": "fake-ad-id-46"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_47", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10047,"device": {"advertising_id": "fake-ad-id-47"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_48", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10048,"device": {"advertising_id": "fake-ad-id-48"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_49", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10049,"device": {"advertising_id": "fake-ad-id-49"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_50", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10050,"device": {"advertising_id": "fake-ad-id-50"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_51", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10051,"device": {"advertising_id": "fake-ad-id-51"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "average_session", "screen": "Level 1 - Profile: 0", "action": "AvgSession", "val": "477.80062866210938", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_52", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10052,"device": {"advertising_id": "fake-ad-id-52"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "Level_6", "action": "SelectMonster Magnet Evolve_4", "screen": "MonsterSelect", "val": "1", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_53", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10053,"device": {"advertising_id": "fake-ad-id-53"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_54", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10054,"device": {"advertising_id": "fake-ad-id-54"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_55", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10055,"device": {"advertising_id": "fake-ad-id-55"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_56", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10056,"device": {"advertising_id": "fake-ad-id-56"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_57", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10057,"device": {"advertising_id": "fake-ad-id-57"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_58", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10058,"device": {"advertising_id": "fake-ad-id-58"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_59", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10059,"device": {"advertising_id": "fake-ad-id-59"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_60", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10060,"device": {"advertising_id": "fake-ad-id-60"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_61", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10061,"device": {"advertising_id": "fake-ad-id-61"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_62", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10062,"device": {"advertising_id": "fake-ad-id-62"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_63", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10063,"device": {"advertising_id": "fake-ad-id-63"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_64", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10064,"device": {"advertising_id": "fake-ad-id-64"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_65", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10065,"device": {"advertising_id": "fake-ad-id-65"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_66", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10066,"device": {"advertising_id": "fake-ad-id-66"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_67", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10067,"device": {"advertising_id": "fake-ad-id-67"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_68", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10068,"device": {"advertising_id": "fake-ad-id-68"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_69", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10069,"device": {"advertising_id": "fake-ad-id-69"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_70", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10070,"device": {"advertising_id": "fake-ad-id-70"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_71", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10071,"device": {"advertising_id": "fake-ad-id-71"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_72", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10072,"device": {"advertising_id": "fake-ad-id-72"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_73", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10073,"device": {"advertising_id": "fake-ad-id-73"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_74", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10074,"device": {"advertising_id": "fake-ad-id-74"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_75", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10075,"device": {"advertising_id": "fake-ad-id-75"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_76", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10076,"device": {"advertising_id": "fake-ad-id-76"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "3 puzzles", "screen": "Level 1 - Profile: 1", "action": "LevelSuccess_1", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_77", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10077,"device": {"advertising_id": "fake-ad-id-77"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_78", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10078,"device": {"advertising_id": "fake-ad-id-78"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_79", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10079,"device": {"advertising_id": "fake-ad-id-79"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_80", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10080,"device": {"advertising_id": "fake-ad-id-80"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_81", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10081,"device": {"advertising_id": "fake-ad-id-81"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_82", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10082,"device": {"advertising_id": "fake-ad-id-82"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_83", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10083,"device": {"advertising_id": "fake-ad-id-83"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_84", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10084,"device": {"advertising_id": "fake-ad-id-84"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_85", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10085,"device": {"advertising_id": "fake-ad-id-85"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_86", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10086,"device": {"advertising_id": "fake-ad-id-86"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_87", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10087,"device": {"advertising_id": "fake-ad-id-87"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_88", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10088,"device": {"advertising_id": "fake-ad-id-88"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_89", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10089,"device": {"advertising_id": "fake-ad-id-89"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_90", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10090,"device": {"advertising_id": "fake-ad-id-90"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_91", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10091,"device": {"advertising_id": "fake-ad-id-91"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_92", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10092,"device": {"advertising_id": "fake-ad-id-92"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_93", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10093,"device": {"advertising_id": "fake-ad-id-93"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_94", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10094,"device": {"advertising_id": "fake-ad-id-94"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_95", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10095,"device": {"advertising_id": "fake-ad-id-95"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_96", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10096,"device": {"advertising_id": "fake-ad-id-96"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_97", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10097,"device": {"advertising_id": "fake-ad-id-97"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_98", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10098,"device": {"advertising_id": "fake-ad-id-98"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_99", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 10099,"device": {"advertising_id": "fake-ad-id-99"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_100", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 100100,"device": {"advertising_id": "fake-ad-id-100"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}}, - {"user_pseudo_id": "pseudo_id_101", "attribution_id": "referral_source_8675309", "app_package_name": "com.eduapp4syria.feedthemonsterENGLISH", "event_timestamp": 100101,"device": {"advertising_id": "fake-ad-id-101"}, "event_date": "fake-date", "geo": {"continent": "fake-continent", "country": "fake-country", "city": "fake-city", "region": "fake-region"}, "event_name": "fake-event", "label": "1 puzzles", "screen": "Level 2 - Profile: 1", "action": "LevelFail_2", "val": "0", "value": {"string_value": "fake-value", "int_value": "NULL", "float_value": "NULL", "double_value": "NULL"}} - ]} diff --git a/api/test/index.spec.js b/api/test/index.spec.js deleted file mode 100644 index 76e97b5..0000000 --- a/api/test/index.spec.js +++ /dev/null @@ -1,8 +0,0 @@ -const sinon = require('sinon'); -const express = require ('express'); -const proxyquire = require('proxyquire').noPreserveCache(); -const fs = require('fs'); -const bq = require('@google-cloud/bigquery'); -const http = require('http'); -const testData = require('./testTableMap.json'); -const sandbox = sinon.createSandbox(); diff --git a/api/test/setup.js b/api/test/setup.js deleted file mode 100644 index 7c621cc..0000000 --- a/api/test/setup.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; - -var chai = require('chai'), - Promise = require('bluebird'), - chaiAsPromised = require('chai-as-promised'), - sinonChai = require('sinon-chai'); - -global.should = chai.should(); -chai.use(chaiAsPromised); -chai.use(sinonChai); - -global.expect = chai.expect; -global.AssertionError = chai.AssertionError; -global.Assertion = chai.Assertion; -global.assert = chai.assert; diff --git a/api/test/sqlLoader.spec.js b/api/test/sqlLoader.spec.js deleted file mode 100644 index 007e3fb..0000000 --- a/api/test/sqlLoader.spec.js +++ /dev/null @@ -1,130 +0,0 @@ -const sinon = require('sinon'); -const proxyquire = require('proxyquire'); -const sandbox = sinon.createSandbox(); - -describe('SqlLoader', () => { - let paths, queryStrings, readStub; - - beforeEach(() => { - paths = { - fakeQuery1: 'fakeQuery1.sql', - fakeQuery2: 'fakeQuery2.sql', - fakeQuery3: 'fakeQuery3.sql', - fakeQuery4: 'fakeQuery4.sql', - fakeQuery5: 'fakeQuery5.sql', - fakeQuery6: 'fakeQuery6.sql', - } - queryStrings = [ //return nodeJS buffers to test string conversion - Buffer.from('fake-query-string 1'), - Buffer.from('fake-query-string 2'), - Buffer.from('fake-query-string 3'), - Buffer.from('fake-query-string 4'), - Buffer.from('fake-query-string 5'), - Buffer.from('fake-query-string 6'), - ] - readStub = sandbox.stub(); - readStub.withArgs(sinon.match(paths.fakeQuery1)).returns(queryStrings[0]); - readStub.withArgs(sinon.match(paths.fakeQuery2)).returns(queryStrings[1]); - readStub.withArgs(sinon.match(paths.fakeQuery3)).returns(queryStrings[2]); - readStub.withArgs(sinon.match(paths.fakeQuery4)).returns(queryStrings[3]); - readStub.withArgs(sinon.match(paths.fakeQuery5)).returns(queryStrings[4]); - readStub.withArgs(sinon.match(paths.fakeQuery6)).returns(queryStrings[5]); - }); - afterEach(() => { - sandbox.restore(); - sandbox.reset(); - }); - - - const {SqlLoader} = proxyquire('../src/helperClasses', { - 'fs': { - readFileSync: (path, encoding) => { - return readStub(path, encoding); - }, - }, - }); - - it('we successfully stub the dependency', () => { - readStub.should.exist; - readStub(`./${paths.fakeQuery1}`, '').should.equal(queryStrings[0]); - readStub(`./${paths.fakeQuery2}`, '').should.equal(queryStrings[1]); - readStub(`./${paths.fakeQuery3}`, '').should.equal(queryStrings[2]); - readStub(`./${paths.fakeQuery4}`, '').should.equal(queryStrings[3]); - readStub(`./${paths.fakeQuery5}`, '').should.equal(queryStrings[4]); - readStub(`./${paths.fakeQuery6}`, '').should.equal(queryStrings[5]); - }); - it('we can initialize the class', () => { - const test = new SqlLoader(paths); - test.fileStrings.should.exist; - }); - it('we can provide optional basePath and encoding arguments', ()=> { - const test = new SqlLoader(paths, './testPath', 'utf-9'); - test.basePath.should.equal('./testPath'); - test.encoding.should.equal('utf-9'); - }); - it('we get an error if we omit the paths object', () => { - try { - const test = new SqlLoader(); - throw new Error('test failed'); - } catch (e) { - e.message.should.equal('you must provide an array or map of paths to sql files'); - } - }); - it('the class successfully reads in the files in the map', () => { - let expected ={}; - for (let path in paths) { - expected[paths[path]] = readStub(paths[path]).toString(); - } - const test = new SqlLoader(paths); - test.fileStrings.should.deep.equal(expected); - }); - it('we can pass an array instead of a map', () => { - const testArray = Object.values(paths); - let expected = {}; - for (let path in paths) { - expected[paths[path]] = readStub(paths[path]).toString(); - } - const test = new SqlLoader(testArray); - test.fileStrings.should.deep.equal(expected); - }); - it('we receive the the first query string', () => { - const test = new SqlLoader(paths); - const expected = queryStrings[0].toString(); - test.getQueryString(paths.fakeQuery1).should.equal(expected); - }); - it('we receive the the second query string', () => { - const test = new SqlLoader(paths); - const expected = queryStrings[1].toString(); - test.getQueryString(paths.fakeQuery2).should.equal(expected); - }); - it('we receive the the third query string', () => { - const test = new SqlLoader(paths); - const expected = queryStrings[2].toString(); - test.getQueryString(paths.fakeQuery3).should.equal(expected); - }); - it('we receive the the fourth query string', () => { - const test = new SqlLoader(paths); - const expected = queryStrings[3].toString(); - test.getQueryString(paths.fakeQuery4).should.equal(expected); - }); - it('we receive the the fifth query string', () => { - const test = new SqlLoader(paths); - const expected = queryStrings[4].toString(); - test.getQueryString(paths.fakeQuery5).should.equal(expected); - }); - it('we receive the the sixth query string', () => { - const test = new SqlLoader(paths); - const expected = queryStrings[5].toString(); - test.getQueryString(paths.fakeQuery6).should.equal(expected); - }); - it('we receive an error if there is no matching path', () => { - const test = new SqlLoader(paths); - sandbox.spy (test, 'getQueryString'); - try{ - test.getQueryString('missing-query'); - throw new Error ('test failed'); - } catch (e) { - test.getQueryString.should.have.thrown; - } - }); -}); diff --git a/api/test/testTableMap.json b/api/test/testTableMap.json deleted file mode 100644 index 80b295f..0000000 --- a/api/test/testTableMap.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "id": "com.test.app.id", - "project": "test-proj", - "table": "test-table", - "dataset": "test-dataset" - }, - { - "id": "com.wrong.app.id", - "project": "test-proj", - "table": "wrong-table", - "dataset": "wrong-dataset" - } - ] diff --git a/helm-charts/values/production.yaml b/helm-charts/values/production.yaml index 2987aa9..2f98730 100644 --- a/helm-charts/values/production.yaml +++ b/helm-charts/values/production.yaml @@ -3,6 +3,7 @@ replicaCount: 2 image: repository: ghcr.io/curiouslearning/literacy-data-api tag: master + pullPolicy: Always container: env: