taking svg snapshot from after effects
diff --git a/build/extension/bodymovin.zxp b/build/extension/bodymovin.zxp
index 041feed..4c8b851 100644
--- a/build/extension/bodymovin.zxp
+++ b/build/extension/bodymovin.zxp
Binary files differ
diff --git a/extension/css/snapshot.css b/extension/css/snapshot.css
index b2d8351..f9790c0 100644
--- a/extension/css/snapshot.css
+++ b/extension/css/snapshot.css
@@ -15,12 +15,101 @@
     width: 100%;
 }
 
+#snapshot .header{
+    padding-top: 10px;
+    padding-bottom: 10px;
+}
+
+#snapshot .header .buttons{
+    margin-top: 10px;
+}
+
 #snapshot h1{
-    color: #EAD3A8;
+    color: #D23641;
+    margin: 0;
 }
 
 
 #snapshot .animContainer{
     width: 100%;
-    height: 400px;
+    background-color: #6E6568;
+}
+
+#snapshot .controls{
+    height: 40px;
+    width: 100%;
+    background-color: #EAD3A8;
+    border-top: 1px solid #484043;
+    position: relative;
+}
+
+#snapshot .controls .snapshotButton{
+    float: left;
+    margin-top: 5px;
+    margin-left: 4px;
+}
+
+#snapshot .controls .slider{
+    width: 100%;
+    height: 2px;
+    background-color: #D23641;
+    cursor: pointer;
+}
+
+#snapshot .controls .thumb{
+    width: 10px;
+    height: 10px;
+    border-radius: 50%;
+    background-color: #D23641;
+    border: 1px solid #FFFFFF;
+    position: absolute;
+    left: -5px;
+    top: -5px;
+    cursor: pointer;
+    pointer-events: none;
+}
+
+#snapshot .controls .frames{
+    float: right;
+    padding: 10px;
+    color: #D23641;
+    font-size: 12px;
+    line-height: 20px;
+}
+
+#snapshot .controls .frames .current{
+    background-color: #484043;
+    display: inline-block;
+    vertical-align: top;
+    min-width: 20px;
+    height: 20px;
+    padding: 0px 2px;
+    text-align: right;
+}
+
+#snapshot .controls .frames .total{
+    display: inline-block;
+    vertical-align: top;
+}
+
+#snapshot .rendersSelection {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    background-color: rgba(0,0,0,.8);
+}
+
+#snapshot .rendersSelection .listContainer{
+    text-align: center;
+}
+
+#snapshot .rendersSelection .topSpace{
+    height: 10%;
+}
+
+#snapshot  .rendersSelection .listContainer .generalButton{
+    display: block;
+    margin: auto;
 }
\ No newline at end of file
diff --git a/extension/index.html b/extension/index.html
index 8bcffe2..feae247 100644
--- a/extension/index.html
+++ b/extension/index.html
@@ -48,14 +48,33 @@
             </div>
         </div>
         <div id='snapshot'>
-            <h1>Select animation</h1>
-            <div class='buttons'>
-                <button class='generalButton rightFloat current'>Current renders</button>
-                <div class='buttonSeparator rightFloat'></div>
-                <button class='generalButton rightFloat browse'>Browse</button>
-                <button class='generalButton return'>Back</button>
+            <div class='header'>
+                <h1>Select animation</h1>
+                <div class='buttons'>
+                    <button class='generalButton rightFloat current'>Current renders</button>
+                    <div class='buttonSeparator rightFloat'></div>
+                    <button class='generalButton rightFloat browse'>Browse</button>
+                    <button class='generalButton return'>Back</button>
+                </div>
             </div>
             <div class="animContainer"></div>
+            <div class="controls">
+                <div class="slider"></div>
+                <div class="thumb"></div>
+                <button class="snapshotButton generalButton highlightButton">Take Snapshot</button>
+                <div class="frames">
+                    <div class="current" contenteditable="true"></div>
+                    <div class="total" >/<span class='value'></span></div>
+                </div>
+            </div>
+            <div class="rendersSelection">
+                <div class="topSpace"></div>
+                <div class="listContainer">
+                
+                </div>
+                <div>
+                </div>
+            </div>
         </div>
         <div id='info'>
             <div class='buttons'>
