Built motion from commit (unavailable).|2.5.26
[motion2.git] / server / api / voiceCallReport / voiceCallReport.controller.js
index d004760..960bbcc 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0xf836=['html-pdf','rimraf','zip-dir','fast-json-patch','moment','bluebird','mustache','util','path','sox','to-csv','lodash','squel','desk.js','querystring','ioredis','../../components/auth/service','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/logger','api','../../config/environment','status','json','count','offset','limit','apply','reject','save','update','then','error','stack','name','index','VoiceCallReport','rawAttributes','type','key','map','keys','query','filters','intersection','model','attributes','fields','nolimit','order','sort','where','pick','filter','merge','VIRTUAL','options','include','fullname','alias','User','findAll','rows','catch','show','params','length','includeAll','find','create','body','destroy','describe','uniqueid'];(function(_0x5efbf7,_0x80a72e){var _0x23a839=function(_0x1a59dc){while(--_0x1a59dc){_0x5efbf7['push'](_0x5efbf7['shift']());}};_0x23a839(++_0x80a72e);}(_0xf836,0x172));var _0x6f83=function(_0x20a584,_0xe384a5){_0x20a584=_0x20a584-0x0;var _0x4b41a8=_0xf836[_0x20a584];return _0x4b41a8;};'use strict';var pdf=require(_0x6f83('0x0'));var emlformat=require('eml-format');var rimraf=require(_0x6f83('0x1'));var zipdir=require(_0x6f83('0x2'));var jsonpatch=require(_0x6f83('0x3'));var rp=require('request-promise');var moment=require(_0x6f83('0x4'));var BPromise=require(_0x6f83('0x5'));var Mustache=require(_0x6f83('0x6'));var util=require(_0x6f83('0x7'));var path=require(_0x6f83('0x8'));var sox=require(_0x6f83('0x9'));var csv=require(_0x6f83('0xa'));var ejs=require('ejs');var fs=require('fs');var _=require(_0x6f83('0xb'));var squel=require(_0x6f83('0xc'));var crypto=require('crypto');var jsforce=require('jsforce');var deskjs=require(_0x6f83('0xd'));var toCsv=require(_0x6f83('0xa'));var querystring=require(_0x6f83('0xe'));var Papa=require('papaparse');var Redis=require(_0x6f83('0xf'));var authService=require(_0x6f83('0x10'));var qs=require(_0x6f83('0x11'));var as=require(_0x6f83('0x12'));var hardwareService=require('../../config/license/hardware');var logger=require(_0x6f83('0x13'))(_0x6f83('0x14'));var utils=require('../../config/utils');var config=require(_0x6f83('0x15'));var licenseUtil=require('../../config/license/util');var db=require('../../mysqldb')['db'];function respondWithStatusCode(_0x10ab48,_0x1ccf22){_0x1ccf22=_0x1ccf22||0xcc;return function(_0x5e3387){if(_0x5e3387){return _0x10ab48['sendStatus'](_0x1ccf22);}return _0x10ab48[_0x6f83('0x16')](_0x1ccf22)['end']();};}function respondWithResult(_0x463129,_0x532c1a){_0x532c1a=_0x532c1a||0xc8;return function(_0xb9713){if(_0xb9713){return _0x463129[_0x6f83('0x16')](_0x532c1a)[_0x6f83('0x17')](_0xb9713);}};}function respondWithFilteredResult(_0x10f206,_0x1a6315){return function(_0x3cb49e){if(_0x3cb49e){var _0x417c0d=_0x3cb49e[_0x6f83('0x18')],_0x14e2fc=_0x1a6315[_0x6f83('0x19')],_0x171055=_0x1a6315[_0x6f83('0x19')]+_0x1a6315[_0x6f83('0x1a')],_0x378e4a;if(_0x171055>=_0x417c0d){_0x171055=_0x417c0d;_0x378e4a=0xc8;}else{_0x378e4a=0xce;}_0x10f206[_0x6f83('0x16')](_0x378e4a);return _0x10f206['set']('Content-Range',_0x14e2fc+'-'+_0x171055+'/'+_0x417c0d)[_0x6f83('0x17')](_0x3cb49e);}return null;};}function patchUpdates(_0x58556b){return function(_0x17ea12){try{jsonpatch[_0x6f83('0x1b')](_0x17ea12,_0x58556b,!![]);}catch(_0x484371){return BPromise[_0x6f83('0x1c')](_0x484371);}return _0x17ea12[_0x6f83('0x1d')]();};}function saveUpdates(_0x28f7be,_0x840bd4){return function(_0x57c6ae){if(_0x57c6ae){return _0x57c6ae[_0x6f83('0x1e')](_0x28f7be)[_0x6f83('0x1f')](function(_0x547865){return _0x547865;});}return null;};}function removeEntity(_0x3ff8d2,_0xb1b384){return function(_0x35d5ee){if(_0x35d5ee){return _0x35d5ee['destroy']()['then'](function(){_0x3ff8d2[_0x6f83('0x16')](0xcc)['end']();});}};}function handleEntityNotFound(_0x4d00aa,_0x471451){return function(_0x54a5d8){if(!_0x54a5d8){_0x4d00aa['sendStatus'](0x194);}return _0x54a5d8;};}function handleError(_0x32141b,_0x26e9b3){_0x26e9b3=_0x26e9b3||0x1f4;return function(_0x48df9e){logger[_0x6f83('0x20')](_0x48df9e[_0x6f83('0x21')]);if(_0x48df9e[_0x6f83('0x22')]){delete _0x48df9e[_0x6f83('0x22')];}_0x32141b[_0x6f83('0x16')](_0x26e9b3)['send'](_0x48df9e);};}exports[_0x6f83('0x23')]=function(_0x287db2,_0x4a925a){var _0x450344={},_0x3215ce={},_0x270923={'count':0x0,'rows':[]};var _0x5ecdad=_['map'](db[_0x6f83('0x24')][_0x6f83('0x25')],function(_0x242bdc){return{'name':_0x242bdc['fieldName'],'type':_0x242bdc[_0x6f83('0x26')][_0x6f83('0x27')]};});_0x3215ce['model']=_[_0x6f83('0x28')](_0x5ecdad,'name');_0x3215ce['query']=_[_0x6f83('0x29')](_0x287db2[_0x6f83('0x2a')]);_0x3215ce[_0x6f83('0x2b')]=_[_0x6f83('0x2c')](_0x3215ce[_0x6f83('0x2d')],_0x3215ce[_0x6f83('0x2a')]);_0x450344[_0x6f83('0x2e')]=_[_0x6f83('0x2c')](_0x3215ce[_0x6f83('0x2d')],qs[_0x6f83('0x2f')](_0x287db2['query']['fields']));_0x450344[_0x6f83('0x2e')]=_0x450344[_0x6f83('0x2e')]['length']?_0x450344['attributes']:_0x3215ce[_0x6f83('0x2d')];if(!_0x287db2[_0x6f83('0x2a')]['hasOwnProperty'](_0x6f83('0x30'))){_0x450344['limit']=qs[_0x6f83('0x1a')](_0x287db2['query']['limit']);_0x450344[_0x6f83('0x19')]=qs[_0x6f83('0x19')](_0x287db2['query']['offset']);}_0x450344[_0x6f83('0x31')]=qs[_0x6f83('0x32')](_0x287db2['query'][_0x6f83('0x32')]);_0x450344[_0x6f83('0x33')]=qs[_0x6f83('0x2b')](_[_0x6f83('0x34')](_0x287db2['query'],_0x3215ce[_0x6f83('0x2b')]),_0x5ecdad);if(_0x287db2[_0x6f83('0x2a')][_0x6f83('0x35')]){_0x450344[_0x6f83('0x33')]=_[_0x6f83('0x36')](_0x450344['where'],{'$or':_[_0x6f83('0x28')](_0x5ecdad,function(_0x2b7c81){if(_0x2b7c81[_0x6f83('0x26')]!==_0x6f83('0x37')){var _0x19f32d={};_0x19f32d[_0x2b7c81['name']]={'$like':'%'+_0x287db2[_0x6f83('0x2a')]['filter']+'%'};return _0x19f32d;}})});}_0x450344=_['merge']({},_0x450344,_0x287db2[_0x6f83('0x38')]);var _0x18b58b={'where':_0x450344[_0x6f83('0x33')]};return db[_0x6f83('0x24')]['count'](_0x18b58b)[_0x6f83('0x1f')](function(_0xe46e0e){_0x270923[_0x6f83('0x18')]=_0xe46e0e;if(_0x287db2[_0x6f83('0x2a')]['includeAll']){_0x450344[_0x6f83('0x39')]=[{'attributes':['id',_0x6f83('0x22'),_0x6f83('0x3a'),_0x6f83('0x3b')],'model':db[_0x6f83('0x3c')],'as':_0x6f83('0x3c')}];}return db['VoiceCallReport'][_0x6f83('0x3d')](_0x450344);})[_0x6f83('0x1f')](function(_0x514ab3){_0x270923[_0x6f83('0x3e')]=_0x514ab3;return _0x270923;})[_0x6f83('0x1f')](respondWithFilteredResult(_0x4a925a,_0x450344))[_0x6f83('0x3f')](handleError(_0x4a925a,null));};exports[_0x6f83('0x40')]=function(_0x9c3c6e,_0x565d7b){var _0x971509={'raw':!![],'where':{'id':_0x9c3c6e[_0x6f83('0x41')]['id']}},_0x9d6308={};_0x9d6308[_0x6f83('0x2d')]=_['keys'](db[_0x6f83('0x24')][_0x6f83('0x25')]);_0x9d6308[_0x6f83('0x2a')]=_['keys'](_0x9c3c6e[_0x6f83('0x2a')]);_0x9d6308[_0x6f83('0x2b')]=_[_0x6f83('0x2c')](_0x9d6308[_0x6f83('0x2d')],_0x9d6308[_0x6f83('0x2a')]);_0x971509[_0x6f83('0x2e')]=_[_0x6f83('0x2c')](_0x9d6308[_0x6f83('0x2d')],qs[_0x6f83('0x2f')](_0x9c3c6e[_0x6f83('0x2a')][_0x6f83('0x2f')]));_0x971509[_0x6f83('0x2e')]=_0x971509['attributes'][_0x6f83('0x42')]?_0x971509[_0x6f83('0x2e')]:_0x9d6308[_0x6f83('0x2d')];if(_0x9c3c6e['query'][_0x6f83('0x43')]){_0x971509[_0x6f83('0x39')]=[{'all':!![]}];}_0x971509=_[_0x6f83('0x36')]({},_0x971509,_0x9c3c6e[_0x6f83('0x38')]);return db[_0x6f83('0x24')][_0x6f83('0x44')](_0x971509)[_0x6f83('0x1f')](handleEntityNotFound(_0x565d7b,null))['then'](respondWithResult(_0x565d7b,null))['catch'](handleError(_0x565d7b,null));};exports[_0x6f83('0x45')]=function(_0x4731ba,_0x5ca7f5){return db[_0x6f83('0x24')][_0x6f83('0x45')](_0x4731ba[_0x6f83('0x46')],{})[_0x6f83('0x1f')](respondWithResult(_0x5ca7f5,0xc9))['catch'](handleError(_0x5ca7f5,null));};exports[_0x6f83('0x47')]=function(_0xcb2c7a,_0x522681){return db[_0x6f83('0x24')][_0x6f83('0x44')]({'where':{'id':_0xcb2c7a[_0x6f83('0x41')]['id']}})[_0x6f83('0x1f')](handleEntityNotFound(_0x522681,null))['then'](removeEntity(_0x522681,null))[_0x6f83('0x3f')](handleError(_0x522681,null));};exports['describe']=function(_0x45eaac,_0x3bcb7c){return db[_0x6f83('0x24')][_0x6f83('0x48')]()[_0x6f83('0x1f')](respondWithResult(_0x3bcb7c,null))['catch'](handleError(_0x3bcb7c,null));};exports['update']=function(_0x54eb80,_0x378ab5){if(_0x54eb80[_0x6f83('0x46')]['uniqueid']){delete _0x54eb80[_0x6f83('0x46')][_0x6f83('0x49')];}return db[_0x6f83('0x24')][_0x6f83('0x44')]({'where':{'uniqueid':_0x54eb80['params']['id'],'UserId':{'$or':[null,_0x54eb80['user']['id']]}}})[_0x6f83('0x1f')](handleEntityNotFound(_0x378ab5,null))['then'](saveUpdates(_0x54eb80[_0x6f83('0x46')],null))[_0x6f83('0x1f')](respondWithResult(_0x378ab5,null))[_0x6f83('0x3f')](handleError(_0x378ab5,null));};
\ No newline at end of file
+var _0x2700=['sox','to-csv','lodash','squel','crypto','jsforce','querystring','../../components/parsers/advancedSearch','../../config/license/hardware','../../config/logger','api','../../config/utils','../../config/environment','../../mysqldb','sendStatus','status','json','count','limit','set','Content-Range','apply','reject','save','update','then','destroy','end','error','stack','name','send','index','map','VoiceCallReport','rawAttributes','fieldName','type','model','query','keys','filters','intersection','fields','attributes','hasOwnProperty','offset','sort','where','pick','filter','VIRTUAL','options','includeAll','include','User','findAll','rows','catch','params','length','merge','find','create','body','describe','uniqueid','user','rimraf','zip-dir','fast-json-patch','bluebird','mustache','util'];(function(_0x5d1978,_0x1c6811){var _0x1c60e1=function(_0x11fcbb){while(--_0x11fcbb){_0x5d1978['push'](_0x5d1978['shift']());}};_0x1c60e1(++_0x1c6811);}(_0x2700,0x8e));var _0x0270=function(_0x386842,_0x4cc77e){_0x386842=_0x386842-0x0;var _0x3bd4a7=_0x2700[_0x386842];return _0x3bd4a7;};'use strict';var emlformat=require('eml-format');var rimraf=require(_0x0270('0x0'));var zipdir=require(_0x0270('0x1'));var jsonpatch=require(_0x0270('0x2'));var rp=require('request-promise');var moment=require('moment');var BPromise=require(_0x0270('0x3'));var Mustache=require(_0x0270('0x4'));var util=require(_0x0270('0x5'));var path=require('path');var sox=require(_0x0270('0x6'));var csv=require(_0x0270('0x7'));var ejs=require('ejs');var fs=require('fs');var fs_extra=require('fs-extra');var _=require(_0x0270('0x8'));var squel=require(_0x0270('0x9'));var crypto=require(_0x0270('0xa'));var jsforce=require(_0x0270('0xb'));var deskjs=require('desk.js');var toCsv=require(_0x0270('0x7'));var querystring=require(_0x0270('0xc'));var Papa=require('papaparse');var Redis=require('ioredis');var authService=require('../../components/auth/service');var qs=require('../../components/parsers/qs');var as=require(_0x0270('0xd'));var hardwareService=require(_0x0270('0xe'));var logger=require(_0x0270('0xf'))(_0x0270('0x10'));var utils=require(_0x0270('0x11'));var config=require(_0x0270('0x12'));var licenseUtil=require('../../config/license/util');var db=require(_0x0270('0x13'))['db'];function respondWithStatusCode(_0x5200f8,_0x3a02c9){_0x3a02c9=_0x3a02c9||0xcc;return function(_0x36e700){if(_0x36e700){return _0x5200f8[_0x0270('0x14')](_0x3a02c9);}return _0x5200f8[_0x0270('0x15')](_0x3a02c9)['end']();};}function respondWithResult(_0x516d73,_0x270bd3){_0x270bd3=_0x270bd3||0xc8;return function(_0x1534a9){if(_0x1534a9){return _0x516d73['status'](_0x270bd3)[_0x0270('0x16')](_0x1534a9);}};}function respondWithFilteredResult(_0x5331eb,_0x353262){return function(_0x853a9f){if(_0x853a9f){var _0x3c5214=_0x853a9f[_0x0270('0x17')],_0x3c24ad=_0x353262['offset'],_0x3d00b0=_0x353262['offset']+_0x353262[_0x0270('0x18')],_0x4e7a86;if(_0x3d00b0>=_0x3c5214){_0x3d00b0=_0x3c5214;_0x4e7a86=0xc8;}else{_0x4e7a86=0xce;}_0x5331eb['status'](_0x4e7a86);return _0x5331eb[_0x0270('0x19')](_0x0270('0x1a'),_0x3c24ad+'-'+_0x3d00b0+'/'+_0x3c5214)[_0x0270('0x16')](_0x853a9f);}return null;};}function patchUpdates(_0x321351){return function(_0x251416){try{jsonpatch[_0x0270('0x1b')](_0x251416,_0x321351,!![]);}catch(_0x127f44){return BPromise[_0x0270('0x1c')](_0x127f44);}return _0x251416[_0x0270('0x1d')]();};}function saveUpdates(_0x984423,_0x5142a0){return function(_0x25ce50){if(_0x25ce50){return _0x25ce50[_0x0270('0x1e')](_0x984423)[_0x0270('0x1f')](function(_0x13166d){return _0x13166d;});}return null;};}function removeEntity(_0x5bb65f,_0x1e3c9d){return function(_0x8e39d2){if(_0x8e39d2){return _0x8e39d2[_0x0270('0x20')]()[_0x0270('0x1f')](function(){_0x5bb65f[_0x0270('0x15')](0xcc)[_0x0270('0x21')]();});}};}function handleEntityNotFound(_0x40582b,_0x3ed903){return function(_0x48ba76){if(!_0x48ba76){_0x40582b[_0x0270('0x14')](0x194);}return _0x48ba76;};}function handleError(_0xec8ec1,_0x956547){_0x956547=_0x956547||0x1f4;return function(_0x336996){logger[_0x0270('0x22')](_0x336996[_0x0270('0x23')]);if(_0x336996[_0x0270('0x24')]){delete _0x336996[_0x0270('0x24')];}_0xec8ec1[_0x0270('0x15')](_0x956547)[_0x0270('0x25')](_0x336996);};}exports[_0x0270('0x26')]=function(_0x2b855e,_0x48da45){var _0x493145={},_0x49e30b={},_0x581f66={'count':0x0,'rows':[]};var _0x51861e=_[_0x0270('0x27')](db[_0x0270('0x28')][_0x0270('0x29')],function(_0x2c3a8e){return{'name':_0x2c3a8e[_0x0270('0x2a')],'type':_0x2c3a8e[_0x0270('0x2b')]['key']};});_0x49e30b[_0x0270('0x2c')]=_[_0x0270('0x27')](_0x51861e,_0x0270('0x24'));_0x49e30b[_0x0270('0x2d')]=_[_0x0270('0x2e')](_0x2b855e[_0x0270('0x2d')]);_0x49e30b[_0x0270('0x2f')]=_[_0x0270('0x30')](_0x49e30b[_0x0270('0x2c')],_0x49e30b['query']);_0x493145['attributes']=_[_0x0270('0x30')](_0x49e30b['model'],qs['fields'](_0x2b855e[_0x0270('0x2d')][_0x0270('0x31')]));_0x493145['attributes']=_0x493145[_0x0270('0x32')]['length']?_0x493145[_0x0270('0x32')]:_0x49e30b[_0x0270('0x2c')];if(!_0x2b855e[_0x0270('0x2d')][_0x0270('0x33')]('nolimit')){_0x493145[_0x0270('0x18')]=qs[_0x0270('0x18')](_0x2b855e[_0x0270('0x2d')]['limit']);_0x493145[_0x0270('0x34')]=qs[_0x0270('0x34')](_0x2b855e['query'][_0x0270('0x34')]);}_0x493145['order']=qs[_0x0270('0x35')](_0x2b855e[_0x0270('0x2d')][_0x0270('0x35')]);_0x493145[_0x0270('0x36')]=qs[_0x0270('0x2f')](_[_0x0270('0x37')](_0x2b855e[_0x0270('0x2d')],_0x49e30b[_0x0270('0x2f')]),_0x51861e);if(_0x2b855e[_0x0270('0x2d')][_0x0270('0x38')]){_0x493145['where']=_['merge'](_0x493145[_0x0270('0x36')],{'$or':_[_0x0270('0x27')](_0x51861e,function(_0x3a8b93){if(_0x3a8b93[_0x0270('0x2b')]!==_0x0270('0x39')){var _0x2bca6b={};_0x2bca6b[_0x3a8b93[_0x0270('0x24')]]={'$like':'%'+_0x2b855e[_0x0270('0x2d')][_0x0270('0x38')]+'%'};return _0x2bca6b;}})});}_0x493145=_['merge']({},_0x493145,_0x2b855e[_0x0270('0x3a')]);var _0x319c4c={'where':_0x493145[_0x0270('0x36')]};return db['VoiceCallReport'][_0x0270('0x17')](_0x319c4c)['then'](function(_0x4d36de){_0x581f66['count']=_0x4d36de;if(_0x2b855e[_0x0270('0x2d')][_0x0270('0x3b')]){_0x493145[_0x0270('0x3c')]=[{'attributes':['id',_0x0270('0x24'),'fullname','alias'],'model':db[_0x0270('0x3d')],'as':_0x0270('0x3d')}];}return db[_0x0270('0x28')][_0x0270('0x3e')](_0x493145);})[_0x0270('0x1f')](function(_0x48ae19){_0x581f66[_0x0270('0x3f')]=_0x48ae19;return _0x581f66;})[_0x0270('0x1f')](respondWithFilteredResult(_0x48da45,_0x493145))[_0x0270('0x40')](handleError(_0x48da45,null));};exports['show']=function(_0x451d88,_0x582d82){var _0x9d9275={'raw':!![],'where':{'id':_0x451d88[_0x0270('0x41')]['id']}},_0x14028a={};_0x14028a[_0x0270('0x2c')]=_[_0x0270('0x2e')](db['VoiceCallReport'][_0x0270('0x29')]);_0x14028a[_0x0270('0x2d')]=_[_0x0270('0x2e')](_0x451d88['query']);_0x14028a[_0x0270('0x2f')]=_['intersection'](_0x14028a['model'],_0x14028a[_0x0270('0x2d')]);_0x9d9275['attributes']=_[_0x0270('0x30')](_0x14028a[_0x0270('0x2c')],qs[_0x0270('0x31')](_0x451d88['query'][_0x0270('0x31')]));_0x9d9275['attributes']=_0x9d9275[_0x0270('0x32')][_0x0270('0x42')]?_0x9d9275[_0x0270('0x32')]:_0x14028a[_0x0270('0x2c')];if(_0x451d88[_0x0270('0x2d')][_0x0270('0x3b')]){_0x9d9275[_0x0270('0x3c')]=[{'all':!![]}];}_0x9d9275=_[_0x0270('0x43')]({},_0x9d9275,_0x451d88[_0x0270('0x3a')]);return db[_0x0270('0x28')][_0x0270('0x44')](_0x9d9275)[_0x0270('0x1f')](handleEntityNotFound(_0x582d82,null))[_0x0270('0x1f')](respondWithResult(_0x582d82,null))['catch'](handleError(_0x582d82,null));};exports['create']=function(_0x477bc9,_0x4f3322){return db[_0x0270('0x28')][_0x0270('0x45')](_0x477bc9[_0x0270('0x46')],{})[_0x0270('0x1f')](respondWithResult(_0x4f3322,0xc9))['catch'](handleError(_0x4f3322,null));};exports['destroy']=function(_0x5a4b28,_0x1c3d92){return db[_0x0270('0x28')][_0x0270('0x44')]({'where':{'id':_0x5a4b28[_0x0270('0x41')]['id']}})[_0x0270('0x1f')](handleEntityNotFound(_0x1c3d92,null))[_0x0270('0x1f')](removeEntity(_0x1c3d92,null))[_0x0270('0x40')](handleError(_0x1c3d92,null));};exports[_0x0270('0x47')]=function(_0x4030a4,_0xe15042){return db[_0x0270('0x28')][_0x0270('0x47')]()['then'](respondWithResult(_0xe15042,null))['catch'](handleError(_0xe15042,null));};exports['update']=function(_0x6da6f4,_0x599ec0){if(_0x6da6f4[_0x0270('0x46')][_0x0270('0x48')]){delete _0x6da6f4[_0x0270('0x46')][_0x0270('0x48')];}return db['VoiceCallReport']['find']({'where':{'uniqueid':_0x6da6f4[_0x0270('0x41')]['id'],'UserId':{'$or':[null,_0x6da6f4[_0x0270('0x49')]['id']]}}})[_0x0270('0x1f')](handleEntityNotFound(_0x599ec0,null))[_0x0270('0x1f')](saveUpdates(_0x6da6f4[_0x0270('0x46')],null))[_0x0270('0x1f')](respondWithResult(_0x599ec0,null))[_0x0270('0x40')](handleError(_0x599ec0,null));};
\ No newline at end of file