Built motion from commit (unavailable).|2.5.19
[motion2.git] / server / api / cmHopperBlack / cmHopperBlack.controller.js
index 834a081..7a42369 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0xa734=['sox','to-csv','squel','crypto','jsforce','desk.js','papaparse','ioredis','../../components/auth/service','../../components/parsers/advancedSearch','../../config/logger','../../config/utils','../../config/license/util','../../mysqldb','status','end','json','count','offset','set','apply','reject','save','update','destroy','then','error','name','send','map','CmHopperBlack','rawAttributes','fieldName','type','key','model','query','keys','filters','intersection','fields','attributes','hasOwnProperty','nolimit','limit','order','sort','where','pick','filter','merge','VIRTUAL','options','includeAll','include','findAll','rows','catch','params','length','find','body','describe','eml-format','zip-dir','request-promise','moment','bluebird','mustache','path'];(function(_0x15bc81,_0x4d4f77){var _0x59440e=function(_0x1b60f2){while(--_0x1b60f2){_0x15bc81['push'](_0x15bc81['shift']());}};_0x59440e(++_0x4d4f77);}(_0xa734,0xcb));var _0x4a73=function(_0x31b9a3,_0x5f1937){_0x31b9a3=_0x31b9a3-0x0;var _0x15c127=_0xa734[_0x31b9a3];return _0x15c127;};'use strict';var pdf=require('html-pdf');var emlformat=require(_0x4a73('0x0'));var rimraf=require('rimraf');var zipdir=require(_0x4a73('0x1'));var jsonpatch=require('fast-json-patch');var rp=require(_0x4a73('0x2'));var moment=require(_0x4a73('0x3'));var BPromise=require(_0x4a73('0x4'));var Mustache=require(_0x4a73('0x5'));var util=require('util');var path=require(_0x4a73('0x6'));var sox=require(_0x4a73('0x7'));var csv=require(_0x4a73('0x8'));var ejs=require('ejs');var fs=require('fs');var _=require('lodash');var squel=require(_0x4a73('0x9'));var crypto=require(_0x4a73('0xa'));var jsforce=require(_0x4a73('0xb'));var deskjs=require(_0x4a73('0xc'));var toCsv=require(_0x4a73('0x8'));var querystring=require('querystring');var Papa=require(_0x4a73('0xd'));var Redis=require(_0x4a73('0xe'));var authService=require(_0x4a73('0xf'));var qs=require('../../components/parsers/qs');var as=require(_0x4a73('0x10'));var hardwareService=require('../../config/license/hardware');var logger=require(_0x4a73('0x11'))('api');var utils=require(_0x4a73('0x12'));var config=require('../../config/environment');var licenseUtil=require(_0x4a73('0x13'));var db=require(_0x4a73('0x14'))['db'];function respondWithStatusCode(_0x9875bc,_0x56f816){_0x56f816=_0x56f816||0xcc;return function(_0x1650df){if(_0x1650df){return _0x9875bc['sendStatus'](_0x56f816);}return _0x9875bc[_0x4a73('0x15')](_0x56f816)[_0x4a73('0x16')]();};}function respondWithResult(_0x28cc7a,_0x3d101d){_0x3d101d=_0x3d101d||0xc8;return function(_0x10cf5e){if(_0x10cf5e){return _0x28cc7a[_0x4a73('0x15')](_0x3d101d)[_0x4a73('0x17')](_0x10cf5e);}};}function respondWithFilteredResult(_0x544e0c,_0x7a1592){return function(_0x5ef9b3){if(_0x5ef9b3){var _0x400562=_0x5ef9b3[_0x4a73('0x18')],_0x5ce441=_0x7a1592[_0x4a73('0x19')],_0x1622c1=_0x7a1592[_0x4a73('0x19')]+_0x7a1592['limit'],_0x4cb4b8;if(_0x1622c1>=_0x400562){_0x1622c1=_0x400562;_0x4cb4b8=0xc8;}else{_0x4cb4b8=0xce;}_0x544e0c[_0x4a73('0x15')](_0x4cb4b8);return _0x544e0c[_0x4a73('0x1a')]('Content-Range',_0x5ce441+'-'+_0x1622c1+'/'+_0x400562)['json'](_0x5ef9b3);}return null;};}function patchUpdates(_0x467f70){return function(_0x35ce16){try{jsonpatch[_0x4a73('0x1b')](_0x35ce16,_0x467f70,!![]);}catch(_0x35752c){return BPromise[_0x4a73('0x1c')](_0x35752c);}return _0x35ce16[_0x4a73('0x1d')]();};}function saveUpdates(_0x327bda,_0x55f92d){return function(_0xe3a055){if(_0xe3a055){return _0xe3a055[_0x4a73('0x1e')](_0x327bda)['then'](function(_0x434769){return _0x434769;});}return null;};}function removeEntity(_0x3020b6,_0x4c5ff1){return function(_0x24dbca){if(_0x24dbca){return _0x24dbca[_0x4a73('0x1f')]()[_0x4a73('0x20')](function(){_0x3020b6[_0x4a73('0x15')](0xcc)[_0x4a73('0x16')]();});}};}function handleEntityNotFound(_0x5db442,_0x5f38d0){return function(_0x438001){if(!_0x438001){_0x5db442['sendStatus'](0x194);}return _0x438001;};}function handleError(_0x138d5a,_0x449c91){_0x449c91=_0x449c91||0x1f4;return function(_0x44d6a5){logger[_0x4a73('0x21')](_0x44d6a5['stack']);if(_0x44d6a5[_0x4a73('0x22')]){delete _0x44d6a5[_0x4a73('0x22')];}_0x138d5a[_0x4a73('0x15')](_0x449c91)[_0x4a73('0x23')](_0x44d6a5);};}exports['index']=function(_0x3376fa,_0x27e0de){var _0x1676c0={},_0x5bba2d={},_0x1ab048={'count':0x0,'rows':[]};var _0x593255=_[_0x4a73('0x24')](db[_0x4a73('0x25')][_0x4a73('0x26')],function(_0x1ca713){return{'name':_0x1ca713[_0x4a73('0x27')],'type':_0x1ca713[_0x4a73('0x28')][_0x4a73('0x29')]};});_0x5bba2d[_0x4a73('0x2a')]=_['map'](_0x593255,_0x4a73('0x22'));_0x5bba2d[_0x4a73('0x2b')]=_[_0x4a73('0x2c')](_0x3376fa['query']);_0x5bba2d[_0x4a73('0x2d')]=_[_0x4a73('0x2e')](_0x5bba2d[_0x4a73('0x2a')],_0x5bba2d[_0x4a73('0x2b')]);_0x1676c0['attributes']=_['intersection'](_0x5bba2d[_0x4a73('0x2a')],qs[_0x4a73('0x2f')](_0x3376fa[_0x4a73('0x2b')][_0x4a73('0x2f')]));_0x1676c0[_0x4a73('0x30')]=_0x1676c0[_0x4a73('0x30')]['length']?_0x1676c0[_0x4a73('0x30')]:_0x5bba2d[_0x4a73('0x2a')];if(!_0x3376fa[_0x4a73('0x2b')][_0x4a73('0x31')](_0x4a73('0x32'))){_0x1676c0[_0x4a73('0x33')]=qs['limit'](_0x3376fa[_0x4a73('0x2b')][_0x4a73('0x33')]);_0x1676c0[_0x4a73('0x19')]=qs['offset'](_0x3376fa['query'][_0x4a73('0x19')]);}_0x1676c0[_0x4a73('0x34')]=qs['sort'](_0x3376fa[_0x4a73('0x2b')][_0x4a73('0x35')]);_0x1676c0[_0x4a73('0x36')]=qs[_0x4a73('0x2d')](_[_0x4a73('0x37')](_0x3376fa[_0x4a73('0x2b')],_0x5bba2d[_0x4a73('0x2d')]),_0x593255);if(_0x3376fa[_0x4a73('0x2b')][_0x4a73('0x38')]){_0x1676c0['where']=_[_0x4a73('0x39')](_0x1676c0[_0x4a73('0x36')],{'$or':_['map'](_0x593255,function(_0x5e08a8){if(_0x5e08a8['type']!==_0x4a73('0x3a')){var _0x4533fa={};_0x4533fa[_0x5e08a8[_0x4a73('0x22')]]={'$like':'%'+_0x3376fa[_0x4a73('0x2b')][_0x4a73('0x38')]+'%'};return _0x4533fa;}})});}_0x1676c0=_['merge']({},_0x1676c0,_0x3376fa[_0x4a73('0x3b')]);var _0x4bed46={'where':_0x1676c0[_0x4a73('0x36')]};return db['CmHopperBlack'][_0x4a73('0x18')](_0x4bed46)['then'](function(_0x38f7a6){_0x1ab048[_0x4a73('0x18')]=_0x38f7a6;if(_0x3376fa['query'][_0x4a73('0x3c')]){_0x1676c0[_0x4a73('0x3d')]=[{'all':!![]}];}return db[_0x4a73('0x25')][_0x4a73('0x3e')](_0x1676c0);})[_0x4a73('0x20')](function(_0xcc7cb7){_0x1ab048[_0x4a73('0x3f')]=_0xcc7cb7;return _0x1ab048;})['then'](respondWithFilteredResult(_0x27e0de,_0x1676c0))[_0x4a73('0x40')](handleError(_0x27e0de,null));};exports['show']=function(_0x1ecedb,_0x2f6b0a){var _0x372047={'raw':!![],'where':{'id':_0x1ecedb[_0x4a73('0x41')]['id']}},_0x195b75={};_0x195b75[_0x4a73('0x2a')]=_['keys'](db[_0x4a73('0x25')][_0x4a73('0x26')]);_0x195b75[_0x4a73('0x2b')]=_['keys'](_0x1ecedb[_0x4a73('0x2b')]);_0x195b75[_0x4a73('0x2d')]=_[_0x4a73('0x2e')](_0x195b75[_0x4a73('0x2a')],_0x195b75[_0x4a73('0x2b')]);_0x372047[_0x4a73('0x30')]=_[_0x4a73('0x2e')](_0x195b75[_0x4a73('0x2a')],qs['fields'](_0x1ecedb[_0x4a73('0x2b')]['fields']));_0x372047[_0x4a73('0x30')]=_0x372047['attributes'][_0x4a73('0x42')]?_0x372047[_0x4a73('0x30')]:_0x195b75[_0x4a73('0x2a')];if(_0x1ecedb[_0x4a73('0x2b')][_0x4a73('0x3c')]){_0x372047[_0x4a73('0x3d')]=[{'all':!![]}];}_0x372047=_[_0x4a73('0x39')]({},_0x372047,_0x1ecedb[_0x4a73('0x3b')]);return db[_0x4a73('0x25')][_0x4a73('0x43')](_0x372047)[_0x4a73('0x20')](handleEntityNotFound(_0x2f6b0a,null))[_0x4a73('0x20')](respondWithResult(_0x2f6b0a,null))[_0x4a73('0x40')](handleError(_0x2f6b0a,null));};exports[_0x4a73('0x1e')]=function(_0xa469a6,_0x4fd60c){if(_0xa469a6[_0x4a73('0x44')]['id']){delete _0xa469a6[_0x4a73('0x44')]['id'];}return db[_0x4a73('0x25')]['find']({'where':{'id':_0xa469a6[_0x4a73('0x41')]['id']}})[_0x4a73('0x20')](handleEntityNotFound(_0x4fd60c,null))[_0x4a73('0x20')](saveUpdates(_0xa469a6['body'],null))[_0x4a73('0x20')](respondWithResult(_0x4fd60c,null))[_0x4a73('0x40')](handleError(_0x4fd60c,null));};exports[_0x4a73('0x1f')]=function(_0x109bab,_0x58339b){return db[_0x4a73('0x25')][_0x4a73('0x43')]({'where':{'id':_0x109bab[_0x4a73('0x41')]['id']}})['then'](handleEntityNotFound(_0x58339b,null))[_0x4a73('0x20')](removeEntity(_0x58339b,null))[_0x4a73('0x40')](handleError(_0x58339b,null));};exports[_0x4a73('0x45')]=function(_0x336e1a,_0x1a7eff){return db[_0x4a73('0x25')][_0x4a73('0x45')]()[_0x4a73('0x20')](respondWithResult(_0x1a7eff,null))['catch'](handleError(_0x1a7eff,null));};
\ No newline at end of file
+var _0xddc9=['papaparse','ioredis','../../components/auth/service','../../components/parsers/advancedSearch','../../config/license/hardware','../../config/logger','api','../../config/utils','../../config/environment','../../config/license/util','sendStatus','status','end','json','count','offset','set','Content-Range','apply','reject','save','update','then','destroy','error','stack','name','send','index','rawAttributes','fieldName','type','key','model','map','keys','query','filters','attributes','intersection','fields','length','nolimit','limit','sort','where','pick','filter','merge','includeAll','CmHopperBlack','findAll','rows','catch','show','options','find','body','params','describe','eml-format','rimraf','fast-json-patch','request-promise','moment','bluebird','mustache','util','path','to-csv','lodash','squel','crypto','jsforce','desk.js'];(function(_0x5894ac,_0x149226){var _0x2c3bae=function(_0x4b7bee){while(--_0x4b7bee){_0x5894ac['push'](_0x5894ac['shift']());}};_0x2c3bae(++_0x149226);}(_0xddc9,0x11d));var _0x9ddc=function(_0x376d9a,_0x26a6d9){_0x376d9a=_0x376d9a-0x0;var _0x5a12ea=_0xddc9[_0x376d9a];return _0x5a12ea;};'use strict';var pdf=require('html-pdf');var emlformat=require(_0x9ddc('0x0'));var rimraf=require(_0x9ddc('0x1'));var zipdir=require('zip-dir');var jsonpatch=require(_0x9ddc('0x2'));var rp=require(_0x9ddc('0x3'));var moment=require(_0x9ddc('0x4'));var BPromise=require(_0x9ddc('0x5'));var Mustache=require(_0x9ddc('0x6'));var util=require(_0x9ddc('0x7'));var path=require(_0x9ddc('0x8'));var sox=require('sox');var csv=require(_0x9ddc('0x9'));var ejs=require('ejs');var fs=require('fs');var _=require(_0x9ddc('0xa'));var squel=require(_0x9ddc('0xb'));var crypto=require(_0x9ddc('0xc'));var jsforce=require(_0x9ddc('0xd'));var deskjs=require(_0x9ddc('0xe'));var toCsv=require(_0x9ddc('0x9'));var querystring=require('querystring');var Papa=require(_0x9ddc('0xf'));var Redis=require(_0x9ddc('0x10'));var authService=require(_0x9ddc('0x11'));var qs=require('../../components/parsers/qs');var as=require(_0x9ddc('0x12'));var hardwareService=require(_0x9ddc('0x13'));var logger=require(_0x9ddc('0x14'))(_0x9ddc('0x15'));var utils=require(_0x9ddc('0x16'));var config=require(_0x9ddc('0x17'));var licenseUtil=require(_0x9ddc('0x18'));var db=require('../../mysqldb')['db'];function respondWithStatusCode(_0xaa6b90,_0x165709){_0x165709=_0x165709||0xcc;return function(_0x3fac28){if(_0x3fac28){return _0xaa6b90[_0x9ddc('0x19')](_0x165709);}return _0xaa6b90[_0x9ddc('0x1a')](_0x165709)[_0x9ddc('0x1b')]();};}function respondWithResult(_0x52be17,_0x4a8eb6){_0x4a8eb6=_0x4a8eb6||0xc8;return function(_0x24a75e){if(_0x24a75e){return _0x52be17[_0x9ddc('0x1a')](_0x4a8eb6)[_0x9ddc('0x1c')](_0x24a75e);}};}function respondWithFilteredResult(_0x3655b2,_0x403523){return function(_0x2a4dcb){if(_0x2a4dcb){var _0x2714fc=_0x2a4dcb[_0x9ddc('0x1d')],_0xc84407=_0x403523[_0x9ddc('0x1e')],_0x52129a=_0x403523[_0x9ddc('0x1e')]+_0x403523['limit'],_0x2bb6ee;if(_0x52129a>=_0x2714fc){_0x52129a=_0x2714fc;_0x2bb6ee=0xc8;}else{_0x2bb6ee=0xce;}_0x3655b2['status'](_0x2bb6ee);return _0x3655b2[_0x9ddc('0x1f')](_0x9ddc('0x20'),_0xc84407+'-'+_0x52129a+'/'+_0x2714fc)[_0x9ddc('0x1c')](_0x2a4dcb);}return null;};}function patchUpdates(_0x15f93c){return function(_0x3277f7){try{jsonpatch[_0x9ddc('0x21')](_0x3277f7,_0x15f93c,!![]);}catch(_0x520834){return BPromise[_0x9ddc('0x22')](_0x520834);}return _0x3277f7[_0x9ddc('0x23')]();};}function saveUpdates(_0x2be643,_0xb48d63){return function(_0xde665e){if(_0xde665e){return _0xde665e[_0x9ddc('0x24')](_0x2be643)[_0x9ddc('0x25')](function(_0x1f0a68){return _0x1f0a68;});}return null;};}function removeEntity(_0x67b83,_0x10bbad){return function(_0x41a880){if(_0x41a880){return _0x41a880[_0x9ddc('0x26')]()['then'](function(){_0x67b83[_0x9ddc('0x1a')](0xcc)['end']();});}};}function handleEntityNotFound(_0x5e70e7,_0x571cf7){return function(_0x476ca4){if(!_0x476ca4){_0x5e70e7[_0x9ddc('0x19')](0x194);}return _0x476ca4;};}function handleError(_0x7698c9,_0x54937b){_0x54937b=_0x54937b||0x1f4;return function(_0x589c20){logger[_0x9ddc('0x27')](_0x589c20[_0x9ddc('0x28')]);if(_0x589c20[_0x9ddc('0x29')]){delete _0x589c20[_0x9ddc('0x29')];}_0x7698c9[_0x9ddc('0x1a')](_0x54937b)[_0x9ddc('0x2a')](_0x589c20);};}exports[_0x9ddc('0x2b')]=function(_0x303029,_0x4f961c){var _0x46ef7f={},_0x257d93={},_0x4f48cd={'count':0x0,'rows':[]};var _0x9fba59=_['map'](db['CmHopperBlack'][_0x9ddc('0x2c')],function(_0x1722bf){return{'name':_0x1722bf[_0x9ddc('0x2d')],'type':_0x1722bf[_0x9ddc('0x2e')][_0x9ddc('0x2f')]};});_0x257d93[_0x9ddc('0x30')]=_[_0x9ddc('0x31')](_0x9fba59,'name');_0x257d93['query']=_[_0x9ddc('0x32')](_0x303029[_0x9ddc('0x33')]);_0x257d93[_0x9ddc('0x34')]=_['intersection'](_0x257d93[_0x9ddc('0x30')],_0x257d93['query']);_0x46ef7f[_0x9ddc('0x35')]=_[_0x9ddc('0x36')](_0x257d93[_0x9ddc('0x30')],qs[_0x9ddc('0x37')](_0x303029[_0x9ddc('0x33')]['fields']));_0x46ef7f['attributes']=_0x46ef7f[_0x9ddc('0x35')][_0x9ddc('0x38')]?_0x46ef7f[_0x9ddc('0x35')]:_0x257d93[_0x9ddc('0x30')];if(!_0x303029['query']['hasOwnProperty'](_0x9ddc('0x39'))){_0x46ef7f[_0x9ddc('0x3a')]=qs['limit'](_0x303029['query'][_0x9ddc('0x3a')]);_0x46ef7f[_0x9ddc('0x1e')]=qs[_0x9ddc('0x1e')](_0x303029['query']['offset']);}_0x46ef7f['order']=qs[_0x9ddc('0x3b')](_0x303029[_0x9ddc('0x33')][_0x9ddc('0x3b')]);_0x46ef7f[_0x9ddc('0x3c')]=qs['filters'](_[_0x9ddc('0x3d')](_0x303029[_0x9ddc('0x33')],_0x257d93[_0x9ddc('0x34')]),_0x9fba59);if(_0x303029[_0x9ddc('0x33')][_0x9ddc('0x3e')]){_0x46ef7f[_0x9ddc('0x3c')]=_[_0x9ddc('0x3f')](_0x46ef7f[_0x9ddc('0x3c')],{'$or':_[_0x9ddc('0x31')](_0x9fba59,function(_0x4803b3){if(_0x4803b3[_0x9ddc('0x2e')]!=='VIRTUAL'){var _0x2f57c1={};_0x2f57c1[_0x4803b3[_0x9ddc('0x29')]]={'$like':'%'+_0x303029[_0x9ddc('0x33')][_0x9ddc('0x3e')]+'%'};return _0x2f57c1;}})});}_0x46ef7f=_[_0x9ddc('0x3f')]({},_0x46ef7f,_0x303029['options']);var _0x4f73e0={'where':_0x46ef7f['where']};return db['CmHopperBlack'][_0x9ddc('0x1d')](_0x4f73e0)[_0x9ddc('0x25')](function(_0x8b1638){_0x4f48cd[_0x9ddc('0x1d')]=_0x8b1638;if(_0x303029[_0x9ddc('0x33')][_0x9ddc('0x40')]){_0x46ef7f['include']=[{'all':!![]}];}return db[_0x9ddc('0x41')][_0x9ddc('0x42')](_0x46ef7f);})[_0x9ddc('0x25')](function(_0x262f68){_0x4f48cd[_0x9ddc('0x43')]=_0x262f68;return _0x4f48cd;})[_0x9ddc('0x25')](respondWithFilteredResult(_0x4f961c,_0x46ef7f))[_0x9ddc('0x44')](handleError(_0x4f961c,null));};exports[_0x9ddc('0x45')]=function(_0x5c43c2,_0x34f41a){var _0x4ece3a={'raw':!![],'where':{'id':_0x5c43c2['params']['id']}},_0x44f30e={};_0x44f30e[_0x9ddc('0x30')]=_[_0x9ddc('0x32')](db[_0x9ddc('0x41')][_0x9ddc('0x2c')]);_0x44f30e['query']=_[_0x9ddc('0x32')](_0x5c43c2[_0x9ddc('0x33')]);_0x44f30e['filters']=_['intersection'](_0x44f30e['model'],_0x44f30e[_0x9ddc('0x33')]);_0x4ece3a[_0x9ddc('0x35')]=_[_0x9ddc('0x36')](_0x44f30e[_0x9ddc('0x30')],qs[_0x9ddc('0x37')](_0x5c43c2[_0x9ddc('0x33')][_0x9ddc('0x37')]));_0x4ece3a[_0x9ddc('0x35')]=_0x4ece3a[_0x9ddc('0x35')][_0x9ddc('0x38')]?_0x4ece3a[_0x9ddc('0x35')]:_0x44f30e[_0x9ddc('0x30')];if(_0x5c43c2[_0x9ddc('0x33')][_0x9ddc('0x40')]){_0x4ece3a['include']=[{'all':!![]}];}_0x4ece3a=_['merge']({},_0x4ece3a,_0x5c43c2[_0x9ddc('0x46')]);return db[_0x9ddc('0x41')][_0x9ddc('0x47')](_0x4ece3a)[_0x9ddc('0x25')](handleEntityNotFound(_0x34f41a,null))[_0x9ddc('0x25')](respondWithResult(_0x34f41a,null))[_0x9ddc('0x44')](handleError(_0x34f41a,null));};exports[_0x9ddc('0x24')]=function(_0x48ddc5,_0x3c4952){if(_0x48ddc5[_0x9ddc('0x48')]['id']){delete _0x48ddc5[_0x9ddc('0x48')]['id'];}return db[_0x9ddc('0x41')]['find']({'where':{'id':_0x48ddc5[_0x9ddc('0x49')]['id']}})[_0x9ddc('0x25')](handleEntityNotFound(_0x3c4952,null))[_0x9ddc('0x25')](saveUpdates(_0x48ddc5[_0x9ddc('0x48')],null))[_0x9ddc('0x25')](respondWithResult(_0x3c4952,null))['catch'](handleError(_0x3c4952,null));};exports[_0x9ddc('0x26')]=function(_0x113e60,_0x2ca70b){return db[_0x9ddc('0x41')]['find']({'where':{'id':_0x113e60[_0x9ddc('0x49')]['id']}})[_0x9ddc('0x25')](handleEntityNotFound(_0x2ca70b,null))['then'](removeEntity(_0x2ca70b,null))[_0x9ddc('0x44')](handleError(_0x2ca70b,null));};exports[_0x9ddc('0x4a')]=function(_0xacf632,_0x16bab9){return db[_0x9ddc('0x41')]['describe']()[_0x9ddc('0x25')](respondWithResult(_0x16bab9,null))[_0x9ddc('0x44')](handleError(_0x16bab9,null));};
\ No newline at end of file