diff --git a/extension/js/controllers/CompRenderController.js b/extension/js/controllers/CompRenderController.js
index 822f63f..121efd0 100644
--- a/extension/js/controllers/CompRenderController.js
+++ b/extension/js/controllers/CompRenderController.js
@@ -90,6 +90,7 @@
         }
         if (messageData.isFinished) {
             elem.addClass('rendered');
+            compData.renderData = messageData.data.substr(7);
         }
     }
     
@@ -134,9 +135,14 @@
         view.hide();
     }
     
+    function getCompositions() {
+        return compositions;
+    }
+    
     ob.init = init;
     ob.show = show;
     ob.hide = hide;
+    ob.getCompositions = getCompositions;
     
     return ob;
 }());
\ No newline at end of file
diff --git a/extension/js/controllers/snapshotController.js b/extension/js/controllers/snapshotController.js
index a5d461b..748dbe6 100644
--- a/extension/js/controllers/snapshotController.js
+++ b/extension/js/controllers/snapshotController.js
@@ -1,15 +1,24 @@
 /*jslint vars: true, plusplus: true, devel: true, nomen: true, regexp: true, indent: 4, maxerr: 50 */
-/*global $, alertData, successData, bodymovin, mainController */
+/*global $, alertData, successData, bodymovin, mainController, compRenderController, messageController */
 var snapshotController = (function () {
     'use strict';
-    var ob = {}, view, csInterface, anim, animContainer, showing = false;
+    var ob = {}, view, csInterface, anim, header, controls, current, animContainer, slider, thumb, snapshotButton, $window, showing = false;
+    var totalFrames, currentFrame, sliderWidth, rendersSelection, listContainer;
     
     function showSelection() {
         mainController.showView('selection');
     }
     
-    function displayCurrentRenders() {
-        
+    function showControls() {
+        controls.find('.snapshotButton').show();
+        controls.find('.frames .total').show();
+        current.show();
+    }
+    
+    function hideControls() {
+        controls.find('.snapshotButton').hide();
+        controls.find('.frames .total').hide();
+        current.hide();
     }
     
     function browseFiles() {
@@ -17,29 +26,134 @@
         csInterface.evalScript(eScript);
     }
     
-    function handleFilePath(ev) {
-        var jsonData = JSON.parse(ev.data.substr(7));
-        //var result = window.cep.fs.readFile(path);
+    function updateControls(origin) {
+        if (origin !== 'input') {
+            controls.find('.frames .current').html(currentFrame);
+        }
+        if (anim) {
+            anim.goToAndStop(currentFrame + 1, true);
+        }
+        var x = (currentFrame / totalFrames) * sliderWidth;
+        thumb.css('left', x - 5 + 'px');
+    }
+    
+    function loadAnimation(data) {
+        var jsonData = JSON.parse(data);
+        totalFrames = jsonData.animation.totalFrames;
+        controls.find('.frames .total .value').html(totalFrames);
+        currentFrame = 1;
         if (anim) {
             anim.destroy();
         }
+        updateControls();
         var params = {
                 animType: 'svg',
-                wrapper: animContainer,
+                wrapper: animContainer[0],
                 loop: false,
                 autoplay: false,
                 prerender: true,
                 animationData: jsonData
             };
         anim = bodymovin.loadAnimation(params);
+        showControls();
+    }
+    
+    function addSelectionListener(elem, data) {
+        elem.on('click', function () {
+            rendersSelection.hide();
+            loadAnimation(data.renderData);
+        });
+    }
+    
+    function displayCurrentRenders() {
+        var compositions = compRenderController.getCompositions();
+        if (!compositions || compositions.length === 0) {
+            messageController.showMessage({type: 'alert', message: 'You have no recent renders.\n Try browsing your files'});
+        } else if (compositions.length === 1) {
+            loadAnimation(compositions[0].renderData);
+        } else {
+            rendersSelection.show();
+            listContainer.empty();
+            var i, len = compositions.length;
+            var li;
+            for (i = 0; i < len; i += 1) {
+                li = $('<button class="generalButton">');
+                li.html(compositions[i].name);
+                listContainer.append(li);
+                addSelectionListener(li, compositions[i]);
+            }
+        }
+    }
+    
+    function handleFilePath(ev) {
+        loadAnimation(ev.data.substr(7));
     }
     
     function handleWindowResize() {
         if (!showing) {
             return;
         }
-        console.log($(window).height());
-        console.log($(window).width());
+        animContainer.css('height', $window.height() - 2 - header.outerHeight() - controls.outerHeight() + 'px');
+        sliderWidth = slider.width();
+        
+    }
+    
+    function frameChangeHandler() {
+        var num = parseInt(current.html(), 10);
+        if (isNaN(num)) {
+            return;
+        }
+        if (num < 0) {
+            num = 0;
+        } else if (num >= totalFrames) {
+            num = totalFrames - 1;
+        }
+        currentFrame = num;
+        updateControls('input');
+    }
+    
+    function updateSliderValue(pageX) {
+        var x = pageX - slider.offset().left;
+        var perc = x / sliderWidth;
+        if (perc < 0) {
+            perc = 0;
+        } else if (perc > 1) {
+            perc = 1;
+        }
+        currentFrame = Math.round(perc * totalFrames);
+        updateControls();
+    }
+    
+    function sliderMove(ev) {
+        updateSliderValue(ev.pageX);
+    }
+        
+    function sliderUp(ev) {
+        $window.off('mousemove', sliderMove);
+        $window.off('mouseup', sliderUp);
+    }
+        
+    function sliderDown(ev) {
+        $window.on('mouseup', sliderUp);
+        $window.on('mousemove', sliderMove);
+        updateSliderValue(ev.pageX);
+    }
+    
+    function addSliderListeners() {
+        
+        slider = controls.find('.slider');
+        thumb = controls.find('.thumb');
+        slider.on('mousedown', sliderDown);
+    }
+    
+    function saveSnapshot() {
+        var svgData = animContainer[0].innerHTML;
+        var result = window.cep.fs.showSaveDialogEx('Select location', '', ['*.svg'], 'snapshot.svg');
+        var targetFilePath = result.data;
+        var writeResult = window.cep.fs.writeFile(targetFilePath, svgData);
+        if (0 !== writeResult.err) {
+            console.log('faillled');
+        }
     }
     
     function init(csIntfc) {
@@ -49,15 +163,27 @@
         view.find('.buttons .current').on('click', displayCurrentRenders);
         view.find('.buttons .browse').on('click', browseFiles);
         view.find('.return').on('click', showSelection);
-        animContainer = view.find('.animContainer')[0];
+        animContainer = view.find('.animContainer');
+        controls = view.find('.controls');
+        controls.find('.snapshotButton').on('click', saveSnapshot);
+        current = controls.find('.frames .current');
+        current.on('input', frameChangeHandler);
+        header = view.find('.header');
+        rendersSelection = view.find('.rendersSelection');
+        listContainer = rendersSelection.find('.listContainer');
+        rendersSelection.hide();
+        $window = $(window);
         csInterface.addEventListener('bm:file:path', handleFilePath);
         $(window).on('resize', handleWindowResize);
+        addSliderListeners();
+        hideControls();
     }
     
     function show() {
         if (!showing) {
             showing = true;
             view.show();
+            handleWindowResize();
         }
     }
     
@@ -65,6 +191,8 @@
         if (showing) {
             showing = false;
             view.hide();
+            slider.off('mouseup', sliderUp);
+            slider.off('mousemove', sliderMove);
         }
     }
     
diff --git a/extension/jsx/renderManager.jsx b/extension/jsx/renderManager.jsx
index ba0813d..67ef0ef 100644
--- a/extension/jsx/renderManager.jsx
+++ b/extension/jsx/renderManager.jsx
@@ -3,7 +3,7 @@
 var bm_renderManager = (function () {
     'use strict';
     
-    var ob = {}, pendingLayers = [], pendingComps = [], destinationPath, currentCompID, totalLayers, currentLayer;
+    var ob = {}, pendingLayers = [], pendingComps = [], destinationPath, currentCompID, currentComp, totalLayers, currentLayer;
     
     function verifyTrackLayer(layerData, comp, pos) {
         var nextLayerInfo = comp.layers[pos + 2];
@@ -107,7 +107,7 @@
         } catch (err) {
             bm_eventDispatcher.sendEvent('bm:alert', {message: 'Could not write file.<br /> Make sure you have enabled scripts to write files. <br /> Edit > Preferences > General > Allow Scripts to Write Files and Access Network '});
         }
-        bm_eventDispatcher.sendEvent('bm:render:update', {type: 'update', message: 'Render finished ', compId: currentCompID, progress: 1, isFinished: true});
+        bm_eventDispatcher.sendEvent('bm:render:update', {type: 'update', message: 'Render finished ', compId: currentCompID, progress: 1, isFinished: true, data: '__PFX__' + string});
         bm_compsManager.renderComplete();
     }