Built motion from commit 5ae82ce5.|2.6.7
[motion2.git] / server / api / smsApplication / smsApplication.controller.js
index 5f13ae8..dd348ed 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0xeff7=['map','query','keys','filters','intersection','attributes','fields','length','hasOwnProperty','sort','filter','where','merge','VIRTUAL','SmsApplication','includeAll','include','findAll','options','find','catch','create','body','update','params','eml-format','rimraf','zip-dir','fast-json-patch','request-promise','moment','util','path','sox','to-csv','ejs','fs-extra','lodash','squel','crypto','querystring','papaparse','ioredis','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/license/hardware','../../config/logger','api','../../config/environment','../../config/license/util','sendStatus','status','end','json','offset','undefined','count','limit','set','Content-Range','apply','reject','save','then','destroy','error','stack','name','send','index','rawAttributes','fieldName','type','key','model'];(function(_0x194c71,_0x529556){var _0x4f360e=function(_0x57b958){while(--_0x57b958){_0x194c71['push'](_0x194c71['shift']());}};_0x4f360e(++_0x529556);}(_0xeff7,0x145));var _0x7eff=function(_0x551131,_0x52cb34){_0x551131=_0x551131-0x0;var _0x1e00c7=_0xeff7[_0x551131];return _0x1e00c7;};'use strict';var emlformat=require(_0x7eff('0x0'));var rimraf=require(_0x7eff('0x1'));var zipdir=require(_0x7eff('0x2'));var jsonpatch=require(_0x7eff('0x3'));var rp=require(_0x7eff('0x4'));var moment=require(_0x7eff('0x5'));var BPromise=require('bluebird');var Mustache=require('mustache');var util=require(_0x7eff('0x6'));var path=require(_0x7eff('0x7'));var sox=require(_0x7eff('0x8'));var csv=require(_0x7eff('0x9'));var ejs=require(_0x7eff('0xa'));var fs=require('fs');var fs_extra=require(_0x7eff('0xb'));var _=require(_0x7eff('0xc'));var squel=require(_0x7eff('0xd'));var crypto=require(_0x7eff('0xe'));var jsforce=require('jsforce');var deskjs=require('desk.js');var toCsv=require(_0x7eff('0x9'));var querystring=require(_0x7eff('0xf'));var Papa=require(_0x7eff('0x10'));var Redis=require(_0x7eff('0x11'));var authService=require('../../components/auth/service');var qs=require(_0x7eff('0x12'));var as=require(_0x7eff('0x13'));var hardwareService=require(_0x7eff('0x14'));var logger=require(_0x7eff('0x15'))(_0x7eff('0x16'));var utils=require('../../config/utils');var config=require(_0x7eff('0x17'));var licenseUtil=require(_0x7eff('0x18'));var db=require('../../mysqldb')['db'];function respondWithStatusCode(_0xafd5b7,_0x280189){_0x280189=_0x280189||0xcc;return function(_0x5a64aa){if(_0x5a64aa){return _0xafd5b7[_0x7eff('0x19')](_0x280189);}return _0xafd5b7[_0x7eff('0x1a')](_0x280189)[_0x7eff('0x1b')]();};}function respondWithResult(_0x92d879,_0x2af7dd){_0x2af7dd=_0x2af7dd||0xc8;return function(_0x26830f){if(_0x26830f){return _0x92d879[_0x7eff('0x1a')](_0x2af7dd)[_0x7eff('0x1c')](_0x26830f);}};}function respondWithFilteredResult(_0x470570,_0x21a617){return function(_0x11e397){if(_0x11e397){var _0x246b3e=typeof _0x21a617[_0x7eff('0x1d')]===_0x7eff('0x1e')&&typeof _0x21a617['limit']==='undefined';var _0x159db4=_0x11e397[_0x7eff('0x1f')];var _0x3e3f29=_0x246b3e?0x0:_0x21a617['offset'];var _0x6dbf26=_0x246b3e?_0x11e397[_0x7eff('0x1f')]:_0x21a617['offset']+_0x21a617[_0x7eff('0x20')];var _0x191028;if(_0x6dbf26>=_0x159db4){_0x6dbf26=_0x159db4;_0x191028=0xc8;}else{_0x191028=0xce;}_0x470570['status'](_0x191028);return _0x470570[_0x7eff('0x21')](_0x7eff('0x22'),_0x3e3f29+'-'+_0x6dbf26+'/'+_0x159db4)[_0x7eff('0x1c')](_0x11e397);}return null;};}function patchUpdates(_0x2e6108){return function(_0x116eaf){try{jsonpatch[_0x7eff('0x23')](_0x116eaf,_0x2e6108,!![]);}catch(_0x465a4f){return BPromise[_0x7eff('0x24')](_0x465a4f);}return _0x116eaf[_0x7eff('0x25')]();};}function saveUpdates(_0x5bd3bd,_0x57f842){return function(_0x46b5ca){if(_0x46b5ca){return _0x46b5ca['update'](_0x5bd3bd)[_0x7eff('0x26')](function(_0xd88d3f){return _0xd88d3f;});}return null;};}function removeEntity(_0x26874a,_0x538855){return function(_0x2886b6){if(_0x2886b6){return _0x2886b6[_0x7eff('0x27')]()[_0x7eff('0x26')](function(){_0x26874a[_0x7eff('0x1a')](0xcc)[_0x7eff('0x1b')]();});}};}function handleEntityNotFound(_0x2eaa71,_0x5f490a){return function(_0x15d052){if(!_0x15d052){_0x2eaa71[_0x7eff('0x19')](0x194);}return _0x15d052;};}function handleError(_0x37b3c5,_0x44b1d9){_0x44b1d9=_0x44b1d9||0x1f4;return function(_0x5cee76){logger[_0x7eff('0x28')](_0x5cee76[_0x7eff('0x29')]);if(_0x5cee76['name']){delete _0x5cee76[_0x7eff('0x2a')];}_0x37b3c5[_0x7eff('0x1a')](_0x44b1d9)[_0x7eff('0x2b')](_0x5cee76);};}exports[_0x7eff('0x2c')]=function(_0x3085b8,_0x4c7672){var _0x2d5603={},_0x10066d={},_0x173548={'count':0x0,'rows':[]};var _0x3c54b3=_['map'](db['SmsApplication'][_0x7eff('0x2d')],function(_0x149f8d){return{'name':_0x149f8d[_0x7eff('0x2e')],'type':_0x149f8d[_0x7eff('0x2f')][_0x7eff('0x30')]};});_0x10066d[_0x7eff('0x31')]=_[_0x7eff('0x32')](_0x3c54b3,_0x7eff('0x2a'));_0x10066d[_0x7eff('0x33')]=_[_0x7eff('0x34')](_0x3085b8[_0x7eff('0x33')]);_0x10066d[_0x7eff('0x35')]=_[_0x7eff('0x36')](_0x10066d['model'],_0x10066d[_0x7eff('0x33')]);_0x2d5603[_0x7eff('0x37')]=_['intersection'](_0x10066d['model'],qs[_0x7eff('0x38')](_0x3085b8[_0x7eff('0x33')][_0x7eff('0x38')]));_0x2d5603[_0x7eff('0x37')]=_0x2d5603['attributes'][_0x7eff('0x39')]?_0x2d5603[_0x7eff('0x37')]:_0x10066d[_0x7eff('0x31')];if(!_0x3085b8[_0x7eff('0x33')][_0x7eff('0x3a')]('nolimit')){_0x2d5603['limit']=qs[_0x7eff('0x20')](_0x3085b8[_0x7eff('0x33')]['limit']);_0x2d5603[_0x7eff('0x1d')]=qs[_0x7eff('0x1d')](_0x3085b8[_0x7eff('0x33')]['offset']);}_0x2d5603['order']=qs[_0x7eff('0x3b')](_0x3085b8[_0x7eff('0x33')]['sort']);_0x2d5603['where']=qs[_0x7eff('0x35')](_['pick'](_0x3085b8[_0x7eff('0x33')],_0x10066d[_0x7eff('0x35')]),_0x3c54b3);if(_0x3085b8['query'][_0x7eff('0x3c')]){_0x2d5603[_0x7eff('0x3d')]=_[_0x7eff('0x3e')](_0x2d5603['where'],{'$or':_[_0x7eff('0x32')](_0x3c54b3,function(_0x3ddfed){if(_0x3ddfed[_0x7eff('0x2f')]!==_0x7eff('0x3f')){var _0x527a07={};_0x527a07[_0x3ddfed[_0x7eff('0x2a')]]={'$like':'%'+_0x3085b8['query'][_0x7eff('0x3c')]+'%'};return _0x527a07;}})});}_0x2d5603=_[_0x7eff('0x3e')]({},_0x2d5603,_0x3085b8['options']);var _0x4e6268={'where':_0x2d5603[_0x7eff('0x3d')]};return db[_0x7eff('0x40')][_0x7eff('0x1f')](_0x4e6268)[_0x7eff('0x26')](function(_0x3db13b){_0x173548['count']=_0x3db13b;if(_0x3085b8[_0x7eff('0x33')][_0x7eff('0x41')]){_0x2d5603[_0x7eff('0x42')]=[{'all':!![]}];}return db['SmsApplication'][_0x7eff('0x43')](_0x2d5603);})[_0x7eff('0x26')](function(_0x5b0a26){_0x173548['rows']=_0x5b0a26;return _0x173548;})['then'](respondWithFilteredResult(_0x4c7672,_0x2d5603))['catch'](handleError(_0x4c7672,null));};exports['show']=function(_0xf59b88,_0xfa37c9){var _0x6de01a={'raw':!![],'where':{'id':_0xf59b88['params']['id']}},_0x41d511={};_0x41d511['model']=_[_0x7eff('0x34')](db[_0x7eff('0x40')]['rawAttributes']);_0x41d511[_0x7eff('0x33')]=_[_0x7eff('0x34')](_0xf59b88[_0x7eff('0x33')]);_0x41d511['filters']=_[_0x7eff('0x36')](_0x41d511[_0x7eff('0x31')],_0x41d511[_0x7eff('0x33')]);_0x6de01a[_0x7eff('0x37')]=_[_0x7eff('0x36')](_0x41d511['model'],qs['fields'](_0xf59b88['query'][_0x7eff('0x38')]));_0x6de01a[_0x7eff('0x37')]=_0x6de01a['attributes'][_0x7eff('0x39')]?_0x6de01a['attributes']:_0x41d511['model'];if(_0xf59b88[_0x7eff('0x33')][_0x7eff('0x41')]){_0x6de01a['include']=[{'all':!![]}];}_0x6de01a=_[_0x7eff('0x3e')]({},_0x6de01a,_0xf59b88[_0x7eff('0x44')]);return db[_0x7eff('0x40')][_0x7eff('0x45')](_0x6de01a)[_0x7eff('0x26')](handleEntityNotFound(_0xfa37c9,null))[_0x7eff('0x26')](respondWithResult(_0xfa37c9,null))[_0x7eff('0x46')](handleError(_0xfa37c9,null));};exports['create']=function(_0xb57596,_0x389a55){return db[_0x7eff('0x40')][_0x7eff('0x47')](_0xb57596[_0x7eff('0x48')],{})[_0x7eff('0x26')](respondWithResult(_0x389a55,0xc9))[_0x7eff('0x46')](handleError(_0x389a55,null));};exports[_0x7eff('0x49')]=function(_0x1b4203,_0x1c6dca){if(_0x1b4203[_0x7eff('0x48')]['id']){delete _0x1b4203[_0x7eff('0x48')]['id'];}return db[_0x7eff('0x40')][_0x7eff('0x45')]({'where':{'id':_0x1b4203[_0x7eff('0x4a')]['id']}})[_0x7eff('0x26')](handleEntityNotFound(_0x1c6dca,null))[_0x7eff('0x26')](saveUpdates(_0x1b4203['body'],null))[_0x7eff('0x26')](respondWithResult(_0x1c6dca,null))[_0x7eff('0x46')](handleError(_0x1c6dca,null));};exports[_0x7eff('0x27')]=function(_0x49a4a8,_0x29ada5){return db[_0x7eff('0x40')]['find']({'where':{'id':_0x49a4a8['params']['id']}})['then'](handleEntityNotFound(_0x29ada5,null))[_0x7eff('0x26')](removeEntity(_0x29ada5,null))['catch'](handleError(_0x29ada5,null));};
\ No newline at end of file
+var _0x8a65=['fields','attributes','length','hasOwnProperty','nolimit','order','sort','where','filters','pick','filter','merge','VIRTUAL','include','findAll','rows','params','keys','includeAll','options','find','create','body','catch','update','destroy','eml-format','rimraf','fast-json-patch','request-promise','moment','mustache','util','path','to-csv','fs-extra','lodash','jsforce','desk.js','querystring','papaparse','ioredis','../../components/auth/service','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/license/hardware','api','../../config/utils','../../config/license/util','../../mysqldb','sendStatus','status','offset','undefined','count','limit','set','Content-Range','json','reject','save','then','end','error','stack','name','send','map','SmsApplication','rawAttributes','fieldName','type','model','query','intersection'];(function(_0x138adb,_0x193fee){var _0x1b27f2=function(_0x5e97a2){while(--_0x5e97a2){_0x138adb['push'](_0x138adb['shift']());}};_0x1b27f2(++_0x193fee);}(_0x8a65,0x1dc));var _0x58a6=function(_0x49dba5,_0x1086fd){_0x49dba5=_0x49dba5-0x0;var _0x495fc6=_0x8a65[_0x49dba5];return _0x495fc6;};'use strict';var emlformat=require(_0x58a6('0x0'));var rimraf=require(_0x58a6('0x1'));var zipdir=require('zip-dir');var jsonpatch=require(_0x58a6('0x2'));var rp=require(_0x58a6('0x3'));var moment=require(_0x58a6('0x4'));var BPromise=require('bluebird');var Mustache=require(_0x58a6('0x5'));var util=require(_0x58a6('0x6'));var path=require(_0x58a6('0x7'));var sox=require('sox');var csv=require(_0x58a6('0x8'));var ejs=require('ejs');var fs=require('fs');var fs_extra=require(_0x58a6('0x9'));var _=require(_0x58a6('0xa'));var squel=require('squel');var crypto=require('crypto');var jsforce=require(_0x58a6('0xb'));var deskjs=require(_0x58a6('0xc'));var toCsv=require(_0x58a6('0x8'));var querystring=require(_0x58a6('0xd'));var Papa=require(_0x58a6('0xe'));var Redis=require(_0x58a6('0xf'));var authService=require(_0x58a6('0x10'));var qs=require(_0x58a6('0x11'));var as=require(_0x58a6('0x12'));var hardwareService=require(_0x58a6('0x13'));var logger=require('../../config/logger')(_0x58a6('0x14'));var utils=require(_0x58a6('0x15'));var config=require('../../config/environment');var licenseUtil=require(_0x58a6('0x16'));var db=require(_0x58a6('0x17'))['db'];function respondWithStatusCode(_0x1d68ad,_0x2089b3){_0x2089b3=_0x2089b3||0xcc;return function(_0x3fadba){if(_0x3fadba){return _0x1d68ad[_0x58a6('0x18')](_0x2089b3);}return _0x1d68ad[_0x58a6('0x19')](_0x2089b3)['end']();};}function respondWithResult(_0x328ab0,_0x1664fa){_0x1664fa=_0x1664fa||0xc8;return function(_0x37f5a9){if(_0x37f5a9){return _0x328ab0[_0x58a6('0x19')](_0x1664fa)['json'](_0x37f5a9);}};}function respondWithFilteredResult(_0x495904,_0x1a4953){return function(_0x137698){if(_0x137698){var _0x2f9518=typeof _0x1a4953[_0x58a6('0x1a')]===_0x58a6('0x1b')&&typeof _0x1a4953['limit']===_0x58a6('0x1b');var _0x159ca3=_0x137698[_0x58a6('0x1c')];var _0x5515c3=_0x2f9518?0x0:_0x1a4953[_0x58a6('0x1a')];var _0x3dc5f3=_0x2f9518?_0x137698[_0x58a6('0x1c')]:_0x1a4953[_0x58a6('0x1a')]+_0x1a4953[_0x58a6('0x1d')];var _0x1c43c9;if(_0x3dc5f3>=_0x159ca3){_0x3dc5f3=_0x159ca3;_0x1c43c9=0xc8;}else{_0x1c43c9=0xce;}_0x495904['status'](_0x1c43c9);return _0x495904[_0x58a6('0x1e')](_0x58a6('0x1f'),_0x5515c3+'-'+_0x3dc5f3+'/'+_0x159ca3)[_0x58a6('0x20')](_0x137698);}return null;};}function patchUpdates(_0x44b8b1){return function(_0x38865d){try{jsonpatch['apply'](_0x38865d,_0x44b8b1,!![]);}catch(_0x283b8a){return BPromise[_0x58a6('0x21')](_0x283b8a);}return _0x38865d[_0x58a6('0x22')]();};}function saveUpdates(_0x5d37c0,_0x53b1f7){return function(_0x6b76d9){if(_0x6b76d9){return _0x6b76d9['update'](_0x5d37c0)[_0x58a6('0x23')](function(_0x21fd0a){return _0x21fd0a;});}return null;};}function removeEntity(_0x264d64,_0xa07407){return function(_0xf88b6c){if(_0xf88b6c){return _0xf88b6c['destroy']()[_0x58a6('0x23')](function(){_0x264d64['status'](0xcc)[_0x58a6('0x24')]();});}};}function handleEntityNotFound(_0x4cb5d1,_0x243c9d){return function(_0x2a7591){if(!_0x2a7591){_0x4cb5d1[_0x58a6('0x18')](0x194);}return _0x2a7591;};}function handleError(_0x420b14,_0x556319){_0x556319=_0x556319||0x1f4;return function(_0x3740bf){logger[_0x58a6('0x25')](_0x3740bf[_0x58a6('0x26')]);if(_0x3740bf['name']){delete _0x3740bf[_0x58a6('0x27')];}_0x420b14[_0x58a6('0x19')](_0x556319)[_0x58a6('0x28')](_0x3740bf);};}exports['index']=function(_0x560de3,_0x1db7bb){var _0x4f969f={},_0x312304={},_0x3f58e6={'count':0x0,'rows':[]};var _0x195e21=_[_0x58a6('0x29')](db[_0x58a6('0x2a')][_0x58a6('0x2b')],function(_0x433d57){return{'name':_0x433d57[_0x58a6('0x2c')],'type':_0x433d57[_0x58a6('0x2d')]['key']};});_0x312304[_0x58a6('0x2e')]=_[_0x58a6('0x29')](_0x195e21,_0x58a6('0x27'));_0x312304[_0x58a6('0x2f')]=_['keys'](_0x560de3['query']);_0x312304['filters']=_[_0x58a6('0x30')](_0x312304[_0x58a6('0x2e')],_0x312304[_0x58a6('0x2f')]);_0x4f969f['attributes']=_[_0x58a6('0x30')](_0x312304['model'],qs[_0x58a6('0x31')](_0x560de3[_0x58a6('0x2f')]['fields']));_0x4f969f[_0x58a6('0x32')]=_0x4f969f[_0x58a6('0x32')][_0x58a6('0x33')]?_0x4f969f[_0x58a6('0x32')]:_0x312304['model'];if(!_0x560de3[_0x58a6('0x2f')][_0x58a6('0x34')](_0x58a6('0x35'))){_0x4f969f[_0x58a6('0x1d')]=qs[_0x58a6('0x1d')](_0x560de3['query'][_0x58a6('0x1d')]);_0x4f969f[_0x58a6('0x1a')]=qs[_0x58a6('0x1a')](_0x560de3[_0x58a6('0x2f')][_0x58a6('0x1a')]);}_0x4f969f[_0x58a6('0x36')]=qs[_0x58a6('0x37')](_0x560de3[_0x58a6('0x2f')][_0x58a6('0x37')]);_0x4f969f[_0x58a6('0x38')]=qs[_0x58a6('0x39')](_[_0x58a6('0x3a')](_0x560de3['query'],_0x312304['filters']),_0x195e21);if(_0x560de3[_0x58a6('0x2f')][_0x58a6('0x3b')]){_0x4f969f[_0x58a6('0x38')]=_[_0x58a6('0x3c')](_0x4f969f[_0x58a6('0x38')],{'$or':_[_0x58a6('0x29')](_0x195e21,function(_0x17d923){if(_0x17d923['type']!==_0x58a6('0x3d')){var _0x521d46={};_0x521d46[_0x17d923[_0x58a6('0x27')]]={'$like':'%'+_0x560de3[_0x58a6('0x2f')][_0x58a6('0x3b')]+'%'};return _0x521d46;}})});}_0x4f969f=_[_0x58a6('0x3c')]({},_0x4f969f,_0x560de3['options']);var _0x5d8b9d={'where':_0x4f969f[_0x58a6('0x38')]};return db[_0x58a6('0x2a')]['count'](_0x5d8b9d)[_0x58a6('0x23')](function(_0x4772f4){_0x3f58e6[_0x58a6('0x1c')]=_0x4772f4;if(_0x560de3[_0x58a6('0x2f')]['includeAll']){_0x4f969f[_0x58a6('0x3e')]=[{'all':!![]}];}return db[_0x58a6('0x2a')][_0x58a6('0x3f')](_0x4f969f);})[_0x58a6('0x23')](function(_0x5d8300){_0x3f58e6[_0x58a6('0x40')]=_0x5d8300;return _0x3f58e6;})[_0x58a6('0x23')](respondWithFilteredResult(_0x1db7bb,_0x4f969f))['catch'](handleError(_0x1db7bb,null));};exports['show']=function(_0x1bd0ac,_0xa837e0){var _0x483fe7={'raw':!![],'where':{'id':_0x1bd0ac[_0x58a6('0x41')]['id']}},_0x411555={};_0x411555[_0x58a6('0x2e')]=_[_0x58a6('0x42')](db[_0x58a6('0x2a')][_0x58a6('0x2b')]);_0x411555[_0x58a6('0x2f')]=_[_0x58a6('0x42')](_0x1bd0ac['query']);_0x411555[_0x58a6('0x39')]=_[_0x58a6('0x30')](_0x411555[_0x58a6('0x2e')],_0x411555[_0x58a6('0x2f')]);_0x483fe7[_0x58a6('0x32')]=_[_0x58a6('0x30')](_0x411555['model'],qs[_0x58a6('0x31')](_0x1bd0ac['query'][_0x58a6('0x31')]));_0x483fe7['attributes']=_0x483fe7[_0x58a6('0x32')][_0x58a6('0x33')]?_0x483fe7['attributes']:_0x411555[_0x58a6('0x2e')];if(_0x1bd0ac[_0x58a6('0x2f')][_0x58a6('0x43')]){_0x483fe7[_0x58a6('0x3e')]=[{'all':!![]}];}_0x483fe7=_[_0x58a6('0x3c')]({},_0x483fe7,_0x1bd0ac[_0x58a6('0x44')]);return db[_0x58a6('0x2a')][_0x58a6('0x45')](_0x483fe7)[_0x58a6('0x23')](handleEntityNotFound(_0xa837e0,null))['then'](respondWithResult(_0xa837e0,null))['catch'](handleError(_0xa837e0,null));};exports[_0x58a6('0x46')]=function(_0x3deca6,_0x45bcba){return db[_0x58a6('0x2a')][_0x58a6('0x46')](_0x3deca6[_0x58a6('0x47')],{})[_0x58a6('0x23')](respondWithResult(_0x45bcba,0xc9))[_0x58a6('0x48')](handleError(_0x45bcba,null));};exports[_0x58a6('0x49')]=function(_0x5504f0,_0x3d54b9){if(_0x5504f0['body']['id']){delete _0x5504f0[_0x58a6('0x47')]['id'];}return db[_0x58a6('0x2a')][_0x58a6('0x45')]({'where':{'id':_0x5504f0[_0x58a6('0x41')]['id']}})[_0x58a6('0x23')](handleEntityNotFound(_0x3d54b9,null))[_0x58a6('0x23')](saveUpdates(_0x5504f0['body'],null))[_0x58a6('0x23')](respondWithResult(_0x3d54b9,null))['catch'](handleError(_0x3d54b9,null));};exports[_0x58a6('0x4a')]=function(_0x25f6b2,_0x42dbb6){return db[_0x58a6('0x2a')][_0x58a6('0x45')]({'where':{'id':_0x25f6b2[_0x58a6('0x41')]['id']}})[_0x58a6('0x23')](handleEntityNotFound(_0x42dbb6,null))['then'](removeEntity(_0x42dbb6,null))[_0x58a6('0x48')](handleError(_0x42dbb6,null));};
\ No newline at end of file