Repository: visualpython/visualpython (language: python)

Issue:
Release v2.2.2



Discussion / hints:

Fix patch:
diff --git a/bin/visualpy b/bin/visualpy
index 067b3c26..34fd3332 100644
--- a/bin/visualpy
+++ b/bin/visualpy
@@ -74,13 +74,13 @@ f_main() {
 # Install Visual Python
 #=============================================================================
 f_install() {
+    mkdir -p ${PATH_DST}/${VP_NAME}
+
     RES=`f_check_extension`
     # 1 = Jupyter Extension is not actived
     # 2 = visualpython does not exist
     # 3 = visualpython exists
 
-    mkdir -p ${PATH_DST}/${VP_NAME}
-
     if [ ${RES} -eq 1 ]; then
         f_print_not_extension
     elif [ ${RES} -eq 2 ]; then
diff --git a/bin/visualpy.bat b/bin/visualpy.bat
index a9915b59..f9c15df7 100644
--- a/bin/visualpy.bat
+++ b/bin/visualpy.bat
@@ -81,6 +81,10 @@ rem #=========================================================================
 rem # Install Visual Python
 rem #=========================================================================
 :f_install
+    if not exist "%PATH_DST%" (
+        mkdir "%PATH_DST%"
+    )
+
     call :f_check_extension RES
     rem # 1 = Jupyter Extension is not actived
     rem # 2 = visualpython does not exist
diff --git a/css/component/dataSelector.css b/css/component/dataSelector.css
index 7c51ee20..ede2e5a3 100644
--- a/css/component/dataSelector.css
+++ b/css/component/dataSelector.css
@@ -1,10 +1,37 @@
-/* Code Preview */
+/* DataSelector target*/
+.vp-ds-box {
+    display: inline-block;
+}
+.vp-ds-filter {
+    position: relative;
+    width: 20px;
+    height: 20px;
+    right: 25px;
+    cursor: pointer;
+}
+.vp-ds-box input.vp-ds-target {
+    padding-right: 23px;
+}
+.vp-ds-box input.vp-ds-target:disabled {
+    background: var(--light-gray-color) !important;
+    cursor: not-allowed;
+}
+.vp-ds-box input.vp-ds-target:disabled + .vp-ds-filter {
+    cursor: not-allowed;
+}
+.vp-ds-item:hover {
+    background: var(--light-gray-color);
+    color: var(--font-highlight);
+    cursor: pointer;
+}
+/* DataSelector popup */
 .vp-dataselector {
+    display: none;
     position: absolute;
-    top: calc(50% - 200px);
-    left: calc(50% - 200px);
-    width: 400px;
-    height: 400px;
+    top: calc(50% - 225px);
+    left: calc(50% - 300px);
+    width: 600px;
+    height: 450px;
     background: white;
     border: 1px solid var(--border-gray-color);
     z-index: 999;
@@ -13,48 +40,46 @@
     font-size: 14px;
     color: var(--font-primary);
 }
+.vp-ds-data-box {
+    width: 100%;
+    height: 100px;
+    align-content: baseline;
+    align-items: center;
+}
+.vp-ds-type-box,
 .vp-ds-variable-box {
-    border: 1px solid var(--border-gray-color);
+    border: 0.25px solid var(--border-gray-color);
     height: 100px;
     grid-row-gap: 0px;
+    align-content: baseline;
 }
+.vp-ds-type-item,
 .vp-ds-var-item {
+    padding-left: 5px;
     height: 25px;
+    line-height: 25px;
     border-bottom: 1px solid var(--border-gray-color);
 }
+.vp-ds-type-item:hover,
 .vp-ds-var-item:hover {
     background: var(--light-gray-color);
     color: var(--font-highlight);
     cursor: pointer;
 }
+.vp-ds-type-item.selected,
 .vp-ds-var-item.selected {
     background: var(--light-gray-color);
     color: var(--font-highlight);
     font-weight: bold;
 }
-.vp-ds-var-data {
-    padding-left: 5px;
-}
-.vp-ds-var-type {
-    border-left: 1px solid var(--border-gray-color);
-    padding-left: 5px;
-}
 .vp-ds-option-box {
-
-}
-.vp-ds-preview {
-    width: 100%;
-    height: 35px;
-    background-image: repeating-linear-gradient( to right, var(--grid-line-color) 0, var(--grid-line-color) 0.25px, transparent 1px, transparent 5px ), repeating-linear-gradient( to bottom, var(--grid-line-color) 0, var(--grid-line-color) 0.25px, transparent 1px, transparent 5px );
-    background-color: white;
-    border: 0.25px solid #E4E4E4;
-}
-.vp-ds-preview textarea {
-    display: none;
+    height: calc(100% - 140px);
+    margin-top: 10px;
 }
-.vp-ds-preview .CodeMirror-code .cm-variable {
-    background-color: rgba(47, 133, 90, 0.2);
+.vp-ds-option-inner-box {
+    height: calc(100% - 30px);
 }
-.vp-ds-preview .CodeMirror-code .cm-string {
-    background-color: rgba(246, 173, 85, 0.2);
+.vp-nd-row-box,
+.vp-nd-col-box {
+    height: 160px;
 }
\ No newline at end of file
diff --git a/css/component/multiSelector.css b/css/component/multiSelector.css
index e23915b5..9d33433b 100644
--- a/css/component/multiSelector.css
+++ b/css/component/multiSelector.css
@@ -1,6 +1,6 @@
 .vp-cs-select-container {
     width: 100%;
-    height: 100%;
+    height: calc(100% - 25px);
     display: grid;
     grid-template-columns: calc(47% - 15px) 50px calc(47% - 15px);
     grid-auto-rows: 100%;
@@ -20,7 +20,8 @@
     overflow-x: hidden;
 }
 .vp-cs-select-box.left {
-    width: 160px;
+    /* width: 160px; */
+    width: 100%;
     height: calc(100% - 32px);
 }
 .vp-cs-select-item {
diff --git a/css/component/popupComponent.css b/css/component/popupComponent.css
index 0adce053..6257d5eb 100644
--- a/css/component/popupComponent.css
+++ b/css/component/popupComponent.css
@@ -363,28 +363,6 @@
     background-image: url('');
 }
 
-/* error box */
-.vp-popup-data-error-box {
-    margin: 7px;
-    padding: 10px;
-    background: #FFFFFF;
-    border: 0.25px solid #E4E4E4;
-    box-shadow: 1px 1px 2px rgb(0 0 0 / 10%);
-    border-radius: 2px;
-}
-.vp-popup-data-error-box i.fa-exclamation-triangle {
-    color: #F37704;
-}
-.vp-popup-data-error-box-title {
-    color: #F37704;
-    font-weight: bold;
-}
-.vp-popup-data-error-box pre {
-    background: #eeeeee;
-    margin: 0px;
-    padding: 7px;
-}
-
 /* inner popup */
 .vp-inner-popup-box {
     position: absolute;
diff --git a/css/m_apps/frame.css b/css/m_apps/frame.css
index eb556609..5f178f00 100644
--- a/css/m_apps/frame.css
+++ b/css/m_apps/frame.css
@@ -208,26 +208,6 @@
     white-space: -o-pre-wrap; /* Opera 7 */
     word-wrap: break-all; /* Internet Explorer 5.5+ */
 }
-.vp-fe-info-error-box {
-    margin: 7px;
-    padding: 10px;
-    background: #FFFFFF;
-    border: 0.25px solid #C4C4C4;
-    box-shadow: 1px 1px 2px rgb(0 0 0 / 10%);
-    border-radius: 2px;
-}
-.vp-fe-info-error-box i.fa-exclamation-triangle {
-    color: #F37704;
-}
-.vp-fe-info-error-box-title {
-    color: #F37704;
-    font-weight: bold;
-}
-.vp-fe-info-error-box pre {
-    background: #eeeeee;
-    margin: 0px;
-    padding: 7px;
-}
 .vp-fe-preview-box {
     display: none;
     width: 100%;
diff --git a/css/m_apps/subset.css b/css/m_apps/subset.css
index 91e1bfad..d53454e4 100644
--- a/css/m_apps/subset.css
+++ b/css/m_apps/subset.css
@@ -94,8 +94,8 @@
 }
 .vp-ds-tab-page-box {
     display: grid;
-    grid-template-rows: 30px calc(100% - 50px);
-    grid-row-gap: 20px;
+    grid-template-rows: 30px calc(100% - 30px);
+    grid-row-gap: 5px;
     border: 0.25px solid #E4E4E4;
     padding: 15px;
 }
@@ -270,24 +270,4 @@
 }
 .vp-ds-data-view-box table {
     height: 100%;
-}
-.vp-ds-data-error-box {
-    margin: 7px;
-    padding: 10px;
-    background: #FFFFFF;
-    border: 0.25px solid #E4E4E4;
-    box-shadow: 1px 1px 2px rgb(0 0 0 / 10%);
-    border-radius: 2px;
-}
-.vp-ds-data-error-box i.fa-exclamation-triangle {
-    color: #F37704;
-}
-.vp-ds-data-error-box-title {
-    color: #F37704;
-    font-weight: bold;
-}
-.vp-ds-data-error-box pre {
-    background: #eeeeee;
-    margin: 0px;
-    padding: 7px;
 }
\ No newline at end of file
diff --git a/css/m_visualize/seaborn.css b/css/m_visualize/seaborn.css
index b08a8f84..dcf9bf81 100644
--- a/css/m_visualize/seaborn.css
+++ b/css/m_visualize/seaborn.css
@@ -1,6 +1,7 @@
 .vp-chart-setting {
     float: right;
     color: var(--gray-color);
+    padding-top: 5px;
     padding-right: 5px;
     cursor: pointer;
 }
@@ -57,11 +58,8 @@
     grid-row-gap: 5px;
     grid-column-gap: 15px;
     align-items: baseline;
-    align-content: center;
+    align-content: baseline;
     height: 100%;
-}
-.vp-chart-left-box {
-
 }
 .vp-chart-left-box > label {
     margin-bottom: 0px;
@@ -82,6 +80,10 @@
     width: 100%;
     height: calc(100% - 30px);
 }
+.vp-chart-preview-content:empty::after {
+    content: 'No preview image';
+    color: var(--gray-color);
+}
 .vp-chart-preview-box img {
     width: 100%;
     height: 100%;
diff --git a/css/m_visualize/wordCloud.css b/css/m_visualize/wordCloud.css
new file mode 100644
index 00000000..cceb249f
--- /dev/null
+++ b/css/m_visualize/wordCloud.css
@@ -0,0 +1,81 @@
+/* word cloud styles */
+.vp-wc-body {
+    display: grid;
+    grid-template-columns: calc(50% - 8px) calc(50% - 8px);
+    grid-template-rows: 1fr;
+    grid-row-gap: 5px;
+    grid-column-gap: 15px;
+    align-items: baseline;
+    align-content: baseline;
+    height: 100%;
+}
+.vp-wc-left-box label {
+    margin-bottom: 0px;
+}
+.vp-wc-left-box, 
+.vp-wc-right-box {
+    height: calc(100% - 10px);
+}
+.vp-wc-option-box {
+    height: calc(100% - 30px);
+}
+.vp-tab-bar {
+    width: 100%;
+    overflow-y: hidden;
+}
+.vp-tab-item {
+    display: inline-block;
+    position: relative;
+    width: 85px;
+    height: 30px;
+    line-height: 30px;
+    background: var(--light-gray-color);
+    cursor: pointer;
+    border: 0.24px solid #E4E4E4;
+    box-sizing: border-box;
+    border-radius: 2px 2px 0px 0px;
+    font-weight: bold;
+    text-align: center;
+}
+.vp-tab-item.vp-focus {
+    color: var(--font-highlight);
+    background: white;
+    border-bottom: 3px solid #FFCF73;
+}
+.vp-tab-page {
+    width: 100%;
+    height: 100%;
+}
+.vp-tab-page-box {
+    height: calc(100% - 30px);
+    min-height: 352px;
+    align-content: baseline;
+}
+.vp-wc-preview-title {
+    line-height: 30px;
+}
+.vp-wc-preview-option {
+    float: right;
+    padding-right: 5px;
+}
+.vp-wc-preview-box {
+    min-height: 352px;
+    width: 100%;
+    height: calc(100% - 30px);
+}
+.vp-wc-preview-content:empty::after {
+    content: 'No preview image';
+    color: var(--gray-color);
+}
+.vp-wc-preview-box img {
+    width: 100%;
+    height: 100%;
+}
+.vp-tab-page label {
+    margin-bottom: 0px;
+}
+.vp-wc-setting-footer {
+    position: absolute;
+    left: 20px;
+    bottom: 15px;
+}
\ No newline at end of file
diff --git a/css/root.css b/css/root.css
index 19fbd343..32f8b140 100644
--- a/css/root.css
+++ b/css/root.css
@@ -486,9 +486,31 @@ hr.vp-extra-menu-line {
     box-sizing: border-box;
     box-shadow: 2px 2px 8px rgb(0 0 0 / 10%);
     z-index: 10;
+    padding: 5px;
 }
 .vp-vs-item:hover {
     background: var(--light-gray-color);
     color: var(--font-highlight);
     cursor: pointer;
+}
+/* Data error box */
+.vp-data-error-box {
+    margin: 7px;
+    padding: 10px;
+    background: #FFFFFF;
+    border: 0.25px solid #E4E4E4;
+    box-shadow: 1px 1px 2px rgb(0 0 0 / 10%);
+    border-radius: 2px;
+}
+.vp-data-error-box i.fa-exclamation-triangle {
+    color: #F37704;
+}
+.vp-data-error-box-title {
+    color: #F37704;
+    font-weight: bold;
+}
+.vp-data-error-box pre {
+    background: #eeeeee;
+    margin: 0px;
+    padding: 7px;
 }
\ No newline at end of file
diff --git a/data/libraries.json b/data/libraries.json
index eefddfce..636ff503 100644
--- a/data/libraries.json
+++ b/data/libraries.json
@@ -2849,16 +2849,6 @@
                         "path" : "visualpython - library - matplotlib",
                         "desc" : "Matplotlib Visualization",
                         "item" : [
-                            {
-                                "id": "mp_importMatplotlib",
-                                "type": "function",
-                                "level": 2,
-                                "name": "import",
-                                "path": "visualpython - library - matplotlib - import matplotlib",
-                                "desc": "",
-                                "tag": "IMPORT MATPLOTLIB",
-                                "file": "m_matplotlib/import"
-                            },
                             {
                                 "id": "mp_chart",
                                 "type": "function",
@@ -2877,7 +2867,7 @@
                                 "path": "visualpython - library - matplotlib - figure",
                                 "desc": "",
                                 "tag": "MATPLOTLIB FIGURE, FIGURE, SUBPLOTS",
-                                "file": "m_matplotlib/figure"
+                                "file": "m_library/m_matplotlib/figure"
                             }
                         ]
                     }
@@ -3088,17 +3078,17 @@
                 "grid" : true,
                 "item" : [
                     {
-                        "id"   : "visualize_chartStyle",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Chart Style",
-                        "tag"  : "CHART STYLE SETTING,IMPORT CHART,VISUALIZATION,VISUALIZE",
-                        "path" : "visualpython - visualization - chartsstyle",
-                        "desc" : "Chart style setting",
-                        "file" : "m_visualize/ChartSetting",
+                        "id": "visualize_chart",
+                        "type": "function",
+                        "level": 2,
+                        "name": "Matplotlib",
+                        "path": "visualpython - visualization - matplotlib",
+                        "desc": "",
+                        "tag": "MATPLOTLIB, PLOT, CHART",
+                        "file": "m_visualize/Chart",
                         "apps" : {
                             "color": 5,
-                            "icon": "apps/apps_style.svg"
+                            "icon": "apps/apps_chart.svg"
                         }
                     },
                     {
@@ -3114,6 +3104,20 @@
                             "color": 5,
                             "icon": "apps/apps_visualize.svg"
                         }
+                    },
+                    {
+                        "id"   : "visualize_wordcloud",
+                        "type" : "function",
+                        "level": 1,
+                        "name" : "WordCloud",
+                        "tag"  : "WORDCLOUD,VISUALIZATION,VISUALIZE",
+                        "path" : "visualpython - visualization - wordcloud",
+                        "desc" : "Word Cloud",
+                        "file" : "m_visualize/WordCloud",
+                        "apps" : {
+                            "color": 5,
+                            "icon": "apps/apps_wordcloud.svg"
+                        }
                     }
                 ]
             },
