Built motion from commit 5b761a7b.|2.5.36
[motion2.git] / server / api / jscriptyAnswerReport / jscriptyAnswerReport.controller.js
index fcd954e..4bfbe0a 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0xc457=['name','send','index','rawAttributes','fieldName','type','key','model','map','query','filters','intersection','attributes','fields','length','hasOwnProperty','nolimit','order','sort','where','pick','filter','merge','VIRTUAL','options','JscriptyAnswerReport','include','findAll','rows','catch','params','keys','includeAll','find','create','body','update','describe','html-pdf','eml-format','rimraf','fast-json-patch','request-promise','mustache','util','path','sox','ejs','squel','crypto','jsforce','desk.js','to-csv','querystring','papaparse','../../components/auth/service','../../components/parsers/qs','api','../../config/utils','../../config/environment','../../mysqldb','sendStatus','status','end','json','count','offset','limit','set','Content-Range','apply','reject','destroy','then','error'];(function(_0x16c671,_0x3fb7a9){var _0x398156=function(_0x314fbd){while(--_0x314fbd){_0x16c671['push'](_0x16c671['shift']());}};_0x398156(++_0x3fb7a9);}(_0xc457,0x152));var _0x7c45=function(_0x43bac1,_0x1bff73){_0x43bac1=_0x43bac1-0x0;var _0x14aac9=_0xc457[_0x43bac1];return _0x14aac9;};'use strict';var pdf=require(_0x7c45('0x0'));var emlformat=require(_0x7c45('0x1'));var rimraf=require(_0x7c45('0x2'));var zipdir=require('zip-dir');var jsonpatch=require(_0x7c45('0x3'));var rp=require(_0x7c45('0x4'));var moment=require('moment');var BPromise=require('bluebird');var Mustache=require(_0x7c45('0x5'));var util=require(_0x7c45('0x6'));var path=require(_0x7c45('0x7'));var sox=require(_0x7c45('0x8'));var csv=require('to-csv');var ejs=require(_0x7c45('0x9'));var fs=require('fs');var _=require('lodash');var squel=require(_0x7c45('0xa'));var crypto=require(_0x7c45('0xb'));var jsforce=require(_0x7c45('0xc'));var deskjs=require(_0x7c45('0xd'));var toCsv=require(_0x7c45('0xe'));var querystring=require(_0x7c45('0xf'));var Papa=require(_0x7c45('0x10'));var Redis=require('ioredis');var authService=require(_0x7c45('0x11'));var qs=require(_0x7c45('0x12'));var as=require('../../components/parsers/advancedSearch');var hardwareService=require('../../config/license/hardware');var logger=require('../../config/logger')(_0x7c45('0x13'));var utils=require(_0x7c45('0x14'));var config=require(_0x7c45('0x15'));var db=require(_0x7c45('0x16'))['db'];function respondWithStatusCode(_0xe00833,_0x385772){_0x385772=_0x385772||0xcc;return function(_0x4de802){if(_0x4de802){return _0xe00833[_0x7c45('0x17')](_0x385772);}return _0xe00833[_0x7c45('0x18')](_0x385772)[_0x7c45('0x19')]();};}function respondWithResult(_0x16d89a,_0x2417fe){_0x2417fe=_0x2417fe||0xc8;return function(_0x4861e5){if(_0x4861e5){return _0x16d89a['status'](_0x2417fe)[_0x7c45('0x1a')](_0x4861e5);}};}function respondWithFilteredResult(_0x25a02d,_0x4ea399){return function(_0x48804b){if(_0x48804b){var _0x317185=_0x48804b[_0x7c45('0x1b')],_0x1356d1=_0x4ea399['offset'],_0x5e2b57=_0x4ea399[_0x7c45('0x1c')]+_0x4ea399[_0x7c45('0x1d')],_0x59e4b8;if(_0x5e2b57>=_0x317185){_0x5e2b57=_0x317185;_0x59e4b8=0xc8;}else{_0x59e4b8=0xce;}_0x25a02d[_0x7c45('0x18')](_0x59e4b8);return _0x25a02d[_0x7c45('0x1e')](_0x7c45('0x1f'),_0x1356d1+'-'+_0x5e2b57+'/'+_0x317185)[_0x7c45('0x1a')](_0x48804b);}return null;};}function patchUpdates(_0x1d9359){return function(_0x109d4d){try{jsonpatch[_0x7c45('0x20')](_0x109d4d,_0x1d9359,!![]);}catch(_0x3d98de){return BPromise[_0x7c45('0x21')](_0x3d98de);}return _0x109d4d['save']();};}function saveUpdates(_0x5c8dfa,_0x46ddc3){return function(_0x35a305){if(_0x35a305){return _0x35a305['update'](_0x5c8dfa)['then'](function(_0x19f611){return _0x19f611;});}return null;};}function removeEntity(_0x11d78e,_0x13083e){return function(_0x42f7cb){if(_0x42f7cb){return _0x42f7cb[_0x7c45('0x22')]()[_0x7c45('0x23')](function(){_0x11d78e[_0x7c45('0x18')](0xcc)[_0x7c45('0x19')]();});}};}function handleEntityNotFound(_0x4ea4ef,_0x2a0eb8){return function(_0x2aef9f){if(!_0x2aef9f){_0x4ea4ef[_0x7c45('0x17')](0x194);}return _0x2aef9f;};}function handleError(_0xfc1d20,_0x5d5113){_0x5d5113=_0x5d5113||0x1f4;return function(_0x1cd1e6){logger[_0x7c45('0x24')](_0x1cd1e6['stack']);if(_0x1cd1e6[_0x7c45('0x25')]){delete _0x1cd1e6[_0x7c45('0x25')];}_0xfc1d20['status'](_0x5d5113)[_0x7c45('0x26')](_0x1cd1e6);};}exports[_0x7c45('0x27')]=function(_0x399fa7,_0x510a43){var _0x442bea={},_0x12ece3={},_0x56bc48={'count':0x0,'rows':[]};var _0x37664e=_['map'](db['JscriptyAnswerReport'][_0x7c45('0x28')],function(_0x3b1be3){return{'name':_0x3b1be3[_0x7c45('0x29')],'type':_0x3b1be3[_0x7c45('0x2a')][_0x7c45('0x2b')]};});_0x12ece3[_0x7c45('0x2c')]=_[_0x7c45('0x2d')](_0x37664e,_0x7c45('0x25'));_0x12ece3[_0x7c45('0x2e')]=_['keys'](_0x399fa7[_0x7c45('0x2e')]);_0x12ece3[_0x7c45('0x2f')]=_[_0x7c45('0x30')](_0x12ece3[_0x7c45('0x2c')],_0x12ece3[_0x7c45('0x2e')]);_0x442bea[_0x7c45('0x31')]=_[_0x7c45('0x30')](_0x12ece3[_0x7c45('0x2c')],qs['fields'](_0x399fa7['query'][_0x7c45('0x32')]));_0x442bea[_0x7c45('0x31')]=_0x442bea[_0x7c45('0x31')][_0x7c45('0x33')]?_0x442bea[_0x7c45('0x31')]:_0x12ece3[_0x7c45('0x2c')];if(!_0x399fa7[_0x7c45('0x2e')][_0x7c45('0x34')](_0x7c45('0x35'))){_0x442bea[_0x7c45('0x1d')]=qs[_0x7c45('0x1d')](_0x399fa7['query']['limit']);_0x442bea[_0x7c45('0x1c')]=qs[_0x7c45('0x1c')](_0x399fa7[_0x7c45('0x2e')][_0x7c45('0x1c')]);}_0x442bea[_0x7c45('0x36')]=qs[_0x7c45('0x37')](_0x399fa7[_0x7c45('0x2e')]['sort']);_0x442bea[_0x7c45('0x38')]=qs[_0x7c45('0x2f')](_[_0x7c45('0x39')](_0x399fa7[_0x7c45('0x2e')],_0x12ece3[_0x7c45('0x2f')]),_0x37664e);if(_0x399fa7[_0x7c45('0x2e')][_0x7c45('0x3a')]){_0x442bea[_0x7c45('0x38')]=_[_0x7c45('0x3b')](_0x442bea['where'],{'$or':_[_0x7c45('0x2d')](_0x37664e,function(_0x29cfea){if(_0x29cfea[_0x7c45('0x2a')]!==_0x7c45('0x3c')){var _0x55d062={};_0x55d062[_0x29cfea['name']]={'$like':'%'+_0x399fa7[_0x7c45('0x2e')][_0x7c45('0x3a')]+'%'};return _0x55d062;}})});}_0x442bea=_[_0x7c45('0x3b')]({},_0x442bea,_0x399fa7[_0x7c45('0x3d')]);var _0x1df3a1={'where':_0x442bea[_0x7c45('0x38')]};return db[_0x7c45('0x3e')][_0x7c45('0x1b')](_0x1df3a1)[_0x7c45('0x23')](function(_0xcfcaa4){_0x56bc48['count']=_0xcfcaa4;if(_0x399fa7['query']['includeAll']){_0x442bea[_0x7c45('0x3f')]=[{'all':!![]}];}return db[_0x7c45('0x3e')][_0x7c45('0x40')](_0x442bea);})['then'](function(_0x384e6f){_0x56bc48[_0x7c45('0x41')]=_0x384e6f;return _0x56bc48;})['then'](respondWithFilteredResult(_0x510a43,_0x442bea))[_0x7c45('0x42')](handleError(_0x510a43,null));};exports['show']=function(_0x14d346,_0x2c5269){var _0x303f66={'raw':!![],'where':{'id':_0x14d346[_0x7c45('0x43')]['id']}},_0x1896f3={};_0x1896f3[_0x7c45('0x2c')]=_['keys'](db['JscriptyAnswerReport']['rawAttributes']);_0x1896f3[_0x7c45('0x2e')]=_[_0x7c45('0x44')](_0x14d346['query']);_0x1896f3['filters']=_[_0x7c45('0x30')](_0x1896f3[_0x7c45('0x2c')],_0x1896f3['query']);_0x303f66[_0x7c45('0x31')]=_[_0x7c45('0x30')](_0x1896f3['model'],qs[_0x7c45('0x32')](_0x14d346[_0x7c45('0x2e')][_0x7c45('0x32')]));_0x303f66['attributes']=_0x303f66[_0x7c45('0x31')][_0x7c45('0x33')]?_0x303f66[_0x7c45('0x31')]:_0x1896f3[_0x7c45('0x2c')];if(_0x14d346[_0x7c45('0x2e')][_0x7c45('0x45')]){_0x303f66['include']=[{'all':!![]}];}_0x303f66=_['merge']({},_0x303f66,_0x14d346['options']);return db[_0x7c45('0x3e')][_0x7c45('0x46')](_0x303f66)[_0x7c45('0x23')](handleEntityNotFound(_0x2c5269,null))[_0x7c45('0x23')](respondWithResult(_0x2c5269,null))['catch'](handleError(_0x2c5269,null));};exports[_0x7c45('0x47')]=function(_0x5e6a54,_0x45db14){return db[_0x7c45('0x3e')]['create'](_0x5e6a54[_0x7c45('0x48')],{})[_0x7c45('0x23')](respondWithResult(_0x45db14,0xc9))[_0x7c45('0x42')](handleError(_0x45db14,null));};exports[_0x7c45('0x49')]=function(_0xd26c76,_0xabed6a){if(_0xd26c76['body']['id']){delete _0xd26c76[_0x7c45('0x48')]['id'];}return db[_0x7c45('0x3e')][_0x7c45('0x46')]({'where':{'id':_0xd26c76['params']['id']}})[_0x7c45('0x23')](handleEntityNotFound(_0xabed6a,null))[_0x7c45('0x23')](saveUpdates(_0xd26c76[_0x7c45('0x48')],null))[_0x7c45('0x23')](respondWithResult(_0xabed6a,null))[_0x7c45('0x42')](handleError(_0xabed6a,null));};exports[_0x7c45('0x22')]=function(_0x19ce77,_0x555693){return db[_0x7c45('0x3e')][_0x7c45('0x46')]({'where':{'id':_0x19ce77[_0x7c45('0x43')]['id']}})[_0x7c45('0x23')](handleEntityNotFound(_0x555693,null))['then'](removeEntity(_0x555693,null))[_0x7c45('0x42')](handleError(_0x555693,null));};exports[_0x7c45('0x4a')]=function(_0x3bff2d,_0x43783a){return db[_0x7c45('0x3e')][_0x7c45('0x4a')]()[_0x7c45('0x23')](respondWithResult(_0x43783a,null))['catch'](handleError(_0x43783a,null));};
\ No newline at end of file
+var _0x85d0=['ioredis','../../components/auth/service','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/logger','api','../../config/utils','../../config/environment','../../mysqldb','sendStatus','status','end','offset','limit','undefined','count','set','Content-Range','json','apply','reject','update','then','destroy','stack','name','send','index','JscriptyAnswerReport','rawAttributes','fieldName','type','model','map','keys','query','filters','attributes','intersection','fields','length','hasOwnProperty','nolimit','order','where','filter','VIRTUAL','merge','include','findAll','rows','catch','show','params','includeAll','options','find','create','body','describe','request-promise','moment','bluebird','mustache','util','path','to-csv','fs-extra','lodash','squel','jsforce','desk.js','querystring','papaparse'];(function(_0x59ee6f,_0x450239){var _0x4c0979=function(_0x565e92){while(--_0x565e92){_0x59ee6f['push'](_0x59ee6f['shift']());}};_0x4c0979(++_0x450239);}(_0x85d0,0x164));var _0x085d=function(_0x360aa1,_0x5c0d8a){_0x360aa1=_0x360aa1-0x0;var _0x18c684=_0x85d0[_0x360aa1];return _0x18c684;};'use strict';var emlformat=require('eml-format');var rimraf=require('rimraf');var zipdir=require('zip-dir');var jsonpatch=require('fast-json-patch');var rp=require(_0x085d('0x0'));var moment=require(_0x085d('0x1'));var BPromise=require(_0x085d('0x2'));var Mustache=require(_0x085d('0x3'));var util=require(_0x085d('0x4'));var path=require(_0x085d('0x5'));var sox=require('sox');var csv=require(_0x085d('0x6'));var ejs=require('ejs');var fs=require('fs');var fs_extra=require(_0x085d('0x7'));var _=require(_0x085d('0x8'));var squel=require(_0x085d('0x9'));var crypto=require('crypto');var jsforce=require(_0x085d('0xa'));var deskjs=require(_0x085d('0xb'));var toCsv=require(_0x085d('0x6'));var querystring=require(_0x085d('0xc'));var Papa=require(_0x085d('0xd'));var Redis=require(_0x085d('0xe'));var authService=require(_0x085d('0xf'));var qs=require(_0x085d('0x10'));var as=require(_0x085d('0x11'));var hardwareService=require('../../config/license/hardware');var logger=require(_0x085d('0x12'))(_0x085d('0x13'));var utils=require(_0x085d('0x14'));var config=require(_0x085d('0x15'));var licenseUtil=require('../../config/license/util');var db=require(_0x085d('0x16'))['db'];function respondWithStatusCode(_0x2bd6ae,_0x5c6c27){_0x5c6c27=_0x5c6c27||0xcc;return function(_0x2e0714){if(_0x2e0714){return _0x2bd6ae[_0x085d('0x17')](_0x5c6c27);}return _0x2bd6ae[_0x085d('0x18')](_0x5c6c27)[_0x085d('0x19')]();};}function respondWithResult(_0x5a5252,_0x4b87b9){_0x4b87b9=_0x4b87b9||0xc8;return function(_0x19ce18){if(_0x19ce18){return _0x5a5252['status'](_0x4b87b9)['json'](_0x19ce18);}};}function respondWithFilteredResult(_0x267374,_0x334263){return function(_0x1d041b){if(_0x1d041b){var _0x5f8e18=typeof _0x334263[_0x085d('0x1a')]==='undefined'&&typeof _0x334263[_0x085d('0x1b')]===_0x085d('0x1c');var _0x1efea9=_0x1d041b[_0x085d('0x1d')];var _0x3e566f=_0x5f8e18?0x0:_0x334263[_0x085d('0x1a')];var _0x5c046e=_0x5f8e18?_0x1d041b[_0x085d('0x1d')]:_0x334263[_0x085d('0x1a')]+_0x334263['limit'];var _0xba531c;if(_0x5c046e>=_0x1efea9){_0x5c046e=_0x1efea9;_0xba531c=0xc8;}else{_0xba531c=0xce;}_0x267374[_0x085d('0x18')](_0xba531c);return _0x267374[_0x085d('0x1e')](_0x085d('0x1f'),_0x3e566f+'-'+_0x5c046e+'/'+_0x1efea9)[_0x085d('0x20')](_0x1d041b);}return null;};}function patchUpdates(_0x54eff1){return function(_0xb9d0ad){try{jsonpatch[_0x085d('0x21')](_0xb9d0ad,_0x54eff1,!![]);}catch(_0x39a85e){return BPromise[_0x085d('0x22')](_0x39a85e);}return _0xb9d0ad['save']();};}function saveUpdates(_0x5b3f9c,_0x4cdb11){return function(_0x2b7cdc){if(_0x2b7cdc){return _0x2b7cdc[_0x085d('0x23')](_0x5b3f9c)[_0x085d('0x24')](function(_0x10aa9d){return _0x10aa9d;});}return null;};}function removeEntity(_0x4715d6,_0x17dafb){return function(_0x576d95){if(_0x576d95){return _0x576d95[_0x085d('0x25')]()[_0x085d('0x24')](function(){_0x4715d6[_0x085d('0x18')](0xcc)['end']();});}};}function handleEntityNotFound(_0x38cddc,_0x290658){return function(_0xbacfbc){if(!_0xbacfbc){_0x38cddc[_0x085d('0x17')](0x194);}return _0xbacfbc;};}function handleError(_0x300295,_0x4b9032){_0x4b9032=_0x4b9032||0x1f4;return function(_0x5e5228){logger['error'](_0x5e5228[_0x085d('0x26')]);if(_0x5e5228[_0x085d('0x27')]){delete _0x5e5228[_0x085d('0x27')];}_0x300295['status'](_0x4b9032)[_0x085d('0x28')](_0x5e5228);};}exports[_0x085d('0x29')]=function(_0x3faf6b,_0x5c7849){var _0x2f670c={},_0x2eae2c={},_0x3f905d={'count':0x0,'rows':[]};var _0x26aa90=_['map'](db[_0x085d('0x2a')][_0x085d('0x2b')],function(_0x494070){return{'name':_0x494070[_0x085d('0x2c')],'type':_0x494070[_0x085d('0x2d')]['key']};});_0x2eae2c[_0x085d('0x2e')]=_[_0x085d('0x2f')](_0x26aa90,_0x085d('0x27'));_0x2eae2c['query']=_[_0x085d('0x30')](_0x3faf6b[_0x085d('0x31')]);_0x2eae2c[_0x085d('0x32')]=_['intersection'](_0x2eae2c[_0x085d('0x2e')],_0x2eae2c['query']);_0x2f670c[_0x085d('0x33')]=_[_0x085d('0x34')](_0x2eae2c[_0x085d('0x2e')],qs[_0x085d('0x35')](_0x3faf6b['query'][_0x085d('0x35')]));_0x2f670c[_0x085d('0x33')]=_0x2f670c[_0x085d('0x33')][_0x085d('0x36')]?_0x2f670c['attributes']:_0x2eae2c['model'];if(!_0x3faf6b[_0x085d('0x31')][_0x085d('0x37')](_0x085d('0x38'))){_0x2f670c[_0x085d('0x1b')]=qs[_0x085d('0x1b')](_0x3faf6b[_0x085d('0x31')][_0x085d('0x1b')]);_0x2f670c[_0x085d('0x1a')]=qs[_0x085d('0x1a')](_0x3faf6b['query'][_0x085d('0x1a')]);}_0x2f670c[_0x085d('0x39')]=qs['sort'](_0x3faf6b[_0x085d('0x31')]['sort']);_0x2f670c[_0x085d('0x3a')]=qs[_0x085d('0x32')](_['pick'](_0x3faf6b[_0x085d('0x31')],_0x2eae2c[_0x085d('0x32')]),_0x26aa90);if(_0x3faf6b[_0x085d('0x31')][_0x085d('0x3b')]){_0x2f670c[_0x085d('0x3a')]=_['merge'](_0x2f670c[_0x085d('0x3a')],{'$or':_['map'](_0x26aa90,function(_0x5d52be){if(_0x5d52be[_0x085d('0x2d')]!==_0x085d('0x3c')){var _0x31ee22={};_0x31ee22[_0x5d52be[_0x085d('0x27')]]={'$like':'%'+_0x3faf6b[_0x085d('0x31')]['filter']+'%'};return _0x31ee22;}})});}_0x2f670c=_[_0x085d('0x3d')]({},_0x2f670c,_0x3faf6b['options']);var _0x3a8646={'where':_0x2f670c[_0x085d('0x3a')]};return db[_0x085d('0x2a')]['count'](_0x3a8646)[_0x085d('0x24')](function(_0x55d81a){_0x3f905d[_0x085d('0x1d')]=_0x55d81a;if(_0x3faf6b[_0x085d('0x31')]['includeAll']){_0x2f670c[_0x085d('0x3e')]=[{'all':!![]}];}return db[_0x085d('0x2a')][_0x085d('0x3f')](_0x2f670c);})['then'](function(_0x56428e){_0x3f905d[_0x085d('0x40')]=_0x56428e;return _0x3f905d;})[_0x085d('0x24')](respondWithFilteredResult(_0x5c7849,_0x2f670c))[_0x085d('0x41')](handleError(_0x5c7849,null));};exports[_0x085d('0x42')]=function(_0x177f7d,_0x367a32){var _0x27e1c7={'raw':!![],'where':{'id':_0x177f7d[_0x085d('0x43')]['id']}},_0x120980={};_0x120980[_0x085d('0x2e')]=_['keys'](db['JscriptyAnswerReport'][_0x085d('0x2b')]);_0x120980[_0x085d('0x31')]=_[_0x085d('0x30')](_0x177f7d[_0x085d('0x31')]);_0x120980[_0x085d('0x32')]=_[_0x085d('0x34')](_0x120980[_0x085d('0x2e')],_0x120980[_0x085d('0x31')]);_0x27e1c7[_0x085d('0x33')]=_[_0x085d('0x34')](_0x120980[_0x085d('0x2e')],qs['fields'](_0x177f7d[_0x085d('0x31')][_0x085d('0x35')]));_0x27e1c7[_0x085d('0x33')]=_0x27e1c7[_0x085d('0x33')][_0x085d('0x36')]?_0x27e1c7['attributes']:_0x120980[_0x085d('0x2e')];if(_0x177f7d['query'][_0x085d('0x44')]){_0x27e1c7['include']=[{'all':!![]}];}_0x27e1c7=_['merge']({},_0x27e1c7,_0x177f7d[_0x085d('0x45')]);return db[_0x085d('0x2a')][_0x085d('0x46')](_0x27e1c7)[_0x085d('0x24')](handleEntityNotFound(_0x367a32,null))[_0x085d('0x24')](respondWithResult(_0x367a32,null))['catch'](handleError(_0x367a32,null));};exports['create']=function(_0x547723,_0x580b91){return db['JscriptyAnswerReport'][_0x085d('0x47')](_0x547723[_0x085d('0x48')],{})['then'](respondWithResult(_0x580b91,0xc9))[_0x085d('0x41')](handleError(_0x580b91,null));};exports['update']=function(_0x5df4cf,_0x415a4b){if(_0x5df4cf[_0x085d('0x48')]['id']){delete _0x5df4cf[_0x085d('0x48')]['id'];}return db[_0x085d('0x2a')]['find']({'where':{'id':_0x5df4cf[_0x085d('0x43')]['id']}})['then'](handleEntityNotFound(_0x415a4b,null))[_0x085d('0x24')](saveUpdates(_0x5df4cf[_0x085d('0x48')],null))['then'](respondWithResult(_0x415a4b,null))[_0x085d('0x41')](handleError(_0x415a4b,null));};exports[_0x085d('0x25')]=function(_0x298f6f,_0x37b56c){return db['JscriptyAnswerReport'][_0x085d('0x46')]({'where':{'id':_0x298f6f['params']['id']}})[_0x085d('0x24')](handleEntityNotFound(_0x37b56c,null))['then'](removeEntity(_0x37b56c,null))['catch'](handleError(_0x37b56c,null));};exports[_0x085d('0x49')]=function(_0x41e3e0,_0x236368){return db[_0x085d('0x2a')][_0x085d('0x49')]()[_0x085d('0x24')](respondWithResult(_0x236368,null))[_0x085d('0x41')](handleError(_0x236368,null));};
\ No newline at end of file