--------------------------------------------------------------------------------------------------------------- INITIALIZING VIDBOT, v1.7.0... --------------------------------------------------------------------------------------------------------------- [03:06:18.767] Vidbot :: start() [03:06:18.768] Vidbot :: _next(), _stepIndex:0 of 4 [03:06:18.769] index :: _onStepStarted_vidbot(), step: 1 [03:06:18.770] Vidbot :: step[0], label:Initializing Core [03:06:18.779] index :: _onStepProgress_vidbot(), percent: 20 [03:06:18.779] Vidbot :: _parse() [03:06:18.780] index :: _onStepProgress_vidbot(), percent: 40 [03:06:18.781] Vidbot :: _validate() [03:06:18.781] index :: _onStepProgress_vidbot(), percent: 60 [03:06:18.782] Vidbot :: _fonts() [03:06:18.782] FabricFontManager :: add(), id: SourceSansPro-Bold [03:06:18.782] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Bold.ttf [03:06:18.791] FabricFontManager :: add(), id: SourceSansPro-Light [03:06:18.791] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Light.ttf [03:06:18.792] FabricFontManager :: add(), id: DINOT-Bold [03:06:18.792] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Bold.otf [03:06:18.793] FabricFontManager :: add(), id: DINOT-Light [03:06:18.793] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Light.otf [03:06:18.794] FabricFontManager :: add(), id: TradeGothicLTStd-Regular [03:06:18.794] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Regular.otf [03:06:18.795] FabricFontManager :: add(), id: TradeGothicLTStd-Bold [03:06:18.795] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Bold.otf [03:06:18.796] index :: _onStepProgress_vidbot(), percent: 80 [03:06:18.796] Vidbot :: _clips() [03:06:18.797] StreamManager :: add(), id:audio_vo, type:audio [03:06:18.797] AudioClip[audio_vo] :: constructor() [03:06:18.798] InputStream[audio_vo] :: constructor() [03:06:18.798] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'audio_vo', clipId: null } [03:06:18.801] StreamManager :: add(), id:bg_music, type:audio [03:06:18.801] AudioClip[bg_music] :: constructor() [03:06:18.801] InputStream[bg_music] :: constructor() [03:06:18.801] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'bg_music', clipId: null } [03:06:18.801] StreamManager :: add(), id:mira, type:canvas [03:06:18.802] CanvasStream[canvas_1463912592316] :: constructor() [03:06:18.802] InputStream[canvas_1463912592316] :: constructor() [03:06:18.888] MiraSlideshow[mira] :: constructor() [03:06:18.888] Mira[mira] :: constructor() [03:06:18.889] Overlay[mira] :: constructor() [03:06:18.889] CanvasClip[mira] :: constructor() [03:06:18.889] Clip[mira] :: constructor() [03:06:18.889] clip:"mira" added to stream:"canvas_1463912592316" [03:06:18.889] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_1463912592316', clipId: 'mira' } [03:06:18.889] all added... [03:06:18.890] Vidbot :: _next(), _stepIndex:1 of 4 [03:06:18.890] index :: _onStepCompleted_vidbot(), step: 1 [03:06:18.890] index :: _onStepStarted_vidbot(), step: 2 [03:06:18.890] Vidbot :: step[1], label:Initializing Input Streams [03:06:18.891] StreamManager :: init() [03:06:18.891] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'audio_vo', progress: 0.3333333333333333 } [03:06:18.891] index :: _onStepProgress_vidbot(), percent: 33 [03:06:18.892] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'bg_music', progress: 0.6666666666666666 } [03:06:18.892] index :: _onStepProgress_vidbot(), percent: 67 [03:06:18.892] CanvasStream[canvas_1463912592316] :: _init(), BEGIN [03:06:18.892] i:0, c.id:mira [03:06:18.893] MiraSlideshow[mira] :: _init(), BEGIN [03:06:18.893] MiraSlideshow[mira] :: _validate() [03:06:18.895] MiraSlideshow :: _validateSlides() [03:06:18.895] i:0, s.type: title [03:06:18.895] i:1, s.type: info [03:06:18.895] i:2, s.type: image [03:06:18.895] i:3, s.type: image [03:06:18.896] i:4, s.type: image [03:06:18.896] i:5, s.type: image [03:06:18.896] i:6, s.type: image [03:06:18.896] i:7, s.type: image [03:06:18.896] i:8, s.type: image [03:06:18.896] i:9, s.type: image [03:06:18.896] i:10, s.type: image [03:06:18.896] i:11, s.type: image [03:06:18.896] i:12, s.type: image [03:06:18.896] i:13, s.type: image [03:06:18.896] i:14, s.type: image [03:06:18.896] i:15, s.type: image [03:06:18.896] i:16, s.type: image [03:06:18.900] MiraSlideshow[mira] :: _build(), BEGIN [03:06:18.905] MiraTitlecard[titlecard] :: constructor() [03:06:18.906] Mira[titlecard] :: constructor() [03:06:18.906] Overlay[titlecard] :: constructor() [03:06:18.906] CanvasClip[titlecard] :: constructor() [03:06:18.906] Clip[titlecard] :: constructor() [03:06:18.906] MiraTitlecard[titlecard] :: _init() [03:06:18.906] MiraTitlecard[titlecard] :: _validate() [03:06:18.908] MiraTitlecard[titlecard] :: _build() [03:06:18.935] Overlay[titlecard] :: _animate() [03:06:18.937] MiraTitlecard[titlecard] :: _animate() [03:06:18.939] AnimatedImageFrame[aiftitle] :: constructor() [03:06:18.941] AnimatedImageFrame[aiftitle] :: _init(), BEGIN [03:06:18.941] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_1.jpg [03:06:18.994] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:18.997] AnimatedImageFrame[aiftitle] :: _init(), END [03:06:19.002] MiraInfosheet[info] :: constructor() [03:06:19.002] Mira[info] :: constructor() [03:06:19.002] Overlay[info] :: constructor() [03:06:19.002] CanvasClip[info] :: constructor() [03:06:19.002] Clip[info] :: constructor() [03:06:19.003] MiraInfosheet[info] :: _init() [03:06:19.003] MiraInfosheet[info] :: _validate() [03:06:19.005] MiraInfosheet[info] :: _build() [03:06:19.017] RenOptions[info] :: _animate() [03:06:19.017] Overlay[info] :: _animate() [03:06:19.019] AnimatedImageFrame[info1] :: constructor() [03:06:19.019] AnimatedImageFrame[info2] :: constructor() [03:06:19.019] AnimatedImageFrame[info3] :: constructor() [03:06:19.019] AnimatedImageFrame[info1] :: _init(), BEGIN [03:06:19.019] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_7.jpg [03:06:19.056] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:19.057] AnimatedImageFrame[info1] :: _init(), END [03:06:19.057] AnimatedImageFrame[info2] :: _init(), BEGIN [03:06:19.058] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_19.jpg [03:06:19.086] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:19.088] AnimatedImageFrame[info2] :: _init(), END [03:06:19.088] AnimatedImageFrame[info3] :: _init(), BEGIN [03:06:19.088] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_20.jpg [03:06:19.117] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:19.118] AnimatedImageFrame[info3] :: _init(), END [03:06:19.119] AnimatedImageFrame[image] :: constructor() [03:06:19.120] AnimatedImageFrame[image] :: _init(), BEGIN [03:06:19.120] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_1.jpg [03:06:19.158] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:19.159] AnimatedImageFrame[image] :: _init(), END [03:06:19.159] AnimatedImageFrame[image] :: constructor() [03:06:19.159] AnimatedImageFrame[image] :: _init(), BEGIN [03:06:19.160] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_2.jpg [03:06:19.196] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:19.197] AnimatedImageFrame[image] :: _init(), END [03:06:19.198] AnimatedImageFrame[image] :: constructor() [03:06:19.198] AnimatedImageFrame[image] :: _init(), BEGIN [03:06:19.198] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_3.jpg [03:06:19.238] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:19.239] AnimatedImageFrame[image] :: _init(), END [03:06:19.240] AnimatedImageFrame[image] :: constructor() [03:06:19.240] AnimatedImageFrame[image] :: _init(), BEGIN [03:06:19.240] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_4.jpg [03:06:19.277] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:19.278] AnimatedImageFrame[image] :: _init(), END [03:06:19.279] AnimatedImageFrame[image] :: constructor() [03:06:19.279] AnimatedImageFrame[image] :: _init(), BEGIN [03:06:19.279] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_5.jpg [03:06:19.315] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:19.316] AnimatedImageFrame[image] :: _init(), END [03:06:19.317] AnimatedImageFrame[image] :: constructor() [03:06:19.317] AnimatedImageFrame[image] :: _init(), BEGIN [03:06:19.317] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_6.jpg [03:06:19.352] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:19.353] AnimatedImageFrame[image] :: _init(), END [03:06:19.354] AnimatedImageFrame[image] :: constructor() [03:06:19.354] AnimatedImageFrame[image] :: _init(), BEGIN [03:06:19.354] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_7.jpg [03:06:19.396] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:19.397] AnimatedImageFrame[image] :: _init(), END [03:06:19.400] AnimatedImageFrame[image] :: constructor() [03:06:19.401] AnimatedImageFrame[image] :: _init(), BEGIN [03:06:19.401] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_8.jpg [03:06:19.433] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:19.434] AnimatedImageFrame[image] :: _init(), END [03:06:19.435] AnimatedImageFrame[image] :: constructor() [03:06:19.435] AnimatedImageFrame[image] :: _init(), BEGIN [03:06:19.435] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_9.jpg [03:06:19.465] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:19.466] AnimatedImageFrame[image] :: _init(), END [03:06:19.466] AnimatedImageFrame[image] :: constructor() [03:06:19.466] AnimatedImageFrame[image] :: _init(), BEGIN [03:06:19.466] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_10.jpg [03:06:19.494] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:19.495] AnimatedImageFrame[image] :: _init(), END [03:06:19.495] AnimatedImageFrame[image] :: constructor() [03:06:19.495] AnimatedImageFrame[image] :: _init(), BEGIN [03:06:19.495] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_11.jpg [03:06:19.525] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:19.526] AnimatedImageFrame[image] :: _init(), END [03:06:19.527] AnimatedImageFrame[image] :: constructor() [03:06:19.527] AnimatedImageFrame[image] :: _init(), BEGIN [03:06:19.527] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_12.jpg [03:06:19.556] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:19.557] AnimatedImageFrame[image] :: _init(), END [03:06:19.557] AnimatedImageFrame[image] :: constructor() [03:06:19.558] AnimatedImageFrame[image] :: _init(), BEGIN [03:06:19.558] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_13.jpg [03:06:19.586] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:19.587] AnimatedImageFrame[image] :: _init(), END [03:06:19.587] AnimatedImageFrame[image] :: constructor() [03:06:19.587] AnimatedImageFrame[image] :: _init(), BEGIN [03:06:19.588] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_14.jpg [03:06:19.616] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:19.617] AnimatedImageFrame[image] :: _init(), END [03:06:19.621] AnimatedImageFrame[image] :: constructor() [03:06:19.622] AnimatedImageFrame[image] :: _init(), BEGIN [03:06:19.622] CanvasClip :: LoadImageWithPromise(), src: 744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403_15.jpg [03:06:19.650] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [03:06:19.652] AnimatedImageFrame[image] :: _init(), END [03:06:19.652] MiraSlideshow[mira] :: _build(), END [03:06:19.652] Overlay[mira] :: _animate() [03:06:19.653] MiraSlideshow[mira] :: _init(), END [03:06:19.653] CanvasStream[mira] :: _init(), p.then() [03:06:19.653] CanvasStream[canvas_1463912592316] :: _init(), promise.all.then() [03:06:19.655] CanvasStream[canvas_1463912592316] :: _init(), END [03:06:19.655] StreamMangaer :: init(), stream[canvas_1463912592316].then() [03:06:19.655] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'canvas_1463912592316', progress: 1 } [03:06:19.656] index :: _onStepProgress_vidbot(), percent: 100 [03:06:19.656] StreamManager :: init(), promise.all.then... [03:06:19.656] Vidbot :: StreamMgr.on( 'INITED' ) [03:06:19.656] Vidbot :: _next(), _stepIndex:2 of 4 [03:06:19.656] index :: _onStepCompleted_vidbot(), step: 2 [03:06:19.656] index :: _onStepStarted_vidbot(), step: 3 [03:06:19.656] Vidbot :: step[2], label:Rendering Canvas Streams [03:06:19.657] Vidbot :: StreamMgr.on( 'RENDER_STARTED' ), data: undefined [03:06:19.657] StreamManager :: render() [03:06:19.658] CanvasStream[canvas_1463912592316] :: render() [03:06:19.731] index :: _onStepProgress_vidbot(), percent: 0 [03:06:52.572] index :: _onStepProgress_vidbot(), percent: 5 [03:07:18.388] index :: _onStepProgress_vidbot(), percent: 10 [03:07:55.875] index :: _onStepProgress_vidbot(), percent: 15 [03:08:28.854] index :: _onStepProgress_vidbot(), percent: 20 [03:09:00.395] index :: _onStepProgress_vidbot(), percent: 25 [03:09:33.704] index :: _onStepProgress_vidbot(), percent: 30 [03:10:07.890] index :: _onStepProgress_vidbot(), percent: 35 [03:10:40.231] index :: _onStepProgress_vidbot(), percent: 40 [03:11:11.733] index :: _onStepProgress_vidbot(), percent: 45 [03:11:43.243] index :: _onStepProgress_vidbot(), percent: 50 [03:12:17.578] index :: _onStepProgress_vidbot(), percent: 55 [03:12:47.388] index :: _onStepProgress_vidbot(), percent: 60 [03:13:16.607] index :: _onStepProgress_vidbot(), percent: 65 [03:13:44.247] index :: _onStepProgress_vidbot(), percent: 70 [03:14:05.554] index :: _onStepProgress_vidbot(), percent: 75 [03:14:33.247] index :: _onStepProgress_vidbot(), percent: 80 [03:15:01.357] index :: _onStepProgress_vidbot(), percent: 85 [03:15:27.254] index :: _onStepProgress_vidbot(), percent: 90 [03:15:55.434] index :: _onStepProgress_vidbot(), percent: 95 [03:16:21.145] index :: _onStepProgress_vidbot(), percent: 100 [03:16:23.570] StreamManager :: render(), Promise.all.then... [03:16:23.571] Vidbot :: StreamMgr.on( 'RENDER_COMPLETED' ), data: undefined [03:16:23.571] Vidbot :: _next(), _stepIndex:3 of 4 [03:16:23.571] index :: _onStepCompleted_vidbot(), step: 3 [03:16:23.572] index :: _onStepStarted_vidbot(), step: 4 [03:16:23.573] Vidbot :: step[3], label:Encoding Media [03:16:23.576] CanvasFilters :: Overlay() [03:16:23.576] AudioStream[audio_vo] :: inputOptions() [03:16:23.576] AudioFilters :: Volume() [03:16:23.576] filter: [2:a]volume=1[2_vol] [03:16:23.577] AudioFilters :: Delay() [03:16:23.577] filter: [2_vol]adelay=0|0[2_del] [03:16:23.577] AudioStream[bg_music] :: inputOptions() [03:16:23.577] AudioFilters :: Volume() [03:16:23.577] filter: [3:a]volume=0.15[3_vol] [03:16:23.577] AudioFilters :: FadeOut() [03:16:23.577] filter: [3_vol]afade=t=out:st=60:d=1[3_fadeout] [03:16:23.577] AudioFilters :: Delay() [03:16:23.578] filter: [3_fadeout]adelay=0|0[3_del] [03:16:23.578] AudioFilters :: Mix() [03:16:23.578] filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [03:16:23.578] mixed filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [03:16:23.581] hang.time: 60 [03:16:23.724] Vidbot :: ffmpeg.on( 'start' ) [03:16:23.724] ffmpeg -f lavfi -i color=c=000000:s=960x540:r=30:duration=60 -r 30 -i ./tmp/canvas_1463912592316_%05d.png -to 00:01:00.000 -i file:///var/www/html/cli [03:16:23.724] ents/21764/audio/744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403.mp3 -to 00:01:00.000 -i file:///var/app/video_pre_processor/assets/vidbot/_files/audio/RF4_Count [03:16:23.724] ry_Jazz.mp3 -y -filter_complex [0:v][1:v]overlay=x=0:y=0[1_out];[2:a]volume=1[2_vol];[2_vol]adelay=0|0[2_del];[3:a]volume=0.15[3_vol];[3_vol]afade=t=o [03:16:23.724] ut:st=60:d=1[3_fadeout];[3_fadeout]adelay=0|0[3_del];[2_del][3_del]amix=inputs=2:duration=longest[a_out] -acodec aac -vcodec libx264 -r 30 -f mp4 -map [03:16:23.724] [a_out] -map [1_out] -preset veryfast -crf 18 -movflags frag_keyframe+empty_moov -pix_fmt yuv420p /var/www/html/clients/21764/video/744AEF9E-BBDB-F0F [03:16:23.725] D-B8CB-AC84B69BA403.mp4 [03:16:24.072] index :: _onStepProgress_vidbot(), percent: -3462080762 [03:16:24.408] index :: _onStepProgress_vidbot(), percent: 1 [03:16:25.930] index :: _onStepProgress_vidbot(), percent: 5 [03:16:27.458] index :: _onStepProgress_vidbot(), percent: 10 [03:16:29.498] index :: _onStepProgress_vidbot(), percent: 16 [03:16:30.533] index :: _onStepProgress_vidbot(), percent: 20 [03:16:32.054] index :: _onStepProgress_vidbot(), percent: 26 [03:16:33.103] index :: _onStepProgress_vidbot(), percent: 31 [03:16:34.119] index :: _onStepProgress_vidbot(), percent: 35 [03:16:35.628] index :: _onStepProgress_vidbot(), percent: 42 [03:16:36.655] index :: _onStepProgress_vidbot(), percent: 46 [03:16:37.674] index :: _onStepProgress_vidbot(), percent: 50 [03:16:39.201] index :: _onStepProgress_vidbot(), percent: 56 [03:16:40.739] index :: _onStepProgress_vidbot(), percent: 61 [03:16:41.745] index :: _onStepProgress_vidbot(), percent: 66 [03:16:42.749] index :: _onStepProgress_vidbot(), percent: 72 [03:16:43.757] index :: _onStepProgress_vidbot(), percent: 77 [03:16:44.781] index :: _onStepProgress_vidbot(), percent: 81 [03:16:45.787] index :: _onStepProgress_vidbot(), percent: 86 [03:16:46.795] index :: _onStepProgress_vidbot(), percent: 90 [03:16:48.319] index :: _onStepProgress_vidbot(), percent: 96 [03:16:49.219] index :: _onStepProgress_vidbot(), percent: 100 [03:16:49.253] Vidbot :: ffmpeg.on( 'end' ), Done! [03:16:49.253] StreamManager :: dispose() [03:16:49.254] CanvasStream[canvas_1463912592316] :: dispose() [03:16:49.259] Vidbot :: fflog.on( 'finish' ) [03:16:49.259] fflog.path: /var/www/html/clients/21764/video/744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403.mp4.fflog [03:16:49.259] Vidbot :: _next(), _stepIndex:4 of 4 [03:16:49.259] index :: _onStepCompleted_vidbot(), step: 4 [03:16:49.260] index :: _onComplete_vidbot(), data: { stepTime: 0.001, appTime: 630.514, output: '/var/www/html/clients/21764/video/744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403.mp4', duration: 60 } --------------------------------------------------------------------------------------------------------------- Output File : /var/app/video_pre_processor/jobs/postp//var/www/html/clients/21764/video/744AEF9E-BBDB-F0FD-B8CB-AC84B69BA403.mp4 Media Duration : 00:01:00.000 Generation Time : 00:10:30.514 ---------------------------------------------------------------------------------------------------------------