diff --git a/data/m_library/pandasLibrary.js b/data/m_library/pandasLibrary.js
index 744ec874..304aa9d8 100644
--- a/data/m_library/pandasLibrary.js
+++ b/data/m_library/pandasLibrary.js
@@ -154,35 +154,37 @@ define([
                     label: 'Encoding'
                 },
                 {
-                    name:'names',
-                    type:'list',
+                    name: 'header',
+                    type: 'int',
+                    label: 'Header',
+                    component: 'option_suggest',
+                    options: ['None', '0']
+                },
+                {
+                    name: 'sep',
+                    type: 'text',
+                    label: 'Seperator'
+                },
+                {
+                    name: 'names',
+                    type: 'list',
                     label: 'Columns'
                 },
                 {
-                    name:'usecols',
+                    name: 'usecols',
                     type: 'list',
                     label: 'Column List To Use'
                 },
                 {
-                    name:'index_col',
-                    type:'var',
+                    name: 'index_col',
+                    type: 'var',
                     label: 'Column To Use As Index'
                 },
                 {
-                    name:'na_values',
-                    type:'list',
+                    name: 'na_values',
+                    type: 'list',
                     label: 'Na Values'
                 },
-                {
-                    name:'header',
-                    type:'int',
-                    label: 'Header'
-                },
-                {
-                    name: 'sep',
-                    type: 'text',
-                    label: 'Seperator'
-                },
                 {
                     name: 'skiprows',
                     type: 'list',
@@ -219,6 +221,11 @@ define([
             output: [
             ],
             variable: [
+                {
+                    name: 'encoding',
+                    type: 'text',
+                    label: 'Encoding'
+                },
                 {
                     name: 'header',
                     type: ['bool', 'list'],
@@ -229,7 +236,7 @@ define([
                 {
                     name: 'index',
                     type: 'bool',
-                    label: 'Show Index',
+                    label: 'Index',
                     default: 'True',
                     component: 'bool_checkbox'
                 },
@@ -2892,6 +2899,7 @@ define([
                     name: 'orient',
                     type: 'text',
                     label: 'JSON Orient',
+                    component: 'option_select',
                     options: ['split', 'records', 'index', 'columns', 'values', 'table'],
                     default: 'columns' // if typ==series, index is default
                 },
@@ -2950,6 +2958,7 @@ define([
                     name: 'orient',
                     type: 'text',
                     label: 'Orient',
+                    component: 'option_select',
                     // options: series 0~3 / dataframe *
                     options: ['split', 'records', 'index', 'table', 'columns', 'values']
                 }
diff --git a/data/m_visualize/chartLibrary.js b/data/m_visualize/seabornLibrary.js
similarity index 91%
rename from data/m_visualize/chartLibrary.js
rename to data/m_visualize/seabornLibrary.js
index 4cad2bca..438ec88f 100644
--- a/data/m_visualize/chartLibrary.js
+++ b/data/m_visualize/seabornLibrary.js
@@ -19,7 +19,7 @@ define([
      *      }
      * ]
      */
-    var CHART_LIBRARIES = {
+    var SEABORN_LIBRARIES = {
         /** Relational plots */
         'scatterplot': {
             name: 'Scatter Plot',
@@ -155,7 +155,19 @@ define([
                 { name: 'allocateTo', label: 'Allocate To', component: ['input'], usePair: true }
             ]
         },
+        'countplot': {
+            name: 'Count Plot',
+            code: '${allocateTo} = sns.countplot(${data}${x}${y}${hue}${etc})',
+            description: 'Show the counts of observations in each categorical bin using bars.',
+            options: [
+                { name: 'data', component: ['var_select'], var_type: ['DataFrame', 'Series', 'list'], usePair: true },
+                { name: 'x', component: ['col_select'], usePair: true },
+                { name: 'y', component: ['col_select'], usePair: true },
+                { name: 'hue', component: ['col_select'], usePair: true },
+                { name: 'allocateTo', label: 'Allocate To', component: ['input'], usePair: true }
+            ]
+        }
     }
 
-    return CHART_LIBRARIES;
+    return SEABORN_LIBRARIES;
 });
\ No newline at end of file
diff --git a/html/component/dataSelector.html b/html/component/dataSelector.html
index acafb388..46ec6653 100644
--- a/html/component/dataSelector.html
+++ b/html/component/dataSelector.html
@@ -6,19 +6,28 @@
         </div>
         <div class="vp-inner-popup-body vp-scrollbar">
             <div class="vp-grid-col-p50">
-                <label class="vp-bold">Data</label>
                 <label class="vp-bold">Type</label>
+                <label class="vp-bold">Data</label>
             </div>
-            <div class="vp-ds-variable-box vp-grid-box vp-scrollbar">
-                
+            <div class="vp-ds-data-box vp-grid-col-p50">
+                <div class="vp-ds-type-box vp-grid-box vp-scrollbar vp-no-selection">
+
+                </div>
+                <div class="vp-ds-variable-box vp-grid-box vp-scrollbar vp-no-selection">
+                    
+                </div>
             </div>
+            <hr style="margin: 0px;"/>
             <div class="vp-ds-option-box">
-                Option Page
+                <label class="vp-bold">Option Page</label>
+                <div class="vp-ds-option-inner-box">
+
+                </div>
             </div>
         </div>
         <div class="vp-inner-popup-footer">
-            <input type="text" /> <!-- CodeMirror needed -->
             <div class="vp-inner-popup-button-box">
+                <button type="button" class="vp-button" id="vp_dsCancel">Cancel</button>
                 <button type="button" class="vp-button activated" id="vp_dsOk">OK</button>
             </div>
         </div>
diff --git a/html/m_apps/file.html b/html/m_apps/file.html
index bc679c0e..07bd8d82 100644
--- a/html/m_apps/file.html
+++ b/html/m_apps/file.html
@@ -19,7 +19,7 @@
                         </div>
                     </div>
                     <div class="vp-accordian-container vp-accordion-gray-color">
-                        <div class="vp-accordian vp-close"><span class="vp-indicator"></span><span class="vp-accordian-caption" data-caption-id="TODO:Variable">Additional Options</span></div>
+                        <div class="vp-accordian vp-open"><span class="vp-indicator"></span><span class="vp-accordian-caption" data-caption-id="TODO:Variable">Additional Options</span></div>
                         <div id="vp_optionBox" class="vp-accordian-box">
                             <table class="vp-option-table vp-tbl-gap5">
                                 <colgroup><col width="40%"/><col width="*"/></colgroup>
@@ -42,7 +42,7 @@
                         </div>
                     </div>
                     <div class="vp-accordian-container vp-accordian-gray-color">
-                        <div class="vp-accordian vp-close"><span class="vp-indicator"></span><span class="vp-accordian-caption" data-caption-id="TODO:Variable">Additional Options</span></div>
+                        <div class="vp-accordian vp-open"><span class="vp-indicator"></span><span class="vp-accordian-caption" data-caption-id="TODO:Variable">Additional Options</span></div>
                         <div id="vp_optionBox" class="vp-accordian-box">
                             <table class="vp-option-table vp-tbl-gap5">
                                 <colgroup><col width="40%"/><col width="*"/></colgroup>
diff --git a/html/m_apps/frame.html b/html/m_apps/frame.html
index 37c7cb53..85821848 100644
--- a/html/m_apps/frame.html
+++ b/html/m_apps/frame.html
@@ -4,7 +4,8 @@
             <div class="vp-fe-menu-item vp-fe-menu-drop" data-type="3">Drop<i class="fa fa-caret-right"
                     style="padding-left: 5px;"></i>
                 <div class="vp-fe-menu-sub-box" style="top: 0px;">
-                    <div class="vp-fe-menu-item vp-fe-menu-drop" data-type="3">Drop Columns</div>
+                    <div class="vp-fe-menu-item vp-fe-menu-drop" data-type="3" data-axis="col">Drop Columns</div>
+                    <div class="vp-fe-menu-item vp-fe-menu-drop" data-type="3" data-axis="row">Drop Rows</div>
                     <div class="vp-fe-menu-item vp-fe-menu-drop-na" data-type="4">Drop NA</div>
                     <div class="vp-fe-menu-item vp-fe-menu-drop-duplicate" data-type="5" data-axis="col">Drop Duplicates</div>
                     <div class="vp-fe-menu-item vp-fe-menu-drop-outlier" data-type="11" data-axis="col">Drop Outlier</div>
diff --git a/html/m_visualize/seaborn.html b/html/m_visualize/seaborn.html
index 01e7cef6..234844e4 100644
--- a/html/m_visualize/seaborn.html
+++ b/html/m_visualize/seaborn.html
@@ -36,7 +36,8 @@
             </div>
         </div>
     </div> -->
-    <div class="vp-chart-body" style="margin-top:10px;">
+    <!-- <div class="vp-chart-body" style="margin-top:10px;"> -->
+    <div class="vp-chart-body" >
         <div class="vp-chart-left-box">
             <div class="vp-tab-bar figure" data-level="figure">
                 <div class="vp-tab-item vp-focus" data-type="1">Plot</div>
@@ -71,7 +72,7 @@
                                     <label for="data" class="vp-bold">Data</label>
                                     <div class="vp-grid-col-p50">
                                         <input type="text" id="data" class="vp-input vp-state"/>
-                                        <label><input type="checkbox" id="setXY" class="vp-state"><span>Set X and Y indivisually</span></label>
+                                        <label><input type="checkbox" id="setXY" class="vp-state"><span>Set X and Y individually</span></label>
                                     </div>
                                     <div class="vp-grid-col-p50">
                                         <div class="vp-grid-box">
@@ -119,7 +120,11 @@
                                 <div class="vp-tab-page vp-grid-box" data-type="style" style="display: none;">
                                     <!-- STYLE: grid / marker / color -->
                                     <label for="color" class="vp-bold">Color</label>
-                                    <input type="color" id="color" class="vp-state"/>
+                                    <div>
+                                        <label><input type="checkbox" id="useColor" class="vp-state"/><span>Use Color</span></label>
+                                        <input type="color" id="color" class="vp-state" disabled/>
+                                    </div>
+                                    <hr style="margin:5px;"/>
                                     <label for="useGrid" class="vp-bold">Grid</label>
                                     <div>
                                         <select id="useGrid" class="vp-select vp-state">
@@ -129,6 +134,7 @@
                                         </select>
                                         <input type="color" id="gridColor" class="vp-state"/>
                                     </div>
+                                    <hr style="margin:5px;"/>
                                     <label for="useMarker" class="vp-bold">Marker</label>
                                     <div class="vp-grid-col-p50">
                                         <select id="markerStyle" class="vp-select vp-state">
@@ -170,15 +176,8 @@
                 </span>
             </div>
             <div class="vp-chart-preview-box vp-grid-border-box">
-                <span></span>
-                <div id="chartPreview" class="vp-center">
-    
-                </div>
+                <div id="chartPreview" class="vp-chart-preview-content vp-center"></div>
             </div>
-            <!-- <div class="vp-chart-preview-size-box vp-grid-col-95 mt5">
-                <label>Preview Size</label>
-                <input type="range" id="previewSize" max="5" min="-5" value="0"/>
-            </div> -->
         </div>
     </div>
     
diff --git a/html/m_visualize/wordCloud.html b/html/m_visualize/wordCloud.html
new file mode 100644
index 00000000..c36f2095
--- /dev/null
+++ b/html/m_visualize/wordCloud.html
@@ -0,0 +1,61 @@
+<body>
+    <div class="vp-wc-body" >
+        <div class="vp-wc-left-box">
+            <div class="vp-bold">
+                <span class="vp-wc-preview-title vp-orange-text">Required options</span>
+            </div>
+            <div class="vp-wc-option-box">
+                <div class="vp-tab-bar">
+                    <div class="vp-tab-item vp-focus" data-type="data">Data</div>
+                    <div class="vp-tab-item" data-type="wordcloud">WordCloud</div>
+                    <div class="vp-tab-item" data-type="plot">Plot</div>
+                </div>
+                <div class="vp-tab-page-box vp-grid-border-box vp-scrollbar">
+                    <div class="vp-tab-page vp-grid-box" data-type="data">
+                        <label for="data" class="vp-bold">Data</label>
+                        <div>
+                            <input type="text" id="data" class="vp-input vp-state"/>
+                            <div id="vp_wcOpenFile" class="vp-file-browser-button" style="margin-left:0px;"></div>
+                        </div>
+
+                        <div class="vp-wc-file-option vp-grid-box">
+                            <label for="encoding" class="vp-bold">File encoding</label>
+                            <input type="text" id="encoding" class="vp-input vp-state" />
+                        </div>
+
+                        <label for="wordCount" class="vp-bold">Number of words</label>
+                        <input type="number" id="wordCount" class="vp-input vp-state" min="0"/>
+
+                    </div>
+                    <div class="vp-tab-page vp-grid-box" data-type="wordcloud" style="display: none;">
+                        <label for="stopWords" class="vp-bold">Stop words</label>
+                        <input type="text" id="stopWords" class="vp-input vp-state" placeholder="word1,word2, ..."/>
+
+                        <label for="fontPath" class="vp-bold">Font path</label>
+                        <input type="text" id="fontPath" class="vp-input vp-state" />
+
+                        <label for="userOption" class="vp-bold">User Option</label>
+                        <input type="text" id="userOption" class="vp-input vp-state wp100" placeholder="key=value, ..."/>
+                    </div>
+                    <div class="vp-tab-page vp-grid-box" data-type="plot" style="display: none;">
+                        <label for="figWidth" class="vp-bold">Figure size</label>
+                        <div>
+                            <input type="number" id="figWidth" class="vp-input vp-state" min="0" placeholder="Width"/>
+                            <input type="number" id="figHeight" class="vp-input vp-state" min="0" placeholder="Height"/>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            
+        </div>
+        <div class="vp-wc-right-box">
+            <div class="vp-bold">
+                <span class="vp-wc-preview-title">Preview</span>
+            </div>
+            <div class="vp-wc-preview-box vp-grid-border-box">
+                <div id="vp_wcPreview" class="vp-wc-preview-content vp-center"></div>
+            </div>
+        </div>
+    </div>
+    
+</body>
\ No newline at end of file
diff --git a/img/apps/apps_wordcloud.svg b/img/apps/apps_wordcloud.svg
new file mode 100644
index 00000000..de42524c
--- /dev/null
+++ b/img/apps/apps_wordcloud.svg
@@ -0,0 +1,5 @@
+<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M22 16H10V18H22V16Z" fill="white"/>
+<path d="M18 20H10V22H18V20Z" fill="white"/>
+<path d="M16 7C17.8605 7.0026 19.6623 7.65171 21.097 8.83625C22.5317 10.0208 23.5102 11.6671 23.8649 13.4935L24.124 14.8395L25.4728 15.0835C26.8244 15.3272 28.0361 16.0676 28.8696 17.1592C29.703 18.2507 30.0981 19.6146 29.9772 20.9827C29.8562 22.3508 29.2279 23.6241 28.2159 24.5525C27.2038 25.481 25.881 25.9973 24.5076 26H7.49541C6.12163 25.9983 4.79818 25.4828 3.78527 24.5547C2.77237 23.6266 2.14331 22.3532 2.02178 20.9848C1.90025 19.6164 2.29505 18.2521 3.12855 17.16C3.96204 16.068 5.17393 15.3272 6.52591 15.0835L7.87471 14.8395L8.13381 13.4935C8.48901 11.6671 9.46776 10.0208 10.9026 8.83636C12.3375 7.65187 14.1394 7.00274 16 7V7ZM16 5C13.6745 5.00255 11.4222 5.81353 9.62894 7.29406C7.83562 8.77459 6.61284 10.8326 6.17001 13.1155C4.32695 13.4482 2.67497 14.4582 1.5388 15.947C0.402619 17.4359 -0.135575 19.2958 0.0300014 21.1613C0.195578 23.0269 1.05295 24.763 2.43359 26.0284C3.81423 27.2939 5.61827 27.9972 7.49111 28H24.5076C26.3805 27.9972 28.1845 27.294 29.5652 26.0285C30.9459 24.7631 31.8033 23.027 31.9689 21.1614C32.1345 19.2959 31.5963 17.4359 30.4602 15.9471C29.324 14.4582 27.672 13.4482 25.8289 13.1155C25.386 10.8306 24.1617 8.77114 22.3662 7.29035C20.5706 5.80956 18.3157 4.9998 15.9883 5H16Z" fill="white"/>
+</svg>
diff --git a/js/com/com_Config.js b/js/com/com_Config.js
index 22f3dbf2..c7683649 100644
--- a/js/com/com_Config.js
+++ b/js/com/com_Config.js
@@ -470,7 +470,7 @@ define([
     /**
      * Version
      */
-    Config.version = "2.2.1";
+    Config.version = "2.2.2";
 
     /**
      * Type of mode
diff --git a/js/com/com_Const.js b/js/com/com_Const.js
index adec12b7..0654d1f9 100644
--- a/js/com/com_Const.js
+++ b/js/com/com_Const.js
@@ -19,7 +19,7 @@ define ([
     class Constants { }
 
     Constants.TOOLBAR_BTN_INFO = {
-        HELP: "Visual Python 2.2.1"
+        HELP: "Visual Python 2.2.2"
         , ICON: "vp-main-icon"
         , ID: "vpBtnToggle"
         , NAME: "toggle-vp"
diff --git a/js/com/com_generator.js b/js/com/com_generator.js
index 2bffe0de..aeac2588 100644
--- a/js/com/com_generator.js
+++ b/js/com/com_generator.js
@@ -19,6 +19,7 @@ define([
     var _VP_SHOW_RESULT = true;
 
     const _VP_BOOL_OPTIONS = [
+        { label: 'Select option...', value: ''},
         { label: 'True', value: 'True' },
         { label: 'False', value: 'False' }
     ]
@@ -119,7 +120,9 @@ define([
                         // 'id':opt,
                         'index':obj.index,
                         'name':obj.name,
-                        'value':(obj.default==opt.value?'':opt.value)
+                        // 'value':(obj.default==opt.value?'':opt.value)
+                        'value':opt.value
+
                     });
                     // cell metadata test
                     if (getValue && obj.value != undefined) {
@@ -130,9 +133,10 @@ define([
                             });
                         }
                     } else if (obj.default == opt.value) {
-                        $(option).attr({
-                            'selected':'selected'
-                        });
+                        // set default value
+                        // $(option).attr({
+                        //     'selected':'selected'
+                        // });
                     }
                     optSlct.append(option);
                 });
@@ -146,7 +150,7 @@ define([
                 });
                 // if required, no default option
                 if (required != true) {
-                    $(optSlct).append($('<option value="">Default</option>'));
+                    $(optSlct).append($('<option value="">Select option...</option>'));
                 }
                 obj.options.forEach((opt, idx, arr) => {
                     var label = (obj.options_label != undefined? obj.options_label[idx]:opt);
@@ -171,6 +175,27 @@ define([
                 });
                 tblInput.appendChild(optSlct);
                 break;
+            case 'option_suggest':
+                    // suggest input tag
+                    // 1. Target Variable
+                    var suggestInput = new SuggestInput();
+                    suggestInput.setComponentID(obj.name);
+                    suggestInput.addClass('vp-input vp-state');
+                    suggestInput.setSuggestList(function() { return obj.options; });
+                    suggestInput.setNormalFilter(obj.useFilter == undefined?false:obj.useFilter);
+                    suggestInput.setValue(obj.value);
+                    if (obj.placeholder != undefined) {
+                        suggestInput.setPlaceholder(obj.placeholder);
+                    } else {
+                        suggestInput.setPlaceholder('Type or Select value');
+                    }
+                    suggestInput.setSelectEvent(function(selectedValue) {
+                        // trigger change
+                        $(pageThis.wrapSelector('#' + obj.name)).val(selectedValue);
+                        $(pageThis.wrapSelector('#' + obj.name)).trigger('change');
+                    });
+                    tblInput.appendChild($(suggestInput.toTagString())[0]);
+                    break;
             case 'var_select':
                 // suggest input tag
                 var tag = document.createElement('input');
@@ -382,7 +407,7 @@ define([
             case 'option_select':
                 var input = $(vp_wrapSelector(pageId, '#'+obj.name)).val();
                 // same as default
-                if (input == obj.default) break;
+                // if (input == obj.default) break;
                 value = input;
                 break;
             case 'var_select':
@@ -396,6 +421,7 @@ define([
                 break;
             case 'table':
             case 'file':
+            case 'option_suggest':
             default:
                 var input = $(vp_wrapSelector(pageId, '#'+obj.name)).val();
                 // same as default
diff --git a/js/com/com_generatorV2.js b/js/com/com_generatorV2.js
index 92356462..6ab70e3c 100644
--- a/js/com/com_generatorV2.js
+++ b/js/com/com_generatorV2.js
@@ -43,6 +43,7 @@ define([
     }
 
     const _VP_BOOL_OPTIONS = [
+        { label: 'Select option...', value: ''},
         { label: 'True', value: 'True' },
         { label: 'False', value: 'False' }
     ]
@@ -265,7 +266,8 @@ define([
                         // 'id':opt,
                         'index':obj.index,
                         'name':obj.name,
-                        'value':(obj.default==opt.value?'':opt.value)
+                        // 'value':(obj.default==opt.value?'':opt.value)
+                        'value':opt.value
                     });
                     // cell metadata test
                     if (value != undefined) {
@@ -277,11 +279,11 @@ define([
                         }
                     } else {
                         // set default value
-                        if (value == opt.default) {
-                            $(option).attr({
-                                'selected':'selected'
-                            });
-                        }
+                        // if (value == opt.default) {
+                        //     $(option).attr({
+                        //         'selected':'selected'
+                        //     });
+                        // }
                     }
                     optSlct.append(option);
                 });
@@ -652,26 +654,23 @@ define([
 
     /**
      * Bind columns source function
-     * @param {string} selector thisWrapSelector 
-     * @param {object} target 
+     * @param {object} pageThis
+     * @param {object} targetId 
      * @param {array} columnInputIdList 
      * @param {string} tagType input / select (tag type)
      * @param {array/boolean} columnWithEmpty boolean array or value to decide whether select tag has empty space
      * @param {array/boolean} columnWithIndex boolean array or value to decide whether select tag has index option
      * Usage : 
      *  $(document).on('change', this.wrapSelector('#dataframe_tag_id'), function() {
-     *      pdGen.vp_bindColumnSource(that.wrapSelector(), this, ['column_input_id'], 'select', [true, true, true]);
+     *      pdGen.vp_bindColumnSource(that, 'dataframe_tag_id', ['column_input_id'], 'select', [true, true, true]);
      *  });
      */
-    var vp_bindColumnSource = function(selector, target, columnInputIdList, tagType="input", columnWithEmpty=false, columnWithIndex=false) {
-        var varName = '';
-        if ($(target).length > 0) {
-            varName = $(target).val();
-        }
+    var vp_bindColumnSource = function(pageThis, targetId, columnInputIdList, tagType="input", columnWithEmpty=false, columnWithIndex=false) {
+        var varName = pageThis.state[targetId];
         if (varName === '') {
             // reset with no source
             columnInputIdList && columnInputIdList.forEach(columnInputId => {
-                let defaultValue = $(selector + ' #' + columnInputId).val();
+                let defaultValue = pageThis.state[columnInputId];
                 if (defaultValue == null || defaultValue == undefined) {
                     defaultValue = '';
                 }
@@ -733,7 +732,7 @@ define([
 
                 // columns using suggestInput
                 columnInputIdList && columnInputIdList.forEach((columnInputId, idx) => {
-                    let defaultValue = $(selector + ' #' + columnInputId).val();
+                    let defaultValue = pageThis.state[columnInputId];
                     if (defaultValue == null || defaultValue == undefined) {
                         defaultValue = '';
                     }
@@ -769,7 +768,7 @@ define([
                             option.append(document.createTextNode(listVar.label));
                             $(tag).append(option);
                         });
-                        $(selector + ' #' + columnInputId).replaceWith(function() {
+                        $(pageThis.wrapSelector('#' + columnInputId)).replaceWith(function() {
                             return $(tag);
                         });
                     }
diff --git a/js/com/com_util.js b/js/com/com_util.js
index d63e5c7f..55109b62 100644
--- a/js/com/com_util.js
+++ b/js/com/com_util.js
@@ -140,7 +140,7 @@ define([
      */
     var removeHeadScript = function(scriptName) {
         for (let i = 0; i < document.querySelector('head').children.length; i++){
-            if (document.querySelector('head').children[i].outerHTML.includes(scriptName)) { 
+            if (document.querySelector('head') && document.querySelector('head').children[i].outerHTML.includes(scriptName)) { 
                 document.querySelector('head').removeChild(document.querySelector('head').children[i]);
             }
         }   
@@ -187,6 +187,25 @@ define([
         });
     }
 
+    /**
+     * Template for error box
+     * @param {*} titleStr 
+     * @param {*} contentStr 
+     * @returns 
+     */
+    var templateForErrorBox = function(titleStr, contentStr='') {
+        let errorContent = new com_String();
+        errorContent.appendFormatLine('<div class="{0}">', 'vp-data-error-box');
+        errorContent.appendLine('<i class="fa fa-exclamation-triangle"></i>');
+        errorContent.appendFormatLine('<label class="{0}">{1}</label>',
+            'vp-data-error-box-title', titleStr);
+        if (contentStr && contentStr != '') {
+            errorContent.appendFormatLine('<pre>{0}</pre>', contentStr.split('\\n').join('<br/>'));
+        }
+        errorContent.appendLine('</div>');
+        return errorContent.toString();
+    }
+
     /**
      * setIsAPIListRunCode
      */
@@ -252,6 +271,8 @@ define([
         renderAlertModal: renderAlertModal,
         renderSuccessMessage: renderSuccessMessage,
 
+        templateForErrorBox: templateForErrorBox,
+
         setIsAPIListRunCode: setIsAPIListRunCode,
         getIsAPIListRunCode: getIsAPIListRunCode,
         kernelExecute: kernelExecute,
diff --git a/js/com/component/DataSelector.js b/js/com/component/DataSelector.js
index 0bc90693..91322961 100644
--- a/js/com/component/DataSelector.js
+++ b/js/com/component/DataSelector.js
@@ -14,55 +14,225 @@ define([
     'vp_base/js/com/com_String',
     'vp_base/js/com/com_util',
     'vp_base/js/com/component/Component',
-    'vp_base/js/com/component/SuggestInput',
     'vp_base/js/com/component/MultiSelector'
 ], function(dataHTML, dataCss, com_String, com_util, Component, MultiSelector) {
     //========================================================================
     // [CLASS] DataSelector
+    // Usage:
+    // let dataSelector = new DataSelector({
+    //     type: 'data',
+    //     pageThis: this,
+    //     id: 'targetId',
+    //     select: function(value, dtype) {
+    //         ;
+    //     }
+    //     finish: function(value, dtype) {
+    //         ;
+    //     }
+    // });
+    // $('#sample').replaceWith(dataSelector.toTagString());
     //========================================================================
     class DataSelector extends Component {
 
         /**
          * Constructor
-         * @param {Object} state  { type, ... }
+         * @param {Object} prop  { type, ... }
          */
-        constructor(state) {
-            super($('#site'), state);
+        constructor(prop) {
+            super($('#site'), {}, prop);
         }
 
         _init() {
             super._init();
 
-            this.state = {
+            this.prop = {
                 type: 'data',   // selector type : data / column
-                target: null,   // target jquery object
+                pageThis: null, // target's page object
+                id: '',         // target id
                 finish: null,   // callback after selection
+                select: null,   // callback after selection from suggestInput
+                allowDataType: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], // default allow data types
+                // additional options
+                classes: '',
+                ...this.prop
+            }
+
+            this.state = {
+                filterType: 'All',
                 data: '',
                 dataType: '',
+                returnDataType: '',
+                dataInfo: '',
+                slicingStart1: '',
+                slicingEnd1: '',
+                slicingStart2: '',
+                slicingEnd2: '',
+                ndRowType: 'slicing',
+                ndColType: 'slicing',
+                indexing: [],
+                rowIndexing: [],
+                colIndexing: [],
+                dictKey: '',
                 ...this.state
             }
 
+            this._target = null;
+            if (this.prop.pageThis) {
+                this._target = this.prop.pageThis.wrapSelector('#' + this.prop.id);
+            }
+
+            this._columnSelector = null;
+            this._ndRowSelector = null;
+            this._ndColSelector = null;
+
+            this._varList = [];
+
+            this.loadVariables(); 
+            this.bindEvent();
         }
 
-        _bindEvent() {
+        /**
+         * Bind event for initializing DataSelector
+         */
+        bindEvent() {
+            let that = this;
+
+            // bind Event on focus/click box
+            $(document).on(com_util.formatString("focus.init-{0}", that.uuid), com_util.formatString(".vp-ds-box-{0}.{1}", that.uuid, 'vp-ds-uninit'), function () {
+                // unbind initial event
+                $(document).unbind(com_util.formatString(".init-{0}", that.uuid));
+                $(com_util.formatString(".vp-ds-box-{0}.{1}", that.uuid, 'vp-ds-uninit')).removeClass('vp-ds-uninit').addClass('vp-ds-init');
+
+                // bind autocomplete
+                that._bindAutocomplete(that._varList);
+
+                // bind Event for opening popup
+                $(that.prop.pageThis.wrapSelector()).on('click', com_util.formatString('.vp-ds-box-{0} .vp-ds-filter', that.uuid), function(evt) {
+                    // check disabled
+                    if (!$(this).parent().find('input.vp-ds-target').is(':disabled')) {
+                        if (!$(that.wrapSelector()).length > 0) {
+                            // open popup box
+                            that.open();
+                        }
+                    }
+                    evt.stopPropagation();
+                });
+
+            });
+
+            // click filter -> open DataSelector popup
+            $(document).on(com_util.formatString("click.init-{0}", that.uuid), com_util.formatString(".vp-ds-box-{0}.{1}", that.uuid, 'vp-ds-uninit'), function () {
+                // unbind initial event
+                $(document).unbind(com_util.formatString(".init-{0}", that.uuid));
+                $(com_util.formatString(".vp-ds-box-{0}.{1}", that.uuid, 'vp-ds-uninit')).removeClass('vp-ds-uninit').addClass('vp-ds-init');
+
+                // bind autocomplete
+                that._bindAutocomplete(that._varList);
+
+                // bind Event for opening popup
+                $(that.prop.pageThis.wrapSelector()).on('click', com_util.formatString('.vp-ds-box-{0} .vp-ds-filter', that.uuid), function(evt) {
+                    // check if it's disabled
+                    if (!$(this).parent().find('input.vp-ds-target').is(':disabled')) {
+                        if (!$(that.wrapSelector()).length > 0) {
+                            // open popup box
+                            that.open();
+                        }
+                    }
+                    evt.stopPropagation();
+                });
+
+                // do click event
+                // check if it's disabled
+                if (!$(this).find('input.vp-ds-target').is(':disabled')) {
+                    if (!$(that.wrapSelector()).length > 0) {
+                        // open popup box
+                        that.open();
+                    }
+                }
+            });
+
+        }
+
+        /**
+         * Bind autocomplete for target input tag
+         * @param {*} varList { label, value }
+         */
+        _bindAutocomplete(varList) {
+            let that = this;
+
+            $(com_util.formatString(".vp-ds-box-{0} input.vp-ds-target", that.uuid)).autocomplete({
+                autoFocus: true,
+                minLength: 0,
+                source: function (req, res) {
+                    var srcList = varList;
+                    var returlList = new Array();
+                    for (var idx = 0; idx < srcList.length; idx++) {
+                        // srcList as object array
+                        if (srcList[idx].label.toString().toLowerCase().includes(req.term.trim().toLowerCase())) {
+                            returlList.push(srcList[idx]);
+                        }
+                    }
+                    res(returlList);
+                },
+                select: function (evt, ui) {
+                    let result = true;
+                    // trigger change
+                    $(this).val(ui.item.value);
+                    $(this).data('type', ui.item.dtype);
+
+                    that.state.filterType = 'All';
+                    that.state.data = ui.item.value;
+                    that.state.dataType = ui.item.dtype;
+                    that.state.returnDataType = ui.item.dtype;
+
+                    that.prop.pageThis.state[that.prop.id + '_state'] = that.state;
+
+                    $(this).trigger('change');
+
+                    // select event
+                    if (that.prop.select && typeof that.prop.select == 'function') {
+                        result = that.prop.select(ui.item.value, ui.item.dtype);
+                    }
+                    if (result != undefined) {
+                        return result;
+                    }
+                    return true;
+                },
+                search: function(evt, ui) {
+                    return true;
+                }
+            }).focus(function () {
+                $(this).val('');
+                $(this).autocomplete('search', $(this).val());
+            }).click(function () {
+                $(this).val('');
+                $(this).autocomplete('search', $(this).val());
+            }).autocomplete('instance')._renderItem = function(ul, item) {
+                return $('<li>').attr('data-value', item.value)
+                        .append(`<div class="vp-ds-item">${item.label}<label class="vp-gray-text vp-cursor">&nbsp;| ${item.dtype}</label></div>`)
+                        .appendTo(ul);
+            };
+        }
+
+        _bindEventForPopup() {
             let that = this;
 
             // Click X to close
-            $(that.wrapSelector('.vp-inner-popup-close')).on('click', function() {
+            $(this.wrapSelector('.vp-inner-popup-close')).on('click', function() {
                 that.close();
             });
 
-            // Click ok
-            $(that.wrapSelector('#vp_dsOk')).on('click', function() {
-                // TODO: set target value
-                let newValue = that.state.data;
-
-                $(that.state.target).val(newValue);
-                $(that.state.target).data('type', that.state.dataType);
-                that.state.finish(newValue);
+            // Click cancel
+            $(this.wrapSelector('#vp_dsCancel')).on('click', function() {
                 that.close();
             });
 
+            // Click ok
+            $(this.wrapSelector('#vp_dsOk')).on('click', function() {
+                // set target value
+                that.setValue();
+                that.close();
+            });
         }
 
         /**
@@ -71,18 +241,51 @@ define([
         _bindEventForItem() {
             let that = this;
 
+            // Click data type item
+            $(that.wrapSelector('.vp-ds-type-item')).off('click');
+            $(that.wrapSelector('.vp-ds-type-item')).on('click', function() {
+                $(that.wrapSelector('.vp-ds-type-item')).removeClass('selected');
+                $(this).addClass('selected');
+
+                let type = $(this).data('type');
+                that.state.filterType = type;
+                if (type == 'All') {
+                    that.renderVariableBox(that._varList);
+                } else if (type == 'Others') {
+                    that.renderVariableBox(that._varList.filter(obj => !that.prop.allowDataType.includes(obj.dtype)));
+                } else {
+                    // filter variable list
+                    that.renderVariableBox(that._varList.filter(obj => obj.dtype == type));
+                }
+
+            });
+
             // Click variable item
             $(that.wrapSelector('.vp-ds-var-item')).off('click');
-            $(that.wrapSelector('.vp-ds-var-item')).on('click', function() {
+            // $(that.wrapSelector('.vp-ds-var-item')).on('click', function() {
+            $(that.wrapSelector('.vp-ds-var-item')).single_double_click(function(evt) {
+                // single click
                 $(that.wrapSelector('.vp-ds-var-item')).removeClass('selected');
                 $(this).addClass('selected');
 
-                let data = $(this).find('.vp-ds-var-data').text();
-                let dataType = $(this).find('.vp-ds-var-type').text();
+                let data = $(this).text();
+                let dataType = $(this).data('type');
                 that.state.data = data;
                 that.state.dataType = dataType;
+                that.state.returnDataType = dataType;
 
-                // TODO: load preview
+                // render option page
+                that.renderOptionPage();
+            }, function(evt) {
+                // double click to select directly
+                let data = $(this).text();
+                let dataType = $(this).data('type');
+                that.state.data = data;
+                that.state.dataType = dataType;
+                that.state.returnDataType = dataType;
+
+                that.setValue();
+                that.close();
             });
         }
 
@@ -97,18 +300,25 @@ define([
             
             vpKernel.getDataList(types).then(function(resultObj) {
                 var varList = JSON.parse(resultObj.result);
-
-                let varTags = new com_String();
-                varList && varList.forEach((varObj, idx) => {
-                    varTags.appendFormatLine('<div class="{0} {1}">', 'vp-ds-var-item', 'vp-grid-col-p50');
-                    varTags.appendFormatLine('<div class="{0}">{1}</div>', 'vp-ds-var-data', varObj.varName);
-                    varTags.appendFormatLine('<div class="{0}">{1}</div>', 'vp-ds-var-type', varObj.varType);
-                    varTags.appendLine('</div>');
+                // re-mapping variable list
+                varList = varList.map(obj => { 
+                    return {
+                        label: obj.varName, 
+                        value: obj.varName,
+                        dtype: obj.varType,
+                        info: obj.varInfo
+                    }; 
                 });
 
-                $(that.wrapSelector('.vp-ds-variable-box')).html(varTags.toString());
-
-                that._bindEventForItem();
+                that._varList = varList;
+                if (varList && varList.length > 0 && that.state.data == '') {
+                    that.state.data = varList[0].value;
+                    that.state.dataType = varList[0].dtype;
+                    that.state.returnDataType = varList[0].dtype;
+                }
+                
+                that.renderDataBox(varList);
+                that._bindAutocomplete(varList);
 
             });
         }
@@ -117,19 +327,396 @@ define([
             return dataHTML;
         }
 
+        templateForTarget() {
+            return `
+                <div class="vp-ds-box vp-ds-box-${this.uuid} vp-ds-uninit">
+                    <input type="text" class="vp-ds-target vp-input vp-state ${this.prop.classes}" id="${this.prop.id}" value="${this.prop.pageThis.state[this.prop.id]}"/>
+                    <span class="vp-ds-filter"><img src="/nbextensions/visualpython/img/filter.svg"/></span>
+                </div>
+            `;
+        }
+
+        templateForSlicing() {
+            return `
+                <div>
+                    <label for="slicingStart1">Type start/end index for slicing.</label>
+                </div>
+                <div>
+                    <input type="number" class="vp-input vp-state" id="slicingStart1" placeholder="Start value" value="${this.state.slicingStart1}"/>
+                    <input type="number" class="vp-input vp-state" id="slicingEnd1" placeholder="End value" value="${this.state.slicingEnd1}"/>
+                </div>
+            `;
+        }
+
+        templateFor2darray() {
+            return `
+                <div class="vp-grid-col-p50" style="grid-column-gap: 5px;">
+                    <div>
+                        <label class="w50">Row</label>
+                        <select id="ndRowType" class="vp-select vp-state">
+                            <option value="slicing">Slicing</option>
+                            <option value="indexing">Indexing</option>
+                        </select>
+                        <div class="vp-nd-row-box slicing">
+                            <div>
+                                <label for="slicingStart1">Type start/end index for slicing.</label>
+                            </div>
+                            <div>
+                                <input type="number" class="vp-input m vp-state" id="slicingStart1" placeholder="Start value" value="${this.state.slicingStart1}"/>
+                                <input type="number" class="vp-input m vp-state" id="slicingEnd1" placeholder="End value" value="${this.state.slicingEnd1}"/>
+                            </div>
+                        </div>
+                        <div class="vp-nd-row-box indexing">
+                        </div>
+                    </div>
+                    <div>
+                        <label class="w50">Column</label>
+                        <select id="ndColType" class="vp-select vp-state">
+                            <option value="slicing">Slicing</option>
+                            <option value="indexing">Indexing</option>
+                        </select>
+                        <div class="vp-nd-col-box slicing">
+                            <div>
+                                <label for="slicingStart2">Type start/end index for slicing.</label>
+                            </div>
+                            <div>
+                                <input type="number" class="vp-input m vp-state" id="slicingStart2" placeholder="Start value" value="${this.state.slicingStart2}"/>
+                                <input type="number" class="vp-input m vp-state" id="slicingEnd2" placeholder="End value" value="${this.state.slicingEnd2}"/>
+                            </div>
+                        </div>
+                        <div class="vp-nd-col-box indexing">
+                        </div>
+                    </div>
+                </div>
+            `
+        }
+
+        templateForKeyPicker() {
+            return `
+                <div>
+                    <label>Type or select key from dictionary.</label>
+                </div>
+                <div>
+                    <input type="text" class="vp-input vp-state" id="dictKey" placeholder="Type key"/>
+                </div>
+            `
+        }
+
         render() {
+            ;
+        }
+
+        /** Render popup on clicking filter button */
+        renderPopup() {
+            // load state
+            let state = this.prop.pageThis.state[this.prop.id + '_state'];
+            if (state) {
+                this.state = {
+                    ...this.state,
+                    ...state
+                }
+            }
+
             super.render();
 
             this.loadVariables();
+            this._bindEventForPopup();
+
+            // if (this.state.data != '') {
+            //     this.renderOptionPage();
+            // }
+        }
+
+        renderDataBox(varList) {
+            let that = this;
+            let varTags = new com_String();
+            let types = [
+                'All',
+                ...this.prop.allowDataType,
+                'Others'
+            ];
+            // Add Data Types to filter
+            types && types.forEach(type => {
+                varTags.appendFormatLine('<div class="{0} {1}" data-type="{2}">{3}</div>'
+                    , 'vp-ds-type-item', (that.state.filterType == type? 'selected': ''), type, type);
+            });
+            $(this.wrapSelector('.vp-ds-type-box')).html(varTags.toString());
+
+            // focus on selected item
+            let selectedTag = $(this.wrapSelector('.vp-ds-type-item.selected')).get(0);
+            selectedTag && selectedTag.scrollIntoView();
+
+            this.renderVariableBox(varList);
+        }
+
+        renderVariableBox(varList) {
+            let that = this;
+            let varTags = new com_String();
+            varTags = new com_String();
+            varList && varList.forEach((obj, idx) => {
+                varTags.appendFormatLine('<div class="{0} {1}" title="{2}" data-type="{3}">{4}</div>'
+                    , 'vp-ds-var-item', (that.state.data == obj.value?'selected':''), obj.dtype, obj.dtype, obj.label);
+            });
+            $(this.wrapSelector('.vp-ds-variable-box')).html(varTags.toString());
+
+            // focus on selected item
+            let selectedTag = $(this.wrapSelector('.vp-ds-var-item.selected')).get(0);
+            selectedTag && selectedTag.scrollIntoView();
+
+            this.renderOptionPage();
+            this._bindEventForItem();
+        }
+
+        renderOptionPage() {
+            let that = this;
+
+            // initialize page and variables
+            $(this.wrapSelector('.vp-ds-option-inner-box')).html('');
+            this._columnSelector = null;
+
+            let { data, dataType } = this.state;
+
+            switch (dataType) {
+                case 'DataFrame':
+                    // column selecting
+                    this._columnSelector = new MultiSelector(this.wrapSelector('.vp-ds-option-inner-box'),
+                        { mode: 'columns', parent: [data], selectedList: this.state.indexing }
+                    );
+                    break;
+                case 'Series':
+                case 'list':
+                case 'ndarray':
+                    // check it's ndim
+                    let ndim = 0;
+                    try {
+                        ndim = this._varList.filter(obj => obj.value==data)[0]['info']['ndim'];
+                    } catch { ; }
+                    if (ndim == 2) {
+                        // 1d 2d page
+                        $(this.wrapSelector('.vp-ds-option-inner-box')).html(this.templateFor2darray());
+                        $(this.wrapSelector('#ndRowType')).val(this.state.ndRowType);
+                        $(this.wrapSelector('#ndColType')).val(this.state.ndColType);
+                        this._ndRowSelector = new MultiSelector(this.wrapSelector('.vp-nd-row-box.indexing'),
+                            { mode: 'ndarray0', parent: [data], selectedList: this.state.rowIndexing }
+                        );
+                        this._ndColSelector = new MultiSelector(this.wrapSelector('.vp-nd-col-box.indexing'),
+                            { mode: 'ndarray1', parent: [data], selectedList: this.state.colIndexing }
+                        );
+                        $(this.wrapSelector('.vp-nd-row-box')).hide();
+                        $(this.wrapSelector('.vp-nd-col-box')).hide();
+                        $(this.wrapSelector('.vp-nd-row-box.' + this.state.ndRowType)).show();
+                        $(this.wrapSelector('.vp-nd-col-box.' + this.state.ndColType)).show();
+
+                        // bind event
+                        $(this.wrapSelector('#ndRowType')).change(function() {
+                            that.state.ndRowType = $(this).val();
+                            $(that.wrapSelector('.vp-nd-row-box')).hide();
+                            $(that.wrapSelector('.vp-nd-row-box.' + that.state.ndRowType)).show();
+                        });
+                        $(this.wrapSelector('#ndColType')).change(function() {
+                            that.state.ndColType = $(this).val();
+                            $(that.wrapSelector('.vp-nd-col-box')).hide();
+                            $(that.wrapSelector('.vp-nd-col-box.' + that.state.ndColType)).show();
+                        });
+
+                    } else {
+                        // slicing
+                        $(this.wrapSelector('.vp-ds-option-inner-box')).html(this.templateForSlicing());
+                    }
+                    break;
+                case 'dict':
+                    // key picker
+                    $(this.wrapSelector('.vp-ds-option-inner-box')).html(this.templateForKeyPicker());
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        toTagString() {
+            return this.templateForTarget();
+        }
+
+        /**
+         * simple version of _saveSingleState()
+         */
+        _saveState() {
+            let that = this;
+            $(this.wrapSelector('.vp-state')).each((idx, tag) => {
+                let id = tag.id;
+                let tagName = $(tag).prop('tagName'); // returns with UpperCase
+                let newValue = '';
+                switch(tagName) {
+                    case 'INPUT':
+                        let inputType = $(tag).prop('type');
+                        if (inputType == 'checkbox') {
+                            newValue = $(tag).prop('checked');
+                        } else {
+                            // inputType == 'text' || inputType == 'number' || inputType == 'hidden' || inputType == 'color' || inputType == 'range'
+                            newValue = $(tag).val();
+                        }
+                        break;
+                    case 'TEXTAREA':
+                    case 'SELECT':
+                    default:
+                        newValue = $(tag).val();
+                        if (!newValue) {
+                            newValue = '';
+                        }
+                        break;
+                }
+
+                // save state
+                that.state[id] = newValue;
+            }); 
+        }
+
+        setValue() {
+            let newValue = this.generateCode();
+            $(this._target).val(newValue);
+            $(this._target).data('type', this.state.returnDataType);
+            // set pageThis.state
+            this.prop.pageThis.state[this.prop.id + '_state'] = this.state;
+            $(this._target).change();
+
+            if (this.prop.finish && typeof this.prop.finish == 'function') {
+                this.prop.finish(newValue, this.state.returnDataType);
+            }            
+        }
+
+        generateCode() {
+            // save state
+            this._saveState();
+
+            // get states
+            let {
+                data, dataType,
+                slicingStart1, slicingEnd1,
+                slicingStart2, slicingEnd2,
+                ndRowType, ndColType
+            } = this.state;
+            let code = new com_String();
+
+            switch (dataType) {
+                case 'DataFrame':
+                    code.append(data);
+                    if (this._columnSelector != null) {
+                        let result = this._columnSelector.getDataList();
+                        this.state.indexing = result.map(obj => obj.code); // save state
+                        let columnList = [];
+                        result && result.forEach(obj => {
+                            columnList.push(obj.code);
+                        });
+                        if (columnList.length > 0) {
+                            if (columnList.length == 1) {
+                                // return as Series
+                                code.appendFormat('[{0}]', columnList.join(', '));
+                                // change datatype to Series
+                                this.state.returnDataType = 'Series';
+                            } else {
+                                code.appendFormat('[[{0}]]', columnList.join(', '));
+                            }
+                        }
+                    }
+                    break;
+                case 'Series':
+                case 'list':
+                    code.append(data);
+                    // start / end value
+                    if ((slicingStart1 && slicingStart1 != '') || (slicingEnd1 && slicingEnd1 != '')) {
+                        code.appendFormat('[{0}:{1}]', slicingStart1, slicingEnd1);
+                    }
+                    break;
+                case 'ndarray':
+                    code.append(data);
+                    let ndim = 0;
+                    try {
+                        ndim = this._varList.filter(obj => obj.value==data)[0]['info']['ndim'];
+                    } catch { ; }
+                    if (ndim == 2) {
+                        let rowCode = '';
+                        let colCode = '';
+                        if (ndRowType == 'slicing') {
+                            // slicing start / end value
+                            if ((slicingStart1 && slicingStart1 != '') || (slicingEnd1 && slicingEnd1 != '')) {
+                                rowCode = com_util.formatString('{0}:{1}', slicingStart1, slicingEnd1);
+                            }
+                        } else {
+                            // indexing
+                            let result = this._ndRowSelector.getDataList();
+                            this.state.rowIndexing = result.map(obj => obj.code); // save state
+                            let rowList = [];
+                            result && result.forEach(obj => {
+                                rowList.push(obj.code);
+                            });
+                            if (rowList.length > 0) {
+                                if (rowList.length == 1) {
+                                    rowCode = com_util.formatString('{0}', rowList.join(', '));
+                                } else {
+                                    rowCode = com_util.formatString('({0})', rowList.join(', '));
+                                }
+                            }
+                        }
+                        if (ndColType == 'slicing') {
+                            // slicing start / end value
+                            if ((slicingStart2 && slicingStart2 != '') || (slicingEnd2 && slicingEnd2 != '')) {
+                                colCode = com_util.formatString('{0}:{1}', slicingStart2, slicingEnd2);
+                            }
+                        } else {
+                            // indexing
+                            let result = this._ndColSelector.getDataList();
+                            this.state.colIndexing = result.map(obj => obj.code); // save state
+                            let columnList = [];
+                            result && result.forEach(obj => {
+                                columnList.push(obj.code);
+                            });
+                            if (columnList.length > 0) {
+                                if (columnList.length == 1) {
+                                    colCode = com_util.formatString('{0}', columnList.join(', '));
+                                } else {
+                                    colCode = com_util.formatString('({0})', columnList.join(', '));
+                                }
+                            }
+                        }
+                        // merge rowCode and colCode
+                        if (rowCode != '' || colCode != '') {
+                            if (rowCode == '' && colCode != '') {
+                                rowCode = ':'
+                            }
+                            code.appendFormat('[{0},{1}]', rowCode, colCode);
+                        }
+                    } else {
+                        // start / end value
+                        if ((slicingStart1 && slicingStart1 != '') || (slicingEnd1 && slicingEnd1 != '')) {
+                            code.appendFormat('[{0}:{1}]', slicingStart1, slicingEnd1);
+                        }
+                    }
+                    break;
+                case 'dict':
+                    code.append(data);
+                    let dictKey = $(this.wrapSelector('#dictKey')).val();
+                    if (dictKey && dictKey != '') {
+                        code.appendFormat("['{0}']", dictKey);
+                        // return datatype to ...
+                        this.state.returnDataType = 'str'; // FIXME: get dict's key value
+                    }
+                    break;
+                default:
+                    code.append(data);
+                    break;
+            }
+            return code.toString();
         }
 
         open() {
+            this.renderPopup();
             $(this.wrapSelector()).show();
         }
 
         close() {
             $(this.wrapSelector()).remove();
         }
+
     }
 
     return DataSelector;
diff --git a/js/com/component/MultiSelector.js b/js/com/component/MultiSelector.js
index ed755f5e..9077dabd 100644
--- a/js/com/component/MultiSelector.js
+++ b/js/com/component/MultiSelector.js
@@ -62,7 +62,7 @@ define([
             this.config = this.state;
 
             var { mode, type, parent, selectedList=[], includeList=[], excludeList=[] } = this.config;
-            this.mode = mode;
+            this.mode = mode;   // variable / columns / index / ndarray0 / ndarray1
             this.parent = parent;
             this.selectedList = selectedList;
             this.includeList = includeList;
@@ -82,7 +82,22 @@ define([
                 case 'variable':
                     this._getVariableList(type, function(dataList) {
                         that._executeCallback(dataList);
-                    })
+                    });
+                    break;
+                case 'index':
+                    this._getRowList(parent, function(dataList) {
+                        that._executeCallback(dataList);
+                    });
+                    break;
+                case 'ndarray0':
+                    this._getNdarray(parent, 0, function(dataList) {
+                        that._executeCallback(dataList);
+                    });
+                    break;
+                case 'ndarray1':
+                    this._getNdarray(parent, 1, function(dataList) {
+                        that._executeCallback(dataList);
+                    });
                     break;
             }
         }
@@ -165,6 +180,55 @@ define([
             }
         }
 
+        _getRowList(parent, callback) {
+            vpKernel.getRowList(parent).then(function(resultObj) {
+                let { result } = resultObj;
+                try {
+                    var rowList = JSON.parse(result);
+                    rowList = rowList.map(function(x) {
+                        return {
+                            ...x,
+                            value: x.label,
+                            code: x.value,
+                            type: x.dtype
+                        };
+                    });
+                    callback(rowList);
+                } catch (e) {
+                    callback([]);
+                }
+            });
+        }
+
+        _getNdarray(parent, dim, callback) {
+            let parentVar = '';
+            if (parent && parent.length > 0) {
+                parentVar = parent[0];
+
+                let cmd = com_util.formatString('{0}.shape[{1}]', parentVar, dim);
+                vpKernel.execute(cmd).then(function(resultObj) {
+                    let { result } = resultObj;
+                    try {
+                        let dimLength = parseInt(result);
+                        let ndList = [];
+                        for (let i = 0; i < dimLength; i++) {
+                            ndList.push({
+                                value: i,
+                                code: i,
+                                type: 'int'
+                            });
+                        }
+                        callback(ndList);
+                    } catch (e) {
+                        callback([]);
+                    }
+                });
+            } else {
+                callback([]);
+            }
+            
+        }
+
         load() {
             $(this.frameSelector).html(this.render());
             this.bindEvent();
@@ -199,6 +263,7 @@ define([
             //                         , APP_SELECT_SEARCH, 'Search Column');
             var vpSearchSuggest = new SuggestInput();
             vpSearchSuggest.addClass(APP_SELECT_SEARCH);
+            vpSearchSuggest.addClass('vp-input');
             vpSearchSuggest.setPlaceholder('Search ' + this.mode);
             vpSearchSuggest.setSuggestList(function() { return that.dataList; });
             vpSearchSuggest.setSelectEvent(function(value) {
@@ -234,7 +299,7 @@ define([
 
         renderSelectionBox(dataList) {
             var tag = new com_String();
-            tag.appendFormatLine('<div class="{0} {1} {2} {3}">', APP_SELECT_BOX, 'left', APP_DROPPABLE, 'no-selection');
+            tag.appendFormatLine('<div class="{0} {1} {2} {3}">', APP_SELECT_BOX, 'left', APP_DROPPABLE, 'no-selection vp-scrollbar');
             // get data and make draggable items
             dataList && dataList.forEach((data, idx) => {
                 // for column : data.array parsing
@@ -254,7 +319,7 @@ define([
 
         renderSelectedBox(dataList) {
             var tag = new com_String();
-            tag.appendFormatLine('<div class="{0} {1} {2} {3}">', APP_SELECT_BOX, 'right', APP_DROPPABLE, 'no-selection');
+            tag.appendFormatLine('<div class="{0} {1} {2} {3}">', APP_SELECT_BOX, 'right', APP_DROPPABLE, 'no-selection vp-scrollbar');
             // get data and make draggable items
             dataList && dataList.forEach((data, idx) => {
                 // for column : data.array parsing
diff --git a/js/com/component/SuggestInput.js b/js/com/component/SuggestInput.js
index b242ee16..34102225 100644
--- a/js/com/component/SuggestInput.js
+++ b/js/com/component/SuggestInput.js
@@ -152,9 +152,11 @@ define([
                         }
                         return true;
                     }
-                }).focus(function () {
+                }).focus(function() {
+                    $(this).val('');
                     $(com_util.formatString(".{0}", that.uuid)).autocomplete('search', $(com_util.formatString(".{0}", that.uuid)).val());
-                }).click(function () {
+                }).click(function() {
+                    $(this).val('');
                     $(com_util.formatString(".{0}", that.uuid)).autocomplete('search', $(com_util.formatString(".{0}", that.uuid)).val());
                 });
             });
diff --git a/js/com/component/VarSelector2.js b/js/com/component/VarSelector2.js
index 2decd620..844bd443 100644
--- a/js/com/component/VarSelector2.js
+++ b/js/com/component/VarSelector2.js
@@ -320,12 +320,14 @@ define([
                     return false;
                 }
             }).focus(function () {
+                $(this).val('');
                 $(this).autocomplete('search', $(this).val());
             }).click(function () {
+                $(this).val('');
                 $(this).autocomplete('search', $(this).val());
             }).autocomplete('instance')._renderItem = function(ul, item) {
                 return $('<li>').attr('data-value', item.value)
-                        .append(`<div class="vp-vs-item">${item.label}<label class="vp-gray-text">&nbsp;| ${item.dtype}</label></div>`)
+                        .append(`<div class="vp-vs-item">${item.label}<label class="vp-gray-text vp-cursor">&nbsp;| ${item.dtype}</label></div>`)
                         .appendTo(ul);
             };
         }
diff --git a/js/loadVisualpython.js b/js/loadVisualpython.js
index 70122bf9..b0ae9193 100644
--- a/js/loadVisualpython.js
+++ b/js/loadVisualpython.js
@@ -129,6 +129,12 @@
         $(document).on('blur', '#vp_fileNavigation input', function() {
             com_interface.enableOtherShortcut();
         });
+        $(document).on('focus', '.vp-dataselector input', function() {
+            com_interface.disableOtherShortcut();
+        });
+        $(document).on('blur', '.vp-dataselector input', function() {
+            com_interface.enableOtherShortcut();
+        });
         // textarea - hotkey control
         $(document).on('focus', com_util.wrapSelector('.vp-popup-frame textarea'), function() {
             com_interface.disableOtherShortcut();
diff --git a/js/m_apps/Bind.js b/js/m_apps/Bind.js
index 55473f49..5ceb9f5d 100644
--- a/js/m_apps/Bind.js
+++ b/js/m_apps/Bind.js
@@ -15,10 +15,11 @@
 define([
     'text!vp_base/html/m_apps/bind.html!strip',
     'css!vp_base/css/m_apps/bind.css',
+    'vp_base/js/com/com_util',
     'vp_base/js/com/com_String',
     'vp_base/js/com/component/PopupComponent',
     'vp_base/js/com/component/MultiSelector'
-], function(bindHtml, bindCss, com_String, PopupComponent, MultiSelector) {
+], function(bindHtml, bindCss, com_util, com_String, PopupComponent, MultiSelector) {
 
     /**
      * Bind
@@ -347,35 +348,21 @@ define([
                         that.renderDataPage('');
                     }
                 } else {
-                    var errorContent = new com_String();
+                    var errorContent = '';
                     if (msg.content.ename) {
-                        errorContent.appendFormatLine('<div class="{0}">', 'vp-popup-data-error-box');
-                        errorContent.appendLine('<i class="fa fa-exclamation-triangle"></i>');
-                        errorContent.appendFormatLine('<label class="{0}">{1}</label>',
-                            'vp-popup-data-error-box-title', msg.content.ename);
-                        if (msg.content.evalue) {
-                            // errorContent.appendLine('<br/>');
-                            errorContent.appendFormatLine('<pre>{0}</pre>', msg.content.evalue.split('\\n').join('<br/>'));
-                        }
-                        errorContent.appendLine('</div>');
+                        errorContent = com_util.templateForErrorBox(msg.content.ename, msg.content.evalue);
                     }
                     that.renderDataPage(errorContent);
+                    vpLog.display(VP_LOG_TYPE.ERROR, msg.content.ename, msg.content.evalue, msg.content);
                 }
             }).catch(function(resultObj) {
                 let { msg } = resultObj;
-                var errorContent = new com_String();
+                var errorContent = '';
                 if (msg.content.ename) {
-                    errorContent.appendFormatLine('<div class="{0}">', 'vp-popup-data-error-box');
-                    errorContent.appendLine('<i class="fa fa-exclamation-triangle"></i>');
-                    errorContent.appendFormatLine('<label class="{0}">{1}</label>',
-                    'vp-popup-data-error-box-title', msg.content.ename);
-                    if (msg.content.evalue) {
-                        // errorContent.appendLine('<br/>');
-                        errorContent.appendFormatLine('<pre>{0}</pre>', msg.content.evalue.split('\\n').join('<br/>'));
-                    }
-                    errorContent.appendLine('</div>');
+                    errorContent = com_util.templateForErrorBox(msg.content.ename, msg.content.evalue);
                 }
                 that.renderDataPage(errorContent);
+                vpLog.display(VP_LOG_TYPE.ERROR, msg.content.ename, msg.content.evalue, msg.content);
             });
         }
 
diff --git a/js/m_apps/File.js b/js/m_apps/File.js
index a456a6f1..fa062ef9 100644
--- a/js/m_apps/File.js
+++ b/js/m_apps/File.js
@@ -305,24 +305,24 @@ define([
             if (pageType == 'Write') {
                 if (selectedType == 'json') {
                     $(prefix + '#path_or_buf').parent().html(
-                        com_util.formatString('<input type="text" class="vp-input input-single" id="path_or_buf" index="0" placeholder="" value="" title=""><div id="vp_openFileNavigationBtn" class="{0}"></div>'
+                        com_util.formatString('<input type="text" class="vp-input vp-state" id="path_or_buf" index="0" placeholder="" value="" title=""><div id="vp_openFileNavigationBtn" class="{0}"></div>'
                         , 'vp-file-browser-button')
                     );
                 } else if (selectedType == 'pickle') {
                     $(prefix + '#path').parent().html(
-                        com_util.formatString('<input type="text" class="vp-input input-single" id="path" index="0" placeholder="" value="" title=""><div id="vp_openFileNavigationBtn" class="{0}"></div>'
+                        com_util.formatString('<input type="text" class="vp-input vp-state" id="path" index="0" placeholder="" value="" title=""><div id="vp_openFileNavigationBtn" class="{0}"></div>'
                         , 'vp-file-browser-button')
                     );
                 } else {
                     $(this.fileState[pageType]['fileResultState']['pathInputId']).parent().html(
-                        com_util.formatString('<input type="text" class="vp-input input-single" id="{0}" index="0" placeholder="" value="" title=""><div id="vp_openFileNavigationBtn" class="{1}"></div>'
+                        com_util.formatString('<input type="text" class="vp-input vp-state" id="{0}" index="0" placeholder="" value="" title=""><div id="vp_openFileNavigationBtn" class="{1}"></div>'
                             , 'i1'
                             , 'vp-file-browser-button')
                     );
                 }
             } else {
                 $(this.fileState[pageType]['fileResultState']['pathInputId']).parent().html(
-                    com_util.formatString('<input type="text" class="vp-input input-single" id="{0}" index="0" placeholder="" value="" title=""><div id="vp_openFileNavigationBtn" class="{1}"></div>'
+                    com_util.formatString('<input type="text" class="vp-input vp-state" id="{0}" index="0" placeholder="" value="" title=""><div id="vp_openFileNavigationBtn" class="{1}"></div>'
                         , 'i0'
                         , 'vp-file-browser-button')
                 );
@@ -334,7 +334,7 @@ define([
                 var encodingList = ['utf8', 'cp949', 'ascii'];
                 var suggestInput = new SuggestInput();
                 suggestInput.setComponentID('encoding');
-                suggestInput.addClass('vp-input');
+                suggestInput.addClass('vp-input vp-state');
                 suggestInput.setSuggestList(function() { return encodingList; });
                 suggestInput.setPlaceholder('encoding option');
                 return suggestInput.toTagString();
diff --git a/js/m_apps/Frame.js b/js/m_apps/Frame.js
index a6374e8b..ade7401d 100644
--- a/js/m_apps/Frame.js
+++ b/js/m_apps/Frame.js
@@ -996,18 +996,11 @@ define([
                                     });
                                 }
                             } else {
-                                var errorContent = new com_String();
+                                var errorContent = '';
                                 if (msg.content.ename) {
-                                    errorContent.appendFormatLine('<div class="{0}">', VP_FE_INFO_ERROR_BOX);
-                                    errorContent.appendLine('<i class="fa fa-exclamation-triangle"></i>');
-                                    errorContent.appendFormatLine('<label class="{0}">{1}</label>'
-                                                                , VP_FE_INFO_ERROR_BOX_TITLE, msg.content.ename);
-                                    if (msg.content.evalue) {
-                                        // errorContent.appendLine('<br/>');
-                                        errorContent.appendFormatLine('<pre>{0}</pre>', msg.content.evalue.split('\\n').join('<br/>'));
-                                    }
-                                    errorContent.appendLine('</div>');
+                                    errorContent = com_util.templateForErrorBox(msg.content.ename, msg.content.evalue);
                                 }
+                                vpLog.display(VP_LOG_TYPE.ERROR, msg.content.ename, msg.content.evalue, msg.content);
                                 $(that.wrapSelector('.' + VP_FE_INFO_CONTENT)).replaceWith(function() {
                                     return that.renderInfoPage(errorContent);
                                 });
@@ -1363,9 +1356,6 @@ define([
     const VP_FE_INFO = 'vp-fe-info';
     const VP_FE_INFO_CONTENT = 'vp-fe-info-content';
 
-    const VP_FE_INFO_ERROR_BOX = 'vp-fe-info-error-box';
-    const VP_FE_INFO_ERROR_BOX_TITLE = 'vp-fe-info-error-box-title';
-
     const VP_FE_PREVIEW_BOX = 'vp-fe-preview-box';
     const VP_FE_BUTTON_PREVIEW = 'vp-fe-btn-preview';
     const VP_FE_BUTTON_DATAVIEW = 'vp-fe-btn-dataview';
diff --git a/js/m_apps/Groupby.js b/js/m_apps/Groupby.js
index 2de775e9..1f405310 100644
--- a/js/m_apps/Groupby.js
+++ b/js/m_apps/Groupby.js
@@ -465,35 +465,21 @@ define([
                         that.renderDataPage('');
                     }
                 } else {
-                    var errorContent = new com_String();
+                    var errorContent = '';
                     if (msg.content.ename) {
-                        errorContent.appendFormatLine('<div class="{0}">', 'vp-popup-data-error-box');
-                        errorContent.appendLine('<i class="fa fa-exclamation-triangle"></i>');
-                        errorContent.appendFormatLine('<label class="{0}">{1}</label>',
-                            'vp-popup-data-error-box-title', msg.content.ename);
-                        if (msg.content.evalue) {
-                            // errorContent.appendLine('<br/>');
-                            errorContent.appendFormatLine('<pre>{0}</pre>', msg.content.evalue.split('\\n').join('<br/>'));
-                        }
-                        errorContent.appendLine('</div>');
+                        errorContent = com_util.templateForErrorBox(msg.content.ename, msg.content.evalue);
                     }
                     that.renderDataPage(errorContent);
+                    vpLog.display(VP_LOG_TYPE.ERROR, msg.content.ename, msg.content.evalue, msg.content);
                 }
             }).catch(function(resultObj) {
                 let { msg } = resultObj;
-                var errorContent = new com_String();
+                var errorContent = '';
                 if (msg.content.ename) {
-                    errorContent.appendFormatLine('<div class="{0}">', 'vp-popup-data-error-box');
-                    errorContent.appendLine('<i class="fa fa-exclamation-triangle"></i>');
-                    errorContent.appendFormatLine('<label class="{0}">{1}</label>',
-                    'vp-popup-data-error-box-title', msg.content.ename);
-                    if (msg.content.evalue) {
-                        // errorContent.appendLine('<br/>');
-                        errorContent.appendFormatLine('<pre>{0}</pre>', msg.content.evalue.split('\\n').join('<br/>'));
-                    }
-                    errorContent.appendLine('</div>');
+                    errorContent = com_util.templateForErrorBox(msg.content.ename, msg.content.evalue);
                 }
                 that.renderDataPage(errorContent);
+                vpLog.display(VP_LOG_TYPE.ERROR, msg.content.ename, msg.content.evalue, msg.content);
             });
         }
 
diff --git a/js/m_apps/Import.js b/js/m_apps/Import.js
index 022ca285..ca52cd2b 100644
--- a/js/m_apps/Import.js
+++ b/js/m_apps/Import.js
@@ -245,17 +245,11 @@ define([
                     }
                 }
 
-                this.state.importMeta && this.state.importMeta.forEach(pack => {
-                    if (pack.i0 == pacI0) {
-                        // if include code exists?
-                        if (pack.include != undefined) {
-                            pack.include.forEach(code => {
-                                sbCode.appendLine();
-                                sbCode.append(code);
-                            });
-                        }
-                    }
-                })
+                // Need additional code?
+                if (pacI0 == 'matplotlib.pyplot' || pacI0 == 'matplotlib') {
+                    sbCode.appendLine();
+                    sbCode.append('%matplotlib inline');
+                }
 
                 importMeta.push({ i0: pacI0, i1: pacI1, type: pacType, checked: pacChecked });
             }
diff --git a/js/m_apps/Reshape.js b/js/m_apps/Reshape.js
index 38b4daad..2c782cdc 100644
--- a/js/m_apps/Reshape.js
+++ b/js/m_apps/Reshape.js
@@ -256,33 +256,17 @@ define([
                         that.renderDataPage('');
                     }
                 } else {
-                    var errorContent = new com_String();
+                    var errorContent = '';
                     if (msg.content.ename) {
-                        errorContent.appendFormatLine('<div class="{0}">', 'vp-popup-data-error-box');
-                        errorContent.appendLine('<i class="fa fa-exclamation-triangle"></i>');
-                        errorContent.appendFormatLine('<label class="{0}">{1}</label>',
-                            'vp-popup-data-error-box-title', msg.content.ename);
-                        if (msg.content.evalue) {
-                            // errorContent.appendLine('<br/>');
-                            errorContent.appendFormatLine('<pre>{0}</pre>', msg.content.evalue.split('\\n').join('<br/>'));
-                        }
-                        errorContent.appendLine('</div>');
+                        errorContent = com_util.templateForErrorBox(msg.content.ename, msg.content.evalue);
                     }
                     that.renderDataPage(errorContent);
                 }
             }).catch(function(resultObj) {
                 let { msg } = resultObj;
-                var errorContent = new com_String();
+                var errorContent = '';
                 if (msg.content.ename) {
-                    errorContent.appendFormatLine('<div class="{0}">', 'vp-popup-data-error-box');
-                    errorContent.appendLine('<i class="fa fa-exclamation-triangle"></i>');
-                    errorContent.appendFormatLine('<label class="{0}">{1}</label>',
-                    'vp-popup-data-error-box-title', msg.content.ename);
-                    if (msg.content.evalue) {
-                        // errorContent.appendLine('<br/>');
-                        errorContent.appendFormatLine('<pre>{0}</pre>', msg.content.evalue.split('\\n').join('<br/>'));
-                    }
-                    errorContent.appendLine('</div>');
+                    errorContent = com_util.templateForErrorBox(msg.content.ename, msg.content.evalue);
                 }
                 that.renderDataPage(errorContent);
             });
diff --git a/js/m_apps/SampleApp.js b/js/m_apps/SampleApp.js
index b497c82b..b7988042 100644
--- a/js/m_apps/SampleApp.js
+++ b/js/m_apps/SampleApp.js
@@ -34,28 +34,36 @@ define([
             /** Implement binding events */
             var that = this;
             
-            $(this.wrapSelector('#sample')).on('click', function() {
-                let dataSelector = new DataSelector({
-                    type: 'data',
-                    target: $(that.wrapSelector('#sample')),
-                    finish: function() {
+            // $(this.wrapSelector('#sample')).on('click', function() {
+            //     let dataSelector = new DataSelector({
+            //         type: 'data',
+            //         target: $(that.wrapSelector('#sample')),
+            //         finish: function() {
                         
-                    }
-                });
-                dataSelector.open();
-            });
+            //         }
+            //     });
+            //     dataSelector.open();
+            // });
         }
 
         templateForBody() {
             /** Implement generating template */
             return `This is sample.
-            <input type="text" id="sample" class="vp-state vp-input" placeholder="Click to edit" readonly="" />`;
+            <input type="text" id="sample" class="vp-state vp-input" readonly="" />`;
         }
 
         render() {
             super.render();
 
-
+            let dataSelector = new DataSelector({
+                type: 'data',
+                pageThis: this,
+                id: 'sample',
+                finish: function() {
+                    ;
+                }
+            });
+            $(this.wrapSelector('#sample')).replaceWith(dataSelector.toTagString());
         }
 
         generateCode() {
diff --git a/js/m_apps/Subset.js b/js/m_apps/Subset.js
index 6b80f0ac..9d2f3e26 100644
--- a/js/m_apps/Subset.js
+++ b/js/m_apps/Subset.js
@@ -158,7 +158,9 @@ define([
             if (subsetType == 'loc' || subsetType == 'iloc' || this.state.dataType == 'Series') {
                 tag.appendFormatLine('<option value="{0}">{1}</option>', 'indexing', 'Indexing');
             }
-            tag.appendFormatLine('<option value="{0}">{1}</option>', 'slicing', 'Slicing');
+            if (subsetType == 'subset' || subsetType == 'loc' || subsetType == 'iloc') {
+                tag.appendFormatLine('<option value="{0}">{1}</option>', 'slicing', 'Slicing');
+            }
             if (subsetType == 'subset' || subsetType == 'loc' || subsetType == 'query') {
                 tag.appendFormatLine('<option value="{0}">{1}</option>', 'condition', 'Condition');
             }
@@ -447,7 +449,7 @@ define([
             tag.appendLine('<div class="vp-td-line">');
             tag.appendLine(this.templateForConditionColumnInput(colList));
             tag.appendFormatLine('<select class="{0} {1}">', 'vp-select s', 'vp-oper-list');
-            var operList = ['', '==', '!=', 'in', 'not in', '<', '<=', '>', '>='];
+            var operList = ['', '==', '!=', 'contains', 'not contains', '<', '<=', '>', '>=', 'starts with', 'ends with'];
             operList.forEach(oper => {
                 tag.appendFormatLine('<option value="{0}">{1}</option>', oper, oper);
             });
@@ -483,18 +485,18 @@ define([
             // .index
             tag.appendFormatLine('<option data-code="{0}" value="{1}">{2}</option>', '.index', '.index', 'index');
             colList.forEach(col => {
-                tag.appendFormatLine('<option data-code="{0}" value="{1}">{2}</option>',
-                    col.code, col.value, col.label);
+                tag.appendFormatLine('<option data-code="{0}" data-dtype="{1}" value="{2}">{3}</option>',
+                    col.code, col.dtype, col.value, col.label);
             });
             tag.appendLine('</select>');
             return tag.toString();
         }
-        templateForConditionCondInput(category) {
+        templateForConditionCondInput(category, dtype='object') {
             var vpCondSuggest = new SuggestInput();
             vpCondSuggest.addClass('vp-input m vp-condition');
 
             if (category && category.length > 0) {
-                vpCondSuggest.setPlaceholder("Categorical Dtype");
+                vpCondSuggest.setPlaceholder((dtype=='object'?'Categorical':dtype) + " dtype");
                 vpCondSuggest.setSuggestList(function () { return category; });
                 vpCondSuggest.setSelectEvent(function (value) {
                     $(this.wrapSelector()).val(value);
@@ -502,6 +504,7 @@ define([
                 });
                 vpCondSuggest.setNormalFilter(false);
             } else {
+                vpCondSuggest.setPlaceholder(dtype==''?'Value':(dtype + " dtype"));
             }
             return vpCondSuggest.toTagString();
         }
@@ -556,35 +559,21 @@ define([
                         that.renderDataPage('');
                     }
                 } else {
-                    var errorContent = new com_String();
+                    var errorContent = '';
                     if (msg.content.ename) {
-                        errorContent.appendFormatLine('<div class="{0}">', VP_DS_DATA_ERROR_BOX);
-                        errorContent.appendLine('<i class="fa fa-exclamation-triangle"></i>');
-                        errorContent.appendFormatLine('<label class="{0}">{1}</label>',
-                            VP_DS_DATA_ERROR_BOX_TITLE, msg.content.ename);
-                        if (msg.content.evalue) {
-                            // errorContent.appendLine('<br/>');
-                            errorContent.appendFormatLine('<pre>{0}</pre>', msg.content.evalue.split('\\n').join('<br/>'));
-                        }
-                        errorContent.appendLine('</div>');
+                        errorContent = com_util.templateForErrorBox(msg.content.ename, msg.content.evalue);
                     }
                     that.renderDataPage(errorContent);
+                    vpLog.display(VP_LOG_TYPE.ERROR, msg.content.ename, msg.content.evalue, msg.content);
                 }
             }).catch(function(resultObj) {
                 let { msg } = resultObj;
-                var errorContent = new com_String();
+                var errorContent = '';
                 if (msg.content.ename) {
-                    errorContent.appendFormatLine('<div class="{0}">', VP_DS_DATA_ERROR_BOX);
-                    errorContent.appendLine('<i class="fa fa-exclamation-triangle"></i>');
-                    errorContent.appendFormatLine('<label class="{0}">{1}</label>',
-                        VP_DS_DATA_ERROR_BOX_TITLE, msg.content.ename);
-                    if (msg.content.evalue) {
-                        // errorContent.appendLine('<br/>');
-                        errorContent.appendFormatLine('<pre>{0}</pre>', msg.content.evalue.split('\\n').join('<br/>'));
-                    }
-                    errorContent.appendLine('</div>');
+                    errorContent = com_util.templateForErrorBox(msg.content.ename, msg.content.evalue);
                 }
                 that.renderDataPage(errorContent);
+                vpLog.display(VP_LOG_TYPE.ERROR, msg.content.ename, msg.content.evalue, msg.content);
             });
         }
         /**
@@ -703,6 +692,7 @@ define([
                         label: x.location + '',
                         value: x.location + '',
                         code: x.location + '',
+                        dtype: 'int'
                     };
                 });
             }
@@ -1026,7 +1016,7 @@ define([
                             return {
                                 ...x,
                                 value: x.label,
-                                code: x.value
+                                code: x.value,
                             };
                         });
                         that.loadColumnList(colList);
@@ -1345,25 +1335,42 @@ define([
                 var thisTag = $(this);
                 var varName = that.state.pandasObject;
                 var colName = $(this).find('option:selected').attr('data-code');
+                var colDtype = $(this).find('option:selected').attr('data-dtype');
 
                 var condTag = $(this).closest('td').find('.vp-condition');
 
-                // get result and load column list
-                vpKernel.getColumnCategory(varName, colName).then(function (resultObj) {
-                    let { result } = resultObj;
-                    var category = JSON.parse(result);
-                    if (category && category.length > 0) {
-                        // if it's categorical column, check 'Text' as default
-                        $(thisTag).closest('td').find('.vp-cond-use-text').prop('checked', true);
-                    } else {
-                        $(thisTag).closest('td').find('.vp-cond-use-text').prop('checked', false);
-                    }
+                if (colName == '.index') {
+                    // index
+                    $(thisTag).closest('td').find('.vp-cond-use-text').prop('checked', false);
                     $(condTag).replaceWith(function () {
-                        return that.templateForConditionCondInput(category);
+                        return that.templateForConditionCondInput([], '');
                     });
                     that.generateCode();
-                });
-
+                } else {
+                    // get result and load column list
+                    vpKernel.getColumnCategory(varName, colName).then(function (resultObj) {
+                        let { result } = resultObj;
+                        try {
+                            var category = JSON.parse(result);
+                            if (category && category.length > 0 && colDtype == 'object') {
+                                // if it's categorical column and its dtype is object, check 'Text' as default
+                                $(thisTag).closest('td').find('.vp-cond-use-text').prop('checked', true);
+                            } else {
+                                $(thisTag).closest('td').find('.vp-cond-use-text').prop('checked', false);
+                            }
+                            $(condTag).replaceWith(function () {
+                                return that.templateForConditionCondInput(category, colDtype);
+                            });
+                            that.generateCode();
+                        } catch {
+                            $(thisTag).closest('td').find('.vp-cond-use-text').prop('checked', false);
+                            $(condTag).replaceWith(function () {
+                                return that.templateForConditionCondInput([], colDtype);
+                            });
+                            that.generateCode();
+                        }
+                    });
+                }
             });
 
             // use text
@@ -1444,7 +1451,12 @@ define([
                             rowList.push(rowValue);
                         }
                     }
-                    rowSelection.appendFormat('[{0}]', rowList.toString());
+                    if (rowList.length == 1) {
+                        // to Series when rowList's length is 1.
+                        rowSelection.appendFormat('{0}', rowList.toString());
+                    } else {
+                        rowSelection.appendFormat('[{0}]', rowList.toString());
+                    }
                 } else {
                     rowSelection.append(':');
                 }
@@ -1479,43 +1491,55 @@ define([
                             rowSelection.append('(');
                         }
                         let colValue = colTag.find('.vp-col-list').val();
-                        if (colValue && colValue != '') {
-                            if (colValue == '.index') {
-                                rowSelection.append('index');
-                            } else {
-                                rowSelection.appendFormat('{0}', colValue);
-                            }
+                        if (colValue && colValue == '.index') {
+                            colValue = 'index';
                         }
-                        oper && rowSelection.appendFormat(' {0}', oper);
-                        if (cond) {
-                            // condition value as text
-                            if (useText) {
-                                rowSelection.appendFormat(" '{0}'", cond);
-                            } else {
-                                rowSelection.appendFormat(" {0}", cond);
-                            }
+                        let condValue = cond;
+                        // condition value as text
+                        if (cond && useText) {
+                            condValue = com_util.formatString("'{0}'", cond);
+                        }
+                        if (oper == 'contains') {
+                            rowSelection.appendFormat('{0}.str.contains({1})', colValue, condValue);
+                        } else if (oper == 'not contains') {
+                            rowSelection.appendFormat('~{0}.str.contains({1})', colValue, condValue);
+                        } else if (oper == 'starts with') {
+                            rowSelection.appendFormat('{0}.str.startswith({1})', colValue, condValue);
+                        } else if (oper == 'ends with') {
+                            rowSelection.appendFormat('{0}.str.endswith({1})', colValue, condValue);
+                        } else {
+                            rowSelection.appendFormat('{0}{1}{2}', colValue, oper != ''?(' ' + oper):'', condValue != ''?(' ' + condValue):'');
                         }
                         if (condList.length > 1) {
                             rowSelection.append(')');
                         }
                     } else {
                         if (varType == 'DataFrame') {
-                            rowSelection.appendFormat('({0}', varName);
+                            rowSelection.append('(');
+
+                            let colValue = varName;
                             if (colName && colName != '') {
                                 if (colName == '.index') {
-                                    rowSelection.appendFormat('{0}', colName);
+                                    colValue += colName;
                                 } else {
-                                    rowSelection.appendFormat('[{0}]', colName);
+                                    colValue += com_util.formatString('[{0}]', colName);
                                 }
                             }
-                            oper && rowSelection.appendFormat(' {0}', oper);
-                            if (cond) {
-                                // condition value as text
-                                if (useText) {
-                                    rowSelection.appendFormat(" '{0}'", cond);
-                                } else {
-                                    rowSelection.appendFormat(" {0}", cond);
-                                }
+                            let condValue = cond;
+                            // condition value as text
+                            if (cond && useText) {
+                                condValue = com_util.formatString("'{0}'", cond);
+                            }
+                            if (oper == 'contains') {
+                                rowSelection.appendFormat('{0}.str.contains({1})', colValue, condValue);
+                            } else if (oper == 'not contains') {
+                                rowSelection.appendFormat('~{0}.str.contains({1})', colValue, condValue);
+                            } else if (oper == 'starts with') {
+                                rowSelection.appendFormat('{0}.str.startswith({1})', colValue, condValue);
+                            } else if (oper == 'ends with') {
+                                rowSelection.appendFormat('{0}.str.endswith({1})', colValue, condValue);
+                            } else {
+                                rowSelection.appendFormat('{0}{1}{2}', colValue, oper != ''?(' ' + oper):'', condValue != ''?(' ' + condValue):'');
                             }
                             rowSelection.append(')');
                         } else {
@@ -1769,8 +1793,6 @@ define([
     const VP_DS_DATA_VIEW_ALL_DIV = 'vp-ds-data-view-all-div';
     const VP_DS_DATA_VIEW_ALL = 'vp-ds-data-view-all';
     const VP_DS_DATA_VIEW_BOX = 'vp-ds-data-view-box';
-    const VP_DS_DATA_ERROR_BOX = 'vp-ds-data-error-box';
-    const VP_DS_DATA_ERROR_BOX_TITLE = 'vp-ds-data-error-box-title';
 
     return Subset;
 });
\ No newline at end of file
diff --git a/js/m_library/m_matplotlib/__init__.py b/js/m_library/m_matplotlib/__init__.py
new file mode 100644
index 00000000..1e8c9919
--- /dev/null
+++ b/js/m_library/m_matplotlib/__init__.py
@@ -0,0 +1,1 @@
+print('Visual Python')
diff --git a/js/m_library/m_matplotlib/figure.js b/js/m_library/m_matplotlib/figure.js
new file mode 100644
index 00000000..7fd6429e
--- /dev/null
+++ b/js/m_library/m_matplotlib/figure.js
@@ -0,0 +1,306 @@
+/*
+ *    Project Name    : Visual Python
+ *    Description     : GUI-based Python code generator
+ *    File Name       : figure.js
+ *    Author          : Black Logic
+ *    Note            : Library Component
+ *    License         : GNU GPLv3 with Visual Python special exception
+ *    Date            : 2021. 11. 18
+ *    Change Date     :
+ */
+
+//============================================================================
+// [CLASS] Figure
+//============================================================================
+define([
+    'vp_base/js/com/component/LibraryComponent',
+    'vp_base/js/com/component/VarSelector'
+], function(LibraryComponent, VarSelector) {
+    /**
+     * Figure
+     */
+    class Figure extends LibraryComponent {
+        _init() {
+            super._init();
+
+            this.state = {
+                subplotsRows: '',
+                subplotsCols: '',
+                o0: 'figure',
+                figsize: '',
+                ...this.state
+            }
+
+            this.package = {
+                name: 'plt.subplots()',
+                code: '${o0}, ax = plt.subplots(${subplotsRows}, ${subplotsCols}${v})',
+                input: [
+                    {
+                        name: 'subplotsRows',
+                        type: 'int',
+                        label: 'Number of Rows',
+                        component: 'input_single'
+                    },
+                    {
+                        name: 'subplotsCols',
+                        type: 'int',
+                        label: 'Number of Columns',
+                        component: 'input_single'
+                    }
+                ],
+                output: [
+                    {
+                        name: 'o0',
+                        type: 'var',
+                        label: 'Figure Variable',
+                        component: 'input_single',
+                        required: true
+                    }
+                ],
+                variable: [
+                    {
+                        name: 'figsize',
+                        type: 'var'
+                    }
+                ]
+            };
+        }
+
+        _bindEvent() {
+            super._bindEvent();
+
+            var that = this;
+
+            // add subplot box on changing subplots row/column
+            $(this.wrapSelector('#subplotsRows')).change(function() {
+                var row = $(that.wrapSelector('#subplotsRows')).val() * 1;
+                var col = $(that.wrapSelector('#subplotsCols')).val() * 1;
+                // nothing entered, set 1
+                if (row == 0) row = 1;
+                if (col == 0) col = 1;
+
+                $(that.wrapSelector('#subplotsRowsRange')).val(row);
+
+                $(that.wrapSelector('#vp_subplotsGrid')).attr('data-row', row);
+                $(that.wrapSelector('#vp_subplotsGrid')).css('height', 80 * row + 'px');
+                $(that.wrapSelector('#vp_subplotsGrid')).css('grid-template-rows', 'repeat(' + row + ', 1fr)');
+
+                $(that.wrapSelector('#vp_subplotsGrid')).html('');
+
+                for (var i = 0; i < row * col; i++) {
+                    var div = document.createElement('div');
+                    var r = parseInt(i / col);
+                    var c = i % col;
+                    $(div).attr({
+                        'class': 'grid-item',
+                        'data-idx': i,
+                        'data-row': r,
+                        'data-col': c
+                    });
+                    
+                    var position = i;
+                    if (row > 1 && col > 1) {
+                        position = r + ', ' + c;
+                    }
+                    $(div).text('[' + position + ']');
+                    $(div).click(function(evt) { that.subplotBoxClickHandler(that, evt); });
+                    $(that.wrapSelector('#vp_subplotsGrid')).append(div);
+                }
+
+                // initialize subplot value
+                that.selectedIdx = '0';
+                if (row > 1 && col > 1) {
+                    that.selectedIdx = '0, 0';
+                }
+                that.subplotOption = [];
+                // add space for subplot
+                for (var i = 0; i < row * col; i++) {
+                    that.subplotOption.push({idx: i});
+                }
+            });
+
+            $(this.wrapSelector('#subplotsCols')).change(function() {
+                var row = $(that.wrapSelector('#subplotsRows')).val() * 1;
+                var col = $(that.wrapSelector('#subplotsCols')).val() * 1;
+                // nothing entered, set 1
+                if (row == 0) row = 1;
+                if (col == 0) col = 1;
+
+                $(that.wrapSelector('#subplotsColsRange')).val(col);
+
+                $(that.wrapSelector('#vp_subplotsGrid')).attr('data-col', col);
+                $(that.wrapSelector('#vp_subplotsGrid')).css('width', 80 * col + 'px');
+                $(that.wrapSelector('#vp_subplotsGrid')).css('grid-template-columns', 'repeat(' + col + ', 1fr)');
+
+                $(that.wrapSelector('#vp_subplotsGrid')).html('');
+
+                for (var i = 0; i < row * col; i++) {
+                    var div = document.createElement('div');
+                    var r = parseInt(i / col);
+                    var c = i % col;
+                    $(div).attr({
+                        'class': 'grid-item',
+                        'data-idx': i,
+                        'data-row': r,
+                        'data-col': c
+                    });
+                    
+                    var position = i;
+                    if (row > 1 && col > 1) {
+                        position = r + ', ' + c;
+                    }
+                    $(div).text('[' + position + ']');
+                    $(div).click(function(evt) { that.subplotBoxClickHandler(that, evt); });
+                    $(that.wrapSelector('#vp_subplotsGrid')).append(div);
+                }
+
+                // initialize subplot value
+                that.selectedIdx = '0';
+                if (row > 1 && col > 1) {
+                    that.selectedIdx = '0, 0';
+                }
+                that.subplotOption = [];
+                // add space for subplot
+                for (var i = 0; i < row * col; i++) {
+                    that.subplotOption.push({idx: i});
+                }
+            });
+
+            
+            // subplot 위치 버튼 클릭 시 해당 subplot의 옵션 설정을 위해 다음 페이지로 이동
+            // 참고 : vpContainer.js > tabPageShow($(this).index());
+            // - #vp_subplot span[data-caption-id="vp_functionDetail"]
+            // - #vp_subplotOptional span[data-caption-id="vp_functionDetail"]
+            $(this.wrapSelector('#vp_subplotsGrid div')).click(function (evt) {
+                that.subplotBoxClickHandler(that, evt);
+            });
+
+            // range 변경 시 값 표시
+            $(this.wrapSelector('#subplotsRowsRange')).change(function() {
+                var value = $(this).val();
+                $(that.wrapSelector('#subplotsRows')).val(value);
+                $(that.wrapSelector('#subplotsRows')).change();
+            });
+            $(this.wrapSelector('#subplotsColsRange')).change(function() {
+                var value = $(this).val();
+                $(that.wrapSelector('#subplotsCols')).val(value);
+                $(that.wrapSelector('#subplotsCols')).change();
+            });
+
+
+        }
+
+        bindCmapSelector() {
+            // 기존 cmap 선택하는 select 태그 안보이게
+            var cmapSelector = this.wrapSelector('#cmap');
+            $(cmapSelector).hide();
+    
+            // cmap 데이터로 팔레트 div 동적 구성
+            this.cmap.forEach(ctype => {
+                var divColor = document.createElement('div');
+                $(divColor).attr({
+                    'class': 'vp-plot-cmap-item',
+                    'data-cmap': ctype,
+                    'data-url': 'pandas/cmap/' + ctype + '.JPG',
+                    'title': ctype
+                });
+                $(divColor).text(ctype);
+                // 이미지 url 바인딩
+                var url = Jupyter.notebook.base_url + vpConst.BASE_PATH + vpConst.RESOURCE_PATH + 'pandas/cmap/' + ctype + '.JPG';
+                $(divColor).css({
+                    'background-image' : 'url(' + url + ')'
+                })
+    
+                var selectedCmap = this.wrapSelector('#vp_selectedCmap');
+    
+                // 선택 이벤트 등록
+                $(divColor).click(function() {
+                    if (!$(this).hasClass('selected')) {
+                        $(this).parent().find('.vp-plot-cmap-item.selected').removeClass('selected');
+                        $(this).addClass('selected');
+                        // 선택된 cmap 이름 표시
+                        $(selectedCmap).text(ctype);
+                        // 선택된 cmap data-caption-id 변경
+                        $(selectedCmap).attr('data-caption-id', ctype);
+                        // select 태그 강제 선택
+                        $(cmapSelector).val(ctype).prop('selected', true);
+                    }
+                });
+                $(this.wrapSelector('#vp_plotCmapSelector')).append(divColor);
+            });
+    
+            // 선택 이벤트
+            $(this.wrapSelector('.vp-plot-cmap-wrapper')).click(function() {
+                $(this).toggleClass('open');
+            });
+        }
+
+        templateForBody() {
+            return `
+                    <div class="vp-grid-box">
+                        <div class="vp-grid-box vp-grid-col-95">
+                            <label for="o0" class="vp-orange-text">Allocate to</label>
+                            <input type="text" class="vp-input input-single" id="o0" index=0 value="fig"/>
+                        </div>
+                        <div class="vp-grid-box vp-grid-col-95">
+                            <label for="subplotsRows">Row</label>
+                            <div class="vp-grid-col-p50">
+                                <input type="range" class="subplot-range" id="subplotsRowsRange" min="0" max="30" value="1"/>
+                                <input type="number" class="vp-input s input-range number-only" id="subplotsRows" index=0 placeholder="row" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" value="1"/>
+                            </div>
+                        </div>
+                        <div class="vp-grid-box vp-grid-col-95">
+                            <label for="subplotsCols">Column</label>
+                            <div class="vp-grid-col-p50">
+                                <input type="range" class="subplot-range" id="subplotsColsRange" min="0" max="30" value="1"/>
+                                <input type="number" class="vp-input s input-range number-only" id="subplotsCols" index=1 placeholder="column" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" value="1"/>
+                            </div>
+                        </div>
+                        <div class="vp-grid-box vp-grid-col-95">
+                            <label for="figsize">Figure Size</label>
+                            <input type="text" class="vp-input input-single" id="figsize" index=0 placeholder="(width, height)"/>
+                        </div>
+                    </div>`;
+        }
+        render() {
+            super.render();
+            
+            // add var selector
+            var varSelector = new VarSelector(['DataFrame', 'Series', 'Index'], 'DataFrame', false);
+            varSelector.setComponentId('i0');
+            varSelector.addClass('vp-state');
+            varSelector.setUseColumn(true);
+            varSelector.setValue(this.state.i0);
+            $(this.wrapSelector('#i0')).replaceWith(varSelector.render());
+        }
+
+        subplotBoxClickHandler(that, event) {
+            var target = event.target;
+            var parent = $(target).parent();
+    
+            // 다음 옵션 페이지 이동
+            var thisPageIdx = $(target).closest(vpConst.OPTION_PAGE).index();
+            vpContainer.tabPageShow(thisPageIdx + 1);
+    
+            // 다음 옵션 페이지의 위치 설명란에 [0,0] 표기
+            var row = $(target).data('row');
+            var col = $(target).data('col');
+            
+            // 표기 : row나 col이 하나라도 1이면 1차원, 그 이상이면 2차원 배열로 접근
+            var position = $(target).data('idx');
+            var rowLen = $(parent).data('row') * 1;
+            var colLen = $(parent).data('col') * 1;
+            
+            if (rowLen > 1 && colLen > 1) { // TODO: parent().data-row / data-col 받아와야댐
+                position = row + ', ' + col;
+            }
+            // 선택한 서브플롯 인덱스 설정
+            that.selectedIdx = position + '';
+    
+            $(that.wrapSelector('span[data-caption-id="pageTitle"]'))[1].innerText = 'Subplot [' + position + '] Setting';
+            $(that.wrapSelector('span[data-caption-id="pageTitle"]'))[2].innerText = 'Subplot [' + position + '] Add Chart';
+        }
+    }
+
+    return Figure;
+});
\ No newline at end of file
diff --git a/js/m_ml/ModelInfo.js b/js/m_ml/ModelInfo.js
index 97d06a99..65053e6c 100644
--- a/js/m_ml/ModelInfo.js
+++ b/js/m_ml/ModelInfo.js
@@ -316,10 +316,13 @@ define([
             let code = new com_String();
             let replaceDict = {'${model}': model};
 
+            // If import code is available, generate its code in front of code
             if (this.state.optionConfig.import != undefined) {
                 code.appendLine(this.state.optionConfig.import);
                 code.appendLine();
             }
+            
+            // Auto-generate model info code
             let modelCode = com_generator.vp_codeGenerator(this, this.state.optionConfig, this.state);
             if (modelCode) {
                 Object.keys(replaceDict).forEach(key => {
@@ -327,11 +330,16 @@ define([
                 });
                 code.append(modelCode);
     
-                let allocateIdx = modelCode.indexOf(' = ');
-                if (allocateIdx >= 0) {
-                    let allocateCode = modelCode.substr(0, allocateIdx);
-                    code.appendLine();
-                    code.append(allocateCode);
+                // Exception for re-generating allocate variables
+                if (!modelCode.includes('plt.show()')) {
+                    // Find allocate variable
+                    let allocateIdx = modelCode.indexOf(' = ');
+                    if (allocateIdx >= 0) {
+                        // if available, show again to display its value
+                        let allocateCode = modelCode.substr(0, allocateIdx);
+                        code.appendLine();
+                        code.append(allocateCode);
+                    }
                 }
             }
 
@@ -390,6 +398,24 @@ define([
                         { name: 'random_state', component: ['input_number'], placeholder: '123', usePair: true },
                         { name: 'importance_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'importances' }
                     ]
+                },
+                'plot_feature_importances': {
+                    name: 'plot_feature_importances',
+                    label: 'Plot feature importances',
+                    code: "def plot_feature_importances(model):\n\
+    n_features = len(model.feature_importances_)\n\
+    feature_names = [ 'X{}'.format(i) for i in range(n_features) ]\n\
+    plt.barh(np.arange(n_features), model.feature_importances_, align='center')\n\
+    plt.yticks(np.arange(n_features), feature_names)\n\
+    plt.xlabel('Feature importance')\n\
+    plt.ylabel('Features')\n\
+    plt.ylim(-1, n_features)\n\
+    plt.show()\n\n\
+plot_feature_importances(${model})",
+                    description: '',
+                    options: [
+
+                    ]
                 }
             }
             switch (category) {
@@ -496,6 +522,7 @@ define([
                             ]
                         },
                         'permutation_importance': defaultInfos['permutation_importance'],
+                        'plot_feature_importances': defaultInfos['plot_feature_importances'],
                         'Coefficient': {
                             name: 'coef_',
                             label: 'Coefficient',
@@ -568,7 +595,8 @@ plt.show()",
                                 { name: 'auc_featureData', label: 'Feature Data', component: ['var_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X_test' }
                             ]
                         },
-                        'permutation_importance': defaultInfos['permutation_importance']
+                        'permutation_importance': defaultInfos['permutation_importance'],
+                        'plot_feature_importances': defaultInfos['plot_feature_importances']
                     }
 
                     // use decision_function on ROC, AUC
diff --git a/js/m_visualize/ChartSetting.js b/js/m_visualize/ChartSetting.js
index 6b13b7d8..29cea980 100644
--- a/js/m_visualize/ChartSetting.js
+++ b/js/m_visualize/ChartSetting.js
@@ -31,7 +31,7 @@ define([
             this.state = {
                 figureWidth: 12,
                 figureHeight: 8,
-                styleSheet: 'seaborn-darkgrid',
+                styleSheet: '',
                 fontName: '',
                 fontSize: 10,
                 ...this.state
@@ -75,6 +75,7 @@ define([
             var code = new com_String(); 
             // FIXME: convert it to kernelApi
             code.appendLine('import matplotlib.pyplot as plt');
+            code.appendLine('%matplotlib inline');
             code.appendLine('import json');
             code.append(`print(json.dumps([{ 'label': s, 'value': s } for s in plt.style.available]))`);
             vpKernel.execute(code.toString()).then(function(resultObj) {
diff --git a/js/m_visualize/Seaborn.js b/js/m_visualize/Seaborn.js
index 3efd8ed9..32498693 100644
--- a/js/m_visualize/Seaborn.js
+++ b/js/m_visualize/Seaborn.js
@@ -21,8 +21,9 @@ define([
     'vp_base/js/com/component/PopupComponent',
     'vp_base/js/com/component/SuggestInput',
     'vp_base/js/com/component/VarSelector2',
-    'vp_base/data/m_visualize/chartLibrary'
-], function(chartHTml, chartCss, com_String, com_generator, com_util, PopupComponent, SuggestInput, VarSelector2, CHART_LIBRARIES) {
+    'vp_base/data/m_visualize/seabornLibrary',
+    'vp_base/js/com/component/DataSelector'
+], function(chartHTml, chartCss, com_String, com_generator, com_util, PopupComponent, SuggestInput, VarSelector2, SEABORN_LIBRARIES, DataSelector) {
 
     class Seaborn extends PopupComponent {
         _init() {
@@ -50,9 +51,10 @@ define([
                 y_label: '',
                 legendPos: '',
                 // style options
-                color: '',
+                useColor: false,
+                color: '#000000',
                 useGrid: '',
-                gridColor: '',
+                gridColor: '#000000',
                 markerStyle: '',
                 // setting options
                 x_limit_from: '',
@@ -66,12 +68,12 @@ define([
                 ...this.state
             }
             
-            this.chartConfig = CHART_LIBRARIES;
+            this.chartConfig = SEABORN_LIBRARIES;
             this.chartTypeList = {
                 'Relational': [ 'scatterplot', 'lineplot' ],
                 'Distributions': [ 'histplot', 'kdeplot', 'rugplot' ], 
                 'Categorical': [ 'stripplot', 'swarmplot', 'boxplot', 'violinplot', 'pointplot', 'barplot' ],
-                // 'ETC': [ ]
+                'ETC': [ 'countplot' ]
             }
 
             this.legendPosList = [
@@ -163,9 +165,9 @@ define([
                     // set Data
                     $(that.wrapSelector('#data')).prop('disabled', false);
 
-                    $(that.wrapSelector('#x')).closest('.vp-vs-box').replaceWith('<select id="x"></select>');
-                    $(that.wrapSelector('#y')).closest('.vp-vs-box').replaceWith('<select id="y"></select>');
-                    $(that.wrapSelector('#hue')).closest('.vp-vs-box').replaceWith('<select id="hue"></select>');
+                    $(that.wrapSelector('#x')).closest('.vp-ds-box').replaceWith('<select id="x"></select>');
+                    $(that.wrapSelector('#y')).closest('.vp-ds-box').replaceWith('<select id="y"></select>');
+                    $(that.wrapSelector('#hue')).closest('.vp-ds-box').replaceWith('<select id="hue"></select>');
                 } else {
                     // set X Y indivisually
                     // disable data selection
@@ -176,26 +178,24 @@ define([
                     that.state.y = '';
                     that.state.hue = '';
 
-                    let varSelectorX = new VarSelector2(that.wrapSelector(), ['DataFrame', 'Series', 'list']);
-                    varSelectorX.setComponentID('x');
-                    varSelectorX.addClass('vp-state vp-input');
-                    varSelectorX.setValue(that.state.x);
-                    $(that.wrapSelector('#x')).replaceWith(varSelectorX.toTagString());
-
-                    let varSelectorY = new VarSelector2(that.wrapSelector(), ['DataFrame', 'Series', 'list']);
-                    varSelectorY.setComponentID('y');
-                    varSelectorY.addClass('vp-state vp-input');
-                    varSelectorY.setValue(that.state.y);
-                    $(that.wrapSelector('#y')).replaceWith(varSelectorY.toTagString());
-
-                    let varSelectorHue = new VarSelector2(that.wrapSelector(), ['DataFrame', 'Series', 'list']);
-                    varSelectorHue.setComponentID('hue');
-                    varSelectorHue.addClass('vp-state vp-input');
-                    varSelectorHue.setValue(that.state.hue);
-                    $(that.wrapSelector('#hue')).replaceWith(varSelectorHue.toTagString());
+                    let dataSelectorX = new DataSelector({ pageThis: that, id: 'x' });
+                    $(that.wrapSelector('#x')).replaceWith(dataSelectorX.toTagString());
+
+                    let dataSelectorY = new DataSelector({ pageThis: that, id: 'y' });
+                    $(that.wrapSelector('#y')).replaceWith(dataSelectorY.toTagString());
+
+                    let dataSelectorHue = new DataSelector({ pageThis: that, id: 'hue' });
+                    $(that.wrapSelector('#hue')).replaceWith(dataSelectorHue.toTagString());
+                    
                 }
             });
 
+            // use color or not
+            $(this.wrapSelector('#useColor')).on('change', function() {
+                that.state.useColor = $(this).prop('checked');
+                $(that.wrapSelector('#color')).prop('disabled', $(this).prop('checked') == false);
+            });
+
             // preview refresh
             $(this.wrapSelector('#previewRefresh')).on('click', function() {
                 that.loadPreview();
@@ -235,28 +235,44 @@ define([
             $(page).find('#chartType').html(chartTypeTag.toString());
 
             // chart variable
-            let varSelector = new VarSelector2(this.wrapSelector());
-            varSelector.setComponentID('data');
-            varSelector.addClass('vp-state vp-input');
-            varSelector.setValue(this.state.data);
-            varSelector.setSelectEvent(function (value, item) {
-                $(this.wrapSelector()).val(value);
-                that.state.dtype = item.dtype;
-
-                if (item.dtype == 'DataFrame') {
-                    $(that.wrapSelector('#x')).prop('disabled', false);
-                    $(that.wrapSelector('#y')).prop('disabled', false);
-                    $(that.wrapSelector('#hue')).prop('disabled', false);
-                    
-                    // bind column source using selected dataframe
-                    com_generator.vp_bindColumnSource(that.wrapSelector(), $(that.wrapSelector('#data')), ['x', 'y', 'hue'], 'select', true, true);
-                } else {
-                    $(that.wrapSelector('#x')).prop('disabled', true);
-                    $(that.wrapSelector('#y')).prop('disabled', true);
-                    $(that.wrapSelector('#hue')).prop('disabled', true);
+            let dataSelector = new DataSelector({
+                type: 'data',
+                pageThis: this,
+                id: 'data',
+                select: function(value, dtype) {
+                    that.state.dtype = dtype;
+
+                    if (dtype == 'DataFrame') {
+                        $(that.wrapSelector('#x')).prop('disabled', false);
+                        $(that.wrapSelector('#y')).prop('disabled', false);
+                        $(that.wrapSelector('#hue')).prop('disabled', false);
+                        
+                        // bind column source using selected dataframe
+                        com_generator.vp_bindColumnSource(that, 'data', ['x', 'y', 'hue'], 'select', true, true);
+                    } else {
+                        $(that.wrapSelector('#x')).prop('disabled', true);
+                        $(that.wrapSelector('#y')).prop('disabled', true);
+                        $(that.wrapSelector('#hue')).prop('disabled', true);
+                    }
+                },
+                finish: function(value, dtype) {
+                    that.state.dtype = dtype;
+
+                    if (dtype == 'DataFrame') {
+                        $(that.wrapSelector('#x')).prop('disabled', false);
+                        $(that.wrapSelector('#y')).prop('disabled', false);
+                        $(that.wrapSelector('#hue')).prop('disabled', false);
+                        
+                        // bind column source using selected dataframe
+                        com_generator.vp_bindColumnSource(that, 'data', ['x', 'y', 'hue'], 'select', true, true);
+                    } else {
+                        $(that.wrapSelector('#x')).prop('disabled', true);
+                        $(that.wrapSelector('#y')).prop('disabled', true);
+                        $(that.wrapSelector('#hue')).prop('disabled', true);
+                    }
                 }
             });
-            $(page).find('#data').replaceWith(varSelector.toTagString());
+            $(page).find('#data').replaceWith(dataSelector.toTagString());
 
             // legend position
             let legendPosTag = new com_String();
@@ -364,7 +380,42 @@ define([
             // set size
             $(this.wrapSelector('.vp-inner-popup-box')).css({ width: 400, height: 260});
 
+            // set code view size
+            $(this.wrapSelector('.vp-popup-codeview-box')).css({
+                'height': '200px'
+            });
+
             this.bindSettingBox();
+
+            // Load chart options
+            if (this.state.setXY) {
+                // disable data selection
+                $(this.wrapSelector('#data')).prop('disabled', true);
+
+                let dataSelectorX = new DataSelector({ pageThis: this, id: 'x' });
+                $(this.wrapSelector('#x')).replaceWith(dataSelectorX.toTagString());
+
+                let dataSelectorY = new DataSelector({ pageThis: this, id: 'y' });
+                $(this.wrapSelector('#y')).replaceWith(dataSelectorY.toTagString());
+
+                let dataSelectorHue = new DataSelector({ pageThis: this, id: 'hue' });
+                $(this.wrapSelector('#hue')).replaceWith(dataSelectorHue.toTagString());
+            } else {
+                if (this.state.dtype == 'DataFrame') {
+                    $(this.wrapSelector('#x')).prop('disabled', false);
+                    $(this.wrapSelector('#y')).prop('disabled', false);
+                    $(this.wrapSelector('#hue')).prop('disabled', false);
+                    
+                    // bind column source using selected dataframe
+                    com_generator.vp_bindColumnSource(this, 'data', ['x', 'y', 'hue'], 'select', true, true);
+                } else {
+                    $(this.wrapSelector('#x')).prop('disabled', true);
+                    $(this.wrapSelector('#y')).prop('disabled', true);
+                    $(this.wrapSelector('#hue')).prop('disabled', true);
+                }
+            }
+            
+            this.loadPreview();
         }
 
         bindSettingBox() {
@@ -455,24 +506,41 @@ define([
             // show variable information on clicking variable
             vpKernel.execute(code).then(function(resultObj) {
                 let { result, type, msg } = resultObj;
-                var textResult = msg.content.data["text/plain"];
-                var htmlResult = msg.content.data["text/html"];
-                var imgResult = msg.content.data["image/png"];
-                
-                $(that.wrapSelector('#chartPreview')).html('');
-                if (htmlResult != undefined) {
-                    // 1. HTML tag
-                    $(that.wrapSelector('#chartPreview')).append(htmlResult);
-                } else if (imgResult != undefined) {
-                    // 2. Image data (base64)
-                    var imgTag = '<img src="data:image/png;base64, ' + imgResult + '">';
-                    $(that.wrapSelector('#chartPreview')).append(imgTag);
-                } else if (textResult != undefined) {
-                    // 3. Text data
-                    var preTag = document.createElement('pre');
-                    $(preTag).text(textResult);
-                    $(that.wrapSelector('#chartPreview')).html(preTag);
+                if (msg.content.data) {
+                    var textResult = msg.content.data["text/plain"];
+                    var htmlResult = msg.content.data["text/html"];
+                    var imgResult = msg.content.data["image/png"];
+                    
+                    $(that.wrapSelector('#chartPreview')).html('');
+                    if (htmlResult != undefined) {
+                        // 1. HTML tag
+                        $(that.wrapSelector('#chartPreview')).append(htmlResult);
+                    } else if (imgResult != undefined) {
+                        // 2. Image data (base64)
+                        var imgTag = '<img src="data:image/png;base64, ' + imgResult + '">';
+                        $(that.wrapSelector('#chartPreview')).append(imgTag);
+                    } else if (textResult != undefined) {
+                        // 3. Text data
+                        var preTag = document.createElement('pre');
+                        $(preTag).text(textResult);
+                        $(that.wrapSelector('#chartPreview')).html(preTag);
+                    }
+                } else {
+                    var errorContent = '';
+                    if (msg.content.ename) {
+                        errorContent = com_util.templateForErrorBox(msg.content.ename, msg.content.evalue);
+                    }
+                    $(that.wrapSelector('#chartPreview')).html(errorContent);
+                    vpLog.display(VP_LOG_TYPE.ERROR, msg.content.ename, msg.content.evalue, msg.content);
+                }
+            }).catch(function(resultObj) {
+                let { msg } = resultObj;
+                var errorContent = '';
+                if (msg.content.ename) {
+                    errorContent = com_util.templateForErrorBox(msg.content.ename, msg.content.evalue);
                 }
+                $(that.wrapSelector('#chartPreview')).html(errorContent);
+                vpLog.display(VP_LOG_TYPE.ERROR, msg.content.ename, msg.content.evalue, msg.content);
             });
         }
 
@@ -492,6 +560,7 @@ define([
                 var fontSize = $(this.wrapSelector('#fontSize')).val();
         
                 code.appendLine('import matplotlib.pyplot as plt');
+                code.appendLine('%matplotlib inline');
                 code.appendLine('import seaborn as sns');
                 code.appendFormatLine("plt.rc('figure', figsize=({0}, {1}))", figWidth, figHeight);
                 if (styleName && styleName.length > 0) {
@@ -514,9 +583,9 @@ define([
 
         generateCode(preview=false) {
             let { 
-                chartType, data, userOption='',
+                chartType, data, x, y, hue, setXY, userOption='', 
                 title, x_label, y_label, legendPos,
-                color, useGrid, gridColor, markerStyle,
+                useColor, color, useGrid, gridColor, markerStyle,
                 x_limit_from, x_limit_to, y_limit_from, y_limit_to,
                 useSampling, sampleCount 
             } = this.state;
@@ -529,7 +598,7 @@ define([
             let chartCode = new com_String();
 
             let etcOptionCode = []
-            if (color != '') {
+            if (useColor == true && color != '') {
                 etcOptionCode.push(com_util.formatString("color='{0}'", color));
             }
             if (markerStyle != '') {
@@ -549,6 +618,29 @@ define([
                 ]
             }
 
+            if (preview && useSampling) {
+                // data sampling code for preview
+                // convertedData = data + '.sample(n=' + sampleCount + ', random_state=0)';
+                // convertedData = com_util.formatString('_vp_sample({0}, {1})', data, sampleCount);
+                // replace pre-defined options
+                // generatedCode = generatedCode.replaceAll(data, convertedData);
+                if (setXY) {
+                    if (x && x != '') {
+                        state.x = com_util.formatString('_vp_sample({0}, {1})', x, sampleCount);
+                    }
+                    if (y && y != '') {
+                        state.y = com_util.formatString('_vp_sample({0}, {1})', y, sampleCount);
+                    }
+                    if (hue && hue != '') {
+                        state.hue = com_util.formatString('_vp_sample({0}, {1})', hue, sampleCount);
+                    }
+                } else {
+                    if (data && data != '') {
+                        state.data = com_util.formatString('_vp_sample({0}, {1})', data, sampleCount);
+                    }
+                }
+            }   
+
             let generatedCode = com_generator.vp_codeGenerator(this, config, state, etcOptionCode.join(', '));
 
             // Info
@@ -576,7 +668,7 @@ define([
             if (useGrid != '') {
                 gridCodeList.push(useGrid);
             }
-            if (gridColor != '') {
+            if (useGrid == 'True' && gridColor != '') {
                 gridCodeList.push(com_util.formatString("color='{0}'", gridColor));
             }
             if (gridCodeList.length > 0) {
@@ -586,28 +678,18 @@ define([
 
             let convertedData = data;
             if (preview) {
-                // set indent
-                indent = ' '.repeat(4);
-
                 // Ignore warning
                 code.appendLine('import warnings');
                 code.appendLine('with warnings.catch_warnings():');
-                code.appendFormatLine("{0}warnings.simplefilter('ignore')", indent);
+                code.appendLine("    warnings.simplefilter('ignore')");
 
                 // set figure size for preview chart
                 let defaultWidth = 8;
                 let defaultHeight = 6;
-                code.appendFormatLine('{0}plt.figure(figsize=({1}, {2}))', indent, defaultWidth, defaultHeight);
-                if (useSampling) {
-                    // data sampling code for preview
-                    convertedData = data + '.sample(n=' + sampleCount + ', random_state=0)';
-                    // replace pre-defined options
-                    generatedCode = generatedCode.replaceAll(data, convertedData);
-                }   
-
-                code.appendFormatLine("{0}{1}", indent, generatedCode);
-                code.appendFormatLine("{0}{1}", indent, chartCode.toString().replaceAll('\n', '\n' + indent));
-                
+                code.appendFormatLine('plt.figure(figsize=({0}, {1}))', defaultWidth, defaultHeight);
+
+                code.appendLine(generatedCode);
+                code.appendLine(chartCode.toString());
             } else {
                 code.appendLine(generatedCode);
                 code.appendLine(chartCode.toString());
diff --git a/js/m_visualize/WordCloud.js b/js/m_visualize/WordCloud.js
new file mode 100644
index 00000000..922fe14e
--- /dev/null
+++ b/js/m_visualize/WordCloud.js
@@ -0,0 +1,342 @@
+/*
+ *    Project Name    : Visual Python
+ *    Description     : GUI-based Python code generator
+ *    File Name       : WordCloud.js
+ *    Author          : Black Logic
+ *    Note            : Visualization > WordCloud
+ *    License         : GNU GPLv3 with Visual Python special exception
+ *    Date            : 2022. 05. 16
+ *    Change Date     :
+ */
+
+//============================================================================
+// [CLASS] WordCloud
+//============================================================================
+define([
+    'text!vp_base/html/m_visualize/wordCloud.html!strip',
+    'css!vp_base/css/m_visualize/wordCloud.css',
+    'vp_base/js/com/com_String',
+    'vp_base/js/com/com_util',
+    'vp_base/js/com/component/PopupComponent',
+    'vp_base/js/com/component/SuggestInput',
+    'vp_base/js/com/component/FileNavigation',
+    'vp_base/js/com/component/DataSelector'
+], function(wcHTML, wcCss, com_String, com_util, PopupComponent, SuggestInput, FileNavigation, DataSelector) {
+
+    class WordCloud extends PopupComponent {
+        _init() {
+            super._init();
+
+            this.config.size = { width: 1064, height: 550 };
+            this.config.installButton = true;
+            this.config.importButton = true;
+            this.config.dataview = false;
+
+            this.state = {
+                data: '',
+                useFile: false,
+                encoding: '',
+                wordCount: '200',
+                stopWords: '',
+                fontPath: '',
+                userOption: '', 
+                figWidth: '8',
+                figHeight: '20',
+                autoRefresh: true,
+                ...this.state
+            }
+        }
+
+        _bindEvent() {
+            super._bindEvent();
+
+            let that = this;
+            // open file event for data
+            $(this.wrapSelector('#vp_wcOpenFile')).on('click', function() {
+                let fileNavi = new FileNavigation({
+                    type: 'open',
+                    extensions: [ 'txt' ],
+                    finish: function(filesPath, status, error) {
+                        let {file, path} = filesPath[0];
+                        that.state.data = path;
+
+                        that.state.useFile = true;
+                        $(that.wrapSelector('.vp-wc-file-option')).show();
+
+                        // set text
+                        $(that.wrapSelector('#data')).val(path);
+                        $(that.wrapSelector('#data')).trigger('change');
+                    }
+                });
+                fileNavi.open();
+            });
+
+            // change tab
+            $(this.wrapSelector('.vp-tab-item')).on('click', function() {
+                let type = $(this).data('type'); // data / wordcloud / plot
+
+                $(that.wrapSelector('.vp-tab-bar .vp-tab-item')).removeClass('vp-focus');
+                $(this).addClass('vp-focus');
+
+                $(that.wrapSelector('.vp-tab-page-box > .vp-tab-page')).hide();
+                $(that.wrapSelector(com_util.formatString('.vp-tab-page[data-type="{0}"]', type))).show();
+            });
+
+            // load preview
+            $(document).off('change', this.wrapSelector('.vp-state'));
+            $(document).on('change', this.wrapSelector('.vp-state'), function(evt) {
+                that._saveSingleState($(this)[0]);
+                if (that.state.autoRefresh) {
+                    that.loadPreview();
+                }
+                evt.stopPropagation();
+            });
+
+        }
+
+        templateForBody() {
+            let page = $(wcHTML);
+
+            if (this.state.useFile == true) {
+                $(page).find('.vp-wc-file-option').show();
+            } else {
+                $(page).find('.vp-wc-file-option').hide();
+            }
+
+            let that = this;
+            //================================================================
+            // Load state
+            //================================================================
+            Object.keys(this.state).forEach(key => {
+                let tag = $(page).find('#' + key);
+                let tagName = $(tag).prop('tagName'); // returns with UpperCase
+                let value = that.state[key];
+                if (value == undefined) {
+                    return;
+                }
+                switch(tagName) {
+                    case 'INPUT':
+                        let inputType = $(tag).prop('type');
+                        if (inputType == 'text' || inputType == 'number' || inputType == 'hidden') {
+                            $(tag).val(value);
+                            break;
+                        }
+                        if (inputType == 'checkbox') {
+                            $(tag).prop('checked', value);
+                            break;
+                        }
+                        break;
+                    case 'TEXTAREA':
+                    case 'SELECT':
+                    default:
+                        $(tag).val(value);
+                        break;
+                }
+            });
+
+            return page;
+        }
+
+        render() {
+            super.render();
+
+            let that = this;
+
+            // Add style
+            $(this.wrapSelector('.vp-popup-body-top-bar')).css({
+                'position': 'absolute',
+                'left': 'calc(50% - 250px)'
+            });
+            $(this.wrapSelector('.vp-popup-codeview-box')).css({
+                'height': '200px'
+            });
+
+            // bind dataSelector to #data
+            let dataSelector = new DataSelector({
+                type: 'data',
+                pageThis: this,
+                id: 'data',
+                select: function() {
+                    that.state.useFile = false;
+                    $(that.wrapSelector('.vp-wc-file-option')).hide();
+                },
+                finish: function() {
+                    that.state.useFile = false;
+                    $(that.wrapSelector('.vp-wc-file-option')).hide();
+                }
+            });
+            $(this.wrapSelector('#data')).replaceWith(dataSelector.toTagString());
+    
+            // System font suggestinput
+            var fontFamilyTag = $(this.wrapSelector('#fontPath'));
+            // search system font list
+            var code = new com_String(); 
+            // FIXME: convert it to kernelApi
+            code.appendLine('import json'); 
+            code.appendLine("import matplotlib.font_manager as fm");
+            code.appendLine("_ttflist = fm.fontManager.ttflist");
+            code.append("print(json.dumps([{'label': f.name, 'value': f.fname.replace('\\\\', '/') } for f in _ttflist]))");
+            vpKernel.execute(code.toString()).then(function(resultObj) {
+                let { result } = resultObj;
+                // get available font list
+                var varList = JSON.parse(result);
+                var suggestInput = new SuggestInput();
+                suggestInput.setComponentID('fontPath');
+                suggestInput.addClass('vp-input vp-state');
+                suggestInput.setSuggestList(function() { return varList; });
+                suggestInput.setPlaceholder('font path');
+                suggestInput.setValue(that.state.fontPath);
+                // suggestInput.setNormalFilter(false);
+                $(fontFamilyTag).replaceWith(function() {
+                    return suggestInput.toTagString();
+                });
+            });
+
+            // encoding suggest input
+            $(this.wrapSelector('#encoding')).replaceWith(function() {
+                // encoding list : utf8 cp949 ascii
+                var encodingList = ['utf8', 'cp949', 'ascii'];
+                var suggestInput = new SuggestInput();
+                suggestInput.setComponentID('encoding');
+                suggestInput.addClass('vp-input vp-state');
+                suggestInput.setSuggestList(function() { return encodingList; });
+                suggestInput.setPlaceholder('encoding option');
+                return suggestInput.toTagString();
+            });
+
+            this.loadPreview();
+        }
+
+        loadPreview() {
+            let that = this;
+            let code = this.generateCode(true);
+
+            // show variable information on clicking variable
+            vpKernel.execute(code).then(function(resultObj) {
+                let { result, type, msg } = resultObj;
+                if (msg.content.data) {
+                    var textResult = msg.content.data["text/plain"];
+                    var htmlResult = msg.content.data["text/html"];
+                    var imgResult = msg.content.data["image/png"];
+                    
+                    $(that.wrapSelector('#vp_wcPreview')).html('');
+                    if (htmlResult != undefined) {
+                        // 1. HTML tag
+                        $(that.wrapSelector('#vp_wcPreview')).append(htmlResult);
+                    } else if (imgResult != undefined) {
+                        // 2. Image data (base64)
+                        var imgTag = '<img src="data:image/png;base64, ' + imgResult + '">';
+                        $(that.wrapSelector('#vp_wcPreview')).append(imgTag);
+                    } else if (textResult != undefined) {
+                        // 3. Text data
+                        var preTag = document.createElement('pre');
+                        $(preTag).text(textResult);
+                        $(that.wrapSelector('#vp_wcPreview')).html(preTag);
+                    }
+                } else {
+                    var errorContent = '';
+                    if (msg.content.ename) {
+                        errorContent = com_util.templateForErrorBox(msg.content.ename, msg.content.evalue);
+                    }
+                    $(that.wrapSelector('#vp_wcPreview')).html(errorContent);
+                    vpLog.display(VP_LOG_TYPE.ERROR, msg.content.ename, msg.content.evalue, msg.content);
+                }
+            }).catch(function(resultObj) {
+                let { msg } = resultObj;
+                var errorContent = '';
+                if (msg.content.ename) {
+                    errorContent = com_util.templateForErrorBox(msg.content.ename, msg.content.evalue);
+                }
+                $(that.wrapSelector('#vp_wcPreview')).html(errorContent);
+                vpLog.display(VP_LOG_TYPE.ERROR, msg.content.ename, msg.content.evalue, msg.content);
+            });
+        }
+
+        generateInstallCode() {
+            return ['!pip install wordcloud'];
+        }
+
+        generateImportCode() {
+            var code = new com_String();
+            code.appendLine('from wordcloud import WordCloud'); // need to be installed
+
+            code.appendLine('from collections import Counter');
+            code.appendLine('import matplotlib.pyplot as plt');
+            code.append('%matplotlib inline');
+            return [code.toString()];
+        }
+
+        generateCode(preview=false) {
+            let { 
+                data, data_state, useFile, encoding, wordCount, 
+                stopWords, fontPath, userOption, figWidth, figHeight 
+            } = this.state;
+            let code = new com_String();
+            
+            // preview option
+            if (preview) {
+                // Ignore warning
+                code.appendLine('import warnings');
+                code.appendLine('with warnings.catch_warnings():');
+                code.appendLine("    warnings.simplefilter('ignore')");
+            }
+
+            // counter for top limit
+            let dataVariable = data;
+            if (useFile) {
+                code.appendFormat("with open('{0}', 'rt'", data);
+                if (encoding && encoding != '') {
+                    code.appendFormat(", encoding='{0}'", encoding);
+                }
+                code.appendLine(") as fp:");
+                code.appendLine("    word_cloud_text = fp.read()");
+                code.appendLine();
+                dataVariable = 'word_cloud_text';
+            } else {
+                // check data type and convert it to string
+                // let dataType = $(this.wrapSelector('#data')).data('type');
+                let dataType = '';
+                if (data_state) {
+                    dataType = data_state['returnDataType'];
+                }
+                if (dataType == 'DataFrame' || dataType == 'Series') {
+                    dataVariable = data + '.to_string()';
+                }
+            }
+            code.appendFormatLine("counts = Counter({0}.split())", dataVariable);
+            code.appendFormatLine("tags = counts.most_common({0})", wordCount);
+            code.appendLine();
+
+            // create wordcloud FIXME:
+            let options=[];
+            options.push("max_font_size=200");
+            options.push("background_color='white'");
+            options.push("width=1000, height=800");
+
+            if (stopWords && stopWords != '') {
+                options.push(com_util.formatString("stopwords=['{0}']", stopWords.split(',').join("','")));
+            }
+            if (fontPath && fontPath != '') {
+                options.push(com_util.formatString("font_path='{0}'", fontPath));
+            }
+            if (userOption && userOption != '') {
+                options.push(', ' + userOption);
+            }
+
+            code.appendFormatLine("wc = WordCloud({0})", options.join(', '));
+            code.appendLine("cloud = wc.generate_from_frequencies(dict(tags))");
+            code.appendLine();
+            
+            // use plot to show 
+            code.appendFormatLine("plt.figure(figsize=({0}, {1}))", figWidth, figHeight);
+            code.appendLine("plt.imshow(cloud)");
+            code.appendLine("plt.tight_layout(pad=0)");
+            code.appendLine("plt.axis('off')");
+            code.appendLine("plt.show()");
+    
+            return code.toString();
+        }
+    }
+
+    return WordCloud;
+});
\ No newline at end of file
diff --git a/python/printCommand.py b/python/printCommand.py
index 16ab1d7c..9b944f48 100644
--- a/python/printCommand.py
+++ b/python/printCommand.py
@@ -1,7 +1,18 @@
 # Libraries
+import numpy as _vp_np
 import json as _vp_json
 import warnings as _vp_warnings
 
+class _VpNpEncoder(_vp_json.JSONEncoder):
+    def default(self, obj):
+        if isinstance(obj, _vp_np.integer):
+            return int(obj)
+        if isinstance(obj, _vp_np.floating):
+            return float(obj)
+        if isinstance(obj, _vp_np.ndarray):
+            return obj.tolist()
+        return super(_VpNpEncoder, self).default(obj)
+
 def _vp_print(command):
     """
     Print with json.dumps
@@ -9,4 +20,4 @@ def _vp_print(command):
     """
     with _vp_warnings.catch_warnings():
         _vp_warnings.simplefilter(action='ignore', category=FutureWarning)
-        print(_vp_json.dumps(command, ensure_ascii=False))
\ No newline at end of file
+        print(_vp_json.dumps(command, ensure_ascii=False, cls=_VpNpEncoder))
\ No newline at end of file
diff --git a/python/userCommand.py b/python/userCommand.py
index a9a73425..a475fc02 100644
--- a/python/userCommand.py
+++ b/python/userCommand.py
@@ -1,5 +1,5 @@
-import pandas as pd
-import numpy as np
+import pandas as _vp_pd
+import numpy as _vp_np
 import fitz
 import nltk
 nltk.download('punkt')
@@ -8,7 +8,7 @@ def vp_pdf_get_sentence(fname_lst):
     '''
     Get sentence from pdf file by PyMuPDF
     '''
-    df = pd.DataFrame()
+    df = _vp_pd.DataFrame()
     for fname in fname_lst:
         if fname.split('.')[-1] != 'pdf': continue
         try:
@@ -27,19 +27,19 @@ def vp_pdf_get_sentence(fname_lst):
             print(e)
             continue
             
-        df_doc = pd.DataFrame({
+        df_doc = _vp_pd.DataFrame({
             'fname': fname.split('/')[-1],
             'sentence': sentence_lst
         })
-        df = pd.concat([df,df_doc])
+        df = _vp_pd.concat([df,df_doc])
         
     return df.reset_index().drop('index', axis=1)
 
 def vp_drop_outlier(df, col, weight=1.5):
     sr = df[col]
     
-    q25 = np.percentile(sr.values, 25)
-    q75 = np.percentile(sr.values, 75)
+    q25 = _vp_np.percentile(sr.values, 25)
+    q75 = _vp_np.percentile(sr.values, 75)
     
     iqr   = q75 - q25
     iqr_w = iqr * weight
diff --git a/python/variableCommand.py b/python/variableCommand.py
index 0812cdbf..22975e77 100644
--- a/python/variableCommand.py
+++ b/python/variableCommand.py
@@ -51,12 +51,20 @@ def _vp_get_variables_list(types, exclude_types=[]):
     varList = []
     searchList = globals()
     if (type(types) == list) and (len(types) > 0):
-        varList = [{'varName': v, 'varType': type(eval(v)).__name__} for v in searchList if (not v.startswith('_')) & (v not in _VP_NOT_USING_VAR) & (type(eval(v)).__name__ not in exclude_types) & (type(eval(v)).__name__ in types)]
+        varList = [{'varName': v, 'varType': type(eval(v)).__name__, 'varInfo': _vp_get_variable_info(eval(v))} for v in searchList if (not v.startswith('_')) & (v not in _VP_NOT_USING_VAR) & (type(eval(v)).__name__ not in exclude_types) & (type(eval(v)).__name__ in types)]
     else:
-        varList = [{'varName': v, 'varType': type(eval(v)).__name__} for v in searchList if (not v.startswith('_')) & (v not in _VP_NOT_USING_VAR) & (type(eval(v)).__name__ not in exclude_types) & (type(eval(v)).__name__ not in _VP_NOT_USING_TYPES)]
+        varList = [{'varName': v, 'varType': type(eval(v)).__name__, 'varInfo': _vp_get_variable_info(eval(v))} for v in searchList if (not v.startswith('_')) & (v not in _VP_NOT_USING_VAR) & (type(eval(v)).__name__ not in exclude_types) & (type(eval(v)).__name__ not in _VP_NOT_USING_TYPES)]
 
     return varList
 
+def _vp_get_variable_info(v):
+    """
+    Get Variable's detailed information
+    """
+    if type(v).__name__ == 'ndarray':
+        return {'ndim': v.ndim}
+    return {}
+
 def _vp_get_profiling_list():
     """
     Get profiling variable list
@@ -68,4 +76,19 @@ def _vp_get_profiling_list():
         result.append({ 'varName': v['varName'], 'title': title })
 
     return result
-    
\ No newline at end of file
+
+import numpy as _vp_np
+import random as _vp_rd
+def _vp_sample(data, sample_cnt):
+    dataType = type(data).__name__
+    sample_cnt = len(data) if len(data) < sample_cnt else sample_cnt
+
+    if dataType == 'DataFrame':
+        return data.sample(sample_cnt)
+    elif dataType == 'Series':
+        return data.sample(sample_cnt)
+    elif dataType == 'ndarray':
+        return data[_vp_np.random.choice(data.shape[0], sample_cnt, replace=False)]
+    elif dataType == 'list':
+        return _vp_rd.choices(data, k=sample_cnt)
+    return data
\ No newline at end of file


Test patch:
diff --git a/data/libraries_test.json b/data/libraries_test.json
deleted file mode 100644
index 99b476eb..00000000
--- a/data/libraries_test.json
+++ /dev/null
@@ -1,3292 +0,0 @@
-{
-    "library": {
-        "version": "0.0.1",
-        "item": [
-            {
-                "id"   : "com_setting",
-                "type" : "function",
-                "level": 0,
-                "name" : "Setting",
-                "tag"  : "SETTING",
-                "path" : "visualpython - setting",
-                "desc" : "Settings for visual python",
-                "file" : "file_io/settings"
-            },
-            {
-                "id"   : "com_pip",
-                "type" : "function",
-                "level": 0,
-                "name" : "Package Management",
-                "tag"  : "PIP,INSTALL,UPDATE,PYTHON INSTALL PACKAGE",
-                "path" : "visualpython - pip",
-                "desc" : "Settings for visual python",
-                "file" : "file_io/pip"
-            },
-            {
-                "id"   : "pkg_logic",
-                "type" : "package",
-                "level": 0,
-                "name" : "Logic",
-                "path" : "visualpython - logic",
-                "desc" : "Python logic operations",
-                "item" : [
-                    {
-                        "id"   : "log_define",
-                        "type" : "package",
-                        "level": 1,
-                        "name" : "Define",
-                        "path" : "visualpython - logic - define",
-                        "desc" : "Define class or function",
-                        "open" : true,
-                        "item" : [
-                            {
-                                "id"   : "lgDef_class",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "class",
-                                "tag"  : "CLASS,LOGIC",
-                                "path" : "visualpython - logic - define - class",
-                                "desc" : "Define class",
-                                "file" : "m_logic/Class"
-                            },
-                            {
-                                "id"   : "lgDef_def",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "def",
-                                "tag"  : "DEF,FUNCTION,LOGIC",
-                                "path" : "visualpython - logic - define - function",
-                                "desc" : "Define function",
-                                "file" : "m_logic/Def"
-                            }
-                        ]
-                    },
-                    {
-                        "id"   : "log_control",
-                        "type" : "package",
-                        "level": 1,
-                        "name" : "Control",
-                        "path" : "visualpython - logic - control",
-                        "desc" : "Control grammars",
-                        "open" : true,
-                        "item" : [
-                            {
-                                "id"   : "lgCtrl_for",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "for",
-                                "tag"  : "FOR LOOP,LOGIC",
-                                "path" : "visualpython - logic - control - for",
-                                "desc" : "for loop",
-                                "file" : "m_logic/For"
-                            },
-                            {
-                                "id"   : "lgCtrl_while",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "while",
-                                "tag"  : "WHILE LOOP,LOGIC",
-                                "path" : "visualpython - logic - control - while",
-                                "desc" : "while loop",
-                                "file" : "m_logic/While"
-                            },
-                            {
-                                "id"   : "lgCtrl_if",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "if",
-                                "tag"  : "IF,LOGIC",
-                                "path" : "visualpython - logic - control - if",
-                                "desc" : "if",
-                                "file" : "m_logic/If"
-                            },
-                            {
-                                "id"   : "lgCtrl_try",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "try",
-                                "tag"  : "TRY CATCH EXCEPT,FINALLY,EXCEPTION,HANDLE ERROR,LOGIC",
-                                "path" : "visualpython - logic - control - try",
-                                "desc" : "try except",
-                                "file" : "m_logic/Try"
-                            },
-                            {
-                                "id"   : "lgCtrl_return",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "return",
-                                "tag"  : "RETURN,LOGIC",
-                                "path" : "visualpython - logic - control - return",
-                                "desc" : "return variables",
-                                "file" : "m_logic/Return"
-                            },
-                            {
-                                "id"   : "lgCtrl_continue",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "continue",
-                                "tag"  : "CONTINUE,LOGIC",
-                                "path" : "visualpython - logic - execute - continue",
-                                "desc" : "continue on loop",
-                                "file" : "m_logic/Continue"
-                            },
-                            {
-                                "id"   : "lgCtrl_break",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "break",
-                                "tag"  : "BREAK,LOGIC",
-                                "path" : "visualpython - logic - execute - break",
-                                "desc" : "break on loop",
-                                "file" : "m_logic/Break"
-                            },
-                            {
-                                "id"   : "lgCtrl_pass",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "pass",
-                                "tag"  : "PASS,LOGIC",
-                                "path" : "visualpython - logic - execute - pass",
-                                "desc" : "pass",
-                                "file" : "m_logic/Pass"
-                            },
-                            {
-                                "id"   : "lgCtrl_except",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "except",
-                                "tag"  : "TRY CATCH EXCEPT,FINALLY,EXCEPTION,HANDLE ERROR,LOGIC",
-                                "path" : "visualpython - logic - control - except",
-                                "desc" : "try except",
-                                "file" : "m_logic/Except",
-                                "hide" : true
-                            },
-                            {
-                                "id"   : "lgCtrl_finally",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "finally",
-                                "tag"  : "TRY CATCH EXCEPT,FINALLY,EXCEPTION,HANDLE ERROR,LOGIC",
-                                "path" : "visualpython - logic - control - finally",
-                                "desc" : "try finally",
-                                "file" : "m_logic/Finally",
-                                "hide" : true
-                            },
-                            {
-                                "id"   : "lgCtrl_elif",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "elif",
-                                "tag"  : "ELIF,LOGIC",
-                                "path" : "visualpython - logic - control - elif",
-                                "desc" : "elif",
-                                "file" : "m_logic/Elif",
-                                "hide" : true
-                            },
-                            {
-                                "id"   : "lgCtrl_else",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "else",
-                                "tag"  : "ELSE,LOGIC",
-                                "path" : "visualpython - logic - control - else",
-                                "desc" : "else",
-                                "file" : "m_logic/Else",
-                                "hide" : true
-                            }
-                        ]
-                    },
-                    {
-                        "id"   : "log_execute",
-                        "type" : "package",
-                        "level": 1,
-                        "name" : "Execute",
-                        "path" : "visualpython - logic - execute",
-                        "desc" : "Executing codes",
-                        "open" : true,
-                        "item" : [
-                            {
-                                "id"   : "lgExe_lambda",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "lambda",
-                                "tag"  : "LAMBDA,EXECUTE,LOGIC",
-                                "path" : "visualpython - logic - execute - lambda",
-                                "desc" : "lambda",
-                                "file" : "m_logic/Lambda"
-                            },
-                            {
-                                "id"   : "lgExe_code",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "code",
-                                "tag"  : "CODE,EDITOR,LOGIC",
-                                "path" : "visualpython - logic - execute - code",
-                                "desc" : "code editor",
-                                "file" : "m_logic/Code"
-                            },
-                            {
-                                "id"   : "lgExe_print",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "print",
-                                "tag"  : "PRINT,LOGIC",
-                                "path" : "visualpython - logic - execute - print",
-                                "desc" : "print",
-                                "file" : "m_logic/Print"
-                            },
-                            {
-                                "id"   : "lgExe_comment",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "comment",
-                                "tag"  : "COMMENT,LOGIC",
-                                "path" : "visualpython - logic - execute - comment",
-                                "desc" : "comment",
-                                "file" : "m_logic/Comment"
-                            }
-                        ]
-                    }
-                ]
-            },
-            {
-                "id"   : "pkg_library",
-                "type" : "package",
-                "level": 0,
-                "name" : "Library",
-                "path" : "visualpython - library",
-                "desc" : "Libraries",
-                "item" : [
-                    {
-                        "id"   : "lib_python",
-                        "type" : "package",
-                        "level": 1,
-                        "name" : "Python",
-                        "path" : "visualpython - library - python",
-                        "desc" : "Python operations",
-                        "item" : [
-                            {
-                                "id": "python_builtInFunctions",
-                                "type": "package",
-                                "level": 2,
-                                "name": "Built-in functions",
-                                "path": "visualpython - library - python - built in function",
-                                "desc": "",
-                                "item": [
-                                    {
-                                        "id": "pyBuilt_abs",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "abs",
-                                        "path": "visualpython - library - python - built in functions - abs",
-                                        "desc": "",
-                                        "tag": "PYTHON, ABS",
-                                        "file": "m_library/m_python/abs",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_all",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "all",
-                                        "path": "visualpython - library - python - built in functions - all",
-                                        "desc": "",
-                                        "tag": "PYTHON, ALL",
-                                        "file": "m_library/m_python/all",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_any",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "any",
-                                        "path": "visualpython - library - python - built in functions - any",
-                                        "desc": "",
-                                        "tag": "PYTHON, ANY",
-                                        "file": "m_library/m_python/any",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_ascii",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "ascii",
-                                        "path": "visualpython - library - python - built in functions - ascii",
-                                        "desc": "",
-                                        "tag": "PYTHON, ASCII",
-                                        "file": "m_library/m_python/ascii",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_bin",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "bin",
-                                        "path": "visualpython - library - python - built in functions - bin",
-                                        "desc": "",
-                                        "tag": "PYTHON, BIN",
-                                        "file": "m_library/m_python/bin",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_bool",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "bool",
-                                        "path": "visualpython - library - python - built in functions - bool",
-                                        "desc": "",
-                                        "tag": "PYTHON, BOOL",
-                                        "file": "m_library/m_python/bool",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_breakpoint",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "breakpoint",
-                                        "path": "visualpython - library - python - built in functions - breakpoint",
-                                        "desc": "",
-                                        "tag": "PYTHON, BREAKPOINT",
-                                        "file": "m_library/m_python/breakpoint",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_bytearray",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "bytearray",
-                                        "path": "visualpython - library - python - built in functions - bytearray",
-                                        "desc": "",
-                                        "tag": "PYTHON, BYTEARRAY",
-                                        "file": "m_library/m_python/bytearray",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_bytes",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "bytes",
-                                        "path": "visualpython - library - python - built in functions - bytes",
-                                        "desc": "",
-                                        "tag": "PYTHON, BYTES",
-                                        "file": "m_library/m_python/bytes",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_callable",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "callable",
-                                        "path": "visualpython - library - python - built in functions - callable",
-                                        "desc": "",
-                                        "tag": "PYTHON, CALLABLE",
-                                        "file": "m_library/m_python/callable",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_chr",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "chr",
-                                        "path": "visualpython - library - python - built in functions - chr",
-                                        "desc": "",
-                                        "tag": "PYTHON, CHR",
-                                        "file": "m_library/m_python/chr",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_classmethod",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "classmethod",
-                                        "path": "visualpython - library - python - built in functions - classmethod",
-                                        "desc": "",
-                                        "tag": "PYTHON, CLASSMETHOD",
-                                        "file": "m_library/m_python/classmethod",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_complex",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "complex",
-                                        "path": "visualpython - library - python - built in functions - complex",
-                                        "desc": "",
-                                        "tag": "PYTHON, COMPLEX",
-                                        "file": "m_library/m_python/complex",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_delattr",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "delattr",
-                                        "path": "visualpython - library - python - built in functions - delattr",
-                                        "desc": "",
-                                        "tag": "PYTHON, DELATTR",
-                                        "file": "m_library/m_python/delattr",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_dict",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "dict",
-                                        "path": "visualpython - library - python - built in functions - dict",
-                                        "desc": "",
-                                        "tag": "PYTHON, DICT",
-                                        "file": "m_library/m_python/dict",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_dir",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "dir",
-                                        "path": "visualpython - library - python - built in functions - dir",
-                                        "desc": "",
-                                        "tag": "PYTHON, DIR",
-                                        "file": "m_library/m_python/dir",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_divmod",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "divmod",
-                                        "path": "visualpython - library - python - built in functions - divmod",
-                                        "desc": "",
-                                        "tag": "PYTHON, DIVMOD",
-                                        "file": "m_library/m_python/divmod",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_enumerate",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "enumerate",
-                                        "path": "visualpython - library - python - built in functions - enumerate",
-                                        "desc": "",
-                                        "tag": "PYTHON, ENUMERATE",
-                                        "file": "m_library/m_python/enumerate",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_eval",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "eval",
-                                        "path": "visualpython - library - python - built in functions - eval",
-                                        "desc": "",
-                                        "tag": "PYTHON, EVAL",
-                                        "file": "m_library/m_python/eval",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_exec",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "exec",
-                                        "path": "visualpython - library - python - built in functions - exec",
-                                        "desc": "",
-                                        "tag": "PYTHON, EXEC",
-                                        "file": "m_library/m_python/exec",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_filter",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "filter",
-                                        "path": "visualpython - library - python - built in functions - filter",
-                                        "desc": "",
-                                        "tag": "PYTHON, FILTER",
-                                        "file": "m_library/m_python/filter",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_float",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "float",
-                                        "path": "visualpython - library - python - built in functions - float",
-                                        "desc": "",
-                                        "tag": "PYTHON, FLOAT",
-                                        "file": "m_library/m_python/float",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_format",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "format",
-                                        "path": "visualpython - library - python - built in functions - format",
-                                        "desc": "",
-                                        "tag": "PYTHON, FORMAT",
-                                        "file": "m_library/m_python/format",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_frozenset",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "frozenset",
-                                        "path": "visualpython - library - python - built in functions - frozenset",
-                                        "desc": "",
-                                        "tag": "PYTHON, FROZENSET",
-                                        "file": "m_library/m_python/frozenset",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_getattr",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "getattr",
-                                        "path": "visualpython - library - python - built in functions - getattr",
-                                        "desc": "",
-                                        "tag": "PYTHON, GETATTR",
-                                        "file": "m_library/m_python/getattr",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_globals",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "globals",
-                                        "path": "visualpython - library - python - built in functions - globals",
-                                        "desc": "",
-                                        "tag": "PYTHON, GLOBALS",
-                                        "file": "m_library/m_python/globals",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_hasattr",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "hasattr",
-                                        "path": "visualpython - library - python - built in functions - hasattr",
-                                        "desc": "",
-                                        "tag": "PYTHON, HASATTR",
-                                        "file": "m_library/m_python/hasattr",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_hash",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "hash",
-                                        "path": "visualpython - library - python - built in functions - hash",
-                                        "desc": "",
-                                        "tag": "PYTHON, HASH",
-                                        "file": "m_library/m_python/hash",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_help",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "help",
-                                        "path": "visualpython - library - python - built in functions - help",
-                                        "desc": "",
-                                        "tag": "PYTHON, HELP",
-                                        "file": "m_library/m_python/help",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_hex",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "hex",
-                                        "path": "visualpython - library - python - built in functions - hex",
-                                        "desc": "",
-                                        "tag": "PYTHON, HEX",
-                                        "file": "m_library/m_python/hex",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_id",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "id",
-                                        "path": "visualpython - library - python - built in functions - id",
-                                        "desc": "",
-                                        "tag": "PYTHON, ID",
-                                        "file": "m_library/m_python/id",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_input",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "input",
-                                        "path": "visualpython - library - python - built in functions - input",
-                                        "desc": "",
-                                        "tag": "PYTHON, INPUT",
-                                        "file": "m_library/m_python/input",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_int",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "int",
-                                        "path": "visualpython - library - python - built in functions - int",
-                                        "desc": "",
-                                        "tag": "PYTHON, INT",
-                                        "file": "m_library/m_python/int",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_isinstance",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "isinstance",
-                                        "path": "visualpython - library - python - built in functions - isinstance",
-                                        "desc": "",
-                                        "tag": "PYTHON, ISINSTANCE",
-                                        "file": "m_library/m_python/isinstance",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_issubclass",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "issubclass",
-                                        "path": "visualpython - library - python - built in functions - issubclass",
-                                        "desc": "",
-                                        "tag": "PYTHON, ISSUBCLASS",
-                                        "file": "m_library/m_python/issubclass",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_iter",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "iter",
-                                        "path": "visualpython - library - python - built in functions - iter",
-                                        "desc": "",
-                                        "tag": "PYTHON, ITER",
-                                        "file": "m_library/m_python/iter",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_len",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "len",
-                                        "path": "visualpython - library - python - built in functions - len",
-                                        "desc": "",
-                                        "tag": "PYTHON, LEN",
-                                        "file": "m_library/m_python/len",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_list",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "list",
-                                        "path": "visualpython - library - python - built in functions - list",
-                                        "desc": "",
-                                        "tag": "PYTHON, LIST",
-                                        "file": "m_library/m_python/list",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_locals",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "locals",
-                                        "path": "visualpython - library - python - built in functions - locals",
-                                        "desc": "",
-                                        "tag": "PYTHON, LOCALS",
-                                        "file": "m_library/m_python/locals",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_map",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "map",
-                                        "path": "visualpython - library - python - built in functions - map",
-                                        "desc": "",
-                                        "tag": "PYTHON, MAP",
-                                        "file": "m_library/m_python/map",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_max",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "max",
-                                        "path": "visualpython - library - python - built in functions - max",
-                                        "desc": "",
-                                        "tag": "PYTHON, MAX",
-                                        "file": "m_library/m_python/max",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_memoryview",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "memoryview",
-                                        "path": "visualpython - library - python - built in functions - memoryview",
-                                        "desc": "",
-                                        "tag": "PYTHON, MEMORYVIEW",
-                                        "file": "m_library/m_python/memoryview",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_min",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "min",
-                                        "path": "visualpython - library - python - built in functions - min",
-                                        "desc": "",
-                                        "tag": "PYTHON, MIN",
-                                        "file": "m_library/m_python/min",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_next",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "next",
-                                        "path": "visualpython - library - python - built in functions - next",
-                                        "desc": "",
-                                        "tag": "PYTHON, NEXT",
-                                        "file": "m_library/m_python/next",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_object",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "object",
-                                        "path": "visualpython - library - python - built in functions - object",
-                                        "desc": "",
-                                        "tag": "PYTHON, OBJECT",
-                                        "file": "m_library/m_python/object",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_oct",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "oct",
-                                        "path": "visualpython - library - python - built in functions - oct",
-                                        "desc": "",
-                                        "tag": "PYTHON, OCT",
-                                        "file": "m_library/m_python/oct",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_open",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "open",
-                                        "path": "visualpython - library - python - built in functions - open",
-                                        "desc": "",
-                                        "tag": "PYTHON, OPEN",
-                                        "file": "m_library/m_python/open",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_ord",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "ord",
-                                        "path": "visualpython - library - python - built in functions - ord",
-                                        "desc": "",
-                                        "tag": "PYTHON, ORD",
-                                        "file": "m_library/m_python/ord",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_pow",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "pow",
-                                        "path": "visualpython - library - python - built in functions - pow",
-                                        "desc": "",
-                                        "tag": "PYTHON, POW",
-                                        "file": "m_library/m_python/pow",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_print",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "print",
-                                        "path": "visualpython - library - python - built in functions - print",
-                                        "desc": "",
-                                        "tag": "PYTHON, PRINT",
-                                        "file": "m_library/m_python/print",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_property",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "property",
-                                        "path": "visualpython - library - python - built in functions - property",
-                                        "desc": "",
-                                        "tag": "PYTHON, PROPERTY",
-                                        "file": "m_library/m_python/property",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_range",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "range",
-                                        "path": "visualpython - library - python - built in functions - range",
-                                        "desc": "",
-                                        "tag": "PYTHON, RANGE",
-                                        "file": "m_library/m_python/range",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_repr",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "repr",
-                                        "path": "visualpython - library - python - built in functions - repr",
-                                        "desc": "",
-                                        "tag": "PYTHON, REPR",
-                                        "file": "m_library/m_python/repr",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_reversed",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "reversed",
-                                        "path": "visualpython - library - python - built in functions - reversed",
-                                        "desc": "",
-                                        "tag": "PYTHON, REVERSED",
-                                        "file": "m_library/m_python/reversed",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_round",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "round",
-                                        "path": "visualpython - library - python - built in functions - round",
-                                        "desc": "",
-                                        "tag": "PYTHON, ROUND",
-                                        "file": "m_library/m_python/round",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_set",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "set",
-                                        "path": "visualpython - library - python - built in functions - set",
-                                        "desc": "",
-                                        "tag": "PYTHON, SET",
-                                        "file": "m_library/m_python/set",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_setattr",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "setattr",
-                                        "path": "visualpython - library - python - built in functions - setattr",
-                                        "desc": "",
-                                        "tag": "PYTHON, SETATTR",
-                                        "file": "m_library/m_python/setattr",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_slice",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "slice",
-                                        "path": "visualpython - library - python - built in functions - slice",
-                                        "desc": "",
-                                        "tag": "PYTHON, SLICE",
-                                        "file": "m_library/m_python/slice",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_sorted",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "sorted",
-                                        "path": "visualpython - library - python - built in functions - sorted",
-                                        "desc": "",
-                                        "tag": "PYTHON, SORTED",
-                                        "file": "m_library/m_python/sorted",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_staticmethod",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "staticmethod",
-                                        "path": "visualpython - library - python - built in functions - staticmethod",
-                                        "desc": "",
-                                        "tag": "PYTHON, STATICMETHOD",
-                                        "file": "m_library/m_python/staticmethod",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_str",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "str",
-                                        "path": "visualpython - library - python - built in functions - str",
-                                        "desc": "",
-                                        "tag": "PYTHON, STR",
-                                        "file": "m_library/m_python/str",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_sum",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "sum",
-                                        "path": "visualpython - library - python - built in functions - sum",
-                                        "desc": "",
-                                        "tag": "PYTHON, SUM",
-                                        "file": "m_library/m_python/sum",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_super",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "super",
-                                        "path": "visualpython - library - python - built in functions - super",
-                                        "desc": "",
-                                        "tag": "PYTHON, SUPER",
-                                        "file": "m_library/m_python/super",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_tuple",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "tuple",
-                                        "path": "visualpython - library - python - built in functions - tuple",
-                                        "desc": "",
-                                        "tag": "PYTHON, TUPLE",
-                                        "file": "m_library/m_python/tuple",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_type",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "type",
-                                        "path": "visualpython - library - python - built in functions - type",
-                                        "desc": "",
-                                        "tag": "PYTHON, TYPE",
-                                        "file": "m_library/m_python/type",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_vars",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "vars",
-                                        "path": "visualpython - library - python - built in functions - vars",
-                                        "desc": "",
-                                        "tag": "PYTHON, VARS",
-                                        "file": "m_library/m_python/vars",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "pyBuilt_zip",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "zip",
-                                        "path": "visualpython - library - python - built in functions - zip",
-                                        "desc": "",
-                                        "tag": "PYTHON, ZIP",
-                                        "file": "m_library/m_python/zip",
-                                        "useAutoV2": true
-                                    }
-                                ]
-                            },
-                            {
-                                "id": "python_moduleFunctions",
-                                "type": "package",
-                                "level": 2,
-                                "name": "Module functions",
-                                "path": "visualpython - library - python - module functions",
-                                "desc": "",
-                                "item": [
-                                    {
-                                        "id": "pyMod_glob",
-                                        "type": "package",
-                                        "level": 3,
-                                        "name": "glob",
-                                        "path": "visualpython - library - python - module functions - glob",
-                                        "desc": "",
-                                        "item": []
-                                    },
-                                    {
-                                        "id": "pyMod_os",
-                                        "type": "package",
-                                        "level": 3,
-                                        "name": "os",
-                                        "path": "visualpython - library - python - module functions - os",
-                                        "desc": "",
-                                        "item": []
-                                    },
-                                    {
-                                        "id": "pyMod_pickle",
-                                        "type": "package",
-                                        "level": 3,
-                                        "name": "pickle",
-                                        "path": "visualpython - library - python - module functions - pickle",
-                                        "desc": "",
-                                        "item": []
-                                    },
-                                    {
-                                        "id": "pyMod_random",
-                                        "type": "package",
-                                        "level": 3,
-                                        "name": "random",
-                                        "path": "visualpython - library - python - module functions - random",
-                                        "desc": "",
-                                        "item": []
-                                    },
-                                    {
-                                        "id": "pyMod_shutil",
-                                        "type": "package",
-                                        "level": 3,
-                                        "name": "shutil",
-                                        "path": "visualpython - library - python - module functions - shutil",
-                                        "desc": "",
-                                        "item": []
-                                    },
-                                    {
-                                        "id": "pyMod_sys",
-                                        "type": "package",
-                                        "level": 3,
-                                        "name": "sys",
-                                        "path": "visualpython - library - python - module functions - sys",
-                                        "desc": "",
-                                        "item": []
-                                    },
-                                    {
-                                        "id": "pyMod_tempfile",
-                                        "type": "package",
-                                        "level": 3,
-                                        "name": "tempfile",
-                                        "path": "visualpython - library - python - module functions - tempfile",
-                                        "desc": "",
-                                        "item": []
-                                    },
-                                    {
-                                        "id": "pyMod_threading",
-                                        "type": "package",
-                                        "level": 3,
-                                        "name": "threading",
-                                        "path": "visualpython - library - python - module functions - threading",
-                                        "desc": "",
-                                        "item": []
-                                    },
-                                    {
-                                        "id": "pyMod_time",
-                                        "type": "package",
-                                        "level": 3,
-                                        "name": "time",
-                                        "path": "visualpython - library - python - module functions - time",
-                                        "desc": "",
-                                        "item": []
-                                    }
-                                ]
-                            },
-                            {
-                                "id"   : "python_userDefFunctions",
-                                "type" : "package",
-                                "level": 2,
-                                "name" : "User defined functions",
-                                "path" : "visualpython - library - python - user defined function",
-                                "desc" : "Python User defined functions",
-                                "item" : [
-
-                                ]
-                            }
-                        ]
-                    },
-                    {
-                        "id"   : "lib_numpy",
-                        "type" : "package",
-                        "level": 1,
-                        "name" : "Numpy",
-                        "path" : "visualpython - library - numpy",
-                        "desc" : "Numpy operations",
-                        "item" : [
-                            {
-                                "id": "npPkg_arrayCreation",
-                                "type": "package",
-                                "level": 2,
-                                "name": "Array creation",
-                                "path": "visualpython - library - numpy - array creation",
-                                "desc": "",
-                                "item": [
-                                    {
-                                        "id": "np_array",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "array",
-                                        "path": "visualpython - library - numpy - array creation - np.array",
-                                        "desc": "",
-                                        "tag": "NP, ARRAY, NP.ARRAY, NUMPY",
-                                        "file": "m_library/m_numpy/array",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "np_zeros",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "zeros",
-                                        "path": "visualpython - library - numpy - array creation - np.zeros",
-                                        "desc": "",
-                                        "tag": "NP, ZEROS, NP.ZEROS, NUMPY",
-                                        "file": "m_library/m_numpy/zeros",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "np_ones",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "ones",
-                                        "path": "visualpython - library - numpy - array creation - np.ones",
-                                        "desc": "",
-                                        "tag": "NP, ONES, NP.ONES, NUMPY",
-                                        "file": "m_library/m_numpy/ones",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "np_empty",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "empty",
-                                        "path": "visualpython - library - numpy - array creation - np.empty",
-                                        "desc": "",
-                                        "tag": "NP, EMPTY, NP.EMPTY, NUMPY",
-                                        "file": "m_library/m_numpy/empty",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "np_copy",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "copy",
-                                        "path": "visualpython - library - numpy - array creation - np.copy",
-                                        "desc": "",
-                                        "tag": "NP, COPY, NP.COPY, NUMPY",
-                                        "file": "m_library/m_numpy/copy",
-                                        "useAutoV2": true
-                                    }
-                                ]
-                            },
-                            {
-                                "id"   : "npPkg_numericalRanges",
-                                "type" : "package",
-                                "level": 2,
-                                "name" : "Numerical ranges",
-                                "path" : "visualpython - library - numpy - numerical ranges",
-                                "desc" : "Numerical ranges",
-                                "item": [
-                                    {
-                                        "id": "np_arange",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "arange",
-                                        "path": "visualpython - library - numpy - numerical ranges - np.arange",
-                                        "desc": "",
-                                        "tag": "NP, ARANGE, NP.ARANGE, NUMPY",
-                                        "file": "m_library/m_numpy/arange",
-                                        "useAutoV2": true
-                                    }
-                                ]
-                            },
-                            {
-                                "id"   : "npPkg_joiningArrays",
-                                "type" : "package",
-                                "level": 2,
-                                "name" : "Joining arrays",
-                                "path" : "visualpython - library - numpy - joining arrays",
-                                "desc" : "Joining arrays",
-                                "item" : [
-                                    {
-                                        "id": "np_concatenate",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "concatenate",
-                                        "path": "visualpython - library - numpy - joining arrays - np.concatenate",
-                                        "desc": "",
-                                        "tag": "NP, CONCATENATE, NP.CONCATENATE, NUMPY",
-                                        "file": "m_library/m_numpy/concatenate",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "np_stack",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "stack",
-                                        "path": "visualpython - library - numpy - joining arrays - np.stack",
-                                        "desc": "",
-                                        "tag": "NP, STACK, NP.STACK, NUMPY",
-                                        "file": "m_library/m_numpy/stack",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "np_dstack",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "dstack",
-                                        "path": "visualpython - library - numpy - joining arrays - np.dstack",
-                                        "desc": "",
-                                        "tag": "NP, DSTACK, NP.DSTACK, NUMPY",
-                                        "file": "m_library/m_numpy/dstack",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "np_hstack",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "hstack",
-                                        "path": "visualpython - library - numpy - joining arrays - np.hstack",
-                                        "desc": "",
-                                        "tag": "NP, HSTACK, NP.HSTACK, NUMPY",
-                                        "file": "m_library/m_numpy/hstack",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "np_vstack",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "vstack",
-                                        "path": "visualpython - library - numpy - joining arrays - np.vstack",
-                                        "desc": "",
-                                        "tag": "NP, VSTACK, NP.VSTACK, NUMPY",
-                                        "file": "m_library/m_numpy/vstack",
-                                        "useAutoV2": true
-                                    }
-                                ]
-                            },
-                            {
-                                "id"   : "npPkg_splittingArrays",
-                                "type" : "package",
-                                "level": 2,
-                                "name" : "Splitting arrays",
-                                "path" : "visualpython - library - numpy - splitting arrays",
-                                "desc" : "Splitting arrays",
-                                "item" : [
-                                    {
-                                        "id": "np_split",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "split",
-                                        "path": "visualpython - library - numpy - splitting arrays - np.split",
-                                        "desc": "",
-                                        "tag": "NP, SPLIT, NP.SPLIT, NUMPY",
-                                        "file": "m_library/m_numpy/split",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "np_dsplit",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "dsplit",
-                                        "path": "visualpython - library - numpy - splitting arrays - np.dsplit",
-                                        "desc": "",
-                                        "tag": "NP, DSPLIT, NP.DSPLIT, NUMPY",
-                                        "file": "m_library/m_numpy/dsplit",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "np_hsplit",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "hsplit",
-                                        "path": "visualpython - library - numpy - splitting arrays - np.hsplit",
-                                        "desc": "",
-                                        "tag": "NP, HSPLIT, NP.HSPLIT, NUMPY",
-                                        "file": "m_library/m_numpy/hsplit",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "np_vsplit",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "vsplit",
-                                        "path": "visualpython - library - numpy - splitting arrays - np.vsplit",
-                                        "desc": "",
-                                        "tag": "NP, VSPLIT, NP.VSPLIT, NUMPY",
-                                        "file": "m_library/m_numpy/vsplit",
-                                        "useAutoV2": true
-                                    }
-                                ]
-                            },
-                            {
-                                "id"   : "npPkg_shapeManipulation",
-                                "type" : "package",
-                                "level": 2,
-                                "name" : "Shape manipulation",
-                                "path" : "visualpython - library - numpy - shape manipulation",
-                                "desc" : "Shape manipulation",
-                                "item" : [
-                                    {
-                                        "id": "np_reshape",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "reshape",
-                                        "path": "visualpython - library - numpy - shape manipulation - np.reshape",
-                                        "desc": "",
-                                        "tag": "NP, RESHAPE, NP.RESHAPE, NUMPY",
-                                        "file": "m_library/m_numpy/reshape",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "np_transpose",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "transpose",
-                                        "path": "visualpython - library - numpy - shape manipulation - np.transpose",
-                                        "desc": "",
-                                        "tag": "NP, TRANSPOSE, NP.TRANSPOSE, NUMPY",
-                                        "file": "m_library/m_numpy/transpose",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "np_t",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "T",
-                                        "path": "visualpython - library - numpy - shape manipulation - np.T",
-                                        "desc": "",
-                                        "tag": "NP, T, NP.T, NUMPY",
-                                        "file": "m_library/m_numpy/T",
-                                        "useAutoV2": true
-                                    },
-                                    {
-                                        "id": "np_flatten",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "flatten",
-                                        "path": "visualpython - library - numpy - shape manipulation - np.flatten",
-                                        "desc": "",
-                                        "tag": "NP, FLATTEN, NP.FLATTEN, NUMPY",
-                                        "file": "m_library/m_numpy/flatten",
-                                        "useAutoV2": true
-                                    }
-                                ]
-                            },
-                            {
-                                "id"   : "npPkg_statistics",
-                                "type" : "package",
-                                "level": 2,
-                                "name" : "Statistics",
-                                "path" : "visualpython - library - numpy - statistics",
-                                "desc" : "Statistics",
-                                "item" : [
-                                        {
-                                            "id": "np_mean",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "mean",
-                                            "path": "visualpython - library - numpy - statistics - np.mean",
-                                            "desc": "",
-                                            "tag": "NP, MEAN, NP.MEAN, NUMPY",
-                                            "file": "m_library/m_numpy/mean",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_var",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "var",
-                                            "path": "visualpython - library - numpy - statistics - np.var",
-                                            "desc": "",
-                                            "tag": "NP, VAR, NP.VAR, NUMPY",
-                                            "file": "m_library/m_numpy/var",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_std",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "std",
-                                            "path": "visualpython - library - numpy - statistics - np.std ",
-                                            "desc": "",
-                                            "tag": "NP, STD, NP.STD, NUMPY",
-                                            "file": "m_library/m_numpy/std",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_max",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "max",
-                                            "path": "visualpython - library - numpy - statistics - np.max",
-                                            "desc": "",
-                                            "tag": "NP, MAX, NP.MAX, NUMPY",
-                                            "file": "m_library/m_numpy/max",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_min",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "min",
-                                            "path": "visualpython - library - numpy - statistics - np.min",
-                                            "desc": "",
-                                            "tag": "NP, MIN, NP.MIN, NUMPY",
-                                            "file": "m_library/m_numpy/min",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_median",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "median",
-                                            "path": "visualpython - library - numpy - statistics - np.median",
-                                            "desc": "",
-                                            "tag": "NP, MEDIAN, NP.MEDIAN, NUMPY",
-                                            "file": "m_library/m_numpy/median",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_percentile",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "percentile",
-                                            "path": "visualpython - library - numpy - statistics - np.percentile",
-                                            "desc": "",
-                                            "tag": "NP, PERCENTILE, NP.PERCENTILE, NUMPY",
-                                            "file": "m_library/m_numpy/percentile",
-                                            "useAutoV2": true
-                                        }
-                                    ]
-                            },
-                            {
-                                "id"   : "npPkg_universalLinearAlgebra",
-                                "type" : "package",
-                                "level": 2,
-                                "name" : "Linear algebra",
-                                "path" : "visualpython - library - numpy - linear algebra",
-                                "desc" : "Linear algebra",
-                                "item" : [
-                                        {
-                                            "id": "np_linalg_inv",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "linalg.inv",
-                                            "path": "visualpython - library - numpy - linear algebra - np.linalg.inv",
-                                            "desc": "",
-                                            "tag": "NP, LINALG INV, NP.LINALG.INV, NUMPY",
-                                            "file": "m_library/m_numpy/linalgInv",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_linalg_det",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "linalg.det",
-                                            "path": "visualpython - library - numpy - linear algebra - np.linalg.det",
-                                            "desc": "",
-                                            "tag": "NP, LINALG, NP.LINALG.DET, NUMPY",
-                                            "file": "m_library/m_numpy/linalgDet",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_linalg_eig",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "linalg.eig",
-                                            "path": "visualpython - library - numpy - linear algebra - np.linalg.eig",
-                                            "desc": "",
-                                            "tag": "NP, LINALG, NP.LINALG.EIG, NUMPY",
-                                            "file": "m_library/m_numpy/linalgEig",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_linalg_svd",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "linalg.svd",
-                                            "path": "visualpython - library - numpy - linear algebra - np.linalg.svd",
-                                            "desc": "",
-                                            "tag": "NP, LINALG, NP.LINALG.SVD, NUMPY",
-                                            "file": "m_library/m_numpy/linalgSvd",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_trace",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "trace",
-                                            "path": "visualpython - library - numpy - linear algebra - np.trace",
-                                            "desc": "",
-                                            "tag": "NP, TRACE, NP.TRACE, NUMPY",
-                                            "file": "m_library/m_numpy/Trace",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_dot",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "dot",
-                                            "path": "visualpython - library - numpy - linear algebra - np.dot",
-                                            "desc": "",
-                                            "tag": "NP, DOT, NP.DOT, NUMPY",
-                                            "file": "m_library/m_numpy/dot",
-                                            "useAutoV2": true
-                                        }
-                                    ]
-                            },
-                            {
-                                "id"   : "npPkg_universalBinaryArithmetic",
-                                "type" : "package",
-                                "level": 2,
-                                "name" : "Math operation",
-                                "path" : "visualpython - library - numpy - math operation",
-                                "desc" : "Math operation",
-                                "item" : [
-                                        {
-                                            "id": "np_add",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "add",
-                                            "path": "visualpython - library - numpy - math operation - np.add",
-                                            "desc": "",
-                                            "tag": "NP, ADD, NP.ADD, NUMPY",
-                                            "file": "m_library/m_numpy/add",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_divide",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "divide",
-                                            "path": "visualpython - library - numpy - math operation - np.divide",
-                                            "desc": "",
-                                            "tag": "NP, DIVIDE, NP.DIVIDE, NUMPY",
-                                            "file": "m_library/m_numpy/divide",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_floor_divide",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "floor_divide",
-                                            "path": "visualpython - library - numpy - math operation - np.floor_divide",
-                                            "desc": "",
-                                            "tag": "NP, DIVIDE, NP.DIVIDE, NUMPY",
-                                            "file": "m_library/m_numpy/floor_divide",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_fmax",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "fmax",
-                                            "path": "visualpython - library - numpy - math operation - np.fmax",
-                                            "desc": "",
-                                            "tag": "NP, FMAX, NP.FMAX, NUMPY",
-                                            "file": "m_library/m_numpy/fmax",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_fmin",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "fmin",
-                                            "path": "visualpython - library - numpy - math operation - np.fmin",
-                                            "desc": "",
-                                            "tag": "NP, FMIN, NP.FMIN, NUMPY",
-                                            "file": "m_library/m_numpy/fmin",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_maximum",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "maximum",
-                                            "path": "visualpython - library - numpy - math operation - np.maximum",
-                                            "desc": "",
-                                            "tag": "NP, MAXIMUM, NP.MAXIMUM, NUMPY",
-                                            "file": "m_library/m_numpy/maximum",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_minimum",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "minimum",
-                                            "path": "visualpython - library - numpy - math operation - np.minimum",
-                                            "desc": "",
-                                            "tag": "NP, MINIMUM, NP.MINIMUM, NUMPY",
-                                            "file": "m_library/m_numpy/minimum",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_mod",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "mod",
-                                            "path": "visualpython - library - numpy - math operation - np.mod",
-                                            "desc": "",
-                                            "tag": " NP, MOD, NP.MOD, NUMPY",
-                                            "file": "m_library/m_numpy/mod",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_sum",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "sum",
-                                            "path": "visualpython - library - numpy - math operation - np.sum",
-                                            "desc": "",
-                                            "tag": "NP, SUM, NP.SUM, NUMPY",
-                                            "file": "m_library/m_numpy/sum",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_multiply",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "multiply",
-                                            "path": "visualpython - library - numpy - math operation - np.multiply",
-                                            "desc": "",
-                                            "tag": "NP, MULTIPLY, NP.MULTIPLY, NUMPY",
-                                            "file": "m_library/m_numpy/multiply",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_prod",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "prod",
-                                            "path": "visualpython - library - numpy - math operation - np.prod",
-                                            "desc": "",
-                                            "tag": "NP, PROD, NP.PROD, NUMPY",
-                                            "file": "m_library/m_numpy/prod",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_power",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "power",
-                                            "path": "visualpython - library - numpy - math operation - np.power",
-                                            "desc": "",
-                                            "tag": "NP, POWER, NP.POWER, NUMPY",
-                                            "file": "m_library/m_numpy/power",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_subtract",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "subtract",
-                                            "path": "visualpython - library - numpy - math operation - np.subtract",
-                                            "desc": "",
-                                            "tag": "NP, SUBTRACT, NP.SUBTRACT, NUMPY",
-                                            "file": "m_library/m_numpy/subtract",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_abs",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "abs",
-                                            "path": "visualpython - library - numpy - math operation - np.abs",
-                                            "desc": "",
-                                            "tag": "NP, ABS, NP.ABS, NUMPY",
-                                            "file": "m_library/m_numpy/abs",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_ceil",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "ceil",
-                                            "path": "visualpython - library - numpy - math operation - np.ceil",
-                                            "desc": "",
-                                            "tag": "NP, CEIL, NP.CEIL, NUMPY",
-                                            "file": "m_library/m_numpy/ceil",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_exp",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "exp",
-                                            "path": "visualpython - library - numpy - math operation - np.exp",
-                                            "desc": "",
-                                            "tag": "NP, EXP, NP.EXP, NUMPY",
-                                            "file": "m_library/m_numpy/exp",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_fabs",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "fabs",
-                                            "path": "visualpython - library - numpy - math operation - np.fabs",
-                                            "desc": "",
-                                            "tag": "NP, FABS, NP.FABS, NUMPY",
-                                            "file": "m_library/m_numpy/fabs",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_floor",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "floor",
-                                            "path": "visualpython - library - numpy - math operation - np.floor",
-                                            "desc": "",
-                                            "tag": "NP, FLOOR, NP.FLOOR, NUMPY",
-                                            "file": "m_library/m_numpy/floor",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_log",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "log",
-                                            "path": "visualpython - library - numpy - math operation - np.log",
-                                            "desc": "",
-                                            "tag": "NP, LOG, NP.LOG, NUMPY",
-                                            "file": "m_library/m_numpy/log",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_log1p",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "log1p",
-                                            "path": "visualpython - library - numpy - math operation - np.log1p",
-                                            "desc": "",
-                                            "tag": "NP, LOG1P, NP.LOG1P, NUMPY",
-                                            "file": "m_library/m_numpy/log1p",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_log2",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "log2",
-                                            "path": "visualpython - library - numpy - math operation - np.log2",
-                                            "desc": "",
-                                            "tag": "NP, LOG2, NP.LOG2, NUMPY",
-                                            "file": "m_library/m_numpy/log2",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_log10",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "log10",
-                                            "path": "visualpython - library - numpy - math operation - np.log10",
-                                            "desc": "",
-                                            "tag": "NP, LOG10, NP.LOG10, NUMPY",
-                                            "file": "m_library/m_numpy/log10",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_modf",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "modf",
-                                            "path": "visualpython - library - numpy - math operation - np.modf",
-                                            "desc": "",
-                                            "tag": "NP, MODF, NP.MODF, NUMPY",
-                                            "file": "m_library/m_numpy/modf",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_rint",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "rint",
-                                            "path": "visualpython - library - numpy - math operation - np.rint",
-                                            "desc": "",
-                                            "tag": "NP, RINT, NP.RINT, NUMPY",
-                                            "file": "m_library/m_numpy/rint",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_sqrt",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "sqrt",
-                                            "path": "visualpython - library - numpy - math operation - np.sqrt",
-                                            "desc": "",
-                                            "tag": "NP, SQRT, NP.SQRT, NUMPY",
-                                            "file": "m_library/m_numpy/sqrt",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_square",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "square",
-                                            "path": "visualpython - library - numpy - math operation - np.square",
-                                            "desc": "",
-                                            "tag": "NP, SQUARE, NP.SQUARE, NUMPY",
-                                            "file": "m_library/m_numpy/square",
-                                            "useAutoV2": true
-                                        }
-                                    ]
-                            },
-                            {
-                                "id"   : "npPkg_universalUnaryLogical",
-                                "type" : "package",
-                                "level": 2,
-                                "name" : "Boolean operation",
-                                "path" : "visualpython - library - numpy - boolean operation",
-                                "desc" : "Boolean operation",
-                                "item" : [
-                                        {
-                                            "id": "np_all",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "all",
-                                            "path": "visualpython - library - numpy - boolean operation - np.all",
-                                            "desc": "",
-                                            "tag": "NP, ALL, NP.ALL, NUMPY",
-                                            "file": "m_library/m_numpy/all",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_any",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "any",
-                                            "path": "visualpython - library - numpy - boolean operation - np.any",
-                                            "desc": "",
-                                            "tag": "NP, ANY, NP.ANY, NUMPY",
-                                            "file": "m_library/m_numpy/any",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_isanan",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "isanan",
-                                            "path": "visualpython - library - numpy - boolean operation - np.isanan",
-                                            "desc": "",
-                                            "tag": "NP, ISANAN, NP.ISANAN, NUMPY",
-                                            "file": "m_library/m_numpy/isanan",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_isfinite",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "isfinite",
-                                            "path": "visualpython - library - numpy - boolean operation - np.isfinite",
-                                            "desc": "",
-                                            "tag": "NP, ISFINITE, NP.ISFINITE, NUMPY",
-                                            "file": "m_library/m_numpy/isfinite",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_isinf",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "isinf",
-                                            "path": "visualpython - library - numpy - boolean operation - np.isinf",
-                                            "desc": "",
-                                            "tag": "NP, ISINF, NP.ISINF, NUMPY",
-                                            "file": "m_library/m_numpy/isinf",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_isnan",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "isnan",
-                                            "path": "visualpython - library - numpy - boolean operation - np.isnan",
-                                            "desc": "",
-                                            "tag": "NP, ISNAN, NP.ISNAN, NUMPY",
-                                            "file": "m_library/m_numpy/isnan",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_isneginf",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "isneginf",
-                                            "path": "visualpython - library - numpy - boolean operation - np.isneginf",
-                                            "desc": "",
-                                            "tag": "NP, ISNEGINF, NP.ISNEGINF, NUMPY",
-                                            "file": "m_library/m_numpy/isneginf",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_isposinf",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "isposinf",
-                                            "path": "visualpython - library - numpy - boolean operation - np.isposinf",
-                                            "desc": "",
-                                            "tag": "NP, ISPOSINF, NP.ISPOSINF, NUMPY",
-                                            "file": "m_library/m_numpy/isposinf",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_logical_not",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "logical_not",
-                                            "path": "visualpython - library - numpy - boolean operation - np.logical_not",
-                                            "desc": "",
-                                            "tag": "NP, LOGICAL_NOT, NP.LOGICAL_NOT, NUMPY",
-                                            "file": "m_library/m_numpy/logical_not",
-                                            "useAutoV2": true
-                                        }
-                                    ]
-                            },
-                            {
-                                "id"   : "npPkg_universalTrigonometric",
-                                "type" : "package",
-                                "level": 2,
-                                "name" : "Trigonometric functions",
-                                "path" : "visualpython - library - numpy - trigonometric functions",
-                                "desc" : "Trigonometric functions",
-                                "item" : [
-                                        {
-                                            "id": "np_sin",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "sin",
-                                            "path": "visualpython - library - numpy - trigonometric functions - np.sin",
-                                            "desc": "",
-                                            "tag": "NP, SIN, NP.SIN, NUMPY",
-                                            "file": "m_library/m_numpy/sin",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_cos",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "cos",
-                                            "path": "visualpython - library - numpy - trigonometric functions - np.cos",
-                                            "desc": "",
-                                            "tag": "NP, COS, NP.COS, NUMPY",
-                                            "file": "m_library/m_numpy/cos",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_tan",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "tan",
-                                            "path": "visualpython - library - numpy - trigonometric functions - np.tan",
-                                            "desc": "",
-                                            "tag": "NP, TAN, NP.TAN, NUMPY",
-                                            "file": "m_library/m_numpy/tan",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_arcsin",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "arcsin",
-                                            "path": "visualpython - library - numpy - trigonometric functions - np.arcsin",
-                                            "desc": "",
-                                            "tag": "NP, SIN, NP.SIN, NUMPY",
-                                            "file": "m_library/m_numpy/arcsin",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_arccos",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "arccos",
-                                            "path": "visualpython - library - numpy - trigonometric functions - np.arccos",
-                                            "desc": "",
-                                            "tag": "NP, COS, NP.COS, NUMPY",
-                                            "file": "m_library/m_numpy/arccos",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_arctan",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "arctan",
-                                            "path": "visualpython - library - numpy - trigonometric functions - np.arctan",
-                                            "desc": "",
-                                            "tag": "NP, TAN, NP.TAN, NUMPY",
-                                            "file": "m_library/m_numpy/arctan",
-                                            "useAutoV2": true
-                                        }
-                                    ]
-                            },
-                            {
-                                "id"   : "npPkg_universalComparator",
-                                "type" : "package",
-                                "level": 2,
-                                "name" : "Comparison operation",
-                                "path" : "visualpython - library - numpy - comparison operation",
-                                "desc" : "Comparison operation",
-                                "item" : [
-                                        {
-                                            "id": "np_equal",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "equal",
-                                            "path": "visualpython - library - numpy - comparison operation - np.equal",
-                                            "desc": "",
-                                            "tag": "NP, EQUAL, NP.EQUAL, NUMPY",
-                                            "file": "m_library/m_numpy/equal",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_greater",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "greater",
-                                            "path": "visualpython - library - numpy - comparison operation - np.greater",
-                                            "desc": "",
-                                            "tag": "NP, GREATER, NP.GREATER, NUMPY",
-                                            "file": "m_library/m_numpy/greater",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_greater_equal",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "greater_equal",
-                                            "path": "visualpython - library - numpy - comparison operation - np.greater_equal",
-                                            "desc": "",
-                                            "tag": "NP, GREATER, EQUAL, NP.EQUAL, NP.GREATER, NUMPY",
-                                            "file": "m_library/m_numpy/greater_equal",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_less",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "less",
-                                            "path": "visualpython - library - numpy - comparison operation - np.less",
-                                            "desc": "",
-                                            "tag": "NP, LESS, NP.LESS, NUPY",
-                                            "file": "m_library/m_numpy/less",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_less_equal",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "less_equal",
-                                            "path": "visualpython - library - numpy - comparison operation - np.less_equal",
-                                            "desc": "",
-                                            "tag": "NP, LESS, EQUAL, NP.EQUAL, NP.LESS, NUMPY",
-                                            "file": "m_library/m_numpy/less_equal",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_not_equal",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "not_equal",
-                                            "path": "visualpython - library - numpy - comparison operation - np.not_equal",
-                                            "desc": "",
-                                            "tag": "NP, LESS, EQUAL, NP.EQUAL, NP.LESS, NUMPY",
-                                            "file": "m_library/m_numpy/not_equal",
-                                            "useAutoV2": true
-                                        }
-                                    ]
-                            },
-                            {
-                                "id"   : "npPkg_universalRandom",
-                                "type" : "package",
-                                "level": 2,
-                                "name" : "Random number generation",
-                                "path" : "visualpython - library - numpy - random number generation",
-                                "desc" : "Random number generation",
-                                "item" : [
-                                        {
-                                            "id": "np_randint",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "randint",
-                                            "path": "visualpython - library - numpy - random number generation - np.random.randint ",
-                                            "desc": "",
-                                            "tag": "NUMPY, UNIVERSAL, RANDOM, NP.RANDOM.RANDINT, NP, RANDOM, RANDINT",
-                                            "file": "m_library/m_numpy/randint",
-                                            "useAutoV2": true
-                                        },
-                                        {
-                                            "id": "np_rand",
-                                            "type": "function",
-                                            "level": 3,
-                                            "name": "rand",
-                                            "path": "visualpython - library - numpy - random number generation - np.random.rand ",
-                                            "desc": "",
-                                            "tag": "NUMPY, UNIVERSAL, RANDOM, NP.RANDOM.RAND, NP, RANDOM, RAND",
-                                            "file": "m_library/m_numpy/rand",
-                                            "useAutoV2": true
-                                        }
-                                    ]
-                            }
-                        ]
-                    },
-                    {
-                        "id"   : "lib_pandas",
-                        "type" : "package",
-                        "level": 1,
-                        "name" : "Pandas",
-                        "path" : "visualpython - library - pandas",
-                        "desc" : "Pandas operations",
-                        "open" : true,
-                        "item" : [
-                            {
-                                "id"   : "pd_plot",
-                                "type" : "function",
-                                "level": 1,
-                                "name" : "Pandas Plot",
-                                "tag"  : "PANDAS PLOT,PANDAS",
-                                "path" : "visualpython - library - pandas - plot",
-                                "desc" : "Pandas Plot",
-                                "file" : "m_library/m_pandas/plot",
-                                "useAuto" : true
-                            },
-                            {
-                                "id"   : "pdPkg_inputOutput",
-                                "type" : "package",
-                                "level": 2,
-                                "name" : "Input/Output",
-                                "path" : "visualpython - library - pandas - input output",
-                                "desc" : "Pandas file input & output",
-                                "item" : [
-                                    {
-                                        "id"   : "pdIo_readFile",
-                                        "type" : "function",
-                                        "level": 3,
-                                        "name" : "Read file",
-                                        "tag"  : "READ FILE,CSV,EXCEL,PICKLE,JSON",
-                                        "path" : "visualpython - library - pandas - input output - read file",
-                                        "desc" : "Read file",
-                                        "file" : "m_library/m_pandas/readFile"
-                                    },
-                                    {
-                                        "id"   : "pdIo_toFile",
-                                        "type" : "function",
-                                        "level": 3,
-                                        "name" : "To file",
-                                        "tag"  : "WRITE FILE,CSV,EXCEL,PICKLE,JSON",
-                                        "path" : "visualpython - library - pandas - input output - write file",
-                                        "desc" : "Write file",
-                                        "file" : "m_library/m_pandas/toFile"
-                                    }
-                                ]
-                            },
-                            {
-                                "id": "pdPkg_pandasObjects",
-                                "type": "package",
-                                "level": 2,
-                                "name": "Pandas objects",
-                                "path": "visualpython - library - pandas - pandas objects",
-                                "desc": "Pandas objects",
-                                "item": [
-                                    {
-                                        "id": "pdPdo_series",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "Series",
-                                        "path": "visualpython - library - pandas - pandas objects - series",
-                                        "desc": "Series",
-                                        "tag": "CREATE SERIES",
-                                        "file": "m_library/m_pandas/series",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdPdo_dataframe",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "DataFrame",
-                                        "path": "visualpython - library - pandas - pandas objects - dataframe",
-                                        "desc": "DataFrame",
-                                        "tag": "CREATE DATAFRAME",
-                                        "file": "m_library/m_pandas/dataframe",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdPdo_index",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "Index objects",
-                                        "path": "visualpython - library - pandas - pandas objects - index",
-                                        "desc": "Index",
-                                        "tag": "CREATE INDEX",
-                                        "file": "m_library/m_pandas/index",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdPdo_copy",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "copy",
-                                        "path": "visualpython - library - pandas - pandas objects - copy",
-                                        "desc": "Copy pandas object",
-                                        "tag": "COPY PANDAS OBJECT, COPY",
-                                        "file": "m_library/m_pandas/copy",
-                                        "useAuto" : true
-                                    }
-                                ]
-                            },
-                            {
-                                "id": "pdPkg_infoData",
-                                "type": "package",
-                                "level": 2,
-                                "name": "Data info",
-                                "path": "visualpython - library - pandas - data info",
-                                "desc": "Check data information",
-                                "item": [
-                                    {
-                                        "id": "pdIdt_head",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "head",
-                                        "path": "visualpython - library - pandas - data info - head",
-                                        "desc": "Search head data",
-                                        "tag": "SEARCH HEAD DATA, HEAD",
-                                        "file": "m_library/m_pandas/head",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdIdt_tail",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "tail",
-                                        "path": "visualpython - library - pandas - data info - tail",
-                                        "desc": "Search tail data",
-                                        "tag": "SEARCH TAIL DATA, TAIL",
-                                        "file": "m_library/m_pandas/tail",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdIdt_take",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "take",
-                                        "path": "visualpython - library - pandas - data info - take",
-                                        "desc": "Search part of data",
-                                        "tag": "TAKE DATA, TAKE",
-                                        "file": "m_library/m_pandas/take",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdIdt_values",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "values",
-                                        "path": "visualpython - library - pandas - data info - get values",
-                                        "desc": "Get pandas object's values",
-                                        "tag": "GET VALUES, .VALUES",
-                                        "file": "m_library/m_pandas/getValues",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdIdt_index",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "index",
-                                        "path": "visualpython - library - pandas - data info - get index",
-                                        "desc": "Get indexes",
-                                        "tag": "GET INDEX, .INDEX",
-                                        "file": "m_library/m_pandas/getIndex",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdIdt_columns",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "columns",
-                                        "path": "visualpython - library - pandas - data info - get columns",
-                                        "desc": "Get columns",
-                                        "tag": "GET COLUMNS, .COLUMNS",
-                                        "file": "m_library/m_pandas/getColumns",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdIdt_len",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "len",
-                                        "path": "visualpython - library - pandas - data info - get length",
-                                        "desc": "Get length",
-                                        "tag": "GET LENGTH, LEN",
-                                        "file": "m_library/m_pandas/getLength",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdIdt_valueCounts",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "value_counts",
-                                        "path": "visualpython - library - pandas - data info - get value counts",
-                                        "desc": "values counts",
-                                        "tag": "GET VALUE COUNTS, .VALUE_COUNTS",
-                                        "file": "m_library/m_pandas/getValueCounts"
-                                    },
-                                    {
-                                        "id": "pdIdt_info",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "info",
-                                        "path": "visualpython - library - pandas - data info - get info",
-                                        "desc": "Dataframe's basic information",
-                                        "tag": "GET BASIC INFO FROM DATAFRAME, INFO",
-                                        "file": "m_library/m_pandas/getInfo",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdIdt_describe",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "describe",
-                                        "path": "visualpython - library - pandas - data info - get described info",
-                                        "desc": "Pandas object details",
-                                        "tag": "GET DETAILED INFO FROM DATAFRAME OR SERIES, DESCRIBE",
-                                        "file": "m_library/m_pandas/getDescribedInfo",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdIdt_transpose",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "T",
-                                        "path": "visualpython - library - pandas - data info - transpose",
-                                        "desc": "Transpose",
-                                        "tag": "TRANSPOSE, .T",
-                                        "file": "m_library/m_pandas/transpose",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdIdt_unique",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "unique",
-                                        "path": "visualpython - library - pandas - data info - get unique",
-                                        "desc": "Get unique values",
-                                        "tag": "GET UNIQUE DATA, UNIQUE",
-                                        "file": "m_library/m_pandas/getUnique",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdIdt_size",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "size",
-                                        "path": "visualpython - library - pandas - data info - get size",
-                                        "desc": "Get size",
-                                        "tag": "GET SIZE, SIZE",
-                                        "file": "m_library/m_pandas/getSize",
-                                        "useAuto" : true
-                                    }
-                                ]
-                            },
-                            {
-                                "id": "pdPkg_generalFunc",
-                                "type": "package",
-                                "level": 2,
-                                "name": "General functions",
-                                "path": "visualpython - library - pandas - general functions",
-                                "desc": "",
-                                "item": [
-                                    {
-                                        "id": "pdFunc_merge",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "merge",
-                                        "path": "visualpython - library - pandas - general functions - merge",
-                                        "desc": "",
-                                        "tag": "MERGE, JOIN, MERGE",
-                                        "file": "m_library/m_pandas/merge",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdFunc_concat",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "concat",
-                                        "path": "visualpython - library - pandas - general functions - concat",
-                                        "desc": "",
-                                        "tag": "CONCATENATE, CONCAT",
-                                        "file": "m_library/m_pandas/concat",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdFunc_reindex",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "reindex",
-                                        "path": "visualpython - library - pandas - general functions - reindex",
-                                        "desc": "",
-                                        "tag": "REINDEX",
-                                        "file": "m_library/m_pandas/reindex",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdFunc_setIndex",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "set_index",
-                                        "path": "visualpython - library - pandas - general functions - set index",
-                                        "desc": "",
-                                        "tag": "SET INDEX",
-                                        "file": "m_library/m_pandas/setIndex",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdFunc_resetIndex",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "reset_index",
-                                        "path": "visualpython - library - pandas - general functions - reset index",
-                                        "desc": "",
-                                        "tag": "RESET INDEX",
-                                        "file": "m_library/m_pandas/resetIndex",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdFunc_stack",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "stack",
-                                        "path": "visualpython - library - pandas - general functions - stack",
-                                        "desc": "",
-                                        "tag": "STACK",
-                                        "file": "m_library/m_pandas/stack",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdFunc_unstack",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "unstack",
-                                        "path": "visualpython - library - pandas - general functions - unstack",
-                                        "desc": "",
-                                        "tag": "UNSTACK",
-                                        "file": "m_library/m_pandas/unstack",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdFunc_pivot",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "pivot",
-                                        "path": "visualpython - library - pandas - general functions - pivot",
-                                        "desc": "",
-                                        "tag": "PIVOT",
-                                        "file": "m_library/m_pandas/pivot",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdFunc_melt",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "melt",
-                                        "path": "visualpython - library - pandas - general functions - melt",
-                                        "desc": "",
-                                        "tag": "MELT",
-                                        "file": "m_library/m_pandas/melt",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdFunc_pivotTable",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "pivot_table",
-                                        "path": "visualpython - library - pandas - general functions - pivot table",
-                                        "desc": "",
-                                        "tag": "PIVOT TABLE",
-                                        "file": "m_library/m_pandas/pivotTable",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdFunc_replace",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "replace",
-                                        "path": "visualpython - library - pandas - general functions - replace",
-                                        "desc": "",
-                                        "tag": "REPLACE VALUE, REPLACE",
-                                        "file": "m_library/m_pandas/replace",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdFunc_isDuplicated",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "duplicated",
-                                        "path": "visualpython - library - pandas - general functions - is duplicated",
-                                        "desc": "",
-                                        "tag": "CHECK IF DUPLICATED, DUPLICATED",
-                                        "file": "m_library/m_pandas/isDuplicated",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdFunc_dropDuplicates",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "drop_duplicates",
-                                        "path": "visualpython - library - pandas - general functions - drop duplicates",
-                                        "desc": "",
-                                        "tag": "DROP DUPLICATES, REMOVE DUPLICATES, DROP_DUPICATES",
-                                        "file": "m_library/m_pandas/dropDuplicates",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdFunc_isNull",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "isnull",
-                                        "path": "visualpython - library - pandas - general functions - is null",
-                                        "desc": "",
-                                        "tag": "IS NULL, IS MISSING VALUE, ISNULL",
-                                        "file": "m_library/m_pandas/isNull",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdFunc_notNull",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "notnull",
-                                        "path": "visualpython - library - pandas - general functions - not null",
-                                        "desc": "",
-                                        "tag": "NOT NULL, NOTNULL",
-                                        "file": "m_library/m_pandas/notNull",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdFunc_dropNA",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "dropna",
-                                        "path": "visualpython - library - pandas - general functions - drop na",
-                                        "desc": "",
-                                        "tag": "DROP NA, REMOVE MISSING VALUES, DROPNA",
-                                        "file": "m_library/m_pandas/dropNA",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdFunc_fillNA",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "fillna",
-                                        "path": "visualpython - library - pandas - general functions - fill na",
-                                        "desc": "",
-                                        "tag": "FILL NA, REPLACE AND FILL MISSING VALUES, FILLNA",
-                                        "file": "m_library/m_pandas/fillNA",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdFunc_combineFirst",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "combine_first",
-                                        "path": "visualpython - library - pandas - general functions - combine first",
-                                        "desc": "",
-                                        "tag": "COMBINE FIRST, REPLACE MISSING VALUES WITH OTHER DATA, COMBINE_FIRST",
-                                        "file": "m_library/m_pandas/combineFirst",
-                                        "useAuto" : true
-                                    }
-                                ]
-                            },
-                            {
-                                "id": "pdPkg_pdArrays",
-                                "type": "package",
-                                "level": 2,
-                                "name": "pandas arrays",
-                                "path": "visualpython - library - pandas - pandas arrays",
-                                "desc": "",
-                                "item": [
-                                    {
-                                        "id": "pdParr_period",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "Period",
-                                        "path": "visualpython - library - pandas - pandas arrays - period",
-                                        "desc": "",
-                                        "tag": "CREATE PERIOD",
-                                        "file": "m_library/m_pandas/period",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdParr_periodIndex",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "PeriodIndex",
-                                        "path": "visualpython - library - pandas - pandas arrays - period index",
-                                        "desc": "",
-                                        "tag": "CREATE PERIOD INDEX",
-                                        "file": "m_library/m_pandas/periodIndex",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdParr_timestamp",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "Timestamp",
-                                        "path": "visualpython - library - pandas - pandas arrays - timestamp",
-                                        "desc": "",
-                                        "tag": "CREATE TIMESTAMP",
-                                        "file": "m_library/m_pandas/timestamp",
-                                        "useAuto" : true
-                                    }
-                                ]
-                            },
-                            {
-                                "id": "pd_groupby",
-                                "type": "package",
-                                "level": 2,
-                                "name": "GroupBy",
-                                "path": "visualpython - library - pandas - groupby",
-                                "desc": "",
-                                "item": [
-                                    {
-                                        "id": "pdGrp_groupby",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "groupby",
-                                        "path": "visualpython - library - pandas - groupby - groupby",
-                                        "desc": "",
-                                        "tag": "GROUP BY DATA, GROUPBY",
-                                        "file": "m_library/m_pandas/groupby",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdGrp_groups",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "groups",
-                                        "path": "visualpython - library - pandas - groupby - groups",
-                                        "desc": "",
-                                        "tag": "GROUPS INFORMATION, .GROUPS",
-                                        "file": "m_library/m_pandas/groups",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdGrp_agg",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "agg",
-                                        "path": "visualpython - library - pandas - groupby - agg",
-                                        "desc": "",
-                                        "tag": "AGG",
-                                        "file": "m_library/m_pandas/agg",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdGrp_sum",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "sum",
-                                        "path": "visualpython - library - pandas - groupby - sum",
-                                        "desc": "",
-                                        "tag": "SUM",
-                                        "file": "m_library/m_pandas/agg_sum",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdGrp_mean",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "mean",
-                                        "path": "visualpython - library - pandas - groupby - mean",
-                                        "desc": "",
-                                        "tag": "MEAN",
-                                        "file": "m_library/m_pandas/agg_mean",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdGrp_count",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "count",
-                                        "path": "visualpython - library - pandas - groupby - count",
-                                        "desc": "",
-                                        "tag": "COUNT",
-                                        "file": "m_library/m_pandas/agg_count",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdGrp_max",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "max",
-                                        "path": "visualpython - library - pandas - groupby - max",
-                                        "desc": "",
-                                        "tag": "MAX",
-                                        "file": "m_library/m_pandas/agg_max",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdGrp_min",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "min",
-                                        "path": "visualpython - library - pandas - groupby - min",
-                                        "desc": "",
-                                        "tag": "MIN",
-                                        "file": "m_library/m_pandas/agg_min",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdGrp_median",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "median",
-                                        "path": "visualpython - library - pandas - groupby - median",
-                                        "desc": "",
-                                        "tag": "MEDIAN",
-                                        "file": "m_library/m_pandas/agg_median",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdGrp_std",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "std",
-                                        "path": "visualpython - library - pandas - groupby - std",
-                                        "desc": "",
-                                        "tag": "STD, STANDARD DEVIATION",
-                                        "file": "m_library/m_pandas/agg_std",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdGrp_size",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "size",
-                                        "path": "visualpython - library - pandas - groupby - size",
-                                        "desc": "",
-                                        "tag": "SIZE",
-                                        "file": "m_library/m_pandas/agg_size",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdGrp_quantile",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "quantile",
-                                        "path": "visualpython - library - pandas - groupby - quantile",
-                                        "desc": "",
-                                        "tag": "QUANTILE",
-                                        "file": "m_library/m_pandas/agg_quantile",
-                                        "useAuto" : true
-                                    }
-                                ]
-                            },
-                            {
-                                "id": "pdPkg_sortData",
-                                "type": "package",
-                                "level": 2,
-                                "name": "Sort Data",
-                                "path": "visualpython - library - pandas - sort data",
-                                "desc": "",
-                                "item": [
-                                    {
-                                        "id": "pdSdt_sortByIndex",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "sort_index",
-                                        "path": "visualpython - library - pandas - sort data - sort by index",
-                                        "desc": "",
-                                        "tag": "SORT BY INDEX, SORT_INDEX",
-                                        "file": "m_library/m_pandas/sortByIndex",
-                                        "useAuto" : true
-                                    },
-                                    {
-                                        "id": "pdSdt_sortByValues",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "sort_values",
-                                        "path": "visualpython - library - pandas - sort data - sort by values",
-                                        "desc": "",
-                                        "tag": "SORT BY VALUES, SORT_VALUES",
-                                        "file": "m_library/m_pandas/sortByValues",
-                                        "useAuto" : true
-                                    }
-                                ]
-                            },
-                            {
-                                "id": "pdPkg_rowcol",
-                                "type": "package",
-                                "level": 2,
-                                "name": "Row/Column",
-                                "path": "visualpython - library - pandas - rowcol",
-                                "desc": "",
-                                "item": [
-                                    {
-                                        "id": "pdEdtRC_dropRowCol",
-                                        "type": "function",
-                                        "level": 3,
-                                        "name": "drop",
-                                        "path": "visualpython - library - pandas - rowcol - drop rowcol",
-                                        "desc": "",
-                                        "tag": "DROP ROW COLUMN, DROP",
-                                        "file": "m_library/m_pandas/dropRowCol",
-                                        "useAuto" : true
-                                    }
-                                ]
-                            }
-                        ]
-                    },
-                    {
-                        "id"   : "lib_matplotlib",
-                        "type" : "package",
-                        "level": 1,
-                        "name" : "Matplotlib",
-                        "path" : "visualpython - library - matplotlib",
-                        "desc" : "Matplotlib Visualization",
-                        "item" : [
-                            {
-                                "id": "mp_chart",
-                                "type": "function",
-                                "level": 2,
-                                "name": "Create chart",
-                                "path": "visualpython - library - matplotlib - plot",
-                                "desc": "",
-                                "tag": "MATPLOTLIB, PLOT, CHART",
-                                "file": "m_visualize/Chart"
-                            },
-                            {
-                                "id": "mp_figure",
-                                "type": "function",
-                                "level": 2,
-                                "name": "subplots",
-                                "path": "visualpython - library - matplotlib - figure",
-                                "desc": "",
-                                "tag": "MATPLOTLIB FIGURE, FIGURE, SUBPLOTS",
-                                "file": "m_matplotlib/figure"
-                            }
-                        ]
-                    }
-                ]
-            },
-            {
-                "id"   : "pkg_apps",
-                "type" : "package",
-                "level": 0,
-                "name" : "Data Analysis",
-                "path" : "visualpython - apps",
-                "desc" : "Data analysis modules",
-                "open" : true,
-                "grid" : true,
-                "item" : [
-                    {
-                        "id"   : "apps_import",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Import",
-                        "tag"  : "IMPORT,APPS",
-                        "path" : "visualpython - apps - import",
-                        "desc" : "Import",
-                        "file" : "m_apps/Import",
-                        "apps" : {
-                            "color": 1,
-                            "icon": "apps/apps_import.svg"
-                        }
-                    },
-                    {
-                        "id"   : "apps_file",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "File",
-                        "tag"  : "FILE,APPS",
-                        "path" : "visualpython - apps - file",
-                        "desc" : "File",
-                        "file" : "m_apps/File",
-                        "apps" : {
-                            "color": 1,
-                            "icon": "apps/apps_file.svg"
-                        }
-                    },
-                    {
-                        "id"   : "apps_variable",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Variable",
-                        "tag"  : "VARIABLE,APPS",
-                        "path" : "visualpython - apps - variable",
-                        "desc" : "Variable",
-                        "file" : "m_apps/Variable",
-                        "apps" : {
-                            "color": 1,
-                            "icon": "apps/apps_variable.svg"
-                        }
-                    },
-                    {
-                        "id"   : "apps_snippets",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Snippets",
-                        "tag"  : "SNIPPETS,APPS",
-                        "path" : "visualpython - apps - snippets",
-                        "desc" : "Snippets",
-                        "file" : "m_apps/Snippets",
-                        "apps" : {
-                            "color": 1,
-                            "icon": "apps/apps_snippets.svg"
-                        }
-                    },
-                    {
-                        "id"   : "apps_frame",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Frame",
-                        "tag"  : "FRAME,APPS",
-                        "path" : "visualpython - apps - frame",
-                        "desc" : "Frame",
-                        "file" : "m_apps/Frame",
-                        "apps" : {
-                            "color": 2,
-                            "icon": "apps/apps_frame.svg"
-                        }
-                    },
-                    {
-                        "id"   : "apps_subset",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Subset",
-                        "tag"  : "SUBSET,APPS",
-                        "path" : "visualpython - apps - subset",
-                        "desc" : "Subset",
-                        "file" : "m_apps/Subset",
-                        "apps" : {
-                            "color": 2,
-                            "icon": "apps/apps_subset.svg"
-                        }
-                    },
-                    {
-                        "id"   : "apps_instance",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Instance",
-                        "tag"  : "INSTANCE,APPS",
-                        "path" : "visualpython - apps - instance",
-                        "desc" : "Instance",
-                        "file" : "m_apps/Instance",
-                        "apps" : {
-                            "color": 2,
-                            "icon": "apps/apps_instance.svg"
-                        }
-                    },
-                    {
-                        "id"   : "apps_groupby",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Groupby",
-                        "tag"  : "GROUPBY,APPS",
-                        "path" : "visualpython - apps - groupby",
-                        "desc" : "Groupby",
-                        "file" : "m_apps/Groupby",
-                        "apps" : {
-                            "color": 2,
-                            "icon": "apps/apps_groupby.svg"
-                        }
-                    },
-                    {
-                        "id"   : "apps_bind",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Bind",
-                        "tag"  : "BIND,APPS",
-                        "path" : "visualpython - apps - bind",
-                        "desc" : "Concat & Merge",
-                        "file" : "m_apps/Bind",
-                        "apps" : {
-                            "color": 3,
-                            "icon": "apps/apps_bind.svg"
-                        }
-                    },
-                    {
-                        "id"   : "apps_reshape",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Reshape",
-                        "tag"  : "RESHAPE,APPS",
-                        "path" : "visualpython - apps - reshape",
-                        "desc" : "Reshape",
-                        "file" : "m_apps/Reshape",
-                        "apps" : {
-                            "color": 3,
-                            "icon": "apps/apps_reshape.svg"
-                        }
-                    },
-                    {
-                        "id"   : "apps_markdown",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Markdown",
-                        "tag"  : "MARKDOWN,APPS",
-                        "path" : "visualpython - apps - markdown",
-                        "desc" : "Markdown",
-                        "file" : "m_apps/Markdown",
-                        "apps" : {
-                            "color": 3,
-                            "icon": "apps/apps_markdown.svg"
-                        }
-                    },
-                    {
-                        "id"   : "apps_pdf",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "PDF",
-                        "tag"  : "PDF,PYMUPDF,APPS",
-                        "path" : "visualpython - apps - pdf",
-                        "desc" : "PDF",
-                        "file" : "m_apps/PDF",
-                        "apps" : {
-                            "color": 3,
-                            "icon": "apps/apps_pymupdf.svg"
-                        }
-                    },
-                    {
-                        "id"   : "apps_profiling",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Profiling",
-                        "tag"  : "PROFILING,PANDAS PROFILING,APPS",
-                        "path" : "visualpython - apps - profiling",
-                        "desc" : "Pandas Profiling",
-                        "file" : "m_apps/Profiling",
-                        "apps" : {
-                            "color": 4,
-                            "icon": "apps/apps_profiling.svg"
-                        }
-                    },
-                    {
-                        "id"   : "apps_sample",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Sample",
-                        "tag"  : "SAMPLE,APPS",
-                        "path" : "visualpython - apps - sample",
-                        "desc" : "TODO: remove it (this is sample)",
-                        "file" : "m_apps/SampleApp",
-                        "apps" : {
-                            "color": 4,
-                            "icon": "apps/apps_white.svg"
-                        }
-                    }
-                ]
-            },
-            {
-                "id"   : "pkg_visualize",
-                "type" : "package",
-                "level": 0,
-                "name" : "Visualization",
-                "path" : "visualpython - visualization",
-                "desc" : "Visualization modules",
-                "open" : true,
-                "grid" : true,
-                "item" : [
-                    {
-                        "id"   : "visualize_chartStyle",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Chart Style",
-                        "tag"  : "CHART STYLE SETTING,IMPORT CHART,VISUALIZATION,VISUALIZE",
-                        "path" : "visualpython - visualization - chartsstyle",
-                        "desc" : "Chart style setting",
-                        "file" : "m_visualize/ChartSetting",
-                        "apps" : {
-                            "color": 5,
-                            "icon": "apps/apps_style.svg"
-                        }
-                    },
-                    {
-                        "id"   : "visualize_seaborn",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Seaborn",
-                        "tag"  : "SEABORN,CHART,VISUALIZATION,VISUALIZE",
-                        "path" : "visualpython - visualization - seaborn",
-                        "desc" : "Seaborn chart creation",
-                        "file" : "m_visualize/Seaborn",
-                        "apps" : {
-                            "color": 5,
-                            "icon": "apps/apps_visualize.svg"
-                        }
-                    }
-                ]
-            },
-            {
-                "id"   : "pkg_ml",
-                "type" : "package",
-                "level": 0,
-                "name" : "Machine Learning",
-                "path" : "visualpython - machine_learning",
-                "desc" : "Machine learning modules",
-                "open" : true,
-                "grid" : true,
-                "item" : [
-                    {
-                        "id"   : "ml_dataSet",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Data Sets",
-                        "tag"  : "DATA SETS,MACHINE LEARNING,ML",
-                        "path" : "visualpython - machine_learning - data sets",
-                        "desc" : "Data sets for machine learning",
-                        "file" : "m_ml/DataSets",
-                        "apps" : {
-                            "color": 6,
-                            "icon": "apps/apps_dataset.svg"
-                        }
-                    },
-                    {
-                        "id"   : "ml_dataSplit",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Data Split",
-                        "tag"  : "DATA SPLIT,MACHINE LEARNING,ML",
-                        "path" : "visualpython - machine_learning - data split",
-                        "desc" : "Data split for machine learning",
-                        "file" : "m_ml/dataSplit",
-                        "apps" : {
-                            "color": 6,
-                            "icon": "apps/apps_datasplit.svg"
-                        }
-                    },
-                    {
-                        "id"   : "ml_dataPrep",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Data Prep",
-                        "tag"  : "DATA PREPARATION,MACHINE LEARNING,ML",
-                        "path" : "visualpython - machine_learning - data prep",
-                        "desc" : "Data preparation for machine learning",
-                        "file" : "m_ml/DataPrep",
-                        "apps" : {
-                            "color": 6,
-                            "icon": "apps/apps_dataprep.svg"
-                        }
-                    },
-                    {
-                        "id"   : "ml_autoML",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "AutoML",
-                        "tag"  : "AUTO ML,MODEL,MACHINE LEARNING,ML",
-                        "path" : "visualpython - machine_learning - automl",
-                        "desc" : "AutoML model for machine learning",
-                        "file" : "m_ml/AutoML",
-                        "apps" : {
-                            "color": 6,
-                            "icon": "apps/apps_automl.svg"
-                        }
-                    },
-                    {
-                        "id"   : "ml_regression",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Regressor",
-                        "tag"  : "REGRESSION,MODEL,MACHINE LEARNING,ML",
-                        "path" : "visualpython - machine_learning - regression",
-                        "desc" : "Regression model for machine learning",
-                        "file" : "m_ml/Regression",
-                        "apps" : {
-                            "color": 7,
-                            "icon": "apps/apps_regression.svg"
-                        }
-                    },
-                    {
-                        "id"   : "ml_classification",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Classifier",
-                        "tag"  : "CLASSIFICATION,MODEL,MACHINE LEARNING,ML",
-                        "path" : "visualpython - machine_learning - classification",
-                        "desc" : "Classification model for machine learning",
-                        "file" : "m_ml/Classification",
-                        "apps" : {
-                            "color": 7,
-                            "icon": "apps/apps_classification.svg"
-                        }
-                    },
-                    {
-                        "id"   : "ml_clustering",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Clustering",
-                        "tag"  : "CLUSTERING,MODEL,MACHINE LEARNING,ML",
-                        "path" : "visualpython - machine_learning - clustering",
-                        "desc" : "Clustering model for machine learning",
-                        "file" : "m_ml/Clustering",
-                        "apps" : {
-                            "color": 7,
-                            "icon": "apps/apps_clustering.svg"
-                        }
-                    },
-                    {
-                        "id"   : "ml_dimensionReduction",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Dimension",
-                        "tag"  : "DIMENSION REDUCTION,MODEL,MACHINE LEARNING,ML",
-                        "path" : "visualpython - machine_learning - dimension_reduction",
-                        "desc" : "Dimension reduction model for machine learning",
-                        "file" : "m_ml/DimensionReduction",
-                        "apps" : {
-                            "color": 7,
-                            "icon": "apps/apps_dimension.svg"
-                        }
-                    },
-                    {
-                        "id"   : "ml_fitPredict",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Fit/Predict",
-                        "tag"  : "FIT,PREDICT,MACHINE LEARNING,ML",
-                        "path" : "visualpython - machine_learning - fit_predict",
-                        "desc" : "Model fit/predict for machine learning",
-                        "file" : "m_ml/FitPredict",
-                        "apps" : {
-                            "color": 8,
-                            "icon": "apps/apps_fit.svg"
-                        }
-                    },
-                    {
-                        "id"   : "ml_modelInfo",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Model Info",
-                        "tag"  : "MODEL INFO,INFORMATION,MACHINE LEARNING,ML",
-                        "path" : "visualpython - machine_learning - model_info",
-                        "desc" : "Model information for machine learning",
-                        "file" : "m_ml/ModelInfo",
-                        "apps" : {
-                            "color": 8,
-                            "icon": "apps/apps_predict.svg"
-                        }
-                    },
-                    {
-                        "id"   : "ml_evaluation",
-                        "type" : "function",
-                        "level": 1,
-                        "name" : "Evaluation",
-                        "tag"  : "PERFORMANCE EVALUATION,MACHINE LEARNING,ML",
-                        "path" : "visualpython - machine_learning - evaluation",
-                        "desc" : "Performance evaluation for machine learning",
-                        "file" : "m_ml/evaluation",
-                        "apps" : {
-                            "color": 8,
-                            "icon": "apps/apps_evaluate.svg"
-                        }
-                    }
-                ]
-            }
-        ]
-    }
-}
\ No newline at end of file